Postere de filme de la o gazdă de imagini fără cheie

Un URL de poster este https://img.amodb.dev/t/p/{size}/{file}. Partea file este șirul poster_path din orice răspuns de film, căutare sau listă și începe cu o bară oblică. Partea size este un nume precum w342. Imaginile nu cer cheie, așa că browserele și aplicațiile le pot încărca direct. JSON-ul care îți spune numele fișierului cere în continuare cheia ta, iar amodb este un API independent care vorbește protocolul TMDB v3, deci codul existent pentru imagini continuă să funcționeze după schimbarea gazdei.

Ce primești:

  • Postere, imagini de fundal, logo-uri, fotografii de profil și cadre de episod pe aceeași gazdă.
  • Zece nume de dimensiuni, de la w92 la original.
  • Liste de postere pentru fiecare titlu, cu limba, lățimea și înălțimea pentru fiecare element.
  • Cache la margine de 30 de zile pentru imagini.

Ce date primești

ImagineNumele fișierului vine dinDimensiuni uzuale
Poster de filmposter_path din /3/movie/{movie_id} și din listew92, w154, w185, w342, w500, w780, original
Imagine de fundalbackdrop_pathw300, w780, w1280, original
Fotografie de persoanăprofile_path din /3/person/{person_id}w185, h632, original
Logo de companie sau rețealogo_pathw92, w154, w185, w300, w500, original
Cadru de episodstill_pathw92, w185, w300, original
Toate posterele unui titluGET /3/movie/{movie_id}/imagesarray-ul posters

Serialele TV, sezoanele și colecțiile au și ele poster_path. Citește o singură dată la pornire listele exacte de dimensiuni din blocul images al GET /3/configuration, în loc să le scrii fix în cod. Referința pentru imagini este la imagini.

Începe în 3 pași

  1. Alege un plan la prețuri. El stabilește ritmul apelurilor JSON: 20, 40 sau 120 de cereri pe minut.
  2. Creează o cheie în panoul contului tău.
  3. Citește poster_path dintr-un apel de detalii sau de listă, apoi pune-l după gazda de imagini și un nume de dimensiune.

Exemplu de cerere

Programul Go listează posterele din The Matrix (ID de film 603) în engleză și fără text, alege cel mai lat, afișează un srcset gata de folosit și salvează fișierul w342. Cheia merge doar la apelul 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)
}

Un răspuns de imagini scurtat pentru include_image_language=en,null: 3 dintre cele 145 de postere, unul în engleză, cel mai lat în engleză și unul fără text. Răspunsul conține și backdrops și logos, omise aici.

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
    }
  ]
}

Alege o dimensiune

Numărul dintr-o dimensiune w este lățimea imaginii în pixeli, iar h632 este o înălțime. Numele mici economisesc lățime de bandă, cele mari păstrează detaliile pe ecrane dense.

DimensiuneUtilizare tipică
w92Sugestii de căutare și rânduri foarte mici din liste
w154, w185Liste dense și carduri
w342Plăci de grilă pe telefoane
w500Pagină de detalii
w780Ecrane mari și ecrane 2x
originalArhivă sau tipar, fișierul nescalat

Oferă browserului mai multe lățimi și lasă-l să aleagă. Programul Go de mai sus afișează un srcset cu candidați 185w, 342w, 500w și 780w. Asociază-l cu un atribut sizes care se potrivește cu aspectul tău, de exemplu sizes="(max-width: 600px) 45vw, 185px" pe elementul img.

Limbile posterelor

Fiecare element din posters are o valoare iso_639_1, fie un cod de limbă, fie null pentru grafică fără text. Parametrul include_image_language primește o listă de coduri separate prin virgulă.

ValoareÎntoarce
enPostere marcate ca engleze
en,nullPostere în engleză și postere fără text
nullDoar postere fără text

O ordine bună de rezervă este posterul în limba utilizatorului tău, apoi unul fără text, apoi engleza. În fiecare grup, sortează după width și păstrează primul la egalitate. vote_average și vote_count sunt 0 la imaginile de film și de serial, deci nu ordonează nimic. Limbile posterelor descriu textul tipărit pe grafică, așa că nu urmează cele 14 limbi de interfață. Verifică iso_639_1 la ce primești, pentru că setul depinde de titlu.

Stocarea și păstrarea în cache a posterelor

  • Salvează poster_path, nu URL-ul complet. Din el se poate construi mai târziu orice dimensiune.
  • Marginea ține imaginile în cache 30 de zile. Detaliile sunt ținute în cache 6 ore, așa că citește din nou poster_path după aceea ca să vezi dacă s-a schimbat.
  • Ține cheia pe serverul tău. Trimite browserului doar URL-urile imaginilor.
  • Când poster_path este null, afișează un substituent în loc de o imagine stricată.

Cum se compară

CapacitateExtragi imagini din paginiÎți găzduiești propriile copiiGazda de imagini amodb
Cheie necesarăNiciuna, se aplică termenii fiecărui siteNiciunaFără cheie pentru imagini
Variante de dimensiuneOrice dimensiune servește paginaLe generezi și le stochezi pe fiecareNume fixe de dimensiuni în URL, de la w92 până la original
Găsirea fișieruluiAnalizezi HTMLPropria ta bază de dateposter_path în fiecare răspuns
Limbile graficiiPagină cu paginăCe ai colectatinclude_image_language pe endpoint-urile de imagini
Stocare și lățime de bandăAle tale, plus cele ale surseiAle taleBrowserul încarcă de la img.amodb.dev
CacheAl tăuAl tău30 de zile la margine

Prețuri

Descărcările de imagini nu poartă cheie. Planul tău limitează doar apelurile JSON care îți dau numele fișierelor, iar răspunsurile de listă includ deja poster_path pentru fiecare element, deci un singur apel de listă alimentează o grilă întreagă. Alege 20, 40 sau 120 de cereri pe minut la prețuri. Accesul este plătit în avans pentru 1, 3, 6, 12 sau 24 de luni, cu reduceri de 0, 10, 20, 30 și 40 la sută, nimic nu se reînnoiește singur și nu există nivel gratuit.