Update to tidalapi v0.7 + other minor improvements

* Speed improvements erasing playlists
* Fix progress bar when erasing playlists
* Potentially more useful error logs from repeat_on_exception
This commit is contained in:
Timothy Rae
2022-12-10 13:55:30 +13:00
parent 7efecad56b
commit 383e2078fd
4 changed files with 45 additions and 94 deletions

View File

@@ -1,76 +1,27 @@
import tidalapi
from tqdm import tqdm
tidalapi_parse_album = tidalapi._parse_album
def _remove_indices_from_playlist(playlist, indices):
headers = {'If-None-Match': playlist._etag}
index_string = ",".join(map(str, indices))
playlist.requests.request('DELETE', (playlist._base_url + '/items/%s') % (playlist.id, index_string), headers=headers)
playlist._reparse()
def patch():
tidalapi._parse_album = _parse_album
tidalapi.models.Album.picture = picture
def _parse_album(json_obj, artist=None, artists=None):
obj = tidalapi_parse_album(json_obj, artist, artists)
image_id = ""
if json_obj.get("cover"):
image_id = json_obj.get("cover")
obj.__dict__.update(image_id=image_id)
return obj
def picture(obj, width, height):
return "https://resources.tidal.com/images/{image_id}/{width}x{height}.jpg".format(
image_id=obj.image_id.replace("-", "/"), width=width, height=height
)
def set_tidal_playlist(session, playlist_id, track_ids):
# erases any items in the given playlist, then adds all of the tracks given in track_ids
# had to hack this together because the API doesn't include it
chunk_size = 20 # add/delete tracks in chunks of no more than this many tracks
request_params = {
'sessionId': session.session_id,
'countryCode': session.country_code,
'limit': '999',
}
def get_headers():
etag = session.request('GET','playlists/%s/tracks' % playlist_id).headers['ETag']
return {'if-none-match' : etag}
# clear all old items from playlist
playlist = session.get_playlist(playlist_id)
progress = tqdm(desc="Erasing existing tracks from Tidal playlist", total=playlist.num_tracks)
while True:
if not playlist.num_tracks:
break
track_index_string = ",".join([str(x) for x in range(min(chunk_size, playlist.num_tracks))])
result = session.request('DELETE', 'playlists/{}/tracks/{}'.format(playlist.id, track_index_string), params=request_params, headers=get_headers())
result.raise_for_status()
progress.update(min(chunk_size, playlist.num_tracks))
playlist = session.get_playlist(playlist_id)
progress.close()
# add all new items to the playlist
def clear_tidal_playlist(playlist, chunk_size=20):
with tqdm(desc="Erasing existing tracks from Tidal playlist", total=playlist.num_tracks) as progress:
while playlist.num_tracks:
indices = range(min(playlist.num_tracks, chunk_size))
_remove_indices_from_playlist(playlist, indices)
progress.update(len(indices))
def add_multiple_tracks_to_playlist(playlist, track_ids, chunk_size=20):
offset = 0
progress = tqdm(desc="Adding new tracks to Tidal playlist", total=len(track_ids))
while offset < len(track_ids):
count = min(chunk_size, len(track_ids) - offset)
data = {
'trackIds' : ",".join([str(x) for x in track_ids[offset:offset+chunk_size]]),
'toIndex' : offset
}
offset += count
result = session.request('POST', 'playlists/{}/tracks'.format(playlist.id), params=request_params, data=data, headers=get_headers())
result.raise_for_status()
progress.update(count)
progress.close()
with tqdm(desc="Adding new tracks to Tidal playlist", total=len(track_ids)) as progress:
while offset < len(track_ids):
count = min(chunk_size, len(track_ids) - offset)
playlist.add(track_ids[offset:offset+chunk_size])
offset += count
progress.update(count)
def create_tidal_playlist(session, name):
result = session.request('POST','users/%s/playlists' % session.user.id ,data={'title': name})
return session.get_playlist(result.json()['uuid'])
def delete_tidal_playlist(session, playlist):
etag = session.request('GET','playlists/%s' % playlist.id).headers['ETag']
headers = {'if-none-match' : etag}
session.request('DELETE','playlists/%s' % playlist.id, headers=headers)
def set_tidal_playlist(playlist, track_ids):
clear_tidal_playlist(playlist)
add_multiple_tracks_to_playlist(playlist, track_ids)