# Video Thumbnail v1 ## 1. Doel Video thumbnails voegen vooral waarde toe in directories met veel mediabestanden: de gebruiker kan sneller onderscheid maken tussen vergelijkbare videobestanden zonder elk bestand eerst te openen. Binnen de huidige dual-pane workflow moet dit dezelfde ondersteunende rol hebben als image thumbnails: een kleine visuele hint in de bestaande mediaslot links van de naam, niet een aparte mediabrowser. Dit moet passen binnen de huidige lijstweergave: - geen galerij-UI - geen wijziging aan browse- of selectiegedrag - alleen zichtbaar als `Show thumbnails` is ingeschakeld ## 2. Scope Aanbevolen v1-scope: - wel onderzoeken en eventueel ondersteunen: - `mp4` - beperkt / best-effort: - `mkv` - niet in v1: - video thumbnail-generatie zonder duidelijke technische basis - video contact sheets - hover-preview / animated preview - pdf thumbnails - subtitle-preview - generieke media analysis pipeline Belangrijke conclusie voor scope: - `mp4` is de realistische primaire kandidaat - `mkv` is niet gelijkwaardig aan `mp4` - als `mkv` wordt meegenomen, moet dat expliciet best-effort zijn en niet als gegarandeerde happy path worden gepresenteerd ## 3. Technische haalbaarheid ### Zonder extra dependency Echte video thumbnails genereren zonder extra dependency is in de praktijk niet verstandig. Waarom: - een browser kan wel video afspelen, maar de backend heeft voor een lijstthumbnail een afbeeldingsrepresentatie nodig - pure standaardbibliotheek in Python biedt geen bruikbare frame-extractie uit video - alleen het originele videobestand serveren en hopen dat de browser daar in een `` of simpele lijstweergave iets van maakt is geen robuuste aanpak Conclusie zonder dependency: - echte video thumbnails zijn niet netjes haalbaar - zonder extra tool resteert alleen een video-icoon/placeholder ### Met dependency zoals `ffmpeg` `ffmpeg` is de technisch logische kandidaat voor frame-extractie. Voordelen: - breed inzetbaar - kan één frame op een gekozen offset extraheren - werkt voor veel containers/codecs, inclusief veel `mp4`- en `mkv`-varianten - laat read-only thumbnailgeneratie toe zonder transcoding of volledige media pipeline Nadelen: - extra runtime dependency - operationele afhankelijkheid op container/host - frame-extractie is CPU- en I/O-werk - caching- en invalidatievragen worden relevant - `mkv` blijft afhankelijk van werkelijke codec-ondersteuning in de file, ook al helpt `ffmpeg` veel ### Aanbeveling haalbaarheid Eerlijke v1-aanbeveling: - **zonder extra dependency geen echte video thumbnails bouwen** - als video thumbnails echt gewenst zijn, dan is een beperkte `ffmpeg`-afhankelijke v1 de eerste technische route die verdedigbaar is - als het project op dit moment dependency-arm moet blijven, is uitstel verstandiger dan een halfwerkende pseudo-thumbnailoplossing ## 4. Thumbnail-bron Als video thumbnails later wél gebouwd worden, is het eerste frame meestal geen goede keuze: - eerste frames zijn vaak zwart - leader-frames geven weinig informatie Veiligere keuze: - een klein offsetmoment, bijvoorbeeld rond `00:00:02` of een klein percentage in het begin - nog steeds read-only: alleen één frame extraheren, geen analysepipeline Bij grote bestanden en netwerkvolumes betekent dit: - thumbnailgeneratie veroorzaakt extra read-I/O op het videobestand - bij veel bestanden in één directory kan dat snel oplopen - juist daarom is caching of strikte lazy loading relevant zodra echte video thumbnails worden toegevoegd ## 5. UI-gedrag De video thumbnail moet in dezelfde mediaslot komen als image thumbnails: - links van de naam - zelfde vaste slotbreedte - geen verschuiving van de naamkolom Gedrag: - als `Show thumbnails` uit staat: - video krijgt gewoon het bestaande file-icoon of een video-icoon - als `Show thumbnails` aan staat: - ondersteunde video met beschikbare thumbnail: toon thumbnail - als thumbnail niet beschikbaar is of niet ondersteund wordt: toon passend icoon/placeholder Belangrijke UI-eis: - de lijst mag niet instabiel worden - thumbnails zijn een enhancement, geen vereiste voor nette uitlijning ## 6. Settings-relatie Video thumbnails moeten alleen zichtbaar zijn als `Show thumbnails` aan staat. Aanbevolen v1-keuze: - **geen aparte extra setting voor video thumbnails** Reden: - een tweede thumbnailsetting maakt Settings complexer voordat er een bewezen implementatie is - eerst moet duidelijk zijn of video thumbnails technisch en performance-matig verantwoord zijn Als video thumbnails later worden toegevoegd, vallen ze in eerste instantie onder dezelfde globale toggle. ## 7. Performance en caching Belangrijkste risico: - frame-extractie is duidelijk duurder dan het serveren van bestaande image files ### Risico's - grote directories met veel video’s kunnen browse-performance merkbaar verslechteren - thumbnails op netwerkvolumes versterken latency - gelijktijdige extracties kunnen CPU en disk-I/O onnodig belasten ### Lazy loading Lazy loading is verplicht zodra echte video thumbnails bestaan: - alleen thumbnails laden voor zichtbare rijen - beperkte concurrency - geen eager generatie voor volledige directorylisting ### Caching Voor echte video thumbnails is een vorm van caching vrijwel onvermijdelijk zodra de feature meer dan experimenteel moet zijn. Afweging: - zonder cache: te veel herhaalde frame-extractie - met disk-cache: meer complexiteit, maar technisch logisch Aanbevolen v1-richting als `ffmpeg` later wordt toegestaan: - kleine disk-cache of bestandsgebonden cache-key op pad + mtime - maar alleen als de implementatieslice expliciet bereid is deze extra complexiteit te dragen Aanbevolen richting voor nu met laag risico: - geen caching bouwen zolang de dependency- en implementatiekeuze nog niet definitief is - eerst expliciet besluiten of echte video thumbnails de extra complexiteit waard zijn ## 8. Backend-impact Als video thumbnails later worden gebouwd, is een apart read-only endpoint logisch, bijvoorbeeld: - `GET /api/files/video-thumbnail?path=...` Waarom apart endpoint: - scheidt image thumbnails van videothumbnails - maakt eigen foutafhandeling, typevalidatie en caching later eenvoudiger - houdt browse-response klein Bestaande infrastructuur moet leidend blijven: - `path_guard` - whitelist/root containment - bestaande foutmapping voor traversal / invalid root alias / not found / type conflicts waar passend - read-only gedrag: alleen lezen, geen wijziging aan bronbestand ## 9. MKV-realiteit `mkv` is een container, geen garantie voor uniforme technische behandeling. Belangrijke realiteit: - `mkv`-bestanden variëren sterk in codecs en encoding-eigenschappen - browser playback en server-side frame-extractie zijn twee verschillende dingen - zelfs als browserplayback soms lastig is, kan `ffmpeg` vaak nog wel een thumbnail extraheren - maar dat maakt `mkv` nog niet gelijkwaardig qua voorspelbaarheid aan `mp4` Aanbevolen v1-positionering: - `mkv` hooguit best-effort - `mp4` is de primaire en verwachte happy path - als thumbnail-extractie voor `mkv` faalt, toon gewoon het video-icoon/placeholder zonder extra dramatische fout in de lijst ## 10. Regressierisico Belangrijkste regressierisico's: - browse-performance verslechtert merkbaar - thumbnail-latency maakt de lijst onrustig - mediaslot wordt inconsistent tussen image/video/non-image - externe toolchain verhoogt deploy-complexiteit - caching kan nieuwe foutbronnen introduceren Ook belangrijk: - huidige image thumbnail-flow moet niet vervuild raken met video-specifieke uitzonderingen - de lijst moet leesbaar blijven, ook als video thumbnails traag of afwezig zijn ## 11. Teststrategie ### Backend golden tests Als video thumbnails later echt gebouwd worden: - success voor ondersteunde video met thumbnail - not found - traversal blocked - invalid root alias - unsupported/non-video type blocked - nette fallback als thumbnail-extractie niet lukt ### UI smoke/regressietests - mediaslot blijft bestaan - lijst blijft renderen met thumbnails aan/uit - video zonder thumbnail toont icoon/placeholder - image thumbnails blijven werken - selectie/current row/active pane styling blijft intact ### Handmatige validatie - directory met veel video’s blijft bruikbaar - thumbnails verschijnen alleen als setting aan staat - mp4 thumbnail werkt voorspelbaar - mkv faalt netjes terug op placeholder waar nodig - geen merkbare regressie in browse-flow of selectie ## 12. Aanbeveling Aanbevolen v1-richting met laag regressierisico: - **nu nog geen echte video thumbnails implementeren zonder extra dependency** - houd de huidige mediaslot-aanpak aan: - image thumbnails waar al ondersteund - voor video voorlopig een video-icoon/placeholder - als de feature later echt gebouwd moet worden: - gebruik `ffmpeg` als expliciete dependency - scopeer eerst op `mp4` - behandel `mkv` als best-effort - combineer dit met lazy loading - overweeg pas daarna een eenvoudige cache Samengevat: - eerlijke technische conclusie: echte video thumbnails in v1 zonder dependency zijn niet verstandig - veiligste huidige richting: uitstellen of beperken tot ontwerpvoorbereiding - als later toch doorgepakt wordt, dan alleen met expliciete keuze voor `ffmpeg` en een smalle, performance-bewuste scope