diff --git a/db/migration/20230112111457_add_album_paths.go b/db/migration/20230112111457_add_album_paths.go index baebae696..4f32106e4 100644 --- a/db/migration/20230112111457_add_album_paths.go +++ b/db/migration/20230112111457_add_album_paths.go @@ -59,7 +59,7 @@ func upAddAlbumPathsDirs(filePaths string) string { } slices.Sort(dirs) dirs = slices.Compact(dirs) - return strings.Join(dirs, consts.Zwsp) + return strings.Join(dirs, string(filepath.ListSeparator)) } func downAddAlbumPaths(tx *sql.Tx) error { diff --git a/db/migration/20230202143713_change_path_list_separator.go b/db/migration/20230202143713_change_path_list_separator.go new file mode 100644 index 000000000..fc5cf1f7b --- /dev/null +++ b/db/migration/20230202143713_change_path_list_separator.go @@ -0,0 +1,62 @@ +package migrations + +import ( + "database/sql" + "path/filepath" + "strings" + + "github.com/navidrome/navidrome/consts" + "github.com/navidrome/navidrome/log" + "github.com/pressly/goose" + "golang.org/x/exp/slices" +) + +func init() { + goose.AddMigration(upChangePathListSeparator, downChangePathListSeparator) +} + +func upChangePathListSeparator(tx *sql.Tx) error { + //nolint:gosec + rows, err := tx.Query(` + select album_id, group_concat(path, '` + consts.Zwsp + `') from media_file group by album_id + `) + if err != nil { + return err + } + + stmt, err := tx.Prepare("update album set paths = ? where id = ?") + if err != nil { + return err + } + + var id, filePaths string + for rows.Next() { + err = rows.Scan(&id, &filePaths) + if err != nil { + return err + } + + paths := upChangePathListSeparatorDirs(filePaths) + _, err = stmt.Exec(paths, id) + if err != nil { + log.Error("Error updating album's paths", "paths", paths, "id", id, err) + } + } + return rows.Err() +} + +func upChangePathListSeparatorDirs(filePaths string) string { + allPaths := strings.Split(filePaths, consts.Zwsp) + var dirs []string + for _, p := range allPaths { + dir, _ := filepath.Split(p) + dirs = append(dirs, filepath.Clean(dir)) + } + slices.Sort(dirs) + dirs = slices.Compact(dirs) + return strings.Join(dirs, consts.Zwsp) +} + +func downChangePathListSeparator(tx *sql.Tx) error { + return nil +}