Files
tidal-dl/docs/playlist_api_architecture.md
T
Warry 296c6c7d6b feat: Add playlist management functionality and compliance checks
- Introduced a new "Playlists" column in results view with visual indicators for membership.
- Added `playlist_api.py` to handle playlist-related operations (fetch, add, remove tracks).
- Implemented `PlaylistManagerDialog` for seamless playlist addition/removal with caching.
- Integrated compliance check script (`check_agents_compliance.py`) for ensuring coding standards.
- Added extensive documentation (`playlist_membership_manager.md`) covering architecture and flow.
- Updated GUI logic and QStandardItemModel setup to include playlist data.
- Included unit tests for playlist management components and API.
2025-12-29 17:37:39 +01:00

3.4 KiB

Architecture des appels API pour les playlists

Vue d'ensemble

Tous les appels API liés aux playlists ont été centralisés dans un seul module pour une meilleure maintenabilité et cohérence.

Fichier centralisé : tidal_dl_ng/helper/playlist_api.py

Ce module contient toutes les fonctions d'interaction avec l'API Tidal pour les playlists :

Fonctions disponibles

1. get_user_playlists(session: Session) -> list[UserPlaylist]

  • Description: Récupère toutes les playlists de l'utilisateur
  • Paramètres: Session Tidal authentifiée
  • Retour: Liste d'objets UserPlaylist
  • Exceptions: RequestException, ValueError

2. get_playlist_items(playlist: UserPlaylist) -> list[Track]

  • Description: Récupère tous les morceaux d'une playlist
  • Paramètres: Objet UserPlaylist
  • Retour: Liste d'objets Track
  • Exceptions: RequestException

3. add_track_to_playlist(session: Session, playlist_id: str, track_id: str) -> None

  • Description: Ajoute un morceau à une playlist
  • Paramètres:
    • session: Session Tidal
    • playlist_id: UUID de la playlist
    • track_id: UUID du morceau
  • Exceptions: RequestException, ValueError

4. remove_track_from_playlist(session: Session, playlist_id: str, track_id: str) -> None

  • Description: Retire un morceau d'une playlist
  • Paramètres:
    • session: Session Tidal
    • playlist_id: UUID de la playlist
    • track_id: UUID du morceau
  • Exceptions: RequestException, ValueError
  • Note: Gère automatiquement la recherche de l'index du morceau

5. get_playlist_metadata(playlist: UserPlaylist) -> dict[str, str | int]

  • Description: Extrait les métadonnées d'une playlist
  • Paramètres: Objet UserPlaylist
  • Retour: Dictionnaire avec name, item_count, id

Modules utilisant l'API centralisée

1. tidal_dl_ng/gui/dialog_playlist_manager.py

Utilise :

  • add_track_to_playlist() - Pour ajouter des morceaux via l'interface
  • remove_track_from_playlist() - Pour retirer des morceaux via l'interface

2. tidal_dl_ng/gui/playlist_membership.py

Utilise :

  • get_user_playlists() - Pour charger les playlists au démarrage
  • get_playlist_items() - Pour construire le cache de memberships
  • get_playlist_metadata() - Pour afficher les noms et comptes

Avantages de cette architecture

  1. Maintenabilité : Un seul endroit pour modifier la logique API
  2. Cohérence : Même gestion d'erreurs partout
  3. Testabilité : Facile de mocker les fonctions API
  4. Logging centralisé : Tous les logs API au même endroit
  5. Évolutivité : Facile d'ajouter de nouvelles fonctions

Gestion des erreurs

Toutes les fonctions :

  • Loggent les erreurs avec logger_gui
  • Propagent les exceptions (RequestException) pour que l'appelant puisse gérer
  • Gèrent automatiquement les cas limites (playlist vide, morceau non trouvé, etc.)

Exemple d'utilisation

from tidal_dl_ng.helper.playlist_api import add_track_to_playlist, get_user_playlists

# Récupérer les playlists
playlists = get_user_playlists(session)

# Ajouter un morceau
try:
    add_track_to_playlist(session, playlist_id="abc123", track_id="def456")
    print("Morceau ajouté avec succès")
except RequestException as e:
    print(f"Erreur: {e}")

Migration future

Si besoin de passer à une autre bibliothèque API ou d'ajouter un cache HTTP, il suffit de modifier playlist_api.py sans toucher aux autres fichiers.