✨ Explicit versions will be shown. Audio quality is shown in results and download table. Fixes #58

This commit is contained in:
Robert Honz
2024-04-20 11:28:38 +02:00
parent 2badadb6ea
commit b57d36ac80
3 changed files with 61 additions and 6 deletions
+43 -6
View File
@@ -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,
+16
View File
@@ -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
+2
View File
@@ -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