diff --git a/public/index.php b/public/index.php index 0c64493bd853ae22f1a4fc3a7cb128b8d3eda966..c4203304c2a85f1383f3cc6201c729d7592d1fc9 100644 --- a/public/index.php +++ b/public/index.php @@ -78,6 +78,7 @@ $generatePlaylistFromPlaylist = isset($_GET['generate-playlist-from-playlist']); $generatePlaylistFromSelectedTopArtists = isset($_GET['generate-playlist-top-artists']); $generatePlaylistFromRandomTopArtists = isset($_GET['generate-playlist-random-top-artists']); $generateQuickPlaylistFromDailyMixes = isset($_GET['generate-quick-playlist-from-daily-mixes']); +$generateQuickPlaylistTambouilleMix = isset($_GET['generate-quick-playlist-tambouille-mix']); $showPlaylistContent = isset($_GET['show-playlist']); $action = ''; @@ -89,6 +90,8 @@ if ($generatePlaylistFromPlaylist) { $action = 'generate-playlist-from-random-top-artists'; } elseif ($generateQuickPlaylistFromDailyMixes) { $action = 'generate-playlist-from-daily-mixes'; +} elseif ($generateQuickPlaylistTambouilleMix) { + $action = 'generate-playlist-tambouille-mix'; } elseif ($showPlaylistContent) { $action = 'show-playlist-content'; } else { @@ -260,6 +263,18 @@ switch ($action) { $templateData['infos'][] = getCreatedPlaylistInformationMessage($api, $newPlaylist); break; + case 'generate-playlist-tambouille-mix': + $generateLongPlaylist = isset($_GET['check-quick-create-long-playlist']); + + printLog('Generate tambouille mix playlist (long playlist :'.($generateLongPlaylist ? 'yes' : 'no').')'); + + $newPlaylist = createPlaylistTambouilleMix( + $api, + $generateLongPlaylist ? $tracksCountInLongPlaylist : $tracksCountInShortPlaylist + ); + $templateData['infos'][] = getCreatedPlaylistInformationMessage($api, $newPlaylist); + break; + case 'show-playlist-content': printLog('Get content of playlist'); $playlistId = $_GET['id']; diff --git a/spotify/lib.php b/spotify/lib.php index d2c33862d07075c20aad839242a1073d84dc2911..2653469f307e289f017841ae9cacab4b149a549d 100644 --- a/spotify/lib.php +++ b/spotify/lib.php @@ -120,6 +120,71 @@ function createPlaylistFromDailyMixesTracks($api, $count = 50) return $api->getPlaylist($playlist->id); } +function createPlaylistTambouilleMix($api, $count = 50) +{ + // Get specific playlists + $wantedPlaylistsNames = [ + 'Daily Mix 1', + 'Daily Mix 2', + 'Radar des sorties', + 'Discover Weekly', # "Découvertes de la semaine" + 'Your Time Capsule', # "Votre Capsule Temporelle" + 'On Repeat', # "En boucle" + 'Repeat Rewind', # "En boucle : flashback" + ]; + + $userPlaylists = getAllPlaylistsFromUserId($api, $api->me()->id); + $userPlaylistsByName = []; + foreach ($userPlaylists as $userPlaylist) { + $userPlaylistsByName[$userPlaylist->name] = $userPlaylist->id; + } + + // Get all tracks, pick some and get recommandations from playlists + $trackIds = []; + foreach ($wantedPlaylistsNames as $playlistName) { + if (\array_key_exists($playlistName, $userPlaylistsByName)) { + $playlistId = $userPlaylistsByName[$playlistName]; + $selectedPlaylist = $api->getPlaylist($playlistId); + + $tracks = $selectedPlaylist->tracks->items; + foreach ($tracks as $track) { + $trackId = $track->track->id; + $selectedPlaylistTracks[$trackId] = $trackId; + } + + $tracksCount = \count($selectedPlaylistTracks); + + // Split playlist in two tracks lists + $tracksList1 = pickRandomTracksFromArray($selectedPlaylistTracks, max(intval($count / 5), intval($tracksCount / 5))); + $tracksList2 = pickRandomTracksFromArray($selectedPlaylistTracks, max(intval($count / 5), intval($tracksCount / 5))); + + // Directly pick first part of this playlist + foreach ($tracksList1 as $trackId) { + $trackIds[$trackId] = $trackId; + } + + // Get recommandations for other part + $chunks = array_chunk($tracksList2, 5); + foreach($chunks as $chunk) { + $recommendations = $api->getRecommendations([ + 'seed_tracks' => $chunk, + 'limit' => \count($chunk) + ]); + foreach ($recommendations->tracks as $recommendedTrack) { + $trackIds[$recommendedTrack->id] = $recommendedTrack; + } + } + } + } + + $pickedTrackIds = pickRandomTracksFromArray($trackIds, $count); + + $playlist = createEmptyPlaylist($api, 'Tambouille Mix'); + $api->replacePlaylistTracks($playlist->id, $pickedTrackIds); + + return $api->getPlaylist($playlist->id); +} + function getCreatedPlaylistInformationMessage($api, $playlist) { $link = '<a href="'.generateShowPlaylistUrl($playlist->id).'">'.$playlist->name.'</a>'; diff --git a/template.php b/template.php index 9a6948ce1db2a730b4f322bfc30a2f1fa8dcf972..7d30e6484565028a35fe29618456ff6272a25010 100644 --- a/template.php +++ b/template.php @@ -78,7 +78,8 @@ </div> <div class="col-md-4 col-sm-12"> <div class="btn-group float-end" role="group" aria-label="Action buttons"> - <button name="generate-quick-playlist-from-daily-mixes" type="submit" class="btn btn-primary">🎶 Mix daily mixes!</button> + <button name="generate-quick-playlist-from-daily-mixes" type="submit" class="btn btn-secondary">🎶 Mix daily mixes!</button> + <button name="generate-quick-playlist-tambouille-mix" type="submit" class="btn btn-primary">🎶 Pick nice tracks!</button> </div> </div> </div>