Indicatori di mood
GET /3/movie/{movie_id}/moods e GET /3/tv/{tv_id}/moods restituiscono una source e una lista results. Ogni risultato ha il nome di un mood come fear o humor, un avg su una scala da 0 a 10 e i valori che lo compongono. Aggiungi append_to_response=moods a una chiamata di dettagli per unire gli indicatori senza una seconda richiesta.
Ottenere gli indicatori di mood di un film
GET / restituisce gli indicatori di mood di un film. Un indicatore di mood è un nome e una media su una scala da 0 a 10. La risposta contiene l'id del film, una source e un array results. Ogni risultato contiene name, avg e values.
L'esempio carica gli indicatori di The Dark Knight (id 155) e li stampa dal più forte al più debole.
curl -sf "https://api.amodb.dev/3/movie/155/moods" \
-H "Authorization: Bearer $AMODB_KEY"const res = await fetch('https://api.amodb.dev/3/movie/155/moods', {
headers: { Authorization: `Bearer ${process.env.AMODB_KEY}` },
});
if (!res.ok) throw new Error(`amodb returned ${res.status}`);
const { source, results } = await res.json();
console.log('source:', source);
for (const m of [...results].sort((a, b) => b.avg - a.avg)) {
console.log(m.name.padEnd(10), m.avg);
}import os
import requests
r = requests.get(
"https://api.amodb.dev/3/movie/155/moods",
headers={"Authorization": f"Bearer {os.environ['AMODB_KEY']}"},
timeout=10,
)
r.raise_for_status()
data = r.json()
print("source:", data.get("source"))
for m in sorted(data["results"], key=lambda m: m["avg"], reverse=True):
print(f"{m['name']:<10} {m['avg']}")<?php
$ch = curl_init('https://api.amodb.dev/3/movie/155/moods');
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");
}
$data = json_decode($body, true);
echo 'source: ', $data['source'] ?? 'none', PHP_EOL;
$results = $data['results'];
usort($results, fn ($a, $b) => $b['avg'] <=> $a['avg']);
foreach ($results as $m) {
printf("%-10s %.1f\n", $m['name'], $m['avg']);
}package main
import (
"encoding/json"
"fmt"
"net/http"
"os"
"sort"
"time"
)
type Mood struct {
Name string `json:"name"`
Avg float64 `json:"avg"`
Values []float64 `json:"values"`
}
func main() {
req, _ := http.NewRequest("GET", "https://api.amodb.dev/3/movie/155/moods", 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 {
Source string `json:"source"`
Results []Mood `json:"results"`
}
if err := json.NewDecoder(res.Body).Decode(&body); err != nil {
panic(err)
}
fmt.Println("source:", body.Source)
sort.Slice(body.Results, func(i, j int) bool { return body.Results[i].Avg > body.Results[j].Avg })
for _, m := range body.Results {
fmt.Printf("%-10s %.1f\n", m.Name, m.Avg)
}
}Parametri
movie_idpercorsoobbligatorioID numerico del film, per esempio155.api_keyqueryuno dei dueLa tua chiave. Usa questa o l'headerAuthorization: Bearer.
Campi della risposta
| Campo | Tipo | Note |
|---|---|---|
id | intero | ID del film. |
source | stringa o null | measured per dati degli spettatori, estimated quando ricavati dai generi, null quando il titolo non ha dati. |
results | array | Indicatori di mood ordinati per name. Vuoto quando non si sa nulla. |
results[].name | stringa | Breve parola in minuscolo come fear. |
results[].avg | numero | Media su una scala da 0 a 10. Un decimale per i titoli misurati, un numero intero per quelli stimati. |
results[].values | array di numeri | Fino a 24 rilevazioni sulla stessa scala da 0 a 10. I titoli misurati visti ne hanno 6, quelli stimati ne hanno 5. |
I nomi visti oggi sono action, fear, humor, pace, profanity, romance, sadness, sex e violence. Non tutti i titoli hanno tutti e nove, quindi mostra i nomi presi dai dati e non da un elenco fisso.
Risposta di esempio
{
"id": 155,
"source": "measured",
"results": [
{ "name": "action", "avg": 3.9, "values": [3.6, 3.4, 4.2, 4.2, 4.8, 3] },
{ "name": "fear", "avg": 5.2, "values": [3.6, 6, 4.8, 6.4, 6.4, 3.8] },
{ "name": "humor", "avg": 0.9, "values": [2.4, 1.8, 0.4, 0.4, 0, 0.5] }
]
}L'elenco è tagliato a 3 dei 9 risultati.
Titoli misurati e stimati
Fight Club (id 550) non ha ancora dati degli spettatori, quindi i suoi indicatori sono ricavati dai suoi generi. Ogni avg è un numero intero e values ha 5 voci.
{
"id": 550,
"source": "estimated",
"results": [
{ "name": "action", "avg": 4, "values": [3, 4, 5, 4, 3] },
{ "name": "fear", "avg": 7, "values": [6, 7, 8, 7, 6] }
]
}Controlla source se vuoi trattare gli indicatori stimati in modo diverso da quelli misurati.
Ottenere gli indicatori di mood di una serie
GET / ha la stessa struttura di risposta, con l'ID della serie in id. Per Breaking Bad usa 1396.
| Metodo e percorso | Restituisce | Parametri |
|---|---|---|
GET / | id, source e results | movie_id |
GET /tv/{tv_id}/moods | id, source e results | tv_id |
append_ | source e results sotto moods | Aggiunto ai dettagli di un film o di una serie |
curl -sf "https://api.amodb.dev/3/tv/1396?append_to_response=moods" -H "Authorization: Bearer $AMODB_KEY"Quando aggiungi moods a una chiamata di dettagli, la chiave moods sta al livello principale della scheda accanto a title o name. Contiene source e results e non ha un id proprio. Costa una richiesta, mentre due chiamate separate ne costano due.
Come leggere la scala
Il campo avg è un'intensità da 0 a 10. Un numero più alto significa che il mood è più forte nel titolo.
| Intervallo | Lettura |
|---|---|
| da 0 a 2.9 | Il mood è debole o assente. |
| da 3 a 5.9 | Il mood è presente. |
| da 6 a 7.9 | Il mood è evidente. |
| da 8 a 10 | Il mood definisce il titolo. |
Le fasce sono un suggerimento per la tua interfaccia, non un campo della risposta. L'array values contiene le rilevazioni dietro la media, sulla stessa scala.
Costruire badge e filtri
I mood si adattano a tre modelli di interfaccia comuni. Scegli soglie adatte al tuo catalogo e regolale.
| Modello | Regola | Note |
|---|---|---|
| Badge | Mostra fino a 3 mood con avg pari o superiore a 6 | Ordina prima per avg. |
| Barra indicatore | Imposta la larghezza della barra a avg per 10 come percentuale | La scala va da 0 a 10. |
| Chip di filtro | Tieni i titoli in cui il mood scelto è pari o superiore a 7 | Recupera gli indicatori titolo per titolo, poi filtra in locale. |
function topMoods(results, min = 6, limit = 3) {
return results
.filter((m) => m.avg >= min)
.sort((a, b) => b.avg - a.avg)
.slice(0, limit)
.map((m) => m.name);
}
function matchesMood(results, name, min = 7) {
return results.some((m) => m.name === name && m.avg >= min);
}Un array results vuoto va mostrato come assenza di badge, non come un errore.
Errori
Il corpo dell'errore ha success, status_code e status_message, gli stessi campi di TMDB.
| HTTP | status_code | Quando |
|---|---|---|
| 401 | 7 | La chiave manca o è sbagliata. |
| 402 | 36 | Il periodo del piano è terminato. |
| 429 | 25 | Oltre le tue richieste al minuto. Attendi i secondi di Retry-After. |
L'endpoint dei mood non risponde 404 per un ID sconosciuto. Risponde 200 con un array results vuoto, e source è null o manca. Aggiunto ai dettagli, un ID sconosciuto dà un 404 dalla chiamata dei dettagli. L'elenco completo è nella pagina errori, e i limiti sono in limiti di richieste.
Note pratiche
- Come gli altri dati dei dettagli, gli indicatori di mood restano in cache sull'edge per 6 ore. Richiederli più spesso restituisce lo stesso corpo.
- Una lista di 20 titoli richiede 20 richieste di mood. Se già chiami i dettagli per ogni titolo, aggiungi
moodse risparmia la seconda chiamata. - Controlla
sourceprima di confrontare i titoli. Gli indicatori misurati e stimati usano la stessa scala ma non la stessa precisione. - Salva
nameeavginsieme all'ID del titolo nel tuo database se filtri spesso. Un filtro locale vale più di una richiesta per titolo. - Combina gli indicatori con le valutazioni per un punteggio e con le colonne sonore per la musica dello stesso titolo.