Ga naar hoofdinhoud

Libraries en media-indeling

Een library is een benoemde verzameling van één type (MOVIE, SHOW, MUSIC, BOOK, COMIC of PODCAST). Een directory is een pad op schijf dat aan een library hangt; een library kan meerdere directories beslaan, zelfs over nodes heen. De scanner bepaalt wat een bestand is aan de hand van zijn pad, dus de indeling op schijf doet ertoe.

Libraries en directories configureren

Geïndexeerde properties, uit disk/src/main/resources/disk.properties (als env vars: APP_ISTER_DISK_LIBRARIES_0_NAME enzovoort):

app.ister.disk.libraries[0].name=shows
app.ister.disk.libraries[0].type=SHOW
app.ister.disk.libraries[1].name=books
app.ister.disk.libraries[1].type=BOOK

app.ister.disk.directories[0].name=disk1
app.ister.disk.directories[0].path=/disk1
app.ister.disk.directories[0].library=shows
app.ister.disk.directories[1].name=disk2
app.ister.disk.directories[1].path=/disk2
app.ister.disk.directories[1].library=shows

Directorynamen moeten uniek zijn over het hele cluster — ze benoemen de werkqueues per directory (Multi-node). Schrijf paden zonder slash aan het eind en houd ze stabiel: het pad wordt letterlijk in de database opgeslagen en als stringprefix vergeleken, dus /disk1 later veranderen in /disk1/ telt als een padwijziging. Bij het opstarten wordt deze configuratie asymmetrisch toegepast: het pad van een directory wordt in de database bijgewerkt, maar een library wordt alleen aangemaaktlibraries[n].type wijzigen na de eerste start doet stilletjes niets (verwijder de library en maak hem opnieuw aan). En claimt een andere node de directorynaam al, dan breekt het opstarten af (Multi-node).

Verwachte indeling per type

Dit is de korte versie; hoofdstuk 8 is de volledige naamreferentie (exacte patronen, geaccepteerde extensies, speciale bestanden en veelgemaakte fouten).

SeriesShow Name (year)/Season NN/sNNeNN.mkv:

The Wire (2002)/Season 01/s01e01.mkv

Films — één bestand (of een map) per film, naam eindigend op het jaar:

Heat (1995)/Heat (1995).mkv

MuziekArtist/Album/track:

Miles Davis/Kind of Blue/01 So What.flac

Boeken — één logisch boek per auteur, in twee uitwisselbare vormen die samenkomen in hetzelfde boek: een epub direct onder de auteur, en/of een luisterboekmap met genummerde hoofdstukken:

Terry Pratchett/Guards! Guards!.epub
Terry Pratchett/Guards! Guards!/001_Chapter 1.mp3

Voorlees-epubs (EPUB 3 media-overlay) worden automatisch herkend aan de inhoud van de epub, nooit aan de bestandsnaam.

Comics — serie-eerst: {Series Name (optional year)}/Volume 27.cbz. Ook .pdf en .epub; losse patronen als attackontitan_vol27.pdf, series_issue8.pdf en name#3.cbz worden getolereerd.

In SHOW- en MOVIE-libraries zijn de herkende videocontainers mkv en mp4; ondertitels: .srt naast de video (beeldondertitels in mkv worden geëxtraheerd en met OCR omgezet); lokale artwork: jpg/png; .nfo-bestanden worden gelezen voor metadata-hints. Andere librarytypes hebben hun eigen extensielijsten — zie de naamreferentie.

Podcasts

Een PODCAST-library heeft helemaal geen directory nodig — hij is feed-gebaseerd:

  • Abonneer vanuit de client (of via de GraphQL-mutation subscribePodcast(feedUrl) — alleen voor admins, net als unsubscribePodcast); het zoeken in de client gebruikt de gratis iTunes Search API.
  • Feeds verversen elk uur; de nieuwste afleveringen (standaard 3, auto-download-count) worden automatisch naar de cachemap gedownload, oudere op verzoek wanneer een gebruiker ze afspeelt.
  • Downloads verlopen na 30 dagen (podcast-retention-days), tenzij iemand middenin een aflevering zit.

Scannen en analyseren

De onderhouds-mutations (ook beschikbaar in de beheerschermen van de client):

ActieWanneerKosten
scanLibraries(libraryId?)Er zijn nieuwe bestanden toegevoegd — er is geen filesystem-watcher. Optioneel per bibliotheek.Goedkoop; bekende bestanden worden overgeslagen.
refreshMetadata(MISSING, libraryId?)Backfill: haal metadata/afbeeldingen alleen op waar ze ontbreken (bv. na het toevoegen van een TMDB-key), bereken ontbrekende blur-hashes.Goedkoop en idempotent; altijd veilig.
refreshMetadata(FORCE, libraryId)Eén bibliotheek opnieuw opbouwen: opgeslagen metadata, afbeeldingen en streaminfo wissen en alles opnieuw ophalen (bv. na een verkeerde match, of om nieuwe velden op oude items te vullen).Zwaar: een externe fetch per item, ffprobe per bestand.
refreshMovie/Show/Episode/Person/Album/Track(id)Dezelfde wipe-en-herfetch voor één item (het ⋮-menu op de detailpagina). Er is geen per-item-verversing voor boeken, comics of podcasts.Eén item (een show waaiert uit naar zijn afleveringen).
rebuildSearchIndexDe Typesense-index opnieuw opbouwen in een verse collectie (na het inschakelen van zoeken of het wijzigen van talen).Leest de hele database één keer; zoeken blijft beschikbaar.
refreshPodcastsAlle geabonneerde feeds nu ophalen in plaats van op de uurlijkse verversing te wachten. Niet admin-only.Goedkoop (conditional GET per feed).
downloadPodcastEpisode(episodeId)Eén oudere aflevering op verzoek naar de cache halen. Niet admin-only.Eén download.

Alle zijn asynchroon — ze zetten events in de queue en keren meteen terug; de voortgang is zichtbaar in het activiteitenscherm van de client. Een scan haalt geen metadata opnieuw op voor bestaande items, en een MISSING-verversing raakt items die al compleet zijn niet aan. De details van de pipeline staan in de architectuurdocumentatie.

Verder lezen

  • Multi-node — directories verspreid over meerdere servers
  • Onderhoud — wat er in de loop van de tijd met caches gebeurt