API חיפוש
נקודות הקצה של החיפוש הופכות שאילתת טקסט למזהים. GET /3/search/movie מוצא סרטים, ונתיבים אחים מוצאים סדרות, אנשים, אוספים, חברות ומילות מפתח, או את כל המדיה בבת אחת עם multi. ה-JSON זהה ל-TMDB v3, התוצאות מחולקות ל-20 בעמוד, והקצה שומר שאילתה במטמון 10 דקות.
חיפוש סרטים
GET /3/search/movie מקבל שאילתת טקסט ומחזיר רשימה מחולקת לעמודים של סרטים תואמים, ההתאמה הטובה ביותר ראשונה. השתמשו בו כדי להפוך את מה שהמשתמש הקליד למזהה סרט, ואז קראו לפרטי סרט עם המזהה הזה.
הדוגמה מחפשת את Inception, מוגבלת ל-2010, ומדפיסה מזהה, כותרת ותאריך יציאה.
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)
}
}פרמטרים
queryשאילתהחובהטקסט לחיפוש. קודדו אותו כ-URL: רווחים הופכים ל-%20או ל-+.api_keyשאילתהאחד משנייםהמפתח שלכם. השתמשו בו או בכותרתAuthorization: Bearer.yearשאילתהשנה בת ארבע ספרות. משאיר סרטים עם תאריך יציאה כלשהו באותה שנה, בכל מדינה.primary_release_yearשאילתהשנה בת ארבע ספרות. מתאים רק לתאריך היציאה הראשי, ולכן יכול להחזיר פחות כותרים מ-year.regionשאילתהקוד מדינה של 2 אותיות גדולות, כמוUS. מחליף אתrelease_dateבתאריך באותה מדינה כשהוא ידוע. הוא לא מסיר כותרים.include_adultשאילתהמתקבל ומתעלמים ממנו. כותרי תוכן למבוגרים לא מוחזרים לעולם.languageשאילתהתגית TMDB כמוen-USאוit-IT. מוגשות 14 שפות בסיס, וכל שפה אחרת חוזרת לאנגלית. ברירת מחדלen-US.pageשאילתהמספר עמוד מ-1 עד 500. ברירת מחדל 1.
שדות התגובה
| שדה | סוג | הערות |
|---|---|---|
page | integer | העמוד שביקשתם. |
results | array | עד 20 פריטים, ההתאמה הטובה ביותר ראשונה. |
total_pages, total_results | integer | גודל קבוצת התוצאות לשאילתה הזו. מוגבל ל-500 עמודים ול-10000 תוצאות. |
id | integer | מזהה הסרט לנקודת הקצה של הפרטים. |
title, original_title | string | הכותרת המתורגמת והכותרת המקורית. |
original_language | string | קוד של שתי אותיות לשפה שבה הסרט נוצר. |
overview | string | טקסט מתורגם, ריק כשאין תרגום. |
release_date | string | YYYY-MM-DD, ריק לכותרים בלי תאריך. |
genre_ids | array of integers | מזהי ז'אנרים, לא שמות. מפו אותם עם ז'אנרים. |
poster_path, backdrop_path | string או null | מצרפים ל-https:/. |
popularity, vote_average, vote_count | number | ערכי דירוג וציון. |
adult, video | boolean | adult תמיד false. הערך video הוא true בפריטים שסומנו כתוכן וידאו. |
תגובה לדוגמה
{
"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
}התגובה כוללת את שלוש ההתאמות. היא נשלפה מה-API החי, ורק מחרוזות overview ארוכות קוצרו.
נקודות קצה נוספות לחיפוש
כל נתיב בהמשך חולק את בסיס הכתובת https:/, דורש query ומחזיר את אותה מעטפת page, results, total_pages ו-total_results. כל אחד מקבל גם page מ-1 עד 500. הפרמטר include_adult מתקבל בכולם ומתעלמים ממנו.
| שיטה ונתיב | מה נמצא | פרמטרים נוספים | שדות הפריט |
|---|---|---|---|
GET /search/tv | סדרות | first_air_date_year, year, language | name, original_name, first_air_date, origin_country |
GET /search/person | אנשים | language | name, original_name, known_for_department, gender, profile_path, known_for |
GET /search/multi | סרטים, סדרות ואנשים יחד | language | media_type ושדות הסוג הזה |
GET /search/collection | אוספי סרטים | language | name, original_name, overview, poster_path, backdrop_path |
GET /search/company | חברות הפקה | אין | name, logo_path, origin_country |
GET /search/keyword | מילות מפתח | אין | id, name |
בסדרות, first_air_date_year משאיר סדרות שתאריך השידור הראשון שלהן באותה שנה, ואילו year משאיר גם סדרות ישנות יותר ששודרו באותה שנה. חיפוש של the עם year=2010 מחזיר את The Simpsons, ששודרה לראשונה ב-1989, ואילו אותו חיפוש עם first_ לא מחזיר אותה. אם שולחים את שניהם, שניהם חייבים להתאים. פריטי אנשים נושאים עד 3 כותרי known_for, כל אחד עם media_type. הנתיב /search/multi מתעלם מ-year.
ישויות שנמצאו כאן ממשיכות בסדרות טלוויזיה, באנשים, באוספים, בחברות ורשתות ובמילות מפתח.
חיפוש multi
הערך media_type הוא movie, tv או person, והוא אומר לכם אילו שדות לצפות. פריטי סרטים נושאים title, ופריטי סדרות ואנשים נושאים name.
const byType = { movie: [], tv: [], person: [] };
for (const r of results) byType[r.media_type]?.push(r.title || r.name);
console.log(byType);שגיאות
הנתיבים /search/tv ו-/search/person עונים על שאילתה בלי התאמה ב-HTTP 200, מערך results ריק ו-total_results שהוא 0. כרגע /search/movie, /search/multi, /search/keyword, /search/company ו-/search/collection עונים על אותו מצב ב-HTTP 500 עם status_code 11. התייחסו ל-500 בנתיבים האלה כאל אין תוצאות, אלא אם הוא חוזר גם בשאילתות שאתם יודעים שמתאימות.
| HTTP | status_code | מתי |
|---|---|---|
| 401 | 7 | המפתח חסר או שגוי. |
| 402 | 36 | תקופת המסלול הסתיימה. |
| 405 | 37 | קראתם לשיטת כתיבה. |
| 429 | 25 | מעל הבקשות שלכם לדקה. המתינו Retry-After שניות. |
| 500 | 11 | שאילתת סרט, multi, מילת מפתח, חברה או אוסף שאין לה התאמה, או page מחוץ לטווח 1 עד 500. |
| 504 | 24 | השרת האחורי לא ענה בזמן. נסו שוב פעם אחת. |
הרשימה המלאה בעמוד שגיאות, והחלונות בעמוד מגבלות קצב.
הערות מעשיות
- הקצה שומר חיפוש במטמון 10 דקות ומשתף את העותק בין מפתחות. כל קריאה עדיין נספרת מול 20, 40 או 120 הבקשות שלכם לדקה, כי מגבלת הקצב רצה לפני המטמון.
- בתיבת חיפוש, המתינו 300 מילישניות אחרי ההקשה האחרונה וביטלו את הבקשה שבדרך. תיבה ששולחת בקשה בכל הקשה יכולה לנצל מסלול של 20 בקשות לדקה בתוך שניות.
- הפכו את השאילתה לאותיות קטנות וחתכו רווחים לפני שאתם משתמשים בה כמפתח מטמון בצד שלכם.
- כדי לחפש כותר לפי מזהה IMDb, דלגו על החיפוש והשתמשו בחיפוש לפי מזהה חיצוני.
- מזהה מילת מפתח מ-
/search/keywordמזין את המסנןwith_keywordsבAPI גילוי, ומזהה חברה מזין אתwith_companies.