Paaxio 1.0
Plateforme de streaming musical - SAE IUT Bayonne
Chargement...
Recherche...
Aucune correspondance
controller_album.class.php
Aller à la documentation de ce fichier.
1<?php
2
26{
33 public function __construct(\Twig\Environment $twig, \Twig\Loader\FilesystemLoader $loader)
34 {
35 parent::__construct($loader, $twig);
36 }
37
46 public function afficher()
47 {
48 $idAlbum = isset($_GET['idAlbum']) ? (int)$_GET['idAlbum'] : null;
49
50 if (!$idAlbum) {
51 $this->redirectTo('home', 'afficher');
52 }
53
54 // Récupération de l'album
55 $managerAlbum = new AlbumDAO($this->getPdo());
56 $album = $managerAlbum->find($idAlbum);
57
58 if (!$album) {
59 $this->redirectTo('home', 'afficher');
60 }
61
62 // Récupération des chansons de l'album
63 $managerChanson = new ChansonDAO($this->getPdo());
64 $chansons = $managerChanson->rechercherParAlbum($idAlbum);
65
66 // Chargement du template
67 $template = $this->getTwig()->load('chanson_album.html.twig');
68 echo $template->render([
69 'page' => [
70 'title' => $album->getTitreAlbum(),
71 'name' => "album",
72 'description' => "Album dans Paaxio"
73 ],
74 'album' => $album,
75 'chansons' => $chansons,
76 ]);
77 }
78
86 public function lister()
87 {
88 // Récupération des albums
89 $managerAlbum = new AlbumDao($this->getPdo());
90 $albums = $managerAlbum->findAll();
91
92 // Choix du template
93 $template = $this->getTwig()->load('test.html.twig');
94
95 // Affichage de la page
96 echo $template->render(array(
97 'page' => [
98 'title' => "Albums",
99 'name' => "albums",
100 'description' => "Albums dans Paaxio"
101 ],
102 'testing' => $albums,
103 ));
104 }
105
113 public function listerTableau()
114 {
115 $managerAlbum = new AlbumDao($this->getPdo());
116 $albums = $managerAlbum->findAll();
117
118 // Génération de la vue
119 $template = $this->getTwig()->load('test.html.twig');
120 echo $template->render(array(
121 'page' => [
122 'title' => "Albums tableau",
123 'name' => "albumt",
124 'description' => "Albums tableau dans Paaxio"
125 ],
126 'testing' => $albums,
127 ));
128 }
129
139 public function afficherFormulaireAjout()
140 {
141 // Vérifier si l'utilisateur est un artiste connecté
142 // Connexion obligatoire pour ajouter un album (redirige vers connect si non connecté)
143 $this->requireRole(RoleEnum::Artiste);
144
145 $idAlbum = $_GET['idAlbum'] ?? null;
146 $albumExistant = null;
147 $managerAlbum = new AlbumDAO($this->getPdo());
148
149 if ($idAlbum) {
150 $albumExistant = $managerAlbum->find((int)$idAlbum);
151 // Vérifier que l'album appartient bien à l'artiste connecté
152 if (!$albumExistant || $albumExistant->getArtisteAlbum() !== $_SESSION['user_email']) {
153 $this->redirectTo('home', 'afficher');
154 }
155 }
156
157 // Récupérer les albums de l'artiste
158 $managerAlbum = new AlbumDAO($this->getPdo());
159 $albumsArtiste = $managerAlbum->findAllByArtistEmail($_SESSION['user_email']);
160
161 $template = $this->getTwig()->load('album_ajout.html.twig');
162 echo $template->render([
163 'page' => [
164 'title' => "Ajouter un Album/Single",
165 'name' => "album_ajout",
166 'description' => "Téléversez vos chansons pour créer un album ou un single."
167 ],
168 'session' => $_SESSION,
169 'albums_artiste' => $albumsArtiste,
170 'album_existant' => $albumExistant
171 ]);
172 }
173
182 public function afficherMaMusique()
183 {
184 // Restreindre l'accès aux artistes connectés
185 $this->requireRole(RoleEnum::Artiste);
186
187 $emailArtiste = $_SESSION['user_email'] ?? null;
188
189 if (!$emailArtiste) {
190 $this->redirectTo('home', 'afficher');
191 }
192
193 $managerAlbum = new AlbumDAO($this->getPdo());
194 $albumsArtiste = $managerAlbum->findAllByArtistEmail($emailArtiste);
195
196 $template = $this->getTwig()->load('ma_musique.html.twig');
197 echo $template->render([
198 'page' => [
199 'title' => "Ma Musique",
200 'name' => "maMusique",
201 'description' => "Tous mes albums et singles publiés sur Paaxio."
202 ],
203 'session' => $_SESSION,
204 'albums' => $albumsArtiste,
205 ]);
206 }
207
221 public function ajouterAlbum()
222 {
223 if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
224 $this->redirectTo('home', 'afficher');
225 }
226
227 $this->requireRole(RoleEnum::Artiste);
228
229 $managerChanson = new ChansonDAO($this->getPdo());
230 $managerGenre = new GenreDAO($this->getPdo());
231 $managerAlbum = new AlbumDAO($this->getPdo());
232
233 $idAlbumExistant = $_POST['id_album_existant'] ?? null;
234
235 if ($idAlbumExistant) {
236 // Ajout de chansons à un album existant
237 $albumCree = $managerAlbum->find((int)$idAlbumExistant);
238 if (!$albumCree || $albumCree->getArtisteAlbum() !== $_SESSION['user_email']) {
239 // Gérer l'erreur : l'album n'existe pas ou n'appartient pas à l'utilisateur
240 $this->redirectTo('home', 'afficher');
241 }
242 $idAlbum = $albumCree->getIdAlbum();
243 } else {
244 // Création d'un nouvel album
245 $album = new Album();
246 $album->setTitreAlbum($_POST['titre_album'] ?? '');
247 $album->setDateSortieAlbum($_POST['date_sortie'] ?? '');
248 $album->setArtisteAlbum($_SESSION['user_email']);
249
250 // Gérer la pochette de l'album
251 if (isset($_FILES['pochette_album']) && $_FILES['pochette_album']['error'] === UPLOAD_ERR_OK) {
252 $uploadDir = 'assets' . DIRECTORY_SEPARATOR . 'images' . DIRECTORY_SEPARATOR . 'albums' . DIRECTORY_SEPARATOR;
253 if (!is_dir($uploadDir)) {
254 mkdir($uploadDir, 0777, true);
255 }
256 $nomFichier = basename($_FILES['pochette_album']['name']);
257 $cheminPochette = $uploadDir . uniqid() . '-' . $nomFichier;
258 if (move_uploaded_file($_FILES['pochette_album']['tmp_name'], $cheminPochette)) {
259 $album->seturlPochetteAlbum($cheminPochette);
260 }
261 } else {
262 // Fournir une URL de pochette par défaut si aucune n'est téléchargée
263 $album->seturlPochetteAlbum('assets' . DIRECTORY_SEPARATOR . 'images' . DIRECTORY_SEPARATOR . 'albums' . DIRECTORY_SEPARATOR . 'default.png');
264 }
265 $idAlbum = $managerAlbum->create($album);
266 $albumCree = $managerAlbum->find($idAlbum);
267 }
268
269 // Gérer les chansons
270 if (isset($_POST['tracks']) && isset($_FILES['tracks'])) {
271 $uploadDirMusique = 'assets' . DIRECTORY_SEPARATOR . 'audio' . DIRECTORY_SEPARATOR;
272 // Inclure getID3 pour analyser les fichiers audio
273 require_once 'vendor/james-heinrich/getid3/getid3/getid3.php';
274 $getID3 = new getID3;
275
276 if (!is_dir($uploadDirMusique)) {
277 mkdir($uploadDirMusique, 0777, true);
278 }
279
280 foreach ($_POST['tracks'] as $index => $chansonData) {
281 // Vérifier si le fichier correspondant a été uploadé
282 if (!isset($_FILES['tracks']['tmp_name'][$index]['file']) || $_FILES['tracks']['error'][$index]['file'] !== UPLOAD_ERR_OK) {
283 continue; // Passer à la chanson suivante si le fichier est manquant ou a une erreur
284 }
285
286 $nomFichierOriginal = basename($_FILES['tracks']['name'][$index]['file']);
287 $cheminCible = $uploadDirMusique . uniqid() . '-' . $nomFichierOriginal;
288
289 if (!move_uploaded_file($_FILES['tracks']['tmp_name'][$index]['file'], $cheminCible)) {
290 continue; // Erreur lors du déplacement du fichier
291 }
292
293 // Analyser le fichier pour obtenir les métadonnées, y compris la durée
294 $infoFichier = $getID3->analyze($cheminCible);
295 $duree = (int)($infoFichier['playtime_seconds'] ?? 0);
296
297 $chanson = new Chanson();
298 $chanson->setTitreChanson($chansonData['title']);
299 $chanson->setDureeChanson($duree);
300 $chanson->setDateTeleversementChanson(new DateTime());
301 $chanson->setAlbumChanson($albumCree);
302 $chanson->setEmailPublicateur($_SESSION['user_email']);
303 $chanson->setUrlAudioChanson($cheminCible);
304
305 $nomGenre = $chansonData['genre'] ?? null;
306 if ($nomGenre) {
307 $genreExistant = $managerGenre->findByName($nomGenre);
308 if ($genreExistant) {
309 $chanson->setGenreChanson($genreExistant);
310 } else {
311 $idNouveauGenre = $managerGenre->create($nomGenre);
312 $chanson->setGenreChanson($managerGenre->find($idNouveauGenre));
313 }
314 }
315
316 $managerChanson->createChanson($chanson);
317 }
318 }
319
320 if ($idAlbumExistant) {
321 // Rediriger vers la page de détails de l'album mis à jour
322 $this->redirectTo('album', 'afficherDetails', ['idAlbum' => $idAlbumExistant, 'success' => 1]);
323 } else {
324 // Rediriger vers la page de l'album créé
325 $this->redirectTo('album', 'afficherDetails', ['idAlbum' => $idAlbum, 'success' => 1]);
326 }
327 }
328
338 public function afficherDetails()
339 {
340
341 $idAlbum = $_GET['idAlbum'] ?? null;
342 $idChanson = $_GET['idChanson'] ?? null;
343
344 if (!$idAlbum) {
345 // Gérer l'erreur, par exemple rediriger
346 $this->redirectTo('home', 'afficher');
347 }
348
349 $albumDAO = new AlbumDAO($this->getPDO());
350 $album = $albumDAO->find((int)$idAlbum);
351
352 $chansonDAO = new ChansonDAO($this->getPDO());
353 $chansons = $chansonDAO->rechercherParAlbum((int)$idAlbum);
354
355 $emailUtilisateur = $_SESSION['user_email'] ?? null;
356 if ($emailUtilisateur) {
357 foreach ($chansons as $chanson) {
358 $sqlLike = "SELECT 1 FROM likeChanson WHERE idChanson = :idChanson AND emailUtilisateur = :emailUtilisateur LIMIT 1";
359 $stmtLike = $this->getPDO()->prepare($sqlLike);
360 $stmtLike->execute([
361 ':idChanson' => $chanson->getIdChanson(),
362 ':emailUtilisateur' => $emailUtilisateur
363 ]);
364 $chanson->setIsLiked((bool) $stmtLike->fetchColumn());
365 }
366 }
367
368 // Déterminer le rôle de l'utilisateur à partir de la session
369 $userRole = $_SESSION['user_role'] ?? null;
370 $template = '';
371
372 // Choisir le template en fonction du rôle
373 // 2 pour artiste, 1 (ou autre) pour auditeur
374 if ($userRole === RoleEnum::Artiste && $album->getArtisteAlbum() === $_SESSION['user_email']) {
375 // Si l'utilisateur est l'artiste propriétaire de l'album, il voit la page d'édition.
376 $template = 'album_details_artiste.html.twig';
377 } else {
378 // Sinon (auditeur, ou artiste regardant l'album d'un autre), il voit la page de lecture.
379 $template = 'album_details_auditeur.html.twig';
380 }
381
382 $playlists = [];
383 $chansonPlaylistMap = [];
384 if ($emailUtilisateur) {
385 $managerPlaylist = new PlaylistDAO($this->getPdo());
386 $playlists = $managerPlaylist->findAllFromUser($emailUtilisateur);
387 $chansonIds = array_map(fn($c) => $c->getIdChanson(), $chansons);
388 $chansonPlaylistMap = $managerPlaylist->getPlaylistIdsForChansons($chansonIds, $emailUtilisateur);
389 }
390
391 $template = $this->getTwig()->load($template);
392 echo $template->render([
393 'album' => $album,
394 'chansons' => $chansons,
395 'chansonSelected' => $idChanson ? (int)$idChanson : null,
396 'session' => $_SESSION,
397 'playlists' => $playlists,
398 'chansonPlaylistMap' => $chansonPlaylistMap,
399 ]);
400 }
401
411 public function modifierChanson()
412 {
413 // Sécurité : vérifier la méthode, la session et le rôle
414 if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
415 $this->redirectTo('home', 'afficher');
416 }
417
418 $this->requireRole(RoleEnum::Artiste);
419
420 $idChanson = $_GET['idChanson'] ?? null;
421 $idAlbum = $_POST['id_album'] ?? null; // Assurez-vous que ce champ est dans le formulaire de la modale
422
423 if (!$idChanson || !$idAlbum) {
424 // Rediriger si les IDs sont manquants
425 $this->redirectTo('home', 'afficher', ['error' => 1]);
426 }
427
428 $chansonDAO = new ChansonDAO($this->getPDO());
429 $chanson = $chansonDAO->findId((int)$idChanson);
430
431 // Vérifier que la chanson existe et appartient bien à un album de l'artiste
432 if (!$chanson || $chanson->getAlbumChanson()->getArtisteAlbum() !== $_SESSION['user_email']) {
433 $this->redirectTo('home', 'afficher', ['error' => 'unauthorized']);
434 }
435
436 // Mettre à jour les informations
437 $chanson->setTitreChanson($_POST['titre_chanson']);
438
439 $genreDAO = new GenreDAO($this->getPDO());
440 $nomGenre = $_POST['genre_chanson'] ?? '';
441 $genre = $genreDAO->findOrCreateByName($nomGenre);
442 $chanson->setGenreChanson($genre);
443
444 $chansonDAO->updateChanson($chanson);
445
446 // Rediriger vers la page de l'album avec un message de succès
447 $this->redirectTo('album', 'afficherDetails', ['idAlbum' => $idAlbum, 'success_update' => 1]);
448 }
449
460 public function supprimerChanson()
461 {
462 if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
463 $this->redirectTo('home', 'afficher');
464 }
465
466 $this->requireRole(RoleEnum::Artiste);
467
468 $idChanson = $_GET['idChanson'] ?? null;
469 $idAlbum = $_POST['id_album'] ?? null;
470
471 if (!$idChanson || !$idAlbum) {
472 $this->redirectTo('home', 'afficher', ['error' => 1]);
473 }
474
475 $chansonDAO = new ChansonDAO($this->getPDO());
476 $chanson = $chansonDAO->findId((int)$idChanson);
477
478 if (!$chanson || !$chanson->getAlbumChanson() || $chanson->getAlbumChanson()->getArtisteAlbum() !== $_SESSION['user_email']) {
479 $this->redirectTo('home', 'afficher', ['error' => 'unauthorized']);
480 }
481
482 // Supprimer le fichier audio local si présent
483 $urlAudio = $chanson->getUrlAudioChanson();
484 if ($urlAudio && strpos($urlAudio, 'http') !== 0) {
485 // Chemin local attendu
486 if (file_exists($urlAudio) && is_writable($urlAudio)) {
487 @unlink($urlAudio);
488 }
489 }
490
491 // Supprimer la chanson en base
492 $chansonDAO->deleteChanson((int)$idChanson);
493
494 // Rediriger vers la page de détails de l'album
495 $this->redirectTo('album', 'afficherDetails', ['idAlbum' => $idAlbum, 'deleted' => 1]);
496 }
497}
Contrôleur dédié à la gestion des albums.
__construct(\Twig\Environment $twig, \Twig\Loader\FilesystemLoader $loader)
Constructeur du contrôleur album.
ajouterAlbum()
Traite l'ajout d'un nouvel album ou l'ajout de chansons à un album existant.
modifierChanson()
Modifie les informations d'une chanson.
afficher()
Affiche les détails d'un album avec ses chansons.
lister()
Liste tous les albums de la plateforme.
afficherFormulaireAjout()
Affiche le formulaire d'ajout d'album.
afficherDetails()
Affiche les détails d'un album avec vue différenciée selon le rôle.
supprimerChanson()
Supprime une chanson (action réservée à l'artiste propriétaire).
afficherMaMusique()
Affiche la page "Ma Musique" pour l'artiste connecté.
listerTableau()
Liste tous les albums sous forme de tableau.
Classe de base pour tous les contrôleurs de l'application.
Twig Environment $twig
requireRole($requiredRole)
Exige que l'utilisateur ait un rôle spécifique.
redirectTo(string $controller, string $method, array $params=[])
Redirige vers un contrôleur et une méthode donnés.
Twig Loader FilesystemLoader $loader
getPDO()
Récupère la connexion PDO.
getTwig()
Récupère l'environnement Twig.
$genreDAO
Definition include.php:329