74 lines
2.7 KiB
Python
74 lines
2.7 KiB
Python
import tidalapi
|
|
from tqdm import tqdm
|
|
|
|
tidalapi_parse_album = tidalapi._parse_album
|
|
|
|
|
|
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
|
|
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()
|
|
|
|
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'])
|
|
|
|
|