Implemented fluent download bars
This commit is contained in:
parent
ba6078e34d
commit
fedacde6a1
|
@ -10,6 +10,7 @@ from requests import get
|
||||||
from requests.exceptions import HTTPError, ConnectionError
|
from requests.exceptions import HTTPError, ConnectionError
|
||||||
from tempfile import gettempdir
|
from tempfile import gettempdir
|
||||||
from concurrent.futures import ThreadPoolExecutor
|
from concurrent.futures import ThreadPoolExecutor
|
||||||
|
from Cryptodome.Cipher import Blowfish
|
||||||
from time import sleep
|
from time import sleep
|
||||||
import re
|
import re
|
||||||
|
|
||||||
|
@ -26,6 +27,38 @@ extensions = {
|
||||||
14: '.mp4',
|
14: '.mp4',
|
||||||
13: '.mp4'
|
13: '.mp4'
|
||||||
}
|
}
|
||||||
|
downloadPercentage = 0
|
||||||
|
lastPercentage = 0
|
||||||
|
|
||||||
|
def stream_track(dz, track, stream, trackAPI, uuid, socket=None):
|
||||||
|
global downloadPercentage, lastPercentage
|
||||||
|
try:
|
||||||
|
request = get(track['downloadUrl'], headers=dz.http_headers, stream=True, timeout=30)
|
||||||
|
except Exception as e:
|
||||||
|
sleep(2)
|
||||||
|
return stream_track(dz, track, stream, trackAPI, uuid, socket)
|
||||||
|
request.raise_for_status()
|
||||||
|
blowfish_key = str.encode(dz._get_blowfish_key(str(track['id'])))
|
||||||
|
complete = track['selectedFilesize']
|
||||||
|
chunkLength = 0
|
||||||
|
percentage = 0
|
||||||
|
i = 0
|
||||||
|
for chunk in request.iter_content(2048):
|
||||||
|
if (i % 3) == 0 and len(chunk) == 2048:
|
||||||
|
chunk = Blowfish.new(blowfish_key, Blowfish.MODE_CBC, b"\x00\x01\x02\x03\x04\x05\x06\x07").decrypt(chunk)
|
||||||
|
stream.write(chunk)
|
||||||
|
chunkLength += len(chunk)
|
||||||
|
if 'SINGLE_TRACK' in trackAPI:
|
||||||
|
percentage = (chunkLength / complete) * 100
|
||||||
|
downloadPercentage = percentage
|
||||||
|
else:
|
||||||
|
chunkProgres = (len(chunk) / complete) / trackAPI['SIZE'] * 100
|
||||||
|
downloadPercentage += chunkProgres
|
||||||
|
if round(downloadPercentage) != lastPercentage and round(percentage) % 5 == 0:
|
||||||
|
lastPercentage = round(downloadPercentage)
|
||||||
|
if socket:
|
||||||
|
socket.emit("updateQueue", {'uuid': uuid, 'progress': lastPercentage})
|
||||||
|
i += 1
|
||||||
|
|
||||||
def downloadImage(url, path):
|
def downloadImage(url, path):
|
||||||
if not os.path.isfile(path):
|
if not os.path.isfile(path):
|
||||||
|
@ -60,7 +93,6 @@ def formatDate(date, template):
|
||||||
template = template.replace('D', str(date['day']))
|
template = template.replace('D', str(date['day']))
|
||||||
return template
|
return template
|
||||||
|
|
||||||
|
|
||||||
def getPreferredBitrate(filesize, bitrate, fallback=True):
|
def getPreferredBitrate(filesize, bitrate, fallback=True):
|
||||||
if not fallback:
|
if not fallback:
|
||||||
formats = {9: 'flac', 3: 'mp3_320', 1: 'mp3_128', 15: '360_hq', 14: '360_mq', 13: '360_lq'}
|
formats = {9: 'flac', 3: 'mp3_320', 1: 'mp3_128', 15: '360_hq', 14: '360_mq', 13: '360_lq'}
|
||||||
|
@ -468,7 +500,7 @@ def downloadTrackObj(dz, trackAPI, settings, bitrate, uuid, extraTrack=None, soc
|
||||||
track['downloadUrl'] = dz.get_track_stream_url(track['id'], track['MD5'], track['mediaVersion'], track['selectedFormat'])
|
track['downloadUrl'] = dz.get_track_stream_url(track['id'], track['MD5'], track['mediaVersion'], track['selectedFormat'])
|
||||||
try:
|
try:
|
||||||
with open(writepath, 'wb') as stream:
|
with open(writepath, 'wb') as stream:
|
||||||
dz.stream_track(track['id'], track['downloadUrl'], stream)
|
stream_track(dz, track, stream, trackAPI, uuid, socket)
|
||||||
except HTTPError:
|
except HTTPError:
|
||||||
remove(writepath)
|
remove(writepath)
|
||||||
if track['selectedFormat'] == 9 and settings['fallbackBitrate']:
|
if track['selectedFormat'] == 9 and settings['fallbackBitrate']:
|
||||||
|
@ -518,8 +550,11 @@ def downloadTrackObj(dz, trackAPI, settings, bitrate, uuid, extraTrack=None, soc
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def download(dz, queueItem, socket=None):
|
def download(dz, queueItem, socket=None):
|
||||||
|
global downloadPercentage, lastPercentage
|
||||||
settings = queueItem['settings']
|
settings = queueItem['settings']
|
||||||
bitrate = queueItem['bitrate']
|
bitrate = queueItem['bitrate']
|
||||||
|
downloadPercentage = 0
|
||||||
|
lastPercentage = 0
|
||||||
if 'single' in queueItem:
|
if 'single' in queueItem:
|
||||||
result = downloadTrackObj(dz, queueItem['single'], settings, bitrate, queueItem['uuid'], socket=socket)
|
result = downloadTrackObj(dz, queueItem['single'], settings, bitrate, queueItem['uuid'], socket=socket)
|
||||||
download_path = after_download_single(result, settings)
|
download_path = after_download_single(result, settings)
|
||||||
|
|
|
@ -80,10 +80,12 @@ def generateQueueItem(dz, url, settings, bitrate=None, albumAPI=None):
|
||||||
result['bitrate'] = bitrate
|
result['bitrate'] = bitrate
|
||||||
result['uuid'] = f"{result['type']}_{id}_{bitrate}"
|
result['uuid'] = f"{result['type']}_{id}_{bitrate}"
|
||||||
result['settings'] = settings or {}
|
result['settings'] = settings or {}
|
||||||
|
totalSize = len(tracksArray)
|
||||||
result['collection'] = []
|
result['collection'] = []
|
||||||
for pos, trackAPI in enumerate(tracksArray, start=1):
|
for pos, trackAPI in enumerate(tracksArray, start=1):
|
||||||
trackAPI['_EXTRA_ALBUM'] = albumAPI
|
trackAPI['_EXTRA_ALBUM'] = albumAPI
|
||||||
trackAPI['POSITION'] = pos
|
trackAPI['POSITION'] = pos
|
||||||
|
trackAPI['SIZE'] = totalSize
|
||||||
trackAPI['FILENAME_TEMPLATE'] = settings['albumTracknameTemplate']
|
trackAPI['FILENAME_TEMPLATE'] = settings['albumTracknameTemplate']
|
||||||
result['collection'].append(trackAPI)
|
result['collection'].append(trackAPI)
|
||||||
|
|
||||||
|
@ -103,10 +105,12 @@ def generateQueueItem(dz, url, settings, bitrate=None, albumAPI=None):
|
||||||
result['bitrate'] = bitrate
|
result['bitrate'] = bitrate
|
||||||
result['uuid'] = f"{result['type']}_{id}_{bitrate}"
|
result['uuid'] = f"{result['type']}_{id}_{bitrate}"
|
||||||
result['settings'] = settings or {}
|
result['settings'] = settings or {}
|
||||||
|
totalSize = len(playlistTracksAPI)
|
||||||
result['collection'] = []
|
result['collection'] = []
|
||||||
for pos, trackAPI in enumerate(playlistTracksAPI, start=1):
|
for pos, trackAPI in enumerate(playlistTracksAPI, start=1):
|
||||||
trackAPI['_EXTRA_PLAYLIST'] = playlistAPI
|
trackAPI['_EXTRA_PLAYLIST'] = playlistAPI
|
||||||
trackAPI['POSITION'] = pos
|
trackAPI['POSITION'] = pos
|
||||||
|
trackAPI['SIZE'] = totalSize
|
||||||
trackAPI['FILENAME_TEMPLATE'] = settings['playlistTracknameTemplate']
|
trackAPI['FILENAME_TEMPLATE'] = settings['playlistTracknameTemplate']
|
||||||
result['collection'].append(trackAPI)
|
result['collection'].append(trackAPI)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue