Skip to content

feat(library): video and image media entries + Library Video tab#23

Merged
danieljtrujillo merged 1 commit into
mainfrom
feat/vj-video-library
Jun 13, 2026
Merged

feat(library): video and image media entries + Library Video tab#23
danieljtrujillo merged 1 commit into
mainfrom
feat/vj-video-library

Conversation

@danieljtrujillo

Copy link
Copy Markdown
Collaborator

Adds first-class video/image support to the disk-backed library, the foundation for the VJ video library (cue persistence + overlays).

Backend:

  • backend/modules/library/media.py: ffprobe/Pillow probing for dimensions, duration, and alpha (overlay-capable detection), plus poster-thumbnail rendering. Degrades gracefully when ffmpeg/ffprobe are absent (import still succeeds, no thumbnail).
  • store: LibraryRecord carries kind/media_url/thumb_url/width/height/ has_alpha; import_media() stores the original untouched, probes it, and renders thumb.jpg. list_entries(kinds=...) filters by kind.
  • router: GET /entries?kind=audio|video|image|media|all (default audio, so the audio library is unchanged), POST /import-media, GET /media/{id} (Range-capable), GET /media/{id}/thumb.
  • 11 new tests (real PIL + ffmpeg fixtures); existing library suite green.

Frontend:

  • LibraryEntry gains kind/mediaUrl/thumbUrl/width/height/hasAlpha.
  • lib/mediaLibrary.ts: typed list/import/delete client for the media endpoints, kept separate from the audio StorageProvider abstraction.
  • LibraryView: a Video sub-tab with a thumbnail grid (poster, duration, Alpha badge), multi-file Import button, drag-out with a stable URL, and remove. Audio tabs are untouched.

Adds first-class video/image support to the disk-backed library, the
foundation for the VJ video library (cue persistence + overlays).

Backend:
- backend/modules/library/media.py: ffprobe/Pillow probing for
  dimensions, duration, and alpha (overlay-capable detection), plus
  poster-thumbnail rendering. Degrades gracefully when ffmpeg/ffprobe
  are absent (import still succeeds, no thumbnail).
- store: LibraryRecord carries kind/media_url/thumb_url/width/height/
  has_alpha; import_media() stores the original untouched, probes it,
  and renders thumb.jpg. list_entries(kinds=...) filters by kind.
- router: GET /entries?kind=audio|video|image|media|all (default audio,
  so the audio library is unchanged), POST /import-media, GET /media/{id}
  (Range-capable), GET /media/{id}/thumb.
- 11 new tests (real PIL + ffmpeg fixtures); existing library suite green.

Frontend:
- LibraryEntry gains kind/mediaUrl/thumbUrl/width/height/hasAlpha.
- lib/mediaLibrary.ts: typed list/import/delete client for the media
  endpoints, kept separate from the audio StorageProvider abstraction.
- LibraryView: a Video sub-tab with a thumbnail grid (poster, duration,
  Alpha badge), multi-file Import button, drag-out with a stable URL,
  and remove. Audio tabs are untouched.
@danieljtrujillo danieljtrujillo merged commit 38561ff into main Jun 13, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant