v0.3.3:
authorJacob Casper <dev@jacobcasper.com>
Sun, 17 Nov 2019 15:15:22 +0000 (09:15 -0600)
committerJacob Casper <dev@jacobcasper.com>
Sun, 17 Nov 2019 20:28:03 +0000 (14:28 -0600)
Update scraper for site changes

Fix formatting

callback.php
marketplay.php
marketscraper.php
mpfuncs.php
searchify.php

index b6211da..f47e73b 100644 (file)
-<?php\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
-    const DATE_FILE = 'prev_date.txt';\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
-    // Get month and year user is requesting\r
-    $state = explode(':', $_GET['state']);\r
-    \r
-    \r
-    if (!$code) {\r
-        exit(1);\r
-    }\r
-        \r
-    #print_r($today);    \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('93a6f9c0375c45d4b348157691aa24e8:' . 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
-    \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
-    # Check if this month's playlist exists\r
-    \r
-    $playlistName = MONTHS[$state[0]] . ' ' . $state[1] . ' Marketplace Tracks';\r
-    \r
-    $checkPlaylistOpts = [\r
-        'http' => [\r
-            'method' => 'GET',\r
-            'header' => 'Authorization: Bearer ' . $spot_token . "\r\n"\r
-        ]\r
-    ];\r
-    \r
-    $checkPlaylistContext = stream_context_create($checkPlaylistOpts);\r
-    \r
-    $checkPlaylistReq = file_get_contents(BASE_URL  . 'me/playlists', false, $checkPlaylistContext);\r
-    \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
-    #echo 'playlistID' . $playlistID;\r
-    \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
-            'description' => 'A playlist of Marketplace tracks by Marketplaylister.',\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
-    $pdo = new PDO("sqlite:mktplc.sqlite3");\r
-    $stmt = $pdo->prepare("SELECT uri FROM songs s WHERE uri IS NOT NULL AND strftime('%m', s.date) == :month AND strftime('%Y', s.date) == :year");\r
-    $stmt->bindParam(':month', $state[0]);\r
-    $stmt->bindParam(':year', $state[1]);\r
-    if ($stmt->execute()) {\r
-      while ($row = $stmt->fetch()) {\r
-        $uris[] = $row['uri'];\r
-      }\r
-    }\r
-        \r
-    $update_data = [\r
-        'uris' => $uris,\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/' . $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/' . $playlistID . '/tracks', false, $update_context);\r
-    print_r($update_req);
\ No newline at end of file
+<?php
+declare(strict_types = 1);
+
+require 'secrets.php';
+require 'mpfuncs.php';
+
+const BASE_URL = 'https://api.spotify.com/v1/';
+const AUTH_URL = 'https://accounts.spotify.com/';
+const DATE_FILE = 'prev_date.txt';
+const MONTHS = [
+    '01' => 'January',
+    '02' => 'February',
+    '03' => 'March',
+    '04' => 'April',
+    '05' => 'May',
+    '06' => 'June',
+    '07' => 'July',
+    '08' => 'August',
+    '09' => 'September',
+    '10' => 'October',
+    '11' => 'November',
+    '12' => 'December',
+];
+
+$code = $_GET['code'];
+
+// Get month and year user is requesting
+$state = explode(':', $_GET['state']);
+
+
+if (!$code) {
+    exit(1);
+}
+
+#print_r($today);
+
+#Handle Spotify Token Authorization
+
+$token_data = [
+    'grant_type' => 'authorization_code',
+    'code' => $code,
+    'redirect_uri' => REDIRECT_URI
+];
+$token_data = http_build_query($token_data);
+
+$token_opts = [
+    'http' => [
+        'method' => 'POST',
+        /*'header' => "Content-type: application/x-www-form-urlencoded\r\n"
+          . "Content-Length: " . strlen($token_data) . "\r\n"
+          . "Authorization: Basic " . base64_encode('868e2cba00de4819900dd8a647a7ba7d:' . CLIENT_SECRET) . "\r\n",*/
+        'header' => "Authorization: Basic " . base64_encode('93a6f9c0375c45d4b348157691aa24e8:' . CLIENT_SECRET) . " \r\n",
+        'content' => $token_data
+    ]
+];
+
+$token_context = stream_context_create($token_opts);
+
+$spot_req = file_get_contents(AUTH_URL . 'api/token', false, $token_context);
+
+echo $spot_req;
+$spot_json = json_decode($spot_req, true);
+
+$spot_token = $spot_json['access_token'];
+
+
+$me_opts = [
+    'http' => [
+        'method' => 'GET',
+        'header' => 'Authorization: Bearer ' . $spot_token . "\r\n"
+    ]
+];
+
+$me_context = stream_context_create($me_opts);
+
+$me_resp = file_get_contents(BASE_URL . 'me', false, $me_context);
+$me_json = json_decode($me_resp, true);
+$me_id = $me_json['id'];
+
+# Check if this month's playlist exists
+
+$playlistName = MONTHS[$state[0]] . ' ' . $state[1] . ' Marketplace Tracks';
+
+$checkPlaylistOpts = [
+    'http' => [
+        'method' => 'GET',
+        'header' => 'Authorization: Bearer ' . $spot_token . "\r\n"
+    ]
+];
+
+$checkPlaylistContext = stream_context_create($checkPlaylistOpts);
+
+$checkPlaylistReq = file_get_contents(BASE_URL  . 'me/playlists', false, $checkPlaylistContext);
+
+$checkPlaylistJson = json_decode($checkPlaylistReq, true);
+
+foreach ($checkPlaylistJson['items'] as $playlist) {
+    #TODO should check if $user owns playlist
+    if (!strcmp($playlistName, $playlist['name'])) {
+        $playlistID = $playlist['id'];
+    }
+}
+
+# Create new playlist if one does not exist
+# DEVELOPMENT TEMP ALWAYS CREATE NEW PLAYLIST
+#if (!$playlistID) {
+    if (true) {
+
+        $playlist_data = [
+            'name' => $playlistName,
+            'description' => 'A playlist of Marketplace tracks by Marketplaylister.',
+        ];
+
+        $playlist_opts = [
+            'http' => [
+                'method' => 'POST',
+            'header' => 'Authorization: Bearer ' . $spot_token . "\r\n"
+                . 'Content-Type: application/json \r\n',
+            'content' => json_encode($playlist_data)
+            ]
+        ];
+
+        $playlist_context = stream_context_create($playlist_opts);
+        $playlist_req = file_get_contents(BASE_URL . 'users/' . $me_id . '/playlists', false, $playlist_context);
+        $playlist_json = json_decode($playlist_req, true);
+        $playlistID = $playlist_json['id'];
+
+
+    }
+
+    $uris = [];
+
+    $pdo = new PDO("sqlite:mktplc.sqlite3");
+    $stmt = $pdo->prepare("SELECT uri FROM songs s WHERE uri IS NOT NULL AND strftime('%m', s.date) == :month AND strftime('%Y', s.date) == :year");
+    $stmt->bindParam(':month', $state[0]);
+    $stmt->bindParam(':year', $state[1]);
+    if ($stmt->execute()) {
+        while ($row = $stmt->fetch()) {
+            $uris[] = $row['uri'];
+        }
+    }
+
+    $update_data = [
+        'uris' => $uris,
+    ];
+
+    echo '<br /> update_data <br />';
+
+    $update_opts = [
+        'http' => [
+            'method' => 'POST',
+            'ignore_errors' => true,
+            'header' => 'Authorization: Bearer ' . $spot_token . "\r\n"
+                . 'Content-Type: application/json \r\n'
+                . 'Accept: application/json \r\n',
+            'content' => json_encode($update_data)
+        ]
+    ];
+
+    $update_context = stream_context_create($update_opts);
+    $update_url = BASE_URL . 'playlists/' . $playlistID . '/tracks';
+    echo '<br />' . $update_url;
+    echo '<br />';
+    echo '<br />' . count($uris);
+    echo '<br />';
+    print_r(json_encode($update_data));
+    $update_req = file_get_contents($update_url, false, $update_context);
+    var_dump($update_req);
+
index 6ff4b85..07e1de5 100644 (file)
@@ -1,6 +1,7 @@
 <?php
-    require 'secrets.php';
-    $scopes = 'playlist-modify-private playlist-modify-public';
-    $url = 'https://accounts.spotify.com/en/authorize?response_type=code&client_id=93a6f9c0375c45d4b348157691aa24e8&scope=' . urlencode($scopes) . '&redirect_uri=' . urlencode(REDIRECT_URI) . '&state=' . $_GET['state'];
-    header('Location: ' .$url);
-    exit();
+require 'secrets.php';
+$scopes = 'playlist-modify-private playlist-modify-public';
+$url = 'https://accounts.spotify.com/en/authorize?response_type=code&client_id=93a6f9c0375c45d4b348157691aa24e8&scope=' . urlencode($scopes) . '&redirect_uri=' . urlencode(REDIRECT_URI) . '&state=' . $_GET['state'];
+header('Location: ' .$url);
+exit();
+
index f7d56de..e4a14c4 100644 (file)
@@ -1,76 +1,61 @@
 <?php
 
-    require 'mpfuncs.php';
-    
-    const SQLITE_DATE_FORM = 'Y-m-d H:i:s';
-    
-    $pdo = new PDO("sqlite:mktplc.sqlite3");
-        
-    $genDate = DateTime::createFromFormat(DATE_FORM, '1/1/2017');
-    
-    $page = 1;
-    
-    $query = $pdo->query('SELECT date FROM songs order by date desc limit 1');
-    $resultset = $query->fetch();
+require 'mpfuncs.php';
 
-    $lastEpDT = DateTime::createFromFormat(SQLITE_DATE_FORM, $resultset['date']);
-    $startDate = new DateTime;
-    $episodeDatePages = [];
-    $episodeTrackPages = [];
-    
-    while ($startDate > $lastEpDT) {
-      // DOM garbles UTF-8 chars, so loading them to HTML-ENTITIES data fixes this
-      $html = mb_convert_encoding(file_get_contents('https://www.marketplace.org/latest-music?page=' . $page), 'HTML-ENTITIES', "UTF-8");
-      $DOM = new DOMDocument;
-      $DOM->loadHTML($html);
-      $headers = $DOM->getElementsByTagName('h2');
-      $divs = $DOM->getElementsByTagName('div');
-      
-      $episodeDatePages[] = parseEpisodeDate($headers, $lastEpDT);
-      $episodeTrackPages[] = parseEpisodePage($divs);
-      $startDate = end($episodeDatePages[$page - 1]);
-      $page++;
-    }
-    
-    //print_r($episodeDatePages);
+set_time_limit(0);
 
-    
-    //Unroll episodeDatePages
-    $episodeDates = [];
-    foreach ($episodeDatePages as $episodeDatePage) {
-      foreach ($episodeDatePage as $episodeDate) {
-        $episodeDates[] = $episodeDate;
-      }
-    }
-    
-    
-    // Unroll episodeTrackPages
-    $episodeTrackLists = [];
-    foreach ($episodeTrackPages as $epTrackPage) {
-      foreach ($epTrackPage as $epTrackList) {
-        $episodeTrackLists[] = $epTrackList;
-      }
+const SQLITE_DATE_FORM = 'Y-m-d H:i:s';
+
+$pdo = new PDO("sqlite:mktplc.sqlite3");
+
+$genDate = DateTime::createFromFormat(DATE_FORM, '1/1/2017');
+
+$page = 1;
+
+$query = $pdo->query('SELECT date FROM songs order by date desc limit 1');
+$resultset = $query->fetch();
+
+$lastEpDT = DateTime::createFromFormat(SQLITE_DATE_FORM, $resultset['date']);
+$startDate = new DateTime;
+$episodeDatePages = [];
+$episodeTrackPages = [];
+
+$episodes = [];
+while ($startDate > $lastEpDT) {
+    // DOM garbles UTF-8 chars, so loading them to HTML-ENTITIES data fixes this
+    $html = mb_convert_encoding(file_get_contents('https://www.marketplace.org/latest-music/marketplace/page/' . $page), 'HTML-ENTITIES', "UTF-8");
+    $DOM = new DOMDocument;
+    $DOM->loadHTML($html);
+    $xpath = new DOMXPath($DOM);
+    $episodeData = $xpath->evaluate("//div[contains(@class, 'mp-music-card')]");
+    foreach($episodeData as $episode) {
+        $children = iterator_to_array($episode->childNodes);
+        $episodeHeadCard = array_pop(findChildWithClass($children, 'mp-music-card-episode'));
+        $episodeMeta = array_pop(findChildWithClass($episodeHeadCard->childNodes, 'mp-music-card-meta'));
+        $episodeDate = array_pop(findChildWithClass($episodeMeta->childNodes, 'mp-music-card-meta_pubdate'))->textContent;
+        if (!isset($episodeDate)) { continue; }
+        $trackDiv = array_pop(findChildWithClass($children, 'mp-music-card-tracks'));
+        $trackItems = findChildWithClass($trackDiv->childNodes, 'flex w-full flex-wrap item');
+        $trackIDs = [];
+        foreach($trackItems as $trackItem) {
+            $divs = findChildWithClass($trackItem->childNodes, 'w-full min-tablet:w-1/2');
+            foreach ($divs as $div) {
+                $trackIDs[] = array_pop(explode('/', array_pop(findChildWithClass($div->childNodes, 'song-title'))->attributes->getNamedItem('href')->value));
+            }
+        }
+        $episodes[$episodeDate] = $trackIDs;
     }
-    
-    $episodes = array_slice(
-                  array_map(
-                    null, $episodeDates, $episodeTrackLists), 0, min(
-                      count($episodeDates), count($episodeTrackLists)
-                    )
-                );
-    print_r($episodes);
-    
-    $stmt = $pdo->prepare("INSERT INTO songs (track, artist, date) VALUES (:track, :artist, :date)");
-    $stmt->bindParam(':track', $trackName);
-    $stmt->bindParam(':artist', $artist);
-    $stmt->bindParam(':date', $date);
-    foreach(array_reverse($episodes) as $episode) {
-      $date = $episode[0]->format(SQLITE_DATE_FORM);
-      foreach ($episode[1] as $track) {
-        $trackName = $track['title'];
-        $artist = $track['artist'];
+    $startDate = new DateTime(end(array_keys($episodes)));
+    $page++;
+}
+
+$stmt = $pdo->prepare("INSERT INTO songs (date, uri) VALUES (:date, :uri)");
+$stmt->bindParam(':date', $date);
+$stmt->bindParam(':uri', $uri);
+foreach(array_reverse($episodes) as $airDate => $trackIDs) {
+    $date = (new DateTime($airDate))->format(SQLITE_DATE_FORM);
+    foreach ($trackIDs as $trackID) {
+        $uri = "spotify:track:{$trackID}";
         $stmt->execute();
-      }
     }
-    
-    
\ No newline at end of file
+}
index 870acaf..d5be144 100644 (file)
@@ -1,48 +1,16 @@
-<?php\r
-\r
-    const DATE_FORM = 'mdY';\r
-\r
-    \r
-    function parseEpisodePage(DomNodeList $divs): array {\r
-        $episodePage = [];\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
-                $episodePage[] = $songs;\r
-            }\r
-            \r
-        }\r
-        \r
-        return $episodePage;\r
-        \r
-    }\r
-    \r
-    /**\r
-     * Go through the DOM elements provided and pull out the Dates of all marketplace\r
-     * pod episodes in the provided list.\r
-     * \r
-     * @param DomNodeList $headers The elements with a header tag from the DOM\r
-     * @param DateTime $lastDate The date of the most recent episode from the DB\r
-     */\r
-    function parseEpisodeDate(DomNodeList $headers, DateTime $lastDate): array {\r
-      $episodeDates = [];\r
-      foreach ($headers as $header) {\r
-        if ($header->hasAttribute('class') && $header->getAttribute('class') === 'river--hed') {\r
-          $episodeAnchorHref = $header->firstChild->getAttribute('href');\r
-          $dateString = explode('/', $episodeAnchorHref)[3];\r
-          $episodeDate = DateTime::createFromFormat(DATE_FORM, $dateString);\r
-          if ($episodeDate < $lastDate) {\r
-            break;\r
-          }\r
-          $episodeDates[] = $episodeDate;\r
-        }\r
-      }\r
-      return $episodeDates;\r
-    }\r
+<?php
+
+const DATE_FORM = 'mdY';
+
+function findChildWithClass(/** iterable */ $children, string $class)/**: array*/ {
+    if ($children instanceof Traversable) {
+        $children = iterator_to_array($children);
+    }
+    return array_filter(
+        $children,
+        function($child) use ($class) {
+            return $child->hasAttributes()
+                && $child->attributes->getNamedItem('class')->value == $class;
+        }
+    );
+}
index 949abf9..a6391c0 100644 (file)
@@ -1,48 +1,45 @@
 <?php
 
-    const BASE_URL = 'https://api.spotify.com/v1/';
-    // Currently updated manually whenever I get one from the server
-    const SPOT_TOKEN = 'BQBU1Qs3ROpkN9CwlQNpZS00khdSU61zuejyKbjS4KiIszK8aiLaTd9TfPiSH0OsmtWStOVL7ym-QYEBWyLX3qlFIN5peit0n6_B-LLtz4C8KSh3Dxj5O3jf4HSWf3fFISC4cLbznfSV3QnpQ4vdnCTehz4vT8V54XDiG2hX275Uw_gDHzKjqFWQo249-rY42rBv7pf555wQ2PSBymuZMcDlIDEeAbGiyRI';
-  
-    $pdo = new PDO("sqlite:mktplc.sqlite3");
-    
-    $stmt = $pdo->prepare("SELECT * FROM SONGS WHERE uri IS NULL");
-    $upstmt = $pdo->prepare("UPDATE songs SET (uri) = :uri WHERE id = :id");
-    $upstmt->bindParam(':uri', $uri);
-    $upstmt->bindParam(':id', $id);
-    
-    if ($stmt->execute()) {
-      
-      #print_r($stmt->fetchAll());
-      while ($row = $stmt->fetch()) {
-        
+const BASE_URL = 'https://api.spotify.com/v1/';
+// Currently updated manually whenever I get one from the server
+const SPOT_TOKEN = 'BQBU1Qs3ROpkN9CwlQNpZS00khdSU61zuejyKbjS4KiIszK8aiLaTd9TfPiSH0OsmtWStOVL7ym-QYEBWyLX3qlFIN5peit0n6_B-LLtz4C8KSh3Dxj5O3jf4HSWf3fFISC4cLbznfSV3QnpQ4vdnCTehz4vT8V54XDiG2hX275Uw_gDHzKjqFWQo249-rY42rBv7pf555wQ2PSBymuZMcDlIDEeAbGiyRI';
+
+$pdo = new PDO("sqlite:mktplc.sqlite3");
+
+$stmt = $pdo->prepare("SELECT * FROM SONGS WHERE uri IS NULL");
+$upstmt = $pdo->prepare("UPDATE songs SET (uri) = :uri WHERE id = :id");
+$upstmt->bindParam(':uri', $uri);
+$upstmt->bindParam(':id', $id);
+
+if ($stmt->execute()) {
+    while ($row = $stmt->fetch()) {
+
         $track_opts = [
             'http' => [
                 'method' => 'GET',
-                'header' => 'Authorization: Bearer ' . SPOT_TOKEN . "\r\n"
+            'header' => 'Authorization: Bearer ' . SPOT_TOKEN . "\r\n"
             ]
         ];
-        
+
         $track_context = stream_context_create($track_opts);
-        
+
         $track_search_url = BASE_URL . 'search?q=track:' . urlencode($row['track']) 
-                            . '+artist:' . urlencode($row['artist']) . '&type=track';
+            . '+artist:' . urlencode($row['artist']) . '&type=track';
 
         $trackReq = file_get_contents($track_search_url, false, $track_context);
         if ($trackReq) {
-          $trackJSON = json_decode($trackReq, true);
-          $trackJSON = $trackJSON['tracks'];
-          if ($trackJSON['total'] === 0) {
-            continue;
-          }
+            $trackJSON = json_decode($trackReq, true);
+            $trackJSON = $trackJSON['tracks'];
+            if ($trackJSON['total'] === 0) {
+                continue;
+            }
 
-          $uri = $trackJSON['items'][0]['uri'];
-          $id = $row['id'];
-          $upstmt->execute();
-
-          #rate limit
-          sleep(1);
+            $uri = $trackJSON['items'][0]['uri'];
+            $id = $row['id'];
+            $upstmt->execute();
 
+            sleep(1);
         }
-      }
-    }
\ No newline at end of file
+    }
+}
+