223 if ($_SERVER[
'REQUEST_METHOD'] !==
'POST') {
229 $managerChanson =
new ChansonDAO($this->getPdo());
230 $managerGenre =
new GenreDAO($this->getPdo());
231 $managerAlbum =
new AlbumDAO($this->getPdo());
233 $idAlbumExistant = $_POST[
'id_album_existant'] ??
null;
235 if ($idAlbumExistant) {
237 $albumCree = $managerAlbum->find((
int)$idAlbumExistant);
238 if (!$albumCree || $albumCree->getArtisteAlbum() !== $_SESSION[
'user_email']) {
242 $idAlbum = $albumCree->getIdAlbum();
245 $album =
new Album();
246 $album->setTitreAlbum($_POST[
'titre_album'] ??
'');
247 $album->setDateSortieAlbum($_POST[
'date_sortie'] ??
'');
248 $album->setArtisteAlbum($_SESSION[
'user_email']);
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);
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);
263 $album->seturlPochetteAlbum(
'assets' . DIRECTORY_SEPARATOR .
'images' . DIRECTORY_SEPARATOR .
'albums' . DIRECTORY_SEPARATOR .
'default.png');
265 $idAlbum = $managerAlbum->create($album);
266 $albumCree = $managerAlbum->find($idAlbum);
270 if (isset($_POST[
'tracks']) && isset($_FILES[
'tracks'])) {
271 $uploadDirMusique =
'assets' . DIRECTORY_SEPARATOR .
'audio' . DIRECTORY_SEPARATOR;
273 require_once
'vendor/james-heinrich/getid3/getid3/getid3.php';
274 $getID3 =
new getID3;
276 if (!is_dir($uploadDirMusique)) {
277 mkdir($uploadDirMusique, 0777,
true);
280 foreach ($_POST[
'tracks'] as $index => $chansonData) {
282 if (!isset($_FILES[
'tracks'][
'tmp_name'][$index][
'file']) || $_FILES[
'tracks'][
'error'][$index][
'file'] !== UPLOAD_ERR_OK) {
286 $nomFichierOriginal = basename($_FILES[
'tracks'][
'name'][$index][
'file']);
287 $cheminCible = $uploadDirMusique . uniqid() .
'-' . $nomFichierOriginal;
289 if (!move_uploaded_file($_FILES[
'tracks'][
'tmp_name'][$index][
'file'], $cheminCible)) {
294 $infoFichier = $getID3->analyze($cheminCible);
295 $duree = (int)($infoFichier[
'playtime_seconds'] ?? 0);
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);
305 $nomGenre = $chansonData[
'genre'] ??
null;
307 $genreExistant = $managerGenre->findByName($nomGenre);
308 if ($genreExistant) {
309 $chanson->setGenreChanson($genreExistant);
311 $idNouveauGenre = $managerGenre->create($nomGenre);
312 $chanson->setGenreChanson($managerGenre->find($idNouveauGenre));
316 $managerChanson->createChanson($chanson);
320 if ($idAlbumExistant) {
322 $this->
redirectTo(
'album',
'afficherDetails', [
'idAlbum' => $idAlbumExistant,
'success' => 1]);
325 $this->
redirectTo(
'album',
'afficherDetails', [
'idAlbum' => $idAlbum,
'success' => 1]);
341 $idAlbum = $_GET[
'idAlbum'] ??
null;
342 $idChanson = $_GET[
'idChanson'] ??
null;
350 $album = $albumDAO->find((
int)$idAlbum);
353 $chansons = $chansonDAO->rechercherParAlbum((
int)$idAlbum);
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);
361 ':idChanson' => $chanson->getIdChanson(),
362 ':emailUtilisateur' => $emailUtilisateur
364 $chanson->setIsLiked((
bool) $stmtLike->fetchColumn());
369 $userRole = $_SESSION[
'user_role'] ??
null;
374 if ($userRole === RoleEnum::Artiste && $album->getArtisteAlbum() === $_SESSION[
'user_email']) {
376 $template =
'album_details_artiste.html.twig';
379 $template =
'album_details_auditeur.html.twig';
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);
391 $template = $this->
getTwig()->load($template);
392 echo $template->render([
394 'chansons' => $chansons,
395 'chansonSelected' => $idChanson ? (
int)$idChanson :
null,
396 'session' => $_SESSION,
397 'playlists' => $playlists,
398 'chansonPlaylistMap' => $chansonPlaylistMap,
414 if ($_SERVER[
'REQUEST_METHOD'] !==
'POST') {
420 $idChanson = $_GET[
'idChanson'] ??
null;
421 $idAlbum = $_POST[
'id_album'] ??
null;
423 if (!$idChanson || !$idAlbum) {
425 $this->
redirectTo(
'home',
'afficher', [
'error' => 1]);
429 $chanson = $chansonDAO->findId((
int)$idChanson);
432 if (!$chanson || $chanson->getAlbumChanson()->getArtisteAlbum() !== $_SESSION[
'user_email']) {
433 $this->
redirectTo(
'home',
'afficher', [
'error' =>
'unauthorized']);
437 $chanson->setTitreChanson($_POST[
'titre_chanson']);
440 $nomGenre = $_POST[
'genre_chanson'] ??
'';
441 $genre =
$genreDAO->findOrCreateByName($nomGenre);
442 $chanson->setGenreChanson($genre);
444 $chansonDAO->updateChanson($chanson);
447 $this->
redirectTo(
'album',
'afficherDetails', [
'idAlbum' => $idAlbum,
'success_update' => 1]);
462 if ($_SERVER[
'REQUEST_METHOD'] !==
'POST') {
468 $idChanson = $_GET[
'idChanson'] ??
null;
469 $idAlbum = $_POST[
'id_album'] ??
null;
471 if (!$idChanson || !$idAlbum) {
472 $this->
redirectTo(
'home',
'afficher', [
'error' => 1]);
476 $chanson = $chansonDAO->findId((
int)$idChanson);
478 if (!$chanson || !$chanson->getAlbumChanson() || $chanson->getAlbumChanson()->getArtisteAlbum() !== $_SESSION[
'user_email']) {
479 $this->
redirectTo(
'home',
'afficher', [
'error' =>
'unauthorized']);
483 $urlAudio = $chanson->getUrlAudioChanson();
484 if ($urlAudio && strpos($urlAudio,
'http') !== 0) {
486 if (file_exists($urlAudio) && is_writable($urlAudio)) {
492 $chansonDAO->deleteChanson((
int)$idChanson);
495 $this->
redirectTo(
'album',
'afficherDetails', [
'idAlbum' => $idAlbum,
'deleted' => 1]);