Endpoint zgodny z OMDb

GET https://api.amodb.dev/omdb/ odpowiada na żądania w stylu OMDb z tymi samymi nazwami parametrów i pól. Tytuł znajdziesz po ID z IMDb przez i albo po tytule przez t, a szukać możesz przez s. Linki do plakatów wskazują na img.amodb.dev. Obsługiwane są tylko r=json, filmy i seriale. Zmień bazowy URL i klucz, a typowy klient działa dalej.

Zaktualizowano Zobacz jako Markdown

Wyszukiwanie tytułu po ID z IMDb lub tytule

GET https://api.amodb.dev/omdb/ zwraca jeden tytuł jako płaski JSON z nazwami pól OMDb. Przekaż i dla ID z IMDb, na przykład tt0137523, albo t dla tytułu. Uwierzytelnianie to parametr zapytania apikey. Odpowiedź ma Response ustawione na True przy sukcesie i False przy błędzie.

Przykład pobiera Fight Club po ID z IMDb i kończy z tekstem błędu OMDb, gdy Response ma wartość False.

bashjspyphpgo
curl -sf "https://api.amodb.dev/omdb/?i=tt0137523&plot=short&apikey=$AMODB_KEY"
const params = new URLSearchParams({ i: 'tt0137523', plot: 'short', apikey: process.env.AMODB_KEY });
const res = await fetch(`https://api.amodb.dev/omdb/?${params}`);
if (!res.ok) throw new Error(`amodb returned ${res.status}`);
const data = await res.json();
if (data.Response === 'False') throw new Error(data.Error);
console.log(data.Title, data.Year, data.imdbRating);
import os
import requests

r = requests.get(
    "https://api.amodb.dev/omdb/",
    params={"i": "tt0137523", "plot": "short", "apikey": os.environ["AMODB_KEY"]},
    timeout=10,
)
r.raise_for_status()
data = r.json()
if data["Response"] == "False":
    raise SystemExit(data["Error"])
print(data["Title"], data["Year"], data["imdbRating"])
<?php
$query = http_build_query(['i' => 'tt0137523', 'plot' => 'short', 'apikey' => getenv('AMODB_KEY')]);
$ch = curl_init('https://api.amodb.dev/omdb/?' . $query);
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 10]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status !== 200) {
    throw new RuntimeException("amodb returned $status");
}
$data = json_decode($body, true);
if ($data['Response'] === 'False') {
    throw new RuntimeException($data['Error']);
}
echo $data['Title'], ' ', $data['Year'], ' ', $data['imdbRating'], PHP_EOL;
package main

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

type Title struct {
	Title      string `json:"Title"`
	Year       string `json:"Year"`
	ImdbRating string `json:"imdbRating"`
	Response   string `json:"Response"`
	Error      string `json:"Error"`
}

func main() {
	q := url.Values{"i": {"tt0137523"}, "plot": {"short"}, "apikey": {os.Getenv("AMODB_KEY")}}
	client := &http.Client{Timeout: 10 * time.Second}
	res, err := client.Get("https://api.amodb.dev/omdb/?" + q.Encode())
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	if res.StatusCode != http.StatusOK {
		panic(res.Status)
	}
	var t Title
	if err := json.NewDecoder(res.Body).Decode(&t); err != nil {
		panic(err)
	}
	if t.Response == "False" {
		panic(t.Error)
	}
	fmt.Println(t.Title, t.Year, t.ImdbRating)
}

Parametry

  • apikeyquerywymagany
    Twój klucz amodb.
  • iqueryjeden z i, t, s
    ID tytułu z IMDb: tt plus 7 do 9 cyfr, na przykład tt0137523.
  • tqueryjeden z i, t, s
    Tytuł do wyszukania, zwraca najlepsze dopasowanie.
  • squeryjeden z i, t, s
    Tekst wyszukiwania o długości co najmniej 3 liter, zwraca listę.
  • typequery
    movie lub series. episode nic nie znajduje.
  • yquery
    Rok premiery.
  • plotquery
    short lub full. Domyślnie short.
  • pagequery
    Strona wyników wyszukiwania, od 1 do 100. Używana z s.
  • rquery
    Tylko json. Każda inna wartość zwraca HTTP 400.

Parametry Season, Episode, callback i v z oryginalnego API OMDb nie są obsługiwane i są ignorowane.

Pola odpowiedzi

PoleUwagi
Title, Year, Rated, Released, RuntimeTekst. Released wygląda jak 15 Oct 1999.
Genre, Director, Writer, ActorsImiona i nazwiska oddzielone przecinkami.
Plot, Language, Country, AwardsTekst.
PosterAdres w https://img.amodb.dev/t/p/w300/.
RatingsTablica obiektów z Source i Value.
Metascore, imdbRating, imdbVotes, imdbIDTekst, w tym liczba głosów z przecinkami.
Typemovie lub series.
DVD, BoxOffice, Production, WebsiteTylko filmy. BoxOffice niesie wartość, gdy jest znana. DVD, Production i Website zawsze mają postać N/A.
totalSeasonsTylko seriale, jako tekst. Odpowiedzi seriali nie mają DVD, BoxOffice, Production ani Website.
ResponseTrue lub False, zawsze ciąg.

Pola odpowiadają OMDb, więc istniejący parser OMDb nie wymaga zmian poza bazowym URL.

Przykładowa odpowiedź

JSON
{
  "Title": "Fight Club",
  "Year": "1999",
  "Rated": "R",
  "Released": "15 Oct 1999",
  "Runtime": "139 min",
  "Genre": "Crime, Drama, Thriller",
  "Director": "David Fincher",
  "Writer": "Chuck Palahniuk, Jim Uhls",
  "Actors": "Brad Pitt, Edward Norton, Meat Loaf",
  "Plot": "A nameless first-person narrator attends support groups in an attempt to subdue his emotional state and relieve his insomniac state.",
  "Language": "English",
  "Country": "United States, Germany",
  "Awards": "Nominated for 1 Oscar. 12 wins & 38 nominations total",
  "Poster": "https://img.amodb.dev/t/p/w300/qkrH7rjYKU4KOwwIl6wF6H3ISvm.jpg",
  "Ratings": [
    { "Source": "Internet Movie Database", "Value": "8.8/10" },
    { "Source": "Rotten Tomatoes", "Value": "81%" },
    { "Source": "Metacritic", "Value": "67/100" }
  ],
  "Metascore": "67",
  "imdbRating": "8.8",
  "imdbVotes": "2,669,989",
  "imdbID": "tt0137523",
  "Type": "movie",
  "DVD": "N/A",
  "BoxOffice": "$38,003,039",
  "Production": "N/A",
  "Website": "N/A",
  "Response": "True"
}

Dla serialu, takiego jak The Wire (i=tt0306414), odpowiedź kończy się "Type": "series", "totalSeasons": "5" i "Response": "True".

Wyszukiwanie przez s

Wyślij s, by dostać listę zamiast jednego tytułu. Każda strona zawiera 10 pozycji, a totalResults podaje pełną liczbę jako ciąg. Zażądaj page=2 dla pozycji od 11 do 20 i kontynuuj, aż odczytasz totalResults pozycji. Strona za ostatnią odpowiada Movie not found!.

curl
curl -sf "https://api.amodb.dev/omdb/?s=Matrix&type=movie&page=1&apikey=$AMODB_KEY"
PoleUwagi
SearchTablica do 10 pozycji z Title, Year, imdbID, Type, Poster.
totalResultsLiczba wszystkich dopasowań, jako ciąg.
ResponseTrue lub False.
JSON
{
  "Search": [
    {
      "Title": "The Matrix",
      "Year": "1999",
      "imdbID": "tt0133093",
      "Type": "movie",
      "Poster": "https://img.amodb.dev/t/p/w300/kEDbym5htJgDQNenjUtSJxAHysB.jpg"
    },
    {
      "Title": "The Matrix Reloaded",
      "Year": "2003",
      "imdbID": "tt0234215",
      "Type": "movie",
      "Poster": "https://img.amodb.dev/t/p/w300/d0xVNNxIYxId2qHkqpgE39soOvD.jpg"
    }
  ],
  "totalResults": "20",
  "Response": "True"
}

Lista jest przycięta do 2 z 10 pozycji.

Odczyt tablicy Ratings

Ratings zawiera jeden obiekt na źródło, każdy z Source i Value, a Value to tekst taki jak 8.8/10. Źródła to Internet Movie Database, Rotten Tomatoes i Metacritic, a wymienione są tylko te, które są znane dla tytułu. Płaskie pola imdbRating, imdbVotes i Metascore powtarzają część tych samych danych. Jeśli potrzebujesz liczby, podziel Value po ukośniku. Dla typowanych liczb oraz ocen z Kinopoisk i TMDB użyj zamiast tego endpointu oceny.

Błędy

Niepowodzenia wyszukiwania zwracają {"Response":"False","Error":"..."}. Większość z nich przychodzi z HTTP 200, więc czytaj Error i rozgałęziaj po tekście, a nie tylko po statusie HTTP.

Tekst ErrorHTTPKiedy
Movie not found!200Żaden tytuł nie pasuje do t, wartość i jest poprawna, ale nieznana, albo strona wyszukiwania jest za ostatnią.
Incorrect IMDb ID.200Wartość i nie ma kształtu ID z IMDb.
Too many results.200Tekst wyszukiwania jest krótszy niż 3 litery lub pasuje do zbyt wielu tytułów. Wydłuż tekst albo dodaj type lub y.
Something went wrong.200Nie wysłano żadnego z i, t i s.
Only r=json is supported.400r ma inną wartość niż json.
No API key provided. lub Invalid API key!401apikey brakuje lub jest błędny.
Request limit reached!429Przekroczono limit żądań na minutę. Poczekaj tyle sekund, ile podaje Retry-After.

Zakończony plan odpowiada HTTP 402. Zobacz błędy i limity żądań.

Migracja klienta OMDb

Migracja to dwie zmiany: bazowy URL i klucz. Nic więcej w żądaniu się nie zmienia.

JavaScript
// Before: the base URL and key of your current OMDb setup.
// After:
const OMDB_BASE = 'https://api.amodb.dev/omdb/';
const OMDB_KEY = process.env.AMODB_KEY;

Usuń r=xml, jeśli go wysyłasz. Klient, który czyta odcinki, Season lub callback, potrzebuje innego źródła dla tych części. Limit żądań dotyczy klucza, więc wywołania w stylu OMDb i wywołania w stylu TMDB dzielą jeden budżet 20, 40 lub 120 żądań na minutę.

Praktyczne uwagi

  • Traktuj każdą wartość jako tekst. Year, imdbRating i totalResults przekonwertuj samodzielnie, a N/A traktuj jako brak.
  • Używaj plot=full tylko wtedy, gdy pokazujesz długi opis fabuły. short zmniejsza odpowiedzi.
  • Wyszukiwania przez i lub t są w cache dłużej niż wyszukiwania przez s, więc powtórne wyszukanie zwraca zapisaną odpowiedź.
  • Aby z ID z IMDb dostać ID z TMDB, wywołaj wyszukiwanie po zewnętrznym ID.
  • Plakaty mają rozmiar w300. Dla innych rozmiarów zbuduj adres z poster_path w stylu TMDB i listy rozmiarów ze strony obrazy.
  • Trzymaj klucz na serwerze. apikey w URL strony widzi każdy odwiedzający.