Adds a toggle button to show/hide the filter panel in Movies, Games,
Mixed, and TV views. On mobile the layout stacks vertically (filter
above content); on md+ it returns to the side-by-side layout. The
toggle button highlights when filters are active so hidden filters
remain discoverable. Also fixes a layout bug where items-start on the
flex-col container caused MixedView thumbnails to collapse on narrow
screens.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Series grouping: a top-level folder with no .zip but game subfolders is
now treated as a GameSeries. Clicking a series drills into it with a
breadcrumb; a game-count badge distinguishes series cards from game cards.
Series fall back to the first game's cover when no series-level cover exists.
- Cover upload: new POST /api/game-cover endpoint writes cover.jpg or
widecover.jpg directly into the game/series folder (re-encoded via sharp).
A kebab menu on GameDetailModal opens an Edit Images panel showing previews
and upload/replace buttons for both cover and wide cover.
- Multi-zip download: Game.zipFiles replaces zipPath and includes all .zip
files in the folder. A single zip shows the existing download button; multiple
zips render a split button — primary action downloads the first file, a
dropdown arrow lists all files by name.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace the always-visible delete buttons on the movie detail modal and
TV series header with a ⋮ kebab menu. Selecting "Delete" from the menu
shows an inline confirmation banner before any action is taken.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add `movies` type: per-movie folders with video files, poster/backdrop
images, and optional Jellyfin NFO metadata (title, year, plot, rating,
genres, runtime). Grid view with 2:3 poster art, detail modal with play
and two-click delete of the movie folder.
- Add `tv` type: Series -> Season -> Episode hierarchy with lazy loading at
each level. Reads tvshow.nfo and episodedetails NFO files for metadata.
Episode grid with video thumbnails, streams via existing video player.
Delete is limited to the entire series folder to avoid breaking Jellyfin.
- Add fast-xml-parser dependency for Kodi/Jellyfin NFO parsing (lib/nfo.ts)
- Migrate existing DB to expand the libraries CHECK constraint to include
the two new types; migration is idempotent and preserves existing data.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add left sidebar filter panel to MixedView and GamesView with name
search and tag toggles; only shows tags/categories used in the current
library; AND logic when multiple tags are selected
- Add GET /api/tags/library-assignments endpoint returning all tag
assignments for a library keyed by mediaKey
- Add getTagAssignmentsForLibrary() and getTagsSortedByUsage() to tags lib
- Support ?sort=usage on GET /api/tags/items to order by assignment count
- Tag selector: per-category search, top-25-by-usage display, inline add
tag (auto-assigned to current item) and add category flows
- Tag selector: group assigned tags by category into nested pills
- Fix nested <button> hydration error in EntryTile (outer element is now
a div with role="button")
- Keep filter panel assignments in sync when tags are toggled or created
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Assigned tags now render as a single outer pill per category containing
smaller inner tag pills, instead of one pill per tag with a repeated
category prefix.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Introduces user-defined tag categories and tags with a many-to-many
relationship to media items. Tags are stored in a SQLite database
(medialore.db via better-sqlite3) with ON DELETE CASCADE for automatic
cleanup. Users can manage categories and tags at /manage/tags, assign
tags to games in the detail modal, and tag mixed media files via a
hover button on each tile.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>