Filmové plakáty z hostitele obrázků, který nepotřebuje klíč

URL plakátu je https://img.amodb.dev/t/p/{size}/{file}. Část file je řetězec poster_path z libovolné odpovědi s filmem, vyhledáváním nebo seznamem a začíná lomítkem. Část size je název jako w342. Obrázky klíč nepotřebují, takže je prohlížeče a aplikace mohou načítat přímo. JSON, který prozradí název souboru, klíč stále vyžaduje, a amodb je nezávislé API mluvící protokolem TMDB v3, takže stávající kód pro obrázky po změně hostitele funguje dál.

Co dostanete:

  • Plakáty, pozadí, loga, profilové fotografie a záběry epizod na jednom hostiteli.
  • Deset názvů velikostí, od w92 po original.
  • Seznamy plakátů pro každý titul, s jazykem, šířkou a výškou u každé položky.
  • Cache na edge pro obrázky na 30 dní.

Jaká data dostanete

ObrázekNázev souboru pochází zBěžné velikosti
Filmový plakátposter_path na /3/movie/{movie_id} a v seznamechw92, w154, w185, w342, w500, w780, original
Pozadíbackdrop_pathw300, w780, w1280, original
Fotografie osobyprofile_path na /3/person/{person_id}w185, h632, original
Logo společnosti nebo sítělogo_pathw92, w154, w185, w300, w500, original
Záběr epizodystill_pathw92, w185, w300, original
Všechny plakáty jednoho tituluGET /3/movie/{movie_id}/imagespole posters

Seriály, sezóny a kolekce nesou také poster_path. Přesné seznamy velikostí přečtěte jednou při startu z bloku images v GET /3/configuration místo jejich pevného zadání. Reference obrázků je na stránce obrázky.

Začněte ve 3 krocích

  1. Vyberte tarif na stránce ceník. Určuje rychlost volání JSON: 20, 40 nebo 120 požadavků za minutu.
  2. Vytvořte klíč v panelu účtu.
  3. Přečtěte poster_path z volání detailů nebo seznamu a pak jej umístěte za hostitele obrázků a název velikosti.

Příklad požadavku

Program v Go vypíše plakáty filmu The Matrix (ID filmu 603) v angličtině a bez textu, vybere nejširší, vypíše hotový srcset a uloží soubor w342. Klíč jde jen do volání JSON.

bashgo
# the JSON call needs the key
curl -s "https://api.amodb.dev/3/movie/603/images?include_image_language=en,null" \
  -H "Authorization: Bearer $AMODB_KEY"

# the image call does not
curl -s -o poster.jpg "https://img.amodb.dev/t/p/w342/aOIuZAjPaRIE6CMzbazvcHuHXDc.jpg"
package main

import (
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"os"
	"strings"
	"time"
)

const imgBase = "https://img.amodb.dev/t/p/"

type poster struct {
	FilePath string  `json:"file_path"`
	Lang     *string `json:"iso_639_1"`
	Width    int     `json:"width"`
}

type images struct {
	Posters []poster `json:"posters"`
}

func srcset(file string) string {
	var parts []string
	for _, w := range []int{185, 342, 500, 780} {
		parts = append(parts, fmt.Sprintf("%sw%d%s %dw", imgBase, w, file, w))
	}
	return strings.Join(parts, ", ")
}

func main() {
	client := &http.Client{Timeout: 10 * time.Second}

	url := "https://api.amodb.dev/3/movie/603/images?include_image_language=en,null"
	req, _ := http.NewRequest("GET", url, nil)
	req.Header.Set("Authorization", "Bearer "+os.Getenv("AMODB_KEY"))
	res, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	if res.StatusCode != http.StatusOK {
		panic(res.Status)
	}

	var imgs images
	if err := json.NewDecoder(res.Body).Decode(&imgs); err != nil {
		panic(err)
	}
	if len(imgs.Posters) == 0 {
		fmt.Println("no posters")
		return
	}

	best := imgs.Posters[0]
	for _, p := range imgs.Posters {
		if p.Width > best.Width {
			best = p
		}
	}
	lang := "none"
	if best.Lang != nil {
		lang = *best.Lang
	}
	fmt.Println("best poster:", best.FilePath, "language:", lang, "width:", best.Width)
	fmt.Println("srcset:", srcset(best.FilePath))

	// Image requests carry no key.
	pic, err := client.Get(imgBase + "w342" + best.FilePath)
	if err != nil {
		panic(err)
	}
	defer pic.Body.Close()
	if pic.StatusCode != http.StatusOK {
		panic(pic.Status)
	}
	out, err := os.Create("poster.jpg")
	if err != nil {
		panic(err)
	}
	defer out.Close()
	io.Copy(out, pic.Body)
}

Zkrácená odpověď s obrázky pro include_image_language=en,null: 3 ze 145 plakátů, anglický, nejširší anglický a bez textu. Odpověď obsahuje také backdrops a logos, zde vynechané.

JSON
{
  "id": 603,
  "posters": [
    {
      "aspect_ratio": 0.667,
      "height": 2250,
      "iso_639_1": "en",
      "file_path": "/dXNAPwY7VrqMAo51EKhhCJfaGb5.jpg",
      "vote_average": 0,
      "vote_count": 0,
      "width": 1500
    },
    {
      "aspect_ratio": 0.667,
      "height": 3000,
      "iso_639_1": "en",
      "file_path": "/aOIuZAjPaRIE6CMzbazvcHuHXDc.jpg",
      "vote_average": 0,
      "vote_count": 0,
      "width": 2000
    },
    {
      "aspect_ratio": 0.701,
      "height": 1426,
      "iso_639_1": null,
      "file_path": "/iLWzJxatuwwMT76dtMuwh3FEp2X.jpg",
      "vote_average": 0,
      "vote_count": 0,
      "width": 1000
    }
  ]
}

Volba velikosti

Číslo v názvu w je šířka obrázku v pixelech a h632 je výška. Malé názvy šetří přenos, velké zachovávají detail na hustých displejích.

VelikostTypické použití
w92Návrhy ve vyhledávání a drobné řádky seznamů
w154, w185Husté seznamy a karty
w342Dlaždice mřížky na telefonech
w500Stránka detailu
w780Velké obrazovky a displeje 2x
originalArchiv nebo tisk, neškálovaný soubor

Dejte prohlížeči několik šířek a nechte ho vybrat. Program v Go výše vypíše srcset s kandidáty 185w, 342w, 500w a 780w. Spárujte jej s atributem sizes, který odpovídá vašemu rozvržení, například sizes="(max-width: 600px) 45vw, 185px" na prvku img.

Jazyky plakátů

Každá položka v posters má hodnotu iso_639_1, buď kód jazyka, nebo null pro grafiku bez textu. Parametr include_image_language přijímá seznam kódů oddělených čárkou.

HodnotaVrací
enPlakáty označené jako anglické
en,nullAnglické plakáty a plakáty bez textu
nullJen plakáty bez textu

Dobré pořadí záložních voleb je plakát v jazyce uživatele, pak bez textu, pak anglický. V každé skupině seřaďte podle width a při shodě ponechte první. vote_average a vote_count jsou u obrázků filmů a seriálů 0, takže nic neřadí. Jazyky plakátů popisují text vytištěný na grafice, takže se neřídí 14 jazyky rozhraní. Zkontrolujte iso_639_1 u toho, co přijde, protože sada závisí na titulu.

Ukládání a cachování plakátů

  • Ukládejte poster_path, ne celou URL. Z něj lze později sestavit libovolnou velikost.
  • Edge cachuje obrázky 30 dní. Detaily se cachují 6 hodin, takže po této době přečtěte poster_path znovu a zjistěte, zda se změnil.
  • Klíč držte na serveru. Prohlížeči posílejte jen URL obrázků.
  • Když je poster_path null, vykreslete zástupný obrázek místo rozbitého.

Jak si stojí v porovnání

SchopnostScrapování stránek kvůli obrázkůmVlastní hostované kopieHostitel obrázků amodb
Potřebný klíčŽádný, platí podmínky každého webuŽádnýObrázky bez klíče
Varianty velikostíJakou velikost stránka nabízíKaždou generujete a ukládáte samiPevné názvy velikostí v URL, od w92 po original
Nalezení souboruParsovat HTMLVaše vlastní databázeposter_path v každé odpovědi
Jazyky grafikyStránku po stránceCo jste nasbíraliinclude_image_language na endpointech obrázků
Úložiště a přenosVaše plus zdrojeVašeProhlížeč načítá z img.amodb.dev
CacheVašeVaše30 dní na edge

Ceník

Stahování obrázků klíč nenese. Váš tarif omezuje jen volání JSON, která vracejí názvy souborů, a odpovědi se seznamy už obsahují poster_path pro každou položku, takže jedno volání seznamu naplní celou mřížku. Vyberte 20, 40 nebo 120 požadavků za minutu na stránce ceník. Přístup je předplacený na 1, 3, 6, 12 nebo 24 měsíců se slevou 0, 10, 20, 30 a 40 procent, nic se neobnovuje samo a bezplatný tarif neexistuje.