From c45c3c904110449ba87a22b248a6cd718d810baa Mon Sep 17 00:00:00 2001 From: brian-doherty <76168809+brian-doherty@users.noreply.github.com> Date: Thu, 29 Jun 2023 15:58:15 -0500 Subject: [PATCH] rename podcast and podcast episode filenames to be safe at startup. (#337) Co-authored-by: Brian Doherty --- podcasts/podcasts.go | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/podcasts/podcasts.go b/podcasts/podcasts.go index 3e47b6e..6c5fcae 100644 --- a/podcasts/podcasts.go +++ b/podcasts/podcasts.go @@ -36,6 +36,45 @@ type Podcasts struct { } func New(db *db.DB, base string, tagger tags.Reader) *Podcasts { + // Walk podcast path making filenames safe. Phase 1: Files + err := filepath.WalkDir(base, func(path string, d os.DirEntry, err error) error { + if (path == base) || d.IsDir() { + return nil + } + if err != nil { + return err + } + localBase := d.Name() + dir := filepath.Dir(path) + safeBase := safeFilename(localBase) + if localBase == safeBase { + return nil + } + return os.Rename(strings.Join([]string{dir, localBase}, "/"), strings.Join([]string{dir, safeBase}, "/")) + }) + if err != nil { + log.Fatalf("error making podcast episode filenames safe: %v\n", err) + } + // Phase 2: Directories + err = filepath.WalkDir(base, func(path string, d os.DirEntry, err error) error { + var pathError *os.PathError + if (path == base) || !d.IsDir() || errors.As(err, &pathError) { // Spurious path errors after move + return nil + } + if err != nil { + return err + } + localBase := d.Name() + dir := filepath.Dir(path) + safeBase := safeFilename(localBase) + if localBase == safeBase { + return nil + } + return os.Rename(strings.Join([]string{dir, localBase}, "/"), strings.Join([]string{dir, safeBase}, "/")) + }) + if err != nil { + log.Fatalf("error making podcast directory names safe: %v\n", err) + } return &Podcasts{ db: db, baseDir: base,