From 8aaba56f0ddc7155629ad7da114a070d8f13df30 Mon Sep 17 00:00:00 2001 From: laker-93 Date: Fri, 27 Dec 2024 20:49:43 +0000 Subject: [PATCH] fix beets address and add is_duplicate field. (#2) * fix beet address * add is_duplicate to sql db. Set if the 'dup' tag of the media file is set. --- db/migrations/20241209172239_duplicate.go | 25 +++++++++++++++++++++++ docker-compose.yml | 2 +- model/criteria/fields.go | 1 + model/mediafile.go | 1 + persistence/mediafile_repository.go | 2 ++ scanner/mapping.go | 1 + scanner/metadata/metadata.go | 1 + server/nativeapi/song.go | 2 +- ui/src/common/SongInfo.jsx | 1 + ui/src/i18n/en.json | 1 + 10 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 db/migrations/20241209172239_duplicate.go diff --git a/db/migrations/20241209172239_duplicate.go b/db/migrations/20241209172239_duplicate.go new file mode 100644 index 000000000..bcdba0495 --- /dev/null +++ b/db/migrations/20241209172239_duplicate.go @@ -0,0 +1,25 @@ +package migrations + +import ( + "context" + "database/sql" + "github.com/pressly/goose/v3" +) + +func init() { + goose.AddMigrationContext(upDuplicate, downDuplicate) +} + +func upDuplicate(ctx context.Context, tx *sql.Tx) error { + _, err := tx.Exec(` +alter table media_file + add is_duplicate bool not null default false; + +`) + return err +} + +func downDuplicate(ctx context.Context, tx *sql.Tx) error { + // This code is executed when the migration is rolled back. + return nil +} diff --git a/docker-compose.yml b/docker-compose.yml index 8faab10b6..c7fd95ea7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.4' services: navidrome: - image: navidrome:latest + image: laker93/neodrome:latest restart: unless-stopped container_name: "${NAME}" user: "501:20" diff --git a/model/criteria/fields.go b/model/criteria/fields.go index 83b0794e5..3d0c6414e 100644 --- a/model/criteria/fields.go +++ b/model/criteria/fields.go @@ -12,6 +12,7 @@ var fieldMap = map[string]*mappedField{ "artist": {field: "media_file.artist"}, "albumartist": {field: "media_file.album_artist"}, "hascoverart": {field: "media_file.has_cover_art"}, + "isduplicate": {field: "media_file.is_duplicate"}, "tracknumber": {field: "media_file.track_number"}, "discnumber": {field: "media_file.disc_number"}, "year": {field: "media_file.year"}, diff --git a/model/mediafile.go b/model/mediafile.go index 36f9bb505..615f76558 100644 --- a/model/mediafile.go +++ b/model/mediafile.go @@ -31,6 +31,7 @@ type MediaFile struct { AlbumArtist string `structs:"album_artist" json:"albumArtist"` AlbumID string `structs:"album_id" json:"albumId"` HasCoverArt bool `structs:"has_cover_art" json:"hasCoverArt"` + IsDuplicate bool `structs:"is_duplicate" json:"isDuplicate"` TrackNumber int `structs:"track_number" json:"trackNumber"` DiscNumber int `structs:"disc_number" json:"discNumber"` DiscSubtitle string `structs:"disc_subtitle" json:"discSubtitle,omitempty"` diff --git a/persistence/mediafile_repository.go b/persistence/mediafile_repository.go index 134b44cbc..5d82606b7 100644 --- a/persistence/mediafile_repository.go +++ b/persistence/mediafile_repository.go @@ -29,6 +29,8 @@ func NewMediaFileRepository(ctx context.Context, db dbx.Builder) *mediaFileRepos "title": fullTextFilter, "starred": booleanFilter, "genre_id": eqFilter, + "is_duplicate": booleanFilter, + "isduplicate": booleanFilter, }) r.setSortMappings(map[string]string{ "title": "order_title", diff --git a/scanner/mapping.go b/scanner/mapping.go index 9db464eb3..be7657c69 100644 --- a/scanner/mapping.go +++ b/scanner/mapping.go @@ -52,6 +52,7 @@ func (s MediaFileMapper) ToMediaFile(md metadata.Tags) model.MediaFile { mf.Suffix = md.Suffix() mf.Size = md.Size() mf.HasCoverArt = md.HasPicture() + mf.IsDuplicate = md.IsDuplicate() mf.SortTitle = md.SortTitle() mf.SortAlbumName = md.SortAlbum() mf.SortArtistName = md.SortArtist() diff --git a/scanner/metadata/metadata.go b/scanner/metadata/metadata.go index 4bcbab0ce..a2814b6af 100644 --- a/scanner/metadata/metadata.go +++ b/scanner/metadata/metadata.go @@ -148,6 +148,7 @@ func (t Tags) DiscSubtitle() string { func (t Tags) CatalogNum() string { return t.getFirstTagValue("catalognumber") } func (t Tags) Bpm() int { return (int)(math.Round(t.getFloat("tbpm", "bpm", "fbpm"))) } func (t Tags) HasPicture() bool { return t.getFirstTagValue("has_picture") != "" } +func (t Tags) IsDuplicate() bool { return t.getFirstTagValue("dup") == "1" } // MusicBrainz Identifiers diff --git a/server/nativeapi/song.go b/server/nativeapi/song.go index ada344660..29465756b 100644 --- a/server/nativeapi/song.go +++ b/server/nativeapi/song.go @@ -210,7 +210,7 @@ func getBeetTrack(ds model.DataStore) http.HandlerFunc { log.Info("mediafile", "mf", mf) // todo set this base from env variable //baseUrl := "http://127.0.0.1:8337" - baseUrl := fmt.Sprintf("http://beets%s:8337", user) + baseUrl := fmt.Sprintf("http://beets:8337") queryEndPoint := "/item/query/" queryStr := fmt.Sprintf("artist:%s/title:%s/user:%s", mf.Artist, mf.Title, user) url := baseUrl + queryEndPoint + queryStr diff --git a/ui/src/common/SongInfo.jsx b/ui/src/common/SongInfo.jsx index 761bc59eb..199812ac8 100644 --- a/ui/src/common/SongInfo.jsx +++ b/ui/src/common/SongInfo.jsx @@ -43,6 +43,7 @@ export const SongInfo = (props) => { r.genres?.map((g) => g.name).join(', ')} /> ), compilation: , + isDuplicate: , bitRate: , channels: , size: , diff --git a/ui/src/i18n/en.json b/ui/src/i18n/en.json index 3bff21d74..18f123128 100644 --- a/ui/src/i18n/en.json +++ b/ui/src/i18n/en.json @@ -13,6 +13,7 @@ "album": "Album", "path": "File path", "genre": "Genre", + "isDuplicate": "Duplicate", "compilation": "Compilation", "year": "Year", "size": "File size",