mirror of
https://github.com/THIS-IS-NOT-A-BACKUP/zspotify.git
synced 2024-11-27 18:33:17 +01:00
86 lines
2.6 KiB
Python
86 lines
2.6 KiB
Python
|
from const import ITEMS, ID, TRACK, NAME
|
||
|
from track import download_track
|
||
|
from utils import sanitize_data
|
||
|
from zspotify import ZSpotify
|
||
|
|
||
|
MY_PLAYLISTS_URL = 'https://api.spotify.com/v1/me/playlists'
|
||
|
PLAYLISTS_URL = 'https://api.spotify.com/v1/playlists'
|
||
|
|
||
|
|
||
|
def get_all_playlists():
|
||
|
""" Returns list of users playlists """
|
||
|
playlists = []
|
||
|
limit = 50
|
||
|
offset = 0
|
||
|
|
||
|
while True:
|
||
|
resp = ZSpotify.invoke_url_with_params(MY_PLAYLISTS_URL, limit=limit, offset=offset)
|
||
|
offset += limit
|
||
|
playlists.extend(resp[ITEMS])
|
||
|
if len(resp[ITEMS]) < limit:
|
||
|
break
|
||
|
|
||
|
return playlists
|
||
|
|
||
|
|
||
|
def get_playlist_songs(playlist_id):
|
||
|
""" returns list of songs in a playlist """
|
||
|
songs = []
|
||
|
offset = 0
|
||
|
limit = 100
|
||
|
|
||
|
while True:
|
||
|
resp = ZSpotify.invoke_url_with_params(f'{PLAYLISTS_URL}/{playlist_id}/tracks', limit=limit, offset=offset)
|
||
|
offset += limit
|
||
|
songs.extend(resp[ITEMS])
|
||
|
if len(resp[ITEMS]) < limit:
|
||
|
break
|
||
|
|
||
|
return songs
|
||
|
|
||
|
|
||
|
def get_playlist_info(playlist_id):
|
||
|
""" Returns information scraped from playlist """
|
||
|
resp = ZSpotify.invoke_url(f'{PLAYLISTS_URL}/{playlist_id}?fields=name,owner(display_name)&market=from_token')
|
||
|
return resp['name'].strip(), resp['owner']['display_name'].strip()
|
||
|
|
||
|
|
||
|
def download_playlist(playlists, playlist_choice):
|
||
|
"""Downloads all the songs from a playlist"""
|
||
|
playlist_songs = get_playlist_songs(playlists[int(playlist_choice) - 1][ID])
|
||
|
|
||
|
for song in playlist_songs:
|
||
|
if song[TRACK][ID] is not None:
|
||
|
download_track(song[TRACK][ID], sanitize_data(
|
||
|
playlists[int(playlist_choice) - 1][NAME].strip()) + '/')
|
||
|
print('\n')
|
||
|
|
||
|
|
||
|
def download_from_user_playlist():
|
||
|
""" Select which playlist(s) to download """
|
||
|
playlists = get_all_playlists()
|
||
|
|
||
|
count = 1
|
||
|
for playlist in playlists:
|
||
|
print(str(count) + ': ' + playlist[NAME].strip())
|
||
|
count += 1
|
||
|
|
||
|
print('\n> SELECT A PLAYLIST BY ID')
|
||
|
print('> SELECT A RANGE BY ADDING A DASH BETWEEN BOTH ID\'s')
|
||
|
print('> For example, typing 10 to get one playlist or 10-20 to get\nevery playlist from 10-20 (inclusive)\n')
|
||
|
|
||
|
playlist_choices = input('ID(s): ').split('-')
|
||
|
|
||
|
if len(playlist_choices) == 1:
|
||
|
download_playlist(playlists, playlist_choices[0])
|
||
|
else:
|
||
|
start = int(playlist_choices[0])
|
||
|
end = int(playlist_choices[1]) + 1
|
||
|
|
||
|
print(f'Downloading from {start} to {end}...')
|
||
|
|
||
|
for playlist in range(start, end):
|
||
|
download_playlist(playlists, playlist)
|
||
|
|
||
|
print('\n**All playlists have been downloaded**\n')
|