diff --git a/public/index.php b/public/index.php index 32680ec59508b596e95c1095eb8b5b8ba9807532..1ff8417f53252049c32a382837688685d8a22401 100644 --- a/public/index.php +++ b/public/index.php @@ -57,27 +57,48 @@ if ($generatePlaylistFromPlaylist) { 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')); + $artistsInSourcePlaylists = []; + foreach ($selectedPlaylists as $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; 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->id.' "'.$track->track->name.'" ('.join(', ', $artists).')'); + error_log('Track "'.$track->track->name.'" ('.join(', ', $artists).')'); $recommendations = $api->getRecommendations([ 'seed_tracks' => [$track->track->id], - 'limit' => 20 + 'limit' => 40 ]); error_log(' -> Got '.count($recommendations->tracks).' recommendatations.'); 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); @@ -101,6 +122,9 @@ if ($generatePlaylistFromPlaylist) { 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')); + foreach ($selectedArtists as $selectedArtist) { error_log('Get recommendations for artist '.$selectedArtist.''); $recommendations = $api->getRecommendations([ @@ -109,13 +133,17 @@ if ($generatePlaylistFromPlaylist) { ]); error_log(' -> Got '.count($recommendations->tracks).' recommendatations.'); - // Filter by artist, remove duplicates + // Filter by artist if requested, remove duplicates foreach ($recommendations->tracks as $recommendedTrack) { - $trackArtistInWantedArtists = false; - foreach ($recommendedTrack->artists as $trackArtist) { - if (\in_array($trackArtist->id, $selectedArtists)) { - $recommendedTrackIds[$recommendedTrack->id] = 1; + if ($shouldFilterByArtists) { + $trackArtistInWantedArtists = false; + foreach ($recommendedTrack->artists as $trackArtist) { + if (\in_array($trackArtist->id, $selectedArtists)) { + $recommendedTrackIds[$recommendedTrack->id] = 1; + } } + } else { + $recommendedTrackIds[$recommendedTrack->id] = 1; } } } diff --git a/template.php b/template.php index 3bbce5ebee2dfacd2fff9964f5fa5af6b4cb874a..308e98d919d8a85fe9a24973f47ec54f79d7d897 100644 --- a/template.php +++ b/template.php @@ -67,7 +67,24 @@ </li> <?php } ?> </ul> - <button name="generate-playlist-top-artists" type="submit" class="btn btn-secondary float-end">🎶 Generate!</button> + <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> + </div> + </div> </form> <?php } ?> @@ -92,7 +109,24 @@ </li> <?php } ?> </ul> - <button name="generate-playlist-from-playlist" type="submit" class="btn btn-secondary float-end">🎶 Generate!</button> + <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> + </div> + </div> </form> <?php } ?>