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
+2
View File
@@ -95,6 +95,8 @@ type Track struct {
Genres []string Genres []string
ArtistIDs []string ArtistIDs []string
ArtistNames []string ArtistNames []string
ComposerIDs []string
ComposerNames []string
Album string Album string
AlbumID string AlbumID string
Year int Year int
@@ -509,6 +509,15 @@ 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,
@@ -520,6 +529,8 @@ func toTrack(ch *subsonic.Child) *mediaprovider.Track {
Genres: genres, Genres: genres,
ArtistIDs: artistIDs, ArtistIDs: artistIDs,
ArtistNames: artistNames, ArtistNames: artistNames,
ComposerIDs: composerIDs,
ComposerNames: composers,
Album: ch.Album, Album: ch.Album,
AlbumID: ch.AlbumID, AlbumID: ch.AlbumID,
Year: ch.Year, Year: ch.Year,
+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(album) c.Add(composers)
}
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))