@@ -178,12 +178,13 @@ async def _fetch_all_from_spotify_in_chunks(fetch_function: Callable) -> List[di
178
178
179
179
async def get_tracks_from_spotify_playlist (spotify_session : spotipy .Spotify , spotify_playlist ):
180
180
def _get_tracks_from_spotify_playlist (offset : int , playlist_id : str ):
181
- fields = "next,total,limit,items(track(name,album(name,artists),artists,track_number,duration_ms,id,external_ids(isrc)))"
181
+ fields = "next,total,limit,items(track(name,album(name,artists),artists,track_number,duration_ms,id,external_ids(isrc))),type "
182
182
return spotify_session .playlist_tracks (playlist_id = playlist_id , fields = fields , offset = offset )
183
183
184
184
print (f"Loading tracks from Spotify playlist '{ spotify_playlist ['name' ]} '" )
185
- return await repeat_on_request_error ( _fetch_all_from_spotify_in_chunks , lambda offset : _get_tracks_from_spotify_playlist (offset = offset , playlist_id = spotify_playlist ["id" ]))
186
-
185
+ items = await repeat_on_request_error ( _fetch_all_from_spotify_in_chunks , lambda offset : _get_tracks_from_spotify_playlist (offset = offset , playlist_id = spotify_playlist ["id" ]))
186
+ track_filter = lambda item : item .get ('type' , 'track' ) == 'track' # type may be 'episode' also
187
+ return list (filter (track_filter , items ))
187
188
188
189
def populate_track_match_cache (spotify_tracks_ : Sequence [t_spotify .SpotifyTrack ], tidal_tracks_ : Sequence [tidalapi .Track ]):
189
190
""" Populate the track match cache with all the existing tracks in Tidal playlist corresponding to Spotify playlist """
@@ -282,14 +283,18 @@ async def _run_rate_limiter(semaphore):
282
283
283
284
async def sync_playlist (spotify_session : spotipy .Spotify , tidal_session : tidalapi .Session , spotify_playlist , tidal_playlist : tidalapi .Playlist | None , config : dict ):
284
285
""" sync given playlist to tidal """
285
- # Create a new Tidal playlist if required
286
- if not tidal_playlist :
286
+ # Get the tracks from both Spotify and Tidal, creating a new Tidal playlist if necessary
287
+ spotify_tracks = await get_tracks_from_spotify_playlist (spotify_session , spotify_playlist )
288
+ if len (spotify_tracks ) == 0 :
289
+ return # nothing to do
290
+ if tidal_playlist :
291
+ old_tidal_tracks = await get_all_playlist_tracks (tidal_playlist )
292
+ else :
287
293
print (f"No playlist found on Tidal corresponding to Spotify playlist: '{ spotify_playlist ['name' ]} ', creating new playlist" )
288
294
tidal_playlist = tidal_session .user .create_playlist (spotify_playlist ['name' ], spotify_playlist ['description' ])
295
+ old_tidal_tracks = []
289
296
290
297
# Extract the new tracks from the playlist that we haven't already seen before
291
- spotify_tracks = await get_tracks_from_spotify_playlist (spotify_session , spotify_playlist )
292
- old_tidal_tracks = await get_all_playlist_tracks (tidal_playlist )
293
298
populate_track_match_cache (spotify_tracks , old_tidal_tracks )
294
299
await search_new_tracks_on_tidal (tidal_session , spotify_tracks , spotify_playlist ['name' ], config )
295
300
new_tidal_track_ids = get_tracks_for_new_tidal_playlist (spotify_tracks )
0 commit comments