diff --git a/public/index.php b/public/index.php index 6cd85fc0baa0e229c939e04a837b1a58aa638c0e..b9557736663bfb5924268b0bea37ed4b1c869a6e 100644 --- a/public/index.php +++ b/public/index.php @@ -43,6 +43,7 @@ $user = $api->me(); $templateData = [ 'user' => $user, 'playlists' => [], + 'topArtists' => [], 'infos' => [], 'errors' => [], @@ -53,6 +54,8 @@ if (isset($_GET['playlist'])) { $selectedPlaylistId = $_GET['playlist']; } +$generatePlaylistFromArtists = isset($_GET['generate-playlist-top-artists']); + if ($selectedPlaylistId) { $playlist = $api->getPlaylist($selectedPlaylistId); error_log('Will create new playlist from tracks in playlist '.$selectedPlaylistId.' "'.$playlist->name.'".'); @@ -88,10 +91,51 @@ if ($selectedPlaylistId) { 'name' => $newPlaylistName, ]); + $api->replacePlaylistTracks($newPlaylist->id, $pickedTrackIds); + $playlistLink = '<a href="'.$newPlaylist->external_urls->spotify.'">'.$newPlaylistName.'</a>'; + $templateData['infos'][] = 'Ok created new playlist with '.count($pickedTrackIds).' tracks: '.$playlistLink; +} elseif ($generatePlaylistFromArtists) { + $selectedArtists = $_GET['selected-artist']; + error_log('Will create new playlist with filterted recommendations from artists: '.join(', ', $selectedArtists).'".'); + $recommendedTrackIds = []; + + 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, remove duplicates + foreach ($recommendations->tracks as $recommendedTrack) { + $trackArtistInWantedArtists = false; + foreach ($recommendedTrack->artists as $trackArtist) { + if (\in_array($trackArtist->id, $selectedArtists)) { + $recommendedTrackIds[$recommendedTrack->id] = 1; + } + } + } + } + + $recommendedTrackIds = array_keys($recommendedTrackIds); + error_log('=> Got '.count($recommendedTrackIds).' unique recommendatations.'); + shuffle($recommendedTrackIds); + $pickedTrackIds = array_slice($recommendedTrackIds, 0, 50); + error_log('Keep '.count($pickedTrackIds).' random tracks.'); + + $now = new DateTime(); + $newPlaylistName = 'Fresh playlist ['.$now->format('Y-m-d H:i:s').']'; + error_log('Create new playlist "'.$newPlaylistName.'".'); + $newPlaylist = $api->createPlaylist([ + 'name' => $newPlaylistName, + ]); + $api->replacePlaylistTracks($newPlaylist->id, $pickedTrackIds); $playlistLink = '<a href="'.$newPlaylist->external_urls->spotify.'">'.$newPlaylistName.'</a>'; $templateData['infos'][] = 'Ok created new playlist with '.count($pickedTrackIds).' tracks: '.$playlistLink; } else { + $templateData['topArtists'] = $api->getMyTop('artists', ['limit' => 16, 'time_range' => 'short_term'])->items; $templateData['playlists'] = $api->getUserPlaylists($user->id)->items; } diff --git a/spotify/spotify.php b/spotify/spotify.php index 7a17d8371b922472e7abdf41315e9276473eb961..c5862dbd0842162f5158d4a457c3a8ca836cb2c8 100644 --- a/spotify/spotify.php +++ b/spotify/spotify.php @@ -15,4 +15,5 @@ $SPOTIFY_REQUIRED_SCOPES = [ 'playlist-modify-private', 'playlist-modify-public', 'user-read-private', + 'user-top-read', ]; diff --git a/template.php b/template.php index d56985d538dedca7726a9b51db90a4a3c652bb18..ec9d91a73ac93b215a3e4ffad24f0eb033ba27ca 100644 --- a/template.php +++ b/template.php @@ -14,7 +14,7 @@ <body class="container mt-2"> <div class="row"> - <div class="col-2"> + <div class="col-3"> <div class="card"> <?php if (count($templateData['user']->images)) { ?> @@ -32,7 +32,7 @@ </div> </div> - <div class="col-10"> + <div class="col-9"> <?php if (count($templateData['errors'])) { ?> <?php foreach ($templateData['errors'] as $message) { ?> @@ -46,6 +46,31 @@ <?php } ?> <?php } ?> + <?php if (count($templateData['topArtists'])) { ?> + <form class="clearfix"> + <legend>Generate playlist from artists:</legend> + <ul class="list-unstyled row row-cols-4"> + <?php foreach ($templateData['topArtists'] as $artist) { ?> + <li class="col"> + <div class="custom-control custom-checkbox"> + <input + type="checkbox" + class="custom-control-input" + id="check-top-artist-<?php echo $artist->id; ?>" + name="selected-artist[]" + value="<?php echo $artist->id; ?>" + > + <label class="custom-control-label" for="check-top-artist-<?php echo $artist->id; ?>"> + <?php echo $artist->name; ?> + </label> + </div> + </li> + <?php } ?> + </ul> + <button name="generate-playlist-top-artists" type="submit" class="btn btn-secondary float-end">🎶 Generate!</button> + </form> + <?php } ?> + <?php if (count($templateData['playlists'])) { ?> <h3>Please pick a playlist to get recommendations from:</h3> <div class="list-group">