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ă.

Actualizat Vezi ca Markdown

Obține traducerile unui film

GET /3/movie/{movie_id}/translations î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.

bashjspyphpgo
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_idcaleobligatoriu
    ID numeric de film, de exemplu 550.
  • api_keyinterogareuna dintre cele două
    Cheia ta. Folosește-o pe aceasta sau antetul Authorization: Bearer.

Câmpurile răspunsului

CâmpTipObservații
idnumăr întregID-ul filmului.
translationsarrayUn rând pentru fiecare limbă care are text, sortat după codul limbii. Filmul 550 întoarce 50 de rânduri.
translations[].iso_3166_1șirCodul 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_639_1șirCod de limbă precum ru sau pt. Unic în array.
translations[].nameșirLimba scrisă în acea limbă.
translations[].english_nameșirNumele limbii în engleză.
translations[].dataobiectCâ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.

JSON
{
  "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://api.amodb.dev/3. Fiecare întoarce id și un array translations cu structura de rând de mai sus. Se schimbă doar cheile din data.

Metodă și caleChei data
GET /movie/{movie_id}/translationstitle, overview, homepage, tagline, runtime (mereu 0)
GET /tv/{series_id}/translationsname, overview, homepage, tagline
GET /tv/{series_id}/season/{season_number}/translationsniciuna, array-ul este mereu gol
GET /tv/{series_id}/season/{season_number}/episode/{episode_number}/translationsname, 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.

JavaScript
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

NevoieFolosește
Arăți o limbă unui utilizatorlanguage la apelul de detalii
Listezi toate limbile unui titlu într-un editorAcest endpoint
Citești o limbă pe care language nu o servește, precum jaAcest endpoint, alege rândul după iso_639_1
Verifici care dintre cele 14 limbi servite au textAcest 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

HTTPstatus_codeCând
4017Cheia lipsește sau este greșită.
40236Perioada planului s-a încheiat.
40434Niciun sezon sau episod cu acel ID sau un ID care nu este număr.
40537Ai folosit o metodă de scriere pe o cale de traduceri.
42925Ai 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 și original_name în fișa de detalii.
  • Ca să adaugi traduceri la un apel de detalii, transmite append_to_response=translations și citește același array din răspuns. Funcționează pentru filme, seriale și episoade. Blocul atașat nu are id.