Started queuemanager refactoring

This commit is contained in:
RemixDev 2021-02-11 19:05:06 +01:00
parent e47a2863e8
commit bd8a1948d4
No known key found for this signature in database
GPG Key ID: B33962B465BDB51C
3 changed files with 33 additions and 21 deletions

View File

@ -6,7 +6,6 @@ from deemix.app.spotifyhelper import SpotifyHelper
class deemix: class deemix:
def __init__(self, configFolder=None, overwriteDownloadFolder=None): def __init__(self, configFolder=None, overwriteDownloadFolder=None):
self.set = Settings(configFolder, overwriteDownloadFolder=overwriteDownloadFolder) self.set = Settings(configFolder, overwriteDownloadFolder=overwriteDownloadFolder)
self.dz = Deezer() self.dz = Deezer(self.set.settings.get('tagsLanguage'))
self.dz.set_accept_language(self.set.settings.get('tagsLanguage'))
self.sp = SpotifyHelper(configFolder) self.sp = SpotifyHelper(configFolder)
self.qm = QueueManager(self.sp) self.qm = QueueManager(self.dz, self.sp)

View File

@ -1,6 +1,5 @@
import requests import requests
get = requests.get from requests import get
request_exception = requests.exceptions
from concurrent.futures import ThreadPoolExecutor from concurrent.futures import ThreadPoolExecutor
from time import sleep from time import sleep
@ -68,7 +67,7 @@ def downloadImage(url, path, overwrite=OverwriteOption.DONT_OVERWRITE):
with open(path, 'wb') as f: with open(path, 'wb') as f:
f.write(image.content) f.write(image.content)
return path return path
except request_exception.HTTPError: except requests.exceptions.HTTPError:
if 'cdns-images.dzcdn.net' in url: if 'cdns-images.dzcdn.net' in url:
urlBase = url[:url.rfind("/")+1] urlBase = url[:url.rfind("/")+1]
pictureUrl = url[len(urlBase):] pictureUrl = url[len(urlBase):]
@ -78,7 +77,7 @@ def downloadImage(url, path, overwrite=OverwriteOption.DONT_OVERWRITE):
sleep(1) sleep(1)
return downloadImage(urlBase+pictureUrl.replace(str(pictureSize)+"x"+str(pictureSize), '1200x1200'), path, overwrite) return downloadImage(urlBase+pictureUrl.replace(str(pictureSize)+"x"+str(pictureSize), '1200x1200'), path, overwrite)
logger.error("Image not found: "+url) logger.error("Image not found: "+url)
except (request_exception.ConnectionError, request_exception.ChunkedEncodingError, u3SSLError) as e: except (requests.exceptions.ConnectionError, requests.exceptions.ChunkedEncodingError, u3SSLError) as e:
logger.error("Couldn't download Image, retrying in 5 seconds...: "+url+"\n") logger.error("Couldn't download Image, retrying in 5 seconds...: "+url+"\n")
sleep(5) sleep(5)
return downloadImage(url, path, overwrite) return downloadImage(url, path, overwrite)
@ -492,7 +491,7 @@ class DownloadJob:
except DownloadCancelled: except DownloadCancelled:
if writepath.is_file(): writepath.unlink() if writepath.is_file(): writepath.unlink()
raise DownloadCancelled raise DownloadCancelled
except (request_exception.HTTPError, DownloadEmpty): except (requests.exceptions.HTTPError, DownloadEmpty):
if writepath.is_file(): writepath.unlink() if writepath.is_file(): writepath.unlink()
if track.fallbackId != "0": if track.fallbackId != "0":
logger.warn(f"[{track.mainArtist.name} - {track.title}] Track not available, using fallback id") logger.warn(f"[{track.mainArtist.name} - {track.title}] Track not available, using fallback id")
@ -523,7 +522,7 @@ class DownloadJob:
raise DownloadFailed("notAvailableNoAlternative") raise DownloadFailed("notAvailableNoAlternative")
else: else:
raise DownloadFailed("notAvailable") raise DownloadFailed("notAvailable")
except (request_exception.ConnectionError, request_exception.ChunkedEncodingError) as e: except (requests.exceptions.ConnectionError, requests.exceptions.ChunkedEncodingError) as e:
if writepath.is_file(): writepath.unlink() if writepath.is_file(): writepath.unlink()
logger.warn(f"[{track.mainArtist.name} - {track.title}] Error while downloading the track, trying again in 5s...") logger.warn(f"[{track.mainArtist.name} - {track.title}] Error while downloading the track, trying again in 5s...")
sleep(5) sleep(5)
@ -616,7 +615,7 @@ class DownloadJob:
try: try:
request.raise_for_status() request.raise_for_status()
return formatNumber return formatNumber
except request_exception.HTTPError: # if the format is not available, Deezer returns a 403 error except requests.exceptions.HTTPError: # if the format is not available, Deezer returns a 403 error
pass pass
if not shouldFallback: if not shouldFallback:
raise PreferredBitrateNotFound raise PreferredBitrateNotFound
@ -680,7 +679,7 @@ class DownloadJob:
except (SSLError, u3SSLError) as e: except (SSLError, u3SSLError) as e:
logger.info(f'{itemName} retrying from byte {chunkLength}') logger.info(f'{itemName} retrying from byte {chunkLength}')
return self.streamTrack(stream, track, chunkLength) return self.streamTrack(stream, track, chunkLength)
except (request_exception.ConnectionError, requests.exceptions.ReadTimeout): except (requests.exceptions.ConnectionError, requests.exceptions.ReadTimeout):
sleep(2) sleep(2)
return self.streamTrack(stream, track, start) return self.streamTrack(stream, track, start)

View File

@ -1,8 +1,11 @@
from deemix.app.downloadjob import DownloadJob from deemix.app.downloadjob import DownloadJob
from deemix.utils import getIDFromLink, getTypeFromLink, getBitrateInt from deemix.utils import getIDFromLink, getTypeFromLink, getBitrateInt
from deezer import Deezer
from deezer.gw import APIError as gwAPIError, LyricsStatus from deezer.gw import APIError as gwAPIError, LyricsStatus
from deezer.api import APIError from deezer.api import APIError
from deezer.utils import map_user_playlist from deezer.utils import map_user_playlist
from spotipy.exceptions import SpotifyException from spotipy.exceptions import SpotifyException
from deemix.app.queueitem import QueueItem, QISingle, QICollection, QIConvertable from deemix.app.queueitem import QueueItem, QISingle, QICollection, QIConvertable
import logging import logging
@ -16,14 +19,16 @@ logging.basicConfig(level=logging.INFO)
logger = logging.getLogger('deemix') logger = logging.getLogger('deemix')
class QueueManager: class QueueManager:
def __init__(self, spotifyHelper=None): def __init__(self, deezerHelper=None, spotifyHelper=None):
self.queue = [] self.queue = []
self.queueList = {} self.queueList = {}
self.queueComplete = [] self.queueComplete = []
self.currentItem = "" self.currentItem = ""
self.dz = deezerHelper or Deezer()
self.sp = spotifyHelper self.sp = spotifyHelper
def generateTrackQueueItem(self, dz, id, settings, bitrate, trackAPI=None, albumAPI=None): def generateTrackQueueItem(self, id, settings, bitrate, trackAPI=None, albumAPI=None, dz=None):
if not dz: dz = self.dz
# Check if is an isrc: url # Check if is an isrc: url
if str(id).startswith("isrc"): if str(id).startswith("isrc"):
try: try:
@ -72,7 +77,8 @@ class QueueManager:
single=trackAPI_gw, single=trackAPI_gw,
) )
def generateAlbumQueueItem(self, dz, id, settings, bitrate, rootArtist=None): def generateAlbumQueueItem(self, id, settings, bitrate, rootArtist=None, dz=None):
if not dz: dz = self.dz
# Get essential album info # Get essential album info
try: try:
albumAPI = dz.api.get_album(id) albumAPI = dz.api.get_album(id)
@ -125,7 +131,8 @@ class QueueManager:
collection=collection, collection=collection,
) )
def generatePlaylistQueueItem(self, dz, id, settings, bitrate): def generatePlaylistQueueItem(self, id, settings, bitrate, dz=None):
if not dz: dz = self.dz
# Get essential playlist info # Get essential playlist info
try: try:
playlistAPI = dz.api.get_playlist(id) playlistAPI = dz.api.get_playlist(id)
@ -178,7 +185,8 @@ class QueueManager:
collection=collection, collection=collection,
) )
def generateArtistQueueItem(self, dz, id, settings, bitrate, interface=None): def generateArtistQueueItem(self, id, settings, bitrate, dz=None, interface=None):
if not dz: dz = self.dz
# Get essential artist info # Get essential artist info
try: try:
artistAPI = dz.api.get_artist(id) artistAPI = dz.api.get_artist(id)
@ -201,7 +209,8 @@ class QueueManager:
if interface: interface.send("finishAddingArtist", {'name': artistAPI['name'], 'id': artistAPI['id']}) if interface: interface.send("finishAddingArtist", {'name': artistAPI['name'], 'id': artistAPI['id']})
return albumList return albumList
def generateArtistDiscographyQueueItem(self, dz, id, settings, bitrate, interface=None): def generateArtistDiscographyQueueItem(self, id, settings, bitrate, dz=None, interface=None):
if not dz: dz = self.dz
# Get essential artist info # Get essential artist info
try: try:
artistAPI = dz.api.get_artist(id) artistAPI = dz.api.get_artist(id)
@ -225,7 +234,8 @@ class QueueManager:
if interface: interface.send("finishAddingArtist", {'name': artistAPI['name'], 'id': artistAPI['id']}) if interface: interface.send("finishAddingArtist", {'name': artistAPI['name'], 'id': artistAPI['id']})
return albumList return albumList
def generateArtistTopQueueItem(self, dz, id, settings, bitrate, interface=None): def generateArtistTopQueueItem(self, id, settings, bitrate, dz=None, interface=None):
if not dz: dz = self.dz
# Get essential artist info # Get essential artist info
try: try:
artistAPI = dz.api.get_artist(id) artistAPI = dz.api.get_artist(id)
@ -293,7 +303,8 @@ class QueueManager:
collection=collection, collection=collection,
) )
def generateQueueItem(self, dz, url, settings, bitrate=None, interface=None): def generateQueueItem(self, url, settings, bitrate=None, dz=None, interface=None):
if not dz: dz = self.dz
bitrate = getBitrateInt(bitrate) or settings['maxBitrate'] bitrate = getBitrateInt(bitrate) or settings['maxBitrate']
if 'deezer.page.link' in url: url = urlopen(url).url if 'deezer.page.link' in url: url = urlopen(url).url
if 'link.tospotify.com' in url: url = urlopen(url).url if 'link.tospotify.com' in url: url = urlopen(url).url
@ -359,7 +370,9 @@ class QueueManager:
logger.warn("URL not supported yet") logger.warn("URL not supported yet")
return QueueError(url, "URL not supported yet", "unsupportedURL") return QueueError(url, "URL not supported yet", "unsupportedURL")
def addToQueue(self, dz, url, settings, bitrate=None, interface=None, ack=None): def addToQueue(self, url, settings, bitrate=None, dz=None, interface=None, ack=None):
if not dz: dz = self.dz
if not dz.logged_in: if not dz.logged_in:
if interface: interface.send("loginNeededToDownload") if interface: interface.send("loginNeededToDownload")
return False return False
@ -430,7 +443,8 @@ class QueueManager:
self.nextItem(dz, interface) self.nextItem(dz, interface)
return True return True
def nextItem(self, dz, interface=None): def nextItem(self, dz=None, interface=None):
if not dz: dz = self.dz
# Check that nothing is already downloading and # Check that nothing is already downloading and
# that the queue is not empty # that the queue is not empty
if self.currentItem != "": return None if self.currentItem != "": return None