From fb67bfed5ebe11f981a522bc6c474d17b30cb5d4 Mon Sep 17 00:00:00 2001 From: devgianlu Date: Sat, 12 Oct 2024 18:58:09 +0200 Subject: [PATCH] refactor: move skip next logic --- cmd/daemon/controls.go | 50 +++++++++++++++++++++++++++++------------- cmd/daemon/player.go | 23 ++----------------- 2 files changed, 37 insertions(+), 36 deletions(-) diff --git a/cmd/daemon/controls.go b/cmd/daemon/controls.go index 5f7bc5e..4b416ea 100644 --- a/cmd/daemon/controls.go +++ b/cmd/daemon/controls.go @@ -448,23 +448,43 @@ func (p *AppPlayer) skipPrev(allowSeeking bool) error { return nil } -func (p *AppPlayer) skipNext() error { - hasNextTrack, err := p.advanceNext(true, true) - if err != nil { - return fmt.Errorf("failed skipping to next track: %w", err) - } +func (p *AppPlayer) skipNext(track *connectpb.ContextTrack) error { + if track != nil { + contextSpotType := librespot.InferSpotifyIdTypeFromContextUri(p.state.player.ContextUri) + if err := p.state.tracks.TrySeek(tracks.ContextTrackComparator(contextSpotType, track)); err != nil { + return err + } - // if no track to be played, just stop - if !hasNextTrack { - p.app.server.Emit(&ApiEvent{ - Type: ApiEventTypeStopped, - Data: ApiEventDataStopped{ - PlayOrigin: p.state.playOrigin(), - }, - }) - } + p.state.player.Timestamp = time.Now().UnixMilli() + p.state.player.PositionAsOfTimestamp = 0 - return nil + p.state.player.Track = p.state.tracks.CurrentTrack() + p.state.player.PrevTracks = p.state.tracks.PrevTracks() + p.state.player.NextTracks = p.state.tracks.NextTracks() + p.state.player.Index = p.state.tracks.Index() + + if err := p.loadCurrentTrack(p.state.player.IsPaused, true); err != nil { + return err + } + return nil + } else { + hasNextTrack, err := p.advanceNext(true, true) + if err != nil { + return fmt.Errorf("failed skipping to next track: %w", err) + } + + // if no track to be played, just stop + if !hasNextTrack { + p.app.server.Emit(&ApiEvent{ + Type: ApiEventTypeStopped, + Data: ApiEventDataStopped{ + PlayOrigin: p.state.playOrigin(), + }, + }) + } + + return nil + } } func (p *AppPlayer) advanceNext(forceNext, drop bool) (bool, error) { diff --git a/cmd/daemon/player.go b/cmd/daemon/player.go index b53e368..eb12737 100644 --- a/cmd/daemon/player.go +++ b/cmd/daemon/player.go @@ -298,26 +298,7 @@ func (p *AppPlayer) handlePlayerCommand(req dealer.RequestPayload) error { case "skip_prev": return p.skipPrev(req.Command.Options.AllowSeeking) case "skip_next": - if req.Command.Track != nil { - contextSpotType := librespot.InferSpotifyIdTypeFromContextUri(p.state.player.ContextUri) - if err := p.state.tracks.TrySeek(tracks.ContextTrackComparator(contextSpotType, req.Command.Track)); err != nil { - return err - } - - p.state.player.Timestamp = time.Now().UnixMilli() - p.state.player.PositionAsOfTimestamp = 0 - - p.state.player.Track = p.state.tracks.CurrentTrack() - p.state.player.PrevTracks = p.state.tracks.PrevTracks() - p.state.player.NextTracks = p.state.tracks.NextTracks() - p.state.player.Index = p.state.tracks.Index() - - if err := p.loadCurrentTrack(p.state.player.IsPaused, true); err != nil { - return err - } - return nil - } - return p.skipNext() + return p.skipNext(req.Command.Track) case "update_context": if req.Command.Context.Uri != p.state.player.ContextUri { log.Warnf("ignoring context update for wrong uri: %s", req.Command.Context.Uri) @@ -463,7 +444,7 @@ func (p *AppPlayer) handleApiRequest(req ApiRequest) (any, error) { _ = p.skipPrev(true) return nil, nil case ApiRequestTypeNext: - _ = p.skipNext() + _ = p.skipNext(nil) return nil, nil case ApiRequestTypePlay: data := req.Data.(ApiRequestDataPlay)