Tighten Sort Unsorted matching; consolidate file management tools

Fix Sort Unsorted picking a wrong destination on words that are common
clutter across many categories (a creator's name, generic marketing
filler) by ranking matches on a folder's own deliberate name over
incidental sibling-course words, and downweighting borrowed words that
recur across many categories. Add a folder-picker/create-new/rename UI
to override any proposal.

Turn /unsorted into a general File Management page: move Refresh
Library, Bulk Rename, and Manage Library (hide/rename) here from
Settings, add a Move action to Manage Library using the same picker,
and add Duplicate Courses and Clean Up Stale References tools. Add a
footer link to the page from the dashboard.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-24 10:29:55 -04:00
co-authored by Claude Sonnet 5
parent 4eda493e00
commit 9ff8c70311
5 changed files with 1325 additions and 535 deletions
+43 -10
View File
@@ -88,19 +88,52 @@ silently stay blank instead of erroring.
- Cover art: uses a manually-placed `cover`/`folder`/`thumbnail`/`thumb`/
`poster` image if a course has one, otherwise auto-generates one via
`ffmpeg` from a frame of the course's first video
- Hide courses/folders from the browser without touching anything on disk;
bulk-select to hide or queue several at once
- Bulk rename across course/folder names (find & replace)
- **Sort Unsorted** ([/unsorted](templates/unsorted.html), linked from
Settings): drop new/incoming courses into an `Unsorted` folder at the
library root, then scan proposes a destination for each one by keyword
- **File Management** ([/unsorted](templates/unsorted.html), linked from
Settings and from a footer link on the dashboard): a dedicated page for
everything that touches files on disk, since it needs more room than a
Settings card and warrants review before anything actually changes.
- *Sort Unsorted*: drop new/incoming courses into an `Unsorted` folder at
the library root, then scan proposes a destination for each one by keyword
overlap against the *existing* category tree - read fresh from disk every
scan, so it adapts to whatever folders you actually have rather than any
hardcoded subject list. Three outcomes per item: a confident match to an
existing folder, a suggested new subfolder under a broader category match,
or "needs review" (unchecked by default) when nothing overlaps at all.
Every destination is editable before applying, and nothing on disk moves
until you review and hit Apply.
Every row has a folder-picker dropdown (listing every real category in the
library, plus "+ Create new folder…" to type a brand-new path) so a wrong
or low-confidence guess is one click to correct, and a name field to
rename the course's folder in the same move. Nothing on disk moves until
you review and hit Apply. Matching ignores common noise (e-learning
platform names, release/distribution-group tags, dates) via a stopword
list, and beyond that treats a match against a folder's own deliberate
name as always stronger evidence than a word only borrowed from a
sibling course's title - and among those borrowed words, downweights
ones that recur across many categories (a prolific creator's name, etc.)
so they can't outvote a genuinely specific word just by sharing more of
them.
- *Refresh Library*: manually bypasses the 5-minute filesystem-scan cache,
for when files were added/removed directly on disk.
- *Bulk Rename*: find & replace across every course/folder name in the
library at once, with a per-match preview and the ability to drop
individual matches before applying.
- *Manage Library*: hide courses/folders from the browser without
touching anything on disk (hiding a folder hides everything inside it;
bulk-select elsewhere to hide or queue several at once), rename a
course/folder in place, or **move** one anywhere else in the library via
the same folder-picker/create-new-folder UI Sort Unsorted uses - handy
for correcting a bad auto-sort later or just reorganizing.
- *Duplicate Courses*: scans every course in the library (Unsorted
included) for names that look like the same thing filed twice, using the
same tokenizer as Sort Unsorted so a platform-name or release-tag
difference doesn't hide a real duplicate. Groups by similarity (union of
any two courses over the threshold, transitively) rather than showing
raw pairs; each course in a group gets a one-click Hide.
- *Clean Up Stale References*: finds entries in the hidden-paths list,
Next Up queue, or Recently Viewed history that point at a path no longer
on disk - normally from renaming/moving/deleting a course directly on
the NAS instead of through the app (doing it through the app already
keeps these in sync). Review individually or clear them all at once;
course files themselves are never touched.
**Dashboard**
- Library-wide stats (courses, lessons completed, time watched, time
@@ -138,8 +171,8 @@ silently stay blank instead of erroring.
actual color distance), or a fully custom accent color, corner radius,
and card style
- Font, text size, page width, and spacing density
- Default library path override + manual "Refresh Library" (bypasses the
5-minute filesystem-scan cache)
- Default library path override (Refresh Library and Bulk Rename live on the
File Management page - see above)
**Backup & integrations**
- One-click backup export and restore: settings, hidden-path choices, the