From 6132596aca2c081ccfcbe438245a62e34bcb8c86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Harrault?= <benoit@harrault.fr> Date: Tue, 7 Jun 2022 23:48:49 +0200 Subject: [PATCH] Add a "create tambouille mix" button --- public/index.php | 15 +++++++++++ spotify/lib.php | 65 ++++++++++++++++++++++++++++++++++++++++++++++++ template.php | 3 ++- 3 files changed, 82 insertions(+), 1 deletion(-) diff --git a/public/index.php b/public/index.php index 0c64493..c420330 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 d2c3386..2653469 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 9a6948c..7d30e64 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> -- GitLab