qobuz-dl/qo_utils/downloader.py

128 lines
3.9 KiB
Python
Raw Normal View History

2020-08-10 04:47:51 +02:00
import os
2020-10-17 18:52:35 +02:00
2020-08-10 04:47:51 +02:00
import requests
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
2020-10-17 18:52:35 +02:00
from qo_utils import metadata
2020-08-10 04:47:51 +02:00
def req_tqdm(url, fname, track_name):
r = requests.get(url, allow_redirects=True, stream=True)
2020-10-17 18:52:35 +02:00
total = int(r.headers.get("content-length", 0))
with open(fname, "wb") as file, tqdm(
2020-08-10 04:47:51 +02:00
total=total,
2020-10-17 18:52:35 +02:00
unit="iB",
2020-08-10 04:47:51 +02:00
unit_scale=True,
unit_divisor=1024,
desc=track_name,
2020-10-17 18:52:35 +02:00
bar_format="{n_fmt}/{total_fmt} /// {desc}",
2020-08-10 04:47:51 +02:00
) 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:
2020-10-17 18:52:35 +02:00
print("Warning: folder already exists. Overwriting...")
2020-08-10 04:47:51 +02:00
def getDesc(u, mt):
2020-12-07 16:32:37 +01:00
return "{}{} [{}/{}]".format(
mt["title"],
(" (" + mt["version"] + ")") if mt["version"] else "",
2020-12-07 16:32:37 +01:00
u["bit_depth"],
u["sampling_rate"],
)
2020-08-10 04:47:51 +02:00
2020-12-05 18:56:08 +01:00
def getBooklet(i, dirn):
2020-12-07 16:32:37 +01:00
req_tqdm(i, dirn + "/booklet.pdf", "Downloading booklet")
2020-08-10 04:47:51 +02:00
def getCover(i, dirn):
2020-10-17 18:52:35 +02:00
req_tqdm(i, dirn + "/cover.jpg", "Downloading cover art")
2020-08-10 04:47:51 +02:00
# Download and tag a file
2020-08-13 06:43:52 +02:00
def downloadItem(dirn, count, parse, meta, album, url, is_track, mp3):
2020-10-17 18:52:35 +02:00
fname = (
"{}/{:02}.mp3".format(dirn, count)
if mp3
else "{}/{:02}.flac".format(dirn, count)
)
func = metadata.tag_mp3 if mp3 else 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)
2020-11-30 06:05:15 +01:00
2020-12-07 16:32:37 +01:00
print(
"\nDownloading: {0} {1}\n".format(
meta["title"],
("(" + meta["version"] + ")") if meta["version"] else " ",
2020-12-07 16:32:37 +01:00
)
)
2020-10-17 18:52:35 +02:00
dirT = (
meta["artist"]["name"],
meta["title"],
(" " + meta["version"]) if meta["version"] else "",
2020-10-17 18:52:35 +02:00
meta["release_date_original"].split("-")[0],
)
2020-12-07 16:32:37 +01:00
sanitized_title = sanitize_filename("{} - {}{} [{}]".format(*dirT)) # aa-{}
2020-10-05 17:02:33 +02:00
dirn = path + sanitized_title
2020-08-10 04:47:51 +02:00
mkDir(dirn)
2020-10-17 18:52:35 +02:00
getCover(meta["image"]["large"], dirn)
2020-12-05 18:56:08 +01:00
if "goodies" in meta:
getBooklet(meta["goodies"][0]["url"], dirn)
2020-10-17 18:52:35 +02:00
for i in meta["tracks"]["items"]:
parse = client.get_track_url(i["id"], quality)
try:
url = parse["url"]
except KeyError:
print("Track is not available for download")
return
2020-10-17 18:52:35 +02:00
if "sample" not in parse:
is_mp3 = True if int(quality) == 5 else False
downloadItem(dirn, count, parse, i, meta, url, False, is_mp3)
2020-08-10 04:47:51 +02:00
else:
2020-10-17 18:52:35 +02:00
print("Demo. Skipping")
2020-08-10 04:47:51 +02:00
count = count + 1
else:
parse = client.get_track_url(id, quality)
2020-10-17 18:52:35 +02:00
url = parse["url"]
2020-08-10 04:47:51 +02:00
2020-10-17 18:52:35 +02:00
if "sample" not in parse:
2020-08-10 04:47:51 +02:00
meta = client.get_track_meta(id)
2020-12-07 16:32:37 +01:00
print(
"\nDownloading: {0} {1}\n".format(
meta["title"],
("(" + meta["version"] + ")") if meta["version"] else " ",
2020-12-07 16:32:37 +01:00
)
)
2020-10-17 18:52:35 +02:00
dirT = (
meta["album"]["artist"]["name"],
2020-11-30 06:05:15 +01:00
meta["album"]["title"],
(" " + meta["album"]["version"]) if meta["album"]["version"] else "",
2020-10-17 18:52:35 +02:00
meta["album"]["release_date_original"].split("-")[0],
)
2020-11-30 06:05:15 +01:00
sanitized_title = sanitize_filename("{} - {}{} [{}]".format(*dirT))
2020-10-05 17:02:33 +02:00
dirn = path + sanitized_title
2020-08-10 04:47:51 +02:00
mkDir(dirn)
2020-10-17 18:52:35 +02:00
getCover(meta["album"]["image"]["large"], dirn)
is_mp3 = True if int(quality) == 5 else False
downloadItem(dirn, count, parse, meta, meta, url, True, is_mp3)
2020-08-10 04:47:51 +02:00
else:
2020-10-17 18:52:35 +02:00
print("Demo. Skipping")
print("\nCompleted\n")