diff --git a/public/index.php b/public/index.php index 4516bddded012b6cb58aed349282cf2bc525d6c2..19e7d16687366387a9842adb30abcd052cc8c6db 100644 --- a/public/index.php +++ b/public/index.php @@ -61,6 +61,9 @@ try { $topArtistsCount = 40; $playlistsCount = 24; +$tracksCountInShortPlaylist = 50; +$tracksCountInLongPlaylist = 100; + $templateData = [ 'user' => $user, 'playlists' => [], @@ -76,153 +79,181 @@ $generatePlaylistFromSelectedTopArtists = isset($_GET['generate-playlist-top-art $generatePlaylistFromRandomTopArtists = isset($_GET['generate-playlist-random-top-artists']); $showPlaylistContent = isset($_GET['show-playlist']); - +$action = ''; if ($generatePlaylistFromPlaylist) { - $selectedPlaylists = $_GET['selected-playlist']; - printLog('Will create new playlist with recommendations from playlists: '.join(', ', $selectedPlaylists).'".'); - $recommendedTrackIds = []; - - $shouldFilterByArtists = isset($_GET['check-playlist-filter-artists']); - printLog('Filter by artists in source playlists: '.($shouldFilterByArtists ? 'yes' : 'no')); - - $generateLongPlaylist = isset($_GET['check-playlist-long-playlist']); - printLog('Generate long playlist: '.($generateLongPlaylist ? 'yes' : 'no')); - - $artistsInSourcePlaylists = []; - - foreach ($selectedPlaylists as $selectedPlaylistId) { - $playlist = $api->getPlaylist($selectedPlaylistId); - printLog('Will get recommendations from tracks in playlist "'.$playlist->name.'".'); - $playlistTracks = $playlist->tracks->items; - printLog('Found '.count($playlistTracks).' tracks.'); - foreach ($playlistTracks as $track) { - $artists = []; - foreach ($track->track->artists as $artist) { - $artists[] = $artist->name; - $artistsInSourcePlaylists[$artist->id] = 1; - } - printLog('Track "'.$track->track->name.'" ('.join(', ', $artists).')'); + $action = 'generate-playlist-from-playlist'; +} elseif ($generatePlaylistFromSelectedTopArtists) { + $action = 'generate-playlist-from-selected-top-artists'; +} elseif ($generatePlaylistFromRandomTopArtists) { + $action = 'generate-playlist-from-random-top-artists'; +} elseif ($showPlaylistContent) { + $action = 'show-playlist-content'; +} else { +} - $recommendations = $api->getRecommendations([ - 'seed_tracks' => [$track->track->id], - 'limit' => ($generateLongPlaylist ? 50 : 30) - ]); - printLog(' -> Got '.count($recommendations->tracks).' recommendatations.'); - foreach ($recommendations->tracks as $recommendedTrack) { - $recommendedTrackIds[$recommendedTrack->id] = $recommendedTrack; - } - } - } - - if ($shouldFilterByArtists) { - $artistsInSourcePlaylists = array_keys($artistsInSourcePlaylists); - printLog('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; +switch ($action) { + case 'generate-playlist-from-playlist': + $selectedPlaylists = $_GET['selected-playlist']; + printLog('Will create new playlist with recommendations from playlists: '.join(', ', $selectedPlaylists).'".'); + $recommendedTrackIds = []; + + $shouldFilterByArtists = isset($_GET['check-playlist-filter-artists']); + printLog('Filter by artists in source playlists: '.($shouldFilterByArtists ? 'yes' : 'no')); + + $generateLongPlaylist = isset($_GET['check-playlist-long-playlist']); + printLog('Generate long playlist: '.($generateLongPlaylist ? 'yes' : 'no')); + + $artistsInSourcePlaylists = []; + + foreach ($selectedPlaylists as $selectedPlaylistId) { + $playlist = $api->getPlaylist($selectedPlaylistId); + printLog('Will get recommendations from tracks in playlist "'.$playlist->name.'".'); + $playlistTracks = $playlist->tracks->items; + printLog('Found '.count($playlistTracks).' tracks.'); + foreach ($playlistTracks as $track) { + $artists = []; + foreach ($track->track->artists as $artist) { + $artists[] = $artist->name; + $artistsInSourcePlaylists[$artist->id] = 1; + } + printLog('Track "'.$track->track->name.'" ('.join(', ', $artists).')'); + + $recommendations = $api->getRecommendations([ + 'seed_tracks' => [$track->track->id], + 'limit' => ($generateLongPlaylist ? 50 : 30) + ]); + printLog(' -> Got '.count($recommendations->tracks).' recommendatations.'); + foreach ($recommendations->tracks as $recommendedTrack) { + $recommendedTrackIds[$recommendedTrack->id] = $recommendedTrack; } } } - $recommendedTrackIds = $filteredTrackIds; - } - - $newPlaylist = createPlaylistWithRandomTracks($api, $recommendedTrackIds, $generateLongPlaylist ? 100 : 50); - $templateData['infos'][] = getCreatedPlaylistInformationMessage($api, $newPlaylist); - -} elseif ($generatePlaylistFromSelectedTopArtists) { - - $selectedArtists = $_GET['selected-artist']; - printLog('Will create new playlist with filterted recommendations from artists: '.join(', ', $selectedArtists).'".'); - $recommendedTrackIds = []; - $shouldFilterByArtists = isset($_GET['check-top-artist-filter-artists']); - printLog('Filter by artists in selection: '.($shouldFilterByArtists ? 'yes' : 'no')); + if ($shouldFilterByArtists) { + $artistsInSourcePlaylists = array_keys($artistsInSourcePlaylists); + printLog('Filter by artists found in source playlists ('.count($artistsInSourcePlaylists).')'); - $generateLongPlaylist = isset($_GET['check-top-artist-long-playlist']); - printLog('Generate long playlist: '.($generateLongPlaylist ? 'yes' : 'no')); - - foreach ($selectedArtists as $selectedArtist) { - printLog('Get recommendations for artist '.$selectedArtist.''); - $recommendations = $api->getRecommendations([ - 'seed_artists' => $selectedArtist, - 'limit' => 100 - ]); - printLog(' -> Got '.count($recommendations->tracks).' recommendatations.'); - - // Filter by artist if requested, remove duplicates - foreach ($recommendations->tracks as $recommendedTrack) { - if ($shouldFilterByArtists) { + $filteredTrackIds = []; + foreach ($recommendedTrackIds as $trackId => $track) { $trackArtistInWantedArtists = false; - foreach ($recommendedTrack->artists as $trackArtist) { - if (\in_array($trackArtist->id, $selectedArtists)) { - $recommendedTrackIds[$recommendedTrack->id] = 1; + foreach ($track->artists as $trackArtist) { + if (\in_array($trackArtist->id, $artistsInSourcePlaylists)) { + $filteredTrackIds[$track->id] = 1; } } - } else { - $recommendedTrackIds[$recommendedTrack->id] = 1; } + $recommendedTrackIds = $filteredTrackIds; } - } - - $newPlaylist = createPlaylistWithRandomTracks($api, $recommendedTrackIds, $generateLongPlaylist ? 100 : 50); - $templateData['infos'][] = getCreatedPlaylistInformationMessage($api, $newPlaylist); -} elseif ($generatePlaylistFromRandomTopArtists) { + $newPlaylist = createPlaylistWithRandomTracks( + $api, + $recommendedTrackIds, + $generateLongPlaylist ? $tracksCountInLongPlaylist : $tracksCountInShortPlaylist + ); + $templateData['infos'][] = getCreatedPlaylistInformationMessage($api, $newPlaylist); + break; + case 'generate-playlist-from-selected-top-artists': + $selectedArtists = $_GET['selected-artist']; + printLog('Will create new playlist with filterted recommendations from artists: '.join(', ', $selectedArtists).'".'); + $recommendedTrackIds = []; + + $shouldFilterByArtists = isset($_GET['check-top-artist-filter-artists']); + printLog('Filter by artists in selection: '.($shouldFilterByArtists ? 'yes' : 'no')); + + $generateLongPlaylist = isset($_GET['check-top-artist-long-playlist']); + printLog('Generate long playlist: '.($generateLongPlaylist ? 'yes' : 'no')); + + foreach ($selectedArtists as $selectedArtist) { + printLog('Get recommendations for artist '.$selectedArtist.''); + $recommendations = $api->getRecommendations([ + 'seed_artists' => $selectedArtist, + 'limit' => 100 + ]); + printLog(' -> Got '.count($recommendations->tracks).' recommendatations.'); - $countInTopArtists = random_int(4, 6); - $countInLessTopArtists = random_int(4, 6); - $limitBetweenTopAndLessTop = $topArtistsCount; - $selectedArtists = getRandomArtistsFromTopArtists($api, $countInTopArtists, $countInLessTopArtists, $limitBetweenTopAndLessTop); - printLog('Will create new playlist with filterted recommendations from random artists: '.join(', ', $selectedArtists).'".'); - $recommendedTrackIds = []; - - $shouldFilterByArtists = isset($_GET['check-top-artist-filter-artists']); - printLog('Filter by artists in selection: '.($shouldFilterByArtists ? 'yes' : 'no')); - - $generateLongPlaylist = isset($_GET['check-top-artist-long-playlist']); - printLog('Generate long playlist: '.($generateLongPlaylist ? 'yes' : 'no')); - - foreach ($selectedArtists as $selectedArtist) { - printLog('Get recommendations for artist '.$selectedArtist.''); - $recommendations = $api->getRecommendations([ - 'seed_artists' => $selectedArtist, - 'limit' => 100 - ]); - printLog(' -> Got '.count($recommendations->tracks).' recommendatations.'); - - // Filter by artist if requested, remove duplicates - foreach ($recommendations->tracks as $recommendedTrack) { - if ($shouldFilterByArtists) { - $trackArtistInWantedArtists = false; - foreach ($recommendedTrack->artists as $trackArtist) { - if (\in_array($trackArtist->id, $selectedArtists)) { - $recommendedTrackIds[$recommendedTrack->id] = 1; + // Filter by artist if requested, remove duplicates + foreach ($recommendations->tracks as $recommendedTrack) { + if ($shouldFilterByArtists) { + $trackArtistInWantedArtists = false; + foreach ($recommendedTrack->artists as $trackArtist) { + if (\in_array($trackArtist->id, $selectedArtists)) { + $recommendedTrackIds[$recommendedTrack->id] = 1; + } } + } else { + $recommendedTrackIds[$recommendedTrack->id] = 1; } - } else { - $recommendedTrackIds[$recommendedTrack->id] = 1; } } - } - - $newPlaylist = createPlaylistWithRandomTracks($api, $recommendedTrackIds, $generateLongPlaylist ? 100 : 50); - $templateData['infos'][] = getCreatedPlaylistInformationMessage($api, $newPlaylist); -} elseif ($showPlaylistContent) { - printLog('Get content of playlist: '.($generateLongPlaylist ? 'yes' : 'no')); + $newPlaylist = createPlaylistWithRandomTracks( + $api, + $recommendedTrackIds, + $generateLongPlaylist ? $tracksCountInLongPlaylist : $tracksCountInShortPlaylist + ); + $templateData['infos'][] = getCreatedPlaylistInformationMessage($api, $newPlaylist); + break; + case 'generate-playlist-from-random-top-artists': + $countInTopArtists = random_int(4, 6); + $countInLessTopArtists = random_int(4, 6); + $limitBetweenTopAndLessTop = $topArtistsCount; + $selectedArtists = getRandomArtistsFromTopArtists( + $api, + $countInTopArtists, + $countInLessTopArtists, + $limitBetweenTopAndLessTop + ); + printLog('Will create new playlist with filterted recommendations from random artists: '.join(', ', $selectedArtists).'".'); + $recommendedTrackIds = []; + + $shouldFilterByArtists = isset($_GET['check-top-artist-filter-artists']); + printLog('Filter by artists in selection: '.($shouldFilterByArtists ? 'yes' : 'no')); + + $generateLongPlaylist = isset($_GET['check-top-artist-long-playlist']); + printLog('Generate long playlist: '.($generateLongPlaylist ? 'yes' : 'no')); + + foreach ($selectedArtists as $selectedArtist) { + printLog('Get recommendations for artist '.$selectedArtist.''); + $recommendations = $api->getRecommendations([ + 'seed_artists' => $selectedArtist, + 'limit' => 100 + ]); + printLog(' -> Got '.count($recommendations->tracks).' recommendations.'); - $playlistId = $_GET['id']; - $playlist = $api->getPlaylist($playlistId); - $templateData['infos'][] = getPlaylistInformationMessage($api, $playlist); - $templateData['playlist'] = createDisplayablePlaylist($playlist); + // Filter by artist if requested, remove duplicates + foreach ($recommendations->tracks as $recommendedTrack) { + if ($shouldFilterByArtists) { + $trackArtistInWantedArtists = false; + foreach ($recommendedTrack->artists as $trackArtist) { + if (\in_array($trackArtist->id, $selectedArtists)) { + $recommendedTrackIds[$recommendedTrack->id] = 1; + } + } + } else { + $recommendedTrackIds[$recommendedTrack->id] = 1; + } + } + } -} else { - $templateData['topArtists'] = $api->getMyTop('artists', ['limit' => $topArtistsCount, 'time_range' => 'short_term'])->items; - $templateData['playlists'] = $api->getUserPlaylists($user['id'], ['limit' => $playlistsCount])->items; + $newPlaylist = createPlaylistWithRandomTracks( + $api, + $recommendedTrackIds, + $generateLongPlaylist ? $tracksCountInLongPlaylist : $tracksCountInShortPlaylist + ); + $templateData['infos'][] = getCreatedPlaylistInformationMessage($api, $newPlaylist); + break; + case 'show-playlist-content': + printLog('Get content of playlist'); + + $playlistId = $_GET['id']; + $playlist = $api->getPlaylist($playlistId); + $templateData['infos'][] = getPlaylistInformationMessage($api, $playlist); + $templateData['playlist'] = createDisplayablePlaylist($playlist); + break; + default: + $templateData['topArtists'] = $api->getMyTop('artists', ['limit' => $topArtistsCount, 'time_range' => 'short_term'])->items; + $templateData['playlists'] = $api->getUserPlaylists($user['id'], ['limit' => $playlistsCount])->items; + break; } require '../template.php'; diff --git a/spotify/lib.php b/spotify/lib.php index 1d4a4a490d284e2ada5376562336cec60b481f6d..8844ab410e2e35b3cbf438013c1fc6e5542dc8fc 100644 --- a/spotify/lib.php +++ b/spotify/lib.php @@ -11,17 +11,17 @@ function generateShowPlaylistUrl($playlistId) { return '/view-playlist-'.$playlistId; } -function generatePlaylistName() +function generatePlaylistName($prefix) { $now = new DateTime(); - $name = 'Fresh playlist ['.$now->format('Y-m-d H:i:s').']'; + $name = $prefix.' ['.$now->format('Y-m-d H:i:s').']'; return $name; } -function createEmptyPlaylist($api) +function createEmptyPlaylist($api, $playlistName = 'Auto playlist') { - $name = generatePlaylistName(); + $name = generatePlaylistName($playlistName); printLog('Create new playlist "'.$name.'".'); $playlist = $api->createPlaylist([ 'name' => $name, @@ -30,11 +30,16 @@ function createEmptyPlaylist($api) return $playlist; } -function pickRandomTracksFromArray($recommendedTrackIds, $count = 50) +function pickRandomTracksFromArray($recommendedTrackIds, $count = 0) { $recommendedTrackIds = array_keys($recommendedTrackIds); - printLog('=> Got '.count($recommendedTrackIds).' unique recommendatations.'); + printLog('=> Got '.count($recommendedTrackIds).' unique tracks.'); shuffle($recommendedTrackIds); + + if (!$count) { + return $recommendedTrackIds; + } + $pickedTrackIds = array_slice($recommendedTrackIds, 0, $count); printLog('Keep '.count($pickedTrackIds).' random tracks.'); @@ -77,7 +82,7 @@ function getRandomArtistsFromTopArtists($api, $countInTopArtists, $countInLessTo function createPlaylistWithRandomTracks($api, $trackIds, $count = 50) { - $playlist = createEmptyPlaylist($api); + $playlist = createEmptyPlaylist($api, 'Fresh playlist'); $pickedTrackIds = pickRandomTracksFromArray($trackIds, $count); $api->replacePlaylistTracks($playlist->id, $pickedTrackIds);