refactor(gui): ✨ Improve search_result_to_model method and extract helper functions
* Refactored `search_result_to_model` to use type hints with `list` instead of `[*SearchTypes]`. * Added detailed docstring for better understanding of parameters and return types. * Extracted logic into helper methods for better readability and maintainability. * Improved handling of item availability and explicit content representation.
This commit is contained in:
+73
-37
@@ -618,34 +618,76 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
|||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def search_result_to_model(self, items: [*SearchTypes]) -> [ResultItem]:
|
def search_result_to_model(self, items: list[SearchTypes]) -> list[ResultItem]:
|
||||||
|
"""Convert search results to ResultItem models.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
items (list[SearchTypes]): List of search result items.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
list[ResultItem]: List of ResultItem models.
|
||||||
|
"""
|
||||||
result = []
|
result = []
|
||||||
|
|
||||||
for idx, item in enumerate(items):
|
for idx, item in enumerate(items):
|
||||||
|
result_item = self._to_result_item(idx, item)
|
||||||
|
|
||||||
|
if result_item is not None:
|
||||||
|
result.append(result_item)
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
def _to_result_item(self, idx: int, item) -> ResultItem | None:
|
||||||
|
"""Helper to convert a single item to ResultItem, or None if not valid."""
|
||||||
if not item:
|
if not item:
|
||||||
continue
|
return None
|
||||||
|
|
||||||
|
if hasattr(item, "available") and not item.available:
|
||||||
|
return None
|
||||||
|
|
||||||
explicit: str = ""
|
explicit: str = ""
|
||||||
# Check if item is available on TIDAL.
|
|
||||||
if hasattr(item, "available") and not item.available:
|
|
||||||
continue
|
|
||||||
|
|
||||||
if isinstance(item, Track | Video | Album):
|
if isinstance(item, Track | Video | Album):
|
||||||
explicit = " 🅴" if item.explicit else ""
|
explicit = " 🅴" if item.explicit else ""
|
||||||
|
|
||||||
date_user_added: str = item.user_date_added.strftime("%Y-%m-%d_%H:%M") if item.user_date_added else ""
|
date_user_added: str = (
|
||||||
date_release: str = (
|
item.user_date_added.strftime("%Y-%m-%d_%H:%M") if getattr(item, "user_date_added", None) else ""
|
||||||
item.album.release_date.strftime("%Y-%m-%d_%H:%M")
|
|
||||||
if hasattr(item, "album") and item.album and item.album.release_date
|
|
||||||
else (
|
|
||||||
item.release_date.strftime("%Y-%m-%d_%H:%M")
|
|
||||||
if hasattr(item, "release_date") and item.release_date
|
|
||||||
else ""
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
|
date_release: str = self._get_date_release(item)
|
||||||
|
|
||||||
if isinstance(item, Track):
|
if isinstance(item, Track):
|
||||||
result_item: ResultItem = ResultItem(
|
return self._result_item_from_track(idx, item, explicit, date_user_added, date_release)
|
||||||
|
|
||||||
|
if isinstance(item, Video):
|
||||||
|
return self._result_item_from_video(idx, item, explicit, date_user_added, date_release)
|
||||||
|
|
||||||
|
if isinstance(item, Playlist):
|
||||||
|
return self._result_item_from_playlist(idx, item, date_user_added, date_release)
|
||||||
|
|
||||||
|
if isinstance(item, Album):
|
||||||
|
return self._result_item_from_album(idx, item, explicit, date_user_added, date_release)
|
||||||
|
|
||||||
|
if isinstance(item, Mix):
|
||||||
|
return self._result_item_from_mix(idx, item, date_user_added, date_release)
|
||||||
|
|
||||||
|
if isinstance(item, Artist):
|
||||||
|
return self._result_item_from_artist(idx, item, date_user_added, date_release)
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
def _get_date_release(self, item) -> str:
|
||||||
|
"""Get the release date string for an item."""
|
||||||
|
if hasattr(item, "album") and item.album and getattr(item.album, "release_date", None):
|
||||||
|
return item.album.release_date.strftime("%Y-%m-%d_%H:%M")
|
||||||
|
|
||||||
|
if hasattr(item, "release_date") and item.release_date:
|
||||||
|
return item.release_date.strftime("%Y-%m-%d_%H:%M")
|
||||||
|
|
||||||
|
return ""
|
||||||
|
|
||||||
|
def _result_item_from_track(
|
||||||
|
self, idx: int, item, explicit: str, date_user_added: str, date_release: str
|
||||||
|
) -> ResultItem:
|
||||||
|
return ResultItem(
|
||||||
position=idx,
|
position=idx,
|
||||||
artist=name_builder_artist(item),
|
artist=name_builder_artist(item),
|
||||||
title=f"{name_builder_title(item)}{explicit}",
|
title=f"{name_builder_title(item)}{explicit}",
|
||||||
@@ -658,9 +700,10 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
|||||||
date_release=date_release,
|
date_release=date_release,
|
||||||
)
|
)
|
||||||
|
|
||||||
result.append(result_item)
|
def _result_item_from_video(
|
||||||
elif isinstance(item, Video):
|
self, idx: int, item, explicit: str, date_user_added: str, date_release: str
|
||||||
result_item: ResultItem = ResultItem(
|
) -> ResultItem:
|
||||||
|
return ResultItem(
|
||||||
position=idx,
|
position=idx,
|
||||||
artist=name_builder_artist(item),
|
artist=name_builder_artist(item),
|
||||||
title=f"{name_builder_title(item)}{explicit}",
|
title=f"{name_builder_title(item)}{explicit}",
|
||||||
@@ -673,9 +716,8 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
|||||||
date_release=date_release,
|
date_release=date_release,
|
||||||
)
|
)
|
||||||
|
|
||||||
result.append(result_item)
|
def _result_item_from_playlist(self, idx: int, item, date_user_added: str, date_release: str) -> ResultItem:
|
||||||
elif isinstance(item, Playlist):
|
return ResultItem(
|
||||||
result_item: ResultItem = ResultItem(
|
|
||||||
position=idx,
|
position=idx,
|
||||||
artist=", ".join(artist.name for artist in item.promoted_artists) if item.promoted_artists else "",
|
artist=", ".join(artist.name for artist in item.promoted_artists) if item.promoted_artists else "",
|
||||||
title=item.name,
|
title=item.name,
|
||||||
@@ -688,9 +730,10 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
|||||||
date_release=date_release,
|
date_release=date_release,
|
||||||
)
|
)
|
||||||
|
|
||||||
result.append(result_item)
|
def _result_item_from_album(
|
||||||
elif isinstance(item, Album):
|
self, idx: int, item, explicit: str, date_user_added: str, date_release: str
|
||||||
result_item: ResultItem = ResultItem(
|
) -> ResultItem:
|
||||||
|
return ResultItem(
|
||||||
position=idx,
|
position=idx,
|
||||||
artist=name_builder_artist(item),
|
artist=name_builder_artist(item),
|
||||||
title="",
|
title="",
|
||||||
@@ -703,15 +746,13 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
|||||||
date_release=date_release,
|
date_release=date_release,
|
||||||
)
|
)
|
||||||
|
|
||||||
result.append(result_item)
|
def _result_item_from_mix(self, idx: int, item, date_user_added: str, date_release: str) -> ResultItem:
|
||||||
elif isinstance(item, Mix):
|
return ResultItem(
|
||||||
result_item: ResultItem = ResultItem(
|
|
||||||
position=idx,
|
position=idx,
|
||||||
artist=item.sub_title,
|
artist=item.sub_title,
|
||||||
title=item.title,
|
title=item.title,
|
||||||
album="",
|
album="",
|
||||||
# TODO: Calculate total duration.
|
duration_sec=-1, # TODO: Calculate total duration.
|
||||||
duration_sec=-1,
|
|
||||||
obj=item,
|
obj=item,
|
||||||
quality="",
|
quality="",
|
||||||
explicit=False,
|
explicit=False,
|
||||||
@@ -719,9 +760,8 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
|||||||
date_release=date_release,
|
date_release=date_release,
|
||||||
)
|
)
|
||||||
|
|
||||||
result.append(result_item)
|
def _result_item_from_artist(self, idx: int, item, date_user_added: str, date_release: str) -> ResultItem:
|
||||||
elif isinstance(item, Artist):
|
return ResultItem(
|
||||||
result_item: ResultItem = ResultItem(
|
|
||||||
position=idx,
|
position=idx,
|
||||||
artist=item.name,
|
artist=item.name,
|
||||||
title="",
|
title="",
|
||||||
@@ -734,10 +774,6 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
|||||||
date_release=date_release,
|
date_release=date_release,
|
||||||
)
|
)
|
||||||
|
|
||||||
result.append(result_item)
|
|
||||||
|
|
||||||
return result
|
|
||||||
|
|
||||||
def media_to_queue_download_model(
|
def media_to_queue_download_model(
|
||||||
self, media: Artist | Track | Video | Album | Playlist | Mix
|
self, media: Artist | Track | Video | Album | Playlist | Mix
|
||||||
) -> QueueDownloadItem | bool:
|
) -> QueueDownloadItem | bool:
|
||||||
|
|||||||
Reference in New Issue
Block a user