from flask import Flask, Response, request, redirect, abort from appdirs import user_data_dir from pathlib import Path import urllib import sys import yaml import csv from .rendering import * app = Flask(__name__) # locate page template at e.g. $XDG_CONFIG_HOME/utab/index.html # and sites json file at utab/sites.json data_dir = user_data_dir(appname="utab") template_fp = Path(data_dir) / "index.html" css_dir = Path(data_dir) / "css" try: template = Path.open(template_fp).read() except FileNotFoundError: print("Template file not found.") sys.exit(1) sites_fp = Path(data_dir) / "sites.csv" config_fp = Path(data_dir) / "config.yml" with open(config_fp) as f: config = yaml.load(f.read()) f.close() def read_sites(): with open(sites_fp) as f: sites = list(csv.reader(f)) f.close() return sites @app.route("/") def index(): return render_page( template, sites=render_sites( read_sites(), columns=config["columns"], rows=config["rows"] ), ) @app.route("/go/") def visit_site(url): print(url) url_unesc = urllib.parse.unquote(url) # unescaped url print(url_unesc) sites = read_sites() for i, s in enumerate(sites): if s[0] == url_unesc: sites[i][VISITS] = str(int(sites[i][VISITS]) + 1) with open(sites_fp, "w") as f: # update visits csv.writer(f).writerows(sites) f.close() return redirect(url_unesc, 302) @app.route("/css/") def serve_css(filename): try: with open(css_dir / filename) as f: resp = Response(f.read(), 200, {"Content-Type": "text/css"}) f.close() return resp except FileNotFoundError: return abort(404) except: return abort(500) # run on localhost only app.run("127.0.0.1", 64366)