initial commit

This commit is contained in:
Tanishq Dubey
2022-07-31 18:18:40 +00:00
commit d68c7ee3b9
17 changed files with 627 additions and 0 deletions

View File

@ -0,0 +1,23 @@
---
version: '3.3'
networks:
web:
external: true
internal:
external: false
services:
idc:
image: dws/idc
build: ./idc
networks:
- internal
- web
labels:
- traefik.http.routers.idc.rule=Host(`idc.dws.rip`)
- traefik.http.routers.idc.tls=true
- traefik.http.routers.idc.tls.certresolver=lets-encrypt
- traefik.port=4269
container_name: idc
restart: always

View File

@ -0,0 +1,13 @@
FROM python:buster
WORKDIR /usr/src/app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 4269
CMD ["python", "./main.py"]

View File

@ -0,0 +1,99 @@
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=4269)

View File

@ -0,0 +1,4 @@
APScheduler==3.9.1
requests==2.26.0
Flask==2.0.3
Flask-APScheduler==1.12.4

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@ -0,0 +1,187 @@
<!DOCTYPE html>
<html>
<head>
<title>InterdimensionalCable</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<script
src="https://code.jquery.com/jquery-2.2.4.min.js"
integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44="
crossorigin="anonymous"></script>
<link rel="shortcut icon" href="{{ url_for('static', filename='favicon.ico') }}">
<style type="text/css">
body, html
{
margin: 0; padding: 0; height: 100%; overflow: hidden;
}
#content
{
position:absolute; left: 0; right: 0; bottom: 0; top: 0px;
}
#player
{
width: 100%;
height: 100%;
}
.hidden {
display: none;
}
.btn{
border-radius: 10px;
margin:1em;
padding:1em 2em;
transition:all 125ms ease;
text-transform:uppercase;
color:#fff;
font-weight:500;
border:1px solid #d1d1d1
}
.btn:active{ transform:scale(.9) }
.btn:focus{ outline:none }
.btn:active,
.btn:hover,
.btn:focus{ color:#fff }
.btn:active:focus,
.btn:active:hover{ outline:none }
.btn:active,
.btn:active:hover,
.btn:active:focus{ transform:scale(.9) }
.btn:focus{ transform:scale(1) }
.btn-danger {
background-color:#FF0000;
border:1px solid #FF0000;
box-shadow:0 2px 20px rgba(246,77,76,0.57)
}
.btn-danger:active{
box-shadow:0 2px 20px rgba(246,77,76,0.57)
}
.btn-danger:hover{
background-color:#ff2e2e;
border:1px solid #ff2e2e;
box-shadow:0 2px 20px rgba(246,77,76,0.67)
}
.btn-danger:active,
.btn-danger:focus,
.btn-danger:active:hover,
.btn-danger:active:focus{
border:1px solid #ff2e2e;
background-color:#ff2e2e
}
#buttonl {
z-index: 101;
position: absolute;
width: 50px;
height: 50px;
left: 3%;
top: 50%;
}
#buttonr {
z-index: 101;
position: absolute;
width: 50px;
height: 50px;
right: 3%;
top: 50%;
}
</style>
</head>
<body>
<script type="text/javascript">
var tag = document.createElement('script');
tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
var idx=0;
var justHidden = false;
var videos = {{vids|safe}};
var player;
function onYouTubeIframeAPIReady() {
player = new YT.Player('player', {
events: {
'onReady': function(){},
'onStateChange': onPlayerStateChange
}
});
}
function onPlayerStateChange(event) {
if (event.data == YT.PlayerState.ENDED) {
idx = idx + 1;
if (idx == videos.length) {
idx = 0;
}
$('#player').attr('src', videos[idx]);
player = new YT.Player('player', {
events: {
'onReady': function(){},
'onStateChange': onPlayerStateChange
}
});
}
}
$(document).ready(function() {
var j;
$('#player').attr('src', videos[idx]);
$(document).mousemove(function() {
if (!justHidden) {
justHidden = false;
clearTimeout(j);
$('.btn').removeClass('hidden');
j = setTimeout('hide();', 1000);
}
});
$('#buttonl').click(function(){
idx = idx - 1;
if (idx < 0) {
idx = videos.length - 1;
}
$('#player').attr('src', videos[idx]);
player = new YT.Player('player', {
events: {
'onReady': function(){},
'onStateChange': onPlayerStateChange
}
});
});
$('#buttonr').click(function(){
idx = idx + 1;
if (idx == videos.length) {
idx = 0;
}
$('#player').attr('src', videos[idx]);
player = new YT.Player('player', {
events: {
'onReady': function(){},
'onStateChange': onPlayerStateChange
}
});
});
});
function hide() {
$('.btn').addClass('hidden');
}
</script>
<div id="content">
<iframe
id="player"
src="https://www.youtube.com/embed/tgbNymZ7vqY?autoplay=1" frameborder="0" allow="autoplay">
</iframe>
<button id="buttonl" class="btn btn-danger hidden"><i class="fa fa-angle-left"></i></button>
<button id="buttonr" class="btn btn-danger hidden"><i class="fa fa-angle-right"></i></button>
</div>
</body>
</html>