v0.2:
[Marketplaylister.git] / callback.php
CommitLineData
7d1597b7 1<?php\r
bed05b1a
JC
2 declare(strict_types = 1);\r
3 \r
7d1597b7 4 require 'secrets.php';\r
bed05b1a 5 require 'mpfuncs.php';\r
7d1597b7
JC
6 \r
7 const BASE_URL = 'https://api.spotify.com/v1/';\r
8 const AUTH_URL = 'https://accounts.spotify.com/';\r
bed05b1a
JC
9 const DATE_FILE = 'prev_date.txt';\r
10 const DATE_FORM = 'm/d/Y';\r
11 const MONTHS = [\r
12 '01' => 'January',\r
13 '02' => 'February',\r
14 '03' => 'March',\r
15 '04' => 'April',\r
16 '05' => 'May',\r
17 '06' => 'June',\r
18 '07' => 'July',\r
19 '08' => 'August',\r
20 '09' => 'September',\r
21 '10' => 'October',\r
22 '11' => 'November',\r
23 '12' => 'December',\r
24 ];\r
25 \r
7d1597b7
JC
26 $code = $_GET['code'];\r
27 \r
28 if (!$code) {\r
29 exit(1);\r
30 }\r
31 \r
bed05b1a
JC
32 $today = new DateTime;\r
33 \r
34 #print_r($today);\r
35 \r
36 $prevDTTxt = file_get_contents(DATE_FILE);\r
37 \r
38 $prevDT = $prevDTTxt ? DateTime::createFromFormat(DATE_FORM, $prevDTTxt) : DateTime::createFromFormat(DATE_FORM, $today->format('m/') . '01' . $today->format('/Y'));\r
39 \r
40 if (strcmp($prevDT->format('m'), $today->format('m')) < 0) {\r
41 $prevDT = DateTime::createFromFormat(DATE_FORM, $today->format('m/') . '01' . $today->format('/Y'));\r
42 }\r
43 \r
44 \r
7d1597b7
JC
45 #Handle Spotify Token Authorization\r
46 \r
47 $token_data = [\r
48 'grant_type' => 'authorization_code',\r
49 'code' => $code,\r
50 'redirect_uri' => REDIRECT_URI\r
51 ];\r
52 $token_data = http_build_query($token_data);\r
53 \r
54 $token_opts = [\r
55 'http' => [\r
56 'method' => 'POST',\r
57 /*'header' => "Content-type: application/x-www-form-urlencoded\r\n"\r
58 . "Content-Length: " . strlen($token_data) . "\r\n"\r
59 . "Authorization: Basic " . base64_encode('868e2cba00de4819900dd8a647a7ba7d:' . CLIENT_SECRET) . "\r\n",*/\r
60 'header' => "Authorization: Basic " . base64_encode('868e2cba00de4819900dd8a647a7ba7d:' . CLIENT_SECRET) . " \r\n",\r
61 'content' => $token_data\r
62 ]\r
63 ];\r
64 \r
65 $token_context = stream_context_create($token_opts);\r
66 \r
67 $spot_req = file_get_contents(AUTH_URL . 'api/token', false, $token_context);\r
68 \r
bed05b1a 69 #echo $spot_req;\r
7d1597b7
JC
70 $spot_json = json_decode($spot_req, true);\r
71\r
72 $spot_token = $spot_json['access_token'];\r
73 \r
74 $me_opts = [\r
75 'http' => [\r
76 'method' => 'GET',\r
77 'header' => 'Authorization: Bearer ' . $spot_token . "\r\n"\r
78 ]\r
79 ];\r
80 \r
81 $me_context = stream_context_create($me_opts);\r
82 \r
83 $me_resp = file_get_contents(BASE_URL . 'me', false, $me_context);\r
84 $me_json = json_decode($me_resp, true);\r
85 $me_id = $me_json['id'];\r
86 \r
87 echo '<br />';\r
bed05b1a
JC
88 #print_r($me_resp);\r
89 \r
90 $page = 1;\r
7d1597b7
JC
91 $html = file_get_contents('https://www.marketplace.org/latest-music');\r
92 $DOM = new DOMDocument;\r
93 $DOM->loadHTML($html);\r
94 $headers = $DOM->getElementsByTagName('h2');\r
95 $divs = $DOM->getElementsByTagName('div');\r
96 \r
bed05b1a
JC
97 $recentEpDT;\r
98 $episodePages = [];\r
7d1597b7
JC
99 \r
100 foreach ($headers as $header) {\r
101 if ($header->hasAttribute('class') && $header->getAttribute('class') === 'river--hed') {\r
bed05b1a
JC
102 $recentEpDT = DateTime::createFromFormat(DATE_FORM, explode(':', $header->nodeValue)[0]);\r
103 break;\r
7d1597b7
JC
104 }\r
105 }\r
bed05b1a
JC
106 \r
107 $prevDate = (int) $prevDT->format('d');\r
108 $recentEpDate = (int) $recentEpDT->format('d');\r
109 $daysToGet = ($prevDate === 1) ? $recentEpDate : $recentEpDate - $prevDate;\r
110 $daysToGet = $daysToGet - 2 * (int) ($daysToGet / 7);\r
111 \r
112 if ($daysToGet === 0) {\r
113 echo 'No new episodes since last check.';\r
114 exit(0);\r
7d1597b7
JC
115 }\r
116\r
bed05b1a
JC
117 \r
118 do {\r
119 $episodePages[] = parseEpisodePage($divs, $daysToGet);\r
120 } while ($daysToGet > 0 && ($DOM->loadHTML(file_get_contents('https://www.marketplace.org/latest-music?page=' . ++$page))) && ($divs = $DOM->getElementsByTagName('div')) );\r
121\r
122 /*\r
7d1597b7
JC
123 echo '<br />';\r
124\r
125 print_r($date_headers);\r
126 \r
127 echo '<br />';\r
bed05b1a
JC
128 print_r($episodes);\r
129 */\r
7d1597b7 130 \r
bed05b1a 131 print_r($episodePages);\r
7d1597b7 132 \r
bed05b1a 133 # Check if this month's playlist exists\r
7d1597b7 134 \r
bed05b1a
JC
135 $playlistName = MONTHS[$today->format('m')] . ' Marketplace Tracks';\r
136 \r
137 $checkPlaylistOpts = [\r
7d1597b7 138 'http' => [\r
bed05b1a 139 'method' => 'GET',\r
7d1597b7 140 'header' => 'Authorization: Bearer ' . $spot_token . "\r\n"\r
7d1597b7
JC
141 ]\r
142 ];\r
143 \r
bed05b1a 144 $checkPlaylistContext = stream_context_create($checkPlaylistOpts);\r
7d1597b7 145 \r
bed05b1a 146 $checkPlaylistReq = file_get_contents(BASE_URL . 'me/playlists', false, $checkPlaylistContext);\r
7d1597b7 147 \r
bed05b1a
JC
148 $checkPlaylistJson = json_decode($checkPlaylistReq, true);\r
149 \r
150 foreach ($checkPlaylistJson['items'] as $playlist) {\r
151 #TODO should check if $user owns playlist\r
152 if (!strcmp($playlistName, $playlist['name'])) {\r
153 $playlistID = $playlist['id'];\r
154 }\r
155 }\r
7d1597b7 156 \r
bed05b1a 157 #echo 'playlistID' . $playlistID;\r
7d1597b7 158 \r
bed05b1a
JC
159 # Create new playlist if one does not exist\r
160 # DEVELOPMENT TEMP ALWAYS CREATE NEW PLAYLIST\r
161 #if (!$playlistID) {\r
162 if (true) {\r
163\r
164 $playlist_data = [\r
165 'name' => $playlistName,\r
166 ];\r
167 \r
168 $playlist_opts = [\r
169 'http' => [\r
170 'method' => 'POST',\r
171 'header' => 'Authorization: Bearer ' . $spot_token . "\r\n"\r
172 . 'Content-Type application/json \r\n',\r
173 'content' => json_encode($playlist_data)\r
174 ]\r
175 ];\r
176\r
177 $playlist_context = stream_context_create($playlist_opts);\r
178 $playlist_req = file_get_contents(BASE_URL . 'users/' . $me_id . '/playlists', false, $playlist_context);\r
179 $playlist_json = json_decode($playlist_req, true);\r
180 $playlistID = $playlist_json['id'];\r
181 \r
182 #echo '<br />' . $playlistID;\r
183 \r
184 }\r
7d1597b7
JC
185 \r
186 $uris = [];\r
187 \r
bed05b1a
JC
188 foreach ( array_reverse($episodePages) as $episodes) {\r
189 foreach ( array_reverse($episodes) as $episode) {\r
190\r
191 $track_opts = [\r
192 'http' => [\r
193 'method' => 'GET',\r
194 'header' => 'Authorization: Bearer ' . $spot_token . "\r\n"\r
195 ]\r
196 ];\r
7d1597b7 197 \r
bed05b1a 198 $track_context = stream_context_create($track_opts);\r
7d1597b7 199 \r
bed05b1a 200 foreach ($episode as $song_info) {\r
7d1597b7 201 \r
bed05b1a
JC
202 $track_search_url = BASE_URL . 'search?q=track:' . urlencode($song_info['title']) \r
203 . '+artist:' . urlencode($song_info['artist']) . '&type=track';\r
7d1597b7 204 \r
bed05b1a
JC
205 #echo '<br />' . $track_search_url;\r
206 #echo '<br />';\r
7d1597b7 207 \r
bed05b1a
JC
208 $trackReq = file_get_contents($track_search_url, false, $track_context);\r
209 if ($trackReq) {\r
210 $trackJSON = json_decode($trackReq, true);\r
211 $trackJSON = $trackJSON['tracks'];\r
7d1597b7 212 \r
bed05b1a
JC
213 print_r($trackJSON);\r
214 \r
215 if ($trackJSON['total'] === 0) {\r
216 continue;\r
217 }\r
7d1597b7 218 \r
bed05b1a 219 $uris[] = $trackJSON['items'][0]['uri'];\r
7d1597b7 220 \r
bed05b1a
JC
221 #rate limit\r
222 sleep(1);\r
223\r
224 }\r
225 }\r
7d1597b7 226 }\r
7d1597b7 227 }\r
bed05b1a 228 \r
7d1597b7 229 $update_data = [\r
bed05b1a 230 'uris' => $uris,\r
7d1597b7
JC
231 ];\r
232 \r
233 echo '<br /> update_data <br />';\r
bed05b1a 234 #print_r($update_data);\r
7d1597b7
JC
235 \r
236 $update_opts = [\r
237 'http' => [\r
238 'method' => 'POST',\r
239 'header' => 'Authorization: Bearer ' . $spot_token . "\r\n"\r
240 . 'Content-Type application/json \r\n',\r
241 'content' => json_encode($update_data)\r
242 ]\r
243 ];\r
244 \r
245 $update_context = stream_context_create($update_opts);\r
bed05b1a 246 $update_url = BASE_URL . 'users/' . $me_id . '/playlists/' . $playlistID . '/tracks';\r
7d1597b7
JC
247 echo '<br />' . $update_url;\r
248 echo '<br />';\r
249 echo '<br />' . count($uris);\r
250 echo '<br />';\r
251 print_r(json_encode($update_data));\r
bed05b1a
JC
252 $update_req = file_get_contents(BASE_URL . 'users/' . $me_id . '/playlists/' . $playlistID . '/tracks', false, $update_context);\r
253 print_r($update_req);\r
254 \r
255 file_put_contents(DATE_FILE, $recentEpDT->format(DATE_FORM));\r
7d1597b7 256