Libraries & scanning
Point SoundChex at the folders your media lives in; it catalogues what it finds, identifies it, and keeps the library organised in conventions every other media tool already reads.
Watch folders
Two ways to set them:
- Admin → Library settings → watch folders — the normal way.
LIBRARY_WATCH_FOLDERSin.env— absolute paths, comma-separated. On Windows, backslashes are fine (D:\Media\Music,D:\Media\Films); the split is on commas, so drive letters are never mistaken for separators.
Scanning
php artisan library:scan
Scans also run on a schedule once php artisan schedule:work is running (see
Background workers), so day-to-day you just
drop files into a watch folder and they appear.
First scan? Start small. A dozen files prove that paths resolve and playback works before you commit a whole collection. This matters double on Windows, where path handling is the most likely thing to differ.
What a scan does — and never does
- Files are identified by their tags and, for music, by acoustic fingerprint (Chromaprint → AcoustID), then enriched from the metadata sources.
- Nothing is moved out of a watch folder until it has been catalogued and identified.
- Originals are never deleted.
How files are organised
The library uses the conventions Plex, Jellyfin and Emby already read, so your files stay legible to anything else you point at them:
| Type | Layout |
|---|---|
| Music | Artist/Album/01 Track.flac |
| Films | Title (Year)/Title (Year).mkv |
| TV | Series/Season 01/Series S01E01.mkv |
| Books | EPUB, PDF and CBZ files, identified by their metadata |
Four media types, one catalogue
Music, films, TV and books share a schema, a search box and a player. Resume points, history and watchlists behave identically for a song, an episode and a chapter. Video gets hardware transcoding, caption tracks and skip markers; books get highlights, private notes and OCR of scanned pages so their text is selectable and searchable.
If a scan misbehaves
| Symptom | Check |
|---|---|
| Scan finds nothing | Watch-folder paths — absolute, comma-separated, readable by the PHP process |
| Files catalogue but won't play | FFmpeg on the PATH (ffmpeg -version) |
| Metadata never fills in | php artisan queue:work isn't running — enrichment is a background job |
| Artwork missing everywhere | php artisan storage:link was skipped |