Skip to content

Instantly share code, notes, and snippets.

@j0hn
Created May 20, 2018 03:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save j0hn/2192a7ac85a7fd1093d31080066f2716 to your computer and use it in GitHub Desktop.
Save j0hn/2192a7ac85a7fd1093d31080066f2716 to your computer and use it in GitHub Desktop.
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)
<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>
{% 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 %}
{% 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