+<?php\r
+\r
+ require 'secrets.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
+ $code = $_GET['code'];\r
+ \r
+ if (!$code) {\r
+ exit(1);\r
+ }\r
+ \r
+ #Handle Spotify Token Authorization\r
+ \r
+ $token_data = [\r
+ 'grant_type' => 'authorization_code',\r
+ 'code' => $code,\r
+ 'redirect_uri' => REDIRECT_URI\r
+ ];\r
+ $token_data = http_build_query($token_data);\r
+ \r
+ $token_opts = [\r
+ 'http' => [\r
+ 'method' => 'POST',\r
+ /*'header' => "Content-type: application/x-www-form-urlencoded\r\n"\r
+ . "Content-Length: " . strlen($token_data) . "\r\n"\r
+ . "Authorization: Basic " . base64_encode('868e2cba00de4819900dd8a647a7ba7d:' . CLIENT_SECRET) . "\r\n",*/\r
+ 'header' => "Authorization: Basic " . base64_encode('868e2cba00de4819900dd8a647a7ba7d:' . CLIENT_SECRET) . " \r\n",\r
+ 'content' => $token_data\r
+ ]\r
+ ];\r
+ \r
+ $token_context = stream_context_create($token_opts);\r
+ \r
+ $spot_req = file_get_contents(AUTH_URL . 'api/token', false, $token_context);\r
+ \r
+ echo $spot_req;\r
+ $spot_json = json_decode($spot_req, true);\r
+\r
+ $spot_token = $spot_json['access_token'];\r
+ \r
+ $me_opts = [\r
+ 'http' => [\r
+ 'method' => 'GET',\r
+ 'header' => 'Authorization: Bearer ' . $spot_token . "\r\n"\r
+ ]\r
+ ];\r
+ \r
+ $me_context = stream_context_create($me_opts);\r
+ \r
+ $me_resp = file_get_contents(BASE_URL . 'me', false, $me_context);\r
+ $me_json = json_decode($me_resp, true);\r
+ $me_id = $me_json['id'];\r
+ \r
+ echo '<br />';\r
+ print_r($me_resp);\r
+ \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
+ \r
+ foreach ($headers as $header) {\r
+ if ($header->hasAttribute('class') && $header->getAttribute('class') === 'river--hed') {\r
+ $date_headers[] = $header->nodeValue;\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
+\r
+ echo '<br />';\r
+\r
+ print_r($date_headers);\r
+ \r
+ echo '<br />';\r
+ print_r($music_group);\r
+ \r
+ #TODO Check if this month's playlist exists first\r
+ \r
+ $playlist_data = [\r
+ 'name' => 'March Marketplace Tracks'\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
+ \r
+ $playlist_req = file_get_contents(BASE_URL . 'users/' . $me_id . '/playlists', false, $playlist_context);\r
+ \r
+ $playlist_json = json_decode($playlist_req, true);\r
+ \r
+ $playlist_id = $playlist_json['id'];\r
+ \r
+ echo '<br />' . $playlist_id;\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
+ \r
+ $track_context = stream_context_create($track_opts);\r
+ \r
+ foreach ($music_group[$i] 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
+ \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
+ \r
+ print_r($track_json);\r
+ \r
+ $uris[] = $track_json['tracks']['items'][0]['uri'];\r
+ \r
+ #rate limit\r
+ sleep(1);\r
+ \r
+ }\r
+ \r
+ }\r
+ \r
+ $update_data = [\r
+ 'uris' => array_values(array_filter($uris, function($uri) {return !is_null($uri);} ))\r
+ ];\r
+ \r
+ echo '<br /> update_data <br />';\r
+ print_r($update_data);\r
+ \r
+ $update_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($update_data)\r
+ ]\r
+ ];\r
+ \r
+ $update_context = stream_context_create($update_opts);\r
+ $update_url = BASE_URL . 'users/' . $me_id . '/playlists/' . $playlist_id . '/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
+
\ No newline at end of file