Merge branch '71-feature-show-queued-downloads'

* 71-feature-show-queued-downloads:
  ✨ Lists can also be downloaded using the "Download List" button.
  👌 Reduced network traffic for covers.
  ✨ Display cover in info area.
  ✨ Use `Album.image()` to get cover url.
  ✨ Software named explicitly.
  ✨ Info pane will be initialized correctly.
  ✨ Added info pane to GUI.

# Conflicts:
#	tidal_dl_ng/gui.py
This commit is contained in:
Robert Honz
2024-03-29 12:32:11 +01:00
9 changed files with 807 additions and 483 deletions
+1 -1
View File
@@ -20,7 +20,7 @@ body:
- type: input - type: input
id: version id: version
attributes: attributes:
label: Version label: Version App
description: What version of our software are you running? description: What version of our software are you running?
placeholder: vX.Y.Z placeholder: vX.Y.Z
validations: validations:
+5 -3
View File
@@ -36,9 +36,11 @@ class StreamManifestMimeType(Enum):
class CoverDimensions(Enum): class CoverDimensions(Enum):
Px320: str = "320x320" Px80: int = 80
Px640: str = "640x640" Px160: int = 160
Px1280: str = "1280x1280" Px320: int = 320
Px640: int = 640
Px1280: int = 1280
class TidalLists(Enum): class TidalLists(Enum):
+1 -10
View File
@@ -21,7 +21,6 @@ from tidal_dl_ng.constants import (
EXTENSION_LYRICS, EXTENSION_LYRICS,
REQUESTS_TIMEOUT_SEC, REQUESTS_TIMEOUT_SEC,
AudioExtensions, AudioExtensions,
CoverDimensions,
MediaType, MediaType,
SkipExisting, SkipExisting,
StreamManifestMimeType, StreamManifestMimeType,
@@ -272,12 +271,6 @@ class Download:
# Move it. # Move it.
shutil.move(tmp_lyrics_file_path, os.path.splitext(file_media_dst)[0] + EXTENSION_LYRICS) shutil.move(tmp_lyrics_file_path, os.path.splitext(file_media_dst)[0] + EXTENSION_LYRICS)
def cover_url(self, sid: str, dimension: CoverDimensions = CoverDimensions.Px320):
if sid is None:
return ""
return f"https://resources.tidal.com/images/{sid.replace('-', '/')}/{dimension.value}.jpg"
def lyrics_write_file(self, file_path: str, lyrics: str) -> str: def lyrics_write_file(self, file_path: str, lyrics: str) -> str:
result: str = file_path result: str = file_path
@@ -332,9 +325,7 @@ class Download:
totaltrack=track.album.num_tracks if track.album and track.album.num_tracks else 1, 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, 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, discnumber=track.volume_num if track.volume_num else 1,
url_cover=( url_cover=track.album.image(self.settings.data.metadata_cover_dimension.value),
self.cover_url(track.album.cover, self.settings.data.metadata_cover_dimension) if track.album else ""
),
) )
m.save() m.save()
+57 -20
View File
@@ -6,6 +6,7 @@ from requests.exceptions import HTTPError
from tidal_dl_ng import __version__, update_available from tidal_dl_ng import __version__, update_available
from tidal_dl_ng.dialog import DialogLogin, DialogPreferences, DialogVersion from tidal_dl_ng.dialog import DialogLogin, DialogPreferences, DialogVersion
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.path import get_format_template
from tidal_dl_ng.helper.tidal import ( from tidal_dl_ng.helper.tidal import (
get_tidal_media_id, get_tidal_media_id,
@@ -17,6 +18,7 @@ from tidal_dl_ng.helper.tidal import (
search_results_all, search_results_all,
user_media_lists, user_media_lists,
) )
from tidal_dl_ng.metadata import Metadata
try: try:
import qdarktheme import qdarktheme
@@ -51,6 +53,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
threadpool: QtCore.QThreadPool threadpool: QtCore.QThreadPool
tray: QtWidgets.QSystemTrayIcon tray: QtWidgets.QSystemTrayIcon
spinner: QtWaitingSpinner spinner: QtWaitingSpinner
cover_url_current: str
s_spinner_start: QtCore.Signal = QtCore.Signal(QtWidgets.QWidget) s_spinner_start: QtCore.Signal = QtCore.Signal(QtWidgets.QWidget)
s_spinner_stop: QtCore.Signal = QtCore.Signal() s_spinner_stop: QtCore.Signal = QtCore.Signal()
pb_item: QtWidgets.QProgressBar pb_item: QtWidgets.QProgressBar
@@ -83,6 +86,8 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
self._init_tree_results(self.tr_results) self._init_tree_results(self.tr_results)
self._init_tree_lists(self.tr_lists_user) self._init_tree_lists(self.tr_lists_user)
self._init_table_queue(self.ta_queue_dl)
self._init_info()
self._init_progressbar() self._init_progressbar()
self._populate_quality(self.cb_quality_audio, Quality) self._populate_quality(self.cb_quality_audio, Quality)
self._populate_quality(self.cb_quality_video, QualityVideo) self._populate_quality(self.cb_quality_video, QualityVideo)
@@ -158,6 +163,9 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
# self.pb_progress.setVisible() # self.pb_progress.setVisible()
self.statusbar.addPermanentWidget(pb) self.statusbar.addPermanentWidget(pb)
def _init_info(self):
self.l_pm_cover.setPixmap(QtGui.QPixmap("tidal_dl_ng/ui/default_album_image.png"))
def on_progress_reset(self): def on_progress_reset(self):
self.pb_list.setValue(0) self.pb_list.setValue(0)
self.pb_item.setValue(0) self.pb_item.setValue(0)
@@ -187,8 +195,12 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
self.cb_search_type.setCurrentIndex(2) self.cb_search_type.setCurrentIndex(2)
def _init_tree_results(self, tree: QtWidgets.QTableWidget): def _init_tree_results(self, tree: QtWidgets.QTableWidget):
tree.setColumnHidden(5, True)
tree.sortByColumn(0, QtCore.Qt.SortOrder.AscendingOrder) 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): def tidal_user_lists(self):
# Start loading spinner # Start loading spinner
@@ -230,8 +242,8 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
info: str = item.sub_title info: str = item.sub_title
twi_child.setText(0, name) twi_child.setText(0, name)
twi_child.setText(1, info) twi_child.setData(1, QtCore.Qt.ItemDataRole.UserRole, item)
twi_child.setData(3, QtCore.Qt.ItemDataRole.UserRole, item) twi_child.setText(2, info)
# Stop load spinner # Stop load spinner
self.s_spinner_stop.emit() self.s_spinner_stop.emit()
@@ -240,8 +252,8 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def _init_tree_lists(self, tree: QtWidgets.QTreeWidget): def _init_tree_lists(self, tree: QtWidgets.QTreeWidget):
# Adjust Tree. # Adjust Tree.
tree.setColumnWidth(0, 200) tree.setColumnWidth(0, 200)
tree.setColumnWidth(1, 300) tree.setColumnHidden(1, True)
tree.setColumnHidden(2, True) tree.setColumnWidth(2, 300)
tree.expandAll() tree.expandAll()
# Connect the contextmenu # Connect the contextmenu
@@ -295,14 +307,26 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
self.thread_it(self.on_download_list_media, point) self.thread_it(self.on_download_list_media, point)
self.thread_it(self.list_items_show_result, point=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.setEnabled(False)
self.pb_download.setText("Downloading...") self.pb_download.setText("Downloading...")
item = self.tr_lists_user.itemAt(point) item: QtWidgets.QTreeWidgetItem
media = item.data(3, QtCore.Qt.ItemDataRole.UserRole)
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.setText("Download")
self.pb_download.setEnabled(True) self.pb_download.setEnabled(True)
@@ -344,11 +368,11 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
# Populate child # Populate child
child: QtWidgets.QTreeWidgetItem = QtWidgets.QTreeWidgetItem() child: QtWidgets.QTreeWidgetItem = QtWidgets.QTreeWidgetItem()
child.setText(0, index) child.setText(0, index)
child.setText(1, item.artist) child.setData(1, QtCore.Qt.ItemDataRole.UserRole, item.obj)
child.setText(2, item.title) child.setText(2, item.artist)
child.setText(3, item.album) child.setText(3, item.title)
child.setText(4, duration) child.setText(4, item.album)
child.setData(5, QtCore.Qt.ItemDataRole.UserRole, item.obj) child.setText(5, duration)
if isinstance(item.obj, Mix | Playlist | Album | Artist): 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. # Add a disabled dummy child, so expansion arrow will appear. This Child will be replaced on expansion.
@@ -474,6 +498,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def _init_signals(self): def _init_signals(self):
self.pb_download.clicked.connect(lambda: self.thread_it(self.on_download_results)) 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( self.l_search.returnPressed.connect(
lambda: self.search_populate_results(self.l_search.text(), self.cb_search_type.currentData()) lambda: self.search_populate_results(self.l_search.text(), self.cb_search_type.currentData())
) )
@@ -508,6 +533,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
# Results # Results
self.tr_results.itemExpanded.connect(self.on_tr_results_expanded) self.tr_results.itemExpanded.connect(self.on_tr_results_expanded)
self.tr_results.itemClicked.connect(self.on_result_item_clicked)
def on_logout(self): def on_logout(self):
result: bool = self.tidal.logout() result: bool = self.tidal.logout()
@@ -542,12 +568,23 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
self.tidal.settings_apply() self.tidal.settings_apply()
def on_list_items_show(self, item: QtWidgets.QTreeWidgetItem): 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. # Only if clicked item is not a top level item.
if media_list: if media_list:
self.list_items_show_result(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)
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( def list_items_show_result(
self, self,
media_list: Album | Playlist | Mix | Artist | None = None, media_list: Album | Playlist | Mix | Artist | None = None,
@@ -556,7 +593,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
) -> None: ) -> None:
if point: if point:
item = self.tr_lists_user.itemAt(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 # Get all results
media_items: [Track | Video | Album] = items_results_all(media_list) media_items: [Track | Video | Album] = items_results_all(media_list)
@@ -582,11 +619,11 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
else: else:
# If it is an artist resolve it with all available albums of him # If it is an artist resolve it with all available albums of him
if len(items) == 1: 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): if isinstance(tmp_media, Artist):
tmp_children: [QtWidgets.QTreeWidgetItem] = [] 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. # Use the expand function to retrieve all albums.
if is_dummy_child: if is_dummy_child:
@@ -603,7 +640,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
items_pos_last = len(items) - 1 items_pos_last = len(items) - 1
for item in items: 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. # Skip only if Track item, skip option set and the item is not the last in the list.
download_delay: bool = bool( download_delay: bool = bool(
isinstance(media, Track | Video) isinstance(media, Track | Video)
@@ -650,7 +687,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
if load_children: if load_children:
list_item.removeChild(list_item.child(0)) 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) self.list_items_show_result(media_list=media_list, parent=list_item)
+37
View File
@@ -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)
+2 -1
View File
@@ -142,7 +142,8 @@ class Metadata:
self.m.tags["\xa9wrt"] = ", ".join(self.composer) if self.composer else "" 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: @staticmethod
def cover_data(url: str = None, path_file: str = None) -> str | bytes:
result: str | bytes = "" result: str | bytes = ""
if url: if url:
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

+122 -23
View File
@@ -7,13 +7,13 @@
################################################################################ ################################################################################
from PySide6.QtCore import QCoreApplication, QLocale, QMetaObject, QRect, QSize, Qt from PySide6.QtCore import QCoreApplication, QLocale, QMetaObject, QRect, QSize, Qt
from PySide6.QtGui import QAction from PySide6.QtGui import QAction, QFont, QPixmap
from PySide6.QtWidgets import ( from PySide6.QtWidgets import (
QAbstractItemView, QAbstractItemView,
QComboBox, QComboBox,
QFrame,
QHBoxLayout, QHBoxLayout,
QLabel, QLabel,
QLayout,
QLineEdit, QLineEdit,
QMenu, QMenu,
QMenuBar, QMenuBar,
@@ -21,6 +21,8 @@ from PySide6.QtWidgets import (
QPushButton, QPushButton,
QSizePolicy, QSizePolicy,
QStatusBar, QStatusBar,
QTableWidget,
QTableWidgetItem,
QTreeWidget, QTreeWidget,
QTreeWidgetItem, QTreeWidgetItem,
QVBoxLayout, QVBoxLayout,
@@ -32,7 +34,7 @@ class Ui_MainWindow:
def setupUi(self, MainWindow): def setupUi(self, MainWindow):
if not MainWindow.objectName(): if not MainWindow.objectName():
MainWindow.setObjectName("MainWindow") MainWindow.setObjectName("MainWindow")
MainWindow.resize(900, 700) MainWindow.resize(1200, 800)
self.a_preferences = QAction(MainWindow) self.a_preferences = QAction(MainWindow)
self.a_preferences.setObjectName("a_preferences") self.a_preferences.setObjectName("a_preferences")
self.a_preferences.setEnabled(True) self.a_preferences.setEnabled(True)
@@ -80,14 +82,11 @@ class Ui_MainWindow:
# endif // QT_CONFIG(accessibility) # endif // QT_CONFIG(accessibility)
self.horizontalLayout = QHBoxLayout(self.w_central) self.horizontalLayout = QHBoxLayout(self.w_central)
self.horizontalLayout.setObjectName("horizontalLayout") self.horizontalLayout.setObjectName("horizontalLayout")
self.lh_main = QHBoxLayout() self.lv_list_user = QVBoxLayout()
self.lh_main.setObjectName("lh_main") self.lv_list_user.setObjectName("lv_list_user")
self.lh_main.setSizeConstraint(QLayout.SetNoConstraint)
self.verticalLayout = QVBoxLayout()
self.verticalLayout.setObjectName("verticalLayout")
self.tr_lists_user = QTreeWidget(self.w_central) self.tr_lists_user = QTreeWidget(self.w_central)
__qtreewidgetitem = QTreeWidgetItem() __qtreewidgetitem = QTreeWidgetItem()
__qtreewidgetitem.setText(1, "Info") __qtreewidgetitem.setText(2, "Info")
__qtreewidgetitem.setText(0, "Name") __qtreewidgetitem.setText(0, "Name")
self.tr_lists_user.setHeaderItem(__qtreewidgetitem) self.tr_lists_user.setHeaderItem(__qtreewidgetitem)
__qtreewidgetitem1 = QTreeWidgetItem(self.tr_lists_user) __qtreewidgetitem1 = QTreeWidgetItem(self.tr_lists_user)
@@ -121,8 +120,10 @@ class Ui_MainWindow:
self.tr_lists_user.header().setHighlightSections(True) self.tr_lists_user.header().setHighlightSections(True)
self.tr_lists_user.header().setProperty("showSortIndicator", True) self.tr_lists_user.header().setProperty("showSortIndicator", True)
self.verticalLayout.addWidget(self.tr_lists_user) 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 = QPushButton(self.w_central)
self.pb_reload_user_lists.setObjectName("pb_reload_user_lists") self.pb_reload_user_lists.setObjectName("pb_reload_user_lists")
sizePolicy1 = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) sizePolicy1 = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
@@ -131,9 +132,18 @@ class Ui_MainWindow:
sizePolicy1.setHeightForWidth(self.pb_reload_user_lists.sizePolicy().hasHeightForWidth()) sizePolicy1.setHeightForWidth(self.pb_reload_user_lists.sizePolicy().hasHeightForWidth())
self.pb_reload_user_lists.setSizePolicy(sizePolicy1) self.pb_reload_user_lists.setSizePolicy(sizePolicy1)
self.verticalLayout.addWidget(self.pb_reload_user_lists) self.lv_list_control.addWidget(self.pb_reload_user_lists)
self.lh_main.addLayout(self.verticalLayout) 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)
self.lv_search_result = QVBoxLayout() self.lv_search_result = QVBoxLayout()
# ifndef Q_OS_MAC # ifndef Q_OS_MAC
@@ -377,17 +387,91 @@ class Ui_MainWindow:
self.lv_search_result.addWidget(self.te_debug) self.lv_search_result.addWidget(self.te_debug)
self.lh_main.addLayout(self.lv_search_result) self.horizontalLayout.addLayout(self.lv_search_result)
self.lh_main.setStretch(0, 40) self.lv_info = QVBoxLayout()
self.lh_main.setStretch(1, 60) self.lv_info.setObjectName("lv_info")
self.lv_info_item = QVBoxLayout()
self.lv_info_item.setObjectName("lv_info_item")
self.horizontalLayout_2 = QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.l_pm_cover = QLabel(self.w_central)
self.l_pm_cover.setObjectName("l_pm_cover")
sizePolicy3 = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
sizePolicy3.setHorizontalStretch(0)
sizePolicy3.setVerticalStretch(0)
sizePolicy3.setHeightForWidth(self.l_pm_cover.sizePolicy().hasHeightForWidth())
self.l_pm_cover.setSizePolicy(sizePolicy3)
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("default_album_image.png"))
self.l_pm_cover.setScaledContents(True)
self.l_pm_cover.setAlignment(Qt.AlignHCenter | Qt.AlignTop)
self.horizontalLayout.addLayout(self.lh_main) self.horizontalLayout_2.addWidget(self.l_pm_cover)
self.lv_info_item.addLayout(self.horizontalLayout_2)
self.lv_info.addLayout(self.lv_info_item)
self.lv_queue_dl = QVBoxLayout()
self.lv_queue_dl.setObjectName("lv_queue_dl")
self.l_h_queue_dl = QLabel(self.w_central)
self.l_h_queue_dl.setObjectName("l_h_queue_dl")
font = QFont()
font.setBold(True)
font.setItalic(False)
font.setKerning(True)
self.l_h_queue_dl.setFont(font)
self.lv_queue_dl.addWidget(self.l_h_queue_dl)
self.ta_queue_dl = QTableWidget(self.w_central)
if self.ta_queue_dl.columnCount() < 5:
self.ta_queue_dl.setColumnCount(5)
__qtablewidgetitem = QTableWidgetItem()
__qtablewidgetitem.setTextAlignment(Qt.AlignLeading | Qt.AlignVCenter)
self.ta_queue_dl.setHorizontalHeaderItem(0, __qtablewidgetitem)
__qtablewidgetitem1 = QTableWidgetItem()
self.ta_queue_dl.setHorizontalHeaderItem(1, __qtablewidgetitem1)
__qtablewidgetitem2 = QTableWidgetItem()
__qtablewidgetitem2.setTextAlignment(Qt.AlignLeading | Qt.AlignVCenter)
self.ta_queue_dl.setHorizontalHeaderItem(2, __qtablewidgetitem2)
__qtablewidgetitem3 = QTableWidgetItem()
__qtablewidgetitem3.setTextAlignment(Qt.AlignLeading | Qt.AlignVCenter)
self.ta_queue_dl.setHorizontalHeaderItem(3, __qtablewidgetitem3)
__qtablewidgetitem4 = QTableWidgetItem()
__qtablewidgetitem4.setTextAlignment(Qt.AlignLeading | Qt.AlignVCenter)
self.ta_queue_dl.setHorizontalHeaderItem(4, __qtablewidgetitem4)
self.ta_queue_dl.setObjectName("ta_queue_dl")
self.ta_queue_dl.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.ta_queue_dl.setTabKeyNavigation(False)
self.ta_queue_dl.setProperty("showDropIndicator", False)
self.ta_queue_dl.setDragDropOverwriteMode(False)
self.ta_queue_dl.setSelectionMode(QAbstractItemView.ExtendedSelection)
self.ta_queue_dl.setSelectionBehavior(QAbstractItemView.SelectRows)
self.ta_queue_dl.setSortingEnabled(True)
self.ta_queue_dl.verticalHeader().setProperty("showSortIndicator", True)
self.lv_queue_dl.addWidget(self.ta_queue_dl)
self.pb_queue_item_remove = QPushButton(self.w_central)
self.pb_queue_item_remove.setObjectName("pb_queue_item_remove")
self.pb_queue_item_remove.setEnabled(False)
self.lv_queue_dl.addWidget(self.pb_queue_item_remove)
self.lv_info.addLayout(self.lv_queue_dl)
self.horizontalLayout.addLayout(self.lv_info)
self.horizontalLayout.setStretch(1, 50)
self.horizontalLayout.setStretch(2, 25)
MainWindow.setCentralWidget(self.w_central) MainWindow.setCentralWidget(self.w_central)
self.menubar = QMenuBar(MainWindow) self.menubar = QMenuBar(MainWindow)
self.menubar.setObjectName("menubar") self.menubar.setObjectName("menubar")
self.menubar.setGeometry(QRect(0, 0, 900, 24)) self.menubar.setGeometry(QRect(0, 0, 1200, 24))
# if QT_CONFIG(tooltip) # if QT_CONFIG(tooltip)
self.menubar.setToolTip("") self.menubar.setToolTip("")
# endif // QT_CONFIG(tooltip) # endif // QT_CONFIG(tooltip)
@@ -464,7 +548,7 @@ class Ui_MainWindow:
self.a_logout.setText(QCoreApplication.translate("MainWindow", "Logout", None)) self.a_logout.setText(QCoreApplication.translate("MainWindow", "Logout", None))
self.a_updates_check.setText(QCoreApplication.translate("MainWindow", "Check for Updates", None)) self.a_updates_check.setText(QCoreApplication.translate("MainWindow", "Check for Updates", None))
___qtreewidgetitem = self.tr_lists_user.headerItem() ___qtreewidgetitem = self.tr_lists_user.headerItem()
___qtreewidgetitem.setText(2, QCoreApplication.translate("MainWindow", "obj", None)) ___qtreewidgetitem.setText(1, QCoreApplication.translate("MainWindow", "obj", None))
__sortingEnabled = self.tr_lists_user.isSortingEnabled() __sortingEnabled = self.tr_lists_user.isSortingEnabled()
self.tr_lists_user.setSortingEnabled(False) self.tr_lists_user.setSortingEnabled(False)
@@ -477,14 +561,29 @@ class Ui_MainWindow:
self.tr_lists_user.setSortingEnabled(__sortingEnabled) self.tr_lists_user.setSortingEnabled(__sortingEnabled)
self.pb_reload_user_lists.setText(QCoreApplication.translate("MainWindow", "Reload", None)) 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 = self.tr_results.headerItem()
___qtreewidgetitem4.setText(5, QCoreApplication.translate("MainWindow", "obj", None)) ___qtreewidgetitem4.setText(6, QCoreApplication.translate("MainWindow", "Quality", None))
___qtreewidgetitem4.setText(4, QCoreApplication.translate("MainWindow", "Duration", None)) ___qtreewidgetitem4.setText(5, QCoreApplication.translate("MainWindow", "Duration", None))
___qtreewidgetitem4.setText(3, QCoreApplication.translate("MainWindow", "Album", None)) ___qtreewidgetitem4.setText(4, QCoreApplication.translate("MainWindow", "Album", None))
___qtreewidgetitem4.setText(2, QCoreApplication.translate("MainWindow", "Title", None)) ___qtreewidgetitem4.setText(3, QCoreApplication.translate("MainWindow", "Title", None))
___qtreewidgetitem4.setText(1, QCoreApplication.translate("MainWindow", "Artist", None)) ___qtreewidgetitem4.setText(2, QCoreApplication.translate("MainWindow", "Artist", None))
___qtreewidgetitem4.setText(1, QCoreApplication.translate("MainWindow", "obj", None))
___qtreewidgetitem4.setText(0, QCoreApplication.translate("MainWindow", "#", None)) ___qtreewidgetitem4.setText(0, QCoreApplication.translate("MainWindow", "#", None))
self.te_debug.setPlaceholderText(QCoreApplication.translate("MainWindow", "Logs...", None)) self.te_debug.setPlaceholderText(QCoreApplication.translate("MainWindow", "Logs...", None))
self.l_pm_cover.setText("")
self.l_h_queue_dl.setText(QCoreApplication.translate("MainWindow", "Download Queue", None))
___qtablewidgetitem = self.ta_queue_dl.horizontalHeaderItem(0)
___qtablewidgetitem.setText(QCoreApplication.translate("MainWindow", "#", None))
___qtablewidgetitem1 = self.ta_queue_dl.horizontalHeaderItem(1)
___qtablewidgetitem1.setText(QCoreApplication.translate("MainWindow", "obj", None))
___qtablewidgetitem2 = self.ta_queue_dl.horizontalHeaderItem(2)
___qtablewidgetitem2.setText(QCoreApplication.translate("MainWindow", "Name", None))
___qtablewidgetitem3 = self.ta_queue_dl.horizontalHeaderItem(3)
___qtablewidgetitem3.setText(QCoreApplication.translate("MainWindow", "Type", None))
___qtablewidgetitem4 = self.ta_queue_dl.horizontalHeaderItem(4)
___qtablewidgetitem4.setText(QCoreApplication.translate("MainWindow", "Quality", None))
self.pb_queue_item_remove.setText(QCoreApplication.translate("MainWindow", "Remove", None))
self.m_file.setTitle(QCoreApplication.translate("MainWindow", "File", None)) self.m_file.setTitle(QCoreApplication.translate("MainWindow", "File", None))
self.m_help.setTitle(QCoreApplication.translate("MainWindow", "Help", None)) self.m_help.setTitle(QCoreApplication.translate("MainWindow", "Help", None))
+582 -425
View File
File diff suppressed because it is too large Load Diff