Medidores de mood

GET /3/movie/{movie_id}/moods y GET /3/tv/{tv_id}/moods devuelven un source y una lista results. Cada resultado tiene el nombre de un mood, como fear o humor, un avg en una escala de 0 a 10 y los valores que lo respaldan. Añade append_to_response=moods a una llamada de detalles para unir los medidores sin una segunda solicitud.

Actualizado el Ver en Markdown

Obtener los medidores de mood de una película

GET /3/movie/{movie_id}/moods devuelve los medidores de mood (clima emocional) de una película. Un medidor de mood es un nombre y un promedio en una escala de 0 a 10. La respuesta incluye el id de la película, un source y un array results. Cada resultado contiene name, avg y values.

El ejemplo carga los medidores de The Dark Knight (id 155) y los imprime del más fuerte al más débil.

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

Parámetros

  • movie_idrutaobligatorio
    Id numérico de la película, por ejemplo 155.
  • api_keyconsultauno de los dos
    Tu clave. Usa esta o el encabezado Authorization: Bearer.

Campos de la respuesta

CampoTipoNotas
identeroId de la película.
sourcetexto o nullmeasured para datos de espectadores, estimated cuando se deriva de los géneros, null cuando el título no tiene datos.
resultsarrayMedidores de mood ordenados por name. Vacío cuando no se sabe nada.
results[].nametextoPalabra corta en minúsculas, como fear.
results[].avgnúmeroMedia en una escala de 0 a 10. Un decimal en los títulos medidos, un número entero en los estimados.
results[].valuesarray de númerosHasta 24 lecturas en la misma escala de 0 a 10. Los títulos medidos que hemos visto tienen 6, los estimados tienen 5.

Los nombres vistos hoy son action, fear, humor, pace, profanity, romance, sadness, sex y violence. No todos los títulos tienen los nueve, así que muestra los nombres a partir de los datos y no de una lista fija.

Ejemplo de respuesta

JSON
{
  "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] }
  ]
}

La lista se recorta a 3 de los 9 resultados.

Títulos medidos y estimados

Fight Club (id 550) aún no tiene datos de espectadores, así que sus medidores se derivan de sus géneros. Todos los avg son números enteros y values tiene 5 entradas.

JSON
{
  "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] }
  ]
}

Revisa source si quieres tratar los medidores estimados de forma distinta a los medidos.

Obtener los medidores de mood de una serie

GET /3/tv/{tv_id}/moods tiene la misma forma de respuesta, con el id de la serie en id. Para Breaking Bad usa 1396.

Método y rutaDevuelveParámetros
GET /movie/{movie_id}/moodsid, source y resultsmovie_id
GET /tv/{tv_id}/moodsid, source y resultstv_id
append_to_response=moodssource y results bajo moodsSe añade a los detalles de película o de TV
curl
curl -sf "https://api.amodb.dev/3/tv/1396?append_to_response=moods" -H "Authorization: Bearer $AMODB_KEY"

Cuando añades moods a una llamada de detalles, la clave moods queda en el nivel superior del registro, junto a title o name. Contiene source y results y no tiene un id propio. Cuesta una solicitud, mientras que dos llamadas separadas cuestan dos.

Cómo leer la escala

El campo avg es una intensidad de 0 a 10. Un número más alto significa que el mood es más fuerte en el título.

RangoLectura
0 a 2.9El mood es débil o no aparece.
3 a 5.9El mood está presente.
6 a 7.9El mood es claro.
8 a 10El mood define el título.

Los rangos son una sugerencia para tu interfaz, no un campo de la respuesta. El array values contiene las lecturas detrás del promedio, en la misma escala.

Crear insignias y filtros

Los moods encajan en tres patrones habituales de interfaz. Elige umbrales que se ajusten a tu catálogo y afínalos.

PatrónReglaNotas
InsigniaMuestra hasta 3 moods con avg de 6 o másOrdena primero por avg.
Barra de medidorFija el ancho de la barra en avg por 10 como porcentajeLa escala es de 0 a 10.
Chip de filtroCoincide con los títulos donde el mood elegido es 7 o másObtén los medidores por título y filtra en local.
JavaScript
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 vacío debe mostrarse como ninguna insignia, no como un error.

Errores

El cuerpo del error tiene success, status_code y status_message, los mismos campos que usa TMDB.

HTTPstatus_codeCuándo
4017La clave falta o es incorrecta.
40236El periodo del plan ha terminado.
42925Superaste tus solicitudes por minuto. Espera los segundos de Retry-After.

El endpoint de moods no responde 404 ante un id desconocido. Responde 200 con un array results vacío, y source es null o falta. Si se añade a los detalles, un id desconocido produce un 404 de la llamada de detalles. La lista completa está en errores y los límites en límites de solicitudes.

Notas prácticas

  • Como otros datos de detalles, los medidores de mood se guardan en la caché perimetral durante 6 horas. Pedirlos con más frecuencia devuelve el mismo cuerpo.
  • Una lista de 20 títulos necesita 20 solicitudes de mood. Si ya llamas a los detalles de cada título, añade moods y ahorra la segunda llamada.
  • Revisa source antes de comparar títulos. Los medidores medidos y estimados usan la misma escala, pero no la misma precisión.
  • Guarda name y avg junto con el id del título en tu propia base de datos si filtras a menudo. Un filtro local es mejor que una solicitud por título.
  • Combina los medidores con las puntuaciones para obtener una nota y con las bandas sonoras para la música del mismo título.