Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • web/spotify
1 result
Show changes
Commits on Source (2)
......@@ -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';
......@@ -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);
......