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.
Wyszukiwanie tytułu po ID z IMDb lub tytule
GET https:/ 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.
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
apikeyquerywymaganyTwój klucz amodb.iqueryjeden zi,t,sID tytułu z IMDb:ttplus 7 do 9 cyfr, na przykładtt0137523.tqueryjeden zi,t,sTytuł do wyszukania, zwraca najlepsze dopasowanie.squeryjeden zi,t,sTekst wyszukiwania o długości co najmniej 3 liter, zwraca listę.typequerymovielubseries.episodenic nie znajduje.yqueryRok premiery.plotqueryshortlubfull. Domyślnieshort.pagequeryStrona wyników wyszukiwania, od 1 do 100. Używana zs.rqueryTylkojson. 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
| Pole | Uwagi |
|---|---|
Title, Year, Rated, Released, Runtime | Tekst. Released wygląda jak 15 Oct 1999. |
Genre, Director, Writer, Actors | Imiona i nazwiska oddzielone przecinkami. |
Plot, Language, Country, Awards | Tekst. |
Poster | Adres w https:/. |
Ratings | Tablica obiektów z Source i Value. |
Metascore, imdbRating, imdbVotes, imdbID | Tekst, w tym liczba głosów z przecinkami. |
Type | movie lub series. |
DVD, BoxOffice, Production, Website | Tylko filmy. BoxOffice niesie wartość, gdy jest znana. DVD, Production i Website zawsze mają postać N/A. |
totalSeasons | Tylko seriale, jako tekst. Odpowiedzi seriali nie mają DVD, BoxOffice, Production ani Website. |
Response | True lub False, zawsze ciąg. |
Pola odpowiadają OMDb, więc istniejący parser OMDb nie wymaga zmian poza bazowym URL.
Przykładowa odpowiedź
{
"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 -sf "https://api.amodb.dev/omdb/?s=Matrix&type=movie&page=1&apikey=$AMODB_KEY"| Pole | Uwagi |
|---|---|
Search | Tablica do 10 pozycji z Title, Year, imdbID, Type, Poster. |
totalResults | Liczba wszystkich dopasowań, jako ciąg. |
Response | True lub False. |
{
"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",. 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 Error | HTTP | Kiedy |
|---|---|---|
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. | 200 | Wartość i nie ma kształtu ID z IMDb. |
Too many results. | 200 | Tekst 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. | 200 | Nie wysłano żadnego z i, t i s. |
Only r= | 400 | r ma inną wartość niż json. |
No API key provided. lub Invalid API key! | 401 | apikey brakuje lub jest błędny. |
Request limit reached! | 429 | Przekroczono 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.
// 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,imdbRatingitotalResultsprzekonwertuj samodzielnie, aN/Atraktuj jako brak. - Używaj
plot=fulltylko wtedy, gdy pokazujesz długi opis fabuły.shortzmniejsza odpowiedzi. - Wyszukiwania przez
ilubtsą w cache dłużej niż wyszukiwania przezs, 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 zposter_pathw stylu TMDB i listy rozmiarów ze strony obrazy. - Trzymaj klucz na serwerze.
apikeyw URL strony widzi każdy odwiedzający.