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) {
// 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
+34 -18
View File
@@ -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) {
+4 -7
View File
@@ -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)
+1 -1
View File
@@ -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)
}
+1 -1
View File
@@ -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)
}
}
+2 -2
View File
@@ -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{
+3 -2
View File
@@ -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
}