v0.2:
authorJacob Casper <dev@jacobcasper.com>
Sat, 24 Mar 2018 02:58:17 +0000 (22:58 -0400)
committerJacob Casper <dev@jacobcasper.com>
Sat, 24 Mar 2018 02:58:17 +0000 (22:58 -0400)
commit 29003c020bdc2cc9848fc5fc1ede992276cb0dbd
Author: Jacob Casper <jacob.thomas.casper@gmail.com>
Date:   Fri Mar 23 22:46:04 2018 -0400

    Handles multiple pages of episodes

commit f8011d40490137199b3a4fda6ee4749cb8c041ea
Author: Jacob Casper <jacob.thomas.casper@gmail.com>
Date:   Fri Mar 23 18:56:28 2018 -0400

    Now tries to use existing playlist first

commit 0493403b5ced8c235ca7ffbaf9664ffa4611dbb9
Author: Jacob Casper <jacob.thomas.casper@gmail.com>
Date:   Fri Mar 23 18:31:29 2018 -0400

    Only adds songs from eps since last run

callback.php
mpfuncs.php [new file with mode: 0644]

index 96d5ba1..7488530 100644 (file)
@@ -1,18 +1,47 @@
 <?php\r
-\r
+    declare(strict_types = 1);\r
+    \r
     require 'secrets.php';\r
+    require 'mpfuncs.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
+    const DATE_FILE = 'prev_date.txt';\r
+    const DATE_FORM = 'm/d/Y';\r
+    const MONTHS = [\r
+        '01' => 'January',\r
+        '02' => 'February',\r
+        '03' => 'March',\r
+        '04' => 'April',\r
+        '05' => 'May',\r
+        '06' => 'June',\r
+        '07' => 'July',\r
+        '08' => 'August',\r
+        '09' => 'September',\r
+        '10' => 'October',\r
+        '11' => 'November',\r
+        '12' => 'December',\r
+    ];\r
+        \r
     $code = $_GET['code'];\r
     \r
     if (!$code) {\r
         exit(1);\r
     }\r
     \r
+    $today = new DateTime;\r
+    \r
+    #print_r($today);\r
+    \r
+    $prevDTTxt = file_get_contents(DATE_FILE);\r
+    \r
+    $prevDT = $prevDTTxt ? DateTime::createFromFormat(DATE_FORM, $prevDTTxt) : DateTime::createFromFormat(DATE_FORM, $today->format('m/') . '01' . $today->format('/Y'));\r
+    \r
+    if (strcmp($prevDT->format('m'), $today->format('m')) < 0) {\r
+        $prevDT = DateTime::createFromFormat(DATE_FORM, $today->format('m/') . '01' . $today->format('/Y'));\r
+    }\r
+    \r
+    \r
     #Handle Spotify Token Authorization\r
     \r
     $token_data = [\r
@@ -37,7 +66,7 @@
     \r
     $spot_req = file_get_contents(AUTH_URL . 'api/token', false, $token_context);\r
     \r
-    echo $spot_req;\r
+    #echo $spot_req;\r
     $spot_json = json_decode($spot_req, true);\r
 \r
     $spot_token = $spot_json['access_token'];\r
     $me_id = $me_json['id'];\r
     \r
     echo '<br />';\r
-    print_r($me_resp);\r
-        \r
+    #print_r($me_resp);\r
+    \r
+    $page = 1;\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
+    $recentEpDT;\r
+    $episodePages = [];\r
     \r
     foreach ($headers as $header) {\r
         if ($header->hasAttribute('class') && $header->getAttribute('class') === 'river--hed') {\r
-            $date_headers[] = $header->nodeValue;\r
+            $recentEpDT = DateTime::createFromFormat(DATE_FORM, explode(':', $header->nodeValue)[0]);\r
+            break;\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
+    $prevDate = (int) $prevDT->format('d');\r
+    $recentEpDate = (int) $recentEpDT->format('d');\r
+    $daysToGet = ($prevDate === 1) ? $recentEpDate : $recentEpDate - $prevDate;\r
+    $daysToGet = $daysToGet - 2 * (int) ($daysToGet / 7);\r
+    \r
+    if ($daysToGet === 0) {\r
+        echo 'No new episodes since last check.';\r
+        exit(0);\r
     }\r
 \r
+    \r
+    do {\r
+        $episodePages[] = parseEpisodePage($divs, $daysToGet);\r
+    } while ($daysToGet > 0 && ($DOM->loadHTML(file_get_contents('https://www.marketplace.org/latest-music?page=' . ++$page))) && ($divs = $DOM->getElementsByTagName('div')) );\r
+\r
+    /*\r
     echo '<br />';\r
 \r
     print_r($date_headers);\r
     \r
     echo '<br />';\r
-    print_r($music_group);\r
+    print_r($episodes);\r
+    */\r
     \r
-    #TODO Check if this month's playlist exists first\r
+    print_r($episodePages);\r
     \r
-    $playlist_data = [\r
-        'name' => 'March Marketplace Tracks'\r
-    ];\r
+    # Check if this month's playlist exists\r
     \r
-    $playlist_opts = [\r
+    $playlistName = MONTHS[$today->format('m')] . ' Marketplace Tracks';\r
+    \r
+    $checkPlaylistOpts = [\r
         'http' => [\r
-            'method' => 'POST',\r
+            'method' => 'GET',\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
+    $checkPlaylistContext = stream_context_create($checkPlaylistOpts);\r
     \r
-    $playlist_req = file_get_contents(BASE_URL . 'users/' . $me_id . '/playlists', false, $playlist_context);\r
+    $checkPlaylistReq = file_get_contents(BASE_URL  . 'me/playlists', false, $checkPlaylistContext);\r
     \r
-    $playlist_json = json_decode($playlist_req, true);\r
+    $checkPlaylistJson = json_decode($checkPlaylistReq, true);\r
+            \r
+    foreach ($checkPlaylistJson['items'] as $playlist) {\r
+        #TODO should check if $user owns playlist\r
+        if (!strcmp($playlistName, $playlist['name'])) {\r
+            $playlistID = $playlist['id'];\r
+        }\r
+    }\r
     \r
-    $playlist_id = $playlist_json['id'];\r
+    #echo 'playlistID' . $playlistID;\r
     \r
-    echo '<br />' . $playlist_id;\r
+    # Create new playlist if one does not exist\r
+    # DEVELOPMENT TEMP ALWAYS CREATE NEW PLAYLIST\r
+    #if (!$playlistID) {\r
+    if (true) {\r
+\r
+        $playlist_data = [\r
+            'name' => $playlistName,\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
+        $playlist_req = file_get_contents(BASE_URL . 'users/' . $me_id . '/playlists', false, $playlist_context);\r
+        $playlist_json = json_decode($playlist_req, true);\r
+        $playlistID = $playlist_json['id'];\r
+        \r
+        #echo '<br />' . $playlistID;\r
+        \r
+    }\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
+    foreach ( array_reverse($episodePages) as $episodes) {\r
+        foreach ( array_reverse($episodes) as $episode) {\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
+        $track_context = stream_context_create($track_opts);\r
     \r
-        foreach ($music_group[$i] as $song_info) {\r
+            foreach ($episode 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
+                $track_search_url = BASE_URL . 'search?q=track:' . urlencode($song_info['title']) \r
+                                    . '+artist:' . urlencode($song_info['artist']) . '&type=track';\r
              \r
-            echo '<br />' . $track_search_url;\r
-            echo '<br />';\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
+                $trackReq = file_get_contents($track_search_url, false, $track_context);\r
+                if ($trackReq) {\r
+                    $trackJSON = json_decode($trackReq, true);\r
+                    $trackJSON = $trackJSON['tracks'];\r
             \r
-            print_r($track_json);\r
+                    print_r($trackJSON);\r
+                    \r
+                    if ($trackJSON['total'] === 0) {\r
+                        continue;\r
+                    }\r
             \r
-            $uris[] = $track_json['tracks']['items'][0]['uri'];\r
+                    $uris[] = $trackJSON['items'][0]['uri'];\r
             \r
-            #rate limit\r
-            sleep(1);\r
-    \r
+                    #rate limit\r
+                    sleep(1);\r
+\r
+                }\r
+            }\r
         }\r
-    \r
     }\r
-    \r
+        \r
     $update_data = [\r
-        'uris' => array_values(array_filter($uris, function($uri) {return !is_null($uri);} ))\r
+        'uris' => $uris,\r
     ];\r
     \r
     echo '<br /> update_data <br />';\r
-    print_r($update_data);\r
+    #print_r($update_data);\r
     \r
     $update_opts = [\r
         'http' => [\r
     ];\r
     \r
     $update_context = stream_context_create($update_opts);\r
-    $update_url = BASE_URL . 'users/' . $me_id . '/playlists/' . $playlist_id . '/tracks';\r
+    $update_url = BASE_URL . 'users/' . $me_id . '/playlists/' . $playlistID . '/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
+    $update_req = file_get_contents(BASE_URL . 'users/' . $me_id . '/playlists/' . $playlistID . '/tracks', false, $update_context);\r
+    print_r($update_req);\r
+    \r
+    file_put_contents(DATE_FILE, $recentEpDT->format(DATE_FORM));\r
     
\ No newline at end of file
diff --git a/mpfuncs.php b/mpfuncs.php
new file mode 100644 (file)
index 0000000..a35c89f
--- /dev/null
@@ -0,0 +1,26 @@
+<?php\r
+    \r
+    function parseEpisodePage(DomNodeList $divs, int &$numDays): array {\r
+        $episodePage = [];\r
+        foreach ($divs as $div) {\r
+            if ($div->hasAttribute('class') && $div->getAttribute('class') === 'episode-music') {\r
+                if (!$numDays) {\r
+                    break;\r
+                }\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
+                $numDays--;\r
+                $episodePage[] = $songs;\r
+            }\r
+            \r
+        }\r
+        \r
+        return $episodePage;\r
+        \r
+    }
\ No newline at end of file