add support for composer tag

This commit is contained in:
Drew Weymouth
2024-07-19 08:03:10 -07:00
parent 867e2c44b6
commit d4066f0b1c
4 changed files with 103 additions and 70 deletions
+26 -24
View File
@@ -85,30 +85,32 @@ type Genre struct {
} }
type Track struct { type Track struct {
ID string ID string
CoverArtID string CoverArtID string
ParentID string ParentID string
Title string Title string
Duration int Duration int
TrackNumber int TrackNumber int
DiscNumber int DiscNumber int
Genres []string Genres []string
ArtistIDs []string ArtistIDs []string
ArtistNames []string ArtistNames []string
Album string ComposerIDs []string
AlbumID string ComposerNames []string
Year int Album string
Rating int AlbumID string
Favorite bool Year int
Size int64 Rating int
PlayCount int Favorite bool
LastPlayed time.Time Size int64
FilePath string PlayCount int
BitRate int LastPlayed time.Time
ContentType string FilePath string
Comment string BitRate int
BPM int ContentType string
ReplayGain ReplayGainInfo Comment string
BPM int
ReplayGain ReplayGainInfo
} }
type ReplayGainInfo struct { type ReplayGainInfo struct {
@@ -509,31 +509,42 @@ func toTrack(ch *subsonic.Child) *mediaprovider.Track {
genres = []string{ch.Genre} genres = []string{ch.Genre}
} }
var composerIDs []string
var composers []string
for _, ctr := range ch.Contributors {
if strings.EqualFold(ctr.Role, "composer") {
composerIDs = append(composerIDs, ctr.Artist.ID)
composers = append(composers, ctr.Artist.Name)
}
}
return &mediaprovider.Track{ return &mediaprovider.Track{
ID: ch.ID, ID: ch.ID,
CoverArtID: ch.CoverArt, CoverArtID: ch.CoverArt,
ParentID: ch.Parent, ParentID: ch.Parent,
Title: ch.Title, Title: ch.Title,
Duration: ch.Duration, Duration: ch.Duration,
TrackNumber: ch.Track, TrackNumber: ch.Track,
DiscNumber: ch.DiscNumber, DiscNumber: ch.DiscNumber,
Genres: genres, Genres: genres,
ArtistIDs: artistIDs, ArtistIDs: artistIDs,
ArtistNames: artistNames, ArtistNames: artistNames,
Album: ch.Album, ComposerIDs: composerIDs,
AlbumID: ch.AlbumID, ComposerNames: composers,
Year: ch.Year, Album: ch.Album,
Rating: ch.UserRating, AlbumID: ch.AlbumID,
Favorite: !ch.Starred.IsZero(), Year: ch.Year,
PlayCount: int(ch.PlayCount), Rating: ch.UserRating,
LastPlayed: ch.Played, Favorite: !ch.Starred.IsZero(),
FilePath: ch.Path, PlayCount: int(ch.PlayCount),
Size: ch.Size, LastPlayed: ch.Played,
BitRate: ch.BitRate, FilePath: ch.Path,
ContentType: ch.ContentType, Size: ch.Size,
Comment: ch.Comment, BitRate: ch.BitRate,
BPM: ch.BPM, ContentType: ch.ContentType,
ReplayGain: rGain, Comment: ch.Comment,
BPM: ch.BPM,
ReplayGain: rGain,
} }
} }
+19 -7
View File
@@ -38,7 +38,16 @@ func (t *TrackInfoDialog) CreateRenderer() fyne.WidgetRenderer {
addFormRow(c, "Title", t.track.Title) addFormRow(c, "Title", t.track.Title)
c.Add(newFormText("Artist", true)) c.Add(newFormText("Album", true))
album := widget.NewHyperlink(t.track.Album, nil)
album.OnTapped = func() {
if t.OnNavigateToAlbum != nil {
t.OnNavigateToAlbum(t.track.AlbumID)
}
}
c.Add(album)
c.Add(newFormText("Artists", true))
artists := widgets.NewMultiHyperlink() artists := widgets.NewMultiHyperlink()
artists.BuildSegments(t.track.ArtistNames, t.track.ArtistIDs) artists.BuildSegments(t.track.ArtistNames, t.track.ArtistIDs)
artists.OnTapped = func(id string) { artists.OnTapped = func(id string) {
@@ -48,14 +57,17 @@ func (t *TrackInfoDialog) CreateRenderer() fyne.WidgetRenderer {
} }
c.Add(artists) c.Add(artists)
c.Add(newFormText("Album", true)) if len(t.track.ComposerNames) > 0 {
album := widget.NewHyperlink(t.track.Album, nil) c.Add(newFormText("Composers", true))
album.OnTapped = func() { composers := widgets.NewMultiHyperlink()
if t.OnNavigateToAlbum != nil { composers.BuildSegments(t.track.ComposerNames, t.track.ComposerIDs)
t.OnNavigateToAlbum(t.track.AlbumID) artists.OnTapped = func(id string) {
if t.OnNavigateToArtist != nil {
t.OnNavigateToArtist(id)
}
} }
c.Add(composers)
} }
c.Add(album)
if len(t.track.Genres) > 0 { if len(t.track.Genres) > 0 {
c.Add(newFormText("Genres", true)) c.Add(newFormText("Genres", true))
+23 -15
View File
@@ -29,6 +29,7 @@ const (
ColumnArtist = "Artist" ColumnArtist = "Artist"
ColumnTitleArtist = "Title/Artist" ColumnTitleArtist = "Title/Artist"
ColumnAlbum = "Album" ColumnAlbum = "Album"
ColumnComposer = "Composer"
ColumnTime = "Time" ColumnTime = "Time"
ColumnYear = "Year" ColumnYear = "Year"
ColumnFavorite = "Favorite" ColumnFavorite = "Favorite"
@@ -45,6 +46,7 @@ var (
{Name: ColumnNum, Col: ListColumn{Text: "#", Alignment: fyne.TextAlignTrailing, CanToggleVisible: false}}, {Name: ColumnNum, Col: ListColumn{Text: "#", Alignment: fyne.TextAlignTrailing, CanToggleVisible: false}},
{Name: ColumnTitleArtist, Col: ListColumn{Text: "Title / Artist", Alignment: fyne.TextAlignLeading, CanToggleVisible: false}}, {Name: ColumnTitleArtist, Col: ListColumn{Text: "Title / Artist", Alignment: fyne.TextAlignLeading, CanToggleVisible: false}},
{Name: ColumnAlbum, Col: ListColumn{Text: "Album", Alignment: fyne.TextAlignLeading, CanToggleVisible: true}}, {Name: ColumnAlbum, Col: ListColumn{Text: "Album", Alignment: fyne.TextAlignLeading, CanToggleVisible: true}},
{Name: ColumnComposer, Col: ListColumn{Text: "Composer", Alignment: fyne.TextAlignLeading, CanToggleVisible: true}},
{Name: ColumnTime, Col: ListColumn{Text: "Time", Alignment: fyne.TextAlignTrailing, CanToggleVisible: true}}, {Name: ColumnTime, Col: ListColumn{Text: "Time", Alignment: fyne.TextAlignTrailing, CanToggleVisible: true}},
{Name: ColumnYear, Col: ListColumn{Text: "Year", Alignment: fyne.TextAlignTrailing, CanToggleVisible: true}}, {Name: ColumnYear, Col: ListColumn{Text: "Year", Alignment: fyne.TextAlignTrailing, CanToggleVisible: true}},
{Name: ColumnFavorite, Col: ListColumn{Text: " Fav.", Alignment: fyne.TextAlignCenter, CanToggleVisible: true}}, {Name: ColumnFavorite, Col: ListColumn{Text: " Fav.", Alignment: fyne.TextAlignCenter, CanToggleVisible: true}},
@@ -56,14 +58,15 @@ var (
{Name: ColumnPath, Col: ListColumn{Text: "File Path", Alignment: fyne.TextAlignLeading, CanToggleVisible: true}}, {Name: ColumnPath, Col: ListColumn{Text: "File Path", Alignment: fyne.TextAlignLeading, CanToggleVisible: true}},
} }
// #, Title/Artist, Album, Time, Year, Favorite, Rating, Plays, Comment, Bitrate, Size, Path // #, Title/Artist, Album, Composer, Time, Year, Favorite, Rating, Plays, Comment, Bitrate, Size, Path
ExpandedTracklistRowColumnWidths = []float32{40, -1, -1, 60, 60, 55, 100, 65, -1, 75, 75, -1} ExpandedTracklistRowColumnWidths = []float32{40, -1, -1, -1, 60, 60, 55, 100, 65, -1, 75, 75, -1}
CompactTracklistRowColumns = []TracklistColumn{ CompactTracklistRowColumns = []TracklistColumn{
{Name: ColumnNum, Col: ListColumn{Text: "#", Alignment: fyne.TextAlignTrailing, CanToggleVisible: false}}, {Name: ColumnNum, Col: ListColumn{Text: "#", Alignment: fyne.TextAlignTrailing, CanToggleVisible: false}},
{Name: ColumnTitle, Col: ListColumn{Text: "Title", Alignment: fyne.TextAlignLeading, CanToggleVisible: false}}, {Name: ColumnTitle, Col: ListColumn{Text: "Title", Alignment: fyne.TextAlignLeading, CanToggleVisible: false}},
{Name: ColumnArtist, Col: ListColumn{Text: "Artist", Alignment: fyne.TextAlignLeading, CanToggleVisible: true}}, {Name: ColumnArtist, Col: ListColumn{Text: "Artist", Alignment: fyne.TextAlignLeading, CanToggleVisible: true}},
{Name: ColumnAlbum, Col: ListColumn{Text: "Album", Alignment: fyne.TextAlignLeading, CanToggleVisible: true}}, {Name: ColumnAlbum, Col: ListColumn{Text: "Album", Alignment: fyne.TextAlignLeading, CanToggleVisible: true}},
{Name: ColumnComposer, Col: ListColumn{Text: "Composer", Alignment: fyne.TextAlignLeading, CanToggleVisible: true}},
{Name: ColumnTime, Col: ListColumn{Text: "Time", Alignment: fyne.TextAlignTrailing, CanToggleVisible: true}}, {Name: ColumnTime, Col: ListColumn{Text: "Time", Alignment: fyne.TextAlignTrailing, CanToggleVisible: true}},
{Name: ColumnYear, Col: ListColumn{Text: "Year", Alignment: fyne.TextAlignTrailing, CanToggleVisible: true}}, {Name: ColumnYear, Col: ListColumn{Text: "Year", Alignment: fyne.TextAlignTrailing, CanToggleVisible: true}},
{Name: ColumnFavorite, Col: ListColumn{Text: " Fav.", Alignment: fyne.TextAlignCenter, CanToggleVisible: true}}, {Name: ColumnFavorite, Col: ListColumn{Text: " Fav.", Alignment: fyne.TextAlignCenter, CanToggleVisible: true}},
@@ -75,8 +78,8 @@ var (
{Name: ColumnPath, Col: ListColumn{Text: "File Path", Alignment: fyne.TextAlignLeading, CanToggleVisible: true}}, {Name: ColumnPath, Col: ListColumn{Text: "File Path", Alignment: fyne.TextAlignLeading, CanToggleVisible: true}},
} }
// #, Title, Artist, Album, Time, Year, Favorite, Rating, Plays, Comment, Bitrate, Size, Path // #, Title, Artist, Album, Composer, Time, Year, Favorite, Rating, Plays, Comment, Bitrate, Size, Path
CompactTracklistRowColumnWidths = []float32{40, -1, -1, -1, 60, 60, 55, 100, 65, -1, 75, 75, -1} CompactTracklistRowColumnWidths = []float32{40, -1, -1, -1, -1, 60, 60, 55, 100, 65, -1, 75, 75, -1}
) )
type tracklistRowBase struct { type tracklistRowBase struct {
@@ -103,6 +106,7 @@ type tracklistRowBase struct {
name *widget.RichText // for bold support name *widget.RichText // for bold support
artist *MultiHyperlink artist *MultiHyperlink
album *MultiHyperlink // for disabled support, if albumID is "" album *MultiHyperlink // for disabled support, if albumID is ""
composer *MultiHyperlink
dur *widget.Label dur *widget.Label
year *widget.Label year *widget.Label
favorite *fyne.Container favorite *fyne.Container
@@ -165,7 +169,7 @@ func NewExpandedTracklistRow(tracklist *Tracklist, im *backend.ImageManager, pla
v := makeVerticallyCentered // func alias v := makeVerticallyCentered // func alias
container := container.New(tracklist.colLayout, container := container.New(tracklist.colLayout,
v(t.num), titleArtistImg, v(t.album), v(t.dur), v(t.year), v(t.favorite), v(t.rating), v(t.plays), v(t.comment), v(t.bitrate), v(t.size), v(t.path)) v(t.num), titleArtistImg, v(t.album), v(t.composer), v(t.dur), v(t.year), v(t.favorite), v(t.rating), v(t.plays), v(t.comment), v(t.bitrate), v(t.size), v(t.path))
t.Content = container t.Content = container
t.setColVisibility = func(colNum int, vis bool) bool { t.setColVisibility = func(colNum int, vis bool) bool {
c := container.Objects[colNum].(*fyne.Container) c := container.Objects[colNum].(*fyne.Container)
@@ -191,20 +195,21 @@ func NewCompactTracklistRow(tracklist *Tracklist, playingIcon fyne.CanvasObject)
t.playingIcon = playingIcon t.playingIcon = playingIcon
t.Content = container.New(tracklist.colLayout, t.Content = container.New(tracklist.colLayout,
t.num, t.name, t.artist, t.album, t.dur, t.year, t.favorite, t.rating, t.plays, t.comment, t.bitrate, t.size, t.path) t.num, t.name, t.artist, t.album, t.composer, t.dur, t.year, t.favorite, t.rating, t.plays, t.comment, t.bitrate, t.size, t.path)
colHiddenPtrMap := map[int]*bool{ colHiddenPtrMap := map[int]*bool{
2: &t.artist.Hidden, 2: &t.artist.Hidden,
3: &t.album.Hidden, 3: &t.album.Hidden,
4: &t.dur.Hidden, 4: &t.composer.Hidden,
5: &t.year.Hidden, 5: &t.dur.Hidden,
6: &t.favorite.Hidden, 6: &t.year.Hidden,
7: &t.rating.Hidden, 7: &t.favorite.Hidden,
8: &t.plays.Hidden, 8: &t.rating.Hidden,
9: &t.comment.Hidden, 9: &t.plays.Hidden,
10: &t.bitrate.Hidden, 10: &t.comment.Hidden,
11: &t.size.Hidden, 11: &t.bitrate.Hidden,
12: &t.path.Hidden, 12: &t.size.Hidden,
13: &t.path.Hidden,
} }
t.setColVisibility = func(colNum int, vis bool) bool { t.setColVisibility = func(colNum int, vis bool) bool {
ptr, ok := colHiddenPtrMap[colNum] ptr, ok := colHiddenPtrMap[colNum]
@@ -226,6 +231,8 @@ func (t *tracklistRowBase) create(tracklist *Tracklist) {
t.artist.OnTapped = tracklist.onArtistTapped t.artist.OnTapped = tracklist.onArtistTapped
t.album = NewMultiHyperlink() t.album = NewMultiHyperlink()
t.album.OnTapped = func(id string) { tracklist.onAlbumTapped(id) } t.album.OnTapped = func(id string) { tracklist.onAlbumTapped(id) }
t.composer = NewMultiHyperlink()
t.composer.OnTapped = func(id string) { tracklist.onArtistTapped(id) }
t.dur = util.NewTrailingAlignLabel() t.dur = util.NewTrailingAlignLabel()
t.year = util.NewTrailingAlignLabel() t.year = util.NewTrailingAlignLabel()
favorite := NewFavoriteIcon() favorite := NewFavoriteIcon()
@@ -266,6 +273,7 @@ func (t *tracklistRowBase) Update(tm *util.TrackListModel, rowNum int) {
t.name.Segments[0].(*widget.TextSegment).Text = tr.Title t.name.Segments[0].(*widget.TextSegment).Text = tr.Title
t.artist.BuildSegments(tr.ArtistNames, tr.ArtistIDs) t.artist.BuildSegments(tr.ArtistNames, tr.ArtistIDs)
t.album.BuildSegments([]string{tr.Album}, []string{tr.AlbumID}) t.album.BuildSegments([]string{tr.Album}, []string{tr.AlbumID})
t.composer.BuildSegments(tr.ComposerNames, tr.ComposerIDs)
t.dur.Text = util.SecondsToMMSS(float64(tr.Duration)) t.dur.Text = util.SecondsToMMSS(float64(tr.Duration))
t.year.Text = strconv.Itoa(tr.Year) t.year.Text = strconv.Itoa(tr.Year)
t.plays.Text = strconv.Itoa(int(tr.PlayCount)) t.plays.Text = strconv.Itoa(int(tr.PlayCount))