API за преводи

Ендпойнтите за преводи връщат всяка езикова версия на запис в един отговор: title или name, overview, tagline и homepage за филми и сериали, name и overview за епизоди. Всеки ред носи iso_639_1, iso_3166_1 и english_name. Ползвайте го, за да четете езици, които параметърът language не обслужва, или за да построите верига от резервни езици.

Обновено Отвори като Markdown

Вземане на преводите на филм

GET /3/movie/{movie_id}/translations връща по един ред за всеки език, който има текст за филма. Всеки ред съдържа обект data с преведените полета. Извикването не приема езиков параметър, защото целта е да видите всички езици наведнъж.

Примерът намира руския ред и отпечатва заглавието му и началото на описанието.

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")
}

Параметри

  • movie_idпътзадължителен
    Числов id на филма, например 550.
  • api_keyзаявкаедин от двата
    Вашият ключ. Ползвайте него или заглавката Authorization: Bearer.

Полета на отговора

ПолеТипБележки
idцяло числоId на филма.
translationsмасивПо един ред за всеки език с текст, подредени по езиков код. Филм 550 връща 50 реда.
translations[].iso_3166_1низДържавен код, който върви с езика, като US за en или BR за pt. За езици извън 14-те обслужвани повтаря езиковия код с главни букви.
translations[].iso_639_1низЕзиков код като ru или pt. Уникален в масива.
translations[].nameнизЕзикът, записан на самия език.
translations[].english_nameнизИмето на езика на английски.
translations[].dataобектПреведените полета. Ключовете зависят от ресурса, вижте таблицата по-долу.

Примерен отговор

Показани са два от 50-те реда, а описанията са съкратени.

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
      }
    }
  ]
}

В amodb runtime в ред с превод е винаги 0. Четете продължителността от записа с детайли за филм.

Ендпойнти за преводи и техните ключове в data

Всички пътища имат обща основа https://api.amodb.dev/3. Всеки връща id и масив translations с формата на реда по-горе. Променят се само ключовете вътре в data.

Метод и пътКлючове в data
GET /movie/{movie_id}/translationstitle, overview, homepage, tagline, runtime (винаги 0)
GET /tv/{series_id}/translationsname, overview, homepage, tagline
GET /tv/{series_id}/season/{season_number}/translationsняма, масивът винаги е празен
GET /tv/{series_id}/season/{season_number}/episode/{episode_number}/translationsname, overview

Записите за сериали изброяват приблизително толкова езици, колкото филмите. Редовете за епизоди покриват само обслужваните езици, които имат текст за този епизод, от 2 до 14 в проверените извадки. Третирайте липсващ ключ като празна стойност и игнорирайте ключове, които не познавате. Вижте сериали за родителските записи.

amodb не предлага преводи за личности и колекции. Биографията на личност следва параметъра language на извикването за детайли на личност, а описанието на колекция идва както е записано.

Резервен вариант, когато липсва текст

Едно заглавие може да съществува на 14 езика и пак да има празно описание на езика, който потребителят е избрал. Минете по верига от езици, вземете първата непразна стойност и запомнете от кой език идва.

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');

За сериал подайте 'name' като поле вместо 'title'. Отбелязвайте в интерфейса текст от резервен език, за да разбира потребителят защо украинска страница показва английско резюме.

Translations или параметърът language

НуждаКакво да ползвате
Показване на един език на един потребителlanguage при извикване за детайли
Изброяване на всички езици на заглавие в редакторТози ендпойнт
Четене на език, който language не обслужва, като jaТози ендпойнт, изберете реда по iso_639_1
Проверка кои от 14-те обслужвани езика имат текстТози ендпойнт, сравнете iso_639_1
Построяване на връзки към страници на други езициТози ендпойнт, четете наличните кодове

За таговете, които language приема, вижте езици. Всеки друг таг при извикване за детайли се заменя с английски.

Грешки

HTTPstatus_codeКога
4017Ключът липсва или е грешен.
40236Периодът на плана е изтекъл.
40434Няма сезон или епизод с това id, или id не е число.
40537Ползвали сте метод за запис на път за преводи.
42925Надхвърлили сте лимита на заявки в минута. Изчакайте Retry-After секунди.

Id на филм или сериал, което не съществува, на този път не е грешка: отговаря със 200 и "translations": [], докато пътят за детайли отговаря с 404. Повече на страниците грешки и лимити на заявките.

Практически бележки

  • Едно извикване замества до 14 извиквания за детайли. Ползвайте го, когато ви трябват повече от два езика на едно заглавие.
  • Редовете са подредени по езиков код, което не е ред на приоритет. Избирайте редове по iso_639_1, никога по позиция в масива.
  • Извикванията от тип детайли се кешират на edge за 6 часа, така че клиентски кеш със същата дължина не струва нищо в свежест.
  • Оригиналните заглавия в други писмености, като японска или корейска, винаги са налични в original_title и original_name на записа за детайли.
  • За да добавите преводи към извикване за детайли, подайте append_to_response=translations и четете същия масив от отговора. Работи за филми, сериали и епизоди. Добавеният блок няма id.