'January',
'02' => 'February',
'03' => 'March',
'04' => 'April',
'05' => 'May',
'06' => 'June',
'07' => 'July',
'08' => 'August',
'09' => 'September',
'10' => 'October',
'11' => 'November',
'12' => 'December',
];
$code = $_GET['code'];
if (!$code) {
exit(1);
}
$today = new DateTime;
#print_r($today);
$prevDTTxt = file_get_contents(DATE_FILE);
$prevDT = $prevDTTxt ? DateTime::createFromFormat(DATE_FORM, $prevDTTxt) : DateTime::createFromFormat(DATE_FORM, $today->format('m/') . '01' . $today->format('/Y'));
if (strcmp($prevDT->format('m'), $today->format('m')) < 0) {
$prevDT = DateTime::createFromFormat(DATE_FORM, $today->format('m/') . '01' . $today->format('/Y'));
}
#Handle Spotify Token Authorization
$token_data = [
'grant_type' => 'authorization_code',
'code' => $code,
'redirect_uri' => REDIRECT_URI
];
$token_data = http_build_query($token_data);
$token_opts = [
'http' => [
'method' => 'POST',
/*'header' => "Content-type: application/x-www-form-urlencoded\r\n"
. "Content-Length: " . strlen($token_data) . "\r\n"
. "Authorization: Basic " . base64_encode('868e2cba00de4819900dd8a647a7ba7d:' . CLIENT_SECRET) . "\r\n",*/
'header' => "Authorization: Basic " . base64_encode('868e2cba00de4819900dd8a647a7ba7d:' . CLIENT_SECRET) . " \r\n",
'content' => $token_data
]
];
$token_context = stream_context_create($token_opts);
$spot_req = file_get_contents(AUTH_URL . 'api/token', false, $token_context);
#echo $spot_req;
$spot_json = json_decode($spot_req, true);
$spot_token = $spot_json['access_token'];
$me_opts = [
'http' => [
'method' => 'GET',
'header' => 'Authorization: Bearer ' . $spot_token . "\r\n"
]
];
$me_context = stream_context_create($me_opts);
$me_resp = file_get_contents(BASE_URL . 'me', false, $me_context);
$me_json = json_decode($me_resp, true);
$me_id = $me_json['id'];
echo '
';
#print_r($me_resp);
$page = 1;
$html = file_get_contents('https://www.marketplace.org/latest-music');
$DOM = new DOMDocument;
$DOM->loadHTML($html);
$headers = $DOM->getElementsByTagName('h2');
$divs = $DOM->getElementsByTagName('div');
$recentEpDT;
$episodePages = [];
foreach ($headers as $header) {
if ($header->hasAttribute('class') && $header->getAttribute('class') === 'river--hed') {
$recentEpDT = DateTime::createFromFormat(DATE_FORM, explode(':', $header->nodeValue)[0]);
break;
}
}
$prevDate = (int) $prevDT->format('d');
$recentEpDate = (int) $recentEpDT->format('d');
$daysToGet = ($prevDate === 1) ? $recentEpDate : $recentEpDate - $prevDate;
$daysToGet = $daysToGet - 2 * (int) ($daysToGet / 7);
if ($daysToGet === 0) {
echo 'No new episodes since last check.';
exit(0);
}
do {
$episodePages[] = parseEpisodePage($divs, $daysToGet);
} while ($daysToGet > 0 && ($DOM->loadHTML(file_get_contents('https://www.marketplace.org/latest-music?page=' . ++$page))) && ($divs = $DOM->getElementsByTagName('div')) );
/*
echo '
';
print_r($date_headers);
echo '
';
print_r($episodes);
*/
print_r($episodePages);
# Check if this month's playlist exists
$playlistName = MONTHS[$today->format('m')] . ' Marketplace Tracks';
$checkPlaylistOpts = [
'http' => [
'method' => 'GET',
'header' => 'Authorization: Bearer ' . $spot_token . "\r\n"
]
];
$checkPlaylistContext = stream_context_create($checkPlaylistOpts);
$checkPlaylistReq = file_get_contents(BASE_URL . 'me/playlists', false, $checkPlaylistContext);
$checkPlaylistJson = json_decode($checkPlaylistReq, true);
foreach ($checkPlaylistJson['items'] as $playlist) {
#TODO should check if $user owns playlist
if (!strcmp($playlistName, $playlist['name'])) {
$playlistID = $playlist['id'];
}
}
#echo 'playlistID' . $playlistID;
# Create new playlist if one does not exist
# DEVELOPMENT TEMP ALWAYS CREATE NEW PLAYLIST
#if (!$playlistID) {
if (true) {
$playlist_data = [
'name' => $playlistName,
];
$playlist_opts = [
'http' => [
'method' => 'POST',
'header' => 'Authorization: Bearer ' . $spot_token . "\r\n"
. 'Content-Type application/json \r\n',
'content' => json_encode($playlist_data)
]
];
$playlist_context = stream_context_create($playlist_opts);
$playlist_req = file_get_contents(BASE_URL . 'users/' . $me_id . '/playlists', false, $playlist_context);
$playlist_json = json_decode($playlist_req, true);
$playlistID = $playlist_json['id'];
#echo '
' . $playlistID;
}
$uris = [];
foreach ( array_reverse($episodePages) as $episodes) {
foreach ( array_reverse($episodes) as $episode) {
$track_opts = [
'http' => [
'method' => 'GET',
'header' => 'Authorization: Bearer ' . $spot_token . "\r\n"
]
];
$track_context = stream_context_create($track_opts);
foreach ($episode as $song_info) {
$track_search_url = BASE_URL . 'search?q=track:' . urlencode($song_info['title'])
. '+artist:' . urlencode($song_info['artist']) . '&type=track';
#echo '
' . $track_search_url;
#echo '
';
$trackReq = file_get_contents($track_search_url, false, $track_context);
if ($trackReq) {
$trackJSON = json_decode($trackReq, true);
$trackJSON = $trackJSON['tracks'];
print_r($trackJSON);
if ($trackJSON['total'] === 0) {
continue;
}
$uris[] = $trackJSON['items'][0]['uri'];
#rate limit
sleep(1);
}
}
}
}
$update_data = [
'uris' => $uris,
];
echo '
update_data
';
#print_r($update_data);
$update_opts = [
'http' => [
'method' => 'POST',
'header' => 'Authorization: Bearer ' . $spot_token . "\r\n"
. 'Content-Type application/json \r\n',
'content' => json_encode($update_data)
]
];
$update_context = stream_context_create($update_opts);
$update_url = BASE_URL . 'users/' . $me_id . '/playlists/' . $playlistID . '/tracks';
echo '
' . $update_url;
echo '
';
echo '
' . count($uris);
echo '
';
print_r(json_encode($update_data));
$update_req = file_get_contents(BASE_URL . 'users/' . $me_id . '/playlists/' . $playlistID . '/tracks', false, $update_context);
print_r($update_req);
file_put_contents(DATE_FILE, $recentEpDT->format(DATE_FORM));