בחירה לפי היקף ותקציב

TVmaze מיועד לטלוויזיה בלבד. הוא API ציבורי חינמי לשימוש עם מגבלות קצב לפי כתובת IP, והנתונים שלו מגיעים תחת רישיון ייחוס, ולכן את הפרטים ראו במסמכים שלהם. amodb הוא בתשלום ומכסה טלוויזיה, סרטים ואנשים. אם האפליקציה שלכם היא מעקב אחר סדרות ומקור חינמי עונה על הצרכים שלכם, TVmaze הוא התחלה הגיונית. אם אתם מציגים גם סרטים, עמודי שחקנים או פוסטרים בכמה שפות, מפתח אחד של amodb מחליף כמה מקורות.

מה כל היקף אומר לאפליקציה שלכם

האפליקציה שלכם מציגהTVmazeamodb
עמוד סדרהכןGET /3/tv/{series_id}
רשימת פרקיםכןGET /3/tv/{series_id}/season/{season_number}
עמוד סרטאין סרטיםGET /3/movie/{movie_id}
עמוד שחקןראו במסמכים שלהםGET /3/person/{person_id} וקרדיטים משולבים
סדרות שעולות היוםראו במסמכים שלהם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 אין נקודת קצה שמציגה סדרות שהשתנו מאז תאריך מסוים.

השוואת תכונות

תכונהTVmazeamodb
מודל תמחור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 אחד לסדרה ומדפיסה את תאריך הפרק הבא.

Go
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_to_response=credits,ratings לכל קריאה כדי ששחקנים וציונים יגיעו באותה בקשה במקום לעלות שתי בקשות נוספות לכל סדרה. קראו את X-RateLimit-Remaining והשהו כשהוא מגיע לאפס, ואז המשיכו אחרי X-RateLimit-Reset שניות.

תמחור

amodb הוא בתשלום מראש ולעולם לא מתחדש מעצמו. בחרו 1, 3, 6, 12 או 24 חודשים ומסלול של 20, 40 או 120 בקשות לדקה. תקופות ארוכות יותר זולות ב-10, 20, 30 או 40 אחוז, וכל מסלול כולל את כל הנתונים. הסכומים מופיעים בעמוד תמחור.