Created
May 20, 2018 03:35
-
-
Save j0hn/2192a7ac85a7fd1093d31080066f2716 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import os | |
from functools import lru_cache | |
import requests | |
import urllib.parse | |
from flask import Flask | |
from flask import request | |
from flask import flash | |
from flask import url_for | |
from flask import redirect | |
from flask import render_template | |
# Flask App | |
app = Flask(__name__) | |
app.secret_key = b'dalequesaleeeeee' | |
# URLs | |
API_URL = "https://api.themoviedb.org/3/" | |
AUTHENTICATE_URL = "https://www.themoviedb.org/authenticate/" | |
# Keys | |
TMDB_API_KEY = "" | |
def make_api_request(path, payload=None): | |
path = path[1:] if path.startswith("/") else path | |
url = urllib.parse.urljoin(API_URL, path) | |
payload = payload if payload else {} | |
payload["api_key"] = TMDB_API_KEY | |
return requests.request("GET", url, data=payload) | |
@app.route("/") | |
def home(): | |
return render_template('home.html') | |
@app.route("/generate") | |
def generate(): | |
response = make_api_request("/authentication/token/new") | |
if response.status_code == 200: | |
request_token = response.json().get("request_token") | |
if request_token: | |
authenticate_url = "{}?redirect_to=http://localhost:5000/approved".format( | |
os.path.join(AUTHENTICATE_URL, request_token) | |
) | |
return redirect(authenticate_url) | |
# If we didn't redirect, show error message | |
flash("Couldn't generate request token", "error") | |
return redirect(url_for('home')) | |
@app.route("/approved") | |
def approved(): | |
approved = request.args.get("approved") | |
request_token = request.args.get("request_token") | |
# Validate that the token was approved | |
if approved != "true" or not request_token: | |
flash("Request token wasn't approved", "error") | |
return redirect(url_for('home')) | |
response = make_api_request( | |
"/authentication/session/new", | |
{"request_token": request_token} | |
) | |
if response.status_code == 200: | |
session_id = response.json().get("session_id") | |
if session_id: | |
flash("session id: {}".format(session_id), "success") | |
return redirect(url_for('home')) | |
# If we didn't redirect, show error message | |
flash("Session ID Couldn't be generated using valid request token", "error") | |
return redirect(url_for('home')) | |
@lru_cache(maxsize=32) | |
def get_account_data(session_id): | |
response = make_api_request("account", {"session_id": session_id}) | |
if response.status_code != 200: | |
flash("Couldn't get account info", "error") | |
raise ValueError() | |
# username = response.json().get("username") | |
# avatar = response.json().get("avatar", {}).get("gravatar", {}).get("hash") | |
account_id = response.json().get("id") | |
return account_id | |
@lru_cache(maxsize=32) | |
def get_rated_movies(session_id, account_id): | |
rated_movies_path = "account/{account_id}/rated/movies".format(account_id=account_id) | |
page = 1 | |
total_pages = 100 | |
full_data = [] | |
i = 0 | |
max_iter = 10 | |
while page < total_pages or i > max_iter: | |
i += 1 | |
payload = { | |
"session_id": session_id, | |
"sort_by": "created_at.asc", | |
"page": page, | |
} | |
response = make_api_request(rated_movies_path, payload) | |
if response.status_code != 200: | |
flash("Error getting rated: {}".format(response.text), "error") | |
raise ValueError() | |
json_response = response.json() | |
page += 1 | |
total_pages = json_response.get("total_pages") | |
results = json_response.get("results") | |
full_data += results | |
return full_data | |
@app.route("/rated", methods=["POST", "GET"]) | |
def rated(): | |
session_id = request.form.get("sessionid") | |
if not session_id: | |
flash("Session id not provided", "error") | |
return redirect(url_for('home')) | |
try: | |
account_id = get_account_data(session_id) | |
rated_movies = get_rated_movies(session_id, account_id) | |
except: | |
return redirect(url_for('home')) | |
return render_template('rated.html', movies=rated_movies) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<html> | |
<head> | |
{% block head %}{% endblock %} | |
</head> | |
<body> | |
{% with messages = get_flashed_messages() %} | |
{% if messages %} | |
<ul class=flashes> | |
{% for message in messages %} | |
<li>{{ message }}</li> | |
{% endfor %} | |
</ul> | |
<br /><br /> | |
{% endif %} | |
{% endwith %} | |
{% block body %}{% endblock %} | |
</body> | |
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{% extends "base.html" %} | |
{% block body %} | |
<form action="/rated" method="post"> | |
<input type="text" name="sessionid" placeholder="session id"> <br /> | |
</form> | |
<a href="/generate">Generate session id</a> | |
{% endblock %} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{% extends "base.html" %} | |
{% block body %} | |
<table> | |
{% for movie in movies %} | |
<tr> | |
<td style="color: #bbb">{{ loop.index }}</td> | |
<td style="text-align: right">{{ movie.title }}</td> | |
<td style="padding-left: 10px">{{ movie.rating }}</td> | |
</tr> | |
{% endfor %} | |
</table> | |
{% endblock %} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment