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
|
||||
|
||||
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 = []
|
||||
|
||||
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:
|
||||
continue
|
||||
return None
|
||||
|
||||
if hasattr(item, "available") and not item.available:
|
||||
return None
|
||||
|
||||
explicit: str = ""
|
||||
# Check if item is available on TIDAL.
|
||||
if hasattr(item, "available") and not item.available:
|
||||
continue
|
||||
|
||||
if isinstance(item, Track | Video | Album):
|
||||
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_release: str = (
|
||||
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_user_added: str = (
|
||||
item.user_date_added.strftime("%Y-%m-%d_%H:%M") if getattr(item, "user_date_added", None) else ""
|
||||
)
|
||||
date_release: str = self._get_date_release(item)
|
||||
|
||||
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,
|
||||
artist=name_builder_artist(item),
|
||||
title=f"{name_builder_title(item)}{explicit}",
|
||||
@@ -658,9 +700,10 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
||||
date_release=date_release,
|
||||
)
|
||||
|
||||
result.append(result_item)
|
||||
elif isinstance(item, Video):
|
||||
result_item: ResultItem = ResultItem(
|
||||
def _result_item_from_video(
|
||||
self, idx: int, item, explicit: str, date_user_added: str, date_release: str
|
||||
) -> ResultItem:
|
||||
return ResultItem(
|
||||
position=idx,
|
||||
artist=name_builder_artist(item),
|
||||
title=f"{name_builder_title(item)}{explicit}",
|
||||
@@ -673,9 +716,8 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
||||
date_release=date_release,
|
||||
)
|
||||
|
||||
result.append(result_item)
|
||||
elif isinstance(item, Playlist):
|
||||
result_item: ResultItem = ResultItem(
|
||||
def _result_item_from_playlist(self, idx: int, item, date_user_added: str, date_release: str) -> ResultItem:
|
||||
return ResultItem(
|
||||
position=idx,
|
||||
artist=", ".join(artist.name for artist in item.promoted_artists) if item.promoted_artists else "",
|
||||
title=item.name,
|
||||
@@ -688,9 +730,10 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
||||
date_release=date_release,
|
||||
)
|
||||
|
||||
result.append(result_item)
|
||||
elif isinstance(item, Album):
|
||||
result_item: ResultItem = ResultItem(
|
||||
def _result_item_from_album(
|
||||
self, idx: int, item, explicit: str, date_user_added: str, date_release: str
|
||||
) -> ResultItem:
|
||||
return ResultItem(
|
||||
position=idx,
|
||||
artist=name_builder_artist(item),
|
||||
title="",
|
||||
@@ -703,15 +746,13 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
||||
date_release=date_release,
|
||||
)
|
||||
|
||||
result.append(result_item)
|
||||
elif isinstance(item, Mix):
|
||||
result_item: ResultItem = ResultItem(
|
||||
def _result_item_from_mix(self, idx: int, item, date_user_added: str, date_release: str) -> ResultItem:
|
||||
return ResultItem(
|
||||
position=idx,
|
||||
artist=item.sub_title,
|
||||
title=item.title,
|
||||
album="",
|
||||
# TODO: Calculate total duration.
|
||||
duration_sec=-1,
|
||||
duration_sec=-1, # TODO: Calculate total duration.
|
||||
obj=item,
|
||||
quality="",
|
||||
explicit=False,
|
||||
@@ -719,9 +760,8 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
||||
date_release=date_release,
|
||||
)
|
||||
|
||||
result.append(result_item)
|
||||
elif isinstance(item, Artist):
|
||||
result_item: ResultItem = ResultItem(
|
||||
def _result_item_from_artist(self, idx: int, item, date_user_added: str, date_release: str) -> ResultItem:
|
||||
return ResultItem(
|
||||
position=idx,
|
||||
artist=item.name,
|
||||
title="",
|
||||
@@ -734,10 +774,6 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
||||
date_release=date_release,
|
||||
)
|
||||
|
||||
result.append(result_item)
|
||||
|
||||
return result
|
||||
|
||||
def media_to_queue_download_model(
|
||||
self, media: Artist | Track | Video | Album | Playlist | Mix
|
||||
) -> QueueDownloadItem | bool:
|
||||
|
||||
Reference in New Issue
Block a user