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_downloaded_cover": True,
},
"metadata": {
"set_playlist_to_album": False,
},
"path_format": {"folder": FOLDER_FORMAT, "track": TRACK_FORMAT},
"check_for_updates": True,
"lastfm": {"source": "qobuz"},

View file

@ -2,7 +2,6 @@ import logging
import os
import re
import sys
import time
from getpass import getpass
from hashlib import md5
from string import Formatter
@ -163,6 +162,9 @@ class MusicDL(list):
"embed_cover": self.config.session["artwork"]["embed"],
"embed_cover_size": self.config.session["artwork"]["embed_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)
for item in self:

View file

@ -848,7 +848,10 @@ class Album(Tracklist):
"bit_depth": 16,
"sampling_rate": 44100,
"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")),
}
@ -1088,7 +1091,8 @@ class Playlist(Tracklist):
:type new_tracknumbers: bool
: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.loaded = True
@ -1100,6 +1104,9 @@ class Playlist(Tracklist):
"""
if self.client.source == "qobuz":
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"]
def gen_cover(track):
@ -1110,10 +1117,13 @@ class Playlist(Tracklist):
elif self.client.source == "tidal":
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"]
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
def meta_args(track):
@ -1124,6 +1134,9 @@ class Playlist(Tracklist):
elif self.client.source == "deezer":
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"]
def gen_cover(track):
@ -1131,6 +1144,8 @@ class Playlist(Tracklist):
elif self.client.source == "soundcloud":
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"]
def gen_cover(track):
@ -1185,10 +1200,16 @@ class Playlist(Tracklist):
logger.debug(f"Parent folder {folder}")
self.download_message()
set_playlist_to_album = kwargs.get("set_playlist_to_album", False)
for i, track in enumerate(self):
if self.client.source == "soundcloud":
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):
track.meta["tracknumber"] = str(i + 1)

View file

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

View file

@ -1,8 +1,6 @@
import base64
import logging
import logging.handlers as handlers
import os
import time
from string import Formatter
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)
total = int(r.headers.get("content-length", 0))
logger.debug(f"File size = {total}")
if total < 1000 and not url.endswith("jpg"):
raise NonStreamable
if total < 1000 and not url.endswith("jpg") and not url.endswith("png"):
raise NonStreamable(url)
try:
with open(filepath, "wb") as file, tqdm(