Simplify template, add previous/next hour links, use a single route
This commit is contained in:
69
balises.py
69
balises.py
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
from argparse import ArgumentParser
|
from argparse import ArgumentParser
|
||||||
from configparser import ConfigParser
|
from configparser import ConfigParser
|
||||||
from datetime import datetime, timedelta
|
import datetime as dt
|
||||||
|
|
||||||
import bs4
|
import bs4
|
||||||
import requests
|
import requests
|
||||||
@@ -71,33 +71,36 @@ def get_last_ten():
|
|||||||
soup = bs4.BeautifulSoup(response.content, 'html5lib')
|
soup = bs4.BeautifulSoup(response.content, 'html5lib')
|
||||||
dates = soup.select('p.rldj-cell span.post-date')
|
dates = soup.select('p.rldj-cell span.post-date')
|
||||||
for elem in dates:
|
for elem in dates:
|
||||||
dt = datetime.fromisoformat(elem.text)
|
song_dt = dt.datetime.fromisoformat(elem.text)
|
||||||
artist, title = [x.strip() for x in elem.previous.previous.split(' - ', 1)]
|
artist, title = [x.strip() for x in elem.previous.previous.split(' - ', 1)]
|
||||||
song, _ = Song.get_or_create(artist=artist, title=title)
|
song, _ = Song.get_or_create(artist=artist, title=title)
|
||||||
# get_or_create does not play nice with the unique constraint on the date
|
# get_or_create does not play nice with the unique constraint on the date
|
||||||
# so we use a simple try/except instead
|
# so we use a simple try/except instead
|
||||||
try:
|
try:
|
||||||
aircast = AirCast.get(date=dt, song=song)
|
aircast = AirCast.get(date=song_dt, song=song)
|
||||||
except DoesNotExist:
|
except DoesNotExist:
|
||||||
aircast = AirCast.create(date=dt, song=song)
|
aircast = AirCast.create(date=song_dt, song=song)
|
||||||
|
|
||||||
line_template = '{:<10} | {:<25} {:<40}'
|
line_template = '{:<10} | {:<25} {:<40}'
|
||||||
print(line_template.format(str(dt), artist, title))
|
print(line_template.format(str(song_dt), artist, title))
|
||||||
|
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
||||||
# Search song
|
# Search song
|
||||||
|
|
||||||
def search_song(query):
|
def search_songs_between(start_dt, end_dt):
|
||||||
|
query = AirCast\
|
||||||
|
.select()\
|
||||||
|
.order_by(AirCast.date)\
|
||||||
|
.where(AirCast.date.between(start_dt, end_dt))
|
||||||
|
return [x for x in query]
|
||||||
|
|
||||||
|
def search_song(day, hour):
|
||||||
# query must be a datetime
|
# query must be a datetime
|
||||||
delta = timedelta(minutes=30)
|
# we search the songs withing the hour specified
|
||||||
|
start_dt = dt.datetime.combine(day, dt.time(hour=hour))
|
||||||
query = AirCast.select().order_by(AirCast.date).where(
|
delta = dt.timedelta(hours=1)
|
||||||
(AirCast.date > query - delta) &
|
return search_songs_between(start_dt, start_dt + delta)
|
||||||
(AirCast.date < query + delta))
|
|
||||||
results = [x for x in query]
|
|
||||||
|
|
||||||
return results
|
|
||||||
|
|
||||||
def print_aircast(x):
|
def print_aircast(x):
|
||||||
line_template = '{:<10} | {:<25} {:<40}'
|
line_template = '{:<10} | {:<25} {:<40}'
|
||||||
@@ -110,22 +113,29 @@ def print_aircast(x):
|
|||||||
# Very simple, just a page with an input for a date/time, a query button and a
|
# Very simple, just a page with an input for a date/time, a query button and a
|
||||||
# list of results
|
# list of results
|
||||||
|
|
||||||
@route('/', method='GET')
|
@route('/', method=['GET', 'POST'])
|
||||||
@view('search_form')
|
|
||||||
def main_page():
|
|
||||||
now = datetime.now()
|
|
||||||
date = '{}'.format(now.date())
|
|
||||||
time = '{}:{}'.format(now.hour, now.minute)
|
|
||||||
return dict(title='', date=date, time=time)
|
|
||||||
|
|
||||||
@route('/', method='POST')
|
|
||||||
@view('search_results')
|
@view('search_results')
|
||||||
def results_page():
|
def results_page():
|
||||||
date = request.forms.date
|
try:
|
||||||
time = request.forms.time
|
day = dt.date.fromisoformat(request.forms.date)
|
||||||
dt = datetime.fromisoformat('{} {}'.format(date, time))
|
except ValueError:
|
||||||
results = search_song(dt)
|
day = dt.datetime.now().date()
|
||||||
return dict(results=[x for x in results], date=date, time=time)
|
|
||||||
|
try:
|
||||||
|
hour = int(request.forms.time.split(':')[0])
|
||||||
|
except ValueError:
|
||||||
|
hour = dt.datetime.now().hour
|
||||||
|
|
||||||
|
delta = int(request.forms.timedelta or 0)
|
||||||
|
hour = hour + delta
|
||||||
|
time = '{:0>2}:00'.format(hour)
|
||||||
|
|
||||||
|
results = search_song(day, hour)
|
||||||
|
return dict(results=[x for x in results],
|
||||||
|
date=day,
|
||||||
|
time=time,
|
||||||
|
start_time=time,
|
||||||
|
end_time = '{:0>2}:00'.format(hour+1))
|
||||||
|
|
||||||
@hook('before_request')
|
@hook('before_request')
|
||||||
def connect_to_db():
|
def connect_to_db():
|
||||||
@@ -171,7 +181,8 @@ def update(args):
|
|||||||
def serve(args):
|
def serve(args):
|
||||||
run(host=conf['server'].get('host', 'localhost'),
|
run(host=conf['server'].get('host', 'localhost'),
|
||||||
port=conf['server'].getint('port', 9980),
|
port=conf['server'].getint('port', 9980),
|
||||||
debug=conf['server'].getboolean('debug', False))
|
debug=conf['server'].getboolean('debug', False),
|
||||||
|
reloader=conf['server'].getboolean('reloader', False))
|
||||||
|
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>{{title or 'No title'}}</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<form action="/" method="post">
|
|
||||||
<label for="date">Date:</label>
|
|
||||||
<input name="date" type="date" value="{{date or ''}}"/>
|
|
||||||
<label for="time">Heure:</label>
|
|
||||||
<input name="time" type="time" value="{{time or ''}}"/>
|
|
||||||
<input value="Chercher" type="submit" />
|
|
||||||
</form>
|
|
||||||
{{!base}}
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,7 +1,32 @@
|
|||||||
% rebase('base.tpl', title='Radio Balises - Résultats')
|
<html>
|
||||||
<h1>Liste des chansons</h1>
|
<head>
|
||||||
|
<title>Radio Balises</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<form action="/" method="post" id="datetime_form">
|
||||||
|
<label for="date">Date:</label>
|
||||||
|
<input name="date" type="date" value="{{date}}" />
|
||||||
|
<label for="time">Heure:</label>
|
||||||
|
<input name="time" type="time" value="{{time}}" />
|
||||||
|
<input name="timedelta" id="timedelta" type="hidden" value="0" />
|
||||||
|
<input value="Chercher" type="submit" />
|
||||||
|
</form>
|
||||||
|
<h1>Chansons du {{date.strftime('%A %d %B %Y')}} entre {{start_time}} et {{end_time}}</h1>
|
||||||
|
<a href="#" id="go_sooner">[Plus tôt]</a>
|
||||||
|
<a href="#" id="go_later">[Plus tard]</a>
|
||||||
<ul>
|
<ul>
|
||||||
% for x in results:
|
% for x in results:
|
||||||
<li>[{{str(x.date)}}] {{x.song.artist}} - {{x.song.title}}
|
<li>[{{str(x.date)}}] {{x.song.artist}} - {{x.song.title}}
|
||||||
% end
|
% end
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
move_in_time = (delta) => () => {
|
||||||
|
document.getElementById('timedelta').value = delta;
|
||||||
|
document.getElementById('datetime_form').submit();
|
||||||
|
}
|
||||||
|
document.getElementById('go_sooner').onclick = move_in_time(-1);
|
||||||
|
document.getElementById('go_later').onclick = move_in_time(1);
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|||||||
Reference in New Issue
Block a user