9.1 KiB
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 thumbnailsis 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:
mp4is de realistische primaire kandidaatmkvis niet gelijkwaardig aanmp4- als
mkvwordt 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
<img>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- enmkv-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
mkvblijft afhankelijk van werkelijke codec-ondersteuning in de file, ook al helptffmpegveel
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:02of 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 thumbnailsuit staat:- video krijgt gewoon het bestaande file-icoon of een video-icoon
- als
Show thumbnailsaan 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
ffmpegvaak nog wel een thumbnail extraheren - maar dat maakt
mkvnog niet gelijkwaardig qua voorspelbaarheid aanmp4
Aanbevolen v1-positionering:
mkvhooguit best-effortmp4is de primaire en verwachte happy path- als thumbnail-extractie voor
mkvfaalt, 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
ffmpegals expliciete dependency - scopeer eerst op
mp4 - behandel
mkvals best-effort - combineer dit met lazy loading
- overweeg pas daarna een eenvoudige cache
- gebruik
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
ffmpegen een smalle, performance-bewuste scope