From 10e2f39196e020e1fe6f7cf2ae26f877be716b40 Mon Sep 17 00:00:00 2001 From: Robert Honz Date: Sat, 23 Mar 2024 14:00:33 +0100 Subject: ✨ Added info pane to GUI. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tidal_dl_ng/gui.py | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) (limited to 'tidal_dl_ng/gui.py') diff --git a/tidal_dl_ng/gui.py b/tidal_dl_ng/gui.py index 3ef600e..779b20b 100644 --- a/tidal_dl_ng/gui.py +++ b/tidal_dl_ng/gui.py @@ -185,8 +185,8 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): self.cb_search_type.setCurrentIndex(2) def _init_tree_results(self, tree: QtWidgets.QTableWidget): - tree.setColumnHidden(5, True) tree.sortByColumn(0, QtCore.Qt.SortOrder.AscendingOrder) + tree.setColumnHidden(1, True) def tidal_user_lists(self): # Start loading spinner @@ -228,8 +228,8 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): info: str = item.sub_title twi_child.setText(0, name) - twi_child.setText(1, info) - twi_child.setData(3, QtCore.Qt.ItemDataRole.UserRole, item) + twi_child.setData(1, QtCore.Qt.ItemDataRole.UserRole, item) + twi_child.setText(2, info) # Stop load spinner self.s_spinner_stop.emit() @@ -238,8 +238,8 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): def _init_tree_lists(self, tree: QtWidgets.QTreeWidget): # Adjust Tree. tree.setColumnWidth(0, 200) - tree.setColumnWidth(1, 300) - tree.setColumnHidden(2, True) + tree.setColumnHidden(1, True) + tree.setColumnWidth(2, 300) tree.expandAll() # Connect the contextmenu @@ -336,11 +336,11 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): # Populate child child: QtWidgets.QTreeWidgetItem = QtWidgets.QTreeWidgetItem() child.setText(0, index) - child.setText(1, item.artist) - child.setText(2, item.title) - child.setText(3, item.album) - child.setText(4, duration) - child.setData(5, QtCore.Qt.ItemDataRole.UserRole, item.obj) + child.setData(1, QtCore.Qt.ItemDataRole.UserRole, item.obj) + child.setText(2, item.artist) + child.setText(3, item.title) + child.setText(4, item.album) + child.setText(5, duration) if isinstance(item.obj, Mix | Playlist | Album | Artist): # Add a disabled dummy child, so expansion arrow will appear. This Child will be replaced on expansion. @@ -529,7 +529,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): self.tidal.settings_apply() def on_list_items_show(self, item: QtWidgets.QTreeWidgetItem): - media_list: Album | Playlist = item.data(3, QtCore.Qt.ItemDataRole.UserRole) + media_list: Album | Playlist = item.data(1, QtCore.Qt.ItemDataRole.UserRole) # Only if clicked item is not a top level item. if media_list: @@ -543,7 +543,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): ) -> None: if point: item = self.tr_lists_user.itemAt(point) - media_list = item.data(3, QtCore.Qt.ItemDataRole.UserRole) + media_list = item.data(1, QtCore.Qt.ItemDataRole.UserRole) # Get all results media_items: [Track | Video | Album] = items_results_all(media_list) @@ -569,11 +569,11 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): else: # If it is an artist resolve it with all available albums of him if len(items) == 1: - tmp_media: QtWidgets.QTreeWidgetItem = items[0].data(5, QtCore.Qt.ItemDataRole.UserRole) + tmp_media: QtWidgets.QTreeWidgetItem = items[0].data(1, QtCore.Qt.ItemDataRole.UserRole) if isinstance(tmp_media, Artist): tmp_children: [QtWidgets.QTreeWidgetItem] = [] - is_dummy_child = not bool(items[0].child(0).data(5, QtCore.Qt.ItemDataRole.UserRole)) + is_dummy_child = not bool(items[0].child(0).data(1, QtCore.Qt.ItemDataRole.UserRole)) # Use the expand function to retrieve all albums. if is_dummy_child: @@ -590,7 +590,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): items_pos_last = len(items) - 1 for item in items: - media: Track | Album | Playlist | Video | Artist = item.data(5, QtCore.Qt.ItemDataRole.UserRole) + media: Track | Album | Playlist | Video | Artist = item.data(1, QtCore.Qt.ItemDataRole.UserRole) # Skip only if Track item, skip option set and the item is not the last in the list. download_delay: bool = bool( isinstance(media, Track | Video) @@ -635,7 +635,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): if load_children: list_item.removeChild(list_item.child(0)) - media_list: [Mix | Album | Playlist | Artist] = list_item.data(5, QtCore.Qt.ItemDataRole.UserRole) + media_list: [Mix | Album | Playlist | Artist] = list_item.data(1, QtCore.Qt.ItemDataRole.UserRole) self.list_items_show_result(media_list=media_list, parent=list_item) -- cgit v1.3.1 From e51f8d7ab5cb7aac75e14c3983c51efd3aa9c107 Mon Sep 17 00:00:00 2001 From: Robert Honz Date: Sat, 23 Mar 2024 14:11:11 +0100 Subject: ✨ Info pane will be initialized correctly. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tidal_dl_ng/gui.py | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'tidal_dl_ng/gui.py') diff --git a/tidal_dl_ng/gui.py b/tidal_dl_ng/gui.py index 779b20b..a5eaf5f 100644 --- a/tidal_dl_ng/gui.py +++ b/tidal_dl_ng/gui.py @@ -81,6 +81,8 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): self._init_tree_results(self.tr_results) self._init_tree_lists(self.tr_lists_user) + self._init_table_queue(self.ta_queue_dl) + self._init_info() self._init_progressbar() self._populate_quality(self.cb_quality_audio, Quality) self._populate_quality(self.cb_quality_video, QualityVideo) @@ -156,6 +158,9 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): # self.pb_progress.setVisible() self.statusbar.addPermanentWidget(pb) + def _init_info(self): + self.l_pm_cover.setPixmap(QtGui.QPixmap("tidal_dl_ng/ui/placeholder_cover.jpg")) + def on_progress_reset(self): self.pb_list.setValue(0) self.pb_item.setValue(0) @@ -188,6 +193,10 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): tree.sortByColumn(0, QtCore.Qt.SortOrder.AscendingOrder) tree.setColumnHidden(1, True) + def _init_table_queue(self, tree: QtWidgets.QTableWidget): + tree.sortByColumn(0, QtCore.Qt.SortOrder.AscendingOrder) + tree.setColumnHidden(1, True) + def tidal_user_lists(self): # Start loading spinner self.s_spinner_start.emit(self.tr_lists_user) -- cgit v1.3.1 From e3cee90bf8fab2952d8f9ca0f69fc4dfd9802618 Mon Sep 17 00:00:00 2001 From: Robert Honz Date: Mon, 25 Mar 2024 16:53:51 +0100 Subject: ✨ Display cover in info area. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tidal_dl_ng/gui.py | 12 +++++++++++- tidal_dl_ng/helper/gui.py | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 tidal_dl_ng/helper/gui.py (limited to 'tidal_dl_ng/gui.py') diff --git a/tidal_dl_ng/gui.py b/tidal_dl_ng/gui.py index a5eaf5f..5433334 100644 --- a/tidal_dl_ng/gui.py +++ b/tidal_dl_ng/gui.py @@ -7,6 +7,7 @@ from requests.exceptions import HTTPError from tidal_dl_ng import version from tidal_dl_ng.dialog import DialogLogin, DialogPreferences, DialogVersion from tidal_dl_ng.helper.exceptions import MediaUnknown +from tidal_dl_ng.helper.gui import get_results_media_item from tidal_dl_ng.helper.path import get_format_template from tidal_dl_ng.helper.tidal import ( get_tidal_media_id, @@ -18,6 +19,7 @@ from tidal_dl_ng.helper.tidal import ( search_results_all, user_media_lists, ) +from tidal_dl_ng.metadata import Metadata try: import qdarktheme @@ -159,7 +161,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): self.statusbar.addPermanentWidget(pb) def _init_info(self): - self.l_pm_cover.setPixmap(QtGui.QPixmap("tidal_dl_ng/ui/placeholder_cover.jpg")) + self.l_pm_cover.setPixmap(QtGui.QPixmap("tidal_dl_ng/ui/default_album_image.png")) def on_progress_reset(self): self.pb_list.setValue(0) @@ -504,6 +506,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): # Results self.tr_results.itemExpanded.connect(self.on_tr_results_expanded) + self.tr_results.itemClicked.connect(self.on_result_item_clicked) def on_logout(self): result: bool = self.tidal.logout() @@ -544,6 +547,13 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): if media_list: self.list_items_show_result(media_list) + def on_result_item_clicked(self, item: QtWidgets.QTreeWidgetItem, column: int) -> None: + media: Track | Video | Album | Artist = get_results_media_item(item) + data_cover: bytes = Metadata.cover_data(media.album.image()) + pixmap: QtGui.QPixmap = QtGui.QPixmap() + pixmap.loadFromData(data_cover) + self.l_pm_cover.setPixmap(pixmap) + def list_items_show_result( self, media_list: Album | Playlist | Mix | Artist | None = None, diff --git a/tidal_dl_ng/helper/gui.py b/tidal_dl_ng/helper/gui.py new file mode 100644 index 0000000..604772e --- /dev/null +++ b/tidal_dl_ng/helper/gui.py @@ -0,0 +1,37 @@ +from PySide6 import QtCore, QtWidgets +from tidalapi import Album, Mix, Playlist, Track, UserPlaylist, Video +from tidalapi.artist import Artist + + +def get_table_data( + item: QtWidgets.QTreeWidgetItem, column: int +) -> Track | Video | Album | Artist | Mix | Playlist | UserPlaylist: + result: Track | Video | Album | Artist = item.data(column, QtCore.Qt.ItemDataRole.UserRole) + + return result + + +def get_results_media_item(item: QtWidgets.QTreeWidgetItem) -> Track | Video | Album | Artist: + result: Track | Video | Album | Artist = get_table_data(item, 1) + + return result + + +def get_user_list_media_item(item: QtWidgets.QTreeWidgetItem) -> Mix | Playlist | UserPlaylist: + result: Mix | Playlist | UserPlaylist = get_table_data(item, 1) + + return result + + +def set_table_data( + item: QtWidgets.QTreeWidgetItem, data: Track | Video | Album | Artist | Mix | Playlist | UserPlaylist, column: int +): + item.setData(column, QtCore.Qt.ItemDataRole.UserRole, data) + + +def set_results_media(item: QtWidgets.QTreeWidgetItem, media: Track | Video | Album | Artist): + set_table_data(item, media, 1) + + +def set_user_list_media(item: QtWidgets.QTreeWidgetItem, media: Mix | Playlist | UserPlaylist): + set_table_data(item, media, 1) -- cgit v1.3.1 From aa902f70690d22f1f1149317e95993187a9fef84 Mon Sep 17 00:00:00 2001 From: Robert Honz Date: Fri, 29 Mar 2024 12:02:12 +0100 Subject: 👌 Reduced network traffic for covers. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tidal_dl_ng/gui.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'tidal_dl_ng/gui.py') diff --git a/tidal_dl_ng/gui.py b/tidal_dl_ng/gui.py index 5433334..6f96eb7 100644 --- a/tidal_dl_ng/gui.py +++ b/tidal_dl_ng/gui.py @@ -67,6 +67,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): s_tr_results_add_top_level_item: QtCore.Signal = QtCore.Signal(object) s_settings_save: QtCore.Signal = QtCore.Signal() s_pb_reload_status: QtCore.Signal = QtCore.Signal(bool) + cover_url_current: str def __init__(self, tidal: Tidal | None = None): super().__init__() @@ -549,10 +550,14 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): def on_result_item_clicked(self, item: QtWidgets.QTreeWidgetItem, column: int) -> None: media: Track | Video | Album | Artist = get_results_media_item(item) - data_cover: bytes = Metadata.cover_data(media.album.image()) - pixmap: QtGui.QPixmap = QtGui.QPixmap() - pixmap.loadFromData(data_cover) - self.l_pm_cover.setPixmap(pixmap) + cover_url: str = media.album.image() + + if self.cover_url_current != cover_url: + self.cover_url_current = cover_url + data_cover: bytes = Metadata.cover_data(cover_url) + pixmap: QtGui.QPixmap = QtGui.QPixmap() + pixmap.loadFromData(data_cover) + self.l_pm_cover.setPixmap(pixmap) def list_items_show_result( self, -- cgit v1.3.1 From ead4b8a905820891161e4cbd81cab6e07b51a8f0 Mon Sep 17 00:00:00 2001 From: Robert Honz Date: Fri, 29 Mar 2024 12:24:42 +0100 Subject: ✨ Lists can also be downloaded using the "Download List" button. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tidal_dl_ng/download.py | 2 +- tidal_dl_ng/gui.py | 23 ++++++++++++++++++----- tidal_dl_ng/ui/main.py | 17 ++++++++++++++--- tidal_dl_ng/ui/main.ui | 41 +++++++++++++++++++++++++++++------------ 4 files changed, 62 insertions(+), 21 deletions(-) (limited to 'tidal_dl_ng/gui.py') diff --git a/tidal_dl_ng/download.py b/tidal_dl_ng/download.py index 5c508c2..91f9b9e 100644 --- a/tidal_dl_ng/download.py +++ b/tidal_dl_ng/download.py @@ -324,7 +324,7 @@ class Download: totaltrack=track.album.num_tracks if track.album and track.album.num_tracks else 1, totaldisc=track.album.num_volumes if track.album and track.album.num_volumes else 1, discnumber=track.volume_num if track.volume_num else 1, - url_cover=track.album.image(self.settings.data.metadata_cover_dimension), + url_cover=track.album.image(self.settings.data.metadata_cover_dimension.value), ) m.save() diff --git a/tidal_dl_ng/gui.py b/tidal_dl_ng/gui.py index 6f96eb7..cb079c6 100644 --- a/tidal_dl_ng/gui.py +++ b/tidal_dl_ng/gui.py @@ -7,7 +7,7 @@ from requests.exceptions import HTTPError from tidal_dl_ng import version from tidal_dl_ng.dialog import DialogLogin, DialogPreferences, DialogVersion from tidal_dl_ng.helper.exceptions import MediaUnknown -from tidal_dl_ng.helper.gui import get_results_media_item +from tidal_dl_ng.helper.gui import get_results_media_item, get_user_list_media_item from tidal_dl_ng.helper.path import get_format_template from tidal_dl_ng.helper.tidal import ( get_tidal_media_id, @@ -299,14 +299,26 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): self.thread_it(self.on_download_list_media, point) self.thread_it(self.list_items_show_result, point=point) - def on_download_list_media(self, point: QtCore.QPoint): + def on_download_list_media(self, point: QtCore.QPoint = None): self.pb_download.setEnabled(False) self.pb_download.setText("Downloading...") - item = self.tr_lists_user.itemAt(point) - media = item.data(3, QtCore.Qt.ItemDataRole.UserRole) + item: QtWidgets.QTreeWidgetItem - self.download(media, self.dl) + if point: + item = self.tr_lists_user.itemAt(point) + else: + items: [QtWidgets.QTreeWidgetItem] = self.tr_lists_user.selectedItems() + + if len(items) == 0: + logger_gui.error("Please select a row first.") + else: + item = items[0] + + if item: + media = get_user_list_media_item(item) + + self.download(media, self.dl) self.pb_download.setText("Download") self.pb_download.setEnabled(True) @@ -476,6 +488,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): def _init_signals(self): self.pb_download.clicked.connect(lambda: self.thread_it(self.on_download_results)) + self.pb_download_list.clicked.connect(lambda: self.thread_it(self.on_download_list_media)) self.l_search.returnPressed.connect( lambda: self.search_populate_results(self.l_search.text(), self.cb_search_type.currentData()) ) diff --git a/tidal_dl_ng/ui/main.py b/tidal_dl_ng/ui/main.py index 6534ba1..8e6d8ad 100644 --- a/tidal_dl_ng/ui/main.py +++ b/tidal_dl_ng/ui/main.py @@ -120,6 +120,8 @@ class Ui_MainWindow: self.lv_list_user.addWidget(self.tr_lists_user) + self.lv_list_control = QHBoxLayout() + self.lv_list_control.setObjectName("lv_list_control") self.pb_reload_user_lists = QPushButton(self.w_central) self.pb_reload_user_lists.setObjectName("pb_reload_user_lists") sizePolicy1 = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) @@ -128,7 +130,16 @@ class Ui_MainWindow: sizePolicy1.setHeightForWidth(self.pb_reload_user_lists.sizePolicy().hasHeightForWidth()) self.pb_reload_user_lists.setSizePolicy(sizePolicy1) - self.lv_list_user.addWidget(self.pb_reload_user_lists) + self.lv_list_control.addWidget(self.pb_reload_user_lists) + + self.pb_download_list = QPushButton(self.w_central) + self.pb_download_list.setObjectName("pb_download_list") + sizePolicy1.setHeightForWidth(self.pb_download_list.sizePolicy().hasHeightForWidth()) + self.pb_download_list.setSizePolicy(sizePolicy1) + + self.lv_list_control.addWidget(self.pb_download_list) + + self.lv_list_user.addLayout(self.lv_list_control) self.horizontalLayout.addLayout(self.lv_list_user) @@ -392,7 +403,7 @@ class Ui_MainWindow: self.l_pm_cover.setMaximumSize(QSize(280, 280)) self.l_pm_cover.setBaseSize(QSize(0, 0)) self.l_pm_cover.setFrameShape(QFrame.NoFrame) - self.l_pm_cover.setPixmap(QPixmap("placeholder_cover.jpg")) + self.l_pm_cover.setPixmap(QPixmap("default_album_image.png")) self.l_pm_cover.setScaledContents(True) self.l_pm_cover.setAlignment(Qt.AlignHCenter | Qt.AlignTop) @@ -453,7 +464,6 @@ class Ui_MainWindow: self.horizontalLayout.addLayout(self.lv_info) - self.horizontalLayout.setStretch(0, 25) self.horizontalLayout.setStretch(1, 50) self.horizontalLayout.setStretch(2, 25) MainWindow.setCentralWidget(self.w_central) @@ -544,6 +554,7 @@ class Ui_MainWindow: self.tr_lists_user.setSortingEnabled(__sortingEnabled) self.pb_reload_user_lists.setText(QCoreApplication.translate("MainWindow", "Reload", None)) + self.pb_download_list.setText(QCoreApplication.translate("MainWindow", "Download List", None)) ___qtreewidgetitem4 = self.tr_results.headerItem() ___qtreewidgetitem4.setText(6, QCoreApplication.translate("MainWindow", "Quality", None)) ___qtreewidgetitem4.setText(5, QCoreApplication.translate("MainWindow", "Duration", None)) diff --git a/tidal_dl_ng/ui/main.ui b/tidal_dl_ng/ui/main.ui index 2e76e30..611a074 100644 --- a/tidal_dl_ng/ui/main.ui +++ b/tidal_dl_ng/ui/main.ui @@ -38,7 +38,7 @@ - + @@ -160,17 +160,34 @@ - - - - 0 - 0 - - - - Reload - - + + + + + + 0 + 0 + + + + Reload + + + + + + + + 0 + 0 + + + + Download List + + + + -- cgit v1.3.1