# Alternativă la API-ul TVmaze

> TVmaze este doar pentru TV, gratuit, limitat pe adresă IP, iar datele sale sunt sub o licență cu atribuire. Vezi documentația lor pentru detalii. amodb este un API cu plată pentru TV, filme și persoane, cu limite numărate pe cheie și căi TMDB v3. Alege după acoperire și buget.

## 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 /3/tv/{series_id}/season/{season_number}`   |
| O pagină de film                 | Fără filme            | `GET /3/movie/{movie_id}`                        |
| O pagină de actor                | Vezi documentația lor | `GET /3/person/{person_id}` ș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, `cast` este un array gol. `guest_stars` și `crew` sunt completate, iar apelul `/credits` al serialului conține distribuția principală.
- **Extra de sezon.** `images`, `videos` și `translations` de sezon sunt goale, deci un poster de sezon vine din fișa sezonului și nu dintr-o listă de imagini.
- **ID-uri externe.** `external_ids` de sezon și de episod sunt toate null. Mapează episoadele la propriile înregistrări după `season_number` și `episode_number`.
- **Creatori.** `created_by` la 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](https://amodb.dev/ro/pricing/) |
| 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_name` păstrează titlul nativ.
- **Protocol consacrat.** Bibliotecile scrise pentru citirile TMDB v3 funcționează cu un URL de bază nou. Vezi pagina [API seriale TV](https://amodb.dev/ro/tv-show-api/) 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.

```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)
	}
}
```

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](https://amodb.dev/ro/find-by-external-id/) 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_to_response=credits,ratings` 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](https://amodb.dev/ro/pricing/).

## Întrebări și răspunsuri

### Este API-ul TVmaze gratuit?

TVmaze oferă un API public gratuit, cu limite pe adresă IP, iar datele sale sunt sub o licență cu atribuire. Vezi documentația lor pentru limitele actuale și textul licenței. amodb este cu plată și nu are nivel gratuit.

### Acoperă amodb filme, nu doar TV?

Da. Filmele, serialele TV, sezoanele, episoadele și persoanele sunt pe aceeași cheie și același URL de bază. TVmaze este doar pentru TV, deci o pagină de film din aplicația ta cere acolo o a doua sursă.

### Cum mapez serialele TVmaze la ID-uri amodb?

Înregistrările de seriale TVmaze listează ID-uri pentru alte baze de date precum IMDb (vezi documentația lor pentru câmpurile exacte). Apelează endpoint-ul find cu ID-ul IMDb și external_source=imdb_id, apoi stochează ID-ul din tv_results.

### De ce contează o limită pe IP?

O limită legată de o adresă IP este partajată de tot ce se află în spatele ei, precum un grup de servere sau o rețea de birou. amodb numără cererile pe cheie într-o fereastră glisantă de 60 de secunde, de oriunde vin apelurile.

### Pot arăta data următorului episod al unui serial?

Da. Detaliile serialului întorc next_episode_to_air cu air_date, season_number și episode_number, sau null când nu e programat nimic. Marginea ține detaliile în cache 6 ore, deci reîmprospătează de câteva ori pe zi.

## Pagini conexe

- [API seriale TV pentru seriale, sezoane și episoade](https://amodb.dev/ro/tv-show-api/): API seriale TV cu starea serialului, rețele, sezoane, episoade și next_episode_to_air. JSON compatibil TMDB v3 în 14 limbi, de la 20 de cereri pe minut.
- [API ghid de episoade](https://amodb.dev/ro/episode-guide-api/): API ghid de episoade pe endpoint-urile TMDB v3: nume, date de difuzare, durate, cadre și liste de grupuri de episoade pentru orice serial, în 14 limbi.
- [API sezoane și episoade TV](https://amodb.dev/ro/tv-seasons-episodes/): API sezoane și episoade TV cu aceleași căi și același JSON ca TMDB v3. Citește un sezon cu toate episoadele sau un episod cu data difuzării, durata și cadrul.
- [Căutare după ID extern](https://amodb.dev/ro/find-by-external-id/): Caută un film, serial sau o persoană după ID IMDb, TVDB, Wikidata sau Kinopoisk cu endpoint-ul find și citește ID-urile externe și faptele Wikidata.
- [Limite de cereri](https://amodb.dev/ro/rate-limits/): amodb limitează fiecare cheie în cereri pe minut, în fereastră glisantă de 60 de secunde: 20, 40 sau 120. Citește antetele și tratează 429 cu Retry-After.
- [Prețuri](https://amodb.dev/ro/pricing/): Planurile amodb diferă doar prin cereri pe minut: 20, 40 sau 120. Toate includ datele compatibile TMDB v3 și OMDb. Plată în avans, fără reînnoire sau probă.

Actualizat: 2026-10-18. Source: https://amodb.dev/ro/tvmaze-api-alternative/
