interdimensionalcable/main.py
2022-07-31 14:44:25 -04:00

100 lines
2.4 KiB
Python

import json
import os.path
import random
import time
import requests
from flask import Flask, render_template
from flask_apscheduler import APScheduler
URL = "https://www.reddit.com/r/InterdimensionalCable/top.json?limit=100&t=week"
scheduler = APScheduler()
v = []
def getRedditData(url):
resp = requests.get(url)
text = resp.text
code = resp.status_code
while code == 429:
print("waiting for timeout to end ...")
time.sleep(2)
resp = requests.get(url)
text = resp.text
code = resp.status_code
data = json.loads(text)
token = data["data"]["after"]
ret = []
for post in data["data"]["children"]:
turl = post["data"]["url_overridden_by_dest"]
if "youtu.be" in turl:
turl = turl.replace("https://youtu.be/", "https://www.youtube.com/watch?v=")
if "m.youtube.com" in turl:
turl = turl.replace(
"https://m.youtube.com/embed", "https://www.youtube.com/watch?v="
)
turl = turl.replace("watch?v=", "embed/")
turl = turl + "?autoplay=1&enablejsapi=1"
ret.append(turl)
return ret, token
def doPages(numPages):
token = ""
vids = []
for i in range(numPages):
if i == 0:
v, t = getRedditData(URL)
vids = vids + v
token = t
time.sleep(2)
v, t = getRedditData(URL + f"&after={token}")
vids = vids + v
print(f"got page {i}...")
return vids
@scheduler.task("interval", id="do_job_1", minutes=60, misfire_grace_time=900)
def job1():
global v
doFetch = False
pexist = os.path.exists("temp.json")
if pexist:
print("temp.json exists")
sec = os.path.getmtime("temp.json")
now = time.time()
if now - sec > 600:
doFetch = True
else:
doFetch = True
if doFetch:
print("stale or no file, fetching...")
v = doPages(2)
with open("temp.json", "w") as f:
json.dump(v, f)
else:
print("fresh file, not fetching...")
with open("temp.json", "r") as f:
v = json.load(f)
app = Flask(__name__)
scheduler.init_app(app)
scheduler.start()
job1()
@app.route("/")
def hello_world():
global v
random.shuffle(v)
return render_template("index.html", vids=json.dumps(v))
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8080)