🛠️ Ruff refactoring.
This commit is contained in:
@@ -123,6 +123,8 @@ ignore = [
|
|||||||
"E501",
|
"E501",
|
||||||
# DoNotAssignLambda
|
# DoNotAssignLambda
|
||||||
"E731",
|
"E731",
|
||||||
|
# Do not use bare `except`
|
||||||
|
"E722"
|
||||||
]
|
]
|
||||||
|
|
||||||
[tool.ruff.per-file-ignores]
|
[tool.ruff.per-file-ignores]
|
||||||
|
|||||||
+2
-2
@@ -167,7 +167,7 @@ def download(
|
|||||||
media_type = MediaType.Video
|
media_type = MediaType.Video
|
||||||
|
|
||||||
dl.item(
|
dl.item(
|
||||||
id=id_item,
|
id_media=id_item,
|
||||||
media_type=media_type,
|
media_type=media_type,
|
||||||
path_base=settings.data.download_base_path,
|
path_base=settings.data.download_base_path,
|
||||||
file_template=file_template,
|
file_template=file_template,
|
||||||
@@ -188,7 +188,7 @@ def download(
|
|||||||
file_template = settings.data.format_mix
|
file_template = settings.data.format_mix
|
||||||
media_type = MediaType.Mix
|
media_type = MediaType.Mix
|
||||||
|
|
||||||
dl.list(
|
dl.items(
|
||||||
id_media=id_item,
|
id_media=id_item,
|
||||||
media_type=media_type,
|
media_type=media_type,
|
||||||
path_base=settings.data.download_base_path,
|
path_base=settings.data.download_base_path,
|
||||||
|
|||||||
+10
-7
@@ -29,7 +29,10 @@ from tidal_dl_ng.model.gui_data import ProgressBars
|
|||||||
# TODO: Set appropriate client string and use it for video download.
|
# TODO: Set appropriate client string and use it for video download.
|
||||||
# https://github.com/globocom/m3u8#using-different-http-clients
|
# https://github.com/globocom/m3u8#using-different-http-clients
|
||||||
class RequestsClient:
|
class RequestsClient:
|
||||||
def download(self, uri, timeout=None, headers={}, verify_ssl=True):
|
def download(self, uri: str, timeout: int = None, headers: dict | None = None, verify_ssl: bool = True):
|
||||||
|
if not headers:
|
||||||
|
headers = {}
|
||||||
|
|
||||||
o = requests.get(uri, timeout=timeout, headers=headers)
|
o = requests.get(uri, timeout=timeout, headers=headers)
|
||||||
|
|
||||||
return o.text, o.url
|
return o.text, o.url
|
||||||
@@ -64,7 +67,7 @@ class Download:
|
|||||||
with open(path_file, "wb") as f:
|
with open(path_file, "wb") as f:
|
||||||
for segment in m3u8_playlist.data["segments"]:
|
for segment in m3u8_playlist.data["segments"]:
|
||||||
url = segment["uri"]
|
url = segment["uri"]
|
||||||
r = requests.get(url)
|
r = requests.get(url, timeout=REQUESTS_TIMEOUT_SEC)
|
||||||
|
|
||||||
f.write(r.content)
|
f.write(r.content)
|
||||||
|
|
||||||
@@ -76,7 +79,7 @@ class Download:
|
|||||||
self,
|
self,
|
||||||
path_base: str,
|
path_base: str,
|
||||||
fn_logger: Logger | WrapperLogger,
|
fn_logger: Logger | WrapperLogger,
|
||||||
id: str = None,
|
id_media: str = None,
|
||||||
file_template: str = None,
|
file_template: str = None,
|
||||||
media: Track | Video = None,
|
media: Track | Video = None,
|
||||||
media_type: MediaType = None,
|
media_type: MediaType = None,
|
||||||
@@ -84,11 +87,11 @@ class Download:
|
|||||||
progress_gui: ProgressBars = None,
|
progress_gui: ProgressBars = None,
|
||||||
progress: Progress = None,
|
progress: Progress = None,
|
||||||
) -> (bool, str):
|
) -> (bool, str):
|
||||||
if id:
|
if id_media:
|
||||||
if media_type == MediaType.Track:
|
if media_type == MediaType.Track:
|
||||||
media = Track(self.session, id)
|
media = Track(self.session, id_media)
|
||||||
elif media_type == MediaType.Video:
|
elif media_type == MediaType.Video:
|
||||||
media = Video(self.session, id)
|
media = Video(self.session, id_media)
|
||||||
|
|
||||||
# If video download is not allowed
|
# If video download is not allowed
|
||||||
if not video_download:
|
if not video_download:
|
||||||
@@ -225,7 +228,7 @@ class Download:
|
|||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def list(
|
def items(
|
||||||
self,
|
self,
|
||||||
path_base: str,
|
path_base: str,
|
||||||
fn_logger: Logger | WrapperLogger,
|
fn_logger: Logger | WrapperLogger,
|
||||||
|
|||||||
+13
-16
@@ -14,10 +14,11 @@ import coloredlogs.converter
|
|||||||
from rich.progress import Progress
|
from rich.progress import Progress
|
||||||
from tidalapi import Album, Mix, Playlist, Quality, Track, UserPlaylist, Video
|
from tidalapi import Album, Mix, Playlist, Quality, Track, UserPlaylist, Video
|
||||||
from tidalapi.session import SearchTypes
|
from tidalapi.session import SearchTypes
|
||||||
|
|
||||||
from tidal_dl_ng.config import Settings, Tidal
|
from tidal_dl_ng.config import Settings, Tidal
|
||||||
from tidal_dl_ng.constants import QualityVideo
|
from tidal_dl_ng.constants import QualityVideo
|
||||||
from tidal_dl_ng.download import Download
|
from tidal_dl_ng.download import Download
|
||||||
from tidal_dl_ng.logger import XStream, logger_cli, logger_gui
|
from tidal_dl_ng.logger import XStream, logger_gui
|
||||||
from tidal_dl_ng.model.gui_data import ProgressBars, ResultSearch
|
from tidal_dl_ng.model.gui_data import ProgressBars, ResultSearch
|
||||||
from tidal_dl_ng.ui.main import Ui_MainWindow
|
from tidal_dl_ng.ui.main import Ui_MainWindow
|
||||||
from tidal_dl_ng.ui.spinner import QtWaitingSpinner
|
from tidal_dl_ng.ui.spinner import QtWaitingSpinner
|
||||||
@@ -46,7 +47,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
|||||||
# self.setGeometry(50, 50, 500, 300)
|
# self.setGeometry(50, 50, 500, 300)
|
||||||
self.setWindowTitle("TIDAL Downloader Next Gen!")
|
self.setWindowTitle("TIDAL Downloader Next Gen!")
|
||||||
# TODO: Fix icons (make them visible).
|
# TODO: Fix icons (make them visible).
|
||||||
my_pixmap = QtGui.QPixmap("tidal_dl_ng/ui/icon.png")
|
# my_pixmap = QtGui.QPixmap("tidal_dl_ng/ui/icon.png")
|
||||||
my_icon = QtGui.QIcon("tidal_dl_ng/ui/icon.png")
|
my_icon = QtGui.QIcon("tidal_dl_ng/ui/icon.png")
|
||||||
self.setWindowIcon(my_icon)
|
self.setWindowIcon(my_icon)
|
||||||
tray = QtWidgets.QSystemTrayIcon()
|
tray = QtWidgets.QSystemTrayIcon()
|
||||||
@@ -124,7 +125,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
|||||||
|
|
||||||
def _populate_search_types(self, ui_target: QtWidgets.QComboBox, options: SearchTypes):
|
def _populate_search_types(self, ui_target: QtWidgets.QComboBox, options: SearchTypes):
|
||||||
for item in options:
|
for item in options:
|
||||||
if item and not item.__name__ == "Artist":
|
if item and item.__name__ != "Artist":
|
||||||
ui_target.addItem(item.__name__, item)
|
ui_target.addItem(item.__name__, item)
|
||||||
|
|
||||||
self.cb_search_type.setCurrentIndex(1)
|
self.cb_search_type.setCurrentIndex(1)
|
||||||
@@ -213,7 +214,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
|||||||
|
|
||||||
# We build the menu.
|
# We build the menu.
|
||||||
menu = QtWidgets.QMenu()
|
menu = QtWidgets.QMenu()
|
||||||
action = menu.addAction("Dowloading Playlist", lambda: self.thread_download_list_media(point))
|
menu.addAction("Dowloading Playlist", lambda: self.thread_download_list_media(point))
|
||||||
|
|
||||||
menu.exec(self.tr_lists_user.mapToGlobal(point))
|
menu.exec(self.tr_lists_user.mapToGlobal(point))
|
||||||
|
|
||||||
@@ -254,10 +255,10 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
|||||||
self.tr_results.addTopLevelItem(child)
|
self.tr_results.addTopLevelItem(child)
|
||||||
|
|
||||||
def search(self, query: str, types_media: SearchTypes) -> [ResultSearch]:
|
def search(self, query: str, types_media: SearchTypes) -> [ResultSearch]:
|
||||||
result_search: [dict[str, *SearchTypes]] = self.tidal.session.search(query, models=types_media, limit=999)
|
result_search: [dict[str, SearchTypes]] = self.tidal.session.search(query, models=types_media, limit=999)
|
||||||
result: [ResultSearch] = []
|
result: [ResultSearch] = []
|
||||||
|
|
||||||
for media_type, l_media in result_search.items():
|
for _media_type, l_media in result_search.items():
|
||||||
if isinstance(l_media, list):
|
if isinstance(l_media, list):
|
||||||
result = result + self.search_result_to_model(l_media)
|
result = result + self.search_result_to_model(l_media)
|
||||||
|
|
||||||
@@ -383,7 +384,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
|||||||
|
|
||||||
def on_download_results(self):
|
def on_download_results(self):
|
||||||
self.b_download.setEnabled(False)
|
self.b_download.setEnabled(False)
|
||||||
self.b_download.setText(f"Downloading...")
|
self.b_download.setText("Downloading...")
|
||||||
|
|
||||||
items: [QtWidgets.QTreeWidgetItem] = self.tr_results.selectedItems()
|
items: [QtWidgets.QTreeWidgetItem] = self.tr_results.selectedItems()
|
||||||
|
|
||||||
@@ -393,9 +394,9 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
|||||||
for item in items:
|
for item in items:
|
||||||
media: Track | Album | Playlist | Video = item.data(5, QtCore.Qt.ItemDataRole.UserRole)
|
media: Track | Album | Playlist | Video = item.data(5, QtCore.Qt.ItemDataRole.UserRole)
|
||||||
|
|
||||||
result_dl: bool = self.download_item(media, self.download)
|
self.download_item(media, self.download)
|
||||||
|
|
||||||
self.b_download.setText(f"Download")
|
self.b_download.setText("Download")
|
||||||
self.b_download.setEnabled(True)
|
self.b_download.setEnabled(True)
|
||||||
|
|
||||||
def download_item(self, media: Track | Album | Playlist | Video | Mix, dl: Download) -> bool:
|
def download_item(self, media: Track | Album | Playlist | Video | Mix, dl: Download) -> bool:
|
||||||
@@ -408,7 +409,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
|||||||
)
|
)
|
||||||
progress: Progress = Progress()
|
progress: Progress = Progress()
|
||||||
|
|
||||||
if isinstance(media, Track) or isinstance(media, Video):
|
if isinstance(media, (Track, Video)):
|
||||||
if isinstance(media, Track):
|
if isinstance(media, Track):
|
||||||
file_template: str = self.settings.data.format_track
|
file_template: str = self.settings.data.format_track
|
||||||
elif isinstance(media, Video):
|
elif isinstance(media, Video):
|
||||||
@@ -427,7 +428,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
|||||||
logger_gui.info(f"Download successful: {download_path_file}")
|
logger_gui.info(f"Download successful: {download_path_file}")
|
||||||
else:
|
else:
|
||||||
logger_gui.info(f"Download skipped (file exists): {download_path_file}")
|
logger_gui.info(f"Download skipped (file exists): {download_path_file}")
|
||||||
elif isinstance(media, Album) or isinstance(media, Playlist) or isinstance(media, Mix):
|
elif isinstance(media, (Album, Playlist, Mix)):
|
||||||
file_template: str | bool = False
|
file_template: str | bool = False
|
||||||
|
|
||||||
if isinstance(media, Album):
|
if isinstance(media, Album):
|
||||||
@@ -444,7 +445,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
|||||||
|
|
||||||
self.progress_list_name(progress_name)
|
self.progress_list_name(progress_name)
|
||||||
|
|
||||||
dl.list(
|
dl.items(
|
||||||
path_base=self.settings.data.download_base_path,
|
path_base=self.settings.data.download_base_path,
|
||||||
file_template=file_template,
|
file_template=file_template,
|
||||||
list_media=media,
|
list_media=media,
|
||||||
@@ -461,10 +462,6 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
|||||||
# TODO: Refactor to useful return value.
|
# TODO: Refactor to useful return value.
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def progress_reset(self):
|
|
||||||
self.pb_list.setValue(0)
|
|
||||||
self.pb_item.setValue(0)
|
|
||||||
|
|
||||||
|
|
||||||
# TODO: Comment with Google Docstrings.
|
# TODO: Comment with Google Docstrings.
|
||||||
def gui_activate(tidal: Tidal | None = None):
|
def gui_activate(tidal: Tidal | None = None):
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
def get_tidal_media_id(url_or_id_media: str) -> str:
|
def get_tidal_media_id(url_or_id_media: str) -> str:
|
||||||
id_dirty = url_or_id_media.rsplit("/", 1)[-1]
|
id_dirty = url_or_id_media.rsplit("/", 1)[-1]
|
||||||
id = id_dirty.rsplit("?", 1)[0]
|
id_media = id_dirty.rsplit("?", 1)[0]
|
||||||
|
|
||||||
return id
|
return id_media
|
||||||
|
|
||||||
|
|
||||||
def get_tidal_media_type(url_media: str) -> str | bool:
|
def get_tidal_media_type(url_media: str) -> str | bool:
|
||||||
|
|||||||
+10
-8
@@ -34,13 +34,13 @@ class Metadata:
|
|||||||
type_audio: str = "",
|
type_audio: str = "",
|
||||||
album: str = "",
|
album: str = "",
|
||||||
title: str = "",
|
title: str = "",
|
||||||
artists: [str] = [""],
|
artists: [str] | None = None,
|
||||||
copy_right: str = "",
|
copy_right: str = "",
|
||||||
tracknumber: int = 0,
|
tracknumber: int = 0,
|
||||||
discnumber: int = 0,
|
discnumber: int = 0,
|
||||||
totaltrack: int = 0,
|
totaltrack: int = 0,
|
||||||
totaldisc: int = 0,
|
totaldisc: int = 0,
|
||||||
composer: [str] = [""],
|
composer: [str] | None = None,
|
||||||
isrc: str = "",
|
isrc: str = "",
|
||||||
albumartist: str = "",
|
albumartist: str = "",
|
||||||
date: str = "",
|
date: str = "",
|
||||||
@@ -114,14 +114,14 @@ class Metadata:
|
|||||||
self.m.tags["title"] = self.title
|
self.m.tags["title"] = self.title
|
||||||
self.m.tags["album"] = self.album
|
self.m.tags["album"] = self.album
|
||||||
self.m.tags["albumartist"] = self.albumartist
|
self.m.tags["albumartist"] = self.albumartist
|
||||||
self.m.tags["artist"] = ", ".join(self.artists)
|
self.m.tags["artist"] = ", ".join(self.artists) if self.artists else ""
|
||||||
self.m.tags["copyright"] = self.copy_right
|
self.m.tags["copyright"] = self.copy_right
|
||||||
self.m.tags["tracknumber"] = str(self.tracknumber)
|
self.m.tags["tracknumber"] = str(self.tracknumber)
|
||||||
self.m.tags["tracktotal"] = str(self.totaltrack)
|
self.m.tags["tracktotal"] = str(self.totaltrack)
|
||||||
self.m.tags["discnumber"] = str(self.discnumber)
|
self.m.tags["discnumber"] = str(self.discnumber)
|
||||||
self.m.tags["disctotal"] = str(self.totaldisc)
|
self.m.tags["disctotal"] = str(self.totaldisc)
|
||||||
self.m.tags["date"] = self.date
|
self.m.tags["date"] = self.date
|
||||||
self.m.tags["composer"] = ", ".join(self.composer)
|
self.m.tags["composer"] = ", ".join(self.composer) if self.composer else ""
|
||||||
self.m.tags["isrc"] = self.isrc
|
self.m.tags["isrc"] = self.isrc
|
||||||
self.m.tags["lyrics"] = self.lyrics
|
self.m.tags["lyrics"] = self.lyrics
|
||||||
|
|
||||||
@@ -132,12 +132,12 @@ class Metadata:
|
|||||||
self.m.tags.add(TIT2(encoding=3, text=self.title))
|
self.m.tags.add(TIT2(encoding=3, text=self.title))
|
||||||
self.m.tags.add(TALB(encoding=3, text=self.album))
|
self.m.tags.add(TALB(encoding=3, text=self.album))
|
||||||
self.m.tags.add(TOPE(encoding=3, text=self.albumartist))
|
self.m.tags.add(TOPE(encoding=3, text=self.albumartist))
|
||||||
self.m.tags.add(TPE1(encoding=3, text=", ".join(self.artists)))
|
self.m.tags.add(TPE1(encoding=3, text=", ".join(self.artists) if self.artists else ""))
|
||||||
self.m.tags.add(TCOP(encoding=3, text=self.copy_right))
|
self.m.tags.add(TCOP(encoding=3, text=self.copy_right))
|
||||||
self.m.tags.add(TRCK(encoding=3, text=str(self.tracknumber)))
|
self.m.tags.add(TRCK(encoding=3, text=str(self.tracknumber)))
|
||||||
self.m.tags.add(TRCK(encoding=3, text=self.discnumber))
|
self.m.tags.add(TRCK(encoding=3, text=self.discnumber))
|
||||||
self.m.tags.add(TDRC(encoding=3, text=self.date))
|
self.m.tags.add(TDRC(encoding=3, text=self.date))
|
||||||
self.m.tags.add(TCOM(encoding=3, text=", ".join(self.composer)))
|
self.m.tags.add(TCOM(encoding=3, text=", ".join(self.composer) if self.composer else ""))
|
||||||
self.m.tags.add(TSRC(encoding=3, text=self.isrc))
|
self.m.tags.add(TSRC(encoding=3, text=self.isrc))
|
||||||
self.m.tags.add(USLT(encoding=3, lang="eng", desc="desc", text=self.lyrics))
|
self.m.tags.add(USLT(encoding=3, lang="eng", desc="desc", text=self.lyrics))
|
||||||
|
|
||||||
@@ -145,13 +145,13 @@ class Metadata:
|
|||||||
self.m.tags["\xa9nam"] = self.title
|
self.m.tags["\xa9nam"] = self.title
|
||||||
self.m.tags["\xa9alb"] = self.album
|
self.m.tags["\xa9alb"] = self.album
|
||||||
self.m.tags["aART"] = self.albumartist
|
self.m.tags["aART"] = self.albumartist
|
||||||
self.m.tags["\xa9ART"] = ", ".join(self.artists)
|
self.m.tags["\xa9ART"] = ", ".join(self.artists) if self.artists else ""
|
||||||
self.m.tags["cprt"] = self.copy_right
|
self.m.tags["cprt"] = self.copy_right
|
||||||
self.m.tags["trkn"] = [[self.tracknumber, self.totaltrack]]
|
self.m.tags["trkn"] = [[self.tracknumber, self.totaltrack]]
|
||||||
self.m.tags["disk"] = [[self.discnumber, self.totaldisc]]
|
self.m.tags["disk"] = [[self.discnumber, self.totaldisc]]
|
||||||
# self.m.tags['\xa9gen'] = self.genre
|
# self.m.tags['\xa9gen'] = self.genre
|
||||||
self.m.tags["\xa9day"] = self.date
|
self.m.tags["\xa9day"] = self.date
|
||||||
self.m.tags["\xa9wrt"] = ", ".join(self.composer)
|
self.m.tags["\xa9wrt"] = ", ".join(self.composer) if self.composer else ""
|
||||||
self.m.tags["\xa9lyr"] = self.lyrics
|
self.m.tags["\xa9lyr"] = self.lyrics
|
||||||
|
|
||||||
def cover_data(self, url: str = None, path_file: str = None) -> str | bytes:
|
def cover_data(self, url: str = None, path_file: str = None) -> str | bytes:
|
||||||
@@ -161,12 +161,14 @@ class Metadata:
|
|||||||
try:
|
try:
|
||||||
result = requests.get(url, timeout=REQUESTS_TIMEOUT_SEC).content
|
result = requests.get(url, timeout=REQUESTS_TIMEOUT_SEC).content
|
||||||
except:
|
except:
|
||||||
|
# TODO: Implement logging.
|
||||||
pass
|
pass
|
||||||
elif path_file:
|
elif path_file:
|
||||||
try:
|
try:
|
||||||
with open(path_file, "rb") as f:
|
with open(path_file, "rb") as f:
|
||||||
result = f.read()
|
result = f.read()
|
||||||
except OSError:
|
except OSError:
|
||||||
|
# TODO: Implement logging.
|
||||||
pass
|
pass
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|||||||
Reference in New Issue
Block a user