API căutare
Endpoint-urile de căutare transformă o interogare text în ID-uri. GET /3/search/movie găsește filme, iar căile surori găsesc seriale TV, persoane, colecții, companii și cuvinte-cheie, sau toate tipurile de media deodată cu multi. JSON-ul se potrivește cu TMDB v3, rezultatele sunt paginate câte 20 pe pagină, iar marginea ține o interogare în cache 10 minute.
Caută filme
GET /3/search/movie primește o interogare text și întoarce o listă paginată de filme potrivite, cea mai bună potrivire prima. Folosește-l ca să transformi ce a tastat un utilizator într-un ID de film, apoi apelează detalii film cu acel ID.
Exemplul caută Inception, restrâns la 2010, și afișează ID-ul, titlul și data lansării.
curl -sSf --get "https://api.amodb.dev/3/search/movie" \
--data-urlencode "query=inception" \
--data-urlencode "year=2010" \
-H "Authorization: Bearer $AMODB_KEY"const params = new URLSearchParams({ query: 'inception', year: '2010', language: 'en-US' });
const res = await fetch(`https://api.amodb.dev/3/search/movie?${params}`, {
headers: { Authorization: `Bearer ${process.env.AMODB_KEY}` },
});
if (!res.ok) throw new Error(`amodb returned ${res.status}`);
const { results, total_results } = await res.json();
console.log(`${total_results} matches`);
for (const m of results.slice(0, 5)) console.log(m.id, m.title, m.release_date);import os
import requests
r = requests.get(
"https://api.amodb.dev/3/search/movie",
params={"query": "inception", "year": 2010, "language": "en-US"},
headers={"Authorization": f"Bearer {os.environ['AMODB_KEY']}"},
timeout=10,
)
r.raise_for_status()
data = r.json()
print(data["total_results"], "matches")
for m in data["results"][:5]:
print(m["id"], m["title"], m["release_date"])<?php
$url = 'https://api.amodb.dev/3/search/movie?' . http_build_query([
'query' => 'inception',
'year' => 2010,
'language' => 'en-US',
]);
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('AMODB_KEY')],
]);
$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);
foreach (array_slice($data['results'], 0, 5) as $m) {
echo $m['id'], ' ', $m['title'], ' ', $m['release_date'], PHP_EOL;
}package main
import (
"encoding/json"
"fmt"
"net/http"
"net/url"
"os"
"time"
)
type SearchPage struct {
TotalResults int `json:"total_results"`
Results []struct {
ID int `json:"id"`
Title string `json:"title"`
ReleaseDate string `json:"release_date"`
} `json:"results"`
}
func main() {
q := url.Values{"query": {"inception"}, "year": {"2010"}, "language": {"en-US"}}
req, _ := http.NewRequest("GET", "https://api.amodb.dev/3/search/movie?"+q.Encode(), nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("AMODB_KEY"))
client := &http.Client{Timeout: 10 * time.Second}
res, err := client.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
if res.StatusCode != http.StatusOK {
panic(res.Status)
}
var p SearchPage
if err := json.NewDecoder(res.Body).Decode(&p); err != nil {
panic(err)
}
fmt.Println(p.TotalResults, "matches")
for _, m := range p.Results {
fmt.Println(m.ID, m.Title, m.ReleaseDate)
}
}Parametri
queryinterogareobligatoriuTextul de căutat. Codifică-l ca URL: spațiile devin%20sau+.api_keyinterogareuna dintre cele douăCheia ta. Folosește-o pe aceasta sau antetulAuthorization: Bearer.yearinterogareAn din patru cifre. Păstrează filmele cu orice dată de lansare din acel an, în orice țară.primary_release_yearinterogareAn din patru cifre. Se potrivește doar cu data principală de lansare, deci poate întoarce mai puține titluri decâtyear.regioninterogareCod de țară din 2 litere majuscule, precumUS. Înlocuieșterelease_datecu data din acea țară când se cunoaște. Nu elimină titluri.include_adultinterogareAcceptat și ignorat. Titlurile pentru adulți nu sunt întoarse niciodată.languageinterogareEtichetă TMDB precumen-USsauit-IT. Sunt servite 14 limbi de bază, orice altceva revine la engleză. Impliciten-US.pageinterogareNumărul paginii de la 1 la 500. Implicit 1.
Câmpurile răspunsului
| Câmp | Tip | Observații |
|---|---|---|
page | număr întreg | Pagina pe care ai cerut-o. |
results | array | Până la 20 de intrări, cea mai bună potrivire prima. |
total_pages, total_results | număr întreg | Dimensiunea setului de rezultate pentru această interogare. Plafonat la 500 de pagini și 10000 de rezultate. |
id | număr întreg | ID-ul filmului pentru endpoint-ul de detalii. |
title, original_title | șir | Titlul localizat și cel original. |
original_language | șir | Codul din două litere al limbii în care a fost făcut filmul. |
overview | șir | Text localizat, gol când nu există traducere. |
release_date | șir | YYYY-MM-DD, gol pentru titlurile fără dată. |
genre_ids | array de numere întregi | ID-uri de gen, nu nume. Mapează-le cu genuri. |
poster_path, backdrop_path | șir sau null | Se adaugă la https:/. |
popularity, vote_average, vote_count | număr | Valori de clasament și de scor. |
adult, video | boolean | adult este mereu false. video este true pentru intrările marcate ca conținut video. |
Exemplu de răspuns
{
"page": 1,
"results": [
{
"adult": false,
"backdrop_path": "/zSBVQIvx4UIHoFf1oDvixHyIQrz.jpg",
"genre_ids": [28, 878, 80],
"id": 27205,
"original_language": "en",
"original_title": "Inception",
"overview": "Cobb, a skilled thief who commits corporate espionage by infiltrating the subconscious of his targets is of...",
"popularity": 60.9811,
"poster_path": "/xlaY2zyzMfkhk0HSC5VUwzoZPU1.jpg",
"release_date": "2010-07-15",
"title": "Inception",
"video": false,
"vote_average": 8.373,
"vote_count": 40459
},
{
"adult": false,
"backdrop_path": "/p8K8Z4yjaslJx5mTsIC5L6LJxQB.jpg",
"genre_ids": [16, 28, 53],
"id": 64956,
"original_language": "en",
"original_title": "Inception: The Cobol Job",
"overview": "Cobb, Arthur and Nash are enlisted by Cobol Engineering.",
"popularity": 1.9401,
"poster_path": "/sNxqwtyHMNQwKWoFYDqcYTui5Ok.jpg",
"release_date": "2010-12-07",
"title": "Inception: The Cobol Job",
"video": false,
"vote_average": 7.2,
"vote_count": 320
},
{
"adult": false,
"backdrop_path": null,
"genre_ids": [10402],
"id": 973484,
"original_language": "en",
"original_title": "Inception: Music from the Motion Picture",
"overview": "The Special Features Blu-ray disc contains a lossless DTS-HD MA 5.1 surround mix of the Inception soundtrack.",
"popularity": 0.4911,
"poster_path": "/7uM4DyRVAcgagvhZoWrkrqMPbqV.jpg",
"release_date": "2010-12-07",
"title": "Inception: Music from the Motion Picture",
"video": true,
"vote_average": 7,
"vote_count": 3
}
],
"total_pages": 1,
"total_results": 3
}Răspunsul conține toate cele trei potriviri. A fost preluat de la API-ul live și doar șirurile overview lungi au fost scurtate.
Alte endpoint-uri de căutare
Fiecare cale de mai jos are baza https:/, cere query și întoarce același plic page, results, total_pages și total_results. Fiecare primește și page de la 1 la 500. include_adult este acceptat la toate și ignorat.
| Metodă și cale | Găsește | Parametri suplimentari | Câmpurile intrării |
|---|---|---|---|
GET /search/tv | Seriale TV | first_air_date_year, year, language | name, original_name, first_air_date, origin_country |
GET /search/person | Persoane | language | name, original_name, known_for_department, gender, profile_path, known_for |
GET /search/multi | Filme, seriale și persoane împreună | language | media_type plus câmpurile acelui tip |
GET /search/collection | Colecții de filme | language | name, original_name, overview, poster_path, backdrop_path |
GET /search/company | Companii de producție | niciunul | name, logo_path, origin_country |
GET /search/keyword | Cuvinte-cheie | niciunul | id, name |
La TV, first_air_date_year păstrează serialele a căror primă dată de difuzare este în acel an, în timp ce year păstrează și seriale mai vechi care au difuzat în acel an. O căutare pentru the cu year=2010 întoarce The Simpsons, care a fost difuzat prima dată în 1989, iar aceeași căutare cu first_ nu îl întoarce. Dacă le trimiți pe amândouă, trebuie să se potrivească ambele. Intrările de persoane poartă până la 3 titluri known_for, fiecare cu media_type. /search/multi ignoră year.
Entitățile găsite aici continuă la seriale TV, persoane, colecții, companii și rețele și cuvinte-cheie.
Căutare multiplă
media_type este movie, tv sau person și îți spune ce câmpuri să te aștepți. Intrările de film poartă title, iar cele de TV și de persoane poartă name.
const byType = { movie: [], tv: [], person: [] };
for (const r of results) byType[r.media_type]?.push(r.title || r.name);
console.log(byType);Erori
/search/tv și /search/person răspund la o interogare fără potrivire cu HTTP 200, un array results gol și total_results 0. În prezent /search/movie, /search/multi, /search/keyword, /search/company și /search/collection răspund în același caz cu HTTP 500 și status_code 11. Tratează un 500 pe acele căi ca „fără rezultate”, dacă nu se repetă pentru interogări despre care știi că se potrivesc.
| HTTP | status_code | Când |
|---|---|---|
| 401 | 7 | Cheia lipsește sau este greșită. |
| 402 | 36 | Perioada planului s-a încheiat. |
| 405 | 37 | Ai apelat o metodă de scriere. |
| 429 | 25 | Ai depășit cererile pe minut. Așteaptă numărul de secunde din Retry-After. |
| 500 | 11 | O interogare pentru film, multi, cuvânt-cheie, companie sau colecție care nu se potrivește cu nimic, sau un page în afara intervalului 1 până la 500. |
| 504 | 24 | Backend-ul nu a răspuns la timp. Reîncearcă o dată. |
Vezi erori pentru lista completă și limite de cereri pentru ferestre.
Note practice
- Marginea ține o căutare în cache 10 minute și partajează copia între chei. Fiecare apel se numără totuși la cele 20, 40 sau 120 de cereri pe minut, pentru că limita de cereri rulează înaintea cache-ului.
- Pentru o casetă de căutare, așteaptă 300 ms după ultima apăsare de tastă și anulează cererea în curs. O casetă care trimite la fiecare tastă poate consuma un plan de 20 de cereri pe minut în câteva secunde.
- Transformă interogarea în litere mici și taie spațiile înainte să o folosești drept cheie de cache la tine.
- Ca să cauți un titlu după ID IMDb, sari peste căutare și folosește căutare după ID extern.
- Un ID de cuvânt-cheie din
/search/keywordalimentează filtrulwith_keywordsdin descoperire, iar un ID de companie alimenteazăwith_companies.