diff --git a/public/auth.php b/public/auth.php index 193ce37b6ba86c05fdf185c8ea05d5e7b9ccc4f2..504c46d88b893ab5d0bea0a3f2f0bfb6cfe040d1 100644 --- a/public/auth.php +++ b/public/auth.php @@ -18,10 +18,11 @@ $options = [ 'scope' => [ 'playlist-read-private', 'playlist-modify-private', + 'playlist-modify-public', 'user-read-private', ], 'state' => $state, ]; -header('Location: ' . $session->getAuthorizeUrl($options)); +header('Location: '.$session->getAuthorizeUrl($options)); die(); diff --git a/public/index.php b/public/index.php index 923f16c985a3ae0a9d27df59ede7d5f8aafaaf41..51e136a2071825fa679d8dcba2f25fc8ca7ed9fc 100644 --- a/public/index.php +++ b/public/index.php @@ -25,7 +25,8 @@ if (!$accessToken) { $session = new SpotifyWebAPI\Session( $CLIENT_ID, - $CLIENT_SECRET + $CLIENT_SECRET, + $REDIRECT_URI ); // Use previously requested tokens fetched from session @@ -37,15 +38,14 @@ if ($accessToken) { $session->refreshAccessToken($refreshToken); } -$scopes = $session->getScope(); - $options = [ 'scope' => [ 'playlist-read-private', 'playlist-modify-private', + 'playlist-modify-public', 'user-read-private', ], -'auto_refresh' => true, + 'auto_refresh' => true, ]; $api = new SpotifyWebAPI\SpotifyWebAPI($options, $session); @@ -59,12 +59,62 @@ $_SESSION['refreshToken'] = $session->getRefreshToken(); $user = $api->me(); $templateData = []; - $templateData['user'] = $user; $templateData['userImageUrl'] = ''; if ($user->images[0]) { $templateData['userImageUrl'] = $user->images[0]->url; } -$templateData['playlists'] = $api->getUserPlaylists($user->id)->items; + +$templateData['infos'] = []; +$templateData['errors'] = []; + +$selectedPlaylistId = ''; +if (isset($_GET['playlist'])) { + $selectedPlaylistId = $_GET['playlist']; +} + +$templateData['playlists'] = []; + +if ($selectedPlaylistId) { + $playlist = $api->getPlaylist($selectedPlaylistId); + error_log('Will create new playlist from tracks in playlist '.$selectedPlaylistId.' "'.$playlist->name.'".'); + $recommendedTrackIds = []; + $playlistTracks = $playlist->tracks->items; + error_log('Found '.count($playlistTracks).' tracks.'); + foreach ($playlistTracks as $track) { + $artists = []; + foreach ($track->track->artists as $artist) { + $artists[] = $artist->name; + } + error_log('Track '.$track->track->id.' "'.$track->track->name.'" ('.join(', ', $artists).')'); + + $recommendations = $api->getRecommendations([ + 'seed_tracks' => [$track->track->id], + 'limit' => 20 + ]); + error_log(' -> Got '.count($recommendations->tracks).' recommendatations.'); + foreach ($recommendations->tracks as $recommendedTrack) { + $recommendedTrackIds[$recommendedTrack->id] = 1; + } + } + $recommendedTrackIds = array_keys($recommendedTrackIds); + error_log('=> Got '.count($recommendedTrackIds).' unique recommendatations for this playlist.'); + shuffle($recommendedTrackIds); + $pickedTrackIds = array_slice($recommendedTrackIds, 0, 50); + error_log('Keep '.count($pickedTrackIds).' 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['playlists'] = $api->getUserPlaylists($user->id)->items; +} require '../template.php'; diff --git a/template.php b/template.php index cd5e7531604fc828e3f7c4898f44e581d337fc9d..b6b603c2e168c2a78e9f5c7e9c42f3d233468712 100644 --- a/template.php +++ b/template.php @@ -22,6 +22,7 @@ <a href="<?php echo $templateData['user']->external_urls->spotify; ?>" class="btn btn-primary">View profile</a> </div> <div class="card-footer"> + <a href="index.php" class="card-link">refresh</a> <a href="?logout" class="card-link">disconnect</a> </div> </div> @@ -29,13 +30,28 @@ </div> <div class="col-md-10"> - <div class="list-group"> - <?php - foreach ($templateData['playlists'] as $playlist) { - echo '<a href="' . $playlist->external_urls->spotify . '" class="list-group-item list-group-item-action">' . $playlist->name . '</a>'; - } - ?> - </div> + <?php if (count($templateData['errors'])) { ?> + <?php foreach ($templateData['errors'] as $message) { ?> + <div class="alert alert-warning" role="alert"><?php echo $message; ?></div> + <?php } ?> + <?php } ?> + + <?php if (count($templateData['infos'])) { ?> + <?php foreach ($templateData['infos'] as $message) { ?> + <div class="alert alert-primary" role="alert"><?php echo $message; ?></div> + <?php } ?> + <?php } ?> + + <?php if (count($templateData['playlists'])) { ?> + <h3>Please pick a playlist to get recommendations from:</h3> + <div class="list-group"> + <?php foreach ($templateData['playlists'] as $playlist) { ?> + <a href="index.php?playlist=<?php echo $playlist->id; ?>" class="list-group-item list-group-item-action"> + <?php echo $playlist->name; ?> + </a> + <?php } ?> + </div> + <?php } ?> </div> </div>