Skip to content

Commit c622580

Browse files
committed
feat: call event handlers
1 parent 9215cf5 commit c622580

File tree

7 files changed

+114
-4
lines changed

7 files changed

+114
-4
lines changed

cmd/daemon/controls.go

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,15 @@ func (p *AppPlayer) handlePlayerEvent(ctx context.Context, ev *player.Event) {
8484
p.state.player.IsBuffering = false
8585
p.updateState(ctx)
8686

87+
p.sess.Events().OnPlayerPlay(
88+
p.primaryStream,
89+
p.state.player.ContextUri,
90+
p.state.player.Options.ShufflingContext,
91+
p.state.player.PlayOrigin,
92+
p.state.tracks.CurrentTrack(),
93+
p.state.trackPosition(),
94+
)
95+
8796
p.app.server.Emit(&ApiEvent{
8897
Type: ApiEventTypePlaying,
8998
Data: ApiEventDataPlaying{
@@ -98,6 +107,8 @@ func (p *AppPlayer) handlePlayerEvent(ctx context.Context, ev *player.Event) {
98107
p.state.player.IsBuffering = false
99108
p.updateState(ctx)
100109

110+
p.sess.Events().OnPlayerResume(p.primaryStream, p.state.trackPosition())
111+
101112
p.app.server.Emit(&ApiEvent{
102113
Type: ApiEventTypePlaying,
103114
Data: ApiEventDataPlaying{
@@ -112,6 +123,8 @@ func (p *AppPlayer) handlePlayerEvent(ctx context.Context, ev *player.Event) {
112123
p.state.player.IsBuffering = false
113124
p.updateState(ctx)
114125

126+
p.sess.Events().OnPlayerPause(p.primaryStream, p.state.trackPosition())
127+
115128
p.app.server.Emit(&ApiEvent{
116129
Type: ApiEventTypePaused,
117130
Data: ApiEventDataPaused{
@@ -120,6 +133,8 @@ func (p *AppPlayer) handlePlayerEvent(ctx context.Context, ev *player.Event) {
120133
},
121134
})
122135
case player.EventTypeNotPlaying:
136+
p.sess.Events().OnPlayerEnd(p.primaryStream, p.state.trackPosition())
137+
123138
p.app.server.Emit(&ApiEvent{
124139
Type: ApiEventTypeNotPlaying,
125140
Data: ApiEventDataNotPlaying{
@@ -220,7 +235,11 @@ func (p *AppPlayer) loadContext(ctx context.Context, spotCtx *connectpb.Context,
220235
}
221236

222237
func (p *AppPlayer) loadCurrentTrack(ctx context.Context, paused, drop bool) error {
223-
p.primaryStream = nil
238+
if p.primaryStream != nil {
239+
p.sess.Events().OnPrimaryStreamUnload(p.primaryStream)
240+
241+
p.primaryStream = nil
242+
}
224243

225244
spotId, err := librespot.SpotifyIdFromUri(p.state.player.Track.Uri)
226245
if err != nil {
@@ -268,6 +287,8 @@ func (p *AppPlayer) loadCurrentTrack(ctx context.Context, paused, drop bool) err
268287
return fmt.Errorf("failed setting stream for %s: %w", spotId, err)
269288
}
270289

290+
p.sess.Events().PostPrimaryStreamLoad(p.primaryStream, paused)
291+
271292
p.app.log.WithField("uri", spotId.Uri()).
272293
Infof("loaded %s %s (paused: %t, position: %dms, duration: %dms, prefetched: %t)", spotId.Type(),
273294
strconv.QuoteToGraphic(p.primaryStream.Media.Name()), paused, trackPosition, p.primaryStream.Media.Duration(),
@@ -430,6 +451,7 @@ func (p *AppPlayer) seek(ctx context.Context, position int64) error {
430451
return fmt.Errorf("no primary stream")
431452
}
432453

454+
oldPosition := p.player.PositionMs()
433455
position = max(0, min(position, int64(p.primaryStream.Media.Duration())))
434456

435457
p.app.log.Debugf("seek track to %dms", position)
@@ -442,6 +464,8 @@ func (p *AppPlayer) seek(ctx context.Context, position int64) error {
442464
p.updateState(ctx)
443465
p.schedulePrefetchNext()
444466

467+
p.sess.Events().OnPlayerSeek(p.primaryStream, oldPosition, position)
468+
445469
p.app.server.Emit(&ApiEvent{
446470
Type: ApiEventTypeSeek,
447471
Data: ApiEventDataSeek{
@@ -460,6 +484,8 @@ func (p *AppPlayer) skipPrev(ctx context.Context, allowSeeking bool) error {
460484
return p.seek(ctx, 0)
461485
}
462486

487+
p.sess.Events().OnPlayerSkipBackward(p.primaryStream, p.player.PositionMs())
488+
463489
if p.state.tracks != nil {
464490
p.app.log.Debug("skip previous track")
465491
p.state.tracks.GoPrev()
@@ -482,6 +508,8 @@ func (p *AppPlayer) skipPrev(ctx context.Context, allowSeeking bool) error {
482508
}
483509

484510
func (p *AppPlayer) skipNext(ctx context.Context, track *connectpb.ContextTrack) error {
511+
p.sess.Events().OnPlayerSkipForward(p.primaryStream, p.player.PositionMs())
512+
485513
if track != nil {
486514
contextSpotType := librespot.InferSpotifyIdTypeFromContextUri(p.state.player.ContextUri)
487515
if err := p.state.tracks.TrySeek(ctx, tracks.ContextTrackComparator(contextSpotType, track)); err != nil {

cmd/daemon/player.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ func (p *AppPlayer) handlePlayerCommand(ctx context.Context, req dealer.RequestP
189189

190190
// current session
191191
p.state.player.PlayOrigin = transferState.CurrentSession.PlayOrigin
192+
p.state.player.PlayOrigin.DeviceIdentifier = req.SentByDeviceId
192193
p.state.player.ContextUri = transferState.CurrentSession.Context.Uri
193194
p.state.player.ContextUrl = transferState.CurrentSession.Context.Url
194195
p.state.player.ContextRestrictions = transferState.CurrentSession.Context.Restrictions

events/dummy.go

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,12 @@ package events
44

55
import (
66
librespot "github.com/devgianlu/go-librespot"
7+
"github.com/devgianlu/go-librespot/audio"
78
"github.com/devgianlu/go-librespot/events/plugin"
9+
"github.com/devgianlu/go-librespot/mercury"
10+
"github.com/devgianlu/go-librespot/player"
11+
connectpb "github.com/devgianlu/go-librespot/proto/spotify/connectstate"
12+
metadatapb "github.com/devgianlu/go-librespot/proto/spotify/metadata"
813
"github.com/devgianlu/go-librespot/spclient"
914
)
1015

@@ -13,9 +18,51 @@ var Plugin plugin.Interface = dummyPlugin{}
1318
type dummyPlugin struct {
1419
}
1520

16-
func (p dummyPlugin) NewEventManager(librespot.Logger, *librespot.AppState, *spclient.Spclient, string) (plugin.EventManager, error) {
21+
func (p dummyPlugin) NewEventManager(librespot.Logger, *librespot.AppState, *mercury.Client, *spclient.Spclient, string) (player.EventManager, error) {
1722
return dummyEventManager{}, nil
1823
}
1924

2025
type dummyEventManager struct {
2126
}
27+
28+
func (d dummyEventManager) PreStreamLoadNew([]byte, librespot.SpotifyId, int64) {
29+
}
30+
31+
func (d dummyEventManager) PostStreamResolveAudioFile([]byte, int32, *librespot.Media, *metadatapb.AudioFile) {
32+
}
33+
34+
func (d dummyEventManager) PostStreamRequestAudioKey([]byte) {
35+
}
36+
37+
func (d dummyEventManager) PostStreamResolveStorage([]byte) {
38+
}
39+
40+
func (d dummyEventManager) PostStreamInitHttpChunkReader([]byte, *audio.HttpChunkedReader) {
41+
}
42+
43+
func (d dummyEventManager) OnPrimaryStreamUnload(*player.Stream) {
44+
}
45+
46+
func (d dummyEventManager) PostPrimaryStreamLoad(*player.Stream, bool) {
47+
}
48+
49+
func (d dummyEventManager) OnPlayerPlay(*player.Stream, string, bool, *connectpb.PlayOrigin, *connectpb.ProvidedTrack, int64) {
50+
}
51+
52+
func (d dummyEventManager) OnPlayerResume(*player.Stream, int64) {
53+
}
54+
55+
func (d dummyEventManager) OnPlayerPause(*player.Stream, int64) {
56+
}
57+
58+
func (d dummyEventManager) OnPlayerSeek(*player.Stream, int64, int64) {
59+
}
60+
61+
func (d dummyEventManager) OnPlayerSkipForward(*player.Stream, int64) {
62+
}
63+
64+
func (d dummyEventManager) OnPlayerSkipBackward(*player.Stream, int64) {
65+
}
66+
67+
func (d dummyEventManager) OnPlayerEnd(*player.Stream, int64) {
68+
}

events/plugin/interface.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ package plugin
22

33
import (
44
librespot "github.com/devgianlu/go-librespot"
5+
"github.com/devgianlu/go-librespot/mercury"
56
"github.com/devgianlu/go-librespot/player"
67
"github.com/devgianlu/go-librespot/spclient"
78
)
89

910
type Interface interface {
10-
NewEventManager(log librespot.Logger, state *librespot.AppState, sp *spclient.Spclient, username string) (player.EventManager, error)
11+
NewEventManager(log librespot.Logger, state *librespot.AppState, hg *mercury.Client, sp *spclient.Spclient, username string) (player.EventManager, error)
1112
}

player/events.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
package player
22

3+
import (
4+
librespot "github.com/devgianlu/go-librespot"
5+
"github.com/devgianlu/go-librespot/audio"
6+
connectpb "github.com/devgianlu/go-librespot/proto/spotify/connectstate"
7+
"github.com/devgianlu/go-librespot/proto/spotify/metadata"
8+
)
9+
310
type EventType int
411

512
const (
@@ -15,4 +22,20 @@ type Event struct {
1522
}
1623

1724
type EventManager interface {
25+
PreStreamLoadNew(playbackId []byte, spotId librespot.SpotifyId, mediaPosition int64)
26+
PostStreamResolveAudioFile(playbackId []byte, targetBitrate int32, media *librespot.Media, file *metadata.AudioFile)
27+
PostStreamRequestAudioKey(playbackId []byte)
28+
PostStreamResolveStorage(playbackId []byte)
29+
PostStreamInitHttpChunkReader(playbackId []byte, reader *audio.HttpChunkedReader)
30+
31+
OnPrimaryStreamUnload(stream *Stream)
32+
PostPrimaryStreamLoad(stream *Stream, paused bool)
33+
34+
OnPlayerPlay(stream *Stream, ctxUri string, shuffle bool, playOrigin *connectpb.PlayOrigin, track *connectpb.ProvidedTrack, pos int64)
35+
OnPlayerResume(stream *Stream, pos int64)
36+
OnPlayerPause(stream *Stream, pos int64)
37+
OnPlayerSeek(stream *Stream, oldPos, newPos int64)
38+
OnPlayerSkipForward(stream *Stream, pos int64)
39+
OnPlayerSkipBackward(stream *Stream, pos int64)
40+
OnPlayerEnd(stream *Stream, pos int64)
1841
}

player/player.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,8 @@ func (p *Player) NewStream(ctx context.Context, client *http.Client, spotId libr
416416
playbackId := make([]byte, 16)
417417
_, _ = rand.Read(playbackId)
418418

419+
p.events.PreStreamLoadNew(playbackId, spotId, mediaPosition)
420+
419421
var media *librespot.Media
420422
var file *metadata.AudioFile
421423
if spotId.Type() == librespot.SpotifyIdTypeTrack {
@@ -464,13 +466,17 @@ func (p *Player) NewStream(ctx context.Context, client *http.Client, spotId libr
464466
return nil, fmt.Errorf("unsupported spotify type: %s", spotId.Type())
465467
}
466468

469+
p.events.PostStreamResolveAudioFile(playbackId, int32(bitrate), media, file)
470+
467471
log.Debugf("selected format %s (%x)", file.Format.String(), file.FileId)
468472

469473
audioKey, err := p.audioKey.Request(ctx, spotId.Id(), file.FileId)
470474
if err != nil {
471475
return nil, fmt.Errorf("failed retrieving audio key: %w", err)
472476
}
473477

478+
p.events.PostStreamRequestAudioKey(playbackId)
479+
474480
storageResolve, err := p.sp.ResolveStorageInteractive(ctx, file.FileId, false)
475481
if err != nil {
476482
return nil, fmt.Errorf("failed resolving track storage: %w", err)
@@ -492,11 +498,15 @@ func (p *Player) NewStream(ctx context.Context, client *http.Client, spotId libr
492498
return nil, fmt.Errorf("unknown storage resolve result: %s", storageResolve.Result)
493499
}
494500

501+
p.events.PostStreamResolveStorage(playbackId)
502+
495503
rawStream, err := audio.NewHttpChunkedReader(log.WithField("uri", spotId.String()), client, trackUrl)
496504
if err != nil {
497505
return nil, fmt.Errorf("failed initializing chunked reader: %w", err)
498506
}
499507

508+
p.events.PostStreamInitHttpChunkReader(playbackId, rawStream)
509+
500510
decryptedStream, err := audio.NewAesAudioDecryptor(rawStream, audioKey)
501511
if err != nil {
502512
return nil, fmt.Errorf("failed intializing audio decryptor: %w", err)

session/session.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ func NewSessionFromOptions(ctx context.Context, opts *Options) (*Session, error)
202202
s.audioKey = audio.NewAudioKeyProvider(opts.Log, s.ap)
203203

204204
// init event sender
205-
s.events, err = events.Plugin.NewEventManager(opts.Log, opts.AppState, s.sp, s.ap.Username())
205+
s.events, err = events.Plugin.NewEventManager(opts.Log, opts.AppState, s.hg, s.sp, s.ap.Username())
206206
if err != nil {
207207
return nil, fmt.Errorf("failed initializing event sender: %w", err)
208208
}

0 commit comments

Comments
 (0)