summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Honz <exislow+github@gmail.com>2025-07-01 13:35:17 +0200
committerRobert Honz <exislow+github@gmail.com>2025-07-01 13:35:17 +0200
commitaa532f62fc5410470e607d51b7cfecfb2768bf61 (patch)
treed226829a5237ac6027170a029e08cb92b8ff0c9e
parent6b99c4ba625b8164ac8c1a142c96a31f6f88223a (diff)
downloadtidal-dl-ng-aa532f62fc5410470e607d51b7cfecfb2768bf61.tar.gz
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.
-rw-r--r--tidal_dl_ng/gui.py246
1 files changed, 141 insertions, 105 deletions
diff --git a/tidal_dl_ng/gui.py b/tidal_dl_ng/gui.py
index 73da806..fb63632 100644
--- a/tidal_dl_ng/gui.py
+++ b/tidal_dl_ng/gui.py
@@ -618,125 +618,161 @@ 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):
- if not item:
- continue
+ result_item = self._to_result_item(idx, item)
- explicit: str = ""
- # Check if item is available on TIDAL.
- if hasattr(item, "available") and not item.available:
- continue
+ if result_item is not None:
+ result.append(result_item)
- if isinstance(item, Track | Video | Album):
- explicit = " 🅴" if item.explicit else ""
+ return result
- 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 ""
- )
- )
+ 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:
+ return None
- if isinstance(item, Track):
- result_item: ResultItem = ResultItem(
- position=idx,
- artist=name_builder_artist(item),
- title=f"{name_builder_title(item)}{explicit}",
- album=item.album.name,
- duration_sec=item.duration,
- obj=item,
- quality=quality_audio_highest(item),
- explicit=bool(item.explicit),
- date_user_added=date_user_added,
- date_release=date_release,
- )
+ if hasattr(item, "available") and not item.available:
+ return None
- result.append(result_item)
- elif isinstance(item, Video):
- result_item: ResultItem = ResultItem(
- position=idx,
- artist=name_builder_artist(item),
- title=f"{name_builder_title(item)}{explicit}",
- album=item.album.name if item.album else "",
- duration_sec=item.duration,
- obj=item,
- quality=item.video_quality,
- explicit=bool(item.explicit),
- date_user_added=date_user_added,
- date_release=date_release,
- )
+ explicit: str = ""
+ if isinstance(item, Track | Video | Album):
+ explicit = " 🅴" if item.explicit else ""
- result.append(result_item)
- elif isinstance(item, Playlist):
- result_item: ResultItem = ResultItem(
- position=idx,
- artist=", ".join(artist.name for artist in item.promoted_artists) if item.promoted_artists else "",
- title=item.name,
- album="",
- duration_sec=item.duration,
- obj=item,
- quality="",
- explicit=False,
- date_user_added=date_user_added,
- date_release=date_release,
- )
+ 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)
- result.append(result_item)
- elif isinstance(item, Album):
- result_item: ResultItem = ResultItem(
- position=idx,
- artist=name_builder_artist(item),
- title="",
- album=f"{item.name}{explicit}",
- duration_sec=item.duration,
- obj=item,
- quality=quality_audio_highest(item),
- explicit=bool(item.explicit),
- date_user_added=date_user_added,
- date_release=date_release,
- )
+ if isinstance(item, Track):
+ return self._result_item_from_track(idx, item, explicit, date_user_added, date_release)
- 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,
- quality="",
- explicit=False,
- date_user_added=date_user_added,
- date_release=date_release,
- )
+ if isinstance(item, Video):
+ return self._result_item_from_video(idx, item, explicit, date_user_added, date_release)
- result.append(result_item)
- elif isinstance(item, Artist):
- result_item: ResultItem = ResultItem(
- position=idx,
- artist=item.name,
- title="",
- album="",
- duration_sec=-1,
- obj=item,
- quality="",
- explicit=False,
- date_user_added=date_user_added,
- date_release=date_release,
- )
+ if isinstance(item, Playlist):
+ return self._result_item_from_playlist(idx, item, date_user_added, date_release)
- result.append(result_item)
+ if isinstance(item, Album):
+ return self._result_item_from_album(idx, item, explicit, date_user_added, date_release)
- return result
+ 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}",
+ album=item.album.name,
+ duration_sec=item.duration,
+ obj=item,
+ quality=quality_audio_highest(item),
+ explicit=bool(item.explicit),
+ date_user_added=date_user_added,
+ date_release=date_release,
+ )
+
+ 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}",
+ album=item.album.name if item.album else "",
+ duration_sec=item.duration,
+ obj=item,
+ quality=item.video_quality,
+ explicit=bool(item.explicit),
+ date_user_added=date_user_added,
+ date_release=date_release,
+ )
+
+ 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,
+ album="",
+ duration_sec=item.duration,
+ obj=item,
+ quality="",
+ explicit=False,
+ date_user_added=date_user_added,
+ date_release=date_release,
+ )
+
+ 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="",
+ album=f"{item.name}{explicit}",
+ duration_sec=item.duration,
+ obj=item,
+ quality=quality_audio_highest(item),
+ explicit=bool(item.explicit),
+ date_user_added=date_user_added,
+ date_release=date_release,
+ )
+
+ 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="",
+ duration_sec=-1, # TODO: Calculate total duration.
+ obj=item,
+ quality="",
+ explicit=False,
+ date_user_added=date_user_added,
+ date_release=date_release,
+ )
+
+ 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="",
+ album="",
+ duration_sec=-1,
+ obj=item,
+ quality="",
+ explicit=False,
+ date_user_added=date_user_added,
+ date_release=date_release,
+ )
def media_to_queue_download_model(
self, media: Artist | Track | Video | Album | Playlist | Mix