@@ -58,38 +58,41 @@ func SetFallbackPlaylistShuffle(session model.SimpleListeningSession, user model
58
58
return nil
59
59
}
60
60
61
- func addFallbackTrackIfNecessary (session model.FullListeningSession , upNextRequest * model.SongRequest ) (trackAdded bool , error * SpotifeteError ) {
61
+ func addFallbackTrackIfNecessary (session model.FullListeningSession , queue []model.SongRequest ) (updatedQueue []model.SongRequest , error * SpotifeteError ) {
62
+
62
63
if session .FallbackPlaylistId == nil {
63
- return false , nil
64
+ return queue , nil
64
65
}
65
66
66
- if upNextRequest != nil {
67
- return false , nil
68
- }
67
+ for i := len (queue ); i < 2 ; i ++ {
68
+ addedRequest , spotifeteError := addFallbackTrack (session )
69
+ if spotifeteError != nil {
70
+ return queue , spotifeteError
71
+ }
69
72
70
- spotifeteError := addFallbackTrack (session )
71
- if spotifeteError != nil {
72
- return false , spotifeteError
73
+ queue = append (queue , addedRequest )
73
74
}
74
75
75
- return true , nil
76
+ return queue , nil
76
77
}
77
78
78
- func addFallbackTrack (session model.FullListeningSession ) (error * SpotifeteError ) {
79
+ func addFallbackTrack (session model.FullListeningSession ) (addedRequest model.SongRequest , error * SpotifeteError ) {
80
+
79
81
fallbackTrackId , spotifeteError := findNextFallbackTrack (session )
80
82
if spotifeteError != nil {
81
- return spotifeteError
83
+ return model. SongRequest {}, spotifeteError
82
84
}
83
85
84
- _ , spotifeteError = RequestSong (session , fallbackTrackId )
86
+ addedRequest , spotifeteError = RequestSong (session , fallbackTrackId , "Fallback-Playlist" )
85
87
if spotifeteError != nil {
86
- return spotifeteError
88
+ return model. SongRequest {}, spotifeteError
87
89
}
88
90
89
- return nil
91
+ return addedRequest , nil
90
92
}
91
93
92
94
func findNextFallbackTrack (session model.FullListeningSession ) (nextFallbackTrackId string , spotifeteError * SpotifeteError ) {
95
+
93
96
playableTracks , spotifeteError := getPlayablePlaylistTracks (* session .FallbackPlaylistId , session .Owner )
94
97
if spotifeteError != nil {
95
98
return "" , spotifeteError
@@ -109,10 +112,17 @@ func findNextFallbackTrack(session model.FullListeningSession) (nextFallbackTrac
109
112
}
110
113
111
114
func doFindNextFallbackTrack (playableTracks * []spotify.FullTrack , session model.FullListeningSession ) (nextFallbackTrackId string , spotifeteError * SpotifeteError ) {
112
- currentlyPlayingRequest := GetCurrentlyPlayingRequest (session .SimpleListeningSession )
115
+
116
+ queue , err := GetFullQueue (session .SimpleListeningSession )
117
+ if err != nil {
118
+ return "" , nil
119
+ }
113
120
114
121
for i := 0 ; i < 10_000 ; i ++ {
115
- fallbackTrack := findPossibleFallbackTrackFromPlayableTracks (* playableTracks , session .SimpleListeningSession , currentlyPlayingRequest , 0 )
122
+ fallbackTrack , err := findPossibleFallbackTrackFromPlayableTracks (* playableTracks , session .SimpleListeningSession , queue , 0 )
123
+ if err != nil {
124
+ return "" , NewInternalError ("could not find possible fallback tracks" , err )
125
+ }
116
126
if fallbackTrack != nil {
117
127
return * fallbackTrack , nil
118
128
}
@@ -124,7 +134,7 @@ func doFindNextFallbackTrack(playableTracks *[]spotify.FullTrack, session model.
124
134
return "" , NewInternalError (fmt .Sprintf ("No track found in fallback playlist for session %d that has been played less than 10,000 times. Aborting and removing fallback playlist." , session .ID ), nil )
125
135
}
126
136
127
- func findPossibleFallbackTrackFromPlayableTracks (playableTracks []spotify.FullTrack , session model.SimpleListeningSession , currentlyPlayingRequest * model.SongRequest , maximumPlays int64 ) (possibleFallbackTrackId * string ) {
137
+ func findPossibleFallbackTrackFromPlayableTracks (playableTracks []spotify.FullTrack , session model.SimpleListeningSession , queue [] model.SongRequest , maximumPlays int64 ) (possibleFallbackTrackId * string , err error ) {
128
138
if session .FallbackPlaylistShuffle {
129
139
rand .Seed (time .Now ().UnixNano ())
130
140
rand .Shuffle (
@@ -136,14 +146,28 @@ func findPossibleFallbackTrackFromPlayableTracks(playableTracks []spotify.FullTr
136
146
137
147
for _ , track := range playableTracks {
138
148
trackId := track .ID .String ()
139
- if currentlyPlayingRequest == nil || currentlyPlayingRequest .SpotifyTrackId != trackId {
140
- playCount := getTrackPlayCount (session , trackId )
149
+ if ! queueContainsTrack (queue , trackId ) {
150
+ playCount , err := getTrackPlayCount (session , trackId )
151
+ if err != nil {
152
+ return nil , err
153
+ }
141
154
142
155
if playCount <= maximumPlays {
143
- return & trackId
156
+ return & trackId , nil
144
157
}
145
158
}
146
159
}
147
160
148
- return nil
161
+ return nil , nil
162
+ }
163
+
164
+ func queueContainsTrack (queue []model.SongRequest , trackId string ) bool {
165
+
166
+ for _ , trackInQueue := range queue {
167
+ if trackInQueue .SpotifyTrackId == trackId {
168
+ return true
169
+ }
170
+ }
171
+
172
+ return false
149
173
}
0 commit comments