Skip to content
Snippets Groups Projects
Commit a656f650 authored by Benoît Harrault's avatar Benoît Harrault
Browse files

Add create new playlist with recommended tracks

parent 064755db
No related branches found
No related tags found
1 merge request!2Resolve "Add feature "create new playlist from tracks in existing playlist""
......@@ -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();
......@@ -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';
......@@ -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>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment