API תרגומים

נקודות הקצה של התרגומים מחזירות כל גרסת שפה של רשומה בתגובה אחת: כותרת או שם, תקציר, סלוגן ואתר בית לסרטים ולסדרות, ושם ותקציר לפרקים. כל שורה נושאת 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נתיבחובה
    מזהה סרט מספרי, למשל 550.
  • api_keyשאילתהאחד משניים
    המפתח שלכם. השתמשו בו או בכותרת Authorization: Bearer.

שדות התגובה

שדהסוגהערות
idintegerמזהה הסרט.
translationsarrayשורה אחת לכל שפה עם טקסט, ממוינת לפי קוד שפה. סרט 550 מחזיר 50 שורות.
translations[].iso_3166_1stringקוד המדינה שמתלווה לשפה, כמו US עבור en או BR עבור pt. בשפות מחוץ ל-14 המוגשות הוא חוזר על קוד השפה באותיות גדולות.
translations[].iso_639_1stringקוד שפה כמו ru או pt. ייחודי במערך.
translations[].namestringהשפה כתובה בשפה עצמה.
translations[].english_namestringשם השפה באנגלית.
translations[].dataobjectהשדות המתורגמים. המפתחות תלויים במשאב, ראו בטבלה למטה.

תגובה לדוגמה

מוצגות שתיים מתוך 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'. סמנו בממשק טקסט משפת גיבוי, כדי שהמשתמש יבין למה עמוד באוקראינית מציג תקציר באנגלית.

תרגומים או הפרמטר language

צורךשימוש
להציג שפה אחת למשתמש אחדlanguage בקריאת הפרטים
לרשום את כל השפות של כותר בעורךנקודת הקצה הזו
לקרוא שפה ש-language לא מגיש, כמו jaנקודת הקצה הזו, בחרו שורה לפי iso_639_1
לבדוק לאילו מ-14 השפות המוגשות יש טקסטנקודת הקצה הזו, השוו iso_639_1
לבנות קישורים בשפות חלופיות לעמודנקודת הקצה הזו, קראו את הקודים הקיימים

את התגיות ש-language מקבל ראו בעמוד שפות. כל תגית אחרת חוזרת לאנגלית בקריאת פרטים.

שגיאות

HTTPstatus_codeמתי
4017המפתח חסר או שגוי.
40236תקופת המסלול הסתיימה.
40434אין עונה או פרק עם המזהה הזה, או מזהה שאינו מספר.
40537השתמשתם בשיטת כתיבה בנתיב תרגומים.
42925עברתם את הבקשות שלכם לדקה. המתינו Retry-After שניות.

מזהה סרט או סדרה שלא קיים אינו שגיאה בנתיב הזה: הוא עונה 200 עם "translations": [], ואילו נתיב הפרטים עונה 404. עוד על שגיאות ומגבלות קצב.

הערות מעשיות

  • קריאה אחת מחליפה עד 14 קריאות פרטים. השתמשו בה כשצריך יותר משתי שפות של אותו כותר.
  • השורות ממוינות לפי קוד שפה, וזה לא סדר עדיפות. בחרו שורות לפי iso_639_1, אף פעם לא לפי מיקום במערך.
  • קריאות מסוג פרטים נשמרות בקצה במטמון 6 שעות, ולכן מטמון לקוח באותו אורך לא עולה כלום בטריות.
  • כותרות מקוריות בכתבים אחרים, כמו יפנית או קוריאנית, זמינות תמיד ב-original_title וב-original_name ברשומת הפרטים.
  • כדי להוסיף תרגומים לקריאת פרטים, העבירו append_to_response=translations וקראו את אותו מערך מהתגובה. זה עובד לסרטים, לסדרות ולפרקים. לבלוק המצורף אין id.