<?php\r
-\r
+ declare(strict_types = 1);\r
+ \r
require 'secrets.php';\r
+ require 'mpfuncs.php';\r
\r
const BASE_URL = 'https://api.spotify.com/v1/';\r
const AUTH_URL = 'https://accounts.spotify.com/';\r
- #TODO correctly get tracks only for current month as well as only new tracks\r
- const MONTHS = [];\r
- \r
+ const DATE_FILE = 'prev_date.txt';\r
+ const DATE_FORM = 'm/d/Y';\r
+ const MONTHS = [\r
+ '01' => 'January',\r
+ '02' => 'February',\r
+ '03' => 'March',\r
+ '04' => 'April',\r
+ '05' => 'May',\r
+ '06' => 'June',\r
+ '07' => 'July',\r
+ '08' => 'August',\r
+ '09' => 'September',\r
+ '10' => 'October',\r
+ '11' => 'November',\r
+ '12' => 'December',\r
+ ];\r
+ \r
$code = $_GET['code'];\r
\r
if (!$code) {\r
exit(1);\r
}\r
\r
+ $today = new DateTime;\r
+ \r
+ #print_r($today);\r
+ \r
+ $prevDTTxt = file_get_contents(DATE_FILE);\r
+ \r
+ $prevDT = $prevDTTxt ? DateTime::createFromFormat(DATE_FORM, $prevDTTxt) : DateTime::createFromFormat(DATE_FORM, $today->format('m/') . '01' . $today->format('/Y'));\r
+ \r
+ if (strcmp($prevDT->format('m'), $today->format('m')) < 0) {\r
+ $prevDT = DateTime::createFromFormat(DATE_FORM, $today->format('m/') . '01' . $today->format('/Y'));\r
+ }\r
+ \r
+ \r
#Handle Spotify Token Authorization\r
\r
$token_data = [\r
\r
$spot_req = file_get_contents(AUTH_URL . 'api/token', false, $token_context);\r
\r
- echo $spot_req;\r
+ #echo $spot_req;\r
$spot_json = json_decode($spot_req, true);\r
\r
$spot_token = $spot_json['access_token'];\r
$me_id = $me_json['id'];\r
\r
echo '<br />';\r
- print_r($me_resp);\r
- \r
+ #print_r($me_resp);\r
+ \r
+ $page = 1;\r
$html = file_get_contents('https://www.marketplace.org/latest-music');\r
$DOM = new DOMDocument;\r
$DOM->loadHTML($html);\r
$headers = $DOM->getElementsByTagName('h2');\r
$divs = $DOM->getElementsByTagName('div');\r
\r
- $date_headers = [];\r
- $music_group = [];\r
+ $recentEpDT;\r
+ $episodePages = [];\r
\r
foreach ($headers as $header) {\r
if ($header->hasAttribute('class') && $header->getAttribute('class') === 'river--hed') {\r
- $date_headers[] = $header->nodeValue;\r
+ $recentEpDT = DateTime::createFromFormat(DATE_FORM, explode(':', $header->nodeValue)[0]);\r
+ break;\r
}\r
}\r
- foreach ($divs as $div) {\r
- if ($div->hasAttribute('class') && $div->getAttribute('class') === 'episode-music') {\r
- $songs = [];\r
- foreach ($div->childNodes as $row) {\r
- $children = $row->childNodes[0]->childNodes;\r
- $songs[] = [\r
- 'title' => $children[0]->nodeValue,\r
- 'artist' => $children[1]->nodeValue\r
- ];\r
- }\r
- $music_group[] = $songs;\r
- }\r
+ \r
+ $prevDate = (int) $prevDT->format('d');\r
+ $recentEpDate = (int) $recentEpDT->format('d');\r
+ $daysToGet = ($prevDate === 1) ? $recentEpDate : $recentEpDate - $prevDate;\r
+ $daysToGet = $daysToGet - 2 * (int) ($daysToGet / 7);\r
+ \r
+ if ($daysToGet === 0) {\r
+ echo 'No new episodes since last check.';\r
+ exit(0);\r
}\r
\r
+ \r
+ do {\r
+ $episodePages[] = parseEpisodePage($divs, $daysToGet);\r
+ } while ($daysToGet > 0 && ($DOM->loadHTML(file_get_contents('https://www.marketplace.org/latest-music?page=' . ++$page))) && ($divs = $DOM->getElementsByTagName('div')) );\r
+\r
+ /*\r
echo '<br />';\r
\r
print_r($date_headers);\r
\r
echo '<br />';\r
- print_r($music_group);\r
+ print_r($episodes);\r
+ */\r
\r
- #TODO Check if this month's playlist exists first\r
+ print_r($episodePages);\r
\r
- $playlist_data = [\r
- 'name' => 'March Marketplace Tracks'\r
- ];\r
+ # Check if this month's playlist exists\r
\r
- $playlist_opts = [\r
+ $playlistName = MONTHS[$today->format('m')] . ' Marketplace Tracks';\r
+ \r
+ $checkPlaylistOpts = [\r
'http' => [\r
- 'method' => 'POST',\r
+ 'method' => 'GET',\r
'header' => 'Authorization: Bearer ' . $spot_token . "\r\n"\r
- . 'Content-Type application/json \r\n',\r
- 'content' => json_encode($playlist_data)\r
]\r
];\r
\r
- $playlist_context = stream_context_create($playlist_opts);\r
+ $checkPlaylistContext = stream_context_create($checkPlaylistOpts);\r
\r
- $playlist_req = file_get_contents(BASE_URL . 'users/' . $me_id . '/playlists', false, $playlist_context);\r
+ $checkPlaylistReq = file_get_contents(BASE_URL . 'me/playlists', false, $checkPlaylistContext);\r
\r
- $playlist_json = json_decode($playlist_req, true);\r
+ $checkPlaylistJson = json_decode($checkPlaylistReq, true);\r
+ \r
+ foreach ($checkPlaylistJson['items'] as $playlist) {\r
+ #TODO should check if $user owns playlist\r
+ if (!strcmp($playlistName, $playlist['name'])) {\r
+ $playlistID = $playlist['id'];\r
+ }\r
+ }\r
\r
- $playlist_id = $playlist_json['id'];\r
+ #echo 'playlistID' . $playlistID;\r
\r
- echo '<br />' . $playlist_id;\r
+ # Create new playlist if one does not exist\r
+ # DEVELOPMENT TEMP ALWAYS CREATE NEW PLAYLIST\r
+ #if (!$playlistID) {\r
+ if (true) {\r
+\r
+ $playlist_data = [\r
+ 'name' => $playlistName,\r
+ ];\r
+ \r
+ $playlist_opts = [\r
+ 'http' => [\r
+ 'method' => 'POST',\r
+ 'header' => 'Authorization: Bearer ' . $spot_token . "\r\n"\r
+ . 'Content-Type application/json \r\n',\r
+ 'content' => json_encode($playlist_data)\r
+ ]\r
+ ];\r
+\r
+ $playlist_context = stream_context_create($playlist_opts);\r
+ $playlist_req = file_get_contents(BASE_URL . 'users/' . $me_id . '/playlists', false, $playlist_context);\r
+ $playlist_json = json_decode($playlist_req, true);\r
+ $playlistID = $playlist_json['id'];\r
+ \r
+ #echo '<br />' . $playlistID;\r
+ \r
+ }\r
\r
$uris = [];\r
\r
- for ($i = count($music_group) - 1; $i >= 0; $i--) {\r
- \r
- $track_opts = [\r
- 'http' => [\r
- 'method' => 'GET',\r
- 'header' => 'Authorization: Bearer ' . $spot_token . "\r\n"\r
- ]\r
- ];\r
+ foreach ( array_reverse($episodePages) as $episodes) {\r
+ foreach ( array_reverse($episodes) as $episode) {\r
+\r
+ $track_opts = [\r
+ 'http' => [\r
+ 'method' => 'GET',\r
+ 'header' => 'Authorization: Bearer ' . $spot_token . "\r\n"\r
+ ]\r
+ ];\r
\r
- $track_context = stream_context_create($track_opts);\r
+ $track_context = stream_context_create($track_opts);\r
\r
- foreach ($music_group[$i] as $song_info) {\r
+ foreach ($episode as $song_info) {\r
\r
- $track_search_url = BASE_URL . 'search?q=track:' . urlencode($song_info['title']) . '+artist:' . urlencode($song_info['artist']) . '&type=track';\r
+ $track_search_url = BASE_URL . 'search?q=track:' . urlencode($song_info['title']) \r
+ . '+artist:' . urlencode($song_info['artist']) . '&type=track';\r
\r
- echo '<br />' . $track_search_url;\r
- echo '<br />';\r
+ #echo '<br />' . $track_search_url;\r
+ #echo '<br />';\r
\r
- $track_req = file_get_contents($track_search_url, false, $track_context);\r
- $track_json = json_decode($track_req, true);\r
+ $trackReq = file_get_contents($track_search_url, false, $track_context);\r
+ if ($trackReq) {\r
+ $trackJSON = json_decode($trackReq, true);\r
+ $trackJSON = $trackJSON['tracks'];\r
\r
- print_r($track_json);\r
+ print_r($trackJSON);\r
+ \r
+ if ($trackJSON['total'] === 0) {\r
+ continue;\r
+ }\r
\r
- $uris[] = $track_json['tracks']['items'][0]['uri'];\r
+ $uris[] = $trackJSON['items'][0]['uri'];\r
\r
- #rate limit\r
- sleep(1);\r
- \r
+ #rate limit\r
+ sleep(1);\r
+\r
+ }\r
+ }\r
}\r
- \r
}\r
- \r
+ \r
$update_data = [\r
- 'uris' => array_values(array_filter($uris, function($uri) {return !is_null($uri);} ))\r
+ 'uris' => $uris,\r
];\r
\r
echo '<br /> update_data <br />';\r
- print_r($update_data);\r
+ #print_r($update_data);\r
\r
$update_opts = [\r
'http' => [\r
];\r
\r
$update_context = stream_context_create($update_opts);\r
- $update_url = BASE_URL . 'users/' . $me_id . '/playlists/' . $playlist_id . '/tracks';\r
+ $update_url = BASE_URL . 'users/' . $me_id . '/playlists/' . $playlistID . '/tracks';\r
echo '<br />' . $update_url;\r
echo '<br />';\r
echo '<br />' . count($uris);\r
echo '<br />';\r
print_r(json_encode($update_data));\r
- $update_req = file_get_contents(BASE_URL . 'users/' . $me_id . '/playlists/' . $playlist_id . '/tracks', false, $update_context);\r
+ $update_req = file_get_contents(BASE_URL . 'users/' . $me_id . '/playlists/' . $playlistID . '/tracks', false, $update_context);\r
+ print_r($update_req);\r
+ \r
+ file_put_contents(DATE_FILE, $recentEpDT->format(DATE_FORM));\r
\ No newline at end of file