108 lines
2.5 KiB
Python
108 lines
2.5 KiB
Python
from flask import Flask, Response, abort, request
|
|
from parsers.nvidia import NvidiaParser
|
|
from urllib.parse import urlparse
|
|
import os, time, threading
|
|
|
|
class ParserData:
|
|
parser = None
|
|
rss = None
|
|
time = None
|
|
lock = threading.Lock()
|
|
|
|
def __init__(self, parser):
|
|
self.parser = parser
|
|
|
|
app = Flask(__name__)
|
|
|
|
parsers = [ParserData(NvidiaParser())]
|
|
|
|
def getCachePath(parser):
|
|
path = './_cache/' + parser.__class__.__name__
|
|
return path
|
|
|
|
def checkParserCache(parser):
|
|
path = getCachePath(parser.parser)
|
|
|
|
try:
|
|
os.path.getmtime(path)
|
|
with open(path, 'r') as f:
|
|
parser.rss = f.read()
|
|
except:
|
|
os.makedirs(os.path.dirname(path), exist_ok=True)
|
|
open(path, 'w').close()
|
|
return True
|
|
|
|
filetime = os.path.getmtime(path)
|
|
currtime = time.time()
|
|
parser.time = filetime
|
|
|
|
return (currtime - filetime) > parser.parser.CACHE_TIMEOUT
|
|
|
|
def updateParserAndCache(parser):
|
|
rss = parser.parser.getRss()
|
|
|
|
with parser.lock:
|
|
parser.rss = rss
|
|
parser.time = time.time()
|
|
|
|
with open(getCachePath(parser.parser), 'w') as f:
|
|
f.write(parser.rss.decode('utf-8'))
|
|
|
|
def runParserWorker(parser):
|
|
if checkParserCache(parser):
|
|
updateParserAndCache(parser)
|
|
|
|
while True:
|
|
nextmark = parser.time + parser.parser.CACHE_TIMEOUT
|
|
sleepfor = nextmark - time.time()
|
|
if sleepfor > 0:
|
|
time.sleep(nextmark - time.time())
|
|
updateParserAndCache(parser)
|
|
|
|
def runParserWorkers():
|
|
for parser in parsers:
|
|
threading.Thread(target=runParserWorker, args=(parser,)).start()
|
|
|
|
indexPage = """
|
|
<html>
|
|
<head>
|
|
<title>RSS index page</title>
|
|
</head>
|
|
<body>
|
|
<h1>RSS index page</h1>
|
|
<h3>Custom generators of RSS feed from different blogs</h3>
|
|
<br/>
|
|
"""
|
|
|
|
for parser in parsers:
|
|
indexPage += f'<a href={parser.parser.URL}>{parser.parser.NAME}</a>'
|
|
indexPage += '</body>'
|
|
indexPage += '</html>'
|
|
|
|
@app.route('/')
|
|
def index():
|
|
return indexPage
|
|
|
|
#@app.route('/favicon.ico')
|
|
#def favicon():
|
|
# referrer = request.referrer
|
|
# if referrer != None:
|
|
# u = urlparse(referrer)
|
|
#
|
|
# for parser in parsers:
|
|
# if parser.parser.URL == u.path:
|
|
# favi = parser.parser.favicon
|
|
# return Response(favi.content, mimetype=favi.headers['Content-Type'])
|
|
#
|
|
# abort(404)
|
|
|
|
runParserWorkers()
|
|
|
|
for parser in parsers:
|
|
@app.route(parser.parser.URL)
|
|
def query():
|
|
with parser.lock:
|
|
if parser.rss == None:
|
|
abort(404)
|
|
return Response(parser.rss, mimetype='text/xml')
|