{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import sys\n",
    "sys.path.insert(0, '/Users/joel/src/thundr/tracker')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import prettytable"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from datetime import datetime\n",
    "from dateutil import parser\n",
    "import gspread\n",
    "from oauth2client.service_account import ServiceAccountCredentials\n",
    "\n",
    "from tracker import config\n",
    "\n",
    "\n",
    "scope = ['https://spreadsheets.google.com/feeds']\n",
    "\n",
    "credentials = ServiceAccountCredentials.from_json_keyfile_dict(\n",
    "    config.google_auth_dict,\n",
    "    scopes=scope\n",
    ")\n",
    "\n",
    "client = gspread.authorize(credentials)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "s = client.get_spreadsheets_feed()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "de = client.open('Data Exports')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from tracker import db"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Creating session....\n"
     ]
    }
   ],
   "source": [
    "db.setup_session()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "db.Session.rollback()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Engine(postgres://bot:***@whitelist.cbn1zk7uet6r.eu-west-1.rds.amazonaws.com:5432/whitelist)"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "db.Session.get_bind()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def array_to_sheet(arr, sheet, start_row=0, start_col=0):\n",
    "    mapping = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'\n",
    "    range_str = '{start_col}{start_row}:{end_col}{end_row}'.format(\n",
    "        start_col=mapping[start_col],\n",
    "        start_row=1,\n",
    "        end_col=mapping[len(arr[0])+start_col-1],\n",
    "        end_row=len(arr)\n",
    "    )\n",
    "    # Select a range\n",
    "    cell_list = sheet.range(range_str)\n",
    "    \n",
    "    cell_stack = list(reversed(cell_list))\n",
    "    \n",
    "    for row in arr:\n",
    "        for field in row:\n",
    "            cell = cell_stack.pop()\n",
    "            cell.value = field\n",
    "\n",
    "    # Update in batch\n",
    "    sheet.update_cells(cell_list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def query_to_sheet(query, sheet, params=None, start_col=0):\n",
    "    result_proxy = db.Session.execute(query, params)\n",
    "    names = [a.name for a in result_proxy.cursor.description]\n",
    "    \n",
    "    arr = [names] + result_proxy.fetchall()\n",
    "    \n",
    "    array_to_sheet(arr, sheet, start_col=start_col)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def pretty_query(sql, params=None):\n",
    "    result_proxy = db.Session.execute(sql, params)\n",
    "    print(prettytable.from_db_cursor(result_proxy.cursor))\n",
    "            "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "sql1 = '''\n",
    "WITH \n",
    "\n",
    "days as (\n",
    "  select generate_series(current_date-30, current_date, '1 day') as d\n",
    "),\n",
    "\n",
    "pops as (\n",
    "  select as_of::date d, count(*) c\n",
    "  from spy_track_popularity\n",
    "  group by 1\n",
    "),\n",
    "tracks as (\n",
    "  select first_seen::date d, count(*) c\n",
    "  from spy_tracks \n",
    "  group by 1\n",
    "),\n",
    "\n",
    "follows as (\n",
    "  select seen_at::date d, count(*) as f from sc_followings group by 1\n",
    "),\n",
    "\n",
    "likes as (\n",
    "  select seen_at::date d, count(*) f from sc_likes group by 1\n",
    ")\n",
    "\n",
    "\n",
    "select \n",
    "  days.d::date,\n",
    "  pops.c spy_popularities, \n",
    "  tracks.c spy_new_tracks,\n",
    "  follows.f sc_new_follows,\n",
    "  likes.f sc_new_likes\n",
    "from days\n",
    "left join pops using(d) \n",
    "left join tracks using(d)\n",
    "left join likes using(d)\n",
    "left join follows using(d)\n",
    "\n",
    "order by days.d desc\n",
    "\n",
    "limit 15\n",
    "'''\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "+------------+------------------+----------------+----------------+--------------+\n",
      "|     d      | spy_popularities | spy_new_tracks | sc_new_follows | sc_new_likes |\n",
      "+------------+------------------+----------------+----------------+--------------+\n",
      "| 2017-09-21 |       None       |      None      |      409       |     613      |\n",
      "| 2017-09-20 |       None       |      None      |      None      |     None     |\n",
      "| 2017-09-19 |       None       |      None      |      None      |     None     |\n",
      "| 2017-09-18 |       None       |      None      |      None      |     None     |\n",
      "| 2017-09-17 |       1898       |       29       |       34       |      57      |\n",
      "| 2017-09-16 |       1893       |      372       |       64       |     144      |\n",
      "| 2017-09-15 |       1904       |       96       |       76       |     154      |\n",
      "| 2017-09-14 |       1912       |       4        |      115       |     153      |\n",
      "| 2017-09-13 |       1913       |       33       |       87       |     143      |\n",
      "| 2017-09-12 |       1903       |       7        |      111       |     191      |\n",
      "| 2017-09-11 |       1903       |       5        |       41       |      72      |\n",
      "| 2017-09-10 |       1901       |       19       |       53       |      86      |\n",
      "| 2017-09-09 |       1910       |      418       |       70       |     173      |\n",
      "| 2017-09-08 |       1966       |       81       |      119       |     157      |\n",
      "| 2017-09-07 |       1932       |       7        |      110       |     162      |\n",
      "| 2017-09-06 |       1939       |      331       |       95       |     171      |\n",
      "| 2017-09-05 |       1935       |       14       |       69       |     100      |\n",
      "| 2017-09-04 |       1935       |       5        |       67       |      98      |\n",
      "| 2017-09-03 |       1939       |       22       |       47       |      88      |\n",
      "| 2017-09-02 |       1947       |      117       |       73       |     129      |\n",
      "| 2017-09-01 |       1933       |       48       |       97       |     150      |\n",
      "| 2017-08-31 |       1913       |       11       |      146       |     198      |\n",
      "| 2017-08-30 |       1911       |       56       |       83       |     135      |\n",
      "| 2017-08-29 |       1905       |       15       |       60       |      83      |\n",
      "| 2017-08-28 |       1907       |      None      |       36       |      75      |\n",
      "| 2017-08-27 |       1907       |       1        |       46       |      87      |\n",
      "| 2017-08-26 |       1907       |      393       |       63       |     119      |\n",
      "| 2017-08-25 |       1942       |       59       |       89       |     260      |\n",
      "| 2017-08-24 |       1918       |       6        |       92       |     152      |\n",
      "| 2017-08-23 |       1916       |       58       |       66       |     158      |\n",
      "+------------+------------------+----------------+----------------+--------------+\n"
     ]
    }
   ],
   "source": [
    "db.Session.rollback()\n",
    "pretty_query(sql1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [],
   "source": [
    "import requests\n",
    "from tracker import config\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Creating session....\n"
     ]
    }
   ],
   "source": [
    "from importlib import reload\n",
    "reload(config)\n",
    "reload(db)\n",
    "db.setup_session()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "checks = db.Session.execute(sql1).fetchall()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'2017-09-21: None/None/409/613'"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "headline = \"{0}: {1}/{2}/{3}/{4}\".format(*checks[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_pretty_query(sql, params=None):\n",
    "    result_proxy = db.Session.execute(sql, params)\n",
    "    return prettytable.from_db_cursor(result_proxy.cursor)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "def send_simple_message(txt, subject):\n",
    "    return requests.post(\n",
    "        \"https://api.mailgun.net/v3/\" + config.mailgun_domain + \"/messages\",\n",
    "        auth=(\"api\", config.mailgun_api_key),\n",
    "        data={\"from\": \"Excited User <mailgun@config.mailgun_domain>\",\n",
    "              \"to\": [\"ops@whtlst.in\"],\n",
    "              \"subject\": subject,\n",
    "              \"text\": txt})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "a = send_simple_message(txt=get_pretty_query(sql1), subject='Daily Stats')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'{\\n  \"id\": \"<20170921121645.96121.9EA32FD721491206@sandbox7ec09df3f68d4e1ba387b8fbeb1e9592.mailgun.org>\",\\n  \"message\": \"Queued. Thank you.\"\\n}'"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a.text"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'https://api.mailgun.net/v3/sandbox7ec09df3f68d4e1ba387b8fbeb1e9592.mailgun.org/messages'"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "config.mailgun_base_url + \"/messages\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Creating session....\n"
     ]
    }
   ],
   "source": [
    "from tracker import db\n",
    "db.setup_session()\n",
    "\n",
    "qry = '''\n",
    "WITH \n",
    "\n",
    "days as (\n",
    "  select generate_series(current_date-30, current_date, '1 day') as d\n",
    "),\n",
    "\n",
    "pops as (\n",
    "  select as_of::date d, count(*) c\n",
    "  from spy_track_popularity\n",
    "  group by 1\n",
    "),\n",
    "tracks as (\n",
    "  select first_seen::date d, count(*) c\n",
    "  from spy_tracks \n",
    "  group by 1\n",
    "),\n",
    "\n",
    "follows as (\n",
    "  select seen_at::date d, count(*) as f from sc_followings group by 1\n",
    "),\n",
    "\n",
    "likes as (\n",
    "  select seen_at::date d, count(*) f from sc_likes group by 1\n",
    ")\n",
    "\n",
    "\n",
    "select \n",
    "  days.d::date,\n",
    "  pops.c spy_popularities, \n",
    "  tracks.c spy_new_tracks,\n",
    "  follows.f sc_new_follows,\n",
    "  likes.f sc_new_likes\n",
    "from days\n",
    "left join pops using(d) \n",
    "left join tracks using(d)\n",
    "left join likes using(d)\n",
    "left join follows using(d)\n",
    "\n",
    "order by days.d desc\n",
    "\n",
    "limit 15\n",
    "\n",
    "'''\n",
    "\n",
    "headline = \"{0}: {1}/{2}/{3}/{4}\".format(*db.Session.execute(qry).fetchone())\n",
    "\n",
    "\n",
    "\n",
    "table = db.get_pretty_query(qry)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from IPython.core.display import display, HTML\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<table><thead><tr><th>d</th><th>spy_popularities</th><th>spy_new_tracks</th><th>sc_new_follows</th><th>sc_new_likes</th></tr></thead><tbody><tr><td>2017-09-21</td><td>None</td><td>None</td><td>409</td><td>613</td></tr><tr><td>2017-09-20</td><td>None</td><td>None</td><td>None</td><td>None</td></tr><tr><td>2017-09-19</td><td>None</td><td>None</td><td>None</td><td>None</td></tr><tr><td>2017-09-18</td><td>None</td><td>None</td><td>None</td><td>None</td></tr><tr><td>2017-09-17</td><td>1898</td><td>29</td><td>34</td><td>57</td></tr><tr><td>2017-09-16</td><td>1893</td><td>372</td><td>64</td><td>144</td></tr><tr><td>2017-09-15</td><td>1904</td><td>96</td><td>76</td><td>154</td></tr><tr><td>2017-09-14</td><td>1912</td><td>4</td><td>115</td><td>153</td></tr><tr><td>2017-09-13</td><td>1913</td><td>33</td><td>87</td><td>143</td></tr><tr><td>2017-09-12</td><td>1903</td><td>7</td><td>111</td><td>191</td></tr><tr><td>2017-09-11</td><td>1903</td><td>5</td><td>41</td><td>72</td></tr><tr><td>2017-09-10</td><td>1901</td><td>19</td><td>53</td><td>86</td></tr><tr><td>2017-09-09</td><td>1910</td><td>418</td><td>70</td><td>173</td></tr><tr><td>2017-09-08</td><td>1966</td><td>81</td><td>119</td><td>157</td></tr><tr><td>2017-09-07</td><td>1932</td><td>7</td><td>110</td><td>162</td></tr></tbody></table>\n"
     ]
    }
   ],
   "source": [
    "print (db.html_table_query(qry))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table><thead><tr><th>d</th><th>spy_popularities</th><th>spy_new_tracks</th><th>sc_new_follows</th><th>sc_new_likes</th></tr></thead><tbody><tr><td>2017-09-21</td><td>None</td><td>None</td><td>409</td><td>613</td></tr><tr><td>2017-09-20</td><td>None</td><td>None</td><td>None</td><td>None</td></tr><tr><td>2017-09-19</td><td>None</td><td>None</td><td>None</td><td>None</td></tr><tr><td>2017-09-18</td><td>None</td><td>None</td><td>None</td><td>None</td></tr><tr><td>2017-09-17</td><td>1898</td><td>29</td><td>34</td><td>57</td></tr><tr><td>2017-09-16</td><td>1893</td><td>372</td><td>64</td><td>144</td></tr><tr><td>2017-09-15</td><td>1904</td><td>96</td><td>76</td><td>154</td></tr><tr><td>2017-09-14</td><td>1912</td><td>4</td><td>115</td><td>153</td></tr><tr><td>2017-09-13</td><td>1913</td><td>33</td><td>87</td><td>143</td></tr><tr><td>2017-09-12</td><td>1903</td><td>7</td><td>111</td><td>191</td></tr><tr><td>2017-09-11</td><td>1903</td><td>5</td><td>41</td><td>72</td></tr><tr><td>2017-09-10</td><td>1901</td><td>19</td><td>53</td><td>86</td></tr><tr><td>2017-09-09</td><td>1910</td><td>418</td><td>70</td><td>173</td></tr><tr><td>2017-09-08</td><td>1966</td><td>81</td><td>119</td><td>157</td></tr><tr><td>2017-09-07</td><td>1932</td><td>7</td><td>110</td><td>162</td></tr></tbody></table>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "display(HTML(db.html_table_query(qry)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Alice Merton"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from datetime import *"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "twelve_hours_ago = datetime.today() - timedelta(hours=12)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [],
   "source": [
    "    schem = db.Session.query(db.SpyTrack).filter(db.SpyTrack.last_updated < twelve_hours_ago).order_by(db.SpyTrack.first_seen.desc()).limit(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[<SpyTrack {'spyid': '3FNY26zMg3Zfe5Cbyu45uu', 'name': 'Moonlight', 'primary_artist_spyid': '3YdT8QvV4QvY4DfVJhxdcZ', 'first_seen': datetime.datetime(2017, 6, 23, 3, 0, 43, 823651), 'added_source': None, 'last_updated': datetime.datetime(2017, 7, 10, 3, 0, 48, 625809), 'data': {'id': '3FNY26zMg3Zfe5Cbyu45uu', 'uri': 'spotify:track:3FNY26zMg3Zfe5Cbyu45uu', 'href': 'https://api.spotify.com/v1/tracks/3FNY26zMg3Zfe5Cbyu45uu', 'name': 'Moonlight', 'type': 'track', 'album': {'id': '6gtwPXS2bQpJsEPF79s1hA', 'uri': 'spotify:album:6gtwPXS2bQpJsEPF79s1hA', 'href': 'https://api.spotify.com/v1/albums/6gtwPXS2bQpJsEPF79s1hA', 'name': 'Moonlight', 'type': 'album', 'images': [{'url': 'https://i.scdn.co/image/b5a84ffd5cfb5996b0931d9b27da557e3acbbcb7', 'width': 640, 'height': 640}, {'url': 'https://i.scdn.co/image/4adbdbd6607a1c8ff7630dc05e65a1796af769d3', 'width': 300, 'height': 300}, {'url': 'https://i.scdn.co/image/464aec2c18761e808ddad4b723d3fc2998131db9', 'width': 64, 'height': 64}], 'artists': [{'id': '3YdT8QvV4QvY4DfVJhxdcZ', 'uri': 'spotify:artist:3YdT8QvV4QvY4DfVJhxdcZ', 'href': 'https://api.spotify.com/v1/artists/3YdT8QvV4QvY4DfVJhxdcZ', 'name': 'Grace VanderWaal', 'type': 'artist', 'external_urls': {'spotify': 'https://open.spotify.com/artist/3YdT8QvV4QvY4DfVJhxdcZ'}}], 'album_type': 'single', 'external_urls': {'spotify': 'https://open.spotify.com/album/6gtwPXS2bQpJsEPF79s1hA'}, 'available_markets': ['AD', 'AR', 'AT', 'AU', 'BE', 'BG', 'BO', 'BR', 'CA', 'CH', 'CL', 'CO', 'CR', 'CY', 'CZ', 'DE', 'DK', 'DO', 'EC', 'EE', 'ES', 'FI', 'FR', 'GB', 'GR', 'GT', 'HK', 'HN', 'HU', 'ID', 'IE', 'IS', 'IT', 'JP', 'LI', 'LT', 'LU', 'LV', 'MC', 'MT', 'MX', 'MY', 'NI', 'NL', 'NO', 'NZ', 'PA', 'PE', 'PH', 'PL', 'PT', 'PY', 'SE', 'SG', 'SK', 'SV', 'TR', 'TW', 'US', 'UY']}, 'artists': [{'id': '3YdT8QvV4QvY4DfVJhxdcZ', 'uri': 'spotify:artist:3YdT8QvV4QvY4DfVJhxdcZ', 'href': 'https://api.spotify.com/v1/artists/3YdT8QvV4QvY4DfVJhxdcZ', 'name': 'Grace VanderWaal', 'type': 'artist', 'external_urls': {'spotify': 'https://open.spotify.com/artist/3YdT8QvV4QvY4DfVJhxdcZ'}}], 'explicit': False, 'popularity': 69, 'disc_number': 1, 'duration_ms': 174106, 'preview_url': 'https://p.scdn.co/mp3-preview/58fcad4dddb81b1dd698914f233ae553b18bc1b1?cid=bccd52f359b0474abd1a0aee7454f037', 'external_ids': {'isrc': 'USSM11704983'}, 'track_number': 1, 'external_urls': {'spotify': 'https://open.spotify.com/track/3FNY26zMg3Zfe5Cbyu45uu'}, 'available_markets': ['AD', 'AR', 'AT', 'AU', 'BE', 'BG', 'BO', 'BR', 'CA', 'CH', 'CL', 'CO', 'CR', 'CY', 'CZ', 'DE', 'DK', 'DO', 'EC', 'EE', 'ES', 'FI', 'FR', 'GB', 'GR', 'GT', 'HK', 'HN', 'HU', 'ID', 'IE', 'IS', 'IT', 'JP', 'LI', 'LT', 'LU', 'LV', 'MC', 'MT', 'MX', 'MY', 'NI', 'NL', 'NO', 'NZ', 'PA', 'PE', 'PH', 'PL', 'PT', 'PY', 'SE', 'SG', 'SK', 'SV', 'TR', 'TW', 'US', 'UY']}, 'tags': [], 'album_data': None}>, <SpyTrack {'spyid': '70YUqQra3DbOePmwPqHqCU', 'name': \"Don't Wanna Fight\", 'primary_artist_spyid': '3rUqgY188kWz0hKkqnpk9F', 'first_seen': datetime.datetime(2017, 6, 23, 3, 0, 43, 795694), 'added_source': None, 'last_updated': datetime.datetime(2017, 6, 29, 3, 0, 26, 916449), 'data': {'id': '70YUqQra3DbOePmwPqHqCU', 'uri': 'spotify:track:70YUqQra3DbOePmwPqHqCU', 'href': 'https://api.spotify.com/v1/tracks/70YUqQra3DbOePmwPqHqCU', 'name': \"Don't Wanna Fight\", 'type': 'track', 'album': {'id': '5qXoZgdWyn6H3mpeElJt34', 'uri': 'spotify:album:5qXoZgdWyn6H3mpeElJt34', 'href': 'https://api.spotify.com/v1/albums/5qXoZgdWyn6H3mpeElJt34', 'name': \"Don't Wanna Fight\", 'type': 'album', 'images': [{'url': 'https://i.scdn.co/image/6480fdbaea4050a6b525ab572d2cb4d8514d498e', 'width': 640, 'height': 640}, {'url': 'https://i.scdn.co/image/ef657ae7b0ba0db8e47931aee8e92621109693f5', 'width': 300, 'height': 300}, {'url': 'https://i.scdn.co/image/4e936329ef6cc72e8258fb2cbbf477d5a177db76', 'width': 64, 'height': 64}], 'artists': [{'id': '3rUqgY188kWz0hKkqnpk9F', 'uri': 'spotify:artist:3rUqgY188kWz0hKkqnpk9F', 'href': 'https://api.spotify.com/v1/artists/3rUqgY188kWz0hKkqnpk9F', 'name': 'Richard Walters', 'type': 'artist', 'external_urls': {'spotify': 'https://open.spotify.com/artist/3rUqgY188kWz0hKkqnpk9F'}}], 'album_type': 'single', 'external_urls': {'spotify': 'https://open.spotify.com/album/5qXoZgdWyn6H3mpeElJt34'}, 'available_markets': ['AD', 'AR', 'AT', 'AU', 'BE', 'BG', 'BO', 'BR', 'CA', 'CH', 'CL', 'CO', 'CR', 'CY', 'CZ', 'DE', 'DK', 'DO', 'EC', 'EE', 'ES', 'FI', 'FR', 'GB', 'GR', 'GT', 'HK', 'HN', 'HU', 'ID', 'IE', 'IS', 'IT', 'JP', 'LI', 'LT', 'LU', 'LV', 'MC', 'MT', 'MX', 'MY', 'NI', 'NL', 'NO', 'NZ', 'PA', 'PE', 'PH', 'PL', 'PT', 'PY', 'SE', 'SG', 'SK', 'SV', 'TR', 'TW', 'US', 'UY']}, 'artists': [{'id': '3rUqgY188kWz0hKkqnpk9F', 'uri': 'spotify:artist:3rUqgY188kWz0hKkqnpk9F', 'href': 'https://api.spotify.com/v1/artists/3rUqgY188kWz0hKkqnpk9F', 'name': 'Richard Walters', 'type': 'artist', 'external_urls': {'spotify': 'https://open.spotify.com/artist/3rUqgY188kWz0hKkqnpk9F'}}], 'explicit': False, 'popularity': 34, 'disc_number': 1, 'duration_ms': 191124, 'preview_url': 'https://p.scdn.co/mp3-preview/dcf02c83b188229267c6d5b3f9449016833d93df?cid=bccd52f359b0474abd1a0aee7454f037', 'external_ids': {'isrc': 'QM2PV1795052'}, 'track_number': 1, 'external_urls': {'spotify': 'https://open.spotify.com/track/70YUqQra3DbOePmwPqHqCU'}, 'available_markets': ['AD', 'AR', 'AT', 'AU', 'BE', 'BG', 'BO', 'BR', 'CA', 'CH', 'CL', 'CO', 'CR', 'CY', 'CZ', 'DE', 'DK', 'DO', 'EC', 'EE', 'ES', 'FI', 'FR', 'GB', 'GR', 'GT', 'HK', 'HN', 'HU', 'ID', 'IE', 'IS', 'IT', 'JP', 'LI', 'LT', 'LU', 'LV', 'MC', 'MT', 'MX', 'MY', 'NI', 'NL', 'NO', 'NZ', 'PA', 'PE', 'PH', 'PL', 'PT', 'PY', 'SE', 'SG', 'SK', 'SV', 'TR', 'TW', 'US', 'UY']}, 'tags': [], 'album_data': None}>, <SpyTrack {'spyid': '6j1pmQZvF9p7B6DEq2kMsY', 'name': 'Fresh Meat', 'primary_artist_spyid': '6DHkGAqwV3RPeYpkYFdggL', 'first_seen': datetime.datetime(2017, 6, 23, 3, 0, 43, 781930), 'added_source': None, 'last_updated': datetime.datetime(2017, 6, 29, 3, 0, 26, 904269), 'data': {'id': '6j1pmQZvF9p7B6DEq2kMsY', 'uri': 'spotify:track:6j1pmQZvF9p7B6DEq2kMsY', 'href': 'https://api.spotify.com/v1/tracks/6j1pmQZvF9p7B6DEq2kMsY', 'name': 'Fresh Meat', 'type': 'track', 'album': {'id': '3znJejzQ3yXvnEeyr71Dif', 'uri': 'spotify:album:3znJejzQ3yXvnEeyr71Dif', 'href': 'https://api.spotify.com/v1/albums/3znJejzQ3yXvnEeyr71Dif', 'name': 'Fresh Meat', 'type': 'album', 'images': [{'url': 'https://i.scdn.co/image/8f8badcb40a742fcc1ac12dbadaba952b57f9712', 'width': 640, 'height': 640}, {'url': 'https://i.scdn.co/image/992a9152ef1b418f9a81180ba58465a5aed59baa', 'width': 300, 'height': 300}, {'url': 'https://i.scdn.co/image/8b5ead2f92bb78cd84bb8b1b8076b9561eef7538', 'width': 64, 'height': 64}], 'artists': [{'id': '6DHkGAqwV3RPeYpkYFdggL', 'uri': 'spotify:artist:6DHkGAqwV3RPeYpkYFdggL', 'href': 'https://api.spotify.com/v1/artists/6DHkGAqwV3RPeYpkYFdggL', 'name': \"The Van T's\", 'type': 'artist', 'external_urls': {'spotify': 'https://open.spotify.com/artist/6DHkGAqwV3RPeYpkYFdggL'}}], 'album_type': 'single', 'external_urls': {'spotify': 'https://open.spotify.com/album/3znJejzQ3yXvnEeyr71Dif'}, 'available_markets': ['AD', 'AR', 'AT', 'AU', 'BE', 'BG', 'BO', 'BR', 'CA', 'CH', 'CL', 'CO', 'CR', 'CY', 'CZ', 'DE', 'DK', 'DO', 'EC', 'EE', 'ES', 'FI', 'FR', 'GB', 'GR', 'GT', 'HK', 'HN', 'HU', 'ID', 'IE', 'IS', 'IT', 'JP', 'LI', 'LT', 'LU', 'LV', 'MC', 'MT', 'MX', 'MY', 'NI', 'NL', 'NO', 'NZ', 'PA', 'PE', 'PH', 'PL', 'PT', 'PY', 'SE', 'SG', 'SK', 'SV', 'TR', 'TW', 'US', 'UY']}, 'artists': [{'id': '6DHkGAqwV3RPeYpkYFdggL', 'uri': 'spotify:artist:6DHkGAqwV3RPeYpkYFdggL', 'href': 'https://api.spotify.com/v1/artists/6DHkGAqwV3RPeYpkYFdggL', 'name': \"The Van T's\", 'type': 'artist', 'external_urls': {'spotify': 'https://open.spotify.com/artist/6DHkGAqwV3RPeYpkYFdggL'}}], 'explicit': False, 'popularity': 35, 'disc_number': 1, 'duration_ms': 248217, 'preview_url': 'https://p.scdn.co/mp3-preview/4f347a7b4932f7cf0bb6f2c3935de572f423c21a?cid=bccd52f359b0474abd1a0aee7454f037', 'external_ids': {'isrc': 'GB8MX1700050'}, 'track_number': 1, 'external_urls': {'spotify': 'https://open.spotify.com/track/6j1pmQZvF9p7B6DEq2kMsY'}, 'available_markets': ['AD', 'AR', 'AT', 'AU', 'BE', 'BG', 'BO', 'BR', 'CA', 'CH', 'CL', 'CO', 'CR', 'CY', 'CZ', 'DE', 'DK', 'DO', 'EC', 'EE', 'ES', 'FI', 'FR', 'GB', 'GR', 'GT', 'HK', 'HN', 'HU', 'ID', 'IE', 'IS', 'IT', 'JP', 'LI', 'LT', 'LU', 'LV', 'MC', 'MT', 'MX', 'MY', 'NI', 'NL', 'NO', 'NZ', 'PA', 'PE', 'PH', 'PL', 'PT', 'PY', 'SE', 'SG', 'SK', 'SV', 'TR', 'TW', 'US', 'UY']}, 'tags': [], 'album_data': None}>, <SpyTrack {'spyid': '2ozIYpGdTFWOboEuHlYb84', 'name': 'Blindside (Single)', 'primary_artist_spyid': '1ehy59LP8fWmHPHijRrrTw', 'first_seen': datetime.datetime(2017, 6, 23, 3, 0, 43, 767700), 'added_source': None, 'last_updated': datetime.datetime(2017, 7, 9, 3, 0, 34, 280641), 'data': {'id': '2ozIYpGdTFWOboEuHlYb84', 'uri': 'spotify:track:2ozIYpGdTFWOboEuHlYb84', 'href': 'https://api.spotify.com/v1/tracks/2ozIYpGdTFWOboEuHlYb84', 'name': 'Blindside (Single)', 'type': 'track', 'album': {'id': '1U8shp58daqG2JQnvCSwEn', 'uri': 'spotify:album:1U8shp58daqG2JQnvCSwEn', 'href': 'https://api.spotify.com/v1/albums/1U8shp58daqG2JQnvCSwEn', 'name': 'Blindside (Single)', 'type': 'album', 'images': [{'url': 'https://i.scdn.co/image/99584309be7151fd9945f42b7c2dd05e270f2af2', 'width': 640, 'height': 640}, {'url': 'https://i.scdn.co/image/a9a683e439abfd25e0cc23e7a48a29d908041eae', 'width': 300, 'height': 300}, {'url': 'https://i.scdn.co/image/601cd6879d796a25bd8aa405d5e42ab912d95562', 'width': 64, 'height': 64}], 'artists': [{'id': '1ehy59LP8fWmHPHijRrrTw', 'uri': 'spotify:artist:1ehy59LP8fWmHPHijRrrTw', 'href': 'https://api.spotify.com/v1/artists/1ehy59LP8fWmHPHijRrrTw', 'name': 'William.', 'type': 'artist', 'external_urls': {'spotify': 'https://open.spotify.com/artist/1ehy59LP8fWmHPHijRrrTw'}}], 'album_type': 'single', 'external_urls': {'spotify': 'https://open.spotify.com/album/1U8shp58daqG2JQnvCSwEn'}, 'available_markets': ['AD', 'AR', 'AT', 'AU', 'BE', 'BG', 'BO', 'BR', 'CA', 'CH', 'CL', 'CO', 'CR', 'CY', 'CZ', 'DE', 'DK', 'DO', 'EC', 'EE', 'ES', 'FI', 'FR', 'GB', 'GR', 'GT', 'HK', 'HN', 'HU', 'ID', 'IE', 'IS', 'IT', 'JP', 'LI', 'LT', 'LU', 'LV', 'MC', 'MT', 'MX', 'MY', 'NI', 'NL', 'NO', 'NZ', 'PA', 'PE', 'PH', 'PL', 'PT', 'PY', 'SE', 'SG', 'SK', 'SV', 'TR', 'TW', 'US', 'UY']}, 'artists': [{'id': '1ehy59LP8fWmHPHijRrrTw', 'uri': 'spotify:artist:1ehy59LP8fWmHPHijRrrTw', 'href': 'https://api.spotify.com/v1/artists/1ehy59LP8fWmHPHijRrrTw', 'name': 'William.', 'type': 'artist', 'external_urls': {'spotify': 'https://open.spotify.com/artist/1ehy59LP8fWmHPHijRrrTw'}}], 'explicit': False, 'popularity': 51, 'disc_number': 1, 'duration_ms': 241240, 'preview_url': 'https://p.scdn.co/mp3-preview/cb1c3cbff5ac5cb7ea2117d546298114c30714c3?cid=bccd52f359b0474abd1a0aee7454f037', 'external_ids': {'isrc': 'QM2PV1779284'}, 'track_number': 1, 'external_urls': {'spotify': 'https://open.spotify.com/track/2ozIYpGdTFWOboEuHlYb84'}, 'available_markets': ['AD', 'AR', 'AT', 'AU', 'BE', 'BG', 'BO', 'BR', 'CA', 'CH', 'CL', 'CO', 'CR', 'CY', 'CZ', 'DE', 'DK', 'DO', 'EC', 'EE', 'ES', 'FI', 'FR', 'GB', 'GR', 'GT', 'HK', 'HN', 'HU', 'ID', 'IE', 'IS', 'IT', 'JP', 'LI', 'LT', 'LU', 'LV', 'MC', 'MT', 'MX', 'MY', 'NI', 'NL', 'NO', 'NZ', 'PA', 'PE', 'PH', 'PL', 'PT', 'PY', 'SE', 'SG', 'SK', 'SV', 'TR', 'TW', 'US', 'UY']}, 'tags': [], 'album_data': None}>, <SpyTrack {'spyid': '5o2xSQg33t84s2qD8rOQUB', 'name': 'Breathe - Basic Tape Remix', 'primary_artist_spyid': '3AVfmawzu83sp94QW7CEGm', 'first_seen': datetime.datetime(2017, 6, 23, 3, 0, 43, 752959), 'added_source': None, 'last_updated': datetime.datetime(2017, 6, 26, 3, 0, 24, 180156), 'data': {'id': '5o2xSQg33t84s2qD8rOQUB', 'uri': 'spotify:track:5o2xSQg33t84s2qD8rOQUB', 'href': 'https://api.spotify.com/v1/tracks/5o2xSQg33t84s2qD8rOQUB', 'name': 'Breathe - Basic Tape Remix', 'type': 'track', 'album': {'id': '3b1HktFg6EVRfkQGh72cmb', 'uri': 'spotify:album:3b1HktFg6EVRfkQGh72cmb', 'href': 'https://api.spotify.com/v1/albums/3b1HktFg6EVRfkQGh72cmb', 'name': 'Breathe (Remixes)', 'type': 'album', 'images': [{'url': 'https://i.scdn.co/image/f61ac13707dd3aa266142f76646c8adf02298003', 'width': 640, 'height': 640}, {'url': 'https://i.scdn.co/image/d1be8d428ecf4b89da50b533ef688b7c758efd6a', 'width': 300, 'height': 300}, {'url': 'https://i.scdn.co/image/74129dcc62c5264c66cff1da7fd6e5ddf86692a2', 'width': 64, 'height': 64}], 'artists': [{'id': '3AVfmawzu83sp94QW7CEGm', 'uri': 'spotify:artist:3AVfmawzu83sp94QW7CEGm', 'href': 'https://api.spotify.com/v1/artists/3AVfmawzu83sp94QW7CEGm', 'name': 'Astrid S', 'type': 'artist', 'external_urls': {'spotify': 'https://open.spotify.com/artist/3AVfmawzu83sp94QW7CEGm'}}], 'album_type': 'single', 'external_urls': {'spotify': 'https://open.spotify.com/album/3b1HktFg6EVRfkQGh72cmb'}, 'available_markets': []}, 'artists': [{'id': '3AVfmawzu83sp94QW7CEGm', 'uri': 'spotify:artist:3AVfmawzu83sp94QW7CEGm', 'href': 'https://api.spotify.com/v1/artists/3AVfmawzu83sp94QW7CEGm', 'name': 'Astrid S', 'type': 'artist', 'external_urls': {'spotify': 'https://open.spotify.com/artist/3AVfmawzu83sp94QW7CEGm'}}, {'id': '6EzGm3fYBR8QcdIZ0xvHsl', 'uri': 'spotify:artist:6EzGm3fYBR8QcdIZ0xvHsl', 'href': 'https://api.spotify.com/v1/artists/6EzGm3fYBR8QcdIZ0xvHsl', 'name': 'Basic Tape', 'type': 'artist', 'external_urls': {'spotify': 'https://open.spotify.com/artist/6EzGm3fYBR8QcdIZ0xvHsl'}}], 'explicit': False, 'popularity': 39, 'disc_number': 1, 'duration_ms': 211600, 'preview_url': None, 'external_ids': {'isrc': 'NOUM71700177'}, 'track_number': 5, 'external_urls': {'spotify': 'https://open.spotify.com/track/5o2xSQg33t84s2qD8rOQUB'}, 'available_markets': []}, 'tags': [], 'album_data': None}>, <SpyTrack {'spyid': '6IZbED37jDUFdMYg1vOHeZ', 'name': 'LAIDBACK', 'primary_artist_spyid': '2PmIyxmEFsNfQJjEifPDZC', 'first_seen': datetime.datetime(2017, 6, 23, 3, 0, 43, 712469), 'added_source': None, 'last_updated': datetime.datetime(2017, 6, 29, 3, 0, 26, 863415), 'data': {'id': '6IZbED37jDUFdMYg1vOHeZ', 'uri': 'spotify:track:6IZbED37jDUFdMYg1vOHeZ', 'href': 'https://api.spotify.com/v1/tracks/6IZbED37jDUFdMYg1vOHeZ', 'name': 'LAIDBACK', 'type': 'track', 'album': {'id': '3WdVzpv1WfjSygeU1nMeUY', 'uri': 'spotify:album:3WdVzpv1WfjSygeU1nMeUY', 'href': 'https://api.spotify.com/v1/albums/3WdVzpv1WfjSygeU1nMeUY', 'name': 'LAIDBACK', 'type': 'album', 'images': [{'url': 'https://i.scdn.co/image/b2711ce9f619171a8ba7593dda65819611059a45', 'width': 640, 'height': 640}, {'url': 'https://i.scdn.co/image/ecbd34b2a485941d0ea54fe8b482e7d6d28d27a0', 'width': 300, 'height': 300}, {'url': 'https://i.scdn.co/image/ce238b952f8f45cde35ad95fb2a70d60e9740b6c', 'width': 64, 'height': 64}], 'artists': [{'id': '2PmIyxmEFsNfQJjEifPDZC', 'uri': 'spotify:artist:2PmIyxmEFsNfQJjEifPDZC', 'href': 'https://api.spotify.com/v1/artists/2PmIyxmEFsNfQJjEifPDZC', 'name': 'RAT BOY', 'type': 'artist', 'external_urls': {'spotify': 'https://open.spotify.com/artist/2PmIyxmEFsNfQJjEifPDZC'}}], 'album_type': 'single', 'external_urls': {'spotify': 'https://open.spotify.com/album/3WdVzpv1WfjSygeU1nMeUY'}, 'available_markets': ['AU', 'NZ']}, 'artists': [{'id': '2PmIyxmEFsNfQJjEifPDZC', 'uri': 'spotify:artist:2PmIyxmEFsNfQJjEifPDZC', 'href': 'https://api.spotify.com/v1/artists/2PmIyxmEFsNfQJjEifPDZC', 'name': 'RAT BOY', 'type': 'artist', 'external_urls': {'spotify': 'https://open.spotify.com/artist/2PmIyxmEFsNfQJjEifPDZC'}}], 'explicit': False, 'popularity': 30, 'disc_number': 1, 'duration_ms': 213213, 'preview_url': 'https://p.scdn.co/mp3-preview/eba20a23f5fe5e1768c6034957d034fdf38ce631?cid=bccd52f359b0474abd1a0aee7454f037', 'external_ids': {'isrc': 'GBAYE1701327'}, 'track_number': 1, 'external_urls': {'spotify': 'https://open.spotify.com/track/6IZbED37jDUFdMYg1vOHeZ'}, 'available_markets': ['AU', 'NZ']}, 'tags': [], 'album_data': None}>, <SpyTrack {'spyid': '1XMHr0EawozjjXfckb5TB8', 'name': 'Playing With Fire', 'primary_artist_spyid': '34aOTkYOSP2yYdAanKdhbu', 'first_seen': datetime.datetime(2017, 6, 23, 3, 0, 43, 697974), 'added_source': None, 'last_updated': datetime.datetime(2017, 8, 11, 3, 0, 31, 321424), 'data': {'id': '1XMHr0EawozjjXfckb5TB8', 'uri': 'spotify:track:1XMHr0EawozjjXfckb5TB8', 'href': 'https://api.spotify.com/v1/tracks/1XMHr0EawozjjXfckb5TB8', 'name': 'Playing With Fire', 'type': 'track', 'album': {'id': '3GbqzMxP9UG4IQsyMiW8EM', 'uri': 'spotify:album:3GbqzMxP9UG4IQsyMiW8EM', 'href': 'https://api.spotify.com/v1/albums/3GbqzMxP9UG4IQsyMiW8EM', 'name': 'Playing With Fire', 'type': 'album', 'images': [{'url': 'https://i.scdn.co/image/a5eb11a75bde50070c16c85930935b2ca796afd9', 'width': 640, 'height': 640}, {'url': 'https://i.scdn.co/image/60466d822ff9a4970e4714013354c943d3f0914e', 'width': 300, 'height': 300}, {'url': 'https://i.scdn.co/image/14d9d416ff8c4ac1577da5b1ce6502cae2706fde', 'width': 64, 'height': 64}], 'artists': [{'id': '34aOTkYOSP2yYdAanKdhbu', 'uri': 'spotify:artist:34aOTkYOSP2yYdAanKdhbu', 'href': 'https://api.spotify.com/v1/artists/34aOTkYOSP2yYdAanKdhbu', 'name': 'RIVRS', 'type': 'artist', 'external_urls': {'spotify': 'https://open.spotify.com/artist/34aOTkYOSP2yYdAanKdhbu'}}], 'album_type': 'single', 'external_urls': {'spotify': 'https://open.spotify.com/album/3GbqzMxP9UG4IQsyMiW8EM'}, 'available_markets': ['AD', 'AR', 'AT', 'AU', 'BE', 'BG', 'BO', 'BR', 'CA', 'CH', 'CL', 'CO', 'CR', 'CY', 'CZ', 'DE', 'DK', 'DO', 'EC', 'EE', 'ES', 'FI', 'FR', 'GB', 'GR', 'GT', 'HK', 'HN', 'HU', 'ID', 'IE', 'IS', 'IT', 'JP', 'LI', 'LT', 'LU', 'LV', 'MC', 'MT', 'MX', 'MY', 'NI', 'NL', 'NO', 'NZ', 'PA', 'PE', 'PH', 'PL', 'PT', 'PY', 'SE', 'SG', 'SK', 'SV', 'TR', 'TW', 'US', 'UY']}, 'artists': [{'id': '34aOTkYOSP2yYdAanKdhbu', 'uri': 'spotify:artist:34aOTkYOSP2yYdAanKdhbu', 'href': 'https://api.spotify.com/v1/artists/34aOTkYOSP2yYdAanKdhbu', 'name': 'RIVRS', 'type': 'artist', 'external_urls': {'spotify': 'https://open.spotify.com/artist/34aOTkYOSP2yYdAanKdhbu'}}], 'explicit': False, 'popularity': 60, 'disc_number': 1, 'duration_ms': 174659, 'preview_url': 'https://p.scdn.co/mp3-preview/fcbae16050af6acd4007f944c37c0f8ed7d3003c?cid=bccd52f359b0474abd1a0aee7454f037', 'external_ids': {'isrc': 'GBAHS1700538'}, 'track_number': 1, 'external_urls': {'spotify': 'https://open.spotify.com/track/1XMHr0EawozjjXfckb5TB8'}, 'available_markets': ['AD', 'AR', 'AT', 'AU', 'BE', 'BG', 'BO', 'BR', 'CA', 'CH', 'CL', 'CO', 'CR', 'CY', 'CZ', 'DE', 'DK', 'DO', 'EC', 'EE', 'ES', 'FI', 'FR', 'GB', 'GR', 'GT', 'HK', 'HN', 'HU', 'ID', 'IE', 'IS', 'IT', 'JP', 'LI', 'LT', 'LU', 'LV', 'MC', 'MT', 'MX', 'MY', 'NI', 'NL', 'NO', 'NZ', 'PA', 'PE', 'PH', 'PL', 'PT', 'PY', 'SE', 'SG', 'SK', 'SV', 'TR', 'TW', 'US', 'UY']}, 'tags': [], 'album_data': None}>, <SpyTrack {'spyid': '1QMm6lWBJzElwwSqdLulCe', 'name': 'Omnion (feat. Sharon Van Etten) - Radio Edit', 'primary_artist_spyid': '1WHoAjAWGx5qLsgzpaOk7W', 'first_seen': datetime.datetime(2017, 6, 23, 3, 0, 43, 683545), 'added_source': None, 'last_updated': datetime.datetime(2017, 6, 29, 3, 0, 26, 831130), 'data': {'id': '1QMm6lWBJzElwwSqdLulCe', 'uri': 'spotify:track:1QMm6lWBJzElwwSqdLulCe', 'href': 'https://api.spotify.com/v1/tracks/1QMm6lWBJzElwwSqdLulCe', 'name': 'Omnion (feat. Sharon Van Etten) - Radio Edit', 'type': 'track', 'album': {'id': '4FmYmOpGupxnMsr8X6eyQA', 'uri': 'spotify:album:4FmYmOpGupxnMsr8X6eyQA', 'href': 'https://api.spotify.com/v1/albums/4FmYmOpGupxnMsr8X6eyQA', 'name': 'Omnion (feat. Sharon Van Etten) [Radio Edit]', 'type': 'album', 'images': [{'url': 'https://i.scdn.co/image/db4802f5ab9e6c0c84da364d9526b09080859239', 'width': 640, 'height': 640}, {'url': 'https://i.scdn.co/image/67d47a8fa771bb1ce2b9a2887f1fd9a041b0a10c', 'width': 300, 'height': 300}, {'url': 'https://i.scdn.co/image/fe505f45c12ab830bebb8073c043e57927597795', 'width': 64, 'height': 64}], 'artists': [{'id': '1WHoAjAWGx5qLsgzpaOk7W', 'uri': 'spotify:artist:1WHoAjAWGx5qLsgzpaOk7W', 'href': 'https://api.spotify.com/v1/artists/1WHoAjAWGx5qLsgzpaOk7W', 'name': 'Hercules & Love Affair', 'type': 'artist', 'external_urls': {'spotify': 'https://open.spotify.com/artist/1WHoAjAWGx5qLsgzpaOk7W'}}], 'album_type': 'single', 'external_urls': {'spotify': 'https://open.spotify.com/album/4FmYmOpGupxnMsr8X6eyQA'}, 'available_markets': ['AD', 'AR', 'AT', 'AU', 'BE', 'BG', 'BO', 'BR', 'CH', 'CL', 'CO', 'CR', 'CY', 'CZ', 'DE', 'DK', 'DO', 'EC', 'EE', 'ES', 'FI', 'FR', 'GB', 'GR', 'GT', 'HK', 'HN', 'HU', 'ID', 'IE', 'IS', 'IT', 'JP', 'LI', 'LT', 'LU', 'LV', 'MC', 'MT', 'MX', 'MY', 'NI', 'NL', 'NO', 'NZ', 'PA', 'PE', 'PH', 'PL', 'PT', 'PY', 'SE', 'SG', 'SK', 'SV', 'TR', 'TW', 'UY']}, 'artists': [{'id': '1WHoAjAWGx5qLsgzpaOk7W', 'uri': 'spotify:artist:1WHoAjAWGx5qLsgzpaOk7W', 'href': 'https://api.spotify.com/v1/artists/1WHoAjAWGx5qLsgzpaOk7W', 'name': 'Hercules & Love Affair', 'type': 'artist', 'external_urls': {'spotify': 'https://open.spotify.com/artist/1WHoAjAWGx5qLsgzpaOk7W'}}, {'id': '2wJ4vsxWd7df7dRU4KcoDe', 'uri': 'spotify:artist:2wJ4vsxWd7df7dRU4KcoDe', 'href': 'https://api.spotify.com/v1/artists/2wJ4vsxWd7df7dRU4KcoDe', 'name': 'Sharon Van Etten', 'type': 'artist', 'external_urls': {'spotify': 'https://open.spotify.com/artist/2wJ4vsxWd7df7dRU4KcoDe'}}], 'explicit': False, 'popularity': 42, 'disc_number': 1, 'duration_ms': 218605, 'preview_url': 'https://p.scdn.co/mp3-preview/5d8671643265e35d686537ad12c07e44dd1d7ff9?cid=bccd52f359b0474abd1a0aee7454f037', 'external_ids': {'isrc': 'USAT21701610'}, 'track_number': 1, 'external_urls': {'spotify': 'https://open.spotify.com/track/1QMm6lWBJzElwwSqdLulCe'}, 'available_markets': ['AD', 'AR', 'AT', 'AU', 'BE', 'BG', 'BO', 'BR', 'CH', 'CL', 'CO', 'CR', 'CY', 'CZ', 'DE', 'DK', 'DO', 'EC', 'EE', 'ES', 'FI', 'FR', 'GB', 'GR', 'GT', 'HK', 'HN', 'HU', 'ID', 'IE', 'IS', 'IT', 'JP', 'LI', 'LT', 'LU', 'LV', 'MC', 'MT', 'MX', 'MY', 'NI', 'NL', 'NO', 'NZ', 'PA', 'PE', 'PH', 'PL', 'PT', 'PY', 'SE', 'SG', 'SK', 'SV', 'TR', 'TW', 'UY']}, 'tags': [], 'album_data': None}>, <SpyTrack {'spyid': '1uVOg50TtjBjpwMsEcLPQd', 'name': 'Aftertaste', 'primary_artist_spyid': '0Nmzni4mLSbgpRyDim6yYG', 'first_seen': datetime.datetime(2017, 6, 23, 3, 0, 43, 668872), 'added_source': None, 'last_updated': datetime.datetime(2017, 7, 4, 3, 0, 40, 602809), 'data': {'id': '1uVOg50TtjBjpwMsEcLPQd', 'uri': 'spotify:track:1uVOg50TtjBjpwMsEcLPQd', 'href': 'https://api.spotify.com/v1/tracks/1uVOg50TtjBjpwMsEcLPQd', 'name': 'Aftertaste', 'type': 'track', 'album': {'id': '2Ny4pOAVhjd8xvrJwHVDdQ', 'uri': 'spotify:album:2Ny4pOAVhjd8xvrJwHVDdQ', 'href': 'https://api.spotify.com/v1/albums/2Ny4pOAVhjd8xvrJwHVDdQ', 'name': 'Aftertaste', 'type': 'album', 'images': [{'url': 'https://i.scdn.co/image/c3ba40cb8a4cedd2d1f625d15ef591d1e9567e4a', 'width': 640, 'height': 640}, {'url': 'https://i.scdn.co/image/69009fc8dc03b5d38b9d7b0ba910e8d4d7d592e6', 'width': 300, 'height': 300}, {'url': 'https://i.scdn.co/image/607888610c64034d2ba7f1756cea6e4b60fbe0b9', 'width': 64, 'height': 64}], 'artists': [{'id': '0Nmzni4mLSbgpRyDim6yYG', 'uri': 'spotify:artist:0Nmzni4mLSbgpRyDim6yYG', 'href': 'https://api.spotify.com/v1/artists/0Nmzni4mLSbgpRyDim6yYG', 'name': 'TOTEM', 'type': 'artist', 'external_urls': {'spotify': 'https://open.spotify.com/artist/0Nmzni4mLSbgpRyDim6yYG'}}], 'album_type': 'single', 'external_urls': {'spotify': 'https://open.spotify.com/album/2Ny4pOAVhjd8xvrJwHVDdQ'}, 'available_markets': ['AD', 'AR', 'AT', 'AU', 'BE', 'BG', 'BO', 'BR', 'CA', 'CH', 'CL', 'CO', 'CR', 'CY', 'CZ', 'DE', 'DK', 'DO', 'EC', 'EE', 'ES', 'FI', 'FR', 'GB', 'GR', 'GT', 'HK', 'HN', 'HU', 'ID', 'IE', 'IS', 'IT', 'JP', 'LI', 'LT', 'LU', 'LV', 'MC', 'MT', 'MX', 'MY', 'NI', 'NL', 'NO', 'NZ', 'PA', 'PE', 'PH', 'PL', 'PT', 'PY', 'SE', 'SG', 'SK', 'SV', 'TR', 'TW', 'US', 'UY']}, 'artists': [{'id': '0Nmzni4mLSbgpRyDim6yYG', 'uri': 'spotify:artist:0Nmzni4mLSbgpRyDim6yYG', 'href': 'https://api.spotify.com/v1/artists/0Nmzni4mLSbgpRyDim6yYG', 'name': 'TOTEM', 'type': 'artist', 'external_urls': {'spotify': 'https://open.spotify.com/artist/0Nmzni4mLSbgpRyDim6yYG'}}], 'explicit': False, 'popularity': 55, 'disc_number': 1, 'duration_ms': 196083, 'preview_url': 'https://p.scdn.co/mp3-preview/019adc13ca18469a09aba656b5d87f3954669fa6?cid=bccd52f359b0474abd1a0aee7454f037', 'external_ids': {'isrc': 'GBKPL1783076'}, 'track_number': 1, 'external_urls': {'spotify': 'https://open.spotify.com/track/1uVOg50TtjBjpwMsEcLPQd'}, 'available_markets': ['AD', 'AR', 'AT', 'AU', 'BE', 'BG', 'BO', 'BR', 'CA', 'CH', 'CL', 'CO', 'CR', 'CY', 'CZ', 'DE', 'DK', 'DO', 'EC', 'EE', 'ES', 'FI', 'FR', 'GB', 'GR', 'GT', 'HK', 'HN', 'HU', 'ID', 'IE', 'IS', 'IT', 'JP', 'LI', 'LT', 'LU', 'LV', 'MC', 'MT', 'MX', 'MY', 'NI', 'NL', 'NO', 'NZ', 'PA', 'PE', 'PH', 'PL', 'PT', 'PY', 'SE', 'SG', 'SK', 'SV', 'TR', 'TW', 'US', 'UY']}, 'tags': [], 'album_data': None}>, <SpyTrack {'spyid': '0IokxIVar1PFDN1jNDKMxZ', 'name': 'If I Could (feat. Joe Killington)', 'primary_artist_spyid': '2N8IPNZTiNo3nj4mreOlHU', 'first_seen': datetime.datetime(2017, 6, 23, 3, 0, 43, 654056), 'added_source': None, 'last_updated': datetime.datetime(2017, 6, 29, 3, 0, 26, 805584), 'data': {'id': '0IokxIVar1PFDN1jNDKMxZ', 'uri': 'spotify:track:0IokxIVar1PFDN1jNDKMxZ', 'href': 'https://api.spotify.com/v1/tracks/0IokxIVar1PFDN1jNDKMxZ', 'name': 'If I Could (feat. Joe Killington)', 'type': 'track', 'album': {'id': '5R8Pqo0v8cBWAH2KE1mXP2', 'uri': 'spotify:album:5R8Pqo0v8cBWAH2KE1mXP2', 'href': 'https://api.spotify.com/v1/albums/5R8Pqo0v8cBWAH2KE1mXP2', 'name': 'Mosaik', 'type': 'album', 'images': [{'url': 'https://i.scdn.co/image/15de3646040afd626881afbf150cd4239520d9aa', 'width': 640, 'height': 640}, {'url': 'https://i.scdn.co/image/6d2175f3442919821c99af2027207e22693d0545', 'width': 300, 'height': 300}, {'url': 'https://i.scdn.co/image/be00c2e8252ce817b9224cdb23439407a37ffe50', 'width': 64, 'height': 64}], 'artists': [{'id': '2N8IPNZTiNo3nj4mreOlHU', 'uri': 'spotify:artist:2N8IPNZTiNo3nj4mreOlHU', 'href': 'https://api.spotify.com/v1/artists/2N8IPNZTiNo3nj4mreOlHU', 'name': 'Camo & Krooked', 'type': 'artist', 'external_urls': {'spotify': 'https://open.spotify.com/artist/2N8IPNZTiNo3nj4mreOlHU'}}], 'album_type': 'album', 'external_urls': {'spotify': 'https://open.spotify.com/album/5R8Pqo0v8cBWAH2KE1mXP2'}, 'available_markets': ['AU', 'NZ']}, 'artists': [{'id': '2N8IPNZTiNo3nj4mreOlHU', 'uri': 'spotify:artist:2N8IPNZTiNo3nj4mreOlHU', 'href': 'https://api.spotify.com/v1/artists/2N8IPNZTiNo3nj4mreOlHU', 'name': 'Camo & Krooked', 'type': 'artist', 'external_urls': {'spotify': 'https://open.spotify.com/artist/2N8IPNZTiNo3nj4mreOlHU'}}, {'id': '0QvtEuDIDAsKpfuOe2a237', 'uri': 'spotify:artist:0QvtEuDIDAsKpfuOe2a237', 'href': 'https://api.spotify.com/v1/artists/0QvtEuDIDAsKpfuOe2a237', 'name': 'Joe Killington', 'type': 'artist', 'external_urls': {'spotify': 'https://open.spotify.com/artist/0QvtEuDIDAsKpfuOe2a237'}}], 'explicit': False, 'popularity': 14, 'disc_number': 1, 'duration_ms': 231194, 'preview_url': 'https://p.scdn.co/mp3-preview/aad6f57835e73300c7f3ff44446f968ebedeb5be?cid=bccd52f359b0474abd1a0aee7454f037', 'external_ids': {'isrc': 'GB5KW1602278'}, 'track_number': 4, 'external_urls': {'spotify': 'https://open.spotify.com/track/0IokxIVar1PFDN1jNDKMxZ'}, 'available_markets': ['AU', 'NZ']}, 'tags': [], 'album_data': None}>]\n"
     ]
    }
   ],
   "source": [
    "print(schem.all())\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "alice_spyid = '7f0OLhGgBMX9fUjm1dcPip'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "+------------------------+------------------------+----------------------------+-------------------------------+\n",
      "|         spyid          |          name          |         first_seen         |             Label             |\n",
      "+------------------------+------------------------+----------------------------+-------------------------------+\n",
      "| 7GSuJlP3XN550RQD8t88mj |        No Roots        | 2016-12-05 08:24:12.167711 | 2016 Paper Plane Records Int. |\n",
      "| 1L6Sl0eq9rb4cZwEv9OWd8 | Hit The Ground Running | 2017-02-03 03:00:26.123265 |              None             |\n",
      "| 4bPWDXpN6MlTZBedxega3X |        No Roots        | 2017-04-29 03:00:11.571033 |              None             |\n",
      "+------------------------+------------------------+----------------------------+-------------------------------+\n"
     ]
    }
   ],
   "source": [
    "pretty_query('''\n",
    "select spyid, name, first_seen, album_data->'copyrights'->0->'text' as \"Label\" from spy_tracks \n",
    "where primary_artist_spyid = '7f0OLhGgBMX9fUjm1dcPip'\n",
    "order by first_seen asc\n",
    "''')\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Alice Merton's first track was _'No Roots'_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "popularity_sql = '''\n",
    "select as_of, value from spy_track_popularity where track_spyid = :track_spyid\n",
    "'''"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "+---------------------+-------+\n",
      "|        as_of        | value |\n",
      "+---------------------+-------+\n",
      "| 2016-12-05 08:00:00 |   6   |\n",
      "| 2016-12-06 08:00:00 |   13  |\n",
      "| 2016-12-07 08:00:00 |   16  |\n",
      "| 2016-12-08 08:00:00 |   43  |\n",
      "| 2016-12-09 08:00:00 |   47  |\n",
      "| 2016-12-10 08:00:00 |   47  |\n",
      "| 2016-12-12 09:00:00 |   52  |\n",
      "| 2016-12-13 09:00:00 |   54  |\n",
      "| 2016-12-14 08:00:00 |   55  |\n",
      "| 2016-12-16 08:00:00 |   56  |\n",
      "| 2016-12-17 08:00:00 |   57  |\n",
      "| 2016-12-18 08:00:00 |   57  |\n",
      "| 2016-12-20 03:00:00 |   57  |\n",
      "| 2016-12-21 03:00:00 |   57  |\n",
      "| 2016-12-22 03:00:00 |   57  |\n",
      "| 2016-12-23 03:00:00 |   57  |\n",
      "| 2016-12-24 03:00:00 |   58  |\n",
      "| 2016-12-25 03:00:00 |   58  |\n",
      "| 2016-12-26 03:00:00 |   58  |\n",
      "| 2016-12-27 03:00:00 |   58  |\n",
      "| 2016-12-28 03:00:00 |   58  |\n",
      "| 2016-12-29 03:00:00 |   58  |\n",
      "| 2016-12-30 03:00:00 |   58  |\n",
      "| 2016-12-31 03:00:00 |   58  |\n",
      "| 2017-01-01 03:00:00 |   58  |\n",
      "| 2017-01-02 03:00:00 |   58  |\n",
      "| 2017-01-03 03:00:00 |   58  |\n",
      "| 2017-01-04 03:00:00 |   58  |\n",
      "| 2017-01-05 03:00:00 |   59  |\n",
      "| 2017-01-06 03:00:00 |   59  |\n",
      "| 2017-01-07 03:00:00 |   59  |\n",
      "| 2017-01-08 03:00:00 |   59  |\n",
      "| 2017-01-09 03:00:00 |   60  |\n",
      "| 2017-01-10 03:00:00 |   60  |\n",
      "| 2017-01-11 03:00:00 |   60  |\n",
      "| 2017-01-12 03:00:00 |   60  |\n",
      "| 2017-01-13 03:00:00 |   60  |\n",
      "| 2017-01-14 03:00:00 |   60  |\n",
      "| 2017-01-15 03:00:00 |   61  |\n",
      "| 2017-01-16 03:00:00 |   61  |\n",
      "| 2017-01-17 03:00:00 |   61  |\n",
      "| 2017-01-18 03:00:00 |   61  |\n",
      "| 2017-01-19 03:00:00 |   61  |\n",
      "| 2017-01-20 03:00:00 |   61  |\n",
      "| 2017-01-21 03:00:00 |   60  |\n",
      "| 2017-01-22 03:00:00 |   60  |\n",
      "| 2017-01-23 03:00:00 |   60  |\n",
      "| 2017-01-24 03:00:00 |   60  |\n",
      "| 2017-01-25 03:00:00 |   60  |\n",
      "| 2017-01-26 03:00:00 |   60  |\n",
      "| 2017-01-27 03:00:00 |   60  |\n",
      "| 2017-01-28 03:00:00 |   60  |\n",
      "| 2017-01-31 03:00:00 |   60  |\n",
      "| 2017-02-08 22:00:00 |   61  |\n",
      "| 2017-02-10 03:00:00 |   61  |\n",
      "| 2017-02-11 03:00:00 |   61  |\n",
      "| 2017-02-12 03:00:00 |   61  |\n",
      "| 2017-02-13 03:00:00 |   61  |\n",
      "| 2017-02-14 03:00:00 |   61  |\n",
      "| 2017-02-15 03:00:00 |   61  |\n",
      "| 2017-02-16 03:00:00 |   61  |\n",
      "| 2017-02-17 03:00:00 |   61  |\n",
      "| 2017-02-18 03:00:00 |   61  |\n",
      "| 2017-02-19 03:00:00 |   61  |\n",
      "| 2017-02-20 03:00:00 |   61  |\n",
      "| 2017-02-21 03:00:00 |   60  |\n",
      "| 2017-02-22 03:00:00 |   60  |\n",
      "| 2017-02-23 03:00:00 |   59  |\n",
      "| 2017-02-24 03:00:00 |   59  |\n",
      "| 2017-02-25 03:00:00 |   59  |\n",
      "| 2017-02-26 03:00:00 |   59  |\n",
      "| 2017-02-27 03:00:00 |   59  |\n",
      "| 2017-02-28 03:00:00 |   57  |\n",
      "| 2017-03-12 03:00:00 |   54  |\n",
      "| 2017-03-13 03:00:00 |   53  |\n",
      "| 2017-03-19 03:00:00 |   52  |\n",
      "| 2017-03-27 03:00:00 |   50  |\n",
      "| 2017-04-03 03:00:00 |   49  |\n",
      "| 2017-04-17 03:00:00 |   46  |\n",
      "| 2017-04-23 03:00:00 |   45  |\n",
      "| 2017-04-28 03:00:00 |   44  |\n",
      "| 2017-05-01 03:00:00 |   43  |\n",
      "| 2017-05-21 03:00:00 |   36  |\n",
      "| 2017-05-25 03:00:00 |   35  |\n",
      "| 2017-05-26 03:00:00 |   34  |\n",
      "| 2017-05-27 03:00:00 |   34  |\n",
      "| 2017-05-28 03:00:00 |   34  |\n",
      "| 2017-05-29 03:00:00 |   34  |\n",
      "+---------------------+-------+\n"
     ]
    }
   ],
   "source": [
    "pretty_query(popularity_sql, params=dict(track_spyid='7GSuJlP3XN550RQD8t88mj'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "query_to_sheet(popularity_sql, de.add_worksheet('Alice Merton', 300, 30))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "playlists_sql = '''\n",
    "select \n",
    "    first_seen::date \"First Seen\", \n",
    "    last_seen::date \"Off List\", \n",
    "    last_seen::date-first_seen::date as \"days on list\", \n",
    "    first_position \"First Position\", \n",
    "    last_position \"Last Position\",\n",
    "    name \"Playlist\" \n",
    "from spy_playlist_track \n",
    "join spy_playlist on playlist_spyid = spy_playlist.spyid where track_spyid = :track_spyid\n",
    "order by first_seen\n",
    "'''"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "query_to_sheet(playlists_sql, de.add_worksheet('Alice Merton3', 300, 30))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Soundcloud"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "sc_find_artist_sql = '''select scid, name from sc_users where name like :name_like '''"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "+----------+--------------+\n",
      "|   scid   |     name     |\n",
      "+----------+--------------+\n",
      "| 12765548 | Alice Merton |\n",
      "+----------+--------------+\n"
     ]
    }
   ],
   "source": [
    "pretty_query(sc_find_artist_sql, params=dict(name_like='Alice Merton'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "sc_tracks_sql = '''select scid, name from sc_tracks where artist_scid = :artist_scid '''"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "+-----------+----------+\n",
      "|    scid   |   name   |\n",
      "+-----------+----------+\n",
      "| 295580498 | No Roots |\n",
      "+-----------+----------+\n"
     ]
    }
   ],
   "source": [
    "pretty_query(sc_tracks_sql, params=dict(artist_scid='12765548'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "+-----------------+-------------+----------------------------+----------------+\n",
      "| influencer_scid | artist_scid |          seen_at           |      name      |\n",
      "+-----------------+-------------+----------------------------+----------------+\n",
      "|     29399459    |   12765548  | 2016-11-08 01:00:08.818096 |  Mattia Villa  |\n",
      "|     3430403     |   12765548  | 2017-01-31 21:40:07.965930 |  Sam Maroste   |\n",
      "|     14114104    |   12765548  | 2017-06-07 22:33:31.166794 | Mirco Niemeier |\n",
      "+-----------------+-------------+----------------------------+----------------+\n"
     ]
    }
   ],
   "source": [
    "pretty_query('''\n",
    "select \n",
    "sc_followings.*,\n",
    "sc_users.name\n",
    "from sc_followings join sc_users on influencer_scid = sc_users.scid where artist_scid = '12765548'\n",
    "''')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "+----------+-----------------+-----------------+------------+----------------------------+\n",
      "|  track   |    influencer   | influencer_scid | track_scid |          seen_at           |\n",
      "+----------+-----------------+-----------------+------------+----------------------------+\n",
      "| No Roots | New Music Talks |    110083093    | 295580498  | 2016-12-05 15:00:19.964230 |\n",
      "| No Roots |  Pause Musicale |     9913758     | 295580498  | 2016-12-11 14:59:41.930706 |\n",
      "+----------+-----------------+-----------------+------------+----------------------------+\n"
     ]
    }
   ],
   "source": [
    "pretty_query('''\n",
    "select \n",
    "st.name track, \n",
    "sc_users.name influencer,\n",
    "sc_likes.*\n",
    "from sc_tracks st join sc_likes on sc_likes.track_scid = st.scid \n",
    "join sc_users on sc_users.scid = sc_likes.influencer_scid \n",
    "where st.artist_scid = '12765548'\n",
    "''')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### San Holo"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "+------------------------+\n",
      "|         spyid          |\n",
      "+------------------------+\n",
      "| 0jNDKefhfSbLR9sFvcPLHo |\n",
      "+------------------------+\n"
     ]
    }
   ],
   "source": [
    "pretty_query('''\n",
    "select spyid from spy_artists where name = 'San Holo'\n",
    "''')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "+------------------------+--------------------------+----------------------------+--------------+\n",
      "|         spyid          |           name           |         first_seen         |    Label     |\n",
      "+------------------------+--------------------------+----------------------------+--------------+\n",
      "| 74Ru27B7Jx8mBt5MGvGLLv |          Light           | 2016-11-25 08:19:26.845269 | 2016 bitbird |\n",
      "| 6jq6rcOikCZAmjliAgAmfT |          Light           | 2017-02-10 03:00:31.093143 |     None     |\n",
      "| 2rkCYgvzyHp1AESIlJcqqY |   Light - GOSLO Remix    | 2017-04-22 03:00:05.578047 |     None     |\n",
      "| 2OEwpiyu1J0fwUtf7zc0Ou |   Light - Loosid Remix   | 2017-06-24 03:00:06.791492 |     None     |\n",
      "| 4eqlSNbFyPM8EuaqhcC39r |        The Future        | 2017-06-30 03:00:48.734875 |     None     |\n",
      "| 0TERWVCH2clPTfg0HCtsTc | Light - BeauDamian Remix | 2017-08-26 03:00:07.498055 |     None     |\n",
      "| 3R7Y4q7kECcZkT5LCn8QP5 |  I Still See Your Face   | 2017-09-15 03:00:05.304671 |     None     |\n",
      "+------------------------+--------------------------+----------------------------+--------------+\n"
     ]
    }
   ],
   "source": [
    "pretty_query('''\n",
    "select spyid, name, first_seen, album_data->'copyrights'->0->'text' as \"Label\" from spy_tracks \n",
    "where primary_artist_spyid = '0jNDKefhfSbLR9sFvcPLHo'\n",
    "order by first_seen asc\n",
    "''')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "sh1 = de.add_worksheet('San Holo1', 400, 30)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "query_to_sheet(popularity_sql, sheet=sh1, params=dict(track_spyid='74Ru27B7Jx8mBt5MGvGLLv'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "query_to_sheet(playlists_sql, sheet=sh1, start_col=4, params=dict(track_spyid='74Ru27B7Jx8mBt5MGvGLLv'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "+------+------+\n",
      "| scid | name |\n",
      "+------+------+\n",
      "+------+------+\n"
     ]
    }
   ],
   "source": [
    "pretty_query(sc_find_artist_sql, params=dict(name_like='sanholobeats'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
