Obtenir tous les épisodes d'une saison
GET / 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 terminaison | Renvoie |
|---|---|
GET /3/tv/{tv_id} | Le résumé seasons, number_of_seasons, status, next_episode_to_air, last_episode_to_air |
GET / | Une saison avec tous ses episodes |
GET / | Un épisode avec crew et guest_stars |
GET / | Le nom, le type et le nombre d'épisodes de chaque ordre alternatif défini pour la série |
Champs d'un épisode :
| Champ | Type | Remarques |
|---|---|---|
id, show_id | entier | Identifiant 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_number | entier | Position dans la saison |
episode_type | chaîne | Par exemple standard |
name, overview | chaîne | Localisés avec language |
air_date | chaîne ou null | YYYY-MM-DD, vide ou null quand non annoncé |
runtime | entier ou null | Minutes |
still_path | chaîne ou null | À ajouter à https:/ |
vote_average, vote_count | nombre, entier | Actuellement 0 sur les épisodes |
production_code | chaîne | Code du studio, souvent vide |
crew, guest_stars | tableau | Personnes créditées sur l'épisode, avec les mêmes champs qu'un membre de la distribution |
Démarrer en 3 étapes
- 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.
- Créez une clé dans le tableau de bord de votre compte et stockez-la dans une variable d'environnement.
- Demandez
/3/tv/{tv_id}/season/1avec la clé en en-tête Bearer ou dansapi_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.
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.
{
"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.
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_ 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 / 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.
type | Ordre |
|---|---|
| 1 | Date de diffusion d'origine |
| 2 | Absolu |
| 3 | DVD |
| 4 | Numérique |
| 5 | Arc narratif |
| 6 | Production |
| 7 | Télévision |
amodb ne renvoie que cette liste. Il ne propose pas GET /, 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'épisodes | API de métadonnées avec offre gratuite | amodb |
|---|---|---|---|
| Saison complète | Une page à récupérer par saison | Voir leur documentation | Un seul appel, tableau episodes inclus |
| Série entière | Parcourir chaque saison | Voir leur documentation | Un appel par saison, listées dans seasons |
| Dates de diffusion | Analyser du texte | Voir leur documentation | air_date plus next_episode_to_air |
| Images | Télécharger et redimensionner | Voir leur documentation | Tailles fixes sur img.amodb.dev, sans clé |
| Autres ordres d'épisodes | Non disponible | Voir leur documentation | Liste episode_groups, contenu des groupes non servi |
| Langues | Une langue par site | Voir leur documentation | 14 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.