Started queuemanager refactoring
This commit is contained in:
parent
e47a2863e8
commit
bd8a1948d4
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue