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

Add option to filter generated playlist by selected artists

parent f23be76b
No related branches found
No related tags found
1 merge request!8Resolve "Add options on create new playlist"
...@@ -57,29 +57,50 @@ if ($generatePlaylistFromPlaylist) { ...@@ -57,29 +57,50 @@ if ($generatePlaylistFromPlaylist) {
error_log('Will create new playlist with recommendations from playlists: '.join(', ', $selectedPlaylists).'".'); error_log('Will create new playlist with recommendations from playlists: '.join(', ', $selectedPlaylists).'".');
$recommendedTrackIds = []; $recommendedTrackIds = [];
$shouldFilterByArtists = isset($_GET['check-playlist-filter-artists']);
error_log('Filter by artists in source playlists: '.($shouldFilterByArtists ? 'yes' : 'no'));
$artistsInSourcePlaylists = [];
foreach ($selectedPlaylists as $selectedPlaylistId) { foreach ($selectedPlaylists as $selectedPlaylistId) {
$playlist = $api->getPlaylist($selectedPlaylistId); $playlist = $api->getPlaylist($selectedPlaylistId);
error_log('Will get recommendations from tracks in playlist '.$selectedPlaylistId.' "'.$playlist->name.'".'); error_log('Will get recommendations from tracks in playlist "'.$playlist->name.'".');
$playlistTracks = $playlist->tracks->items; $playlistTracks = $playlist->tracks->items;
error_log('Found '.count($playlistTracks).' tracks.'); error_log('Found '.count($playlistTracks).' tracks.');
foreach ($playlistTracks as $track) { foreach ($playlistTracks as $track) {
$artists = []; $artists = [];
foreach ($track->track->artists as $artist) { foreach ($track->track->artists as $artist) {
$artists[] = $artist->name; $artists[] = $artist->name;
$artistsInSourcePlaylists[$artist->id] = 1;
} }
error_log('Track '.$track->track->id.' "'.$track->track->name.'" ('.join(', ', $artists).')'); error_log('Track "'.$track->track->name.'" ('.join(', ', $artists).')');
$recommendations = $api->getRecommendations([ $recommendations = $api->getRecommendations([
'seed_tracks' => [$track->track->id], 'seed_tracks' => [$track->track->id],
'limit' => 20 'limit' => 40
]); ]);
error_log(' -> Got '.count($recommendations->tracks).' recommendatations.'); error_log(' -> Got '.count($recommendations->tracks).' recommendatations.');
foreach ($recommendations->tracks as $recommendedTrack) { foreach ($recommendations->tracks as $recommendedTrack) {
$recommendedTrackIds[$recommendedTrack->id] = 1; $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;
}
$recommendedTrackIds = array_keys($recommendedTrackIds); $recommendedTrackIds = array_keys($recommendedTrackIds);
error_log('=> Got '.count($recommendedTrackIds).' unique recommendatations for this playlist.'); error_log('=> Got '.count($recommendedTrackIds).' unique recommendatations for this playlist.');
shuffle($recommendedTrackIds); shuffle($recommendedTrackIds);
...@@ -101,6 +122,9 @@ if ($generatePlaylistFromPlaylist) { ...@@ -101,6 +122,9 @@ if ($generatePlaylistFromPlaylist) {
error_log('Will create new playlist with filterted recommendations from artists: '.join(', ', $selectedArtists).'".'); error_log('Will create new playlist with filterted recommendations from artists: '.join(', ', $selectedArtists).'".');
$recommendedTrackIds = []; $recommendedTrackIds = [];
$shouldFilterByArtists = isset($_GET['check-top-artist-filter-artists']);
error_log('Filter by artists in selection: '.($shouldFilterByArtists ? 'yes' : 'no'));
foreach ($selectedArtists as $selectedArtist) { foreach ($selectedArtists as $selectedArtist) {
error_log('Get recommendations for artist '.$selectedArtist.''); error_log('Get recommendations for artist '.$selectedArtist.'');
$recommendations = $api->getRecommendations([ $recommendations = $api->getRecommendations([
...@@ -109,14 +133,18 @@ if ($generatePlaylistFromPlaylist) { ...@@ -109,14 +133,18 @@ if ($generatePlaylistFromPlaylist) {
]); ]);
error_log(' -> Got '.count($recommendations->tracks).' recommendatations.'); error_log(' -> Got '.count($recommendations->tracks).' recommendatations.');
// Filter by artist, remove duplicates // Filter by artist if requested, remove duplicates
foreach ($recommendations->tracks as $recommendedTrack) { foreach ($recommendations->tracks as $recommendedTrack) {
if ($shouldFilterByArtists) {
$trackArtistInWantedArtists = false; $trackArtistInWantedArtists = false;
foreach ($recommendedTrack->artists as $trackArtist) { foreach ($recommendedTrack->artists as $trackArtist) {
if (\in_array($trackArtist->id, $selectedArtists)) { if (\in_array($trackArtist->id, $selectedArtists)) {
$recommendedTrackIds[$recommendedTrack->id] = 1; $recommendedTrackIds[$recommendedTrack->id] = 1;
} }
} }
} else {
$recommendedTrackIds[$recommendedTrack->id] = 1;
}
} }
} }
......
...@@ -67,7 +67,24 @@ ...@@ -67,7 +67,24 @@
</li> </li>
<?php } ?> <?php } ?>
</ul> </ul>
<div class="row">
<div class="col-8">
<input
type="checkbox"
class="custom-control-input"
id="check-top-artist-filter-artists"
name="check-top-artist-filter-artists"
value="filter-artists"
checked
>
<label class="custom-control-label" for="check-top-artist-filter-artists">
Allow only selected artists in recommendations
</label>
</div>
<div class="col-4">
<button name="generate-playlist-top-artists" type="submit" class="btn btn-secondary float-end">🎶 Generate!</button> <button name="generate-playlist-top-artists" type="submit" class="btn btn-secondary float-end">🎶 Generate!</button>
</div>
</div>
</form> </form>
<?php } ?> <?php } ?>
...@@ -92,7 +109,24 @@ ...@@ -92,7 +109,24 @@
</li> </li>
<?php } ?> <?php } ?>
</ul> </ul>
<div class="row">
<div class="col-8">
<input
type="checkbox"
class="custom-control-input"
id="check-playlist-filter-artists"
name="check-playlist-filter-artists"
value="filter-artists"
checked
>
<label class="custom-control-label" for="check-playlist-filter-artists">
Allow only artists in selected playlists in recommendations
</label>
</div>
<div class="col-4">
<button name="generate-playlist-from-playlist" type="submit" class="btn btn-secondary float-end">🎶 Generate!</button> <button name="generate-playlist-from-playlist" type="submit" class="btn btn-secondary float-end">🎶 Generate!</button>
</div>
</div>
</form> </form>
<?php } ?> <?php } ?>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment