ponyapi/ponyapi.py

106 lines
2.4 KiB
Python

import datetime
import os
import random
from flask import Flask, abort, jsonify, request, redirect
# An Episode is constructed as such:
# data Episode = Episode
# { name :: String
# , air_date :: Int
# , season :: Int
# , episode :: Int
# , is_movie :: Bool
# }
#
# Any instance of season 99 should be interpreted as a movie.
episodes = []
# First, open the input file and read in episodes
with open("./fim.list", "r") as f:
for line in f:
airdate, s, e, name = line.split(' ', 4)[1:]
episode = {
"name": name[:-1],
"air_date": int(airdate),
"season": int(s),
"episode": int(e),
"is_movie": s == "99"
}
episodes.append(episode)
# Now, initialize Flask
app = Flask(__name__)
@app.route("/")
def hello():
return redirect("https://github.com/Xe/PonyAPI#ponyapi", code=302)
@app.route("/all")
def all_episodes():
return jsonify(episodes=episodes)
@app.route("/newest")
def newest_episode():
now = datetime.datetime(2006, 1, 4)
now = now.now()
for episode in episodes:
if now.fromtimestamp(episode["air_date"]) > now:
return jsonify(episode=episode)
abort(500)
@app.route("/season/<number>")
def season(number):
retEpisodes = []
for episode in episodes:
if str(episode["season"]) == number:
retEpisodes.append(episode)
try:
assert len(retEpisodes) > 0
except:
abort(404)
return jsonify(episodes=retEpisodes)
@app.route("/season/<snumber>/episode/<epnumber>")
def show_episode(snumber, epnumber):
for episode in episodes:
if str(episode["season"]) == snumber and str(episode["episode"]) == epnumber:
return jsonify(episode=episode)
abort(404)
@app.route("/random")
def show_random_ep():
return jsonify(episode=random.choice(episodes))
@app.route("/search")
def search():
retEpisodes = []
term = request.args.get("q", "").lower()
try:
assert term != ""
except:
abort(406)
for episode in episodes:
if term in episode["name"].lower():
retEpisodes.append(episode)
try:
assert len(retEpisodes) > 0
except:
abort(404)
return jsonify(episodes=retEpisodes)
if __name__ == '__main__':
app.run(host="0.0.0.0", debug=True)