v0.1
authorJacob Casper <dev@jacobcasper.com>
Tue, 20 Mar 2018 09:31:10 +0000 (05:31 -0400)
committerJacob Casper <dev@jacobcasper.com>
Tue, 20 Mar 2018 09:31:10 +0000 (05:31 -0400)
README.md [new file with mode: 0644]
callback.php [new file with mode: 0644]
marketplay.php [new file with mode: 0644]

diff --git a/README.md b/README.md
new file mode 100644 (file)
index 0000000..bd57f3a
--- /dev/null
+++ b/README.md
@@ -0,0 +1,3 @@
+#Marketplaylister
+
+This app automatically creates a Spotify playlist from the Marketplace with Kai Ryssdal music from the month's podcasts.
diff --git a/callback.php b/callback.php
new file mode 100644 (file)
index 0000000..96d5ba1
--- /dev/null
@@ -0,0 +1,179 @@
+<?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
diff --git a/marketplay.php b/marketplay.php
new file mode 100644 (file)
index 0000000..361e2ae
--- /dev/null
@@ -0,0 +1,6 @@
+<?php
+    require 'secrets.php';
+    $scopes = 'playlist-modify-private playlist-modify-public';
+    $url = 'https://accounts.spotify.com/en/authorize?response_type=code&client_id=868e2cba00de4819900dd8a647a7ba7d&scope=' . urlencode($scopes) . '&redirect_uri=' . urlencode(REDIRECT_URI) ;
+    header('Location: ' .$url);
+    exit();