Select Git revision
-
Benoît Harrault authoredBenoît Harrault authored
index.php 11.58 KiB
<?php
// increase timeout limit
set_time_limit(60);
require '../spotify/spotify.php';
require '../spotify/lib.php';
if (isset($_GET['logout'])) {
$_SESSION['accessToken'] = '';
$_SESSION['refreshToken'] = '';
}
$_SESSION['accessToken'] = isset($_SESSION['accessToken']) ? $_SESSION['accessToken'] : '';
$_SESSION['refreshToken'] = isset($_SESSION['refreshToken']) ? $_SESSION['refreshToken'] : '';
if (!$_SESSION['accessToken']) {
header('Location: auth.php');
die();
}
$session = new SpotifyWebAPI\Session($CLIENT_ID, $CLIENT_SECRET, $REDIRECT_URI);
// Use previously requested tokens fetched from session
if ($_SESSION['accessToken']) {
$session->setAccessToken($_SESSION['accessToken']);
$session->setRefreshToken($_SESSION['refreshToken']);
} else {
// Or request a new access token
$session->refreshAccessToken($_SESSION['refreshToken']);
}
$options = [
'scope' => $SPOTIFY_REQUIRED_SCOPES,
'auto_refresh' => true,
];
$api = new SpotifyWebAPI\SpotifyWebAPI($options, $session);
// Save new tokens, they might have been updated
$_SESSION['accessToken'] = $session->getAccessToken();
$_SESSION['refreshToken'] = $session->getRefreshToken();
// ################################################################
$user = [
'id' => '',
'image_url' => '',
'display_name' => '',
'profile_url' => '',
];
try {
$me = $api->me();
$user = [
'id' => $me->id,
'image_url' => \count($me->images) ? $me->images[0]->url : '',
'display_name' => $me->display_name,
'profile_url' => $me->external_urls->spotify,
];
} catch (Exception $ex) {
error_log($ex->getMessage());
}
$topArtistsCount = 40;
$playlistsCount = 24;
$tracksCountInShortPlaylist = 50;
$tracksCountInLongPlaylist = 100;
$templateData = [
'user' => $user,
'playlists' => [],
'topArtists' => [],
'playlist' => null,
'infos' => [],
'errors' => [],
];
$generatePlaylistFromPlaylist = isset($_GET['generate-playlist-from-playlist']);
$generatePlaylistFromSelectedTopArtists = isset($_GET['generate-playlist-top-artists']);
$generatePlaylistFromRandomTopArtists = isset($_GET['generate-playlist-random-top-artists']);
$generateQuickPlaylistFromDailyMixes = isset($_GET['generate-quick-playlist-from-daily-mixes']);
$generateQuickPlaylistTambouilleMix = isset($_GET['generate-quick-playlist-tambouille-mix']);
$showPlaylistContent = isset($_GET['show-playlist']);
$action = '';
if ($generatePlaylistFromPlaylist) {
$action = 'generate-playlist-from-playlist';
} elseif ($generatePlaylistFromSelectedTopArtists) {
$action = 'generate-playlist-from-selected-top-artists';
} elseif ($generatePlaylistFromRandomTopArtists) {
$action = 'generate-playlist-from-random-top-artists';
} elseif ($generateQuickPlaylistFromDailyMixes) {
$action = 'generate-playlist-from-daily-mixes';
} elseif ($generateQuickPlaylistTambouilleMix) {
$action = 'generate-playlist-tambouille-mix';
} elseif ($showPlaylistContent) {
$action = 'show-playlist-content';
} else {
}
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;
}
}
}
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;
}
}
}
$recommendedTrackIds = $filteredTrackIds;
}
$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.');
// 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;
}
}
}
$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.');
// 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;
}
}
}
$newPlaylist = createPlaylistWithRandomTracks(
$api,
$recommendedTrackIds,
$generateLongPlaylist ? $tracksCountInLongPlaylist : $tracksCountInShortPlaylist
);
$templateData['infos'][] = getCreatedPlaylistInformationMessage($api, $newPlaylist);
break;
case 'generate-playlist-from-daily-mixes':
$generateLongPlaylist = isset($_GET['check-quick-create-long-playlist']);
printLog('Generate playlist from Daily Mixes (long playlist :'.($generateLongPlaylist ? 'yes' : 'no').')');
$newPlaylist = createPlaylistFromDailyMixesTracks(
$api,
$generateLongPlaylist ? $tracksCountInLongPlaylist : $tracksCountInShortPlaylist
);
$templateData['infos'][] = getCreatedPlaylistInformationMessage($api, $newPlaylist);
break;
case 'generate-playlist-tambouille-mix':
$generateLongPlaylist = isset($_GET['check-quick-create-long-playlist']);
printLog('Generate tambouille mix playlist (long playlist :'.($generateLongPlaylist ? 'yes' : 'no').')');
$newPlaylist = createPlaylistTambouilleMix(
$api,
$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';