1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
|
# Architecture GUI Refactorée
## Vue d'ensemble
Le fichier `gui.py` a été refactorisé pour améliorer la maintenabilité en divisant la classe `MainWindow` monolithique (1837 lignes) en plusieurs modules organisés dans le dossier `gui/`.
## Structure des fichiers
```
tidal_dl_ng/
├── gui/
│ ├── __init__.py # Point d'entrée du module GUI
│ ├── activate.py # Fonction d'activation de l'application GUI
│ ├── main_window.py # Classe MainWindow principale
│ ├── initialization.py # Mixin: Initialisation des composants UI
│ ├── tidal_session.py # Mixin: Gestion de la session Tidal
│ ├── signals.py # Mixin: Gestion des signaux Qt
│ ├── progress.py # Mixin: Barres de progression
│ ├── ui_helpers.py # Mixin: Helpers UI (spinners, logs, statusbar)
│ ├── track_extras.py # Mixin: Cache et gestion des extras de tracks
│ ├── updates.py # Mixin: Vérification des mises à jour
│ ├── downloads.py # Mixin: Gestion des téléchargements
│ ├── trees_results.py # Mixin: Gestion des arbres et résultats
│ ├── context_menus.py # Mixin: Menus contextuels et actions
│ ├── history.py # Mixin: Historique et prévention des doublons
│ ├── covers.py # Manager de couvertures
│ ├── playlist.py # Manager de playlists
│ ├── queue.py # Manager de queue
│ └── search.py # Manager de recherche
├── gui.py # Point de compatibilité (redirige vers gui/)
```
## Mixins et Responsabilités
### 1. InitializationMixin (`initialization.py`)
Responsable de l'initialisation de tous les composants de l'interface utilisateur.
**Méthodes:**
- `_init_gui()` - Configuration de la fenêtre principale
- `_init_threads()` - Initialisation du pool de threads
- `_init_dl()` - Configuration de l'objet Download
- `_init_progressbar()` - Initialisation des barres de progression
- `_init_info()` - Configuration de l'image de couverture par défaut
- `_init_tree_results()` - Configuration de l'arbre des résultats
- `_init_tree_results_model()` - Configuration du modèle de l'arbre
- `_init_tree_queue()` - Configuration de la queue de téléchargement
- `_init_tree_lists()` - Configuration de l'arbre des listes utilisateur
- `_init_menu_actions()` - Ajout d'actions de menu personnalisées
- `_populate_quality()` - Remplissage des options de qualité
- `_populate_search_types()` - Remplissage des types de recherche
### 2. TidalSessionMixin (`tidal_session.py`)
Gère l'authentification et la session Tidal.
**Méthodes:**
- `init_tidal()` - Initialisation de la session Tidal avec gestion du login
- `on_logout()` - Déconnexion de Tidal
### 3. SignalsMixin (`signals.py`)
Configure toutes les connexions de signaux Qt.
**Méthodes:**
- `_init_signals()` - Connexion de tous les signaux aux slots
- `on_result_item_clicked()` - Gestion du clic sur un élément de résultat
- `on_quality_set_audio()` - Configuration de la qualité audio
- `on_quality_set_video()` - Configuration de la qualité vidéo
### 4. ProgressMixin (`progress.py`)
Gère les barres de progression.
**Méthodes:**
- `on_progress_reset()` - Réinitialisation des barres de progression
- `on_progress_list()` - Mise à jour de la barre de progression de liste
- `on_progress_item()` - Mise à jour de la barre de progression d'élément
- `on_progress_item_name()` - Définition du nom d'élément
- `on_progress_list_name()` - Définition du nom de liste
### 5. UIHelpersMixin (`ui_helpers.py`)
Fournit des fonctions utilitaires pour l'interface utilisateur.
**Méthodes:**
- `on_spinner_start()` - Démarrage d'un spinner de chargement
- `on_spinner_stop()` - Arrêt de tous les spinners
- `on_statusbar_message()` - Affichage d'un message dans la barre d'état
- `_log_output()` - Redirection des logs vers l'interface
- `button_reload_status()` - Mise à jour du statut du bouton de rechargement
### 6. TrackExtrasMixin (`track_extras.py`)
Gère le cache et la récupération des informations supplémentaires des tracks.
**Méthodes:**
- `get_track_extras()` - Récupération des extras (avec cache)
- `_on_invoke_callback()` - Invocation du callback dans le thread principal
- `_decorate_extras()` - Ajout de champs formatés aux extras
- `preload_covers_for_playlist()` - Préchargement des couvertures
### 7. UpdatesMixin (`updates.py`)
Gère la vérification des mises à jour de l'application.
**Méthodes:**
- `on_update_check()` - Vérification des mises à jour disponibles
- `on_version()` - Affichage du dialogue de version
### 8. DownloadsMixin (`downloads.py`)
Gère la queue de téléchargement et les opérations de téléchargement.
**Méthodes:**
- `on_download_results()` - Téléchargement des résultats sélectionnés
- `queue_download_media()` - Ajout d'un élément à la queue
- `watcher_queue_download()` - Surveillance de la queue
- `on_queue_download()` - Exécution d'un téléchargement
- `download()` - Téléchargement d'un élément média
- Méthodes de gestion de statut: `on_queue_download_item_downloading()`, etc.
### 9. TreesResultsMixin (`trees_results.py`)
Gère les arbres de vue et l'affichage des résultats.
**Méthodes:**
- `handle_filter_activated()` - Gestion des filtres d'en-tête
- `populate_tree_results()` - Remplissage de l'arbre des résultats
- `populate_tree_result_child()` - Création d'un élément enfant
- `on_tr_results_expanded()` - Gestion de l'expansion des résultats
- `tr_results_expanded()` - Chargement des enfants d'un élément
- `list_items_show_result()` - Affichage des éléments d'une liste
- `tidal_user_lists()` - Récupération des listes utilisateur
- `on_populate_tree_lists()` - Remplissage de l'arbre des listes
- `on_track_hover_confirmed()` - Gestion du survol d'un track
- `on_track_hover_left()` - Gestion de la sortie du survol
### 10. ContextMenusMixin (`context_menus.py`)
Gère les menus contextuels et leurs actions.
**Méthodes:**
- `menu_context_tree_results()` - Menu contextuel pour les résultats
- `menu_context_queue_download()` - Menu contextuel pour la queue
- `on_copy_url_share()` - Copie de l'URL de partage
- `on_download_album_from_track()` - Téléchargement de l'album d'un track
- `on_download_all_albums_from_playlist()` - Téléchargement de tous les albums
- `_extract_album_ids_from_tracks()` - Extraction des IDs d'albums
- `_load_albums_with_rate_limiting()` - Chargement avec limitation de débit
- `on_search_in_app()` - Recherche dans l'application
- `on_search_in_browser()` - Ouverture de recherche dans le navigateur
### 11. HistoryMixin (`history.py`)
Gère l'historique des téléchargements et la prévention des doublons.
**Méthodes:**
- `on_view_history()` - Affichage du dialogue d'historique
- `on_toggle_duplicate_prevention()` - Activation/désactivation de la prévention
- `on_mark_track_as_downloaded()` - Marquer un track comme téléchargé
- `on_mark_track_as_not_downloaded()` - Retirer le marquage
- `_update_downloaded_column()` - Mise à jour de la colonne UI
- `on_preferences()` - Ouverture du dialogue de préférences
- `on_settings_save()` - Sauvegarde des paramètres
## Classe MainWindow
La classe `MainWindow` hérite de tous les mixins et de `QtWidgets.QMainWindow` + `Ui_MainWindow`:
```python
class MainWindow(
QtWidgets.QMainWindow,
Ui_MainWindow,
InitializationMixin,
TidalSessionMixin,
SignalsMixin,
ProgressMixin,
UIHelpersMixin,
TrackExtrasMixin,
UpdatesMixin,
DownloadsMixin,
TreesResultsMixin,
ContextMenusMixin,
HistoryMixin,
):
...
```
## Compatibilité
Le fichier `gui.py` original est maintenu comme point de compatibilité :
- Redirige les imports vers `tidal_dl_ng.gui`
- Conserve les directives de compilation nuitka
- Permet une migration progressive
## Avantages de cette architecture
1. **Maintenabilité** : Chaque mixin a une responsabilité claire et limitée
2. **Lisibilité** : Fichiers plus petits et focalisés (100-300 lignes vs 1837)
3. **Testabilité** : Les mixins peuvent être testés individuellement
4. **Extensibilité** : Facile d'ajouter de nouvelles fonctionnalités
5. **Réutilisabilité** : Les mixins peuvent être réutilisés si nécessaire
6. **Organisation** : Structure logique par fonctionnalité
## Migration
Pour utiliser la nouvelle structure :
```python
# Ancienne méthode (toujours supportée)
from tidal_dl_ng.gui import gui_activate
# Nouvelle méthode recommandée
from tidal_dl_ng.gui import MainWindow
from tidal_dl_ng.gui.activate import gui_activate
```
## Notes
- Les avertissements IDE sur les "unresolved attributes" dans les mixins sont normaux
- Les mixins accèdent à `self` qui sera fourni par `MainWindow` via l'héritage multiple
- L'ordre des mixins dans l'héritage est important pour la résolution de méthode (MRO)
|