From c31ea43bacb519e137bea438107f8281767fcf29 Mon Sep 17 00:00:00 2001 From: Igor Chubin Date: Fri, 7 Feb 2025 16:49:44 +0100 Subject: [PATCH] Add lib/view/v3.py --- lib/view/v3.py | 144 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 lib/view/v3.py diff --git a/lib/view/v3.py b/lib/view/v3.py new file mode 100644 index 0000000..0d8ea3a --- /dev/null +++ b/lib/view/v3.py @@ -0,0 +1,144 @@ +import os +import time +import random +import shutil + +import requests + +from globals import remove_ansi, MYDIR + +from . import v2 + +CACHE_DIR = "/wttr.in/cache/v3" + +def _get_cache_filename(filetype, name, timestamp=True): + if name.endswith(".%s" % filetype): + name = name[:len(filetype)+1] + + if not timestamp: + return os.path.join(CACHE_DIR, filetype, name+"."+filetype) + timestamp = str(int(time.time()/3600)) + return os.path.join(CACHE_DIR, filetype, timestamp, name+"."+filetype) + +def _process_request(filetype, location, filename): + """Try to fetch response from one of the upstream workers. + If response code is 200, save the fetched response to the cache file. + If no reponse returned, don't save anything, so the file will not be created. + """ + + ports = [9500, 9501, 9502] + random.shuffle(ports) + for port in ports: + url = "http://127.0.0.1:%s/%s/%s" % (port, filetype, location) + try: + response = requests.get(url, stream=True) + except requests.exceptions.ConnectionError: + continue + + if response.status_code == 200: + with open(filename, "wb") as out_file: + shutil.copyfileobj(response.raw, out_file) + return + +def _get_v3_file(filetype, location): + cache_file = _get_cache_filename(filetype, location) + if os.path.exists(cache_file): + return cache_file + + dirname = os.path.dirname(cache_file) + if not os.path.exists(dirname): + os.makedirs(dirname) + + _process_request(filetype, location, cache_file) + return cache_file + +def v3_file(location): + if location.endswith(".sxl"): + filetype = "sxl" + location = location[:-4] + elif location.endswith(".png"): + filetype = "png" + location = location[:-4] + elif location.endswith(".it2"): + filetype = "it2" + location = location[:-4] + else: + if "." in location: + return "ERROR Unknown filetype: %s" % location + else: + filetype = "png" + return _get_v3_file(filetype, location) + +def _png_file(location): + filename = _get_v3_file("png", location) + with open(filename, "rb") as png_file: + return png_file.read() + +def _main_view(location): + filetype = "" + if location.endswith(".sxl"): + filetype = "sxl" + location = location[:-4] + elif location.endswith(".it2"): + filetype = "it2" + location = location[:-4] + + if filetype != "": + filename = _get_v3_file(filetype, location) + with open(filename, "r") as f_data: + return f_data.read() + + with open(os.path.join(MYDIR, "share", "v3.txt"), "r") as f_v3: + v3_text = f_v3.read() + return v3_text + +def main(query, parsed_query, data): + parsed_query["locale"] = "en_US" + + html_output = parsed_query["html_output"] + + location = parsed_query["orig_location"] + if location is None: + location = parsed_query["location"] + + if parsed_query.get("png_filename"): + return _png_file(location) + + filename = location + ".png" + + + if html_output: + output = """ + + +Weather report for {location} + + + + +
+ +
+ + + + +""".format(location=location, filename=filename) + else: + output = _main_view(location) + if parsed_query.get('no-terminal', False): + output = remove_ansi(output) + return output