From c931ccf6a25d8a0d1f0aa9e837bf6736204b58e1 Mon Sep 17 00:00:00 2001 From: heimoshuiyu Date: Mon, 24 Jun 2024 16:17:45 +0800 Subject: [PATCH 1/2] Use file name for unknown tag title retrieval. When taglib get empty or null title from file/album, use file name or folder name as the tag_title field. It could be confuse to user, but at leaset it is better than tracks/albums can't be search in ID3 mode API. --- scanner/scanner.go | 5 +++-- tags/tagcommon/tagcommmon.go | 17 +++++++++++++++-- tags/taglib/taglib.go | 9 ++++++--- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/scanner/scanner.go b/scanner/scanner.go index 77e87111..287d5714 100644 --- a/scanner/scanner.go +++ b/scanner/scanner.go @@ -463,8 +463,9 @@ func populateTrack(tx *db.DB, album *db.Album, track *db.Track, trags tagcommon. track.Size = size track.AlbumID = album.ID - track.TagTitle = trags.Title() - track.TagTitleUDec = decoded(trags.Title()) + tagTitle := tagcommon.MustTitle(trags) + track.TagTitle = tagTitle + track.TagTitleUDec = decoded(tagTitle) track.TagTrackArtist = tagcommon.MustArtist(trags) track.TagTrackNumber = trags.TrackNumber() track.TagDiscNumber = trags.DiscNumber() diff --git a/tags/tagcommon/tagcommmon.go b/tags/tagcommon/tagcommmon.go index 10da58d1..793af286 100644 --- a/tags/tagcommon/tagcommmon.go +++ b/tags/tagcommon/tagcommmon.go @@ -2,6 +2,7 @@ package tagcommon import ( "errors" + "path" ) var ErrUnsupported = errors.New("filetype unsupported") @@ -33,19 +34,31 @@ type Info interface { Length() int Bitrate() int + + AbsPath() string } const ( - FallbackAlbum = "Unknown Album" FallbackArtist = "Unknown Artist" FallbackGenre = "Unknown Genre" ) +func MustTitle(p Info) string { + if r := p.Title(); r != "" { + return r + } + + // return the file name for title name + return path.Base(p.AbsPath()) +} + func MustAlbum(p Info) string { if r := p.Album(); r != "" { return r } - return FallbackAlbum + + // return the dir name for album name + return path.Base(path.Dir(p.AbsPath())) } func MustArtist(p Info) string { diff --git a/tags/taglib/taglib.go b/tags/taglib/taglib.go index ba2ab827..7b54616a 100644 --- a/tags/taglib/taglib.go +++ b/tags/taglib/taglib.go @@ -28,12 +28,13 @@ func (TagLib) Read(absPath string) (tagcommon.Info, error) { defer f.Close() props := f.ReadAudioProperties() raw := f.ReadTags() - return &info{raw, props}, nil + return &info{raw, props, absPath}, nil } type info struct { - raw map[string][]string - props *audiotags.AudioProperties + raw map[string][]string + props *audiotags.AudioProperties + abspath string } // https://picard-docs.musicbrainz.org/downloads/MusicBrainz_Picard_Tag_Map.html @@ -60,6 +61,8 @@ func (i *info) ReplayGainAlbumPeak() float32 { return flt(first(find(i.raw, "rep func (i *info) Length() int { return i.props.Length } func (i *info) Bitrate() int { return i.props.Bitrate } +func (i *info) AbsPath() string { return i.abspath } + func first[T comparable](is []T) T { var z T for _, i := range is { From a92f96e721c929fa91ce68a5942e1e973552731c Mon Sep 17 00:00:00 2001 From: heimoshuiyu Date: Wed, 25 Sep 2024 15:19:44 +0800 Subject: [PATCH 2/2] fix: mockfs.go AbsPath() --- mockfs/mockfs.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mockfs/mockfs.go b/mockfs/mockfs.go index a109f80c..fa43b123 100644 --- a/mockfs/mockfs.go +++ b/mockfs/mockfs.go @@ -371,6 +371,8 @@ func (i *TagInfo) ReplayGainAlbumPeak() float32 { return 0 } func (i *TagInfo) Length() int { return firstInt(100, i.RawLength) } func (i *TagInfo) Bitrate() int { return firstInt(100, i.RawBitrate) } +func (i *TagInfo) AbsPath() string { return "" } + var _ tagcommon.Reader = (*tagReader)(nil) func firstInt(or int, ints ...int) int {