Skip to content
eddiehinkle.comWashington, DC MetroEst. 2015

PostscodeMostly Cloudy, 36°F

Code: overcast-recently-played.py

''' You'll need to pip install some dependencies:

  • python-dateutil
  • requests

Also, populate your EMAIL and PASSWORD below. '''

from xml.etree import ElementTree from datetime import datetime from dateutil.tz import UTC from dateutil.parser import parse as parse_dt

import re import sys import requests import pickle import os.path

configuration

EMAIL = 'EMAIL HERE' PASSWORD = 'PASSWORD HERE'

load stored session, or re-authenticate

if os.path.exists('session.saved'): print('Found saved session. Restoring!') session = pickle.loads(open('session.saved', 'rb').read()) else: print('No saved session. Authenticating!') session = requests.Session() response = session.post('https://overcast.fm/login', data={ 'email': EMAIL, 'password': PASSWORD })

if response.status_code != 200:
    print('Authentication failed')
    sys.exit(0)

print('Authenticated successfully. Saving session.')

with open('session.saved', 'wb') as saved_session:
    saved_session.write(pickle.dumps(session))

fetch the latest detailed OPML export from Overcast

print('Fetching latest OPML export from Overcast') response = session.get('https://overcast.fm/account/export_opml/extended') if response.status_code != 200: print('Failed to fetch OPML. Exiting.') print(response.text) sys.exit(0)

parse the OPML

tree = ElementTree.fromstring(response.text)

find all podcasts and their episodes

podcasts = tree.findall(".//*[@type='rss']")

look for recently played episodes

now = datetime.utcnow().astimezone(UTC) for podcast in podcasts: pod_title = podcast.attrib['title'] for episode in podcast.getchildren(): # skip unplayed episodes played = episode.attrib.get('played', '0') == '1' if not played: continue

    # skip episodes played over one day ago
    user_activity_date = parse_dt(episode.attrib.get('userUpdatedDate'))
    recency = now - user_activity_date
    if recency.days > 1:
        continue

    # parse out the remaining details we care about
    title = episode.attrib['title']
    published = parse_dt(episode.attrib['pubDate'])
    url = episode.attrib['url']
    overcast_url = episode.attrib['overcastUrl']
    overcast_id = episode.attrib['overcastId']
    progress = episode.attrib.get('progress')

    # fetch the epside artwork
    response = session.get(overcast_url)
    results = re.findall('img class="art fullart" src="(.*)"', response.text)
    artwork_url = ''
    if len(results) == 1:
        artwork_url = results[]

    print('Played episode of ', pod_title)
    print('    ->', title)
    print('    ->', artwork_url)
    print('    ->', url)
    print('    ->', overcast_url)
    print('    ->', user_activity_date)

Posted by Quill