diff --git a/backend/mpmedia_mac.go b/backend/mpmedia_mac.go index 3a30c1c..dff1fcc 100644 --- a/backend/mpmedia_mac.go +++ b/backend/mpmedia_mac.go @@ -71,11 +71,12 @@ func InitMPMediaHandler(playbackManager *PlaybackManager, artURLLookup func(trac mp.playbackManager.OnSongChange(func(track mediaprovider.MediaItem, _ *mediaprovider.Track) { // Asynchronously because artwork fetching can take time - var meta mediaprovider.MediaItemMetadata - if track == nil { - meta = track.Metadata() + var meta *mediaprovider.MediaItemMetadata + if track != nil { + m := track.Metadata() + meta = &m } - go mp.updateMetadata(&meta) + go mp.updateMetadata(meta) }) mp.playbackManager.OnStopped(func() { @@ -106,7 +107,9 @@ func (mp *MPMediaHandler) updateMetadata(meta *mediaprovider.MediaItemMetadata) title = meta.Name var err error if artURL, err = mp.artURLLookup(meta.CoverArtID); err != nil { - log.Printf("error fetching art url: %s", err.Error()) + if meta.CoverArtID != "" { + log.Printf("error fetching art url: %s", err.Error()) + } } artist = strings.Join(meta.Artists, ", ") duration = meta.Duration diff --git a/backend/mpris.go b/backend/mpris.go index 2801e56..440747c 100644 --- a/backend/mpris.go +++ b/backend/mpris.go @@ -251,32 +251,48 @@ func (m *MPRISHandler) Metadata() (types.Metadata, error) { trackObjPath = m.curTrackPath } status := m.pm.PlayerStatus() - var tr mediaprovider.Track + + var meta mediaprovider.MediaItemMetadata + // metadata that can come only from tracks + var discNumber, trackNumber, userRating, playCount, year int + var genre string + if np := m.pm.NowPlaying(); np != nil && status.State != player.Stopped { + meta = np.Metadata() if track, ok := np.(*mediaprovider.Track); ok { - tr = *track + discNumber = track.DiscNumber + trackNumber = track.TrackNumber + userRating = track.Rating + playCount = track.PlayCount + year = track.Year + genre = track.Genre } } var artURL string - if tr.ID != "" && m.ArtURLLookup != nil { - if u, err := m.ArtURLLookup(tr.CoverArtID); err == nil { + if meta.ID != "" && m.ArtURLLookup != nil { + if u, err := m.ArtURLLookup(meta.CoverArtID); err == nil { artURL = u } } - return types.Metadata{ - TrackId: dbus.ObjectPath(trackObjPath), - Length: secondsToMicroseconds(status.Duration), - Title: tr.Title, - Album: tr.Album, - Artist: tr.ArtistNames, - DiscNumber: tr.DiscNumber, - TrackNumber: tr.TrackNumber, - Genre: []string{tr.Genre}, - UserRating: float64(tr.Rating) / 5, - ContentCreated: strconv.Itoa(tr.Year), - UseCount: tr.PlayCount, - ArtUrl: artURL, - }, nil + mprisMeta := types.Metadata{ + TrackId: dbus.ObjectPath(trackObjPath), + Length: secondsToMicroseconds(status.Duration), + Title: meta.Name, + Album: meta.Album, + Artist: meta.Artists, + DiscNumber: discNumber, + TrackNumber: trackNumber, + UserRating: float64(userRating) / 5, + UseCount: playCount, + ArtUrl: artURL, + } + if genre != "" { + mprisMeta.Genre = []string{genre} + } + if year != 0 { + mprisMeta.ContentCreated = strconv.Itoa(year) + } + return mprisMeta, nil } func (m *MPRISHandler) Volume() (float64, error) { diff --git a/backend/playbackengine.go b/backend/playbackengine.go index 46db90c..f2e2526 100644 --- a/backend/playbackengine.go +++ b/backend/playbackengine.go @@ -44,7 +44,7 @@ type playbackEngine struct { player player.BasePlayer playTimeStopwatch util.Stopwatch - curTrackTime float64 + curTrackDuration float64 latestTrackPosition float64 // cleared by checkScrobble callbacksDisabled bool @@ -400,10 +400,7 @@ func (p *playbackEngine) handleOnTrackChange() { } } p.wasStopped = false - p.curTrackTime = 0 - if tr, ok := p.playQueue[p.nowPlayingIdx].(*mediaprovider.Track); ok { - p.curTrackTime = float64(tr.Duration) - } + p.curTrackDuration = float64(p.playQueue[p.nowPlayingIdx].Metadata().Duration) p.sendNowPlayingScrobble() // Must come before invokeOnChangeCallbacks b/c track may immediately be scrobbled p.invokeOnSongChangeCallbacks() p.doUpdateTimePos(false) @@ -512,10 +509,10 @@ func (p *playbackEngine) checkScrobble() { } playDur := p.playTimeStopwatch.Elapsed() - if playDur.Seconds() < 0.1 || p.curTrackTime < 0.1 { + if playDur.Seconds() < 0.1 || p.curTrackDuration < 0.1 { return } - pcnt := playDur.Seconds() / p.curTrackTime * 100 + pcnt := playDur.Seconds() / p.curTrackDuration * 100 timeThresholdMet := p.scrobbleCfg.ThresholdTimeSeconds >= 0 && playDur.Seconds() >= float64(p.scrobbleCfg.ThresholdTimeSeconds) diff --git a/backend/playbackmanager.go b/backend/playbackmanager.go index 4471c8e..6c8e175 100644 --- a/backend/playbackmanager.go +++ b/backend/playbackmanager.go @@ -281,7 +281,7 @@ func (p *PlaybackManager) SeekFraction(fraction float64) error { } else if fraction > 1 { fraction = 1 } - target := p.engine.curTrackTime * fraction + target := p.engine.curTrackDuration * fraction return p.engine.SeekSeconds(target) } diff --git a/backend/savedplayqueue.go b/backend/savedplayqueue.go index ad664b9..62a944f 100644 --- a/backend/savedplayqueue.go +++ b/backend/savedplayqueue.go @@ -32,7 +32,7 @@ func SavePlayQueue(serverID string, pm *PlaybackManager, filepath string, server trackIDs := make([]string, 0, len(queue)) for _, item := range queue { if _, ok := item.(*mediaprovider.Track); ok { - // dont' save radio stations in play queue + // don't save radio stations in play queue trackIDs = append(trackIDs, item.Metadata().ID) } } diff --git a/ui/mainwindow.go b/ui/mainwindow.go index adbf867..68d5e10 100644 --- a/ui/mainwindow.go +++ b/ui/mainwindow.go @@ -94,9 +94,9 @@ func NewMainWindow(fyneApp fyne.App, appName, displayAppName, appVersion string, meta := item.Metadata() artistDisp := "" if tr, ok := item.(*mediaprovider.Track); ok { - artistDisp = strings.Join(tr.ArtistNames, ", ") + artistDisp = " – " + strings.Join(tr.ArtistNames, ", ") } - m.Window.SetTitle(fmt.Sprintf("%s – %s · %s", meta.Name, artistDisp, displayAppName)) + m.Window.SetTitle(fmt.Sprintf("%s%s · %s", meta.Name, artistDisp, displayAppName)) if m.App.Config.Application.ShowTrackChangeNotification { // TODO: Once Fyne issue #2935 is resolved, show album cover fyne.CurrentApp().SendNotification(&fyne.Notification{ diff --git a/ui/widgets/largenowplayingcard.go b/ui/widgets/largenowplayingcard.go index cc3ad33..a602182 100644 --- a/ui/widgets/largenowplayingcard.go +++ b/ui/widgets/largenowplayingcard.go @@ -115,13 +115,14 @@ func (n *LargeNowPlayingCard) Update(item mediaprovider.MediaItem) { n.albumName.Text = "" n.rating.Rating = 0 n.favorite.Favorite = false + return } meta := item.Metadata() n.trackName.Segments[0].(*widget.TextSegment).Text = meta.Name + n.artistName.BuildSegments(meta.Artists, meta.ArtistIDs) + n.albumName.Text = meta.Album if tr, ok := item.(*mediaprovider.Track); ok { - n.artistName.BuildSegments(tr.ArtistNames, tr.ArtistIDs) - n.albumName.Text = tr.Album n.rating.Rating = tr.Rating n.favorite.Favorite = tr.Favorite }