Document multi-library Jellyfin ingestion

This commit is contained in:
Sleeps
2026-10-06 17:48:20 +01:00
parent 3ac15a9cfb
commit baaa87780d
+49 -9
View File
@@ -167,12 +167,20 @@ On the first run after enabling routing, existing captions are classified. A cap
Jellyfin can now be the source of truth for media identity, metadata and frame sampling.
Configure a server API key and a small test library:
Configure a server API key and the libraries you want Scene Search to manage:
```env
JELLYFIN_URL=http://jellyfin-server:8096
JELLYFIN_API_KEY=replace-me
JELLYFIN_LIBRARY=Scene Search Test
# Preferred for normal use:
JELLYFIN_LIBRARIES=Movies,TV,Home Videos
# Optional exclusions, also honoured by --all-libraries:
JELLYFIN_EXCLUDE_LIBRARIES=Music,Photos
# Legacy single-library setting, still supported when JELLYFIN_LIBRARIES is empty:
JELLYFIN_LIBRARY=
JELLYFIN_TRICKPLAY_WIDTH=320
JELLYFIN_FALLBACK_INTERVAL_SECONDS=10
@@ -193,21 +201,53 @@ python -m scene_search.cli jellyfin-test
python -m scene_search.cli jellyfin-libraries
```
Inspect the test library before doing any GPU work:
Inspect selected libraries before doing any GPU work:
```bash
python -m scene_search.cli jellyfin-items --library "Scene Search Test" --limit 10
python -m scene_search.cli jellyfin-items --library "Movies" --library "TV" --limit 10
```
This prints each Jellyfin item ID, type, tags, path and available Trickplay information.
Index the library:
Or inspect every visible Jellyfin library:
```bash
python -m scene_search.cli jellyfin-index --library "Scene Search Test"
python -m scene_search.cli jellyfin-items --all-libraries --limit 10
```
The indexer prefers Jellyfin's existing Trickplay sheets. It downloads each sheet, splits the sheet into timestamped thumbnails using Jellyfin's Trickplay manifest, embeds those thumbnails with SigLIP and stores the Jellyfin item/media-source identity alongside the canonical vectors.
This prints each Jellyfin item ID, type, tags, path and available Trickplay information. The item query itself is restricted to Movies, Episodes and generic Videos, so non-video libraries normally report zero selected items.
Index the libraries configured in `JELLYFIN_LIBRARIES`:
```bash
python -m scene_search.cli jellyfin-index
```
You can also select several libraries explicitly:
```bash
python -m scene_search.cli jellyfin-index \
--library "Movies" \
--library "TV" \
--library "Home Videos"
```
Or index every library visible to the API key:
```bash
python -m scene_search.cli jellyfin-index --all-libraries
```
Exclude libraries either in `JELLYFIN_EXCLUDE_LIBRARIES` or per command:
```bash
python -m scene_search.cli jellyfin-index \
--all-libraries \
--exclude-library "Music" \
--exclude-library "Photos"
```
`--limit` applies per selected library and is intended for inspection/test runs. Limited runs never prune missing items. On a complete library scan, the indexer reconciles that library against Jellyfin and removes canonical entries/thumbnails for items that no longer exist there.
The indexer processes selected libraries sequentially but keeps one SigLIP model instance loaded across the whole run. It prefers Jellyfin's existing Trickplay sheets, downloads each sheet, splits it into timestamped thumbnails using Jellyfin's Trickplay manifest, embeds those thumbnails with SigLIP and stores the Jellyfin item/media-source/library identity alongside the canonical vectors.
If an item has no Trickplay manifest, the indexer falls back to ffmpeg only when Jellyfin's reported media path is accessible from the indexing machine.