Ścieżki dźwiękowe

GET /3/movie/{movie_id}/soundtracks i GET /3/tv/{tv_id}/soundtracks zwracają album ze ścieżką dźwiękową tytułu w liście results. Każdy album ma źródło, nazwę, wykonawcę, datę wydania, link oraz listę tracks z polami disc, number, title, artist i czas trwania. Dodaj append_to_response=soundtracks, by scalić go ze szczegółami bez dodatkowego żądania.

Zaktualizowano Zobacz jako Markdown

Pobieranie ścieżki dźwiękowej filmu

GET /3/movie/{movie_id}/soundtracks zwraca album ze ścieżką dźwiękową jednego filmu. Odpowiedź niesie id filmu i tablicę results. Każda pozycja to album ze szczegółami i listą tracks.

Przykład pobiera The Dark Knight (ID 155) i wypisuje album oraz po jednym wierszu na utwór.

bashjspyphpgo
curl -sf "https://api.amodb.dev/3/movie/155/soundtracks" \
  -H "Authorization: Bearer $AMODB_KEY"
const res = await fetch('https://api.amodb.dev/3/movie/155/soundtracks', {
  headers: { Authorization: `Bearer ${process.env.AMODB_KEY}` },
});
if (!res.ok) throw new Error(`amodb returned ${res.status}`);
const { results } = await res.json();
if (results.length === 0) console.log('no soundtrack album known');
for (const album of results) {
  console.log(`${album.album} by ${album.artist} (${album.track_count} tracks)`);
  for (const t of album.tracks) {
    console.log(`${t.number}. ${t.title} by ${t.artist}`);
  }
}
import os
import requests

r = requests.get(
    "https://api.amodb.dev/3/movie/155/soundtracks",
    headers={"Authorization": f"Bearer {os.environ['AMODB_KEY']}"},
    timeout=10,
)
r.raise_for_status()
results = r.json()["results"]
if not results:
    print("no soundtrack album known")
for album in results:
    print(f"{album['album']} by {album['artist']} ({album['track_count']} tracks)")
    for t in album["tracks"]:
        print(f"{t['number']}. {t['title']} by {t['artist']}")
<?php
$ch = curl_init('https://api.amodb.dev/3/movie/155/soundtracks');
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");
}
$results = json_decode($body, true)['results'];
if (!$results) {
    echo 'no soundtrack album known', PHP_EOL;
}
foreach ($results as $album) {
    echo $album['album'], ' by ', $album['artist'] ?? 'unknown', ' (', $album['track_count'], ' tracks)', PHP_EOL;
    foreach ($album['tracks'] as $t) {
        echo $t['number'], '. ', $t['title'], ' by ', $t['artist'], PHP_EOL;
    }
}
package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"os"
	"time"
)

type Track struct {
	Disc       int    `json:"disc"`
	Number     int    `json:"number"`
	Title      string `json:"title"`
	Artist     string `json:"artist"`
	DurationMs int    `json:"duration_ms"`
}

type Album struct {
	Source     string  `json:"source"`
	Album      string  `json:"album"`
	Artist     string  `json:"artist"`
	Released   string  `json:"released"`
	URL        string  `json:"url"`
	TrackCount int     `json:"track_count"`
	Tracks     []Track `json:"tracks"`
}

func main() {
	req, _ := http.NewRequest("GET", "https://api.amodb.dev/3/movie/155/soundtracks", 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 body struct {
		Results []Album `json:"results"`
	}
	if err := json.NewDecoder(res.Body).Decode(&body); err != nil {
		panic(err)
	}
	if len(body.Results) == 0 {
		fmt.Println("no soundtrack album known")
	}
	for _, a := range body.Results {
		fmt.Printf("%s by %s (%d tracks)\n", a.Album, a.Artist, a.TrackCount)
		for _, t := range a.Tracks {
			fmt.Printf("%d. %s by %s\n", t.Number, t.Title, t.Artist)
		}
	}
}

Parametry

  • movie_idpathwymagany
    Numeryczne ID filmu, na przykład 155.
  • api_keyqueryjeden z dwóch
    Twój klucz. Użyj go albo nagłówka Authorization: Bearer.

Pola odpowiedzi

PoleTypUwagi
idintegerID filmu. Nieobecne przy użyciu append_to_response.
resultsarrayAlbumy. Puste, gdy nie jest znany żaden album. Dziś zawiera co najwyżej jeden.
results[].sourcestringSkąd pochodzi album: musicbrainz lub deezer.
results[].albumstringTytuł albumu.
results[].artiststring lub nullWykonawca albumu, na przykład Hans Zimmer & James Newton Howard.
results[].releasedstring lub nullData wydania jako YYYY-MM-DD.
results[].urlstring lub nullLink do strony albumu u źródła.
results[].track_countintegerLiczba utworów na albumie.
results[].tracksarrayUtwory w kolejności albumu.
results[].tracks[].discintegerNumer płyty, od 1.
results[].tracks[].numberintegerNumer utworu na płycie.
results[].tracks[].titlestringTytuł utworu.
results[].tracks[].artiststringWykonawca utworu.
results[].tracks[].duration_msintegerDługość w milisekundach.

Klucze, których używasz, czytaj po nazwie i pomijaj pozostałe.

Przykładowa odpowiedź

JSON
{
  "id": 155,
  "results": [
    {
      "source": "musicbrainz",
      "album": "The Dark Knight",
      "artist": "Hans Zimmer & James Newton Howard",
      "released": "2008-07-15",
      "url": "https://musicbrainz.org/release/814b2f7b-c27c-451e-abac-a316d2e6cea9",
      "track_count": 14,
      "tracks": [
        { "disc": 1, "number": 1, "title": "Why So Serious?", "artist": "Hans Zimmer", "duration_ms": 554000 },
        { "disc": 1, "number": 2, "title": "I'm Not a Hero", "artist": "Hans Zimmer", "duration_ms": 395000 },
        { "disc": 1, "number": 3, "title": "Harvey Two-Face", "artist": "James Newton Howard", "duration_ms": 377000 }
      ]
    }
  ]
}

Lista utworów jest przycięta do 3 z 14. Tytuł bez znanego albumu, taki jak Fight Club (ID 550), odpowiada pustą listą:

JSON
{
  "id": 550,
  "results": []
}

Pobieranie ścieżki dźwiękowej serialu

GET /3/tv/{tv_id}/soundtracks zwraca ten sam kształt dla serialu. Przekaż ID serialu, na przykład 1396. Breaking Bad nie ma znanego albumu, więc jego tablica results jest pusta.

Metoda i ścieżkaZwracaParametry
GET /movie/{movie_id}/soundtracksid i resultsmovie_id
GET /tv/{tv_id}/soundtracksid i resultstv_id
append_to_response=soundtracksTe same results pod soundtracksDodawane do szczegółów filmu lub serialu

Aby dostać album podczas ładowania strony filmu, dołącz go do szczegółów:

curl
curl -sf "https://api.amodb.dev/3/movie/155?append_to_response=credits,soundtracks" \
  -H "Authorization: Bearer $AMODB_KEY"

Dołączony blok leży pod kluczem soundtracks rekordu. Zawiera results i nie ma własnego id. Liczy się jako jedno żądanie.

Budowanie listy muzyki z filmu

Posortuj według disc i number, pokaż tytuł i wykonawcę, a blok ukryj, gdy results jest puste. Poniższe funkcje zwracają wiersze zwykłego tekstu, które możesz wstawić do elementu listy.

JavaScript
function clock(ms) {
  const s = Math.round(ms / 1000);
  return `${Math.floor(s / 60)}:${String(s % 60).padStart(2, '0')}`;
}

function musicLines(results) {
  const album = results[0];
  if (!album) return [];
  return [...album.tracks]
    .sort((a, b) => a.disc - b.disc || a.number - b.number)
    .map((t) => `${t.title} by ${t.artist} (${clock(t.duration_ms)})`);
}

Kilka pomysłów na interfejs, które nie wymagają dodatkowych danych:

PomysłJak
Lista numerowanaUżyj number jako numeru na liście, a przy kilku płytach grupuj według disc.
Link do albumuPołącz nazwę albumu z url, gdy nie jest null.
Łączna długośćZsumuj duration_ms po utworach.
Połączenie z nastrojemPokaż listę obok mierników nastroju tego samego tytułu.

Błędy

Każda awaria zwraca success jako false z numerycznym status_code, tak jak TMDB.

HTTPstatus_codeKiedy
4017Brakuje klucza lub jest błędny.
40236Okres planu dobiegł końca.
42925Przekroczono limit żądań na minutę. Poczekaj tyle sekund, ile podaje Retry-After.

Endpoint ścieżek dźwiękowych nie odpowiada 404 dla nieznanego ID. Odpowiada 200 z pustą tablicą results. Przy dołączeniu do szczegółów nieznane ID daje 404 z wywołania szczegółów. Wszystkie kody zobacz w błędy, a nagłówki w limity żądań.

Praktyczne uwagi

  • Jak inne dane szczegółów, ścieżki dźwiękowe są w cache na edge przez 6 godzin. Krótszy cache klienta nic nie daje.
  • Używaj append_to_response=soundtracks na stronie szczegółów, którą i tak ładujesz. Oszczędza żądanie z twoich 20, 40 lub 120 żądań na minutę.
  • Nie wymagaj, by album istniał. Ukryj blok muzyczny, gdy results jest puste.
  • Niektóre albumy pochodzą z MusicBrainz, a inne z Deezer. Film 27205 (Inception) ma album z Deezer. Kształt jest ten sam, więc sprawdzaj source tylko wtedy, gdy go pokazujesz.
  • Nazwy utworów i wykonawców to zwykłe ciągi i mogą zawierać dowolny znak. Zapisuj je jako UTF-8 i escapuj przy wstawianiu do HTML.
  • Zwiastun tego samego tytułu znajdziesz na stronie wideo i zwiastuny.