Постери на филми от хост за изображения, който не иска ключ

URL адресът на постер е https://img.amodb.dev/t/p/{size}/{file}. Частта file е низът poster_path от всеки отговор за филм, търсене или списък и започва с наклонена черта. Частта size е име като w342. Изображенията не искат ключ, така че браузъри и приложения могат да ги зареждат директно. JSON, който ви дава името на файла, още иска ключа ви, а amodb е независимо API, което работи по протокола на TMDB v3, така че съществуващ код за изображения продължава да работи след смяна на хоста.

Какво получавате:

  • Постери, фонови изображения, лога, профилни снимки и кадри от епизоди на един хост.
  • Десет имена на размери, от w92 до original.
  • Списъци с постери за заглавие, с език, ширина и височина във всеки елемент.
  • 30-дневен edge кеш за изображенията.

Какви данни получавате

ИзображениеИмето на файла идва отОбичайни размери
Постер на филмposter_path в /3/movie/{movie_id} и в списъциw92, w154, w185, w342, w500, w780, original
Фоново изображениеbackdrop_pathw300, w780, w1280, original
Снимка на личностprofile_path в /3/person/{person_id}w185, h632, original
Лого на компания или мрежаlogo_pathw92, w154, w185, w300, w500, original
Кадър от епизодstill_pathw92, w185, w300, original
Всички постери на едно заглавиеGET /3/movie/{movie_id}/imagesМасив posters

Сериалите, сезоните и колекциите също носят poster_path. Четете точните списъци с размери веднъж при старт от блока images на GET /3/configuration, вместо да ги вписвате в кода. Справочникът за изображенията е на страницата изображения.

Започнете в 3 стъпки

  1. Изберете план на страницата с цените. Той определя скоростта на JSON извикванията: 20, 40 или 120 заявки в минута.
  2. Създайте ключ в личния си профил.
  3. Прочетете poster_path от извикване за детайли или списък, после го сложете зад хоста за изображения и име на размер.

Пример със заявка

Go програмата изброява постерите на The Matrix (id на филма 603) на английски и без текст, избира най-широкия, отпечатва готов srcset и записва файла w342. Ключът отива само към 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)
}

Съкратен отговор за изображения при include_image_language=en,null: 3 от 145-те постера, един английски, най-широкият английски и един без текст. Отговорът съдържа още backdrops и logos, пропуснати тук.

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

Изберете размер

Числото в размер w е ширината на изображението в пиксели, а h632 е височина. Малките имена пестят трафик, големите запазват детайлите на плътни екрани.

РазмерТипична употреба
w92Подсказки при търсене и съвсем малки редове в списъци
w154, w185Плътни списъци и карти
w342Плочки в мрежа на телефони
w500Страница с детайли
w780Големи екрани и дисплеи 2x
originalАрхив или печат, немащабираният файл

Дайте на браузъра няколко ширини и го оставете да избира. Go програмата по-горе отпечатва srcset с кандидати 185w, 342w, 500w и 780w. Съчетайте го с атрибут sizes, който съответства на вашето оформление, например sizes="(max-width: 600px) 45vw, 185px" на елемента img.

Езици на постерите

Всеки елемент в posters има стойност iso_639_1, или езиков код, или null за оформление без текст. Параметърът include_image_language приема списък с кодове, разделени със запетая.

СтойностКакво връща
enПостери, отбелязани като английски
en,nullАнглийски постери и постери без текст
nullСамо постери без текст

Добър резервен ред е постерът на езика на потребителя, после такъв без текст, после английският. Във всяка група сортирайте по width и при равенство вземете първия. vote_average и vote_count са 0 при изображения на филми и сериали, така че не класират нищо. Езиците на постерите описват текста, отпечатан върху оформлението, затова не следват 14-те езика на интерфейса. Проверявайте iso_639_1 на получения резултат, защото наборът зависи от заглавието.

Съхранение и кеширане на постери

  • Пазете poster_path, а не пълния URL. От него по-късно може да се построи всеки размер.
  • Edge кешира изображенията 30 дни. Детайлите се кешират 6 часа, затова след това прочетете poster_path отново, за да видите дали се е променил.
  • Дръжте ключа на вашия сървър. Изпращайте на браузъра само URL адресите на изображенията.
  • Когато poster_path е null, показвайте заместител вместо счупено изображение.

Как се сравнява

ВъзможностОбработка на страници за изображенияСобствени копия на хостингХостът за изображения на amodb
Нужен ключНе, важат условията на всеки сайтНеБез ключ за изображения
Варианти на размераКакъвто размер сервира страницатаВие генерирате и пазите всекиФиксирани имена на размери в URL, от w92 до original
Намиране на файлаРазчитане на HTMLВашата база данниposter_path във всеки отговор
Езици на оформлениетоСтраница по страницаКаквото сте събралиinclude_image_language на ендпойнтите за изображения
Хранилище и трафикВашите, плюс на източникаВашитеБраузърът зарежда от img.amodb.dev
КешВашиятВашият30 дни на edge

Цени

Изтеглянията на изображения не носят ключ. Планът ви ограничава само JSON извикванията, които дават имена на файлове, а отговорите със списъци вече включват poster_path за всеки елемент, така че едно извикване на списък захранва цяла мрежа. Изберете 20, 40 или 120 заявки в минута на страницата с цените. Достъпът е предплатен за 1, 3, 6, 12 или 24 месеца с отстъпка 0, 10, 20, 30 и 40 процента, нищо не се подновява само и няма безплатен план.