v0.1
[Marketplaylister.git] / callback.php
CommitLineData
7d1597b7
JC
1<?php\r
2\r
3 require 'secrets.php';\r
4 \r
5 const BASE_URL = 'https://api.spotify.com/v1/';\r
6 const AUTH_URL = 'https://accounts.spotify.com/';\r
7 #TODO correctly get tracks only for current month as well as only new tracks\r
8 const MONTHS = [];\r
9 \r
10 $code = $_GET['code'];\r
11 \r
12 if (!$code) {\r
13 exit(1);\r
14 }\r
15 \r
16 #Handle Spotify Token Authorization\r
17 \r
18 $token_data = [\r
19 'grant_type' => 'authorization_code',\r
20 'code' => $code,\r
21 'redirect_uri' => REDIRECT_URI\r
22 ];\r
23 $token_data = http_build_query($token_data);\r
24 \r
25 $token_opts = [\r
26 'http' => [\r
27 'method' => 'POST',\r
28 /*'header' => "Content-type: application/x-www-form-urlencoded\r\n"\r
29 . "Content-Length: " . strlen($token_data) . "\r\n"\r
30 . "Authorization: Basic " . base64_encode('868e2cba00de4819900dd8a647a7ba7d:' . CLIENT_SECRET) . "\r\n",*/\r
31 'header' => "Authorization: Basic " . base64_encode('868e2cba00de4819900dd8a647a7ba7d:' . CLIENT_SECRET) . " \r\n",\r
32 'content' => $token_data\r
33 ]\r
34 ];\r
35 \r
36 $token_context = stream_context_create($token_opts);\r
37 \r
38 $spot_req = file_get_contents(AUTH_URL . 'api/token', false, $token_context);\r
39 \r
40 echo $spot_req;\r
41 $spot_json = json_decode($spot_req, true);\r
42\r
43 $spot_token = $spot_json['access_token'];\r
44 \r
45 $me_opts = [\r
46 'http' => [\r
47 'method' => 'GET',\r
48 'header' => 'Authorization: Bearer ' . $spot_token . "\r\n"\r
49 ]\r
50 ];\r
51 \r
52 $me_context = stream_context_create($me_opts);\r
53 \r
54 $me_resp = file_get_contents(BASE_URL . 'me', false, $me_context);\r
55 $me_json = json_decode($me_resp, true);\r
56 $me_id = $me_json['id'];\r
57 \r
58 echo '<br />';\r
59 print_r($me_resp);\r
60 \r
61 $html = file_get_contents('https://www.marketplace.org/latest-music');\r
62 $DOM = new DOMDocument;\r
63 $DOM->loadHTML($html);\r
64 $headers = $DOM->getElementsByTagName('h2');\r
65 $divs = $DOM->getElementsByTagName('div');\r
66 \r
67 $date_headers = [];\r
68 $music_group = [];\r
69 \r
70 foreach ($headers as $header) {\r
71 if ($header->hasAttribute('class') && $header->getAttribute('class') === 'river--hed') {\r
72 $date_headers[] = $header->nodeValue;\r
73 }\r
74 }\r
75 foreach ($divs as $div) {\r
76 if ($div->hasAttribute('class') && $div->getAttribute('class') === 'episode-music') {\r
77 $songs = [];\r
78 foreach ($div->childNodes as $row) {\r
79 $children = $row->childNodes[0]->childNodes;\r
80 $songs[] = [\r
81 'title' => $children[0]->nodeValue,\r
82 'artist' => $children[1]->nodeValue\r
83 ];\r
84 }\r
85 $music_group[] = $songs;\r
86 }\r
87 }\r
88\r
89 echo '<br />';\r
90\r
91 print_r($date_headers);\r
92 \r
93 echo '<br />';\r
94 print_r($music_group);\r
95 \r
96 #TODO Check if this month's playlist exists first\r
97 \r
98 $playlist_data = [\r
99 'name' => 'March Marketplace Tracks'\r
100 ];\r
101 \r
102 $playlist_opts = [\r
103 'http' => [\r
104 'method' => 'POST',\r
105 'header' => 'Authorization: Bearer ' . $spot_token . "\r\n"\r
106 . 'Content-Type application/json \r\n',\r
107 'content' => json_encode($playlist_data)\r
108 ]\r
109 ];\r
110 \r
111 $playlist_context = stream_context_create($playlist_opts);\r
112 \r
113 $playlist_req = file_get_contents(BASE_URL . 'users/' . $me_id . '/playlists', false, $playlist_context);\r
114 \r
115 $playlist_json = json_decode($playlist_req, true);\r
116 \r
117 $playlist_id = $playlist_json['id'];\r
118 \r
119 echo '<br />' . $playlist_id;\r
120 \r
121 $uris = [];\r
122 \r
123 for ($i = count($music_group) - 1; $i >= 0; $i--) {\r
124 \r
125 $track_opts = [\r
126 'http' => [\r
127 'method' => 'GET',\r
128 'header' => 'Authorization: Bearer ' . $spot_token . "\r\n"\r
129 ]\r
130 ];\r
131 \r
132 $track_context = stream_context_create($track_opts);\r
133 \r
134 foreach ($music_group[$i] as $song_info) {\r
135 \r
136 $track_search_url = BASE_URL . 'search?q=track:' . urlencode($song_info['title']) . '+artist:' . urlencode($song_info['artist']) . '&type=track';\r
137 \r
138 echo '<br />' . $track_search_url;\r
139 echo '<br />';\r
140 \r
141 $track_req = file_get_contents($track_search_url, false, $track_context);\r
142 $track_json = json_decode($track_req, true);\r
143 \r
144 print_r($track_json);\r
145 \r
146 $uris[] = $track_json['tracks']['items'][0]['uri'];\r
147 \r
148 #rate limit\r
149 sleep(1);\r
150 \r
151 }\r
152 \r
153 }\r
154 \r
155 $update_data = [\r
156 'uris' => array_values(array_filter($uris, function($uri) {return !is_null($uri);} ))\r
157 ];\r
158 \r
159 echo '<br /> update_data <br />';\r
160 print_r($update_data);\r
161 \r
162 $update_opts = [\r
163 'http' => [\r
164 'method' => 'POST',\r
165 'header' => 'Authorization: Bearer ' . $spot_token . "\r\n"\r
166 . 'Content-Type application/json \r\n',\r
167 'content' => json_encode($update_data)\r
168 ]\r
169 ];\r
170 \r
171 $update_context = stream_context_create($update_opts);\r
172 $update_url = BASE_URL . 'users/' . $me_id . '/playlists/' . $playlist_id . '/tracks';\r
173 echo '<br />' . $update_url;\r
174 echo '<br />';\r
175 echo '<br />' . count($uris);\r
176 echo '<br />';\r
177 print_r(json_encode($update_data));\r
178 $update_req = file_get_contents(BASE_URL . 'users/' . $me_id . '/playlists/' . $playlist_id . '/tracks', false, $update_context);\r
179