{"record":{"id":"1294b36ac3b19692","repo":"AlistGo/alist","slug":"no-valid-path-mapping-found","errorCode":null,"errorMessage":"no valid path mapping found","messagePattern":"no valid path mapping found","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"drivers/strm/driver.go","lineNumber":50,"sourceCode":"func (d *Strm) Config() driver.Config {\n\treturn config\n}\n\nfunc (d *Strm) GetAddition() driver.Additional {\n\treturn &d.Addition\n}\n\nfunc (d *Strm) Init(ctx context.Context) error {\n\tif strings.TrimSpace(d.Paths) == \"\" {\n\t\treturn errors.New(\"paths is required\")\n\t}\n\tif d.SaveStrmToLocal && strings.TrimSpace(d.SaveStrmLocalPath) == \"\" {\n\t\treturn errors.New(\"SaveStrmLocalPath is required\")\n\t}\n\n\td.aliases = parseAliases(d.Paths)\n\tif len(d.aliases) == 0 {\n\t\treturn errors.New(\"no valid path mapping found\")\n\t}\n\n\td.autoFlatten = len(d.aliases) == 1\n\td.singleRootKey = \"\"\n\tif d.autoFlatten {\n\t\tfor k := range d.aliases {\n\t\t\td.singleRootKey = k\n\t\t}\n\t}\n\n\td.mediaExtSet = parseExtSet(defaultIfEmpty(d.FilterFileTypes, defaultMediaExt))\n\td.downloadExtSet = parseExtSet(defaultIfEmpty(d.DownloadFileTypes, defaultDownloadExt))\n\td.normalizedPrefix = normalizePrefix(defaultIfEmpty(d.PathPrefix, \"/d\"))\n\td.normalizedMode = normalizeSaveMode(d.SaveLocalMode)\n\n\tif d.Version != 5 {\n\t\td.FilterFileTypes = mergeDefaultExtCSV(d.FilterFileTypes, defaultMediaExt)\n\t\td.DownloadFileTypes = mergeDefaultExtCSV(d.DownloadFileTypes, defaultDownloadExt)","sourceCodeStart":32,"sourceCodeEnd":68,"githubUrl":"https://github.com/AlistGo/alist/blob/843d9dc8149126976b2625911e45a4d3ffd6f2f5/drivers/strm/driver.go#L32-L68","documentation":"After trimming and parsing the paths addition, parseAliases produced zero usable local->alias mappings, so Init rejects the config. This is different from error 265: the field was non-empty, but every entry failed parsing (bad separator, missing alias side, empty local path, or malformed line).","triggerScenarios":"Paths like 'justoneentry' (no ':' separator), '/a::', ':alias' (empty local side), or entries made only of separators/spaces — non-empty input that yields zero mappings.","commonSituations":"Wrong format assumed (user pastes a plain directory list instead of local:alias pairs); Windows paths with drive letters confusing the parser ('C:\\media' split at the first colon); Copy-paste artifacts: trailing separators on every line, smart quotes, or empty lines depending on parser tolerance","solutions":["Check the driver's documented mapping syntax and reformat each entry as localPath:alias","Open drivers/strm/util.go parseAliases to see exactly which shapes are accepted (e.g. how drive-letter colons are handled)","Test with a single minimal mapping first (/tmp/media:Media), confirm Init passes, then add the rest"],"exampleFix":"// before (addition)\n\"paths\": \"/mnt/movies\"\n\n// after\n\"paths\": \"/mnt/movies:Movies","handlingStrategy":"validation","validationCode":"aliases := parseAliases(addition.Paths)\nif len(aliases) == 0 {\n    return fmt.Errorf(\"no valid path mapping found in %q — expected entries like /local/dir:Alias\", addition.Paths)\n}","typeGuard":"func validMappingEntry(entry string) bool {\n    parts := strings.SplitN(entry, \":\", 2)\n    return len(parts) == 2 && strings.TrimSpace(parts[0]) != \"\" && strings.TrimSpace(parts[1]) != \"\"\n}","tryCatchPattern":null,"preventionTips":["Follow the exact local:alias syntax; test one mapping first","Be careful with Windows drive-letter colons — check parseAliases' splitting rule","Dry-run your mapping list through the same parse logic before saving"],"tags":["strm","config","parsing","init"],"backgroundTag":null,"analyzedSha":"843d9dc8149126976b2625911e45a4d3ffd6f2f5","analyzedAt":"2026-08-15T12:14:11.722Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}