fix some logic errors from refactoring

This commit is contained in:
Drew Weymouth
2024-05-31 17:21:33 -07:00
parent 0a902aef9f
commit c6c1341f8f
7 changed files with 53 additions and 36 deletions
+8 -5
View File
@@ -71,11 +71,12 @@ func InitMPMediaHandler(playbackManager *PlaybackManager, artURLLookup func(trac
mp.playbackManager.OnSongChange(func(track mediaprovider.MediaItem, _ *mediaprovider.Track) { mp.playbackManager.OnSongChange(func(track mediaprovider.MediaItem, _ *mediaprovider.Track) {
// Asynchronously because artwork fetching can take time // Asynchronously because artwork fetching can take time
var meta mediaprovider.MediaItemMetadata var meta *mediaprovider.MediaItemMetadata
if track == nil { if track != nil {
meta = track.Metadata() m := track.Metadata()
meta = &m
} }
go mp.updateMetadata(&meta) go mp.updateMetadata(meta)
}) })
mp.playbackManager.OnStopped(func() { mp.playbackManager.OnStopped(func() {
@@ -106,7 +107,9 @@ func (mp *MPMediaHandler) updateMetadata(meta *mediaprovider.MediaItemMetadata)
title = meta.Name title = meta.Name
var err error var err error
if artURL, err = mp.artURLLookup(meta.CoverArtID); err != nil { 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, ", ") artist = strings.Join(meta.Artists, ", ")
duration = meta.Duration duration = meta.Duration
+34 -18
View File
@@ -251,32 +251,48 @@ func (m *MPRISHandler) Metadata() (types.Metadata, error) {
trackObjPath = m.curTrackPath trackObjPath = m.curTrackPath
} }
status := m.pm.PlayerStatus() 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 { if np := m.pm.NowPlaying(); np != nil && status.State != player.Stopped {
meta = np.Metadata()
if track, ok := np.(*mediaprovider.Track); ok { 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 var artURL string
if tr.ID != "" && m.ArtURLLookup != nil { if meta.ID != "" && m.ArtURLLookup != nil {
if u, err := m.ArtURLLookup(tr.CoverArtID); err == nil { if u, err := m.ArtURLLookup(meta.CoverArtID); err == nil {
artURL = u artURL = u
} }
} }
return types.Metadata{ mprisMeta := types.Metadata{
TrackId: dbus.ObjectPath(trackObjPath), TrackId: dbus.ObjectPath(trackObjPath),
Length: secondsToMicroseconds(status.Duration), Length: secondsToMicroseconds(status.Duration),
Title: tr.Title, Title: meta.Name,
Album: tr.Album, Album: meta.Album,
Artist: tr.ArtistNames, Artist: meta.Artists,
DiscNumber: tr.DiscNumber, DiscNumber: discNumber,
TrackNumber: tr.TrackNumber, TrackNumber: trackNumber,
Genre: []string{tr.Genre}, UserRating: float64(userRating) / 5,
UserRating: float64(tr.Rating) / 5, UseCount: playCount,
ContentCreated: strconv.Itoa(tr.Year), ArtUrl: artURL,
UseCount: tr.PlayCount, }
ArtUrl: artURL, if genre != "" {
}, nil mprisMeta.Genre = []string{genre}
}
if year != 0 {
mprisMeta.ContentCreated = strconv.Itoa(year)
}
return mprisMeta, nil
} }
func (m *MPRISHandler) Volume() (float64, error) { func (m *MPRISHandler) Volume() (float64, error) {
+4 -7
View File
@@ -44,7 +44,7 @@ type playbackEngine struct {
player player.BasePlayer player player.BasePlayer
playTimeStopwatch util.Stopwatch playTimeStopwatch util.Stopwatch
curTrackTime float64 curTrackDuration float64
latestTrackPosition float64 // cleared by checkScrobble latestTrackPosition float64 // cleared by checkScrobble
callbacksDisabled bool callbacksDisabled bool
@@ -400,10 +400,7 @@ func (p *playbackEngine) handleOnTrackChange() {
} }
} }
p.wasStopped = false p.wasStopped = false
p.curTrackTime = 0 p.curTrackDuration = float64(p.playQueue[p.nowPlayingIdx].Metadata().Duration)
if tr, ok := p.playQueue[p.nowPlayingIdx].(*mediaprovider.Track); ok {
p.curTrackTime = float64(tr.Duration)
}
p.sendNowPlayingScrobble() // Must come before invokeOnChangeCallbacks b/c track may immediately be scrobbled p.sendNowPlayingScrobble() // Must come before invokeOnChangeCallbacks b/c track may immediately be scrobbled
p.invokeOnSongChangeCallbacks() p.invokeOnSongChangeCallbacks()
p.doUpdateTimePos(false) p.doUpdateTimePos(false)
@@ -512,10 +509,10 @@ func (p *playbackEngine) checkScrobble() {
} }
playDur := p.playTimeStopwatch.Elapsed() playDur := p.playTimeStopwatch.Elapsed()
if playDur.Seconds() < 0.1 || p.curTrackTime < 0.1 { if playDur.Seconds() < 0.1 || p.curTrackDuration < 0.1 {
return return
} }
pcnt := playDur.Seconds() / p.curTrackTime * 100 pcnt := playDur.Seconds() / p.curTrackDuration * 100
timeThresholdMet := p.scrobbleCfg.ThresholdTimeSeconds >= 0 && timeThresholdMet := p.scrobbleCfg.ThresholdTimeSeconds >= 0 &&
playDur.Seconds() >= float64(p.scrobbleCfg.ThresholdTimeSeconds) playDur.Seconds() >= float64(p.scrobbleCfg.ThresholdTimeSeconds)
+1 -1
View File
@@ -281,7 +281,7 @@ func (p *PlaybackManager) SeekFraction(fraction float64) error {
} else if fraction > 1 { } else if fraction > 1 {
fraction = 1 fraction = 1
} }
target := p.engine.curTrackTime * fraction target := p.engine.curTrackDuration * fraction
return p.engine.SeekSeconds(target) return p.engine.SeekSeconds(target)
} }
+1 -1
View File
@@ -32,7 +32,7 @@ func SavePlayQueue(serverID string, pm *PlaybackManager, filepath string, server
trackIDs := make([]string, 0, len(queue)) trackIDs := make([]string, 0, len(queue))
for _, item := range queue { for _, item := range queue {
if _, ok := item.(*mediaprovider.Track); ok { 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) trackIDs = append(trackIDs, item.Metadata().ID)
} }
} }
+2 -2
View File
@@ -94,9 +94,9 @@ func NewMainWindow(fyneApp fyne.App, appName, displayAppName, appVersion string,
meta := item.Metadata() meta := item.Metadata()
artistDisp := "" artistDisp := ""
if tr, ok := item.(*mediaprovider.Track); ok { 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 { if m.App.Config.Application.ShowTrackChangeNotification {
// TODO: Once Fyne issue #2935 is resolved, show album cover // TODO: Once Fyne issue #2935 is resolved, show album cover
fyne.CurrentApp().SendNotification(&fyne.Notification{ fyne.CurrentApp().SendNotification(&fyne.Notification{
+3 -2
View File
@@ -115,13 +115,14 @@ func (n *LargeNowPlayingCard) Update(item mediaprovider.MediaItem) {
n.albumName.Text = "" n.albumName.Text = ""
n.rating.Rating = 0 n.rating.Rating = 0
n.favorite.Favorite = false n.favorite.Favorite = false
return
} }
meta := item.Metadata() meta := item.Metadata()
n.trackName.Segments[0].(*widget.TextSegment).Text = meta.Name 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 { 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.rating.Rating = tr.Rating
n.favorite.Favorite = tr.Favorite n.favorite.Favorite = tr.Favorite
} }