summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Honz <exislow+github@gmail.com>2024-02-26 07:27:53 +0100
committerRobert Honz <exislow+github@gmail.com>2024-02-26 07:27:53 +0100
commitd845f40e540f33ec719f1cc3d6b2448456b009ac (patch)
tree6ca10c5dbd2288099b9bd393a14068da2c7c510a
parent43326ec93f2b8e06caaaf81acac8114dafa1bd61 (diff)
downloadtidal-dl-ng-d845f40e540f33ec719f1cc3d6b2448456b009ac.tar.gz
✨ Direct search for links in GUI is possible. ♻️ Instantiate media method was moved to helper.
-rw-r--r--tidal_dl_ng/download.py29
-rw-r--r--tidal_dl_ng/gui.py35
-rw-r--r--tidal_dl_ng/helper/tidal.py22
3 files changed, 57 insertions, 29 deletions
diff --git a/tidal_dl_ng/download.py b/tidal_dl_ng/download.py
index bac9e88..e2cfa6f 100644
--- a/tidal_dl_ng/download.py
+++ b/tidal_dl_ng/download.py
@@ -28,9 +28,9 @@ from tidal_dl_ng.constants import (
VideoExtensions,
)
from tidal_dl_ng.helper.decryption import decrypt_file, decrypt_security_token
-from tidal_dl_ng.helper.exceptions import MediaMissing, MediaUnknown, UnknownManifestFormat
+from tidal_dl_ng.helper.exceptions import MediaMissing, UnknownManifestFormat
from tidal_dl_ng.helper.path import check_file_exists, format_path_media, path_file_sanitize
-from tidal_dl_ng.helper.tidal import items_results_all, name_builder_item
+from tidal_dl_ng.helper.tidal import instantiate_media, items_results_all, name_builder_item
from tidal_dl_ng.metadata import Metadata
from tidal_dl_ng.model.gui_data import ProgressBars
from tidal_dl_ng.model.tidal import StreamManifest
@@ -154,27 +154,6 @@ class Download:
return tmp_path_file_decrypted
- def instantiate_media(
- self,
- session: Session,
- media_type: type[MediaType.TRACK, MediaType.VIDEO, MediaType.ALBUM, MediaType.PLAYLIST, MediaType.MIX],
- id_media: str,
- ) -> Track | Video:
- if media_type == MediaType.TRACK:
- media = Track(session, id_media)
- elif media_type == MediaType.VIDEO:
- media = Video(session, id_media)
- elif media_type == MediaType.ALBUM:
- media = Album(self.session, id_media)
- elif media_type == MediaType.PLAYLIST:
- media = Playlist(self.session, id_media)
- elif media_type == MediaType.MIX:
- media = Mix(self.session, id_media)
- else:
- raise MediaUnknown
-
- return media
-
def item(
self,
file_template: str,
@@ -186,7 +165,7 @@ class Download:
) -> (bool, str):
# If no media instance is provided, we need to create the media instance.
if media_id and media_type:
- media = self.instantiate_media(self.session, media_type, media_id)
+ media = instantiate_media(self.session, media_type, media_id)
elif not media:
raise MediaMissing
@@ -350,7 +329,7 @@ class Download:
):
# If no media instance is provided, we need to create the media instance.
if media_id and media_type:
- media = self.instantiate_media(self.session, media_type, media_id)
+ media = instantiate_media(self.session, media_type, media_id)
elif not media:
raise MediaMissing
diff --git a/tidal_dl_ng/gui.py b/tidal_dl_ng/gui.py
index 6c904d7..0eb5697 100644
--- a/tidal_dl_ng/gui.py
+++ b/tidal_dl_ng/gui.py
@@ -7,7 +7,14 @@ 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.path import get_format_template
-from tidal_dl_ng.helper.tidal import items_results_all, search_results_all, user_media_lists
+from tidal_dl_ng.helper.tidal import (
+ get_tidal_media_id,
+ get_tidal_media_type,
+ instantiate_media,
+ items_results_all,
+ search_results_all,
+ user_media_lists,
+)
try:
import qdarktheme
@@ -342,9 +349,17 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
self.apply_settings(self.settings)
def search(self, query: str, types_media: SearchTypes) -> [ResultItem]:
- result_search: dict[str, [SearchTypes]] = search_results_all(
- session=self.tidal.session, needle=query, types_media=types_media
- )
+ # If a direct link was searched for, skip search and create the object from the link directly.
+ if "http" in query:
+ media_type = get_tidal_media_type(query)
+ item_id = get_tidal_media_id(query)
+ media = instantiate_media(self.tidal.session, media_type, item_id)
+ result_search = {"direct": [media]}
+ else:
+ result_search: dict[str, [SearchTypes]] = search_results_all(
+ session=self.tidal.session, needle=query, types_media=types_media
+ )
+
result: [ResultItem] = []
for _media_type, l_media in result_search.items():
@@ -405,6 +420,18 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
)
result.append(result_item)
+ elif isinstance(item, Mix):
+ result_item: ResultItem = ResultItem(
+ position=idx,
+ artist=item.sub_title,
+ title=item.title,
+ album="",
+ # TODO: Calculate total duration.
+ duration_sec=-1,
+ obj=item,
+ )
+
+ result.append(result_item)
return result
diff --git a/tidal_dl_ng/helper/tidal.py b/tidal_dl_ng/helper/tidal.py
index 9c4eeba..bdb2abf 100644
--- a/tidal_dl_ng/helper/tidal.py
+++ b/tidal_dl_ng/helper/tidal.py
@@ -2,6 +2,7 @@ from tidalapi import Album, Mix, Playlist, Session, Track, UserPlaylist, Video
from tidalapi.session import SearchTypes
from tidal_dl_ng.constants import MediaType
+from tidal_dl_ng.helper.exceptions import MediaUnknown
def name_builder_artist(media: Track) -> str:
@@ -104,3 +105,24 @@ def user_media_lists(session: Session) -> [Playlist | UserPlaylist | Mix]:
result: [Playlist | UserPlaylist | Mix] = user_playlists + user_mixes
return result
+
+
+def instantiate_media(
+ session: Session,
+ media_type: type[MediaType.TRACK, MediaType.VIDEO, MediaType.ALBUM, MediaType.PLAYLIST, MediaType.MIX],
+ id_media: str,
+) -> Track | Video:
+ if media_type == MediaType.TRACK:
+ media = Track(session, id_media)
+ elif media_type == MediaType.VIDEO:
+ media = Video(session, id_media)
+ elif media_type == MediaType.ALBUM:
+ media = Album(session, id_media)
+ elif media_type == MediaType.PLAYLIST:
+ media = Playlist(session, id_media)
+ elif media_type == MediaType.MIX:
+ media = Mix(session, id_media)
+ else:
+ raise MediaUnknown
+
+ return media