Added logging system using python logging library
This commit is contained in:
parent
3925a8d2fb
commit
e07695047f
|
@ -26,7 +26,6 @@ Wait for it to finish, then run the `start.bat`<br>
|
|||
|
||||
## What's left to do?
|
||||
Library:
|
||||
- Add a log system
|
||||
- Write the API Documentation
|
||||
|
||||
in the WebUI:
|
||||
|
|
|
@ -15,6 +15,10 @@ from deemix.api.deezer import APIError, USER_AGENT_HEADER
|
|||
from deemix.utils.misc import changeCase
|
||||
from deemix.utils.pathtemplates import generateFilename, generateFilepath, settingsRegexAlbum, settingsRegexArtist
|
||||
from deemix.utils.taggers import tagID3, tagFLAC
|
||||
import logging
|
||||
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
logger = logging.getLogger('deemix')
|
||||
|
||||
TEMPDIR = os.path.join(gettempdir(), 'deemix-imgs')
|
||||
if not os.path.isdir(TEMPDIR):
|
||||
|
@ -80,7 +84,7 @@ def downloadImage(url, path):
|
|||
sleep(1)
|
||||
return downloadImage(url, path)
|
||||
except HTTPError:
|
||||
print("Couldn't download Image")
|
||||
logger.warn("Couldn't download Image")
|
||||
remove(path)
|
||||
return None
|
||||
else:
|
||||
|
@ -199,6 +203,7 @@ def getTrackData(dz, trackAPI_gw, trackAPI=None, albumAPI_gw=None, albumAPI=None
|
|||
if 'LYRICS_ID' in trackAPI_gw:
|
||||
track['lyrics']['id'] = trackAPI_gw['LYRICS_ID']
|
||||
if not "LYRICS" in trackAPI_gw and int(track['lyrics']['id']) != 0:
|
||||
logger.info(f"[{trackAPI_gw['ART_NAME']} - {track['title']}] Getting lyrics")
|
||||
trackAPI_gw["LYRICS"] = dz.get_lyrics_gw(track['id'])
|
||||
if int(track['lyrics']['id']) != 0:
|
||||
if "LYRICS_TEXT" in trackAPI_gw["LYRICS"]:
|
||||
|
@ -235,6 +240,7 @@ def getTrackData(dz, trackAPI_gw, trackAPI=None, albumAPI_gw=None, albumAPI=None
|
|||
|
||||
try:
|
||||
if not albumAPI:
|
||||
logger.info(f"[{track['mainArtist']['name']} - {track['title']}] Getting album infos")
|
||||
albumAPI = dz.get_album(track['album']['id'])
|
||||
track['album']['mainArtist'] = {
|
||||
'id': albumAPI['artist']['id'],
|
||||
|
@ -269,11 +275,13 @@ def getTrackData(dz, trackAPI_gw, trackAPI=None, albumAPI_gw=None, albumAPI=None
|
|||
track['album']['genre'].append(genre['name'])
|
||||
except APIError:
|
||||
if not albumAPI_gw:
|
||||
logger.info(f"[{track['mainArtist']['name']} - {track['title']}] Getting more album infos")
|
||||
albumAPI_gw = dz.get_album_gw(track['album']['id'])
|
||||
track['album']['mainArtist'] = {
|
||||
'id': albumAPI_gw['ART_ID'],
|
||||
'name': albumAPI_gw['ART_NAME']
|
||||
}
|
||||
logger.info(f"[{track['mainArtist']['name']} - {track['title']}] Getting artist picture fallback")
|
||||
artistAPI = dz.get_artist(track['album']['mainArtist']['id'])
|
||||
track['album']['artists'] = albumAPI_gw['ART_NAME']
|
||||
track['album']['mainArtist']['pic'] = artistAPI['picture_small'][
|
||||
|
@ -297,6 +305,7 @@ def getTrackData(dz, trackAPI_gw, trackAPI=None, albumAPI_gw=None, albumAPI=None
|
|||
track['date'] = track['album']['date']
|
||||
|
||||
if not trackAPI:
|
||||
logger.info(f"[{track['mainArtist']['name']} - {track['title']}] Getting extra track infos")
|
||||
trackAPI = dz.get_track(track['id'])
|
||||
track['bpm'] = trackAPI['bpm']
|
||||
if not 'replayGain' in track or not track['replayGain']:
|
||||
|
@ -316,10 +325,12 @@ def getTrackData(dz, trackAPI_gw, trackAPI=None, albumAPI_gw=None, albumAPI=None
|
|||
|
||||
if not 'discTotal' in track['album'] or not track['album']['discTotal']:
|
||||
if not albumAPI_gw:
|
||||
logger.info(f"[{track['mainArtist']['name']} - {track['title']}] Getting more album infos")
|
||||
albumAPI_gw = dz.get_album_gw(track['album']['id'])
|
||||
track['album']['discTotal'] = albumAPI_gw['NUMBER_DISK']
|
||||
if not 'copyright' in track or not track['copyright']:
|
||||
if not albumAPI_gw:
|
||||
logger.info(f"[{track['mainArtist']['name']} - {track['title']}] Getting more album infos")
|
||||
albumAPI_gw = dz.get_album_gw(track['album']['id'])
|
||||
track['copyright'] = albumAPI_gw['COPYRIGHT']
|
||||
|
||||
|
@ -399,6 +410,7 @@ def downloadTrackObj(dz, trackAPI, settings, bitrate, queueItem, extraTrack=None
|
|||
'error': "Track not available on Deezer!"})
|
||||
return result
|
||||
# Get the metadata
|
||||
logger.info(f"[{trackAPI['ART_NAME']} - {trackAPI['SNG_TITLE']}] Getting the tags")
|
||||
if extraTrack:
|
||||
track = extraTrack
|
||||
else:
|
||||
|
@ -410,17 +422,16 @@ def downloadTrackObj(dz, trackAPI, settings, bitrate, queueItem, extraTrack=None
|
|||
if 'cancel' in queueItem:
|
||||
result['cancel'] = True
|
||||
return result
|
||||
print('Downloading: {} - {}'.format(track['mainArtist']['name'], track['title']))
|
||||
if track['MD5'] == '':
|
||||
if track['fallbackId'] != 0:
|
||||
print("Track not yet encoded, using fallback id")
|
||||
logger.warn(f"[{track['mainArtist']['name']} - {track['title']}] Track not yet encoded, using fallback id")
|
||||
trackNew = dz.get_track_gw(track['fallbackId'])
|
||||
if not 'MD5_ORIGIN' in trackNew:
|
||||
trackNew['MD5_ORIGIN'] = dz.get_track_md5(trackNew['SNG_ID'])
|
||||
track = parseEssentialTrackData(track, trackNew)
|
||||
return downloadTrackObj(dz, trackAPI, settings, bitrate, queueItem, extraTrack=track, interface=interface)
|
||||
elif not 'searched' in track and settings['fallbackSearch']:
|
||||
print("Track not yet encoded, searching for alternative")
|
||||
logger.warn(f"[{track['mainArtist']['name']} - {track['title']}] Track not yet encoded, searching for alternative")
|
||||
searchedId = dz.get_track_from_metadata(track['mainArtist']['name'], track['title'],
|
||||
track['album']['title'])
|
||||
if searchedId != 0:
|
||||
|
@ -432,7 +443,7 @@ def downloadTrackObj(dz, trackAPI, settings, bitrate, queueItem, extraTrack=None
|
|||
return downloadTrackObj(dz, trackAPI, settings, bitrate, queueItem, extraTrack=track,
|
||||
interface=interface)
|
||||
else:
|
||||
print("ERROR: Track not yet encoded and no alternative found!")
|
||||
logger.error(f"[{track['mainArtist']['name']} - {track['title']}] Track not yet encoded and no alternative found!")
|
||||
result['error'] = {
|
||||
'message': "Track not yet encoded and no alternative found!",
|
||||
'data': track
|
||||
|
@ -443,7 +454,7 @@ def downloadTrackObj(dz, trackAPI, settings, bitrate, queueItem, extraTrack=None
|
|||
'error': "Track not yet encoded and no alternative found!"})
|
||||
return result
|
||||
else:
|
||||
print("ERROR: Track not yet encoded!")
|
||||
logger.error(f"[{track['mainArtist']['name']} - {track['title']}] Track not yet encoded!")
|
||||
result['error'] = {
|
||||
'message': "Track not yet encoded!",
|
||||
'data': track
|
||||
|
@ -457,7 +468,7 @@ def downloadTrackObj(dz, trackAPI, settings, bitrate, queueItem, extraTrack=None
|
|||
# Get the selected bitrate
|
||||
format = getPreferredBitrate(dz, track, bitrate, settings['fallbackBitrate'])
|
||||
if format == -100:
|
||||
print("ERROR: Track not found at desired bitrate. Enable fallback to lower bitrates to fix this issue.")
|
||||
logger.error(f"[{track['mainArtist']['name']} - {track['title']}] Track not found at desired bitrate. Enable fallback to lower bitrates to fix this issue.")
|
||||
result['error'] = {
|
||||
'message': "Track not found at desired bitrate.",
|
||||
'data': track
|
||||
|
@ -468,7 +479,7 @@ def downloadTrackObj(dz, trackAPI, settings, bitrate, queueItem, extraTrack=None
|
|||
'error': "Track not found at desired bitrate."})
|
||||
return result
|
||||
elif format == -200:
|
||||
print("ERROR: This track is not available in 360 Reality Audio format. Please select another format.")
|
||||
logger.error(f"[{track['mainArtist']['name']} - {track['title']}] This track is not available in 360 Reality Audio format. Please select another format.")
|
||||
result['error'] = {
|
||||
'message': "Track is not available in Reality Audio 360.",
|
||||
'data': track
|
||||
|
@ -564,6 +575,7 @@ def downloadTrackObj(dz, trackAPI, settings, bitrate, queueItem, extraTrack=None
|
|||
else:
|
||||
track['album']['picPath'] = os.path.join(TEMPDIR,
|
||||
f"alb{track['album']['id']}_{settings['embeddedArtworkSize']}.{'png' if settings['PNGcovers'] else 'jpg'}")
|
||||
logger.info(f"[{track['mainArtist']['name']} - {track['title']}] Getting the album cover")
|
||||
track['album']['picPath'] = downloadImage(track['album']['picUrl'], track['album']['picPath'])
|
||||
|
||||
if os.path.sep in filename:
|
||||
|
@ -575,7 +587,6 @@ def downloadTrackObj(dz, trackAPI, settings, bitrate, queueItem, extraTrack=None
|
|||
|
||||
# Save lyrics in lrc file
|
||||
if settings['syncedLyrics'] and 'sync' in track['lyrics']:
|
||||
print(filepath, filename)
|
||||
with open(os.path.join(filepath, filename + '.lrc'), 'wb') as f:
|
||||
f.write(track['lyrics']['sync'].encode('utf-8'))
|
||||
|
||||
|
@ -602,6 +613,7 @@ def downloadTrackObj(dz, trackAPI, settings, bitrate, queueItem, extraTrack=None
|
|||
|
||||
track['downloadUrl'] = dz.get_track_stream_url(track['id'], track['MD5'], track['mediaVersion'],
|
||||
track['selectedFormat'])
|
||||
logger.info(f"[{track['mainArtist']['name']} - {track['title']}] Downloading the track")
|
||||
try:
|
||||
with open(writepath, 'wb') as stream:
|
||||
stream_track(dz, track, stream, trackAPI, queueItem, interface)
|
||||
|
@ -612,14 +624,14 @@ def downloadTrackObj(dz, trackAPI, settings, bitrate, queueItem, extraTrack=None
|
|||
except HTTPError:
|
||||
remove(writepath)
|
||||
if track['fallbackId'] != 0:
|
||||
print("Track not available, using fallback id")
|
||||
logger.warn(f"[{track['mainArtist']['name']} - {track['title']}] Track not available, using fallback id")
|
||||
trackNew = dz.get_track_gw(track['fallbackId'])
|
||||
if not 'MD5_ORIGIN' in trackNew:
|
||||
trackNew['MD5_ORIGIN'] = dz.get_track_md5(trackNew['SNG_ID'])
|
||||
track = parseEssentialTrackData(track, trackNew)
|
||||
return downloadTrackObj(dz, trackAPI, settings, bitrate, queueItem, extraTrack=track, interface=interface)
|
||||
elif not 'searched' in track and settings['fallbackSearch']:
|
||||
print("Track not available, searching for alternative")
|
||||
logger.warn(f"[{track['mainArtist']['name']} - {track['title']}] Track not available, searching for alternative")
|
||||
searchedId = dz.get_track_from_metadata(track['mainArtist']['name'], track['title'],
|
||||
track['album']['title'])
|
||||
if searchedId != 0:
|
||||
|
@ -631,7 +643,7 @@ def downloadTrackObj(dz, trackAPI, settings, bitrate, queueItem, extraTrack=None
|
|||
return downloadTrackObj(dz, trackAPI, settings, bitrate, queueItem, extraTrack=track,
|
||||
interface=interface)
|
||||
else:
|
||||
print("ERROR: Track not available on deezer's servers and no alternative found!")
|
||||
logger.error(f"[{track['mainArtist']['name']} - {track['title']}] Track not available on deezer's servers and no alternative found!")
|
||||
result['error'] = {
|
||||
'message': "Track not available on deezer's servers and no alternative found!",
|
||||
'data': track
|
||||
|
@ -642,7 +654,7 @@ def downloadTrackObj(dz, trackAPI, settings, bitrate, queueItem, extraTrack=None
|
|||
'error': "Track not available on deezer's servers and no alternative found!"})
|
||||
return result
|
||||
else:
|
||||
print("ERROR: Track not available on deezer's servers!")
|
||||
logger.error(f"[{track['mainArtist']['name']} - {track['title']}] Track not available on deezer's servers!")
|
||||
result['error'] = {
|
||||
'message': "Track not available on deezer's servers!",
|
||||
'data': track
|
||||
|
@ -652,13 +664,14 @@ def downloadTrackObj(dz, trackAPI, settings, bitrate, queueItem, extraTrack=None
|
|||
interface.send("updateQueue", {'uuid': queueItem['uuid'], 'failed': True, 'data': track,
|
||||
'error': "Track not available on deezer's servers!"})
|
||||
return result
|
||||
logger.info(f"[{track['mainArtist']['name']} - {track['title']}] Applying tags to the track")
|
||||
if track['selectedFormat'] in [3, 1, 8]:
|
||||
tagID3(writepath, track, settings['tags'])
|
||||
elif track['selectedFormat'] == 9:
|
||||
tagFLAC(writepath, track, settings['tags'])
|
||||
if 'searched' in track:
|
||||
result['searched'] = f'{track["mainArtist"]["name"]} - {track["title"]}'
|
||||
print("Done!")
|
||||
logger.info(f"[{track['mainArtist']['name']} - {track['title']}] Track download completed")
|
||||
if interface:
|
||||
queueItem['downloaded'] += 1
|
||||
interface.send("updateQueue", {'uuid': queueItem['uuid'], 'downloaded': True})
|
||||
|
@ -713,7 +726,6 @@ def download(dz, queueItem, interface=None):
|
|||
interface.send("updateQueue", {'uuid': queueItem['uuid'], 'failed': True})
|
||||
download_path = after_download_single(result, settings, queueItem)
|
||||
elif 'collection' in queueItem:
|
||||
print("Downloading collection")
|
||||
playlist = [None] * len(queueItem['collection'])
|
||||
with ThreadPoolExecutor(settings['queueConcurrency']) as executor:
|
||||
for pos, track in enumerate(queueItem['collection'], start=0):
|
||||
|
|
|
@ -1,6 +1,10 @@
|
|||
#!/usr/bin/env python3
|
||||
from deemix.app.downloader import download
|
||||
from deemix.utils.misc import getIDFromLink, getTypeFromLink, getBitrateInt
|
||||
import logging
|
||||
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
logger = logging.getLogger('deemix')
|
||||
|
||||
queue = []
|
||||
queueList = {}
|
||||
|
@ -41,7 +45,7 @@ def generateQueueItem(dz, sp, url, settings, bitrate=None, albumAPI=None, interf
|
|||
id = getIDFromLink(url, type)
|
||||
result = {}
|
||||
if type == None or id == None:
|
||||
print("URL not recognized")
|
||||
logger.warn("URL not recognized")
|
||||
result['error'] = "URL not recognized"
|
||||
elif type == "track":
|
||||
trackAPI = dz.get_track_gw(id)
|
||||
|
@ -136,7 +140,7 @@ def generateQueueItem(dz, sp, url, settings, bitrate=None, albumAPI=None, interf
|
|||
}
|
||||
playlistAPI = newPlaylist
|
||||
if not playlistAPI['public'] and playlistAPI['creator']['id'] != str(dz.user['id']):
|
||||
print("You can't download others private playlists.")
|
||||
logger.warn("You can't download others private playlists.")
|
||||
result['error'] = "You can't download others private playlists."
|
||||
return result
|
||||
|
||||
|
@ -182,31 +186,31 @@ def generateQueueItem(dz, sp, url, settings, bitrate=None, albumAPI=None, interf
|
|||
elif type == "spotifytrack":
|
||||
result = {}
|
||||
if not sp.spotifyEnabled:
|
||||
print("Spotify Features is not setted up correctly.")
|
||||
logger.warn("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!")
|
||||
logger.warn("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.")
|
||||
logger.warn("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!")
|
||||
logger.warn("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.")
|
||||
logger.warn("Spotify Features is not setted up correctly.")
|
||||
result['error'] = "Spotify Features is not setted up correctly."
|
||||
return result
|
||||
if interface:
|
||||
|
@ -221,7 +225,7 @@ def generateQueueItem(dz, sp, url, settings, bitrate=None, albumAPI=None, interf
|
|||
interface.send("toast", {'msg': f"Spotify playlist converted", 'icon': 'done', 'dismiss': True,
|
||||
'id': 'spotifyplaylist_' + str(id)})
|
||||
else:
|
||||
print("URL not supported yet")
|
||||
logger.warn("URL not supported yet")
|
||||
result['error'] = "URL not supported yet"
|
||||
return result
|
||||
|
||||
|
@ -230,25 +234,29 @@ def addToQueue(dz, sp, url, settings, bitrate=None, interface=None):
|
|||
global currentItem, queueList, queue
|
||||
if not dz.logged_in:
|
||||
return "Not logged in"
|
||||
logger.info("Generating queue item for: "+url)
|
||||
queueItem = generateQueueItem(dz, sp, url, settings, bitrate, interface=interface)
|
||||
if type(queueItem) is list:
|
||||
for x in queueItem:
|
||||
if 'error' in x:
|
||||
logger.error(f"[{x['uuid']}] {x['error']}")
|
||||
continue
|
||||
if x['uuid'] in list(queueList.keys()):
|
||||
print("Already in queue!")
|
||||
logger.warn(f"[{x['uuid']}] Already in queue, will not be added again.")
|
||||
continue
|
||||
if interface:
|
||||
interface.send("addedToQueue", slimQueueItem(x))
|
||||
logger.info(f"[{x['uuid']}] Added to queue.")
|
||||
queue.append(x['uuid'])
|
||||
queueList[x['uuid']] = x
|
||||
else:
|
||||
if 'error' in queueItem:
|
||||
logger.error(f"[{queueItem['uuid']}] {queueItem['error']}")
|
||||
if interface:
|
||||
interface.send("toast", {'msg': queueItem['error'], 'icon': 'error'})
|
||||
return False
|
||||
if queueItem['uuid'] in list(queueList.keys()):
|
||||
print("Already in queue!")
|
||||
logger.warn(f"[{queueItem['uuid']}] Already in queue, will not be added again.")
|
||||
if interface:
|
||||
interface.send("toast",
|
||||
{'msg': f"{queueItem['title']} is already in queue!", 'icon': 'playlist_add_check'})
|
||||
|
@ -256,6 +264,7 @@ def addToQueue(dz, sp, url, settings, bitrate=None, interface=None):
|
|||
if interface:
|
||||
interface.send("addedToQueue", slimQueueItem(queueItem))
|
||||
interface.send("toast", {'msg': f"{queueItem['title']} added to queue", 'icon': 'playlist_add'})
|
||||
logger.info(f"[{queueItem['uuid']}] Added to queue.")
|
||||
queue.append(queueItem['uuid'])
|
||||
queueList[queueItem['uuid']] = queueItem
|
||||
nextItem(dz, interface)
|
||||
|
@ -273,6 +282,7 @@ def nextItem(dz, interface=None):
|
|||
return None
|
||||
if interface:
|
||||
interface.send("startDownload", currentItem)
|
||||
logger.info(f"[{currentItem}] Started downloading.")
|
||||
result = download(dz, queueList[currentItem], interface)
|
||||
callbackQueueDone(result)
|
||||
|
||||
|
@ -283,6 +293,7 @@ def callbackQueueDone(result):
|
|||
del queueList[currentItem]
|
||||
else:
|
||||
queueComplete.append(currentItem)
|
||||
logger.info(f"[{currentItem}] Finished downloading.")
|
||||
currentItem = ""
|
||||
nextItem(result['dz'], result['interface'])
|
||||
|
||||
|
|
Loading…
Reference in New Issue