Postere de filme de la o gazdă de imagini fără cheie
Un URL de poster este https:/. 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
w92laoriginal. - 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
| Imagine | Numele fișierului vine din | Dimensiuni uzuale |
|---|---|---|
| Poster de film | poster_path din /3/movie/{movie_id} și din liste | w92, w154, w185, w342, w500, w780, original |
| Imagine de fundal | backdrop_path | w300, w780, w1280, original |
| Fotografie de persoană | profile_path din /3/person/{person_id} | w185, h632, original |
| Logo de companie sau rețea | logo_path | w92, w154, w185, w300, w500, original |
| Cadru de episod | still_path | w92, w185, w300, original |
| Toate posterele unui titlu | GET / | array-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
- Alege un plan la prețuri. El stabilește ritmul apelurilor JSON: 20, 40 sau 120 de cereri pe minut.
- Creează o cheie în panoul contului tău.
- Citește
poster_pathdintr-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.
# 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_: 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.
{
"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.
| Dimensiune | Utilizare tipică |
|---|---|
w92 | Sugestii de căutare și rânduri foarte mici din liste |
w154, w185 | Liste dense și carduri |
w342 | Plăci de grilă pe telefoane |
w500 | Pagină de detalii |
w780 | Ecrane mari și ecrane 2x |
original | Arhivă 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= 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 |
|---|---|
en | Postere marcate ca engleze |
en,null | Postere în engleză și postere fără text |
null | Doar 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_pathdupă aceea ca să vezi dacă s-a schimbat. - Ține cheia pe serverul tău. Trimite browserului doar URL-urile imaginilor.
- Când
poster_patheste null, afișează un substituent în loc de o imagine stricată.
Cum se compară
| Capacitate | Extragi imagini din pagini | Îți găzduiești propriile copii | Gazda de imagini amodb |
|---|---|---|---|
| Cheie necesară | Niciuna, se aplică termenii fiecărui site | Niciuna | Fără cheie pentru imagini |
| Variante de dimensiune | Orice dimensiune servește pagina | Le generezi și le stochezi pe fiecare | Nume fixe de dimensiuni în URL, de la w92 până la original |
| Găsirea fișierului | Analizezi HTML | Propria ta bază de date | poster_path în fiecare răspuns |
| Limbile graficii | Pagină cu pagină | Ce ai colectat | include_image_language pe endpoint-urile de imagini |
| Stocare și lățime de bandă | Ale tale, plus cele ale sursei | Ale tale | Browserul încarcă de la img.amodb.dev |
| Cache | Al tău | Al tău | 30 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.