cosmetic changes in code
PEP8: Tabs replaced by 4 spaces
This commit is contained in:
@ -1,36 +1,38 @@
|
||||
#!/usr/bin/env python3
|
||||
from deemix.api.deezer import Deezer
|
||||
import deemix.utils.localpaths as localpaths
|
||||
from deemix.utils.misc import getIDFromLink, getTypeFromLink, getBitrateInt
|
||||
from deemix.app.queuemanager import addToQueue
|
||||
from deemix.app.spotify import SpotifyHelper
|
||||
from os import system as execute
|
||||
import os.path as path
|
||||
from os import mkdir
|
||||
|
||||
import deemix.utils.localpaths as localpaths
|
||||
from deemix.api.deezer import Deezer
|
||||
from deemix.app.queuemanager import addToQueue
|
||||
from deemix.app.spotify import SpotifyHelper
|
||||
|
||||
dz = Deezer()
|
||||
sp = SpotifyHelper()
|
||||
|
||||
|
||||
def requestValidArl():
|
||||
while True:
|
||||
arl = input("Paste here your arl:")
|
||||
if dz.login_via_arl(arl):
|
||||
break
|
||||
return arl
|
||||
while True:
|
||||
arl = input("Paste here your arl:")
|
||||
if dz.login_via_arl(arl):
|
||||
break
|
||||
return arl
|
||||
|
||||
|
||||
def login():
|
||||
configFolder = localpaths.getConfigFolder()
|
||||
if not path.isdir(configFolder):
|
||||
mkdir(configFolder)
|
||||
if path.isfile(path.join(configFolder, '.arl')):
|
||||
with open(path.join(configFolder, '.arl'), 'r') as f:
|
||||
arl = f.read()
|
||||
if not dz.login_via_arl(arl):
|
||||
arl = requestValidArl()
|
||||
else:
|
||||
arl = requestValidArl()
|
||||
with open(path.join(configFolder, '.arl'), 'w') as f:
|
||||
f.write(arl)
|
||||
configFolder = localpaths.getConfigFolder()
|
||||
if not path.isdir(configFolder):
|
||||
mkdir(configFolder)
|
||||
if path.isfile(path.join(configFolder, '.arl')):
|
||||
with open(path.join(configFolder, '.arl'), 'r') as f:
|
||||
arl = f.read()
|
||||
if not dz.login_via_arl(arl):
|
||||
arl = requestValidArl()
|
||||
else:
|
||||
arl = requestValidArl()
|
||||
with open(path.join(configFolder, '.arl'), 'w') as f:
|
||||
f.write(arl)
|
||||
|
||||
|
||||
def downloadLink(url, settings, bitrate=None):
|
||||
addToQueue(dz, sp, url, settings, bitrate)
|
||||
addToQueue(dz, sp, url, settings, bitrate)
|
||||
|
@ -1,69 +1,69 @@
|
||||
{
|
||||
"downloadLocation": "",
|
||||
"tracknameTemplate": "%artist% - %title%",
|
||||
"albumTracknameTemplate": "%tracknumber% - %title%",
|
||||
"playlistTracknameTemplate": "%position% - %artist% - %title%",
|
||||
"createPlaylistFolder": true,
|
||||
"playlistNameTemplate": "%playlist%",
|
||||
"createArtistFolder": false,
|
||||
"artistNameTemplate": "%artist%",
|
||||
"createAlbumFolder": true,
|
||||
"albumNameTemplate": "%artist% - %album%",
|
||||
"createCDFolder": true,
|
||||
"createStructurePlaylist": false,
|
||||
"createSingleFolder": false,
|
||||
"padTracks": true,
|
||||
"paddingSize": "0",
|
||||
"illegalCharacterReplacer": "_",
|
||||
"queueConcurrency": 3,
|
||||
"maxBitrate": "3",
|
||||
"fallbackBitrate": true,
|
||||
"fallbackSearch": false,
|
||||
"logErrors": true,
|
||||
"logSearched": false,
|
||||
"createM3U8File": false,
|
||||
"syncedLyrics": false,
|
||||
"embeddedArtworkSize": 800,
|
||||
"localArtworkSize": 1400,
|
||||
"saveArtwork": true,
|
||||
"coverImageTemplate": "cover",
|
||||
"saveArtworkArtist": false,
|
||||
"artistImageTemplate": "folder",
|
||||
"PNGcovers": false,
|
||||
"jpegImageQuality": 80,
|
||||
"dateFormat": "Y-M-D",
|
||||
"removeAlbumVersion": false,
|
||||
"featuredToTitle": "0",
|
||||
"titleCasing": "nothing",
|
||||
"artistCasing": "nothing",
|
||||
"executeCommand": "",
|
||||
"tags": {
|
||||
"title": true,
|
||||
"artist": true,
|
||||
"album": true,
|
||||
"cover": true,
|
||||
"trackNumber": true,
|
||||
"trackTotal": false,
|
||||
"discNumber": true,
|
||||
"discTotal": false,
|
||||
"albumArtist": true,
|
||||
"genre": true,
|
||||
"year": true,
|
||||
"date": true,
|
||||
"explicit": false,
|
||||
"isrc": true,
|
||||
"length": true,
|
||||
"barcode": true,
|
||||
"bpm": true,
|
||||
"replayGain": false,
|
||||
"label": true,
|
||||
"lyrics": false,
|
||||
"copyright": false,
|
||||
"composer": false,
|
||||
"involvedPeople": false,
|
||||
"savePlaylistAsCompilation": false,
|
||||
"useNullSeparator": false,
|
||||
"saveID3v1": true,
|
||||
"multitagSeparator": "default"
|
||||
}
|
||||
"downloadLocation": "",
|
||||
"tracknameTemplate": "%artist% - %title%",
|
||||
"albumTracknameTemplate": "%tracknumber% - %title%",
|
||||
"playlistTracknameTemplate": "%position% - %artist% - %title%",
|
||||
"createPlaylistFolder": true,
|
||||
"playlistNameTemplate": "%playlist%",
|
||||
"createArtistFolder": false,
|
||||
"artistNameTemplate": "%artist%",
|
||||
"createAlbumFolder": true,
|
||||
"albumNameTemplate": "%artist% - %album%",
|
||||
"createCDFolder": true,
|
||||
"createStructurePlaylist": false,
|
||||
"createSingleFolder": false,
|
||||
"padTracks": true,
|
||||
"paddingSize": "0",
|
||||
"illegalCharacterReplacer": "_",
|
||||
"queueConcurrency": 3,
|
||||
"maxBitrate": "3",
|
||||
"fallbackBitrate": true,
|
||||
"fallbackSearch": false,
|
||||
"logErrors": true,
|
||||
"logSearched": false,
|
||||
"createM3U8File": false,
|
||||
"syncedLyrics": false,
|
||||
"embeddedArtworkSize": 800,
|
||||
"localArtworkSize": 1400,
|
||||
"saveArtwork": true,
|
||||
"coverImageTemplate": "cover",
|
||||
"saveArtworkArtist": false,
|
||||
"artistImageTemplate": "folder",
|
||||
"PNGcovers": false,
|
||||
"jpegImageQuality": 80,
|
||||
"dateFormat": "Y-M-D",
|
||||
"removeAlbumVersion": false,
|
||||
"featuredToTitle": "0",
|
||||
"titleCasing": "nothing",
|
||||
"artistCasing": "nothing",
|
||||
"executeCommand": "",
|
||||
"tags": {
|
||||
"title": true,
|
||||
"artist": true,
|
||||
"album": true,
|
||||
"cover": true,
|
||||
"trackNumber": true,
|
||||
"trackTotal": false,
|
||||
"discNumber": true,
|
||||
"discTotal": false,
|
||||
"albumArtist": true,
|
||||
"genre": true,
|
||||
"year": true,
|
||||
"date": true,
|
||||
"explicit": false,
|
||||
"isrc": true,
|
||||
"length": true,
|
||||
"barcode": true,
|
||||
"bpm": true,
|
||||
"replayGain": false,
|
||||
"label": true,
|
||||
"lyrics": false,
|
||||
"copyright": false,
|
||||
"composer": false,
|
||||
"involvedPeople": false,
|
||||
"savePlaylistAsCompilation": false,
|
||||
"useNullSeparator": false,
|
||||
"saveID3v1": true,
|
||||
"multitagSeparator": "default"
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,5 @@
|
||||
from deemix.utils.misc import getIDFromLink, getTypeFromLink, getBitrateInt
|
||||
from concurrent.futures import ProcessPoolExecutor
|
||||
from deemix.app.downloader import download
|
||||
from deemix.utils.misc import getIDFromLink, getTypeFromLink, getBitrateInt
|
||||
|
||||
queue = []
|
||||
queueList = {}
|
||||
@ -26,244 +25,264 @@ if its an album/playlist
|
||||
collection
|
||||
"""
|
||||
|
||||
|
||||
def generateQueueItem(dz, sp, url, settings, bitrate=None, albumAPI=None, interface=None):
|
||||
forcedBitrate = getBitrateInt(bitrate)
|
||||
bitrate = forcedBitrate if forcedBitrate else settings['maxBitrate']
|
||||
type = getTypeFromLink(url)
|
||||
id = getIDFromLink(url, type)
|
||||
result = {}
|
||||
if type == None or id == None:
|
||||
print("URL not recognized")
|
||||
result['error'] = "URL not recognized"
|
||||
elif type == "track":
|
||||
trackAPI = dz.get_track_gw(id)
|
||||
if albumAPI:
|
||||
trackAPI['_EXTRA_ALBUM'] = albumAPI
|
||||
trackAPI['FILENAME_TEMPLATE'] = settings['tracknameTemplate']
|
||||
trackAPI['SINGLE_TRACK'] = True
|
||||
forcedBitrate = getBitrateInt(bitrate)
|
||||
bitrate = forcedBitrate if forcedBitrate else settings['maxBitrate']
|
||||
type = getTypeFromLink(url)
|
||||
id = getIDFromLink(url, type)
|
||||
result = {}
|
||||
if type == None or id == None:
|
||||
print("URL not recognized")
|
||||
result['error'] = "URL not recognized"
|
||||
elif type == "track":
|
||||
trackAPI = dz.get_track_gw(id)
|
||||
if albumAPI:
|
||||
trackAPI['_EXTRA_ALBUM'] = albumAPI
|
||||
trackAPI['FILENAME_TEMPLATE'] = settings['tracknameTemplate']
|
||||
trackAPI['SINGLE_TRACK'] = True
|
||||
|
||||
result['title'] = trackAPI['SNG_TITLE']
|
||||
if 'VERSION' in trackAPI and trackAPI['VERSION']:
|
||||
result['title'] += " " + trackAPI['VERSION']
|
||||
result['artist'] = trackAPI['ART_NAME']
|
||||
result['cover'] = f"https://e-cdns-images.dzcdn.net/images/cover/{trackAPI['ALB_PICTURE']}/75x75-000000-80-0-0.jpg"
|
||||
result['size'] = 1
|
||||
result['downloaded'] = 0
|
||||
result['failed'] = 0
|
||||
result['progress'] = 0
|
||||
result['type'] = 'track'
|
||||
result['id'] = id
|
||||
result['bitrate'] = bitrate
|
||||
result['uuid'] = f"{result['type']}_{id}_{bitrate}"
|
||||
result['settings'] = settings or {}
|
||||
result['single'] = trackAPI
|
||||
result['title'] = trackAPI['SNG_TITLE']
|
||||
if 'VERSION' in trackAPI and trackAPI['VERSION']:
|
||||
result['title'] += " " + trackAPI['VERSION']
|
||||
result['artist'] = trackAPI['ART_NAME']
|
||||
result[
|
||||
'cover'] = f"https://e-cdns-images.dzcdn.net/images/cover/{trackAPI['ALB_PICTURE']}/75x75-000000-80-0-0.jpg"
|
||||
result['size'] = 1
|
||||
result['downloaded'] = 0
|
||||
result['failed'] = 0
|
||||
result['progress'] = 0
|
||||
result['type'] = 'track'
|
||||
result['id'] = id
|
||||
result['bitrate'] = bitrate
|
||||
result['uuid'] = f"{result['type']}_{id}_{bitrate}"
|
||||
result['settings'] = settings or {}
|
||||
result['single'] = trackAPI
|
||||
|
||||
elif type == "album":
|
||||
albumAPI = dz.get_album(id)
|
||||
albumAPI_gw = dz.get_album_gw(id)
|
||||
albumAPI['nb_disk'] = albumAPI_gw['NUMBER_DISK']
|
||||
albumAPI['copyright'] = albumAPI_gw['COPYRIGHT']
|
||||
if albumAPI['nb_tracks'] == 1:
|
||||
return generateQueueItem(dz, sp, f"https://www.deezer.com/track/{albumAPI['tracks']['data'][0]['id']}", settings, bitrate, albumAPI)
|
||||
tracksArray = dz.get_album_tracks_gw(id)
|
||||
elif type == "album":
|
||||
albumAPI = dz.get_album(id)
|
||||
albumAPI_gw = dz.get_album_gw(id)
|
||||
albumAPI['nb_disk'] = albumAPI_gw['NUMBER_DISK']
|
||||
albumAPI['copyright'] = albumAPI_gw['COPYRIGHT']
|
||||
if albumAPI['nb_tracks'] == 1:
|
||||
return generateQueueItem(dz, sp, f"https://www.deezer.com/track/{albumAPI['tracks']['data'][0]['id']}",
|
||||
settings, bitrate, albumAPI)
|
||||
tracksArray = dz.get_album_tracks_gw(id)
|
||||
|
||||
result['title'] = albumAPI['title']
|
||||
result['artist'] = albumAPI['artist']['name']
|
||||
result['cover'] = albumAPI['cover_small'][:-24]+'/75x75-000000-80-0-0.jpg'
|
||||
result['size'] = albumAPI['nb_tracks']
|
||||
result['downloaded'] = 0
|
||||
result['failed'] = 0
|
||||
result['progress'] = 0
|
||||
result['type'] = 'album'
|
||||
result['id'] = id
|
||||
result['bitrate'] = bitrate
|
||||
result['uuid'] = f"{result['type']}_{id}_{bitrate}"
|
||||
result['settings'] = settings or {}
|
||||
totalSize = len(tracksArray)
|
||||
result['collection'] = []
|
||||
for pos, trackAPI in enumerate(tracksArray, start=1):
|
||||
trackAPI['_EXTRA_ALBUM'] = albumAPI
|
||||
trackAPI['POSITION'] = pos
|
||||
trackAPI['SIZE'] = totalSize
|
||||
trackAPI['FILENAME_TEMPLATE'] = settings['albumTracknameTemplate']
|
||||
result['collection'].append(trackAPI)
|
||||
result['title'] = albumAPI['title']
|
||||
result['artist'] = albumAPI['artist']['name']
|
||||
result['cover'] = albumAPI['cover_small'][:-24] + '/75x75-000000-80-0-0.jpg'
|
||||
result['size'] = albumAPI['nb_tracks']
|
||||
result['downloaded'] = 0
|
||||
result['failed'] = 0
|
||||
result['progress'] = 0
|
||||
result['type'] = 'album'
|
||||
result['id'] = id
|
||||
result['bitrate'] = bitrate
|
||||
result['uuid'] = f"{result['type']}_{id}_{bitrate}"
|
||||
result['settings'] = settings or {}
|
||||
totalSize = len(tracksArray)
|
||||
result['collection'] = []
|
||||
for pos, trackAPI in enumerate(tracksArray, start=1):
|
||||
trackAPI['_EXTRA_ALBUM'] = albumAPI
|
||||
trackAPI['POSITION'] = pos
|
||||
trackAPI['SIZE'] = totalSize
|
||||
trackAPI['FILENAME_TEMPLATE'] = settings['albumTracknameTemplate']
|
||||
result['collection'].append(trackAPI)
|
||||
|
||||
elif type == "playlist":
|
||||
playlistAPI = dz.get_playlist(id)
|
||||
playlistTracksAPI = dz.get_playlist_tracks_gw(id)
|
||||
playlistAPI['various_artist'] = dz.get_artist(5080)
|
||||
elif type == "playlist":
|
||||
playlistAPI = dz.get_playlist(id)
|
||||
playlistTracksAPI = dz.get_playlist_tracks_gw(id)
|
||||
playlistAPI['various_artist'] = dz.get_artist(5080)
|
||||
|
||||
result['title'] = playlistAPI['title']
|
||||
result['artist'] = playlistAPI['creator']['name']
|
||||
result['cover'] = playlistAPI['picture_small'][:-24]+'/75x75-000000-80-0-0.jpg'
|
||||
result['size'] = playlistAPI['nb_tracks']
|
||||
result['downloaded'] = 0
|
||||
result['failed'] = 0
|
||||
result['progress'] = 0
|
||||
result['type'] = 'playlist'
|
||||
result['id'] = id
|
||||
result['bitrate'] = bitrate
|
||||
result['uuid'] = f"{result['type']}_{id}_{bitrate}"
|
||||
result['settings'] = settings or {}
|
||||
totalSize = len(playlistTracksAPI)
|
||||
result['collection'] = []
|
||||
for pos, trackAPI in enumerate(playlistTracksAPI, start=1):
|
||||
trackAPI['_EXTRA_PLAYLIST'] = playlistAPI
|
||||
trackAPI['POSITION'] = pos
|
||||
trackAPI['SIZE'] = totalSize
|
||||
trackAPI['FILENAME_TEMPLATE'] = settings['playlistTracknameTemplate']
|
||||
result['collection'].append(trackAPI)
|
||||
result['title'] = playlistAPI['title']
|
||||
result['artist'] = playlistAPI['creator']['name']
|
||||
result['cover'] = playlistAPI['picture_small'][:-24] + '/75x75-000000-80-0-0.jpg'
|
||||
result['size'] = playlistAPI['nb_tracks']
|
||||
result['downloaded'] = 0
|
||||
result['failed'] = 0
|
||||
result['progress'] = 0
|
||||
result['type'] = 'playlist'
|
||||
result['id'] = id
|
||||
result['bitrate'] = bitrate
|
||||
result['uuid'] = f"{result['type']}_{id}_{bitrate}"
|
||||
result['settings'] = settings or {}
|
||||
totalSize = len(playlistTracksAPI)
|
||||
result['collection'] = []
|
||||
for pos, trackAPI in enumerate(playlistTracksAPI, start=1):
|
||||
trackAPI['_EXTRA_PLAYLIST'] = playlistAPI
|
||||
trackAPI['POSITION'] = pos
|
||||
trackAPI['SIZE'] = totalSize
|
||||
trackAPI['FILENAME_TEMPLATE'] = settings['playlistTracknameTemplate']
|
||||
result['collection'].append(trackAPI)
|
||||
|
||||
elif type == "artist":
|
||||
artistAPI = dz.get_artist(id)
|
||||
if interface:
|
||||
interface.send("toast",
|
||||
{'msg': f"Adding {artistAPI['name']} albums to queue", 'icon': 'loading', 'dismiss': False,
|
||||
'id': 'artist_' + str(artistAPI['id'])})
|
||||
artistAPITracks = dz.get_artist_albums(id)
|
||||
albumList = []
|
||||
for album in artistAPITracks['data']:
|
||||
albumList.append(generateQueueItem(dz, sp, album['link'], settings, bitrate))
|
||||
if interface:
|
||||
interface.send("toast",
|
||||
{'msg': f"Added {artistAPI['name']} albums to queue", 'icon': 'done', 'dismiss': True,
|
||||
'id': 'artist_' + str(artistAPI['id'])})
|
||||
return albumList
|
||||
elif type == "spotifytrack":
|
||||
result = {}
|
||||
if not sp.spotifyEnabled:
|
||||
print("Spotify Features is not setted up correctly.")
|
||||
result['error'] = "Spotify Features is not setted up correctly."
|
||||
return result
|
||||
track_id = sp.get_trackid_spotify(dz, id, settings['fallbackSearch'])
|
||||
if track_id != 0:
|
||||
return generateQueueItem(dz, sp, f'https://www.deezer.com/track/{track_id}', settings, bitrate)
|
||||
else:
|
||||
print("Track not found on deezer!")
|
||||
result['error'] = "Track not found on deezer!"
|
||||
elif type == "spotifyalbum":
|
||||
result = {}
|
||||
if not sp.spotifyEnabled:
|
||||
print("Spotify Features is not setted up correctly.")
|
||||
result['error'] = "Spotify Features is not setted up correctly."
|
||||
return result
|
||||
album_id = sp.get_albumid_spotify(dz, id)
|
||||
if album_id != 0:
|
||||
return generateQueueItem(dz, sp, f'https://www.deezer.com/album/{album_id}', settings, bitrate)
|
||||
else:
|
||||
print("Album not found on deezer!")
|
||||
result['error'] = "Album not found on deezer!"
|
||||
elif type == "spotifyplaylist":
|
||||
result = {}
|
||||
if not sp.spotifyEnabled:
|
||||
print("Spotify Features is not setted up correctly.")
|
||||
result['error'] = "Spotify Features is not setted up correctly."
|
||||
return result
|
||||
if interface:
|
||||
interface.send("toast",
|
||||
{'msg': f"Converting spotify tracks to deezer tracks", 'icon': 'loading', 'dismiss': False,
|
||||
'id': 'spotifyplaylist_' + str(id)})
|
||||
playlist = sp.convert_spotify_playlist(dz, id, settings)
|
||||
playlist['bitrate'] = bitrate
|
||||
playlist['uuid'] = f"{playlist['type']}_{id}_{bitrate}"
|
||||
result = playlist
|
||||
if interface:
|
||||
interface.send("toast", {'msg': f"Spotify playlist converted", 'icon': 'done', 'dismiss': True,
|
||||
'id': 'spotifyplaylist_' + str(id)})
|
||||
else:
|
||||
print("URL not supported yet")
|
||||
result['error'] = "URL not supported yet"
|
||||
return result
|
||||
|
||||
elif type == "artist":
|
||||
artistAPI = dz.get_artist(id)
|
||||
if interface:
|
||||
interface.send("toast", {'msg': f"Adding {artistAPI['name']} albums to queue", 'icon': 'loading', 'dismiss': False, 'id': 'artist_'+str(artistAPI['id'])})
|
||||
artistAPITracks = dz.get_artist_albums(id)
|
||||
albumList = []
|
||||
for album in artistAPITracks['data']:
|
||||
albumList.append(generateQueueItem(dz, sp, album['link'], settings, bitrate))
|
||||
if interface:
|
||||
interface.send("toast", {'msg': f"Added {artistAPI['name']} albums to queue", 'icon': 'done', 'dismiss': True, 'id': 'artist_'+str(artistAPI['id'])})
|
||||
return albumList
|
||||
elif type == "spotifytrack":
|
||||
result = {}
|
||||
if not sp.spotifyEnabled:
|
||||
print("Spotify Features is not setted up correctly.")
|
||||
result['error'] = "Spotify Features is not setted up correctly."
|
||||
return result
|
||||
track_id = sp.get_trackid_spotify(dz, id, settings['fallbackSearch'])
|
||||
if track_id != 0:
|
||||
return generateQueueItem(dz, sp, f'https://www.deezer.com/track/{track_id}', settings, bitrate)
|
||||
else:
|
||||
print("Track not found on deezer!")
|
||||
result['error'] = "Track not found on deezer!"
|
||||
elif type == "spotifyalbum":
|
||||
result = {}
|
||||
if not sp.spotifyEnabled:
|
||||
print("Spotify Features is not setted up correctly.")
|
||||
result['error'] = "Spotify Features is not setted up correctly."
|
||||
return result
|
||||
album_id = sp.get_albumid_spotify(dz, id)
|
||||
if album_id != 0:
|
||||
return generateQueueItem(dz, sp, f'https://www.deezer.com/album/{album_id}', settings, bitrate)
|
||||
else:
|
||||
print("Album not found on deezer!")
|
||||
result['error'] = "Album not found on deezer!"
|
||||
elif type == "spotifyplaylist":
|
||||
result = {}
|
||||
if not sp.spotifyEnabled:
|
||||
print("Spotify Features is not setted up correctly.")
|
||||
result['error'] = "Spotify Features is not setted up correctly."
|
||||
return result
|
||||
if interface:
|
||||
interface.send("toast", {'msg': f"Converting spotify tracks to deezer tracks", 'icon': 'loading', 'dismiss': False, 'id': 'spotifyplaylist_'+str(id)})
|
||||
playlist = sp.convert_spotify_playlist(dz, id, settings)
|
||||
playlist['bitrate'] = bitrate
|
||||
playlist['uuid'] = f"{playlist['type']}_{id}_{bitrate}"
|
||||
result = playlist
|
||||
if interface:
|
||||
interface.send("toast", {'msg': f"Spotify playlist converted", 'icon': 'done', 'dismiss': True, 'id': 'spotifyplaylist_'+str(id)})
|
||||
else:
|
||||
print("URL not supported yet")
|
||||
result['error'] = "URL not supported yet"
|
||||
return result
|
||||
|
||||
def addToQueue(dz, sp, url, settings, bitrate=None, interface=None):
|
||||
global currentItem, queueList, queue
|
||||
if not dz.logged_in:
|
||||
return "Not logged in"
|
||||
queueItem = generateQueueItem(dz, sp, url, settings, bitrate, interface=interface)
|
||||
if type(queueItem) is list:
|
||||
for x in queueItem:
|
||||
if 'error' in x:
|
||||
continue
|
||||
if x['uuid'] in list(queueList.keys()):
|
||||
print("Already in queue!")
|
||||
continue
|
||||
if interface:
|
||||
interface.send("addedToQueue", x)
|
||||
queue.append(x['uuid'])
|
||||
queueList[x['uuid']] = x
|
||||
else:
|
||||
if 'error' in queueItem:
|
||||
if interface:
|
||||
interface.send("toast", {'msg': queueItem['error'], 'icon': 'error'})
|
||||
return False
|
||||
if queueItem['uuid'] in list(queueList.keys()):
|
||||
print("Already in queue!")
|
||||
if interface:
|
||||
interface.send("toast", {'msg': f"{queueItem['title']} is already in queue!", 'icon': 'playlist_add_check'})
|
||||
return False
|
||||
if interface:
|
||||
interface.send("addedToQueue", queueItem)
|
||||
interface.send("toast", {'msg': f"{queueItem['title']} added to queue", 'icon': 'playlist_add'})
|
||||
queue.append(queueItem['uuid'])
|
||||
queueList[queueItem['uuid']] = queueItem
|
||||
nextItem(dz, interface)
|
||||
return True
|
||||
global currentItem, queueList, queue
|
||||
if not dz.logged_in:
|
||||
return "Not logged in"
|
||||
queueItem = generateQueueItem(dz, sp, url, settings, bitrate, interface=interface)
|
||||
if type(queueItem) is list:
|
||||
for x in queueItem:
|
||||
if 'error' in x:
|
||||
continue
|
||||
if x['uuid'] in list(queueList.keys()):
|
||||
print("Already in queue!")
|
||||
continue
|
||||
if interface:
|
||||
interface.send("addedToQueue", x)
|
||||
queue.append(x['uuid'])
|
||||
queueList[x['uuid']] = x
|
||||
else:
|
||||
if 'error' in queueItem:
|
||||
if interface:
|
||||
interface.send("toast", {'msg': queueItem['error'], 'icon': 'error'})
|
||||
return False
|
||||
if queueItem['uuid'] in list(queueList.keys()):
|
||||
print("Already in queue!")
|
||||
if interface:
|
||||
interface.send("toast",
|
||||
{'msg': f"{queueItem['title']} is already in queue!", 'icon': 'playlist_add_check'})
|
||||
return False
|
||||
if interface:
|
||||
interface.send("addedToQueue", queueItem)
|
||||
interface.send("toast", {'msg': f"{queueItem['title']} added to queue", 'icon': 'playlist_add'})
|
||||
queue.append(queueItem['uuid'])
|
||||
queueList[queueItem['uuid']] = queueItem
|
||||
nextItem(dz, interface)
|
||||
return True
|
||||
|
||||
|
||||
def nextItem(dz, interface=None):
|
||||
global currentItem, queueList, queue
|
||||
if currentItem != "":
|
||||
return None
|
||||
else:
|
||||
if len(queue)>0:
|
||||
currentItem = queue.pop(0)
|
||||
else:
|
||||
return None
|
||||
if interface:
|
||||
interface.send("startDownload", currentItem)
|
||||
result = download(dz, queueList[currentItem], interface)
|
||||
callbackQueueDone(result)
|
||||
global currentItem, queueList, queue
|
||||
if currentItem != "":
|
||||
return None
|
||||
else:
|
||||
if len(queue) > 0:
|
||||
currentItem = queue.pop(0)
|
||||
else:
|
||||
return None
|
||||
if interface:
|
||||
interface.send("startDownload", currentItem)
|
||||
result = download(dz, queueList[currentItem], interface)
|
||||
callbackQueueDone(result)
|
||||
|
||||
|
||||
def callbackQueueDone(result):
|
||||
global currentItem, queueList, queueComplete
|
||||
if 'cancel' in queueList[currentItem]:
|
||||
del queueList[currentItem]
|
||||
else:
|
||||
queueComplete.append(currentItem)
|
||||
currentItem = ""
|
||||
nextItem(result['dz'], result['interface'])
|
||||
global currentItem, queueList, queueComplete
|
||||
if 'cancel' in queueList[currentItem]:
|
||||
del queueList[currentItem]
|
||||
else:
|
||||
queueComplete.append(currentItem)
|
||||
currentItem = ""
|
||||
nextItem(result['dz'], result['interface'])
|
||||
|
||||
|
||||
def getQueue():
|
||||
global currentItem, queueList, queue, queueComplete
|
||||
return (queue, queueComplete, queueList, currentItem)
|
||||
global currentItem, queueList, queue, queueComplete
|
||||
return (queue, queueComplete, queueList, currentItem)
|
||||
|
||||
|
||||
def removeFromQueue(uuid, interface=None):
|
||||
global currentItem, queueList, queue, queueComplete
|
||||
if uuid == currentItem:
|
||||
if interface:
|
||||
interface.send('toast', {'msg': "Cancelling current item.", 'icon':'loading', 'dismiss': False, 'id':'cancelling_'+uuid})
|
||||
queueList[uuid]['cancel'] = True
|
||||
elif uuid in queue:
|
||||
queue.remove(uuid)
|
||||
del queueList[uuid]
|
||||
if interface:
|
||||
interface.send("removedFromQueue", uuid)
|
||||
elif uuid in queueComplete:
|
||||
queueComplete.remove(uuid)
|
||||
del queueList[uuid]
|
||||
if interface:
|
||||
interface.send("removedFromQueue", uuid)
|
||||
global currentItem, queueList, queue, queueComplete
|
||||
if uuid == currentItem:
|
||||
if interface:
|
||||
interface.send('toast', {'msg': "Cancelling current item.", 'icon': 'loading', 'dismiss': False,
|
||||
'id': 'cancelling_' + uuid})
|
||||
queueList[uuid]['cancel'] = True
|
||||
elif uuid in queue:
|
||||
queue.remove(uuid)
|
||||
del queueList[uuid]
|
||||
if interface:
|
||||
interface.send("removedFromQueue", uuid)
|
||||
elif uuid in queueComplete:
|
||||
queueComplete.remove(uuid)
|
||||
del queueList[uuid]
|
||||
if interface:
|
||||
interface.send("removedFromQueue", uuid)
|
||||
|
||||
|
||||
def cancelAllDownloads(interface=None):
|
||||
global currentItem, queueList, queue, queueComplete
|
||||
queue = []
|
||||
queueComplete = []
|
||||
if currentItem != "":
|
||||
if interface:
|
||||
interface.send('toast', {'msg': "Cancelling current item.", 'icon':'loading', 'dismiss': False, 'id':'cancelling_'+currentItem})
|
||||
queueList[currentItem]['cancel'] = True
|
||||
for uuid in list(queueList.keys()):
|
||||
if uuid != currentItem:
|
||||
del queueList[uuid]
|
||||
if interface:
|
||||
interface.send("removedAllDownloads", currentItem)
|
||||
global currentItem, queueList, queue, queueComplete
|
||||
queue = []
|
||||
queueComplete = []
|
||||
if currentItem != "":
|
||||
if interface:
|
||||
interface.send('toast', {'msg': "Cancelling current item.", 'icon': 'loading', 'dismiss': False,
|
||||
'id': 'cancelling_' + currentItem})
|
||||
queueList[currentItem]['cancel'] = True
|
||||
for uuid in list(queueList.keys()):
|
||||
if uuid != currentItem:
|
||||
del queueList[uuid]
|
||||
if interface:
|
||||
interface.send("removedAllDownloads", currentItem)
|
||||
|
||||
|
||||
def removeFinishedDownloads(interface=None):
|
||||
global queueList, queueComplete
|
||||
for uuid in queueComplete:
|
||||
del queueList[uuid]
|
||||
queueComplete = []
|
||||
if interface:
|
||||
interface.send("removedFinishedDownloads")
|
||||
global queueList, queueComplete
|
||||
for uuid in queueComplete:
|
||||
del queueList[uuid]
|
||||
queueComplete = []
|
||||
if interface:
|
||||
interface.send("removedFinishedDownloads")
|
||||
|
@ -1,57 +1,61 @@
|
||||
#!/usr/bin/env python3
|
||||
import os.path as path
|
||||
from os import mkdir, rmdir
|
||||
import json
|
||||
import os.path as path
|
||||
from os import mkdir
|
||||
|
||||
import deemix.utils.localpaths as localpaths
|
||||
|
||||
settings = {}
|
||||
defaultSettings = {}
|
||||
|
||||
|
||||
def initSettings():
|
||||
global settings
|
||||
global defaultSettings
|
||||
currentFolder = path.abspath(path.dirname(__file__))
|
||||
configFolder = localpaths.getConfigFolder()
|
||||
if not path.isdir(configFolder):
|
||||
mkdir(configFolder)
|
||||
with open(path.join(currentFolder, 'default.json'), 'r') as d:
|
||||
defaultSettings = json.load(d)
|
||||
if not path.isfile(path.join(configFolder, 'config.json')):
|
||||
with open(path.join(configFolder, 'config.json'), 'w') as f:
|
||||
json.dump(defaultSettings, f, indent=2)
|
||||
with open(path.join(configFolder, 'config.json'), 'r') as configFile:
|
||||
settings = json.load(configFile)
|
||||
settingsCheck()
|
||||
if settings['downloadLocation'] == "":
|
||||
settings['downloadLocation'] = path.join(localpaths.getHomeFolder(), 'deemix Music')
|
||||
saveSettings(settings)
|
||||
if not path.isdir(settings['downloadLocation']):
|
||||
mkdir(settings['downloadLocation'])
|
||||
return settings
|
||||
global settings
|
||||
global defaultSettings
|
||||
currentFolder = path.abspath(path.dirname(__file__))
|
||||
configFolder = localpaths.getConfigFolder()
|
||||
if not path.isdir(configFolder):
|
||||
mkdir(configFolder)
|
||||
with open(path.join(currentFolder, 'default.json'), 'r') as d:
|
||||
defaultSettings = json.load(d)
|
||||
if not path.isfile(path.join(configFolder, 'config.json')):
|
||||
with open(path.join(configFolder, 'config.json'), 'w') as f:
|
||||
json.dump(defaultSettings, f, indent=2)
|
||||
with open(path.join(configFolder, 'config.json'), 'r') as configFile:
|
||||
settings = json.load(configFile)
|
||||
settingsCheck()
|
||||
if settings['downloadLocation'] == "":
|
||||
settings['downloadLocation'] = path.join(localpaths.getHomeFolder(), 'deemix Music')
|
||||
saveSettings(settings)
|
||||
if not path.isdir(settings['downloadLocation']):
|
||||
mkdir(settings['downloadLocation'])
|
||||
return settings
|
||||
|
||||
|
||||
def getSettings():
|
||||
global settings
|
||||
return settings
|
||||
global settings
|
||||
return settings
|
||||
|
||||
|
||||
def saveSettings(newSettings):
|
||||
global settings
|
||||
settings = newSettings
|
||||
with open(path.join(localpaths.getConfigFolder(), 'config.json'), 'w') as configFile:
|
||||
json.dump(settings, configFile, indent=2)
|
||||
return True
|
||||
global settings
|
||||
settings = newSettings
|
||||
with open(path.join(localpaths.getConfigFolder(), 'config.json'), 'w') as configFile:
|
||||
json.dump(settings, configFile, indent=2)
|
||||
return True
|
||||
|
||||
|
||||
def settingsCheck():
|
||||
global settings
|
||||
global defaultSettings
|
||||
changes = 0
|
||||
for x in defaultSettings:
|
||||
if not x in settings or type(settings[x]) != type(defaultSettings[x]):
|
||||
settings[x] = defaultSettings[x]
|
||||
changes+=1
|
||||
for x in defaultSettings['tags']:
|
||||
if not x in settings['tags'] or type(settings['tags'][x]) != type(defaultSettings['tags'][x]):
|
||||
settings['tags'][x] = defaultSettings['tags'][x]
|
||||
changes+=1
|
||||
if changes > 0:
|
||||
saveSettings(settings)
|
||||
global settings
|
||||
global defaultSettings
|
||||
changes = 0
|
||||
for x in defaultSettings:
|
||||
if not x in settings or type(settings[x]) != type(defaultSettings[x]):
|
||||
settings[x] = defaultSettings[x]
|
||||
changes += 1
|
||||
for x in defaultSettings['tags']:
|
||||
if not x in settings['tags'] or type(settings['tags'][x]) != type(defaultSettings['tags'][x]):
|
||||
settings['tags'][x] = defaultSettings['tags'][x]
|
||||
changes += 1
|
||||
if changes > 0:
|
||||
saveSettings(settings)
|
||||
|
@ -1,172 +1,179 @@
|
||||
#!/usr/bin/env python3
|
||||
import os.path as path
|
||||
from os import mkdir, rmdir
|
||||
import json
|
||||
|
||||
import deemix.utils.localpaths as localpaths
|
||||
import os.path as path
|
||||
from os import mkdir
|
||||
|
||||
import spotipy
|
||||
from spotipy.oauth2 import SpotifyClientCredentials
|
||||
|
||||
import deemix.utils.localpaths as localpaths
|
||||
|
||||
|
||||
class SpotifyHelper:
|
||||
def __init__(self):
|
||||
self.credentials = {}
|
||||
self.spotifyEnabled = False
|
||||
self.sp = None
|
||||
self.initCredentials()
|
||||
def __init__(self):
|
||||
self.credentials = {}
|
||||
self.spotifyEnabled = False
|
||||
self.sp = None
|
||||
self.initCredentials()
|
||||
|
||||
def initCredentials(self):
|
||||
configFolder = localpaths.getConfigFolder()
|
||||
if not path.isdir(configFolder):
|
||||
mkdir(configFolder)
|
||||
if not path.isfile(path.join(configFolder, 'authCredentials.json')):
|
||||
with open(path.join(configFolder, 'authCredentials.json'), 'w') as f:
|
||||
json.dump({'clientId': "", 'clientSecret': ""}, f, indent=2)
|
||||
with open(path.join(configFolder, 'authCredentials.json'), 'r') as credentialsFile:
|
||||
self.credentials = json.load(credentialsFile)
|
||||
self.checkCredentials()
|
||||
def initCredentials(self):
|
||||
configFolder = localpaths.getConfigFolder()
|
||||
if not path.isdir(configFolder):
|
||||
mkdir(configFolder)
|
||||
if not path.isfile(path.join(configFolder, 'authCredentials.json')):
|
||||
with open(path.join(configFolder, 'authCredentials.json'), 'w') as f:
|
||||
json.dump({'clientId': "", 'clientSecret': ""}, f, indent=2)
|
||||
with open(path.join(configFolder, 'authCredentials.json'), 'r') as credentialsFile:
|
||||
self.credentials = json.load(credentialsFile)
|
||||
self.checkCredentials()
|
||||
|
||||
def checkCredentials(self):
|
||||
if self.credentials['clientId'] == "" or self.credentials['clientSecret'] == "":
|
||||
spotifyEnabled = False
|
||||
else:
|
||||
try:
|
||||
self.createSpotifyConnection()
|
||||
self.sp.user_playlists('spotify')
|
||||
self.spotifyEnabled = True
|
||||
except Exception as e:
|
||||
self.spotifyEnabled = False
|
||||
return self.spotifyEnabled
|
||||
def checkCredentials(self):
|
||||
if self.credentials['clientId'] == "" or self.credentials['clientSecret'] == "":
|
||||
spotifyEnabled = False
|
||||
else:
|
||||
try:
|
||||
self.createSpotifyConnection()
|
||||
self.sp.user_playlists('spotify')
|
||||
self.spotifyEnabled = True
|
||||
except Exception as e:
|
||||
self.spotifyEnabled = False
|
||||
return self.spotifyEnabled
|
||||
|
||||
def getCredentials(self):
|
||||
return self.credentials
|
||||
def getCredentials(self):
|
||||
return self.credentials
|
||||
|
||||
def setCredentials(self, spotifyCredentials):
|
||||
configFolder = localpaths.getConfigFolder()
|
||||
with open(path.join(configFolder, 'authCredentials.json'), 'w') as f:
|
||||
json.dump(spotifyCredentials, f, indent=2)
|
||||
self.credentials = spotifyCredentials
|
||||
self.checkCredentials()
|
||||
def setCredentials(self, spotifyCredentials):
|
||||
configFolder = localpaths.getConfigFolder()
|
||||
with open(path.join(configFolder, 'authCredentials.json'), 'w') as f:
|
||||
json.dump(spotifyCredentials, f, indent=2)
|
||||
self.credentials = spotifyCredentials
|
||||
self.checkCredentials()
|
||||
|
||||
def createSpotifyConnection(self):
|
||||
client_credentials_manager = SpotifyClientCredentials(client_id=self.credentials['clientId'], client_secret=self.credentials['clientSecret'])
|
||||
self.sp = spotipy.Spotify(client_credentials_manager=client_credentials_manager)
|
||||
def createSpotifyConnection(self):
|
||||
client_credentials_manager = SpotifyClientCredentials(client_id=self.credentials['clientId'],
|
||||
client_secret=self.credentials['clientSecret'])
|
||||
self.sp = spotipy.Spotify(client_credentials_manager=client_credentials_manager)
|
||||
|
||||
def _convert_playlist_structure(self, spotify_obj):
|
||||
if len(spotify_obj['images']):
|
||||
url = spotify_obj['images'][0]['url']
|
||||
else:
|
||||
url = "https://e-cdns-images.dzcdn.net/images/cover/d41d8cd98f00b204e9800998ecf8427e/75x75-000000-80-0-0.jpg"
|
||||
deezer_obj = {
|
||||
'checksum': spotify_obj['snapshot_id'],
|
||||
'collaborative': spotify_obj['collaborative'],
|
||||
'creation_date': "????-00-00",
|
||||
'creator': {'id': spotify_obj['owner']['id'], 'name': spotify_obj['owner']['display_name'], 'tracklist': spotify_obj['owner']['href'], 'type': "user"},
|
||||
'description': spotify_obj['description'],
|
||||
'duration': 0,
|
||||
'fans': spotify_obj['followers']['total'],
|
||||
'id': spotify_obj['id'],
|
||||
'is_loved_track': False,
|
||||
'link': spotify_obj['external_urls']['spotify'],
|
||||
'nb_tracks': spotify_obj['tracks']['total'],
|
||||
'picture': url,
|
||||
'picture_big': url,
|
||||
'picture_medium': url,
|
||||
'picture_small': url,
|
||||
'picture_xl': url,
|
||||
'public': spotify_obj['public'],
|
||||
'share': spotify_obj['external_urls']['spotify'],
|
||||
'title': spotify_obj['name'],
|
||||
'tracklist': spotify_obj['tracks']['href'],
|
||||
'type': "playlist"
|
||||
}
|
||||
return deezer_obj
|
||||
def _convert_playlist_structure(self, spotify_obj):
|
||||
if len(spotify_obj['images']):
|
||||
url = spotify_obj['images'][0]['url']
|
||||
else:
|
||||
url = "https://e-cdns-images.dzcdn.net/images/cover/d41d8cd98f00b204e9800998ecf8427e/75x75-000000-80-0-0.jpg"
|
||||
deezer_obj = {
|
||||
'checksum': spotify_obj['snapshot_id'],
|
||||
'collaborative': spotify_obj['collaborative'],
|
||||
'creation_date': "????-00-00",
|
||||
'creator': {'id': spotify_obj['owner']['id'], 'name': spotify_obj['owner']['display_name'],
|
||||
'tracklist': spotify_obj['owner']['href'], 'type': "user"},
|
||||
'description': spotify_obj['description'],
|
||||
'duration': 0,
|
||||
'fans': spotify_obj['followers']['total'],
|
||||
'id': spotify_obj['id'],
|
||||
'is_loved_track': False,
|
||||
'link': spotify_obj['external_urls']['spotify'],
|
||||
'nb_tracks': spotify_obj['tracks']['total'],
|
||||
'picture': url,
|
||||
'picture_big': url,
|
||||
'picture_medium': url,
|
||||
'picture_small': url,
|
||||
'picture_xl': url,
|
||||
'public': spotify_obj['public'],
|
||||
'share': spotify_obj['external_urls']['spotify'],
|
||||
'title': spotify_obj['name'],
|
||||
'tracklist': spotify_obj['tracks']['href'],
|
||||
'type': "playlist"
|
||||
}
|
||||
return deezer_obj
|
||||
|
||||
def get_trackid_spotify(self, dz, track_id, fallbackSearch, spotifyTrack=None):
|
||||
if not self.spotifyEnabled:
|
||||
raise spotifyFeaturesNotEnabled
|
||||
if not spotifyTrack:
|
||||
spotify_track = self.sp.track(track_id)
|
||||
else:
|
||||
spotify_track = spotifyTrack
|
||||
dz_track = 0
|
||||
if 'external_ids' in spotify_track and 'isrc' in spotify_track['external_ids']:
|
||||
try:
|
||||
dz_track = dz.get_track_by_ISRC(spotify_track['external_ids']['isrc'])
|
||||
dz_track = dz_track['id'] if 'id' in dz_track else 0
|
||||
except:
|
||||
dz_track = dz.get_track_from_metadata(spotify_track['artists'][0]['name'], spotify_track['name'], spotify_track['album']['name']) if fallbackSearch else 0
|
||||
elif fallbackSearch:
|
||||
dz_track = dz.get_track_from_metadata(spotify_track['artists'][0]['name'], spotify_track['name'], spotify_track['album']['name'])
|
||||
return dz_track
|
||||
def get_trackid_spotify(self, dz, track_id, fallbackSearch, spotifyTrack=None):
|
||||
if not self.spotifyEnabled:
|
||||
raise spotifyFeaturesNotEnabled
|
||||
if not spotifyTrack:
|
||||
spotify_track = self.sp.track(track_id)
|
||||
else:
|
||||
spotify_track = spotifyTrack
|
||||
dz_track = 0
|
||||
if 'external_ids' in spotify_track and 'isrc' in spotify_track['external_ids']:
|
||||
try:
|
||||
dz_track = dz.get_track_by_ISRC(spotify_track['external_ids']['isrc'])
|
||||
dz_track = dz_track['id'] if 'id' in dz_track else 0
|
||||
except:
|
||||
dz_track = dz.get_track_from_metadata(spotify_track['artists'][0]['name'], spotify_track['name'],
|
||||
spotify_track['album']['name']) if fallbackSearch else 0
|
||||
elif fallbackSearch:
|
||||
dz_track = dz.get_track_from_metadata(spotify_track['artists'][0]['name'], spotify_track['name'],
|
||||
spotify_track['album']['name'])
|
||||
return dz_track
|
||||
|
||||
def get_albumid_spotify(self, dz, album_id):
|
||||
if not self.spotifyEnabled:
|
||||
raise spotifyFeaturesNotEnabled
|
||||
spotify_album = self.sp.album(album_id)
|
||||
dz_album = 0
|
||||
if 'external_ids' in spotify_album and 'upc' in spotify_album['external_ids']:
|
||||
try:
|
||||
dz_album = dz.get_album_by_UPC(spotify_album['external_ids']['upc'])
|
||||
dz_album = dz_album['id'] if 'id' in dz_album else 0
|
||||
except:
|
||||
try:
|
||||
dz_album = dz.get_album_by_UPC(int(spotify_album['external_ids']['upc']))
|
||||
dz_album = dz_album['id'] if 'id' in dz_album else 0
|
||||
except:
|
||||
dz_album = 0
|
||||
return dz_album
|
||||
def get_albumid_spotify(self, dz, album_id):
|
||||
if not self.spotifyEnabled:
|
||||
raise spotifyFeaturesNotEnabled
|
||||
spotify_album = self.sp.album(album_id)
|
||||
dz_album = 0
|
||||
if 'external_ids' in spotify_album and 'upc' in spotify_album['external_ids']:
|
||||
try:
|
||||
dz_album = dz.get_album_by_UPC(spotify_album['external_ids']['upc'])
|
||||
dz_album = dz_album['id'] if 'id' in dz_album else 0
|
||||
except:
|
||||
try:
|
||||
dz_album = dz.get_album_by_UPC(int(spotify_album['external_ids']['upc']))
|
||||
dz_album = dz_album['id'] if 'id' in dz_album else 0
|
||||
except:
|
||||
dz_album = 0
|
||||
return dz_album
|
||||
|
||||
def convert_spotify_playlist(self, dz, playlist_id, settings):
|
||||
if not self.spotifyEnabled:
|
||||
raise spotifyFeaturesNotEnabled
|
||||
spotify_playlist = self.sp.playlist(playlist_id)
|
||||
result = {
|
||||
'title': spotify_playlist['name'],
|
||||
'artist': spotify_playlist['owner']['display_name'],
|
||||
'size': spotify_playlist['tracks']['total'],
|
||||
'downloaded': 0,
|
||||
'failed': 0,
|
||||
'progress': 0,
|
||||
'type': 'spotify_playlist',
|
||||
'settings': settings or {},
|
||||
'id': playlist_id
|
||||
}
|
||||
if len(spotify_playlist['images']):
|
||||
result['cover'] = spotify_playlist['images'][0]['url']
|
||||
else:
|
||||
result[
|
||||
'cover'] = "https://e-cdns-images.dzcdn.net/images/cover/d41d8cd98f00b204e9800998ecf8427e/75x75-000000-80-0-0.jpg"
|
||||
playlistAPI = self._convert_playlist_structure(spotify_playlist)
|
||||
playlistAPI['various_artist'] = dz.get_artist(5080)
|
||||
tracklist = spotify_playlist['tracks']['items']
|
||||
result['collection'] = []
|
||||
while spotify_playlist['tracks']['next']:
|
||||
spotify_playlist['tracks'] = self.sp.next(spotify_playlist['tracks'])
|
||||
tracklist += spotify_playlist['tracks']['items']
|
||||
totalSize = len(tracklist)
|
||||
for pos, track in enumerate(tracklist, start=1):
|
||||
trackID = self.get_trackid_spotify(dz, 0, settings['fallbackSearch'], track['track'])
|
||||
if trackID == 0:
|
||||
deezerTrack = {
|
||||
'SNG_ID': 0,
|
||||
'SNG_TITLE': track['track']['name'],
|
||||
'DURATION': 0,
|
||||
'MD5_ORIGIN': 0,
|
||||
'MEDIA_VERSION': 0,
|
||||
'FILESIZE': 0,
|
||||
'ALB_TITLE': track['track']['album']['name'],
|
||||
'ALB_PICTURE': "",
|
||||
'ART_ID': 0,
|
||||
'ART_NAME': track['track']['artists'][0]['name']
|
||||
}
|
||||
else:
|
||||
deezerTrack = dz.get_track_gw(trackID)
|
||||
deezerTrack['_EXTRA_PLAYLIST'] = playlistAPI
|
||||
deezerTrack['POSITION'] = pos
|
||||
deezerTrack['SIZE'] = totalSize
|
||||
deezerTrack['FILENAME_TEMPLATE'] = settings['playlistTracknameTemplate']
|
||||
result['collection'].append(deezerTrack)
|
||||
return result
|
||||
|
||||
def convert_spotify_playlist(self, dz, playlist_id, settings):
|
||||
if not self.spotifyEnabled:
|
||||
raise spotifyFeaturesNotEnabled
|
||||
spotify_playlist = self.sp.playlist(playlist_id)
|
||||
result = {
|
||||
'title': spotify_playlist['name'],
|
||||
'artist': spotify_playlist['owner']['display_name'],
|
||||
'size': spotify_playlist['tracks']['total'],
|
||||
'downloaded': 0,
|
||||
'failed': 0,
|
||||
'progress': 0,
|
||||
'type': 'spotify_playlist',
|
||||
'settings': settings or {},
|
||||
'id': playlist_id
|
||||
}
|
||||
if len(spotify_playlist['images']):
|
||||
result['cover'] = spotify_playlist['images'][0]['url']
|
||||
else:
|
||||
result['cover'] = "https://e-cdns-images.dzcdn.net/images/cover/d41d8cd98f00b204e9800998ecf8427e/75x75-000000-80-0-0.jpg"
|
||||
playlistAPI = self._convert_playlist_structure(spotify_playlist)
|
||||
playlistAPI['various_artist'] = dz.get_artist(5080)
|
||||
tracklist = spotify_playlist['tracks']['items']
|
||||
result['collection'] = []
|
||||
while spotify_playlist['tracks']['next']:
|
||||
spotify_playlist['tracks'] = self.sp.next(spotify_playlist['tracks'])
|
||||
tracklist += spotify_playlist['tracks']['items']
|
||||
totalSize = len(tracklist)
|
||||
for pos, track in enumerate(tracklist, start=1):
|
||||
trackID = self.get_trackid_spotify(dz, 0, settings['fallbackSearch'], track['track'])
|
||||
if trackID == 0:
|
||||
deezerTrack = {
|
||||
'SNG_ID': 0,
|
||||
'SNG_TITLE': track['track']['name'],
|
||||
'DURATION': 0,
|
||||
'MD5_ORIGIN': 0,
|
||||
'MEDIA_VERSION': 0,
|
||||
'FILESIZE': 0,
|
||||
'ALB_TITLE': track['track']['album']['name'],
|
||||
'ALB_PICTURE': "",
|
||||
'ART_ID': 0,
|
||||
'ART_NAME': track['track']['artists'][0]['name']
|
||||
}
|
||||
else:
|
||||
deezerTrack = dz.get_track_gw(trackID)
|
||||
deezerTrack['_EXTRA_PLAYLIST'] = playlistAPI
|
||||
deezerTrack['POSITION'] = pos
|
||||
deezerTrack['SIZE'] = totalSize
|
||||
deezerTrack['FILENAME_TEMPLATE'] = settings['playlistTracknameTemplate']
|
||||
result['collection'].append(deezerTrack)
|
||||
return result
|
||||
|
||||
class spotifyFeaturesNotEnabled(Exception):
|
||||
pass
|
||||
pass
|
||||
|
Reference in New Issue
Block a user