Add option to set album tag to playlist name

This commit is contained in:
nathom 2021-04-09 20:04:32 -07:00
parent b00f5278c4
commit ac02f7902a
5 changed files with 34 additions and 8 deletions

View file

@ -80,6 +80,9 @@ class Config:
"keep_embedded_cover": False, "keep_embedded_cover": False,
"keep_downloaded_cover": True, "keep_downloaded_cover": True,
}, },
"metadata": {
"set_playlist_to_album": False,
},
"path_format": {"folder": FOLDER_FORMAT, "track": TRACK_FORMAT}, "path_format": {"folder": FOLDER_FORMAT, "track": TRACK_FORMAT},
"check_for_updates": True, "check_for_updates": True,
"lastfm": {"source": "qobuz"}, "lastfm": {"source": "qobuz"},

View file

@ -2,7 +2,6 @@ import logging
import os import os
import re import re
import sys import sys
import time
from getpass import getpass from getpass import getpass
from hashlib import md5 from hashlib import md5
from string import Formatter from string import Formatter
@ -163,6 +162,9 @@ class MusicDL(list):
"embed_cover": self.config.session["artwork"]["embed"], "embed_cover": self.config.session["artwork"]["embed"],
"embed_cover_size": self.config.session["artwork"]["embed_size"], "embed_cover_size": self.config.session["artwork"]["embed_size"],
"download_cover_size": self.config.session["artwork"]["download_size"], "download_cover_size": self.config.session["artwork"]["download_size"],
"set_playlist_to_album": self.config.session["metadata"][
"set_playlist_to_album"
],
} }
logger.debug("Arguments from config: %s", arguments) logger.debug("Arguments from config: %s", arguments)
for item in self: for item in self:

View file

@ -848,7 +848,10 @@ class Album(Tracklist):
"bit_depth": 16, "bit_depth": 16,
"sampling_rate": 44100, "sampling_rate": 44100,
"tracktotal": resp.get("track_total") or resp.get("nb_tracks"), "tracktotal": resp.get("track_total") or resp.get("nb_tracks"),
"disctotal": max(track["disk_number"] for track in resp["tracks"]), "disctotal": max(
track.get("disk_number") for track in resp.get("tracks", [{}])
)
or 1,
"explicit": bool(resp.get("explicit_content_lyrics")), "explicit": bool(resp.get("explicit_content_lyrics")),
} }
@ -1088,7 +1091,8 @@ class Playlist(Tracklist):
:type new_tracknumbers: bool :type new_tracknumbers: bool
:param kwargs: :param kwargs:
""" """
self.meta = self.client.get(id=self.id, media_type="playlist") self.meta = self.client.get(self.id, media_type="playlist")
logger.debug(pformat(self.meta))
self._load_tracks(**kwargs) self._load_tracks(**kwargs)
self.loaded = True self.loaded = True
@ -1100,6 +1104,9 @@ class Playlist(Tracklist):
""" """
if self.client.source == "qobuz": if self.client.source == "qobuz":
self.name = self.meta["name"] self.name = self.meta["name"]
self.image = self.meta["images"]
self.creator = safe_get(self.meta, "owner", "name", default="Qobuz")
tracklist = self.meta["tracks"]["items"] tracklist = self.meta["tracks"]["items"]
def gen_cover(track): def gen_cover(track):
@ -1110,10 +1117,13 @@ class Playlist(Tracklist):
elif self.client.source == "tidal": elif self.client.source == "tidal":
self.name = self.meta["title"] self.name = self.meta["title"]
self.image = tidal_cover_url(self.meta["image"], 640)
self.creator = safe_get(self.meta, "creator", "name", default="TIDAL")
tracklist = self.meta["tracks"] tracklist = self.meta["tracks"]
def gen_cover(track): def gen_cover(track):
cover_url = tidal_cover_url(track["album"]["cover"], 320) cover_url = tidal_cover_url(track["album"]["cover"], 640)
return cover_url return cover_url
def meta_args(track): def meta_args(track):
@ -1124,6 +1134,9 @@ class Playlist(Tracklist):
elif self.client.source == "deezer": elif self.client.source == "deezer":
self.name = self.meta["title"] self.name = self.meta["title"]
self.image = self.meta["picture_big"]
self.creator = safe_get(self.meta, "creator", "name", default="Deezer")
tracklist = self.meta["tracks"] tracklist = self.meta["tracks"]
def gen_cover(track): def gen_cover(track):
@ -1131,6 +1144,8 @@ class Playlist(Tracklist):
elif self.client.source == "soundcloud": elif self.client.source == "soundcloud":
self.name = self.meta["title"] self.name = self.meta["title"]
self.image = self.meta.get("artwork_url").replace("large", "t500x500")
self.creator = self.meta["user"]["username"]
tracklist = self.meta["tracks"] tracklist = self.meta["tracks"]
def gen_cover(track): def gen_cover(track):
@ -1185,10 +1200,16 @@ class Playlist(Tracklist):
logger.debug(f"Parent folder {folder}") logger.debug(f"Parent folder {folder}")
self.download_message() self.download_message()
set_playlist_to_album = kwargs.get("set_playlist_to_album", False)
for i, track in enumerate(self): for i, track in enumerate(self):
if self.client.source == "soundcloud": if self.client.source == "soundcloud":
track.load_meta() track.load_meta()
if set_playlist_to_album and hasattr(self, "image"):
track["album"] = self.name
track["albumartist"] = self.creator
if kwargs.get("new_tracknumbers", True): if kwargs.get("new_tracknumbers", True):
track.meta["tracknumber"] = str(i + 1) track.meta["tracknumber"] = str(i + 1)

View file

@ -40,6 +40,7 @@ class TrackMetadata:
* tracknumber * tracknumber
* discnumber * discnumber
* tracktotal * tracktotal
* disctotal
""" """
@ -67,6 +68,7 @@ class TrackMetadata:
self.cover = None self.cover = None
self.tracknumber = None self.tracknumber = None
self.discnumber = None self.discnumber = None
self.disctotal = None
# not included in tags # not included in tags
self.explicit = False self.explicit = False

View file

@ -1,8 +1,6 @@
import base64 import base64
import logging import logging
import logging.handlers as handlers
import os import os
import time
from string import Formatter from string import Formatter
from typing import Hashable, Optional, Union from typing import Hashable, Optional, Union
@ -112,8 +110,8 @@ def tqdm_download(url: str, filepath: str, params: dict = None):
r = requests.get(url, allow_redirects=True, stream=True, params=params) r = requests.get(url, allow_redirects=True, stream=True, params=params)
total = int(r.headers.get("content-length", 0)) total = int(r.headers.get("content-length", 0))
logger.debug(f"File size = {total}") logger.debug(f"File size = {total}")
if total < 1000 and not url.endswith("jpg"): if total < 1000 and not url.endswith("jpg") and not url.endswith("png"):
raise NonStreamable raise NonStreamable(url)
try: try:
with open(filepath, "wb") as file, tqdm( with open(filepath, "wb") as file, tqdm(