update metadata tags when sorting

This commit is contained in:
2026-04-15 16:03:59 +02:00
parent b4e3f2f372
commit a92b632234
6 changed files with 149 additions and 43 deletions

View File

@@ -8,6 +8,8 @@ import (
"path/filepath"
"regexp"
"strings"
"git.kapelle.org/niklas/ripsort/internal/metadata"
)
func fileSupported(file string) bool {
@@ -19,8 +21,8 @@ func fileSupported(file string) bool {
return supported[strings.ToLower(filepath.Ext(file))]
}
func sortSong(src, dst string) error {
m, err := ReadAudioTags(src)
func sortSong(src, dst string, updateMeta bool) error {
m, err := metadata.ReadAudioTags(src)
if err != nil {
return err
}
@@ -28,10 +30,20 @@ func sortSong(src, dst string) error {
dstPath := pathForFile(src, *m)
finalPath := filepath.Join(dst, dstPath)
slog.Info("Copying song", "file", src, "dst", dstPath)
err = copyFile(src, finalPath)
if err != nil {
return err
if updateMeta {
slog.Info("Copying song with updated metadata", "file", src, "dst", dstPath)
err = copyFileUpdateMetadata(src, finalPath, *m)
if err != nil {
return err
}
} else {
slog.Info("Copying song", "file", src, "dst", dstPath)
err = copyFile(src, finalPath)
if err != nil {
return err
}
}
extraFiles := checkForExtraFiles(src)
@@ -66,7 +78,7 @@ func sanitizeName(name string) *string {
return &name
}
func getArtistName(m metadata) string {
func getArtistName(m metadata.Metadata) string {
var artist *string
if len(m.Artist) > 0 {
@@ -86,7 +98,7 @@ func getArtistName(m metadata) string {
return *artist
}
func getAlbumName(m metadata) string {
func getAlbumName(m metadata.Metadata) string {
album := sanitizeName(m.Album)
if album == nil {
return "Unknown Album"
@@ -94,7 +106,7 @@ func getAlbumName(m metadata) string {
return *album
}
func getTitle(src string, m metadata) string {
func getTitle(src string, m metadata.Metadata) string {
title := sanitizeName(m.Title)
if title == nil {
return *sanitizeName(strings.TrimSuffix(filepath.Base(src), filepath.Ext(src)))
@@ -102,7 +114,7 @@ func getTitle(src string, m metadata) string {
return *title
}
func pathForFile(src string, m metadata) string {
func pathForFile(src string, m metadata.Metadata) string {
ext := strings.ToLower(filepath.Ext(src))
artist := getArtistName(m)
@@ -114,6 +126,22 @@ func pathForFile(src string, m metadata) string {
return filepath.Join(artist, album, filename)
}
func copyFileUpdateMetadata(src, dst string, m metadata.Metadata) error {
ext := strings.ToLower(filepath.Ext(src))
if ext != ".flac" {
slog.Warn("Copying file without updating metadata. Unsupported format", "file", src)
return copyFile(src, dst)
}
dir := filepath.Dir(dst)
if err := os.MkdirAll(dir, 0o755); err != nil {
return fmt.Errorf("create destination directory: %w", err)
}
return metadata.UpdateMetadata(src, dst, m)
}
func copyFile(src, dst string) error {
in, err := os.Open(src)
if err != nil {