From 332ec90fd451aeb75bb920f6b6704a7426f87ef7 Mon Sep 17 00:00:00 2001 From: Stefan Huber Date: Sun, 3 Sep 2017 16:05:33 +0200 Subject: [PATCH] Features by Gerhard Features added by Gerhard Mitterlechner plus some adaptions. --- oe1archive.py | 127 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 117 insertions(+), 10 deletions(-) diff --git a/oe1archive.py b/oe1archive.py index 5a8e397..de4d412 100755 --- a/oe1archive.py +++ b/oe1archive.py @@ -1,7 +1,8 @@ #!/usr/bin/env python3 -"""A simple tool to query the Ö1 7 Tage archive.""" -__version__ = "1.0" +"""A simple tool to query the Oe1 7 Tage archive.""" + +__version__ = "2.0" __author__ = "Stefan Huber" @@ -11,6 +12,7 @@ import dateutil.parser import sys import getopt import re +import os class Archive: @@ -28,9 +30,18 @@ class Archive: def get_broadcast(self, day, broadcast): return _json_to_broadcast(self.json[day]['broadcasts'][broadcast]) + def get_player_url(self, day, broadcast): + date = self.json[day]['day'] + pk = self.json[day]['broadcasts'][broadcast]['programKey'] + url = "http://oe1.orf.at/player/%d/%s" + return url % (date, pk) + def get_broadcast_subtitle(self, day, broadcast): return self.json[day]['broadcasts'][broadcast]['subtitle'] + def get_broadcast_pk(self, day, broadcast): + return self.json[day]['broadcasts'][broadcast]['programKey'] + def get_broadcast_url(self, day, broadcast): date = self.json[day]['day'] pk = self.json[day]['broadcasts'][broadcast]['programKey'] @@ -46,6 +57,21 @@ class Archive: surl = 'http://loopstream01.apa.at/?channel=oe1&shoutcast=0&id=%s' return surl % sid + def get_broadcast_description(self, day, broadcast): + date = self.json[day]['day'] + pk = self.json[day]['broadcasts'][broadcast]['programKey'] + + burl = 'https://audioapi.orf.at/oe1/api/json/current/broadcast/%s/%d' + bjson = read_json(burl % (pk, date)) + + description = bjson['description'] + akm = bjson['akm'] + if description is None: + description = "" + if akm is None: + akm = "" + return description + "
" + akm; + def get_broadcasts_by_regex(self, key): rex = re.compile(key, re.IGNORECASE) @@ -99,6 +125,7 @@ def screen_choose(): for i, date in enumerate(days): print(" [%d] %s" % (i, date.strftime("%a %d. %b %Y"))) day = input_index("Date: ", days) + chosen_datetime = days[day] print() print("Choose a broadcast:") @@ -109,21 +136,101 @@ def screen_choose(): broadcast = input_index("Broadcast: ", broadcasts) print() + print_broadcast_info(a, day, broadcast) + print() + url = a.get_broadcast_url(day, broadcast) - if url is None: - print("No stream found.") - sys.exit(1) - print(url) + if url is not None: + answer = input("Do you want to download the chosen broadcast? (y/N) ") + if answer in ["y", "Y", "j", "J"]: + name = input("Download directory (prefix): ") + + try: + dirname = get_directory_name(name, chosen_datetime) + print("Downloading to %s..." % dirname) + + make_directory(name, chosen_datetime) + + description = a.get_broadcast_description(day, broadcast) + write_html_file(name, chosen_datetime, description) + + write_mp3_file(name, chosen_datetime, url) + + except OSError as e: + print("Error creating directory.") + print(e) + + except requests.exceptions.RequestException as e: + print("Request getting mp3 failed.") + + except Exception as e: + print("Error downloading mp3.") + print(e) + +def get_directory_name(name, datetime): + prefix = "" + if len(name) > 0: + prefix = name + "_" + + return prefix + datetime.strftime("%Y-%m-%d") + +def make_directory(name, datetime): + """Creates the download subdirectory for the given name and datetime.""" + dirname = get_directory_name(name, datetime) + if not os.path.exists(dirname): + os.makedirs(dirname) + +def write_html_file(name, datetime, description): + """Stores broadcast description into a html file.""" + + longname = get_directory_name(name, datetime) + filepath = os.path.join(longname, "description.html") + file = open(filepath, 'w+') + file.write("\n") + file.write("\n") + file.write("\n") + file.write("\n") + file.write("%s %s\n" % (name, datetime.strftime("%d.%m.%Y"))) + file.write("\n") + file.write("\n") + file.write("\n") + file.write("\n") + file.write("%s %s" % (name, datetime.strftime("%d.%m.%Y"))) + file.write(description) + file.write("\n") + file.write("") + file.close() + +def write_mp3_file(name, datetime, url): + import requests + + longname = get_directory_name(name, datetime) + filepath = os.path.join(longname, "stream.mp3") + + print("Fetching mp3...") + r = requests.get(url, stream=True) + if r.status_code == 200: + with open(filepath, 'wb') as f: + f.write(r.content) + else: + print("Error downloading mp3. Status code: %d" % r.status_code) def screen_search(key): a = Archive() - for d, b in a.get_broadcasts_by_regex(key): - date, title = a.get_broadcast(d, b) - print("%s %s" % (date.strftime("%a %d.%m.%Y %H:%M:%S"), title)) - print(" %s" % a.get_broadcast_url(d, b)) + print_broadcast_info(a, d, b) print() +def print_broadcast_info(archive, day, broadcast): + a, d, b = archive, day, broadcast + date, title = a.get_broadcast(d, b) + + print("%s %s" % (date.strftime("%a %d.%m.%Y %H:%M:%S"), title)) + print(" %s" % a.get_broadcast_subtitle(d, b)) + print(" Broadcast: %s" % a.get_broadcast_url(d, b)) + print(" Player: %s" % a.get_player_url(d, b)) + print(" Program key: %s" % a.get_broadcast_pk(d, b)) + if __name__ == "__main__": try: -- 2.30.2