Allow users to specify a Tesseract language string (e.g. jpn+jpn_vert)
on a per-extraction basis, overriding the global OCR language setting.
- Add payload column to ai_jobs table (migration) to carry per-call data
- Thread ocrLanguages payload through enqueueJob → processNextJob → extractItemText
- New GET /api/ai-settings/ocr endpoint (requireAuth) returns { ocrMode, ocrLanguages }
- ImageLightbox fetches OCR settings and shows a language input next to the
Extract Text button when mode is hybrid or tesseract (hidden for llm-only)
- MixedView fetches OCR settings and passes them down to EntryTile; kebab
Extract Text on images shows an inline language prompt before dispatching the job
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Poll /api/ai-tagging/fields every 2s after any 202 (queued) response in
ImageLightbox and DoomScrollView so extraction, translation, and description
results appear automatically without a page refresh
- DoomScrollView extract button now turns accent-coloured while a job is
queued instead of flashing red; red is reserved for genuine errors
- Kebab menu "Translate" option is now gated on entry.hasExtractedText
(populated via a batch DB query in the browse API) so it only appears
when there is text to translate
- Tag panel redesigned: toolbar collapses to just the filename when open;
panel header holds hide (›), AI Tagger (✨), and Close (✕) buttons;
sections ordered Description → Text Extraction → Tags; description
state and generate handler moved from TagSelector into ImageLightbox
- VideoPlayerModal receives the same toolbar/panel restructure
- TagSelector gains hideDescription prop so the parent can own description
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Extracted text in the tag panel is now an editable textarea; a Save
button appears when the content is dirty and persists edits to the DB
- Source language input added next to Re-translate button; when filled,
the translation prompt uses "translate from X to Y" for more accurate
results
- New updateExtractedText() helper and PATCH /api/ai-tagging/fields
endpoint to support saving edited text
- translateItemText/translateText accept optional sourceLanguage param
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- move play/pause to clicking the video directly; remove dedicated button
- replace emoji mute icons with flat minimal SVGs
- add view-in-library button in doom scroll that navigates to the file's
directory and opens it in the regular viewer
- add display text overlay button in doom scroll and image lightbox;
shows extracted text (translated by default when available) in a
semi-transparent box at the bottom; toggle between translated/original
- hide tag panel by default in image lightbox and video player modal
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
media_key was a lossy shortening of item_key (libraryId:lastSegment) that
introduced a real collision bug: two TV episodes from different series with
the same filename would share the same media_key and each other's tags.
- DB migration converts existing media_tags rows from short format to full
item_key by joining against media_items; ambiguous/orphaned rows are dropped
- media_tags column renamed media_key → item_key
- Removed itemKeyToMediaKey() from scanner; reconcileAndPrune now passes
item_key directly to reKeyMediaItem
- DB reader functions (tv, movies, games) now expose item_key on returned
entities; frontend components use entity.item_key instead of constructing
the short libraryId:id form
- MixedView now constructs the full mixed_file: item_key format
- Tag API renamed mediaKey param → itemKey throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 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>
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>