diff --git a/public/index.php b/public/index.php index d006f2d4da1e78ea0a6cc469c4ece42c5672ec46..c9ece07209c170d008bba0f163d13abdd0fc6035 100644 --- a/public/index.php +++ b/public/index.php @@ -55,7 +55,8 @@ $templateData = [ ]; $generatePlaylistFromPlaylist = isset($_GET['generate-playlist-from-playlist']); -$generatePlaylistFromArtists = isset($_GET['generate-playlist-top-artists']); +$generatePlaylistFromSelectedTopArtists = isset($_GET['generate-playlist-top-artists']); +$generatePlaylistFromRandomTopArtists = isset($_GET['generate-playlist-random-top-artists']); if ($generatePlaylistFromPlaylist) { $selectedPlaylists = $_GET['selected-playlist']; @@ -109,7 +110,9 @@ if ($generatePlaylistFromPlaylist) { $newPlaylist = createPlaylistWithRandomTracks($api, $recommendedTrackIds); $templateData['infos'][] = getCreatedPlaylistInformationMessage($api, $newPlaylist); $templateData['playlist'] = createDisplayablePlaylist($newPlaylist); -} elseif ($generatePlaylistFromArtists) { + +} elseif ($generatePlaylistFromSelectedTopArtists) { + $selectedArtists = $_GET['selected-artist']; error_log('Will create new playlist with filterted recommendations from artists: '.join(', ', $selectedArtists).'".'); $recommendedTrackIds = []; @@ -140,6 +143,45 @@ if ($generatePlaylistFromPlaylist) { } } + $newPlaylist = createPlaylistWithRandomTracks($api, $recommendedTrackIds); + $templateData['infos'][] = getCreatedPlaylistInformationMessage($api, $newPlaylist); + $templateData['playlist'] = createDisplayablePlaylist($newPlaylist); + +} elseif ($generatePlaylistFromRandomTopArtists) { + + $countInTopArtists = random_int(4, 6); + $countInLessTopArtists = random_int(4, 6); + $limitBetweenTopAndLessTop = $topArtistsCount; + $selectedArtists = getRandomArtistsFromTopArtists($api, $countInTopArtists, $countInLessTopArtists, $limitBetweenTopAndLessTop); + error_log('Will create new playlist with filterted recommendations from random artists: '.join(', ', $selectedArtists).'".'); + $recommendedTrackIds = []; + + $shouldFilterByArtists = isset($_GET['check-top-artist-filter-artists']); + error_log('Filter by artists in selection: '.($shouldFilterByArtists ? 'yes' : 'no')); + + foreach ($selectedArtists as $selectedArtist) { + error_log('Get recommendations for artist '.$selectedArtist.''); + $recommendations = $api->getRecommendations([ + 'seed_artists' => $selectedArtist, + 'limit' => 100 + ]); + error_log(' -> Got '.count($recommendations->tracks).' recommendatations.'); + + // Filter by artist if requested, remove duplicates + foreach ($recommendations->tracks as $recommendedTrack) { + if ($shouldFilterByArtists) { + $trackArtistInWantedArtists = false; + foreach ($recommendedTrack->artists as $trackArtist) { + if (\in_array($trackArtist->id, $selectedArtists)) { + $recommendedTrackIds[$recommendedTrack->id] = 1; + } + } + } else { + $recommendedTrackIds[$recommendedTrack->id] = 1; + } + } + } + $newPlaylist = createPlaylistWithRandomTracks($api, $recommendedTrackIds); $templateData['infos'][] = getCreatedPlaylistInformationMessage($api, $newPlaylist); $templateData['playlist'] = createDisplayablePlaylist($newPlaylist); diff --git a/spotify/lib.php b/spotify/lib.php index 60cc9e9bcdecd4adbd0eed212289b749211288fe..b8b14d5d57f200eff6c6882de9246a7b76a57ee0 100644 --- a/spotify/lib.php +++ b/spotify/lib.php @@ -30,6 +30,40 @@ function pickRandomTrackFromArray($recommendedTrackIds, $count = 50) return $pickedTrackIds; } +function getRandomArtistsFromTopArtists($api, $countInTopArtists, $countInLessTopArtists, $limitBetweenTopAndLessTop) +{ + $top = $api->getMyTop( + 'artists', + [ + 'limit' => $limitBetweenTopAndLessTop, + 'time_range' => 'short_term' + ] + )->items; + shuffle($top); + $pickedTop = array_slice($top, 0, $countInTopArtists); + + $lessTop = $api->getMyTop( + 'artists', + [ + 'limit' => $limitBetweenTopAndLessTop, + 'offset' => $limitBetweenTopAndLessTop, + 'time_range' => 'short_term' + ] + )->items; + shuffle($lessTop); + $pickedLessTop = array_slice($lessTop, 0, $countInLessTopArtists); + + $randomlySelected = []; + foreach ($pickedTop as $artist) { + $randomlySelected[] = $artist->id; + } + foreach ($pickedLessTop as $artist) { + $randomlySelected[] = $artist->id; + } + + return $randomlySelected; +} + function createPlaylistWithRandomTracks($api, $trackIds, $count = 50) { $playlist = createEmptyPlaylist($api); diff --git a/template.php b/template.php index c6f9640d3c3ea1d6c7bedaad1690ac408e501f42..c2ed0fc72ebbca588bc45de11b39de7d934249af 100644 --- a/template.php +++ b/template.php @@ -53,8 +53,17 @@ <?php } ?> <?php if (count($templateData['topArtists'])) { ?> - <form class="clearfix"> - <legend>Generate playlist from artists:</legend> + <form class="clearfix mt-2"> + <div class="row"> + <div class="col-md-8 col-sm-12"> + <legend>Generate playlist from artists:</legend> + </div> + <div class="col-md-4 col-sm-12"> + <div class="btn-group float-end" role="group" aria-label="Action buttons"> + <button name="pick-random-artist" type="button" class="btn btn-link" onclick="pickRandomArtists()">🎲 Pick random artists</button> + </div> + </div> + </div> <ul class="list-unstyled row row-cols-md-4 row-cols-2"> <?php foreach ($templateData['topArtists'] as $artist) { ?> <li class="col"> @@ -92,8 +101,8 @@ </div> <div class="col-md-4 col-sm-12"> <div class="btn-group float-end" role="group" aria-label="Action buttons"> - <button name="pick-random-artist" type="button" class="btn btn-secondary" onclick="pickRandomArtists()">🎲 Pick random artists</button> - <button name="generate-playlist-top-artists" type="submit" class="btn btn-primary float-end">🎶 Generate!</button> + <button name="generate-playlist-random-top-artists" type="submit" class="btn btn-secondary">🎲 Random!</button> + <button name="generate-playlist-top-artists" type="submit" class="btn btn-primary">🎶 Generate!</button> </div> </div> </div>