✨ Explicit versions will be shown. Audio quality is shown in results and download table. Fixes #58
This commit is contained in:
+43
-6
@@ -23,6 +23,7 @@ from tidal_dl_ng.helper.tidal import (
|
|||||||
items_results_all,
|
items_results_all,
|
||||||
name_builder_artist,
|
name_builder_artist,
|
||||||
name_builder_title,
|
name_builder_title,
|
||||||
|
quality_audio_highest,
|
||||||
search_results_all,
|
search_results_all,
|
||||||
user_media_lists,
|
user_media_lists,
|
||||||
)
|
)
|
||||||
@@ -395,6 +396,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
|||||||
child.setText(3, item.title)
|
child.setText(3, item.title)
|
||||||
child.setText(4, item.album)
|
child.setText(4, item.album)
|
||||||
child.setText(5, duration)
|
child.setText(5, duration)
|
||||||
|
child.setText(6, item.quality)
|
||||||
|
|
||||||
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.
|
||||||
@@ -444,18 +446,24 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
|||||||
result = []
|
result = []
|
||||||
|
|
||||||
for idx, item in enumerate(items):
|
for idx, item in enumerate(items):
|
||||||
|
explicit: str = ""
|
||||||
# Check if item is available on TIDAL.
|
# Check if item is available on TIDAL.
|
||||||
if hasattr(item, "available") and not item.available:
|
if hasattr(item, "available") and not item.available:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
if isinstance(item, Track | Video | Album):
|
||||||
|
explicit = " 🅴" if item.explicit else ""
|
||||||
|
|
||||||
if isinstance(item, Track):
|
if isinstance(item, Track):
|
||||||
result_item: ResultItem = ResultItem(
|
result_item: ResultItem = ResultItem(
|
||||||
position=idx,
|
position=idx,
|
||||||
artist=name_builder_artist(item),
|
artist=name_builder_artist(item),
|
||||||
title=name_builder_title(item),
|
title=f"{name_builder_title(item)}{explicit}",
|
||||||
album=item.album.name,
|
album=item.album.name,
|
||||||
duration_sec=item.duration,
|
duration_sec=item.duration,
|
||||||
obj=item,
|
obj=item,
|
||||||
|
quality=quality_audio_highest(item),
|
||||||
|
explicit=item.explicit,
|
||||||
)
|
)
|
||||||
|
|
||||||
result.append(result_item)
|
result.append(result_item)
|
||||||
@@ -463,10 +471,12 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
|||||||
result_item: ResultItem = ResultItem(
|
result_item: ResultItem = ResultItem(
|
||||||
position=idx,
|
position=idx,
|
||||||
artist=name_builder_artist(item),
|
artist=name_builder_artist(item),
|
||||||
title=name_builder_title(item),
|
title=f"{name_builder_title(item)}{explicit}",
|
||||||
album=item.album.name if item.album else "",
|
album=item.album.name if item.album else "",
|
||||||
duration_sec=item.duration,
|
duration_sec=item.duration,
|
||||||
obj=item,
|
obj=item,
|
||||||
|
quality=item.video_quality,
|
||||||
|
explicit=item.explicit,
|
||||||
)
|
)
|
||||||
|
|
||||||
result.append(result_item)
|
result.append(result_item)
|
||||||
@@ -478,6 +488,8 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
|||||||
album="",
|
album="",
|
||||||
duration_sec=item.duration,
|
duration_sec=item.duration,
|
||||||
obj=item,
|
obj=item,
|
||||||
|
quality="",
|
||||||
|
explicit=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
result.append(result_item)
|
result.append(result_item)
|
||||||
@@ -486,9 +498,11 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
|||||||
position=idx,
|
position=idx,
|
||||||
artist=name_builder_artist(item),
|
artist=name_builder_artist(item),
|
||||||
title="",
|
title="",
|
||||||
album=item.name,
|
album=f"{item.name}{explicit}",
|
||||||
duration_sec=item.duration,
|
duration_sec=item.duration,
|
||||||
obj=item,
|
obj=item,
|
||||||
|
quality=quality_audio_highest(item),
|
||||||
|
explicit=item.explicit,
|
||||||
)
|
)
|
||||||
|
|
||||||
result.append(result_item)
|
result.append(result_item)
|
||||||
@@ -501,6 +515,8 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
|||||||
# TODO: Calculate total duration.
|
# TODO: Calculate total duration.
|
||||||
duration_sec=-1,
|
duration_sec=-1,
|
||||||
obj=item,
|
obj=item,
|
||||||
|
quality="",
|
||||||
|
explicit=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
result.append(result_item)
|
result.append(result_item)
|
||||||
@@ -512,6 +528,8 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
|||||||
album="",
|
album="",
|
||||||
duration_sec=-1,
|
duration_sec=-1,
|
||||||
obj=item,
|
obj=item,
|
||||||
|
quality="",
|
||||||
|
explicit=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
result.append(result_item)
|
result.append(result_item)
|
||||||
@@ -523,24 +541,43 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
|||||||
) -> QueueDownloadItem | bool:
|
) -> QueueDownloadItem | bool:
|
||||||
result: QueueDownloadItem | False
|
result: QueueDownloadItem | False
|
||||||
name: str = ""
|
name: str = ""
|
||||||
|
quality: str = ""
|
||||||
|
explicit: str = ""
|
||||||
|
|
||||||
# Check if item is available on TIDAL.
|
# Check if item is available on TIDAL.
|
||||||
if hasattr(media, "available") and not media.available:
|
if hasattr(media, "available") and not media.available:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
if isinstance(media, Track | Video | Album):
|
||||||
|
explicit = " 🅴" if media.explicit else ""
|
||||||
|
|
||||||
if isinstance(media, Track | Video):
|
if isinstance(media, Track | Video):
|
||||||
name = f"{name_builder_artist(media)} - {name_builder_title(media)}"
|
name = f"{name_builder_artist(media)} - {name_builder_title(media)}{explicit}"
|
||||||
elif isinstance(media, Playlist | Artist):
|
elif isinstance(media, Playlist | Artist):
|
||||||
name = media.name
|
name = media.name
|
||||||
elif isinstance(media, Album):
|
elif isinstance(media, Album):
|
||||||
name = f"{name_builder_artist(media)} - {media.name}"
|
name = f"{name_builder_artist(media)} - {media.name}{explicit}"
|
||||||
elif isinstance(media, Mix):
|
elif isinstance(media, Mix):
|
||||||
name = media.title
|
name = media.title
|
||||||
|
|
||||||
|
if isinstance(media, Track | Album):
|
||||||
|
quality_highest: str = quality_audio_highest(media)
|
||||||
|
|
||||||
|
if (
|
||||||
|
self.settings.data.quality_audio == quality_highest
|
||||||
|
or self.settings.data.quality_audio == Quality.hi_res_lossless
|
||||||
|
or (self.settings.data.quality_audio == Quality.hi_res and quality_highest == Quality.hi_res)
|
||||||
|
):
|
||||||
|
quality = quality_highest
|
||||||
|
else:
|
||||||
|
quality = self.settings.data.quality_audio
|
||||||
|
elif isinstance(media, Video):
|
||||||
|
quality = media.video_quality
|
||||||
|
|
||||||
if name:
|
if name:
|
||||||
result = QueueDownloadItem(
|
result = QueueDownloadItem(
|
||||||
name=name,
|
name=name,
|
||||||
quality="<quality>",
|
quality=quality,
|
||||||
type_media=type(media).__name__,
|
type_media=type(media).__name__,
|
||||||
status=QueueDownloadStatus.Waiting,
|
status=QueueDownloadStatus.Waiting,
|
||||||
obj=media,
|
obj=media,
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ from collections.abc import Callable
|
|||||||
|
|
||||||
from tidalapi import Album, Mix, Playlist, Session, Track, UserPlaylist, Video
|
from tidalapi import Album, Mix, Playlist, Session, Track, UserPlaylist, Video
|
||||||
from tidalapi.artist import Artist, Role
|
from tidalapi.artist import Artist, Role
|
||||||
|
from tidalapi.media import MediaMetadataTags, Quality
|
||||||
from tidalapi.session import SearchTypes
|
from tidalapi.session import SearchTypes
|
||||||
|
|
||||||
from tidal_dl_ng.constants import MediaType
|
from tidal_dl_ng.constants import MediaType
|
||||||
@@ -151,3 +152,18 @@ def instantiate_media(
|
|||||||
raise MediaUnknown
|
raise MediaUnknown
|
||||||
|
|
||||||
return media
|
return media
|
||||||
|
|
||||||
|
|
||||||
|
def quality_audio_highest(media: Track | Album) -> str:
|
||||||
|
quality: str
|
||||||
|
|
||||||
|
if MediaMetadataTags.hires_lossless in media.media_metadata_tags:
|
||||||
|
quality = Quality.hi_res_lossless
|
||||||
|
elif MediaMetadataTags.mqa in media.media_metadata_tags:
|
||||||
|
quality = f"{Quality.hi_res}"
|
||||||
|
elif MediaMetadataTags.lossless in media.media_metadata_tags:
|
||||||
|
quality = Quality.high_lossless
|
||||||
|
else:
|
||||||
|
quality = media.audio_quality
|
||||||
|
|
||||||
|
return quality
|
||||||
|
|||||||
@@ -24,6 +24,8 @@ class ResultItem:
|
|||||||
album: str
|
album: str
|
||||||
duration_sec: int
|
duration_sec: int
|
||||||
obj: object
|
obj: object
|
||||||
|
quality: str
|
||||||
|
explicit: bool
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
|
|||||||
Reference in New Issue
Block a user