|
|
|
@ -7,11 +7,13 @@ import copy |
|
|
|
|
import threading |
|
|
|
|
import time |
|
|
|
|
import shelve |
|
|
|
|
from urllib.parse import urlparse |
|
|
|
|
|
|
|
|
|
import feed |
|
|
|
|
from utils import gen_rand_id |
|
|
|
|
|
|
|
|
|
from flask import abort, Flask, request |
|
|
|
|
from flask import abort, Flask, request, render_template |
|
|
|
|
from werkzeug.exceptions import NotFound |
|
|
|
|
from flask_cors import CORS |
|
|
|
|
|
|
|
|
|
CACHE_LENGTH = 300 |
|
|
|
@ -25,11 +27,20 @@ with shelve.open(DATA_FILE) as db: |
|
|
|
|
news_ref_to_id = db.get('news_ref_to_id', {}) |
|
|
|
|
news_cache = db.get('news_cache', {}) |
|
|
|
|
|
|
|
|
|
flask_app = Flask(__name__) |
|
|
|
|
def get_story(id): |
|
|
|
|
if id in news_cache: |
|
|
|
|
return {'story': news_cache[id]} |
|
|
|
|
with shelve.open(DATA_FILE) as db: |
|
|
|
|
if id in db: |
|
|
|
|
return {'story': db[id]} |
|
|
|
|
return None |
|
|
|
|
|
|
|
|
|
build_folder = '../webclient/build' |
|
|
|
|
flask_app = Flask(__name__, template_folder=build_folder, static_folder=build_folder, static_url_path='') |
|
|
|
|
cors = CORS(flask_app) |
|
|
|
|
|
|
|
|
|
@flask_app.route('/') |
|
|
|
|
def index(): |
|
|
|
|
@flask_app.route('/api') |
|
|
|
|
def api(): |
|
|
|
|
front_page = [news_cache[news_ref_to_id[ref]] for ref in news_list] |
|
|
|
|
front_page = [copy.copy(x) for x in front_page if 'text' in x and x['text']][:100] |
|
|
|
|
for story in front_page: |
|
|
|
@ -37,16 +48,44 @@ def index(): |
|
|
|
|
if 'text' in story: story.pop('text') |
|
|
|
|
return {'stories': front_page} |
|
|
|
|
|
|
|
|
|
@flask_app.route('/<id>') |
|
|
|
|
def comments(id): |
|
|
|
|
if id in news_cache: |
|
|
|
|
return {'story': news_cache[id]} |
|
|
|
|
|
|
|
|
|
with shelve.open(DATA_FILE) as db: |
|
|
|
|
if id in db: |
|
|
|
|
return {'story': db[id]} |
|
|
|
|
@flask_app.route('/api/<id>') |
|
|
|
|
def story(id): |
|
|
|
|
return get_story(id) or abort(404) |
|
|
|
|
|
|
|
|
|
abort(404) |
|
|
|
|
@flask_app.route('/') |
|
|
|
|
def index(): |
|
|
|
|
return render_template('index.html', |
|
|
|
|
title='Feed', |
|
|
|
|
url='news.t0.vc', |
|
|
|
|
description='Reddit, Hacker News, and Tildes combined, then pre-rendered in reader mode') |
|
|
|
|
|
|
|
|
|
@flask_app.route('/<id>', strict_slashes=False) |
|
|
|
|
@flask_app.route('/<id>/c', strict_slashes=False) |
|
|
|
|
def static_story(id): |
|
|
|
|
try: |
|
|
|
|
return flask_app.send_static_file(id) |
|
|
|
|
except NotFound: |
|
|
|
|
pass |
|
|
|
|
|
|
|
|
|
story = get_story(id) |
|
|
|
|
if story: |
|
|
|
|
story = story['story'] |
|
|
|
|
else: |
|
|
|
|
return abort(404) |
|
|
|
|
|
|
|
|
|
score = story['score'] |
|
|
|
|
num_comments = story['num_comments'] |
|
|
|
|
source = story['source'] |
|
|
|
|
description = '{} point{}, {} comment{} on {}'.format( |
|
|
|
|
score, 's' if score != 1 else '', |
|
|
|
|
num_comments, 's' if num_comments != 1 else '', |
|
|
|
|
source) |
|
|
|
|
url = urlparse(story['url']).hostname.replace('www.', '') |
|
|
|
|
|
|
|
|
|
return render_template('index.html', |
|
|
|
|
title=story['title'], |
|
|
|
|
url=url, |
|
|
|
|
description=description) |
|
|
|
|
|
|
|
|
|
print('Starting Flask...') |
|
|
|
|
web_thread = threading.Thread(target=flask_app.run, kwargs={'port': 33842}) |
|
|
|
|