בחירה לפי היקף ותקציב
TVmaze מיועד לטלוויזיה בלבד. הוא API ציבורי חינמי לשימוש עם מגבלות קצב לפי כתובת IP, והנתונים שלו מגיעים תחת רישיון ייחוס, ולכן את הפרטים ראו במסמכים שלהם. amodb הוא בתשלום ומכסה טלוויזיה, סרטים ואנשים. אם האפליקציה שלכם היא מעקב אחר סדרות ומקור חינמי עונה על הצרכים שלכם, TVmaze הוא התחלה הגיונית. אם אתם מציגים גם סרטים, עמודי שחקנים או פוסטרים בכמה שפות, מפתח אחד של amodb מחליף כמה מקורות.
מה כל היקף אומר לאפליקציה שלכם
| האפליקציה שלכם מציגה | TVmaze | amodb |
|---|---|---|
| עמוד סדרה | כן | GET /3/tv/{series_id} |
| רשימת פרקים | כן | GET / |
| עמוד סרט | אין סרטים | GET / |
| עמוד שחקן | ראו במסמכים שלהם | GET / וקרדיטים משולבים |
| סדרות שעולות היום | ראו במסמכים שלהם | GET /3/tv/airing_today |
| תקציר מתורגם | ראו במסמכים שלהם | הפרמטר language, 14 שפות |
| ציונים מכמה אתרים | ראו במסמכים שלהם | ההרחבה /ratings |
שורת הסרטים מכריעה ברוב המקרים. אם אין לכם עמודי סרטים, להיקף הנוסף אין ערך עבורכם.
פערים לבדוק לפני המעבר
נקודות הקצה של עונות ופרקים עוקבות אחרי המבנה של TMDB, וכמה חלקים בהן חוזרים ריקים. בדקו את המסכים שמשתמשים בהם.
- שחקני פרק. בפרק,
castהוא מערך ריק.guest_starsו-crewמלאים, וקריאת/creditsשל הסדרה מכילה את השחקנים הראשיים. - תוספות לעונה.
images,videosו-translationsשל עונה ריקים, ולכן פוסטר עונה מגיע מרשומת העונה ולא מרשימת תמונות. - מזהים חיצוניים. ה-
external_idsשל עונות ופרקים הם כולם null. מפו פרקים לרשומות שלכם לפיseason_numberו-episode_number. - יוצרים.
created_byבסדרה ריק ברוב הסדרות. - אין פיד שינויים. ל-amodb אין נקודת קצה שמציגה סדרות שהשתנו מאז תאריך מסוים.
השוואת תכונות
| תכונה | TVmaze | amodb |
|---|---|---|
| מודל תמחור | API ציבורי חינמי לשימוש | תשלום מראש, 1 עד 24 חודשים לרכישה |
| מסלול חינמי | כן, כל ה-API הציבורי | אין, וגם אין תקופת ניסיון |
| אימות | ראו במסמכים שלהם | api_key או כותרת Bearer |
| פורמט תגובה | JSON, ראו במסמכים שלהם | JSON במבנה של TMDB v3 |
| שפות | ראו במסמכים שלהם | 14 שפות ממשק |
| סרטים | לא | כן |
| סדרות | כן, זה המיקוד היחיד שלו | כן |
| אנשים | ראו במסמכים שלהם | כן |
| תמונות | ראו במסמכים שלהם | img.amodb.dev, עשרה מזהי גודל |
| דירוגים | ראו במסמכים שלהם | חמישה מקורות כשהם ידועים |
| מגבלת קצב | לפי כתובת IP, את המספרים ראו במסמכים שלהם | 20, 40 או 120 לדקה לכל מפתח |
| שימוש מסחרי | הנתונים תחת רישיון ייחוס, ראו במסמכים שלהם | מסלולים בתשלום, ראו תמחור |
| תאימות | ה-API שלו | קריאות של TMDB v3 ו-OMDb |
במה amodb שונה
- המגבלה עוקבת אחרי המפתח. כל השרתים שלכם חולקים מונה אחד בחלון נע של 60 שניות, והתגובות נושאות
X-RateLimit-Remaining. שום דבר לא תלוי בכתובת שממנה יוצאת בקשה. - סרטים, טלוויזיה ואנשים במקום אחד. לקוח אחד, פורמט שגיאות אחד וסט אחד של כותרות מכסים את כל האפליקציה.
- שפות. כותרות ותקצירים חוזרים בכל אחת מ-14 שפות, ו-
original_nameשומר את הכותרת בשפת המקור. - פרוטוקול מבוסס. ספריות שנכתבו לקריאות של TMDB v3 עובדות עם כתובת בסיס חדשה. את נקודות הקצה של סדרות ראו בעמוד API לסדרות טלוויזיה.
מתי TVmaze מתאים יותר
- בלי תקציב. הוא חינמי לשימוש, ולכן פרויקט סטודנטים או מעקב סדרות לסוף שבוע לא דורשים תשלום. ל-amodb אין מסלול חינמי ואין תקופת ניסיון.
- טלוויזיה בלבד, בפשטות. אם מודל הנתונים שלכם כולל סדרות ופרקים ותו לא, API שמתמקד בטלוויזיה מתאים לו.
- המוסכמות שלו. אפליקציות שכבר נבנו סביב המודל של TVmaze חוסכות עבודה אם הן נשארות.
אם נשארים, עקבו אחרי רישיון הייחוס שלו. את הנוסח ראו במסמכים שלהם.
מעבר ל-amodb
התחילו במשימת מיפוי. קראו את המזהים החיצוניים שרשומות TVmaze ששמרתם מציינות (את שמות השדות ראו במסמכים שלהם) ופתרו אותם דרך /3/find. התוכנית שלמטה ממפה מזהה IMDb אחד לסדרה ומדפיסה את תאריך הפרק הבא.
package main
import (
"encoding/json"
"fmt"
"net/http"
"os"
"time"
)
type findResult struct {
TVResults []struct {
ID int `json:"id"`
Name string `json:"name"`
} `json:"tv_results"`
}
type episode struct {
AirDate string `json:"air_date"`
SeasonNumber int `json:"season_number"`
EpisodeNumber int `json:"episode_number"`
}
type series struct {
Name string `json:"name"`
Status string `json:"status"`
NextEpisode *episode `json:"next_episode_to_air"`
}
var client = &http.Client{Timeout: 10 * time.Second}
func get(path string, out any) error {
req, err := http.NewRequest(http.MethodGet, "https://api.amodb.dev/3"+path, nil)
if err != nil {
return err
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("AMODB_KEY"))
res, err := client.Do(req)
if err != nil {
return err
}
defer res.Body.Close()
if res.StatusCode != http.StatusOK {
return fmt.Errorf("amodb returned %s", res.Status)
}
return json.NewDecoder(res.Body).Decode(out)
}
func main() {
var found findResult
if err := get("/find/tt0903747?external_source=imdb_id", &found); err != nil {
fmt.Println(err)
return
}
if len(found.TVResults) == 0 {
fmt.Println("no match")
return
}
var s series
if err := get(fmt.Sprintf("/tv/%d", found.TVResults[0].ID), &s); err != nil {
fmt.Println(err)
return
}
fmt.Println(s.Name, s.Status)
if s.NextEpisode != nil {
fmt.Println("next episode:", s.NextEpisode.AirDate)
}
}סוג המצביע של NextEpisode מטפל ב-null שסדרות שהסתיימו מחזירות. הריצו את המיפוי פעם אחת, שמרו את מזהה amodb עם כל אחת מהרשומות שלכם, ומכאן והלאה קראו ל-/3/tv/{id}. על 429 עונים עם Retry-After, ובעמוד חיפוש לפי מזהה חיצוני מופיעים מקורות המזהים האחרים.
תכנון סנכרון לילי
נניח שאתם מרעננים 300 סדרות בכל לילה. אלה 300 בקשות, כי קריאת סדרה אחת מחזירה סדרה אחת. ב-20 בקשות לדקה המשימה לוקחת 15 דקות, ב-40 היא לוקחת 7.5 דקות, וב-120 היא לוקחת 2.5 דקות. הוסיפו append_ לכל קריאה כדי ששחקנים וציונים יגיעו באותה בקשה במקום לעלות שתי בקשות נוספות לכל סדרה. קראו את X-RateLimit-Remaining והשהו כשהוא מגיע לאפס, ואז המשיכו אחרי X-RateLimit-Reset שניות.
תמחור
amodb הוא בתשלום מראש ולעולם לא מתחדש מעצמו. בחרו 1, 3, 6, 12 או 24 חודשים ומסלול של 20, 40 או 120 בקשות לדקה. תקופות ארוכות יותר זולות ב-10, 20, 30 או 40 אחוז, וכל מסלול כולל את כל הנתונים. הסכומים מופיעים בעמוד תמחור.