From bed05b1a3c4b40cb71564fbebb2cb41242163dbd Mon Sep 17 00:00:00 2001 From: Jacob Casper Date: Fri, 23 Mar 2018 22:58:17 -0400 Subject: [PATCH] v0.2: commit 29003c020bdc2cc9848fc5fc1ede992276cb0dbd Author: Jacob Casper Date: Fri Mar 23 22:46:04 2018 -0400 Handles multiple pages of episodes commit f8011d40490137199b3a4fda6ee4749cb8c041ea Author: Jacob Casper Date: Fri Mar 23 18:56:28 2018 -0400 Now tries to use existing playlist first commit 0493403b5ced8c235ca7ffbaf9664ffa4611dbb9 Author: Jacob Casper Date: Fri Mar 23 18:31:29 2018 -0400 Only adds songs from eps since last run --- callback.php | 201 +++++++++++++++++++++++++++++++++++---------------- mpfuncs.php | 26 +++++++ 2 files changed, 165 insertions(+), 62 deletions(-) create mode 100644 mpfuncs.php diff --git a/callback.php b/callback.php index 96d5ba1..7488530 100644 --- a/callback.php +++ b/callback.php @@ -1,18 +1,47 @@ '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 = [ @@ -37,7 +66,7 @@ $spot_req = file_get_contents(AUTH_URL . 'api/token', false, $token_context); - echo $spot_req; + #echo $spot_req; $spot_json = json_decode($spot_req, true); $spot_token = $spot_json['access_token']; @@ -56,108 +85,153 @@ $me_id = $me_json['id']; echo '
'; - print_r($me_resp); - + #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'); - $date_headers = []; - $music_group = []; + $recentEpDT; + $episodePages = []; foreach ($headers as $header) { if ($header->hasAttribute('class') && $header->getAttribute('class') === 'river--hed') { - $date_headers[] = $header->nodeValue; + $recentEpDT = DateTime::createFromFormat(DATE_FORM, explode(':', $header->nodeValue)[0]); + break; } } - foreach ($divs as $div) { - if ($div->hasAttribute('class') && $div->getAttribute('class') === 'episode-music') { - $songs = []; - foreach ($div->childNodes as $row) { - $children = $row->childNodes[0]->childNodes; - $songs[] = [ - 'title' => $children[0]->nodeValue, - 'artist' => $children[1]->nodeValue - ]; - } - $music_group[] = $songs; - } + + $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($music_group); + print_r($episodes); + */ - #TODO Check if this month's playlist exists first + print_r($episodePages); - $playlist_data = [ - 'name' => 'March Marketplace Tracks' - ]; + # Check if this month's playlist exists - $playlist_opts = [ + $playlistName = MONTHS[$today->format('m')] . ' Marketplace Tracks'; + + $checkPlaylistOpts = [ 'http' => [ - 'method' => 'POST', + 'method' => 'GET', '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); + $checkPlaylistContext = stream_context_create($checkPlaylistOpts); - $playlist_req = file_get_contents(BASE_URL . 'users/' . $me_id . '/playlists', false, $playlist_context); + $checkPlaylistReq = file_get_contents(BASE_URL . 'me/playlists', false, $checkPlaylistContext); - $playlist_json = json_decode($playlist_req, true); + $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']; + } + } - $playlist_id = $playlist_json['id']; + #echo 'playlistID' . $playlistID; - echo '
' . $playlist_id; + # 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 = []; - for ($i = count($music_group) - 1; $i >= 0; $i--) { - - $track_opts = [ - 'http' => [ - 'method' => 'GET', - 'header' => 'Authorization: Bearer ' . $spot_token . "\r\n" - ] - ]; + 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); + $track_context = stream_context_create($track_opts); - foreach ($music_group[$i] as $song_info) { + foreach ($episode as $song_info) { - $track_search_url = BASE_URL . 'search?q=track:' . urlencode($song_info['title']) . '+artist:' . urlencode($song_info['artist']) . '&type=track'; + $track_search_url = BASE_URL . 'search?q=track:' . urlencode($song_info['title']) + . '+artist:' . urlencode($song_info['artist']) . '&type=track'; - echo '
' . $track_search_url; - echo '
'; + #echo '
' . $track_search_url; + #echo '
'; - $track_req = file_get_contents($track_search_url, false, $track_context); - $track_json = json_decode($track_req, true); + $trackReq = file_get_contents($track_search_url, false, $track_context); + if ($trackReq) { + $trackJSON = json_decode($trackReq, true); + $trackJSON = $trackJSON['tracks']; - print_r($track_json); + print_r($trackJSON); + + if ($trackJSON['total'] === 0) { + continue; + } - $uris[] = $track_json['tracks']['items'][0]['uri']; + $uris[] = $trackJSON['items'][0]['uri']; - #rate limit - sleep(1); - + #rate limit + sleep(1); + + } + } } - } - + $update_data = [ - 'uris' => array_values(array_filter($uris, function($uri) {return !is_null($uri);} )) + 'uris' => $uris, ]; echo '
update_data
'; - print_r($update_data); + #print_r($update_data); $update_opts = [ 'http' => [ @@ -169,11 +243,14 @@ ]; $update_context = stream_context_create($update_opts); - $update_url = BASE_URL . 'users/' . $me_id . '/playlists/' . $playlist_id . '/tracks'; + $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/' . $playlist_id . '/tracks', false, $update_context); + $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)); \ No newline at end of file diff --git a/mpfuncs.php b/mpfuncs.php new file mode 100644 index 0000000..a35c89f --- /dev/null +++ b/mpfuncs.php @@ -0,0 +1,26 @@ +hasAttribute('class') && $div->getAttribute('class') === 'episode-music') { + if (!$numDays) { + break; + } + $songs = []; + foreach ($div->childNodes as $row) { + $children = $row->childNodes[0]->childNodes; + $songs[] = [ + 'title' => $children[0]->nodeValue, + 'artist' => $children[1]->nodeValue + ]; + } + $numDays--; + $episodePage[] = $songs; + } + + } + + return $episodePage; + + } \ No newline at end of file -- 2.20.1