diff --git a/tidal_dl_ng/config.py b/tidal_dl_ng/config.py
index 1d17953..c6fdaee 100644
--- a/tidal_dl_ng/config.py
+++ b/tidal_dl_ng/config.py
@@ -168,9 +168,9 @@ class Tidal(BaseConfig, metaclass=SingletonMeta):
fn_print("You either do not have a token or your token is invalid.")
fn_print("No worries, we will handle this...")
# Login method: Device linking
- # self.session.login_oauth_simple(fn_print)
- # Login method: PKCE authorization (enables HiRes streaming)
- self.session.login_pkce(fn_print)
+ self.session.login_oauth_simple(fn_print)
+ # Login method: PKCE authorization (was necessary for HI_RES_LOSSLESS streaming earlier)
+ # self.session.login_pkce(fn_print)
is_login = self.login_finalize()
diff --git a/tidal_dl_ng/dialog.py b/tidal_dl_ng/dialog.py
index 92656dc..928f6c1 100644
--- a/tidal_dl_ng/dialog.py
+++ b/tidal_dl_ng/dialog.py
@@ -1,3 +1,4 @@
+import datetime
import os.path
import shutil
import webbrowser
@@ -83,24 +84,25 @@ class DialogLogin(QtWidgets.QDialog):
ui: Ui_DialogLogin
url_redirect: str
- return_code: int
- def __init__(self, url_login: str, hint: str, parent=None):
+ def __init__(self, url_login: str, hint: str, expires_in: int, parent=None):
super().__init__(parent)
+ datetime_current: datetime.datetime = datetime.datetime.now()
+ datetime_expires: datetime.datetime = datetime_current + datetime.timedelta(0, expires_in)
+
# Create an instance of the GUI
self.ui = Ui_DialogLogin()
# Run the .setupUi() method to show the GUI
self.ui.setupUi(self)
# Set data.
- self.ui.tb_url_login.setText(f'{url_login}')
+ self.ui.tb_url_login.setText(f'https://{url_login}')
self.ui.l_hint.setText(hint)
+ self.ui.l_expires_date_time.setText(datetime_expires.strftime("%Y-%m-%d %H:%M"))
# Show
self.return_code = self.exec()
- self.url_redirect = self.ui.te_url_redirect.toPlainText()
-
class DialogPreferences(QtWidgets.QDialog):
"""Preferences dialog."""
diff --git a/tidal_dl_ng/gui.py b/tidal_dl_ng/gui.py
index d85c8a0..4d3c38a 100644
--- a/tidal_dl_ng/gui.py
+++ b/tidal_dl_ng/gui.py
@@ -5,6 +5,7 @@ from collections.abc import Callable, Sequence
from PySide6.QtGui import QStandardItem
from requests.exceptions import HTTPError
+from tidalapi.session import LinkLogin
from tidal_dl_ng import __version__, update_available
from tidal_dl_ng.dialog import DialogLogin, DialogPreferences, DialogVersion
@@ -128,16 +129,20 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
result = self.tidal.login_token()
if not result:
- hint: str = "Watiting for user input."
+ hint: str = "After you have finished the TIDAL login via web browser click the 'OK' button."
+
while not result:
- url_login = self.tidal.session.pkce_login_url()
- d_login: DialogLogin = DialogLogin(url_login=url_login, hint=hint, parent=self)
- url_redirect: str = d_login.url_redirect
+ link_login: LinkLogin = self.tidal.session.get_link_login()
+ d_login: DialogLogin = DialogLogin(
+ url_login=link_login.verification_uri_complete,
+ hint=hint,
+ expires_in=link_login.expires_in,
+ parent=self,
+ )
if d_login.return_code == 1:
try:
- token: dict[str, str | int] = self.tidal.session.pkce_get_auth_token(url_redirect)
- self.tidal.session.process_auth_token(token)
+ self.tidal.session.process_link_login(link_login, until_expiry=False)
self.tidal.login_finalize()
result = True
diff --git a/tidal_dl_ng/ui/dialog_login.py b/tidal_dl_ng/ui/dialog_login.py
index bbc916f..59a78da 100644
--- a/tidal_dl_ng/ui/dialog_login.py
+++ b/tidal_dl_ng/ui/dialog_login.py
@@ -1,14 +1,14 @@
################################################################################
## Form generated from reading UI file 'dialog_login.ui'
##
-## Created by: Qt User Interface Compiler version 6.6.1
+## Created by: Qt User Interface Compiler version 6.8.0
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################
from PySide6.QtCore import QCoreApplication, QMetaObject, QRect, Qt
from PySide6.QtGui import QFont
-from PySide6.QtWidgets import QDialogButtonBox, QLabel, QSizePolicy, QTextBrowser, QTextEdit, QVBoxLayout, QWidget
+from PySide6.QtWidgets import QDialogButtonBox, QHBoxLayout, QLabel, QSizePolicy, QTextBrowser, QVBoxLayout, QWidget
class Ui_DialogLogin:
@@ -16,7 +16,7 @@ class Ui_DialogLogin:
if not DialogLogin.objectName():
DialogLogin.setObjectName("DialogLogin")
DialogLogin.resize(451, 400)
- sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
+ sizePolicy = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(DialogLogin.sizePolicy().hasHeightForWidth())
@@ -26,9 +26,10 @@ class Ui_DialogLogin:
self.bb_dialog.setGeometry(QRect(20, 350, 411, 32))
sizePolicy.setHeightForWidth(self.bb_dialog.sizePolicy().hasHeightForWidth())
self.bb_dialog.setSizePolicy(sizePolicy)
+ self.bb_dialog.setLayoutDirection(Qt.LayoutDirection.LeftToRight)
self.bb_dialog.setStyleSheet("")
- self.bb_dialog.setOrientation(Qt.Horizontal)
- self.bb_dialog.setStandardButtons(QDialogButtonBox.Cancel | QDialogButtonBox.Ok)
+ self.bb_dialog.setOrientation(Qt.Orientation.Horizontal)
+ self.bb_dialog.setStandardButtons(QDialogButtonBox.StandardButton.Cancel | QDialogButtonBox.StandardButton.Ok)
self.verticalLayoutWidget = QWidget(DialogLogin)
self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
self.verticalLayoutWidget.setGeometry(QRect(20, 20, 411, 325))
@@ -63,16 +64,32 @@ class Ui_DialogLogin:
self.lv_main.addWidget(self.tb_url_login)
- self.te_url_redirect = QTextEdit(self.verticalLayoutWidget)
- self.te_url_redirect.setObjectName("te_url_redirect")
+ self.horizontalLayout = QHBoxLayout()
+ self.horizontalLayout.setObjectName("horizontalLayout")
+ self.l_expires_description = QLabel(self.verticalLayoutWidget)
+ self.l_expires_description.setObjectName("l_expires_description")
- self.lv_main.addWidget(self.te_url_redirect)
+ self.horizontalLayout.addWidget(self.l_expires_description)
+
+ self.l_expires_date_time = QLabel(self.verticalLayoutWidget)
+ self.l_expires_date_time.setObjectName("l_expires_date_time")
+ font2 = QFont()
+ font2.setBold(True)
+ self.l_expires_date_time.setFont(font2)
+ self.l_expires_date_time.setAlignment(
+ Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignTrailing | Qt.AlignmentFlag.AlignVCenter
+ )
+
+ self.horizontalLayout.addWidget(self.l_expires_date_time)
+
+ self.lv_main.addLayout(self.horizontalLayout)
self.l_hint = QLabel(self.verticalLayoutWidget)
self.l_hint.setObjectName("l_hint")
sizePolicy.setHeightForWidth(self.l_hint.sizePolicy().hasHeightForWidth())
self.l_hint.setSizePolicy(sizePolicy)
self.l_hint.setFont(font1)
+ self.l_hint.setWordWrap(True)
self.lv_main.addWidget(self.l_hint)
@@ -86,19 +103,17 @@ class Ui_DialogLogin:
def retranslateUi(self, DialogLogin):
DialogLogin.setWindowTitle(QCoreApplication.translate("DialogLogin", "Dialog", None))
- self.l_header.setText(QCoreApplication.translate("DialogLogin", "TIDAL PKCE Login", None))
+ self.l_header.setText(QCoreApplication.translate("DialogLogin", "TIDAL Login (as Device)", None))
self.l_description.setText(
QCoreApplication.translate(
"DialogLogin",
- 'Click the link below and login with your TIDAL credentials. You will be redirected to an "Ooops" page'
- ' after a successful login. Copy the URL of this "Ooops" page and post it in the box below.',
+ "Click the link below and login with your TIDAL credentials. TIDAL will ask you, if you like to add this app as a new device. You need to confirm this.",
None,
)
)
self.tb_url_login.setPlaceholderText(QCoreApplication.translate("DialogLogin", "Copy this login URL...", None))
- self.te_url_redirect.setPlaceholderText(
- QCoreApplication.translate("DialogLogin", "Copy and paste the redirect URL after login here...", None)
- )
+ self.l_expires_description.setText(QCoreApplication.translate("DialogLogin", "This link expires at:", None))
+ self.l_expires_date_time.setText(QCoreApplication.translate("DialogLogin", "COMPUTING", None))
self.l_hint.setText(QCoreApplication.translate("DialogLogin", "Waiting...", None))
# retranslateUi
diff --git a/tidal_dl_ng/ui/dialog_login.ui b/tidal_dl_ng/ui/dialog_login.ui
index c9c9774..2ff401f 100644
--- a/tidal_dl_ng/ui/dialog_login.ui
+++ b/tidal_dl_ng/ui/dialog_login.ui
@@ -34,14 +34,17 @@
0
+
+ Qt::LayoutDirection::LeftToRight
+
- Qt::Horizontal
+ Qt::Orientation::Horizontal
- QDialogButtonBox::Cancel|QDialogButtonBox::Ok
+ QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok
@@ -69,7 +72,7 @@
- TIDAL PKCE Login
+ TIDAL Login (as Device)
@@ -87,7 +90,7 @@
- Click the link below and login with your TIDAL credentials. You will be redirected to an "Ooops" page after a successful login. Copy the URL of this "Ooops" page and post it in the box below.
+ Click the link below and login with your TIDAL credentials. TIDAL will ask you, if you like to add this app as a new device. You need to confirm this.
true
@@ -105,11 +108,30 @@
-
-
-
- Copy and paste the redirect URL after login here...
-
-
+
+
-
+
+
+ This link expires at:
+
+
+
+ -
+
+
+
+ true
+
+
+
+ COMPUTING
+
+
+ Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter
+
+
+
+
-
@@ -127,6 +149,9 @@
Waiting...
+
+ true
+