#!/usr/bin/env python3 # -*- encoding: utf-8 -*- import json from pathlib import Path import datetime import timetable_parser from flask import Flask, make_response, render_template, request, send_file app = Flask(__name__, instance_relative_config=True) @app.route('/', methods=['HEAD', 'OPTIONS', 'GET']) def index(): return render_template('index.html', datetime=datetime) @app.route('/favicon.ico', methods=['HEAD', 'OPTIONS', 'GET']) def favicon(): return send_file(Path('favicon.ico')) @app.route('/convert.ics', methods=['HEAD', 'OPTIONS', 'GET']) def convert(): url = request.args.get('url', '').strip() format_ = request.args.get('format', '').strip() axis = request.args.get('axis', '').strip() lang = request.args.get('lang', '').strip() content = request.args.get('content', '').strip() year = request.args.get('year', '').strip() month = request.args.get('month', '').strip() day = request.args.get('day', '').strip() tzcode = request.args.get('tzcode', '').strip() ignore_names_str = request.args.get('ignore_names', '').strip() ignore_names_sep = request.args.get('ignore_names_sep', '').strip() ignore_names = list( map(str.lower, filter(len, ignore_names_str.split(ignore_names_sep)))) 'EN,ES,PT'.split(',').index(lang) calendar = timetable_parser.main_decomposed_args( origin=timetable_parser.Source.url, path=url, format_=timetable_parser.Format(format_), line=[timetable_parser.AxisMeaning.time, timetable_parser.AxisMeaning.place, ][int(bool(axis == 'trans'))], column=[timetable_parser.AxisMeaning.time, timetable_parser.AxisMeaning.place, ][int(bool(axis != 'trans'))], content=timetable_parser.ContentMeaning(content), year=int(year) if year != '' else datetime.date.today().year, month=int(month) if month != '' else datetime.date.today().month, day=int(day) if day != '' else datetime.date.today().day, lang=lang, timezone_=tzcode, ignore_names=ignore_names, ) resp_text = str(calendar) resp = make_response(resp_text.encode('utf-8'), 200) resp.mimetype = 'text/plain' resp.mimetype_params['charset'] = 'utf-8' return resp @app.route('/multiconvert.json', methods=['HEAD', 'OPTIONS', 'GET']) def multiconvert(): ml_merging_strategy = request.args.get('ml_merging_strategy', '').strip() ml_merging_expr = request.args.get('ml_merging_expr', '').strip() ml_isep = request.args.get('ml_isep', '').strip() ml_osep = request.args.get('ml_osep', '').strip() ml_year = request.args.get('ml_year', '').strip() ml_month = request.args.get('ml_month', '').strip() ml_day = request.args.get('ml_day', '').strip() ml_tzcode = request.args.get('ml_tzcode', '').strip() ml_ignore_names = request.args.get('ml_ignore_names', '').strip() ml_ignore_names_sep = request.args.get('ml_ignore_names_sep', '').strip() en_url = request.args.get('en_url', '').strip() en_format = request.args.get('en_format', '').strip() en_axis = request.args.get('en_axis', '').strip() en_lang = request.args.get('en_lang', '').strip() en_content = request.args.get('en_content', '').strip() es_url = request.args.get('es_url', '').strip() es_format = request.args.get('es_format', '').strip() es_axis = request.args.get('es_axis', '').strip() es_lang = request.args.get('es_lang', '').strip() es_content = request.args.get('es_content', '').strip() pt_url = request.args.get('pt_url', '').strip() pt_format = request.args.get('pt_format', '').strip() pt_axis = request.args.get('pt_axis', '').strip() pt_lang = request.args.get('pt_lang', '').strip() pt_content = request.args.get('pt_content', '').strip() resp = timetable_parser.multi_decomposed_args( ml_merging_strategy=bool(['positional', 'expression'].index(ml_merging_strategy)), ml_merging_sets=[ *filter(len, map(lambda o: [*filter(len, map(str.strip, o.split(ml_isep) ))], map(str.strip, ml_merging_expr.split(ml_osep) ) )) ], ml_year=int(ml_year), ml_month=int(ml_month), ml_day=int(ml_day), ml_tzcode=ml_tzcode, ml_ignore=[*filter(len, map(str.strip, ml_ignore_names.split(ml_ignore_names_sep)))], en_origin=timetable_parser.Source.url, en_url=en_url, en_format=timetable_parser.Format(en_format), en_axis=[timetable_parser.AxisMeaning.time, timetable_parser.AxisMeaning.place, ][int(bool(en_axis == 'trans'))], en_lang=en_lang, en_content=timetable_parser.ContentMeaning(en_content), es_origin=timetable_parser.Source.url, es_url=es_url, es_format=timetable_parser.Format(es_format), es_axis=[timetable_parser.AxisMeaning.time, timetable_parser.AxisMeaning.place, ][int(bool(es_axis == 'trans'))], es_lang=es_lang, es_content=timetable_parser.ContentMeaning(es_content), pt_origin=timetable_parser.Source.url, pt_url=pt_url, pt_format=timetable_parser.Format(pt_format), pt_axis=[timetable_parser.AxisMeaning.time, timetable_parser.AxisMeaning.place, ][int(bool(pt_axis == 'trans'))], pt_lang=pt_lang, pt_content=timetable_parser.ContentMeaning(pt_content), ) resp_text = json.dumps(resp, indent=4) resp = make_response(resp_text.encode('utf-8'), 200) resp.mimetype = 'application/json' resp.mimetype_params['charset'] = 'utf-8' return resp