Commit Graph

49 Commits

Author SHA1 Message Date
01a4a1c0b7 Merge pull request 'fix search/filter bugs in game and TV libraries' (#12) from search-tweaks into main
All checks were successful
Build and Push Docker Image / build (push) Successful in 52s
Reviewed-on: http://gitea.lan/gpatti/MediaLore/pulls/12
2026-04-06 18:24:30 +00:00
Garret Patti
5d27ba351b fix search/filter bugs in game and TV libraries
- Game series: filter now checks child games for both search and tag matches instead of always passing series through
- TV episodes: tag selector no longer closes after picking a tag
- TV episodes: filter panel now filters episodes within a season view
- TV series list: series now appear when any of their episodes match the active tag filter (via new /api/tv/series-episode-tags endpoint backed by media_items)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 14:23:34 -04:00
957d884903 Merge pull request 'Reduce code duplication and update README' (#11) from cleanup-pass into main
All checks were successful
Build and Push Docker Image / build (push) Successful in 51s
Reviewed-on: http://gitea.lan/gpatti/MediaLore/pulls/11
2026-04-06 16:52:22 +00:00
Garret Patti
6b5ff81654 Reduce code duplication and update README
- Extract shared utilities (HIDDEN_FILES, VIDEO_EXTENSIONS, fileApiUrl,
  thumbnailApiUrl, findFile) into new src/lib/media-utils.ts, removing
  identical copies from games.ts, movies.ts, tv.ts, files.ts, and scanner.ts
- Add comment in files.ts clarifying why its VIDEO_EXTENSIONS set intentionally
  differs from the media library set (web-playable formats for the mixed browser)
- Rewrite README to reflect the current feature set: Movies/TV libraries, auth
  system, tag system, background scanner, updated project structure, folder
  conventions for all four library types, and a complete API reference

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 12:49:24 -04:00
80d922263e Merge pull request 'handle shows without season folders' (#10) from navigation into main
All checks were successful
Build and Push Docker Image / build (push) Successful in 50s
Reviewed-on: http://gitea.lan/gpatti/MediaLore/pulls/10
2026-04-06 02:18:58 +00:00
e46c8d026f Merge branch 'main' into navigation 2026-04-06 02:18:50 +00:00
Garret Patti
87a90a88bc handle shows without season folders 2026-04-05 22:18:08 -04:00
ffaa460324 Merge pull request 'navigation' (#9) from navigation into main
All checks were successful
Build and Push Docker Image / build (push) Successful in 50s
Reviewed-on: http://gitea.lan/gpatti/MediaLore/pulls/9
2026-04-06 01:48:01 +00:00
Garret Patti
0c234b691e add auto mode and controls 2026-04-05 21:47:44 -04:00
Garret Patti
4f54a7c888 add viewer navigation and doom scroll mode
- Add prev/next arrow buttons and ArrowLeft/ArrowRight keyboard shortcuts to ImageLightbox and VideoPlayerModal
- Wire prev/next navigation in MixedView (through filtered media entries), TvView (through season episodes), and MoviesView/MovieDetailModal (through filtered movie list)
- Add new DoomScrollView component: fullscreen random-media mode with scroll/swipe/keyboard navigation, 100-item back-history, and per-library mute settings
- Add Doom Scroll button to mixed, movies, and TV library views
- Doom scroll respects active filters: mixed uses filtered entries, movies uses filtered movie list, TV fetches episodes from matching series only

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-05 21:34:32 -04:00
Garret Patti
334d62e3b3 fix docker auth
All checks were successful
Build and Push Docker Image / build (push) Successful in 1m3s
2026-04-05 19:59:24 -04:00
612e20da8e Merge pull request 'library-scanning' (#8) from library-scanning into main
All checks were successful
Build and Push Docker Image / build (push) Successful in 1m2s
Reviewed-on: http://gitea.lan/gpatti/MediaLore/pulls/8
2026-04-05 23:24:49 +00:00
Garret Patti
6858c1e8cf add tagging to tv 2026-04-05 19:24:28 -04:00
Garret Patti
8829188c58 add scanning 2026-04-05 18:55:53 -04:00
c87a9b33bb Merge pull request 'login-user-settings' (#7) from login-user-settings into main
All checks were successful
Build and Push Docker Image / build (push) Successful in 1m1s
Reviewed-on: http://gitea.lan/gpatti/MediaLore/pulls/7
2026-04-05 22:17:53 +00:00
Garret Patti
5b5503b7a6 add user settings 2026-04-05 18:15:08 -04:00
Garret Patti
eecee9bc5f add auth 2026-04-05 17:44:24 -04:00
f0666c0649 Merge pull request 'viewer-improvements' (#6) from viewer-improvements into main
All checks were successful
Build and Push Docker Image / build (push) Successful in 46s
Reviewed-on: http://gitea.lan/gpatti/MediaLore/pulls/6
2026-04-05 20:32:17 +00:00
Garret Patti
ca4bea084a make FilterPanel hideable and responsive across all library views
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>
2026-04-05 16:29:49 -04:00
Garret Patti
bc77abbd8b scaling tweaks 2026-04-05 16:03:51 -04:00
Garret Patti
427aade21a add tag selector to image and video viewers 2026-04-05 14:01:32 -04:00
2ba887dba6 Merge pull request 'Add Movie and TV Library types.' (#5) from library-types into main
All checks were successful
Build and Push Docker Image / build (push) Successful in 59s
Reviewed-on: http://gitea.lan/gpatti/MediaLore/pulls/5
2026-04-05 16:50:48 +00:00
Garret Patti
122d7aa332 add series grouping, cover upload, and multi-zip download to games library
- 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>
2026-04-05 12:49:42 -04:00
Garret Patti
b254907cca put delete actions behind a kebab menu to prevent accidental deletion
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>
2026-04-05 12:09:05 -04:00
Garret Patti
e8b317f99d add movies and tv show library types with Jellyfin NFO support
- 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>
2026-04-05 11:36:05 -04:00
Garret Patti
b3abc7ee4c fix capitilization
All checks were successful
Build and Push Docker Image / build (push) Successful in 9s
2026-04-05 10:13:42 -04:00
Garret Patti
c3adf11e3e remove gitea references
Some checks failed
Build and Push Docker Image / build (push) Failing after 4s
2026-04-05 10:11:56 -04:00
Garret Patti
948b7390d3 change registry
Some checks failed
Build and Push Docker Image / build (push) Failing after 4s
2026-04-05 10:08:45 -04:00
Garret Patti
7560ad9094 update docker repo
Some checks failed
Build and Push Docker Image / build (push) Failing after 5s
2026-04-05 10:06:58 -04:00
Garret Patti
de8ba04bd3 bring up to date with github 2026-04-05 10:01:34 -04:00
1c3a0fe4ee Merge pull request 'claude/compassionate-feistel' (#4) from claude/compassionate-feistel into main
Some checks failed
Build and Push Docker Image / build (push) Failing after 57s
Reviewed-on: http://gitea.lan/gpatti/MediaLore/pulls/4
2026-03-27 03:57:16 +00:00
4b7ab0d465 Merge branch 'main' into claude/compassionate-feistel 2026-03-27 03:57:02 +00:00
4d9cb537f3 add gitea docker build action 2026-03-26 23:52:18 -04:00
6ea04a5a68 Merge branch 'claude/compassionate-feistel' of http://gitea.lan/gpatti/MediaLore into claude/compassionate-feistel 2026-03-26 23:43:04 -04:00
e525b7faa3 add docker config 2026-03-26 23:41:52 -04:00
372df9c03c Merge pull request 'tagging' (#3) from tagging into main
Reviewed-on: http://gitea.lan/gpatti/MediaLore/pulls/3
2026-03-25 23:53:53 +00:00
3e2662f64c Merge pull request 'claude/compassionate-feistel' (#2) from claude/compassionate-feistel into tagging
Reviewed-on: http://gitea.lan/gpatti/MediaLore/pulls/2
2026-03-25 23:53:28 +00:00
1dcf89816d Merge branch 'tagging' into claude/compassionate-feistel 2026-03-25 23:53:18 +00:00
8f62fa1935 update .gitignore 2026-03-25 19:51:57 -04:00
43436f5cae add library filter panel and tag selector enhancements
- 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>
2026-03-25 19:50:28 -04:00
75fe82f0de group selected tags by category in TagSelector
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>
2026-03-25 18:41:37 -04:00
8ee8e1d2ab Merge pull request 'add tagging system for media items' (#1) from claude/compassionate-feistel into tagging
Reviewed-on: http://gitea.lan/gpatti/MediaLore/pulls/1
2026-03-25 22:18:45 +00:00
4a9849d9b5 add external packages 2026-03-25 17:57:47 -04:00
f788b1a441 add tagging system for media items
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>
2026-03-25 17:29:24 -04:00
bf54b45fa1 add thumbnail generation 2026-03-25 16:59:09 -04:00
90528c4768 add library management 2026-03-25 16:40:01 -04:00
ff3cfe7ec3 add readme 2026-03-25 16:24:14 -04:00
88595bee90 initial version 2026-03-25 16:18:23 -04:00
aeec7cae36 add gitignore 2026-03-25 16:17:59 -04:00