Big efficiency improvements.

This commit is contained in:
Wire 2020-07-14 17:45:29 +02:00
parent 1b5cd47d81
commit 9ad8ab0970
2 changed files with 65 additions and 4 deletions

View File

@ -1,6 +1,8 @@
from flask_login import login_user, logout_user, current_user, login_required from flask_login import login_user, logout_user, current_user, login_required
from flask import render_template, flash, redirect, url_for, request from flask import render_template, flash, redirect, url_for, request
from app.forms import LoginForm, RegistrationForm, EmptyForm, SearchForm from app.forms import LoginForm, RegistrationForm, EmptyForm, SearchForm
from requests_futures.sessions import FuturesSession
from concurrent.futures import as_completed
from app.models import User, twitterPost from app.models import User, twitterPost
from werkzeug.urls import url_parse from werkzeug.urls import url_parse
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
@ -18,14 +20,20 @@ nitterInstanceII = "https://nitter.mastodont.cat"
@app.route('/index') @app.route('/index')
@login_required @login_required
def index(): def index():
start_time = time.time()
following = current_user.following_list() following = current_user.following_list()
followed = current_user.followed.count() followed = current_user.followed.count()
posts = [] posts = []
avatarPath = "img/avatars/1.png" avatarPath = "img/avatars/1.png"
form = EmptyForm() form = EmptyForm()
[posts.extend(getPosts(fwd.username)) for fwd in following] posts.extend(getFeed(following))
posts.sort(key=lambda x: x.timeStamp, reverse=True) posts.sort(key=lambda x: x.timeStamp, reverse=True)
return render_template('index.html', title='Home', posts=posts, avatar=avatarPath, followedCount=followed, form=form) if not posts:
profilePic = avatarPath
else:
profilePic = posts[0].userProfilePic
print("--- {} seconds fetching feed---".format(time.time() - start_time))
return render_template('index.html', title='Home', posts=posts, avatar=avatarPath, profilePic = profilePic, followedCount=followed, form=form)
@app.route('/login', methods=['GET', 'POST']) @app.route('/login', methods=['GET', 'POST'])
def login(): def login():
@ -194,7 +202,11 @@ def user(username):
posts.extend(getPosts(username)) posts.extend(getPosts(username))
form = EmptyForm() form = EmptyForm()
user = User.query.filter_by(username=username).first() user = User.query.filter_by(username=username).first()
return render_template('user.html', user=user, posts=posts, form=form) if not posts:
profilePic = avatarPath
else:
profilePic = posts[0].userProfilePic
return render_template('user.html', user=user, posts=posts, profilePic = profilePic, form=form)
def getTimeDiff(t): def getTimeDiff(t):
tweetTime = datetime.datetime(*t[:6]) tweetTime = datetime.datetime(*t[:6])
@ -210,11 +222,50 @@ def getTimeDiff(t):
return timeString return timeString
def isTwitterUser(username): def isTwitterUser(username):
request = requests.get('https://nitter.net/{}'.format(username), timeout=1) request = requests.get('https://nitter.net/{}/rss'.format(username), timeout=5)
if request.status_code == 404: if request.status_code == 404:
return False return False
return True return True
def getFeed(urls):
avatarPath = "img/avatars/{}.png".format(str(random.randint(1,12)))
feedPosts = []
with FuturesSession() as session:
futures = [session.get('https://nitter.net/{}/rss'.format(u.username)) for u in urls]
for future in as_completed(futures):
resp = future.result()
rssFeed=feedparser.parse(resp.content)
if rssFeed.entries != []:
for post in rssFeed.entries:
newPost = twitterPost()
newPost.username = rssFeed.feed.title.split("/")[1].replace(" ", "")
newPost.twitterName = rssFeed.feed.title.split("/")[0]
newPost.date = getTimeDiff(post.published_parsed)
newPost.timeStamp = datetime.datetime(*post.published_parsed[:6])
newPost.op = post.author
try:
newPost.userProfilePic = rssFeed.channel.image.url
except:
newPost.profilePicture = ""
newPost.urlToPost = post.link
newPost.content = Markup(post.description)
if "Pinned" in post.title.split(":")[0]:
newPost.isPinned = True
if "RT by" in post.title:
newPost.isRT = True
newPost.profilePic = ""
else:
newPost.isRT = False
try:
newPost.profilePic = rssFeed.channel.image.url
except:
newPost.profilePic = avatarPath
feedPosts.append(newPost)
time.sleep(1)
return feedPosts
def getPosts(account): def getPosts(account):
avatarPath = "img/avatars/{}.png".format(str(random.randint(1,12))) avatarPath = "img/avatars/{}.png".format(str(random.randint(1,12)))
posts = [] posts = []

View File

@ -1,4 +1,6 @@
aiohttp==3.6.2
alembic==1.4.2 alembic==1.4.2
async-timeout==3.0.1
attrs==19.3.0 attrs==19.3.0
beautifulsoup4==4.9.1 beautifulsoup4==4.9.1
bs4==0.0.1 bs4==0.0.1
@ -15,6 +17,9 @@ Flask-Migrate==2.5.3
Flask-SQLAlchemy==2.4.3 Flask-SQLAlchemy==2.4.3
Flask-WTF==0.14.3 Flask-WTF==0.14.3
future==0.18.2 future==0.18.2
gevent==20.6.2
greenlet==0.4.16
grequests==0.6.0
idna==2.10 idna==2.10
itsdangerous==1.1.0 itsdangerous==1.1.0
Jinja2==2.11.2 Jinja2==2.11.2
@ -22,14 +27,19 @@ llvmlite==0.33.0
lxml==4.5.2 lxml==4.5.2
Mako==1.1.3 Mako==1.1.3
MarkupSafe==1.1.1 MarkupSafe==1.1.1
multidict==4.7.6
numpy==1.19.0 numpy==1.19.0
python-dateutil==2.8.1 python-dateutil==2.8.1
python-dotenv==0.14.0 python-dotenv==0.14.0
python-editor==1.0.4 python-editor==1.0.4
requests==2.24.0 requests==2.24.0
requests-futures==1.0.0
six==1.15.0 six==1.15.0
soupsieve==2.0.1 soupsieve==2.0.1
SQLAlchemy==1.3.18 SQLAlchemy==1.3.18
urllib3==1.25.9 urllib3==1.25.9
Werkzeug==1.0.1 Werkzeug==1.0.1
WTForms==2.3.1 WTForms==2.3.1
yarl==1.4.2
zope.event==4.4
zope.interface==5.1.0