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

Merge branch '7-create-playlist-from-top-played-artists' into 'master'

Resolve "Create playlist from top played artists"

Closes #7

See merge request !6
parents 72df9e94 002f4bd2
No related branches found
No related tags found
1 merge request!6Resolve "Create playlist from top played artists"
...@@ -43,6 +43,7 @@ $user = $api->me(); ...@@ -43,6 +43,7 @@ $user = $api->me();
$templateData = [ $templateData = [
'user' => $user, 'user' => $user,
'playlists' => [], 'playlists' => [],
'topArtists' => [],
'infos' => [], 'infos' => [],
'errors' => [], 'errors' => [],
...@@ -53,6 +54,8 @@ if (isset($_GET['playlist'])) { ...@@ -53,6 +54,8 @@ if (isset($_GET['playlist'])) {
$selectedPlaylistId = $_GET['playlist']; $selectedPlaylistId = $_GET['playlist'];
} }
$generatePlaylistFromArtists = isset($_GET['generate-playlist-top-artists']);
if ($selectedPlaylistId) { if ($selectedPlaylistId) {
$playlist = $api->getPlaylist($selectedPlaylistId); $playlist = $api->getPlaylist($selectedPlaylistId);
error_log('Will create new playlist from tracks in playlist '.$selectedPlaylistId.' "'.$playlist->name.'".'); error_log('Will create new playlist from tracks in playlist '.$selectedPlaylistId.' "'.$playlist->name.'".');
...@@ -88,10 +91,51 @@ if ($selectedPlaylistId) { ...@@ -88,10 +91,51 @@ if ($selectedPlaylistId) {
'name' => $newPlaylistName, '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); $api->replacePlaylistTracks($newPlaylist->id, $pickedTrackIds);
$playlistLink = '<a href="'.$newPlaylist->external_urls->spotify.'">'.$newPlaylistName.'</a>'; $playlistLink = '<a href="'.$newPlaylist->external_urls->spotify.'">'.$newPlaylistName.'</a>';
$templateData['infos'][] = 'Ok created new playlist with '.count($pickedTrackIds).' tracks: '.$playlistLink; $templateData['infos'][] = 'Ok created new playlist with '.count($pickedTrackIds).' tracks: '.$playlistLink;
} else { } else {
$templateData['topArtists'] = $api->getMyTop('artists', ['limit' => 16, 'time_range' => 'short_term'])->items;
$templateData['playlists'] = $api->getUserPlaylists($user->id)->items; $templateData['playlists'] = $api->getUserPlaylists($user->id)->items;
} }
......
...@@ -15,4 +15,5 @@ $SPOTIFY_REQUIRED_SCOPES = [ ...@@ -15,4 +15,5 @@ $SPOTIFY_REQUIRED_SCOPES = [
'playlist-modify-private', 'playlist-modify-private',
'playlist-modify-public', 'playlist-modify-public',
'user-read-private', 'user-read-private',
'user-top-read',
]; ];
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
<body class="container mt-2"> <body class="container mt-2">
<div class="row"> <div class="row">
<div class="col-2"> <div class="col-3">
<div class="card"> <div class="card">
<?php if (count($templateData['user']->images)) { ?> <?php if (count($templateData['user']->images)) { ?>
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
</div> </div>
</div> </div>
<div class="col-10"> <div class="col-9">
<?php if (count($templateData['errors'])) { ?> <?php if (count($templateData['errors'])) { ?>
<?php foreach ($templateData['errors'] as $message) { ?> <?php foreach ($templateData['errors'] as $message) { ?>
...@@ -46,6 +46,31 @@ ...@@ -46,6 +46,31 @@
<?php } ?> <?php } ?>
<?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'])) { ?> <?php if (count($templateData['playlists'])) { ?>
<h3>Please pick a playlist to get recommendations from:</h3> <h3>Please pick a playlist to get recommendations from:</h3>
<div class="list-group"> <div class="list-group">
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment