API delle traduzioni
Gli endpoint delle traduzioni restituiscono ogni versione linguistica di un record in una sola risposta: titolo o nome, trama, slogan e sito per film e serie, nome e trama per gli episodi. Ogni riga porta iso_639_1, iso_3166_1 ed english_name. Usalo per le lingue che language non serve o per costruire una catena di ripiego.
Ottenere le traduzioni di un film
GET / restituisce una riga per ogni lingua che ha testo per il film. Ogni riga contiene un oggetto data con i campi tradotti. La chiamata non accetta alcun parametro di lingua, perché lo scopo è proprio vedere tutte le lingue insieme.
L'esempio trova la riga in russo e ne stampa il titolo e l'inizio della trama.
curl -s "https://api.amodb.dev/3/movie/550/translations" \
-H "Authorization: Bearer $AMODB_KEY"const url = 'https://api.amodb.dev/3/movie/550/translations';
const res = await fetch(url, { headers: { Authorization: `Bearer ${process.env.AMODB_KEY}` } });
if (!res.ok) throw new Error(`amodb returned ${res.status}`);
const { translations } = await res.json();
const ru = translations.find((t) => t.iso_639_1 === 'ru');
console.log(ru ? `${ru.data.title}: ${ru.data.overview.slice(0, 80)}` : 'no Russian row');import os
import requests
r = requests.get(
"https://api.amodb.dev/3/movie/550/translations",
headers={"Authorization": f"Bearer {os.environ['AMODB_KEY']}"},
timeout=10,
)
r.raise_for_status()
ru = next((t for t in r.json()["translations"] if t["iso_639_1"] == "ru"), None)
print(f"{ru['data']['title']}: {ru['data']['overview'][:80]}" if ru else "no Russian row")<?php
$ch = curl_init('https://api.amodb.dev/3/movie/550/translations');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('AMODB_KEY')],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status !== 200) {
throw new RuntimeException("amodb returned $status");
}
foreach (json_decode($body, true)['translations'] as $t) {
if ($t['iso_639_1'] === 'ru') {
echo $t['data']['title'], ': ', mb_substr($t['data']['overview'], 0, 80), PHP_EOL;
exit;
}
}
echo 'no Russian row', PHP_EOL;package main
import (
"encoding/json"
"fmt"
"net/http"
"os"
"time"
)
type Translations struct {
Translations []struct {
ISO6391 string `json:"iso_639_1"`
Data struct {
Title string `json:"title"`
Overview string `json:"overview"`
} `json:"data"`
} `json:"translations"`
}
func main() {
req, _ := http.NewRequest("GET", "https://api.amodb.dev/3/movie/550/translations", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("AMODB_KEY"))
client := &http.Client{Timeout: 10 * time.Second}
res, err := client.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
if res.StatusCode != http.StatusOK {
panic(res.Status)
}
var t Translations
if err := json.NewDecoder(res.Body).Decode(&t); err != nil {
panic(err)
}
for _, row := range t.Translations {
if row.ISO6391 == "ru" {
text := []rune(row.Data.Overview)
if len(text) > 80 {
text = text[:80]
}
fmt.Printf("%s: %s\n", row.Data.Title, string(text))
return
}
}
fmt.Println("no Russian row")
}Parametri
movie_idpercorsoobbligatorioID numerico del film, per esempio550.api_keyqueryuno dei dueLa tua chiave. Usa questa o l'headerAuthorization: Bearer.
Campi della risposta
| Campo | Tipo | Note |
|---|---|---|
id | intero | L'ID del film. |
translations | array | Una riga per ogni lingua che ha testo, ordinata per codice lingua. Il film 550 restituisce 50 righe. |
translations[].iso_ | stringa | Codice paese che accompagna la lingua, come US per en o BR per pt. Per le lingue fuori dalle 14 servite ripete il codice della lingua in maiuscolo. |
translations[].iso_ | stringa | Codice lingua come ru o pt. Univoco nell'array. |
translations[].name | stringa | La lingua scritta in quella lingua. |
translations[].english_ | stringa | Il nome della lingua in inglese. |
translations[].data | oggetto | I campi tradotti. Le chiavi dipendono dalla risorsa, vedi la tabella qui sotto. |
Risposta di esempio
Sono mostrate due delle 50 righe, e le trame sono tagliate.
{
"id": 550,
"translations": [
{
"iso_3166_1": "US",
"iso_639_1": "en",
"name": "English",
"english_name": "English",
"data": {
"title": "Fight Club",
"overview": "A ticking-time-bomb insomniac and a slippery soap salesman channel primal male aggression into a shocking new form of therapy....",
"homepage": "https://www.20thcenturystudios.com/movies/fight-club",
"tagline": "Mischief. Mayhem. Soap.",
"runtime": 0
}
},
{
"iso_3166_1": "RU",
"iso_639_1": "ru",
"name": "Русский",
"english_name": "Russian",
"data": {
"title": "Бойцовский клуб",
"overview": "Сотрудник страховой компании страдает хронической бессонницей и отчаянно пытается вырваться из мучительно скучной жизни. Однажд...",
"homepage": "https://www.20thcenturystudios.com/movies/fight-club",
"tagline": "«Интриги. Хаос. Мыло»",
"runtime": 0
}
}
]
}In amodb runtime vale sempre 0 in una riga di traduzione. Leggi la durata dalla scheda dei dettagli del film.
Endpoint delle traduzioni e le loro chiavi di dati
Tutti i percorsi condividono la base https:/. Ognuno restituisce id e un array translations con la forma di riga qui sopra. Cambiano solo le chiavi dentro data.
| Metodo e percorso | Chiavi di data |
|---|---|
GET / | title, overview, homepage, tagline, runtime (sempre 0) |
GET / | name, overview, homepage, tagline |
GET / | nessuna, l'array è sempre vuoto |
GET / | name, overview |
I record delle serie elencano più o meno tante lingue quante i film. Le righe degli episodi coprono solo le lingue servite che hanno testo per quell'episodio, da 2 a 14 nei campioni controllati. Tratta una chiave mancante come un valore vuoto, e ignora le chiavi che non conosci. Vedi serie TV per i record padre.
amodb non offre traduzioni per persone o collezioni. La biografia di una persona segue il parametro language della chiamata dei dettagli della persona, e la trama di una collezione arriva come salvata.
Ripiegare quando il testo manca
Un titolo può esistere in 14 lingue e avere comunque una trama vuota in quella scelta dal tuo utente. Scorri una catena di lingue, prendi il primo valore non vuoto e ricorda da quale lingua viene.
function pickText(translations, wanted, field) {
for (const code of [...wanted, 'en']) {
const row = translations.find((t) => t.iso_639_1 === code);
const value = row?.data?.[field];
if (value) return { code, value };
}
return null;
}
// Prefer Ukrainian, then Russian, then English.
// const hit = pickText(translations, ['uk', 'ru'], 'overview');Per una serie, passa 'name' come campo invece di 'title'. Segnala nella tua interfaccia il testo preso da una lingua di ripiego, così l'utente capisce perché una pagina in ucraino mostra una sinossi in inglese.
Translations o parametro language
| Esigenza | Cosa usare |
|---|---|
| Mostrare una lingua a un utente | language sulla chiamata dei dettagli |
| Elencare tutte le lingue di un titolo in un editor | Questo endpoint |
Leggere una lingua che language non serve, come ja | Questo endpoint, scegli la riga per iso_639_1 |
| Controllare quali delle 14 lingue servite hanno testo | Questo endpoint, confronta iso_639_1 |
| Costruire link a lingue alternative per una pagina | Questo endpoint, leggi i codici presenti |
Per i tag che language accetta, vedi lingue. Qualsiasi altro tag ripiega sull'inglese in una chiamata di dettagli.
Errori
| HTTP | status_code | Quando |
|---|---|---|
| 401 | 7 | La chiave manca o è sbagliata. |
| 402 | 36 | Il periodo del piano è terminato. |
| 404 | 34 | Nessuna stagione o episodio con quell'ID, o un ID che non è un numero. |
| 405 | 37 | Hai usato un metodo di scrittura su un percorso di traduzioni. |
| 429 | 25 | Hai superato le richieste al minuto. Attendi i secondi di Retry-After. |
Un ID di film o serie che non esiste non è un errore su questo percorso: risponde 200 con "translations": [], mentre il percorso dei dettagli risponde 404. Altro nelle pagine errori e limiti di richieste.
Note pratiche
- Una chiamata sostituisce fino a 14 chiamate di dettagli. Usala quando ti servono più di due lingue dello stesso titolo.
- Le righe sono ordinate per codice lingua, che non è un ordine di priorità. Scegli le righe per
iso_639_1, mai per posizione nell'array. - Le chiamate di tipo dettagli restano in cache sull'edge per 6 ore, quindi una cache client della stessa durata non costa nulla in freschezza.
- I titoli originali in altre scritture, come giapponese o coreano, sono sempre disponibili in
original_titleeoriginal_namenella scheda dei dettagli. - Per aggiungere le traduzioni a una chiamata di dettagli, passa
append_e leggi lo stesso array dalla risposta. Funziona per film, serie ed episodi. Il blocco aggiunto non ha unto_ response= translations id.