qobuz-dl/qo_utils/downloader.py

101 lines
3.2 KiB
Python
Raw Normal View History

2020-08-10 04:47:51 +02:00
import os
import requests
from qo_utils import metadata
2020-10-05 17:02:33 +02:00
from pathvalidate import sanitize_filename
2020-08-10 04:47:51 +02:00
from tqdm import tqdm
def req_tqdm(url, fname, track_name):
r = requests.get(url, allow_redirects=True, stream=True)
total = int(r.headers.get('content-length', 0))
with open(fname, 'wb') as file, tqdm(
total=total,
unit='iB',
unit_scale=True,
unit_divisor=1024,
desc=track_name,
bar_format='{n_fmt}/{total_fmt} /// {desc}',
) as bar:
for data in r.iter_content(chunk_size=1024):
size = file.write(data)
bar.update(size)
def mkDir(dirn):
try:
os.mkdir(dirn)
except FileExistsError:
print('Warning: folder already exists. Overwriting...')
def getDesc(u, mt):
return '{} [{}/{}]'.format(mt['title'], u['bit_depth'], u['sampling_rate'])
def getCover(i, dirn):
req_tqdm(i, dirn + '/cover.jpg', 'Downloading cover art')
# Download and tag a file
2020-08-13 06:43:52 +02:00
def downloadItem(dirn, count, parse, meta, album, url, is_track, mp3):
if mp3:
fname = '{}/{:02}.mp3'.format(dirn, count)
func = metadata.tag_mp3
else:
fname = '{}/{:02}.flac'.format(dirn, count)
func = metadata.tag_flac
2020-08-10 04:47:51 +02:00
desc = getDesc(parse, meta)
req_tqdm(url, fname, desc)
2020-08-13 06:43:52 +02:00
func(fname, dirn, meta, album, is_track)
2020-08-10 04:47:51 +02:00
# Iterate over IDs by type calling downloadItem
def iterateIDs(client, id, path, quality, album=False):
count = 0
if album:
meta = client.get_album_meta(id)
print('\nDownloading: {}\n'.format(meta['title']))
dirT = (meta['artist']['name'],
meta['title'],
meta['release_date_original'].split('-')[0])
2020-10-05 17:02:33 +02:00
sanitized_title = sanitize_filename('{} - {} [{}]'.format(*dirT))
dirn = path + sanitized_title
2020-08-10 04:47:51 +02:00
mkDir(dirn)
getCover(meta['image']['large'], dirn)
for i in meta['tracks']['items']:
parse = client.get_track_url(i['id'], quality)
url = parse['url']
2020-08-13 06:43:52 +02:00
if 'sample' not in parse:
if int(quality) == 5:
downloadItem(dirn, count, parse, i, meta, url, False, True)
else:
downloadItem(dirn, count, parse, i, meta, url, False, False)
2020-08-10 04:47:51 +02:00
else:
2020-08-13 06:43:52 +02:00
print('Demo. Skipping')
2020-08-10 04:47:51 +02:00
count = count + 1
else:
parse = client.get_track_url(id, quality)
url = parse['url']
2020-08-13 06:43:52 +02:00
if 'sample' not in parse:
2020-08-10 04:47:51 +02:00
meta = client.get_track_meta(id)
print('\nDownloading: {}\n'.format(meta['title']))
dirT = (meta['album']['artist']['name'],
meta['title'],
meta['album']['release_date_original'].split('-')[0])
2020-10-05 17:02:33 +02:00
sanitized_title = sanitize_filename('{} - {} [{}]'.format(*dirT))
dirn = path + sanitized_title
2020-08-10 04:47:51 +02:00
mkDir(dirn)
getCover(meta['album']['image']['large'], dirn)
2020-08-13 06:43:52 +02:00
if int(quality) == 5:
2020-08-13 08:08:03 +02:00
downloadItem(dirn, count, parse, meta, meta, url, True, True)
2020-08-13 06:43:52 +02:00
else:
2020-08-13 08:08:03 +02:00
downloadItem(dirn, count, parse, meta, meta, url, True, False)
2020-08-10 04:47:51 +02:00
else:
2020-08-13 06:43:52 +02:00
print('Demo. Skipping')
2020-08-10 04:47:51 +02:00
print('\nCompleted\n')