Obtenir tous les épisodes d'une saison

GET /3/tv/{tv_id}/season/{season_number} renvoie une saison avec son tableau episodes complet. Chaque épisode a episode_number, name, overview, air_date, runtime et still_path. Les identifiants sont les identifiants numériques qu'utilise TMDB, par exemple 1396 pour Breaking Bad.

Vous obtenez des saisons, des épisodes avec dates et durées, des images, le prochain et le dernier épisode diffusés d'une série, ainsi que la liste des ordres d'épisodes alternatifs. Les champs de texte suivent le paramètre language, et un résumé reste vide quand il n'existe pas de traduction.

Les données obtenues

Point de terminaisonRenvoie
GET /3/tv/{tv_id}Le résumé seasons, number_of_seasons, status, next_episode_to_air, last_episode_to_air
GET /3/tv/{tv_id}/season/{season_number}Une saison avec tous ses episodes
GET /3/tv/{tv_id}/season/{season_number}/episode/{episode_number}Un épisode avec crew et guest_stars
GET /3/tv/{tv_id}/episode_groupsLe nom, le type et le nombre d'épisodes de chaque ordre alternatif défini pour la série

Champs d'un épisode :

ChampTypeRemarques
id, show_identierIdentifiant de l'épisode et de la série. show_id figure dans les listes de saisons et dans next_episode_to_air, pas sur le chemin d'un seul épisode
episode_number, season_numberentierPosition dans la saison
episode_typechaînePar exemple standard
name, overviewchaîneLocalisés avec language
air_datechaîne ou nullYYYY-MM-DD, vide ou null quand non annoncé
runtimeentier ou nullMinutes
still_pathchaîne ou nullÀ ajouter à https://img.amodb.dev/t/p/{size}
vote_average, vote_countnombre, entierActuellement 0 sur les épisodes
production_codechaîneCode du studio, souvent vide
crew, guest_starstableauPersonnes créditées sur l'épisode, avec les mêmes champs qu'un membre de la distribution

Démarrer en 3 étapes

  1. Choisissez une offre sur les tarifs. Toutes les offres renvoient les mêmes données d'épisodes, seul le débit de requêtes diffère.
  2. Créez une clé dans le tableau de bord de votre compte et stockez-la dans une variable d'environnement.
  3. Demandez /3/tv/{tv_id}/season/1 avec la clé en en-tête Bearer ou dans api_key.

Exemple de requête

L'exemple récupère la saison 1 de Breaking Bad (id de série 1396) en anglais. Le programme Go la décode dans des structures typées et affiche une ligne par épisode avec la date de diffusion, la durée et l'URL de l'image.

bashgo
curl -s "https://api.amodb.dev/3/tv/1396/season/1?language=en-US" \
  -H "Authorization: Bearer $AMODB_KEY"
package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"os"
	"time"
)

type Episode struct {
	EpisodeNumber int     `json:"episode_number"`
	Name          string  `json:"name"`
	AirDate       string  `json:"air_date"`
	Runtime       int     `json:"runtime"`
	StillPath     *string `json:"still_path"`
}

type Season struct {
	Name         string    `json:"name"`
	SeasonNumber int       `json:"season_number"`
	Episodes     []Episode `json:"episodes"`
}

func main() {
	client := &http.Client{Timeout: 10 * time.Second}
	url := "https://api.amodb.dev/3/tv/1396/season/1?language=en-US"
	req, err := http.NewRequest("GET", url, nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("Authorization", "Bearer "+os.Getenv("AMODB_KEY"))
	res, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	if res.StatusCode != http.StatusOK {
		panic(fmt.Sprintf("amodb returned %s", res.Status))
	}
	var season Season
	if err := json.NewDecoder(res.Body).Decode(&season); err != nil {
		panic(err)
	}
	fmt.Println(season.Name)
	for _, e := range season.Episodes {
		still := "no still"
		if e.StillPath != nil {
			still = "https://img.amodb.dev/t/p/w300" + *e.StillPath
		}
		fmt.Printf("S%02dE%02d  %s  %3d min  %s  %s\n",
			season.SeasonNumber, e.EpisodeNumber, e.AirDate, e.Runtime, e.Name, still)
	}
}

Réponse abrégée : 2 des 7 épisodes, avec un membre d'équipe et une vedette invitée chacun.

JSON
{
  "air_date": "2008-01-20",
  "episodes": [
    {
      "air_date": "2008-01-20",
      "episode_number": 1,
      "episode_type": "standard",
      "id": 62085,
      "name": "Pilot",
      "overview": "When an unassuming high school chemistry teacher discovers he has a rare form...",
      "production_code": "",
      "runtime": 59,
      "season_number": 1,
      "show_id": 1396,
      "still_path": "/ydlY3iPfeOAvu8gVqrxPoMvzNCn.jpg",
      "vote_average": 0,
      "vote_count": 0,
      "crew": [
        {
          "department": "Camera",
          "job": "Director of Photography",
          "credit_id": "52b7029219c29533d00dd2c1",
          "adult": false,
          "gender": 2,
          "id": 2483,
          "known_for_department": "Camera",
          "name": "约翰·托尔",
          "original_name": "约翰·托尔",
          "popularity": 1.1957,
          "profile_path": "/cfL9A6tC7L5Ps5fq1o3WpVKGMb1.jpg"
        }
      ],
      "guest_stars": [
        {
          "character": "Steven Gomez",
          "credit_id": "5271b489760ee35b3e0881a7",
          "order": 8,
          "adult": false,
          "gender": 2,
          "id": 61535,
          "known_for_department": "Acting",
          "name": "史蒂文·迈克尔·奎扎达",
          "original_name": "史蒂文·迈克尔·奎扎达",
          "popularity": 1.7511,
          "profile_path": "/pVYrDkwI6GWvCNL2kJhpDJfBFyd.jpg"
        }
      ]
    },
    {
      "air_date": "2008-01-27",
      "episode_number": 2,
      "episode_type": "standard",
      "id": 62086,
      "name": "Cat's in the Bag...",
      "overview": "Walt and Jesse attempt to tie up loose ends. The desperate situation gets mor...",
      "production_code": "",
      "runtime": 49,
      "season_number": 1,
      "show_id": 1396,
      "still_path": "/AbMoecO0ZZio0LcgeLxlzdyGs6X.jpg",
      "vote_average": 0,
      "vote_count": 0,
      "crew": [
        {
          "department": "Camera",
          "job": "Director of Photography",
          "credit_id": "52b7049c19c2953b63015013",
          "adult": false,
          "gender": 2,
          "id": 17948,
          "known_for_department": "Camera",
          "name": "Reynaldo Villalobos",
          "original_name": "Reynaldo Villalobos",
          "popularity": 0.904,
          "profile_path": "/4YlfhHDRZWhbRgeqT2Bwl1u5p9j.jpg"
        }
      ],
      "guest_stars": [
        {
          "character": "Krazy-8",
          "credit_id": "52725845760ee3046b09426e",
          "order": 504,
          "adult": false,
          "gender": 2,
          "id": 1046460,
          "known_for_department": "Acting",
          "name": "Max Arciniega",
          "original_name": "Max Arciniega",
          "popularity": 1.4399,
          "profile_path": "/eqKAJKPpt41KpsLIkkBnAY4HMAL.jpg"
        }
      ]
    }
  ],
  "name": "Season 1",
  "overview": "High school chemistry teacher Walter White's life is suddenly transformed by...",
  "id": 3572,
  "poster_path": "/91EIXdWxmp2mHNRsSuDW3WyDJLj.jpg",
  "season_number": 1,
  "vote_average": 0
}

Récupérer toute une série

amodb n'accepte pas les valeurs de type season/1 dans append_to_response, donc les appels de saisons restent séparés. Lisez d'abord number_of_seasons et la liste seasons dans les détails de la série, puis demandez chaque saison dans une boucle.

JavaScript
const base = 'https://api.amodb.dev/3';
const headers = { Authorization: `Bearer ${process.env.AMODB_KEY}` };

async function get(path) {
  const res = await fetch(base + path, { headers });
  if (!res.ok) throw new Error(`amodb returned ${res.status} for ${path}`);
  return res.json();
}

const show = await get('/tv/1396');
for (const { season_number } of show.seasons) {
  const season = await get(`/tv/1396/season/${season_number}`);
  console.log(season.name, season.episodes.length);
}

seasons inclut la saison 0 quand la série a des épisodes spéciaux, donc Breaking Bad coûte 1 appel de détails plus 6 appels de saisons. Une série de 10 saisons coûte 11 requêtes. Les détails sont mis en cache 6 heures en périphérie : stockez le résultat et actualisez-le selon un calendrier.

Dates de diffusion et suite

GET /3/tv/{tv_id} contient next_episode_to_air et last_episode_to_air, des objets d'épisode complets avec name, air_date, season_number, episode_number, runtime et still_path. next_episode_to_air vaut null quand rien n'est annoncé. Combinez-le avec status (par exemple Returning Series, Ended ou Canceled) pour décider d'afficher ou non un compte à rebours.

air_date est une date du calendrier sans heure. Comparez-la à la date du jour pour repérer les nouveaux épisodes. Pour une programmation de ce qui est diffusé, les listes airing_today et on_the_air sur tendances et listes sont mises en cache 30 minutes.

Images et durées

Utilisez w185 ou w300 pour les lignes de liste et original pour la taille réelle. Les tailles d'images d'épisodes sont w92, w185, w300 et original. Un épisode peut ne pas avoir d'image : affichez une image de remplacement quand still_path vaut null. L'hôte d'images n'exige aucune clé, voir images.

runtime est en minutes et peut valoir null. Pour afficher la durée d'un marathon sur une saison, additionnez runtime sur episodes en comptant null comme 0. Ajoutez append_to_response=credits,images au chemin d'un seul épisode pour obtenir un objet credits et une liste stills. Le tableau cast de l'épisode est vide, et les personnes se trouvent dans crew et guest_stars. Les détails sont sur saisons et épisodes et crédits.

Ordres alternatifs avec les groupes d'épisodes

Certaines séries se regardent dans un autre ordre que celui de leur diffusion. GET /3/tv/{tv_id}/episode_groups liste les ordres définis pour une série. Chaque entrée a id, name, description, type, episode_count, group_count et network. Le tableau results est vide quand aucun n'est défini.

typeOrdre
1Date de diffusion d'origine
2Absolu
3DVD
4Numérique
5Arc narratif
6Production
7Télévision

amodb ne renvoie que cette liste. Il ne propose pas GET /3/tv/episode_group/{id}, donc les épisodes à l'intérieur d'un groupe ne sont pas disponibles. Utilisez les points de terminaison de saisons pour les données d'épisodes.

Comparaison

CapacitéExtraire les pages d'épisodesAPI de métadonnées avec offre gratuiteamodb
Saison complèteUne page à récupérer par saisonVoir leur documentationUn seul appel, tableau episodes inclus
Série entièreParcourir chaque saisonVoir leur documentationUn appel par saison, listées dans seasons
Dates de diffusionAnalyser du texteVoir leur documentationair_date plus next_episode_to_air
ImagesTélécharger et redimensionnerVoir leur documentationTailles fixes sur img.amodb.dev, sans clé
Autres ordres d'épisodesNon disponibleVoir leur documentationListe episode_groups, contenu des groupes non servi
LanguesUne langue par siteVoir leur documentation14 langues via language

Tarifs

Les offres sont prépayées pour 1, 3, 6, 12 ou 24 mois, avec 0, 10, 20, 30 ou 40 pour cent de réduction pour les périodes plus longues, et elles ne se renouvellent jamais toutes seules. Les offres à 20, 40 et 120 requêtes par minute renvoient tous les points de terminaison de cette page. Actualiser une série coûte une requête pour les détails et une par saison. Il n'y a pas d'offre gratuite. Choisissez une offre sur les tarifs.