When creating or updating Tdarr libraries through /api/v2/cruddb instead
of the UI, several library-settings fields take counter-intuitive shapes
that the UI populates automatically. Setting them wrong causes silent
scan failures or junk-only DB content.
containerFilter — comma-separated string, NOT arrayThis is the field the file scanner actually reads to decide which
extensions to accept. The visible allowedContainers field exists in the
schema but is overwritten by the parent at scan time with
containerFilter.split(","). Setting only allowedContainers has no effect.
| Correct | Wrong | |
|---|---|---|
| Value | "mp4,mkv,avi,mov,flv,webm,ts,m4v,wmv,mpg,mpeg,3gp,m2ts,mxf,divx,vob" |
["mp4","mkv","avi",...] |
| Type | string | array |
foldersToIgnore — comma-separated string, NOT arrayThe parent calls .split(",") on this. If it is an array, the scanner
crashes with TypeError: k.split is not a function and the catch-handler
sets scanButtons: true, which then blocks subsequent scans until cleared.
| Correct | Wrong | |
|---|---|---|
| Value | "" (none) or "/mnt/skip-a,/mnt/skip-b" |
["/mnt/skip-a","/mnt/skip-b"] |
| Type | string | array |
decisionMaker.settingsFlows: true drives the Flows-vs-Classic toggle inuseFlows field is read by somedecisionMaker.settingsFlows is what the Queue Builder honors.flowId: "<id>" must reference an existing entry in FlowsJSONDB.cache: "/temp/cache" local container path used as transcoding cache.priority: 5 default priority slot.schedule array of 168 entries { _id, hour, day, status } for 24x7status: "On".mediaInfoScan: true, exifToolScan: true enable full metadata| Operation | API call |
|---|---|
| Mass-delete files of one library | cruddb mode removeByDB, docID = library id, against FileJSONDB |
| Clear post-crash scan-block | cruddb mode update against LibrarySettingsJSONDB with obj: { "scanButtons": false } |
| Trigger fresh full scan | POST /api/v2/scan-files with data.scanConfig = { dbID, mode: "scanFresh", arrayOrPath: [] } |
Iterating removeOne over a getAll result does NOT fully clear v2.70's
SQLite-backed FileJSONDB. removeByDB is the only mode that purges the
SQL table.
mode values for /api/v2/scan-filesscanFresh — full re-scan (recommended for first-time / config changes)scanFindNew — incremental, only adds new filesscanFolderWatcher — initial chokidar watcher setupThe endpoint returns the literal string OK on accept (not JSON).
Container logs show Prep started then Scanner X launched then
file-discovery progress lines.
If a scan reports Prep started but no FFprobe activity follows and
FileJSONDB stays empty (or fills with no-extension junk-files from scene
release folders), the cause is almost certainly the containerFilter
field. Verify it is a non-empty comma-separated string of extensions
WITHOUT leading dots.
Reverse-engineered from /app/Tdarr_Server/srcug/fileScanners.js and
/app/Tdarr_Server/srcug/commonModules/fileScanner/fileScanner.js in the
ghcr.io/haveagitgat/tdarr v2.70.01 image (build 2026-04-20). The bundled
JS uses an obfuscation lookup with rotation-offset 73 against the embedded
a289a array; tooling under tools/decode-tdarr-lookup.py and
tools/list-tdarr-strings.py resolves index references back to property
names.