from bottle import hook, request, route, run, static_file, view import models from models import Song, AirCast from balises import search_song from utils import project_dir import datetime as dt import locale import os import urllib.parse # ---------------------------------------------------------------------- # Web application # # Very simple, just a page with an input for a date/time, a query button and a # list of results @route('/', method=['GET', 'POST']) @view('search_results') def results_page(): try: day = dt.date.fromisoformat(request.forms.date) except ValueError: day = dt.datetime.now().date() try: hour = int(request.forms.time.split(':')[0]) except ValueError: hour = dt.datetime.now().hour hdelta = int(request.forms.timedelta or 0) delta = dt.timedelta(hours=hdelta) query_dt = dt.datetime.combine(day, dt.time(hour=hour)) query_dt = query_dt + delta day = query_dt.date() start_time = '{:0>2}:00'.format(query_dt.hour) end_time = '{:0>2}:00'.format(query_dt.hour + 1) results = [ { 'date': x.date, 'song': x.song, 'youtube_url': 'https://www.youtube.com/results?search_query=' + urllib.parse.quote_plus(x.song.artist + ' ' + x.song.title) } for x in search_song(day, hour) ] return dict(results=results, date=day, time=start_time, start_time=start_time, end_time=end_time) @route('/static/') def serve_static_file(filename): static_root = os.path.join(project_dir(), 'static') return static_file(filename, root=static_root) @hook('before_request') def set_locale(): """Set the locale for all categories to the first lang in Accept-Language header. Default to fr_FR.UTF-8 """ accept_language = request.get_header('Accept-Language', 'fr-FR') first_lang = accept_language.split(';')[0].split(',')[0] lang = first_lang.translate(str.maketrans('-', '_')) + '.UTF-8' locale.setlocale(locale.LC_ALL, lang) @hook('before_request') def connect_to_db(): models.db.connect() @hook('after_request') def close_db_connection(): models.db.close()