# Měřiče nálady

> GET /3/movie/{movie_id}/moods a GET /3/tv/{tv_id}/moods vracejí zdroj a seznam results. Každý výsledek má název nálady, například fear nebo humor, avg na stupnici 0 až 10 a hodnoty, ze kterých vychází. Přidejte append_to_response=moods k volání detailů a měřiče sloučíte bez druhého požadavku.

## Endpoint

`GET /3/movie/{movie_id}/moods`

```bash
curl "https://api.amodb.dev/3/movie/155/moods" \
  -H "Authorization: Bearer $AMODB_KEY"
```

Odpověď:

```json
{
  "id": 155,
  "source": "measured",
  "results": [
    {
      "name": "action",
      "avg": 3.9,
      "values": [
        3.6,
        3.4,
        4.2
      ]
    },
    {
      "name": "fear",
      "avg": 5.2,
      "values": [
        3.6,
        6,
        4.8
      ]
    },
    {
      "name": "humor",
      "avg": 0.9,
      "values": [
        2.4,
        1.8,
        0.4
      ]
    }
  ]
}
```

## Získání měřičů nálady filmu

`GET /3/movie/{movie_id}/moods` vrací měřiče nálady jednoho filmu. Měřič nálady je název a průměr na stupnici 0 až 10. Odpověď nese `id` filmu, `source` a pole `results`. Každý výsledek obsahuje `name`, `avg` a `values`.

Ukázka načte měřiče pro The Dark Knight (ID 155) a vypíše je od nejsilnějšího po nejslabší.

```bash
curl -sf "https://api.amodb.dev/3/movie/155/moods" \
  -H "Authorization: Bearer $AMODB_KEY"
```

```js
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);
}
```

```python
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
<?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']);
}
```

```go
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)
	}
}
```

### Parametry

| Parametr   | Kde   | Povinný       | Popis                                                          |
| ---------- | ----- | ------------- | -------------------------------------------------------------- |
| `movie_id` | path  | ano           | Číselné ID filmu, například `155`.                             |
| `api_key`  | query | jeden ze dvou | Váš klíč. Použijte jej, nebo hlavičku `Authorization: Bearer`. |

### Pole odpovědi

| Pole               | Typ              | Poznámky                                                                                          |
| ------------------ | ---------------- | ------------------------------------------------------------------------------------------------- |
| `id`               | integer          | ID filmu.                                                                                         |
| `source`           | string nebo null | `measured` pro data diváků, `estimated`, když je odvozeno ze žánrů, `null`, když titul nemá data. |
| `results`          | array            | Měřiče nálady seřazené podle `name`. Prázdné, když nic není známo.                                |
| `results[].name`   | string           | Krátké slovo malými písmeny, například `fear`.                                                    |
| `results[].avg`    | number           | Průměr na stupnici 0 až 10. Jedno desetinné místo u změřených titulů, celé číslo u odhadovaných.  |
| `results[].values` | array of numbers | Až 24 odečtů na stejné stupnici 0 až 10. Změřené tituly, které jsme viděli, mají 6, odhadované 5. |

Dnes se vyskytují názvy `action`, `fear`, `humor`, `pace`, `profanity`, `romance`, `sadness`, `sex` a `violence`. Ne každý titul má všech devět, vykreslujte proto názvy z dat, ne z pevného seznamu.

### Příklad odpovědi

```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] }
  ]
}
```

Seznam je zkrácen na 3 z 9 výsledků.

### Změřené a odhadované tituly

Fight Club (ID 550) zatím nemá data diváků, takže jeho měřiče jsou odvozeny ze žánrů. Každé `avg` je celé číslo a `values` má 5 položek.

```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] }
  ]
}
```

Chcete-li s odhadovanými měřiči zacházet jinak než se změřenými, zkontrolujte `source`.

## Získání měřičů nálady seriálu

`GET /3/tv/{tv_id}/moods` má stejný tvar odpovědi s ID seriálu v `id`. Pro Breaking Bad použijte `1396`.

| Metoda a cesta                | Vrací                            | Parametry                                |
| ----------------------------- | -------------------------------- | ---------------------------------------- |
| `GET /movie/{movie_id}/moods` | `id`, `source` a `results`       | `movie_id`                               |
| `GET /tv/{tv_id}/moods`       | `id`, `source` a `results`       | `tv_id`                                  |
| `append_to_response=moods`    | `source` a `results` pod `moods` | Přidává se k detailům filmu nebo seriálu |

```bash
curl -sf "https://api.amodb.dev/3/tv/1396?append_to_response=moods" -H "Authorization: Bearer $AMODB_KEY"
```

Když ke volání detailů přidáte `moods`, klíč `moods` leží na nejvyšší úrovni záznamu vedle `title` nebo `name`. Obsahuje `source` a `results` a nemá vlastní `id`. Stojí to jeden požadavek, zatímco dvě samostatná volání stojí dva.

## Jak číst stupnici

Pole `avg` je intenzita od 0 do 10. Vyšší číslo znamená, že nálada je v titulu silnější.

| Rozsah   | Výklad                      |
| -------- | --------------------------- |
| 0 až 2.9 | Nálada je slabá nebo chybí. |
| 3 až 5.9 | Nálada je přítomná.         |
| 6 až 7.9 | Nálada je zřetelná.         |
| 8 až 10  | Nálada definuje titul.      |

Pásma jsou návrh pro vaše rozhraní, ne pole v odpovědi. Pole `values` obsahuje odečty, ze kterých se průměr počítá, na stejné stupnici.

## Sestavení odznaků a filtrů

Nálady zapadají do tří běžných vzorů rozhraní. Zvolte prahy, které sedí vašemu katalogu, a doladěte je.

| Vzor        | Pravidlo                                            | Poznámky                                                |
| ----------- | --------------------------------------------------- | ------------------------------------------------------- |
| Odznak      | Zobrazte až 3 nálady s `avg` 6 nebo vyšším          | Nejdřív seřaďte podle `avg`.                            |
| Pruh měřiče | Šířku pruhu nastavte na `avg` krát 10 jako procento | Stupnice je 0 až 10.                                    |
| Filtr (čip) | Vyberte tituly, kde je zvolená nálada 7 nebo vyšší  | Načtěte měřiče pro každý titul a pak filtrujte lokálně. |

```js
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);
}
```

Prázdné pole `results` se má vykreslit jako žádné odznaky, ne jako chyba.

## Chyby

Tělo chyby má `success`, `status_code` a `status_message`, tedy stejná pole jako TMDB.

| HTTP | status_code | Kdy                                                                                   |
| ---- | ----------- | ------------------------------------------------------------------------------------- |
| 401  | 7           | Klíč chybí nebo je nesprávný.                                                         |
| 402  | 36          | Platnost tarifu skončila.                                                             |
| 429  | 25          | Překročen počet požadavků za minutu. Počkejte tolik sekund, kolik říká `Retry-After`. |

Endpoint nálad neodpovídá 404 pro neznámé ID. Odpoví 200 s prázdným polem `results` a `source` je `null` nebo chybí. U přidání k detailům je neznámé ID 404 z volání detailů. Úplný seznam je na stránce [chyby](https://amodb.dev/cs/errors/) a limity na stránce [limity požadavků](https://amodb.dev/cs/rate-limits/).

## Praktické poznámky

- Jako ostatní data detailů se měřiče nálady na edge cachují 6 hodin. Častější načítání vrací stejné tělo.
- Seznam 20 titulů potřebuje 20 požadavků na nálady. Pokud už pro každý titul voláte detaily, přidejte `moods` a ušetříte druhé volání.
- Než tituly porovnáte, zkontrolujte `source`. Změřené a odhadované měřiče používají stejnou stupnici, ale ne stejnou přesnost.
- Pokud filtrujete často, ukládejte `name` a `avg` spolu s ID titulu do vlastní databáze. Lokální filtr je lepší než požadavek na titul.
- Měřiče kombinujte s [hodnocením](https://amodb.dev/cs/ratings/) pro skóre a se [soundtracky](https://amodb.dev/cs/soundtracks/) pro hudbu ve stejném titulu.

## Otázky a odpovědi

### Co znamená hodnota nálady?

Pole avg je intenzita na stupnici 0 až 10, u změřených titulů s jedním desetinným místem. Hodnota avg 7 u fear znamená, že titul je děsivý, a 0 znamená, že nálada chybí. Není to procento ani skóre recenze.

### Je seznam názvů nálad pevný?

Nepředpokládejte to. Dnes se vyskytují názvy action, fear, humor, pace, profanity, romance, sadness, sex a violence a titul jich může mít méně než devět. Vykreslujte řetězce názvů, které dostanete, aby se zobrazil i nový.

### Co znamená measured a estimated v source?

Measured znamená, že měřiče pocházejí z dat diváků a mají desetinná místa. Estimated znamená, že jsou odvozeny ze žánrů titulu, takže avg je celé číslo. Titul bez dat má prázdné pole results a source null.

### Jak filtruji seznam titulů podle nálady?

Načtěte měřiče pro každý titul ve svém seznamu, buď přes endpoint nálad, nebo přes append_to_response u detailů, a ponechte tituly, jejichž zvolená nálada překročí váš práh. Filtr běží ve vašem kódu.

### Mají nálady i seriály?

Ano. Použijte GET /3/tv/{tv_id}/moods, například s ID seriálu 1396. Odpověď má stejný tvar jako endpoint pro filmy.

## Související stránky

- [API detailu filmu](https://amodb.dev/cs/movies/): API detailu filmu se stejnými cestami a JSON jako TMDB v3. Načtěte film podle ID, přidejte obsazení, hodnocení a nálady přes append_to_response, 14 jazyků.
- [API detailu seriálu](https://amodb.dev/cs/tv-series/): API detailu seriálu se stejnými cestami a JSON jako TMDB v3. Seriál podle ID se sezónami, sítěmi, věkovým hodnocením a poskytovateli streamování.
- [Hodnocení filmů a seriálů](https://amodb.dev/cs/ratings/): API hodnocení filmů, které vrací skóre z IMDb, Kinopoisk, Metacritic, Rotten Tomatoes a TMDB pro titul jedním voláním, s null u každého neznámého zdroje.
- [Soundtracky](https://amodb.dev/cs/soundtracks/): API soundtracků filmů vrací album soundtracku filmu nebo seriálu se seznamem skladeb. Zavolejte endpoint nebo přidejte append_to_response=soundtracks.
- [Discover API](https://amodb.dev/cs/discover/): Discover API se stejnými filtry jako TMDB v3. Vypisujte filmy a seriály podle žánru, společnosti, klíčového slova, roku, hodnocení, délky a poskytovatele.
- [Rychlý start](https://amodb.dev/cs/quickstart/): První volání amodb: získejte klíč, vyžádejte detail filmu v curl, JavaScriptu, Pythonu, PHP nebo Go a načtěte plakát z img.amodb.dev. Za méně než 2 minuty.

Aktualizováno: 2026-10-18. Source: https://amodb.dev/cs/moods/
