1
0
Fork 0
mirror of https://github.com/Findus23/RadioStats.git synced 2024-09-19 16:03:48 +02:00
RadioStats/server.py

81 lines
2.4 KiB
Python
Raw Normal View History

2018-02-09 16:09:29 +01:00
import calendar
from datetime import datetime, timedelta
2018-02-08 16:41:13 +01:00
from flask import jsonify, request
2018-02-07 13:47:48 +01:00
from playhouse.shortcuts import model_to_dict
from app import app
from models import *
2018-02-10 18:47:19 +01:00
def query_to_response(query, limit=10, key=False, **kwargs):
2018-02-07 13:47:48 +01:00
"""
2018-02-08 10:56:30 +01:00
:type key: str
:type limit: int|boolean
2018-02-07 13:47:48 +01:00
:param **kwargs
:type query: peewee.ModelSelect
"""
if limit:
query = query.limit(limit)
print(query.sql())
2018-02-08 10:56:30 +01:00
data = {} if key is not False else []
2018-02-07 13:47:48 +01:00
for i in query:
2018-02-08 10:56:30 +01:00
element = model_to_dict(i, **kwargs)
if key is not False:
data[getattr(i, key)] = element
else:
data.append(element)
response = jsonify(data)
if __name__ == '__main__':
response.headers.add('Access-Control-Allow-Origin', '*')
return response
2018-02-07 13:47:48 +01:00
2018-02-09 12:00:27 +01:00
@app.route('/api/')
2018-02-07 13:47:48 +01:00
def index():
2018-02-08 10:56:30 +01:00
return query_to_response(Channel.select(), limit=False, key="shortname")
2018-02-07 13:47:48 +01:00
2018-02-09 16:09:29 +01:00
def getRange(date, date_type):
if date_type == "day":
start = date
end = date
elif date_type == "week":
start = date - timedelta(days=date.weekday())
end = start + timedelta(days=6)
elif date_type == "month":
start = date.replace(day=1)
end = date.replace(day=calendar.monthrange(date.year, date.month)[1])
else:
start = datetime.strptime("2000-01-01", '%Y-%m-%d')
end = datetime.strptime("2050-01-01", '%Y-%m-%d')
end = end + timedelta(days=1)
return start, end
2018-02-09 12:00:27 +01:00
@app.route('/api/<channel>')
2018-02-07 13:47:48 +01:00
def popular(channel):
2018-02-09 16:09:29 +01:00
try:
date = datetime.strptime(request.args.get('date'), '%Y-%m-%d')
date_type = request.args.get('dateType')
if date_type not in ["day", "week", "month", "alltime"]:
raise ValueError
except (TypeError, ValueError):
date = datetime.today()
date_type = "month"
start, end = getRange(date, date_type)
2018-02-08 10:56:30 +01:00
get = Play.select(Play.song, fn.Count(SQL('*')).alias("count")) \
2018-02-07 13:47:48 +01:00
.join(Channel).switch(Play).join(Song) \
2018-02-09 16:09:29 +01:00
.where((Song.show == 0) & (Channel.shortname == channel) & (
Play.time.between(start, end))) \
2018-02-08 10:56:30 +01:00
.group_by(Play.song).order_by(SQL('count').desc())
2018-02-08 16:41:13 +01:00
if request.args.get('offset'):
get = get.offset(int(request.args.get('offset')))
2018-02-08 10:56:30 +01:00
return query_to_response(get, extra_attrs=["count"], exclude=[Play.channel, Play.time, Play.id])
2018-02-07 13:47:48 +01:00
if __name__ == '__main__':
2018-02-08 10:56:30 +01:00
app.debug = True
2018-02-07 13:47:48 +01:00
app.run()