<?php require '../spotify/spotify.php'; require '../spotify/lib.php'; if (isset($_GET['logout'])) { $_SESSION['accessToken'] = ''; $_SESSION['refreshToken'] = ''; } $_SESSION['accessToken'] = isset($_SESSION['accessToken']) ? $_SESSION['accessToken'] : ''; $_SESSION['refreshToken'] = isset($_SESSION['refreshToken']) ? $_SESSION['refreshToken'] : ''; if (!$_SESSION['accessToken']) { header('Location: auth.php'); die(); } $session = new SpotifyWebAPI\Session($CLIENT_ID, $CLIENT_SECRET, $REDIRECT_URI); // Use previously requested tokens fetched from session if ($_SESSION['accessToken']) { $session->setAccessToken($_SESSION['accessToken']); $session->setRefreshToken($_SESSION['refreshToken']); } else { // Or request a new access token $session->refreshAccessToken($_SESSION['refreshToken']); } $options = [ 'scope' => $SPOTIFY_REQUIRED_SCOPES, 'auto_refresh' => true, ]; $api = new SpotifyWebAPI\SpotifyWebAPI($options, $session); // Save new tokens, they might have been updated $_SESSION['accessToken'] = $session->getAccessToken(); $_SESSION['refreshToken'] = $session->getRefreshToken(); // ################################################################ $user = $api->me(); $topArtistsCount = 40; $playlistsCount = 24; $templateData = [ 'user' => $user, 'playlists' => [], 'topArtists' => [], 'playlist' => null, 'infos' => [], 'errors' => [], ]; $generatePlaylistFromPlaylist = isset($_GET['generate-playlist-from-playlist']); $generatePlaylistFromSelectedTopArtists = isset($_GET['generate-playlist-top-artists']); $generatePlaylistFromRandomTopArtists = isset($_GET['generate-playlist-random-top-artists']); if ($generatePlaylistFromPlaylist) { $selectedPlaylists = $_GET['selected-playlist']; error_log('Will create new playlist with recommendations from playlists: '.join(', ', $selectedPlaylists).'".'); $recommendedTrackIds = []; $shouldFilterByArtists = isset($_GET['check-playlist-filter-artists']); error_log('Filter by artists in source playlists: '.($shouldFilterByArtists ? 'yes' : 'no')); $generateLongPlaylist = isset($_GET['check-playlist-long-playlist']); error_log('Generate long playlist: '.($generateLongPlaylist ? 'yes' : 'no')); $artistsInSourcePlaylists = []; foreach ($selectedPlaylists as $selectedPlaylistId) { $playlist = $api->getPlaylist($selectedPlaylistId); error_log('Will get recommendations from tracks in playlist "'.$playlist->name.'".'); $playlistTracks = $playlist->tracks->items; error_log('Found '.count($playlistTracks).' tracks.'); foreach ($playlistTracks as $track) { $artists = []; foreach ($track->track->artists as $artist) { $artists[] = $artist->name; $artistsInSourcePlaylists[$artist->id] = 1; } error_log('Track "'.$track->track->name.'" ('.join(', ', $artists).')'); $recommendations = $api->getRecommendations([ 'seed_tracks' => [$track->track->id], 'limit' => ($generateLongPlaylist ? 50 : 30) ]); error_log(' -> Got '.count($recommendations->tracks).' recommendatations.'); foreach ($recommendations->tracks as $recommendedTrack) { $recommendedTrackIds[$recommendedTrack->id] = $recommendedTrack; } } } if ($shouldFilterByArtists) { $artistsInSourcePlaylists = array_keys($artistsInSourcePlaylists); error_log('Filter by artists found in source playlists ('.count($artistsInSourcePlaylists).')'); $filteredTrackIds = []; foreach ($recommendedTrackIds as $trackId => $track) { $trackArtistInWantedArtists = false; foreach ($track->artists as $trackArtist) { if (\in_array($trackArtist->id, $artistsInSourcePlaylists)) { $filteredTrackIds[$track->id] = 1; } } } $recommendedTrackIds = $filteredTrackIds; } $newPlaylist = createPlaylistWithRandomTracks($api, $recommendedTrackIds, $generateLongPlaylist ? 100 : 50); $templateData['infos'][] = getCreatedPlaylistInformationMessage($api, $newPlaylist); $templateData['playlist'] = createDisplayablePlaylist($newPlaylist); } elseif ($generatePlaylistFromSelectedTopArtists) { $selectedArtists = $_GET['selected-artist']; error_log('Will create new playlist with filterted recommendations from artists: '.join(', ', $selectedArtists).'".'); $recommendedTrackIds = []; $shouldFilterByArtists = isset($_GET['check-top-artist-filter-artists']); error_log('Filter by artists in selection: '.($shouldFilterByArtists ? 'yes' : 'no')); $generateLongPlaylist = isset($_GET['check-top-artist-long-playlist']); error_log('Generate long playlist: '.($generateLongPlaylist ? '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, $generateLongPlaylist ? 100 : 50); $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')); $generateLongPlaylist = isset($_GET['check-top-artist-long-playlist']); error_log('Generate long playlist: '.($generateLongPlaylist ? '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, $generateLongPlaylist ? 100 : 50); $templateData['infos'][] = getCreatedPlaylistInformationMessage($api, $newPlaylist); $templateData['playlist'] = createDisplayablePlaylist($newPlaylist); } else { $templateData['topArtists'] = $api->getMyTop('artists', ['limit' => $topArtistsCount, 'time_range' => 'short_term'])->items; $templateData['playlists'] = $api->getUserPlaylists($user->id, ['limit' => $playlistsCount])->items; } require '../template.php';