awesome-youtubers/voter/api.py

103 lines
3.0 KiB
Python
Raw Normal View History

2021-02-28 17:01:11 +00:00
import json
2021-03-01 01:51:29 +00:00
from datetime import datetime
2021-03-02 19:37:11 +00:00
from flask import Flask, jsonify, make_response, request
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address
app = Flask(__name__)
limiter = Limiter(
app,
key_func=get_remote_address,
default_limits=["1200 per day", "50 per hour"]
)
2021-02-28 17:01:11 +00:00
2021-02-28 20:25:12 +00:00
with open("data.json", "r", encoding="utf8") as read_data:
2021-02-28 17:01:11 +00:00
channels = json.load(read_data)
2021-03-02 19:37:11 +00:00
@app.route("/")
def main():
return "Awesome YouTubers voting system website."
2021-02-28 17:01:11 +00:00
2021-03-02 19:37:11 +00:00
@app.route("/channels/all")
2021-02-28 17:01:11 +00:00
def list_channels():
""" Lists all channels in the database. """
return jsonify(channels)
2021-03-02 19:37:11 +00:00
@app.route("/channels/<channel>")
2021-02-28 22:52:08 +00:00
def get_channel(channel):
2021-03-01 01:37:04 +00:00
"""
If no query specified, prints the name of the
YouTube channel typed. When a query with the
name "vote" is given, adds or substracts 1
from the specified YouTube score.
"""
2021-02-28 22:52:08 +00:00
if "vote" in request.args:
2021-02-28 20:25:12 +00:00
vote = str(request.args["vote"])
2021-02-28 21:18:51 +00:00
2021-02-28 22:52:08 +00:00
if channel in channels:
2021-03-01 01:51:29 +00:00
# Adds/substracts 1 from the channel.
2021-02-28 22:52:08 +00:00
if vote == "upvote":
channels[channel] += 1
elif vote == "downvote":
channels[channel] -= 1
else:
return "Vote word not recognised."
2021-02-28 17:01:11 +00:00
2021-03-01 01:51:29 +00:00
# Write to database file.
2021-02-28 22:52:08 +00:00
with open("data.json", "w", encoding="utf8") as write_data:
json.dump(channels, write_data, indent=4)
2021-03-01 01:51:29 +00:00
# Write to log file.
with open("log.txt", "a") as append:
today = datetime.today().strftime('%Y-%m-%d-%H:%M')
append.write(f"\n{vote.title()}d {channel} on {today}")
2021-02-28 22:52:08 +00:00
return f"You {vote}d successfully the channel {channel}."
else:
return "Channel not found on the list."
else:
if channel in channels:
return "Channel: " + channel
2021-02-28 20:25:12 +00:00
else:
2021-02-28 22:52:08 +00:00
return "Channel not found on the list."
2021-02-28 20:25:12 +00:00
2021-03-02 19:37:11 +00:00
@app.route("/channels/<channel>/image.svg")
2021-02-28 22:52:08 +00:00
def img_channel(channel):
2021-03-01 01:37:04 +00:00
""" Returns the YouTube score in a svg image. """
2021-03-01 14:53:43 +00:00
2021-03-01 17:42:37 +00:00
svg_image = f"""
2021-02-28 22:52:08 +00:00
<svg xmlns="http://www.w3.org/2000/svg" x="0px" y="0px"
width="52px" height="22px" viewBox="0 0 52 22" fill="none">
<style>
.text {{
font-family: "Segoe UI", Ubuntu, Sans-Serif;
font-weight: bold;
}}
2021-03-01 14:53:43 +00:00
</style>
<rect x="0.5" y="0.5" height="99%" width="51" fill="none"/>
2021-02-28 22:52:08 +00:00
<g>
2021-03-01 17:53:41 +00:00
<text x="5" y="15" fill="#00b4f0" class="text">
2021-02-28 22:52:08 +00:00
{channels[channel]}
</text>
</g>
</svg>
"""
2021-03-01 17:42:37 +00:00
if channel in channels:
response = make_response(svg_image)
response.headers.set('Content-Type', 'image/svg+xml')
return response
2021-02-28 17:01:11 +00:00
else:
2021-02-28 22:52:08 +00:00
return "Channel not found on the list"
2021-03-02 19:37:11 +00:00
if __name__ == "__main__":
app.run()