API traduceri
Endpoint-urile de traduceri întorc toate versiunile lingvistice ale unei înregistrări într-un singur răspuns: titlu sau nume, descriere, slogan și pagină web pentru filme și seriale, nume și descriere pentru episoade. Fiecare rând poartă iso_639_1, iso_3166_1 și english_name. Folosește-l ca să citești limbi pe care parametrul language nu le servește sau ca să construiești un lanț de rezervă.
Obține traducerile unui film
GET / întoarce câte un rând pentru fiecare limbă care are text pentru film. Fiecare rând conține un obiect data cu câmpurile traduse. Apelul nu primește parametru de limbă, pentru că tocmai scopul este să vezi toate limbile deodată.
Exemplul găsește rândul în rusă și afișează titlul și începutul descrierii lui.
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_idcaleobligatoriuID numeric de film, de exemplu550.api_keyinterogareuna dintre cele douăCheia ta. Folosește-o pe aceasta sau antetulAuthorization: Bearer.
Câmpurile răspunsului
| Câmp | Tip | Observații |
|---|---|---|
id | număr întreg | ID-ul filmului. |
translations | array | Un rând pentru fiecare limbă care are text, sortat după codul limbii. Filmul 550 întoarce 50 de rânduri. |
translations[].iso_ | șir | Codul de țară care însoțește limba, precum US pentru en sau BR pentru pt. Pentru limbile din afara celor 14 servite repetă codul limbii cu majuscule. |
translations[].iso_ | șir | Cod de limbă precum ru sau pt. Unic în array. |
translations[].name | șir | Limba scrisă în acea limbă. |
translations[].english_ | șir | Numele limbii în engleză. |
translations[].data | obiect | Câmpurile traduse. Cheile depind de resursă, vezi tabelul de mai jos. |
Exemplu de răspuns
Sunt arătate două din cele 50 de rânduri, iar descrierile sunt tăiate.
{
"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
}
}
]
}În amodb runtime este mereu 0 într-un rând de traducere. Citește durata din fișa de detalii film.
Endpoint-uri de traduceri și cheile lor data
Toate căile au baza https:/. Fiecare întoarce id și un array translations cu structura de rând de mai sus. Se schimbă doar cheile din data.
| Metodă și cale | Chei data |
|---|---|
GET / | title, overview, homepage, tagline, runtime (mereu 0) |
GET / | name, overview, homepage, tagline |
GET / | niciuna, array-ul este mereu gol |
GET / | name, overview |
Înregistrările de seriale listează aproximativ tot atâtea limbi ca filmele. Rândurile de episoade acoperă doar limbile servite care au text pentru acel episod, de la 2 la 14 în eșantioanele verificate. Tratează o cheie lipsă ca pe o valoare goală și ignoră cheile pe care nu le cunoști. Vezi seriale TV pentru înregistrările părinte.
amodb nu oferă traduceri pentru persoane sau colecții. Biografia unei persoane urmează parametrul language al apelului de detalii pentru persoană, iar descrierea unei colecții vine așa cum este stocată.
Revino la alt text când lipsește
Un titlu poate exista în 14 limbi și totuși să aibă o descriere goală în cea aleasă de utilizator. Parcurge un lanț de limbi, ia prima valoare nevidă și ține minte din ce limbă provine.
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');Pentru un serial, transmite 'name' ca nume de câmp în loc de 'title'. Marchează în interfață textul dintr-o limbă de rezervă, ca utilizatorul să știe de ce o pagină în ucraineană arată o sinopsis în engleză.
Traduceri sau parametrul language
| Nevoie | Folosește |
|---|---|
| Arăți o limbă unui utilizator | language la apelul de detalii |
| Listezi toate limbile unui titlu într-un editor | Acest endpoint |
Citești o limbă pe care language nu o servește, precum ja | Acest endpoint, alege rândul după iso_639_1 |
| Verifici care dintre cele 14 limbi servite au text | Acest endpoint, compară iso_639_1 |
| Construiești linkuri de limbă alternativă pentru o pagină | Acest endpoint, citește codurile prezente |
Pentru etichetele pe care le acceptă language, vezi limbi. Orice altă etichetă revine la engleză la un apel de detalii.
Erori
| HTTP | status_code | Când |
|---|---|---|
| 401 | 7 | Cheia lipsește sau este greșită. |
| 402 | 36 | Perioada planului s-a încheiat. |
| 404 | 34 | Niciun sezon sau episod cu acel ID sau un ID care nu este număr. |
| 405 | 37 | Ai folosit o metodă de scriere pe o cale de traduceri. |
| 429 | 25 | Ai depășit cererile pe minut. Așteaptă numărul de secunde din Retry-After. |
Un ID de film sau de serial care nu există nu este o eroare pe această cale: răspunde 200 cu "translations": [], în timp ce calea de detalii răspunde 404. Mai multe la erori și limite de cereri.
Note practice
- Un singur apel înlocuiește până la 14 apeluri de detalii. Folosește-l când ai nevoie de mai mult de două limbi ale aceluiași titlu.
- Rândurile sunt sortate după codul limbii, ceea ce nu este o ordine de prioritate. Alege rândurile după
iso_639_1, niciodată după poziția în array. - Apelurile de tip detalii sunt ținute în cache la margine 6 ore, deci un cache de client de aceeași durată nu costă nimic în prospețime.
- Titlurile originale în alte scrieri, precum japoneza sau coreeana, sunt mereu disponibile în
original_titleșioriginal_nameîn fișa de detalii. - Ca să adaugi traduceri la un apel de detalii, transmite
append_și citește același array din răspuns. Funcționează pentru filme, seriale și episoade. Blocul atașat nu areto_ response= translations id.