Tento dokument popisuje REST API implementované v src/api.py pro projekt Streamlet Connector.
Obsah:
- Přehled
- Spuštění serveru
- Základní URL
- Endpoints (popis, parametry, příklady)
- Datové struktury
- Poznámky a omezení
API poskytuje tyto hlavní funkce:
- Prohlížení lokální databáze mediálních souborů
- Vyhledávání a přiřazování metadat z TMDB
- Spuštění skenu složek pro nové mediální soubory
- Servírování lokálních obrázků a videí
- Základní webové UI dostupné na
/ui
API je navrženo jako jednoduché REST rozhraní bez autentizace (lokální použití).
Spuštění aplikace ze základního adresáře projektu (PowerShell):
python run_api.pyPo spuštění budou vypsány URL pro Web UI a API (výchozí: http://localhost:5000).
Veškeré endpointy začínají kořenem serveru, například:
- Web UI:
/uinebo/ - API root:
/api
Poznámka: V dokumentaci jsou uváděny relativní cesty (např. /api/items).
Níže jsou endpointy se souhrnem, parametry a příklady.
- GET /ui
- GET /
Popis: Vrátí jednoduché webové rozhraní (HTML). Šablona se načítá z templates/ui.html, pokud existuje, jinak se vrátí zabudované základní HTML.
- GET /api/items
Popis: Vrátí seznam všech mediálních položek známých databázi. Obsahuje i položky bez metadat.
Response: 200 OK, JSON pole objektů s následujícími poli (přehled):
- internal_id: interní index v paměti
- path: absolutní cesta k souboru
- title: název (souboru nebo extrahovaný)
- display_title: název k zobrazení (z metadat nebo title)
- type: 'movie' nebo 'tv_show' (může být None)
- has_metadata: boolean
- tmdb_id, poster, backdrop, rating, year, overview — pokud jsou metadata dostupná
Příklad (skrácený):
[{
"internal_id": 0,
"path": "C:/media/Film.mp4",
"title": "Film",
"display_title": "Film (2020)",
"type": "movie",
"has_metadata": true,
"tmdb_id": 12345,
"poster": "poster.jpg",
"rating": 7.2
}]- GET /api/search
Parametry (query string):
- query (required): řetězec pro hledání
- type (optional): 'movie' (default) nebo 'tv'
Popis: Vyhledá v TMDB filmy nebo seriály a vrátí až 10 výsledků.
Příklad requestu:
GET /api/search?query=Inception&type=movie
Odpověď: 200 OK, pole objektů s poli tmdb_id, title, year, overview, poster_path, rating.
Chyby:
- 400 pokud chybí
querynebo jetypeneplatný. - 500 při interní chybě (např. problém s TMDB klientem).
- POST /api/assign-metadata
Tělo (JSON):
- internal_id (int) — interní index položky v databázi
- tmdb_id (int) — TMDB ID z výsledků vyhledávání
- type (string) — 'movie' nebo 'tv' / 'tv_show'
Popis: Načte podrobné metadata z TMDB (podle typu), přiřadí je k položce, stáhne lokální obrázky (poster/backdrop), uloží do databáze.
Odpověď: 200 OK při úspěchu: {"success": true, "message": "Metadata assigned successfully"}
Chyby:
- 400 pokud chybí povinné parametry nebo je
typeneplatný. - 404 pokud
internal_idnení platné. - 500 při interní chybě (např. selhání TMDB nebo uložení).
-
GET /api/settings
- Popis: Vrátí aktuální konfiguraci (obsah config.json načtený při startu nebo default hodnoty).
-
POST /api/settings
- Tělo (JSON): možné klíče
- folders_to_scan: pole string (cesty)
- tmdb_api_key: string
- tmdb_language: string
- scan_interval: int (v sekundách)
- Popis: Uloží konfiguraci do
config/config.json, aktualizuje TMDB klienta a scanner. - Odpověď: 200 OK při úspěchu nebo 500 při selhání uložení.
- Tělo (JSON): možné klíče
- POST /api/scan
Popis: Spustí sken složek (konfigurovaných v folders_to_scan). Pokud je TMDB klient nakonfigurován, provede i enrich (okamžité dotazování TMDB během skenu). Odstraní chybějící soubory z databáze a přidá nové položky.
Odpověď: 200 OK s přehledem výsledků (příklad):
{
"success": true,
"total_found": 42,
"new_items": 5,
"removed_items": 2,
"enriched_with_metadata": 18,
"message": "Found 42 items, added 5 new, removed 2 missing"
}Chyby: 500 při interním selhání.
- GET /api/progress
Popis: Vrátí objekt s průběhem skenu. Implementace závisí na ProgressTracker v kódu.
Odpověď: 200 OK s JSONem (struktura výsledku je definována v ProgressTracker.get_progress()).
- POST /api/database/clear
Popis: Smaže celou databázi a všechny lokální obrázky (data/images). Použití riskantní — nevratné.
Odpověď: 200 OK při úspěchu, nebo 500 při selhání.
- GET /api/images/
Popis: Servíruje lokální images uložené ve data/images.
Chyby: 404 pokud obrázek neexistuje.
-
GET /api/movies
- Vrátí pole všech filmů (ty, které mají
type == 'movie'a metadata). - Každý prvek obsahuje:
id(TMDB id),title,poster,rating.
- Vrátí pole všech filmů (ty, které mají
-
GET /api/tv-shows
- Vrátí pole všech TV show (ty, které mají
type == 'tv_show').
- Vrátí pole všech TV show (ty, které mají
-
GET /api/movie/int:tmdb_id
- Vrátí detailní metadata pro film s daným TMDB ID, včetně
local_poster_path,local_backdrop_path,file_path,year, ainternal_id. - 404 pokud není nalezen.
- Vrátí detailní metadata pro film s daným TMDB ID, včetně
-
GET /api/tv-show/int:tmdb_id
- Vrátí detailní metadata pro TV show (včetně seznamu sezon
seasonsainternal_id). - 404 pokud není nalezen.
- Vrátí detailní metadata pro TV show (včetně seznamu sezon
-
GET /api/tv-show/int:tmdb_id/season/int:season_number/episode/int:episode_number
- Vrátí detailní informace o konkrétní epizodě (obdoba TMDB endpointu) a pokud je k dispozici, doplní lokální informace (
local_path,filename,stream_available). - 404 pokud epizoda není nalezena ani v TMDB, ani v lokálních datech.
- Vrátí detailní informace o konkrétní epizodě (obdoba TMDB endpointu) a pokud je k dispozici, doplní lokální informace (
-
GET /api/tv-show/int:tmdb_id/season/int:season_number
- Vrátí seznam epizod pro danou sezónu. Každá epizoda obsahuje pole:
id,name,overview,air_date,episode_number,episode_type,runtime,season_number,show_id,still_path,vote_average- a navíc (pokud je k dispozici lokálně):
local_path,filename,stream_available
- Alias:
/api/tv/<tmdb_id>/season/<season_number>
- Vrátí seznam epizod pro danou sezónu. Každá epizoda obsahuje pole:
-
GET /api/tv-show/int:tmdb_id/season/int:season_number/episode/int:episode_number/stream
- Streamuje lokální soubor epizody, pokud je k dispozici. Alias:
/api/tv/<...>/season/<...>/episode/<...>/stream
- Streamuje lokální soubor epizody, pokud je k dispozici. Alias:
-
GET /api/streams
- Vrátí seznam všech video souborů nalezených v databázi s informacemi:
id(interní index),name,type(přípona),size,title,media_type,tmdb_id.
- Vrátí seznam všech video souborů nalezených v databázi s informacemi:
-
GET /api/stream/int:stream_id
- Vrátí přímo video soubor (posílá soubor přes Flask
send_file) pro streamování nebo stažení. - 404 pokud
stream_idneexistuje nebo soubor chybí.
- Vrátí přímo video soubor (posílá soubor přes Flask
-
GET /api/stream/int:stream_id/info
- Vrátí metadata o souboru bez stažení:
id,path,name,type,size,url(odkaz na/api/stream/<id>).
- Vrátí metadata o souboru bez stažení:
- GET /api/health
- Vrací status aplikace a souhrn počtu položek:
- status: 'ok'
- total_items
- movies
- tv_shows
- Vrací status aplikace a souhrn počtu položek:
Media item (v databázi) — minimální relevantní pole:
- path: string — absolutní cesta k souboru
- title: string — rozumný název (např. název souboru nebo rozparsovaný název)
- type: 'movie' nebo 'tv_show' (volitelné)
- metadata: objekt — kompletní TMDB metadata (pokud přiřazena)
- local_poster_path: string — název lokálního souboru s posterem uloženého v
data/images - local_backdrop_path: string — název lokálního souboru s backdropem
TMDB metadata: struktura odpovídá datům vráceným TMDB API klientem (tmdb_client). Může obsahovat id, title/name, overview, poster_path, backdrop_path, vote_average, release_date/first_air_date atd.
Vyhledání filmů s názvem "Inception":
curl -s "http://localhost:5000/api/search?query=Inception&type=movie"Přiřazení metadat (příklad):
curl -X POST "http://localhost:5000/api/assign-metadata" \
-H "Content-Type: application/json" \
-d '{"internal_id":0, "tmdb_id":27205, "type":"movie"}'Získání seznamu streamů:
curl "http://localhost:5000/api/streams"Stažení nebo stream video souboru s ID 3 (otevře soubor v prohlížeči nebo přehraje v přehrávači):
curl -v "http://localhost:5000/api/stream/3" --output "video.mp4"- 200 — OK (úspěšné odpovědi)
- 400 — špatný požadavek (chybějící parametry nebo nevalidní hodnoty)
- 404 — nenalezeno (položka/databáze/soubor)
- 500 — interní chyba serveru (např. problém s uložením, TMDB, čtením souboru)
V případě 500 endpointy vrací JSON s error polem popisujícím chybu.
- API nemá implementovanou autentizaci — doporučeno omezit přístup (např. běžet za reverzním proxy s autentizací) pokud bude vystaveno do sítě.
- Operace jako
/api/database/clearjsou nevratné — používejte s opatrností. - Cesty k obrázkům vracené v polích jako
posterjsou pouze názvy souborů; k jejich načtení použijte/api/images/<filename>.
- Přidat autentizaci a autorizaci
- Přidat paging / filtrování pro
/api/itemsa/api/streams - Přidat detailní příklady odpovědí pro každou chybu
- Přidat testy integrace pro hlavní endpointy
Soubor: src/api.py — dokumentované endpointy byly zdokumentovány výše.
Pokud chcete, mohu doplnit i auto-generované OpenAPI/Swagger schéma nebo připravit ukázkové Postman kolekce.