Alege după acoperire și buget
TVmaze este doar pentru TV. Este gratuit ca API public, cu limite pe adresă IP, iar datele sale vin sub o licență cu atribuire, deci vezi documentația lor pentru detalii. amodb este cu plată și acoperă TV, filme și persoane. Dacă aplicația ta este un tracker de seriale și o sursă gratuită îți ajunge, TVmaze este un început rezonabil. Dacă arăți și filme, pagini de distribuție sau postere în mai multe limbi, o singură cheie amodb înlocuiește mai multe surse.
Ce înseamnă fiecare acoperire pentru aplicația ta
| Aplicația ta arată | TVmaze | amodb |
|---|---|---|
| O pagină de serial TV | Da | GET /3/tv/{series_id} |
| O listă de episoade | Da | GET / |
| O pagină de film | Fără filme | GET / |
| O pagină de actor | Vezi documentația lor | GET / și credite combinate |
| Seriale difuzate azi | Vezi documentația lor | GET /3/tv/airing_today |
| O descriere tradusă | Vezi documentația lor | parametrul language, 14 limbi |
| Scoruri de pe mai multe site-uri | Vezi documentația lor | extensia /ratings |
Rândul cu filmele decide majoritatea cazurilor. Dacă nu ai pagini de filme, acoperirea suplimentară nu are valoare pentru tine.
Lacune de verificat înainte să te muți
Endpoint-urile de sezon și de episod urmează structura TMDB, iar câteva părți ale lor vin goale. Testează ecranele care le folosesc.
- Distribuția episodului. La un episod,
casteste un array gol.guest_starsșicrewsunt completate, iar apelul/creditsal serialului conține distribuția principală. - Extra de sezon.
images,videosșitranslationsde sezon sunt goale, deci un poster de sezon vine din fișa sezonului și nu dintr-o listă de imagini. - ID-uri externe.
external_idsde sezon și de episod sunt toate null. Mapează episoadele la propriile înregistrări dupăseason_numberșiepisode_number. - Creatori.
created_byla un serial este gol pentru majoritatea serialelor. - Fără flux de modificări. amodb nu are un endpoint care să listeze serialele modificate de la o dată.
Comparația funcțiilor
| Funcție | TVmaze | amodb |
|---|---|---|
| Model de preț | API public gratuit | Plătit în avans, 1 până la 24 de luni pe achiziție |
| Nivel gratuit | Da, tot API-ul public | Niciunul, și fără perioadă de probă |
| Autentificare | Vezi documentația lor | api_key sau antet Bearer |
| Format de răspuns | JSON, vezi documentația lor | JSON în structura TMDB v3 |
| Limbi | Vezi documentația lor | 14 limbi de interfață |
| Filme | Nu | Da |
| TV | Da, singurul său accent | Da |
| Persoane | Vezi documentația lor | Da |
| Imagini | Vezi documentația lor | img.amodb.dev, zece jetoane de dimensiune |
| Evaluări | Vezi documentația lor | Cinci surse, unde se știu |
| Limită de cereri | Pe adresă IP, vezi documentația lor pentru cifre | 20, 40 sau 120 pe minut pe cheie |
| Utilizare comercială | Date sub o licență cu atribuire, vezi documentația lor | Planuri cu plată, vezi prețuri |
| Compatibilitate | Propriul API | Citiri TMDB v3 și OMDb |
Prin ce diferă amodb
- Limita urmează cheia. Toate serverele tale împart un singur contor într-o fereastră glisantă de 60 de secunde, iar răspunsurile poartă
X-RateLimit-Remaining. Nimic nu depinde de adresa din care pleacă o cerere. - Filme, TV și persoane într-un singur loc. Un client, un format de eroare și un set de antete acoperă toată aplicația.
- Limbi. Titlurile și descrierile revin în oricare dintre cele 14 limbi, iar
original_namepăstrează titlul nativ. - Protocol consacrat. Bibliotecile scrise pentru citirile TMDB v3 funcționează cu un URL de bază nou. Vezi pagina API seriale TV pentru endpoint-urile de seriale.
Când TVmaze se potrivește mai bine
- Fără buget. Este gratuit, deci un proiect de student sau un tracker de weekend nu cere nicio plată. amodb nu are nivel gratuit și nici perioadă de probă.
- Doar TV, păstrat simplu. Dacă modelul tău de date are seriale și episoade și nimic altceva, un API axat pe TV i se potrivește.
- Convențiile lui. Aplicațiile deja construite în jurul modelului TVmaze economisesc muncă rămânând.
Dacă rămâi, respectă licența lui cu atribuire. Vezi documentația lor pentru formulare.
Migrarea la amodb
Începe cu un job de mapare. Citește ID-urile externe pe care le listează înregistrările tale TVmaze stocate (vezi documentația lor pentru numele câmpurilor) și rezolvă-le prin /3/find. Programul de mai jos mapează un ID IMDb la un serial și afișează data următorului episod.
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)
}
}Tipul pointer pentru NextEpisode tratează null-ul pe care îl întorc serialele încheiate. Rulează maparea o singură dată, salvează ID-ul amodb la fiecare dintre înregistrările tale și apelează /3/tv/{id} de acolo încolo. Un 429 primește răspuns cu Retry-After, iar pagina căutare după ID extern listează celelalte surse de ID-uri.
Dimensionarea unei sincronizări de noapte
Presupune că reîmprospătezi 300 de seriale în fiecare noapte. Asta înseamnă 300 de cereri, fiindcă un apel de serial întoarce un singur serial. La 20 de cereri pe minut jobul durează 15 minute, la 40 durează 7.5 minute, iar la 120 durează 2.5 minute. Adaugă append_ la fiecare apel, ca distribuția și scorurile să sosească în aceeași cerere în loc să coste încă două pe serial. Citește X-RateLimit-Remaining și fă o pauză când ajunge la zero, apoi continuă după cele X-RateLimit-Reset secunde.
Prețuri
amodb este plătit în avans și nu se reînnoiește niciodată singur. Alege 1, 3, 6, 12 sau 24 de luni și un plan de 20, 40 sau 120 de cereri pe minut. Perioadele mai lungi sunt cu 10, 20, 30 sau 40 la sută mai ieftine, iar fiecare plan include toate datele. Sumele sunt la prețuri.