Skip to content

Instantly share code, notes, and snippets.

@dramamine
Last active August 21, 2023 19:31
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save dramamine/4007164bb0a7467b759386a2f8daf2f4 to your computer and use it in GitHub Desktop.
Save dramamine/4007164bb0a7467b759386a2f8daf2f4 to your computer and use it in GitHub Desktop.
KEXP show scraper
import requests
import os
from datetime import datetime, timedelta
destination_path = "shows"
# ids from https://api.kexp.org/v2/shows/
programs = [
3, # expansions
5, # midnight in a perfect world
9, # seek and destroy
12, # street sounds
24, # pacific notions
]
def get_shows(start_time, programs):
shows_endpoint = "https://api.kexp.org/v2/shows/?expand=hosts&start_time_after={}&limit=200".format(start_time)
shows_response = requests.get(shows_endpoint)
assert(shows_response.status_code == 200)
shows = shows_response.json()
return [x for x in shows['results'] if x['program'] in programs]
def get_show(show):
sg_endpoint = "https://api.kexp.org/get_streaming_url/?bitrate=256&timestamp={}".format(show['start_time'])
sg_response = requests.get(sg_endpoint)
assert(sg_response.status_code == 200)
print(sg_response.json())
mp3_url = sg_response.json()["sg-url"]
if not mp3_url:
return
download_url(mp3_url)
mp3_url_next = sg_response.json()["sg-url-next"]
print("my other url was:", mp3_url_next)
if "expansions" in mp3_url_next or "seek-and-destroy" in mp3_url_next:
download_url(mp3_url_next)
# ex. 20230402210008-22-508-expansions.mp3 to KEXP - Expansions (2023-04-02).mp3
def convert_server_name_to_local_name(filename):
y = filename[0:4]
m = filename[4:6]
d = filename[6:8]
show = " ".join( x.capitalize() for x in filename.split("-")[3:] )[:-4]
return "KEXP - {} ({}-{}-{}).mp3".format(show, y, m, d)
def download_url(mp3_url):
print(mp3_url)
src_filename = mp3_url.split("/")[-1]
dest_filename = convert_server_name_to_local_name(src_filename)
if os.path.exists(os.path.join(destination_path, dest_filename)):
print("already exists")
return
file_response = requests.get(mp3_url)
with open(os.path.join(destination_path, dest_filename), mode='wb') as localfile:
localfile.write(file_response.content)
if __name__ == "__main__":
look_date = (datetime.now() + timedelta(days=-14)).strftime("%Y-%m-%dT%H:00:00.000Z")
for show in get_shows(look_date, programs):
get_show(show)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment