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