Medidores de mood
GET /3/movie/{movie_id}/moods e GET /3/tv/{tv_id}/moods retornam uma source e uma lista results. Cada resultado tem o nome de um mood, como fear ou humor, um avg numa escala de 0 a 10 e os valores por trás dele. Adicione append_to_response=moods a uma chamada de detalhes para juntar os medidores sem uma segunda requisição.
Obter os medidores de mood de um filme
GET / retorna os medidores de mood (clima emocional) de um filme. Um medidor de mood é um nome e uma média numa escala de 0 a 10. A resposta traz o id do filme, um source e um array results. Cada resultado contém name, avg e values.
O exemplo carrega os medidores de The Dark Knight (id 155) e os exibe do mais forte ao mais fraco.
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_idcaminhoobrigatórioId numérico do filme, por exemplo155.api_keyconsultaum dos doisSua chave. Use este parâmetro ou o headerAuthorization: Bearer.
Campos da resposta
| Campo | Tipo | Observações |
|---|---|---|
id | inteiro | Id do filme. |
source | string ou null | measured para dados de espectadores, estimated quando derivado dos gêneros, null quando o título não tem dados. |
results | array | Medidores de mood ordenados por name. Vazio quando nada é conhecido. |
results[].name | string | Palavra curta em minúsculas, como fear. |
results[].avg | número | Média numa escala de 0 a 10. Uma casa decimal em títulos medidos, número inteiro nos estimados. |
results[].values | array de números | Até 24 leituras na mesma escala de 0 a 10. Os títulos medidos vistos têm 6, os estimados têm 5. |
Os nomes vistos hoje são action, fear, humor, pace, profanity, romance, sadness, sex e violence. Nem todo título tem os nove, então exiba os nomes a partir dos dados e não de uma lista fixa.
Exemplo de resposta
{
"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] }
]
}A lista foi cortada para 3 dos 9 resultados.
Títulos medidos e estimados
Fight Club (id 550) ainda não tem dados de espectadores, então seus medidores são derivados dos gêneros. Todo avg é um número inteiro e values tem 5 entradas.
{
"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] }
]
}Verifique source se quiser tratar os medidores estimados de forma diferente dos medidos.
Obter os medidores de mood de uma série
GET / tem o mesmo formato de resposta, com o id da série em id. Para Breaking Bad use 1396.
| Método e caminho | Retorna | Parâmetros |
|---|---|---|
GET / | id, source e results | movie_id |
GET /tv/{tv_id}/moods | id, source e results | tv_id |
append_ | source e results sob moods | Adicionado aos detalhes de filme ou de série de TV |
curl -sf "https://api.amodb.dev/3/tv/1396?append_to_response=moods" -H "Authorization: Bearer $AMODB_KEY"Quando você acrescenta moods a uma chamada de detalhes, a chave moods fica no nível superior do registro, ao lado de title ou name. Ela contém source e results e não tem id próprio. Isso custa uma requisição, enquanto duas chamadas separadas custam duas.
Como ler a escala
O campo avg é uma intensidade de 0 a 10. Um número maior significa que o mood é mais forte no título.
| Faixa | Leitura |
|---|---|
| 0 a 2.9 | O mood é fraco ou ausente. |
| 3 a 5.9 | O mood está presente. |
| 6 a 7.9 | O mood é nítido. |
| 8 a 10 | O mood define o título. |
As faixas são uma sugestão para a sua interface, não um campo da resposta. O array values contém as leituras por trás da média, na mesma escala.
Criar selos e filtros
Os moods servem a três padrões comuns de interface. Escolha valores de corte que combinem com o seu catálogo e ajuste-os.
| Padrão | Regra | Observações |
|---|---|---|
| Selo | Mostre até 3 moods com avg 6 ou mais | Ordene primeiro por avg. |
| Barra de medidor | Defina a largura da barra como avg vezes 10, em porcentagem | A escala vai de 0 a 10. |
| Chip de filtro | Selecione os títulos em que o mood escolhido é 7 ou mais | Busque os medidores por título e filtre localmente. |
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);
}Um array results vazio deve aparecer como nenhum selo, não como um erro.
Erros
O corpo do erro tem success, status_code e status_message, os mesmos campos que o TMDB usa.
| HTTP | status_code | Quando |
|---|---|---|
| 401 | 7 | A chave está ausente ou incorreta. |
| 402 | 36 | O período do plano terminou. |
| 429 | 25 | Acima do seu limite de requisições por minuto. Espere os segundos indicados em Retry-After. |
O endpoint de moods não responde 404 para um id desconhecido. Ele responde 200 com um array results vazio, e source é null ou fica ausente. Quando acrescentado aos detalhes, um id desconhecido gera 404 na chamada de detalhes. A lista completa está em erros, e os limites estão em limites de requisições.
Notas práticas
- Como os demais dados de detalhes, os medidores de mood ficam em cache de borda por 6 horas. Buscá-los com mais frequência retorna o mesmo corpo.
- Uma lista de 20 títulos exige 20 requisições de moods. Se você já chama os detalhes de cada título, acrescente
moodse economize a segunda chamada. - Verifique
sourceantes de comparar títulos. Valores medidos e estimados usam a mesma escala, mas não a mesma precisão. - Se você filtra com frequência, guarde
nameeavgjunto com o id do título no seu próprio banco de dados. Um filtro local vence uma requisição por título. - Combine os medidores com as avaliações para ter uma nota e com as trilhas sonoras para a música do mesmo título.