Improve loading times, improve proxy, remove invidious links
This commit is contained in:
parent
809dd1ad36
commit
70630e939e
@ -19,8 +19,9 @@ import re
|
|||||||
# Instances - Format must be instance.tld (No '/' and no 'https://')
|
# Instances - Format must be instance.tld (No '/' and no 'https://')
|
||||||
nitterInstance = "https://nitter.net/"
|
nitterInstance = "https://nitter.net/"
|
||||||
nitterInstanceII = "https://nitter.mastodont.cat/"
|
nitterInstanceII = "https://nitter.mastodont.cat/"
|
||||||
|
|
||||||
|
ytChannelRss = "https://www.youtube.com/feeds/videos.xml?channel_id="
|
||||||
invidiousInstance = "invidio.us"
|
invidiousInstance = "invidio.us"
|
||||||
proxy = "" #eg. socks5://IP:PORT
|
|
||||||
|
|
||||||
#########################
|
#########################
|
||||||
#### Twitter Logic ######
|
#### Twitter Logic ######
|
||||||
@ -197,33 +198,16 @@ def user(username):
|
|||||||
#########################
|
#########################
|
||||||
#### Youtube Logic ######
|
#### Youtube Logic ######
|
||||||
#########################
|
#########################
|
||||||
@app.route('/invidious', methods=['GET', 'POST'])
|
@app.route('/youtube', methods=['GET', 'POST'])
|
||||||
@login_required
|
@login_required
|
||||||
def invidious():
|
def youtube():
|
||||||
start_time = time.time()
|
start_time = time.time()
|
||||||
form = ChannelForm()
|
|
||||||
if form.validate_on_submit():
|
|
||||||
channelId = form.channelId.data
|
|
||||||
if requests.get('https://{instance}/feed/channel/{cid}'.format(instance=invidiousInstance, cid=channelId)).status_code == 200:
|
|
||||||
follow = invidiousFollow()
|
|
||||||
follow.channelId = channelId
|
|
||||||
follow.followers.append(current_user)
|
|
||||||
try:
|
|
||||||
db.session.add(follow)
|
|
||||||
db.session.commit()
|
|
||||||
flash("Added to list!")
|
|
||||||
except:
|
|
||||||
flash("Something went wrong. Try again!")
|
|
||||||
return redirect(url_for('invidious'))
|
|
||||||
else:
|
|
||||||
flash("Enter a valid Channel ID. Eg: UCJWCJCWOxBYSi5DhCieLOLQ")
|
|
||||||
return redirect(url_for('invidious'))
|
|
||||||
ids = current_user.youtube_following_list()
|
ids = current_user.youtube_following_list()
|
||||||
videos = getYoutubePosts(ids)
|
videos = getYoutubePosts(ids)
|
||||||
if videos:
|
if videos:
|
||||||
videos.sort(key=lambda x: x.date, reverse=True)
|
videos.sort(key=lambda x: x.date, reverse=True)
|
||||||
print("--- {} seconds fetching invidious feed---".format(time.time() - start_time))
|
print("--- {} seconds fetching invidious feed---".format(time.time() - start_time))
|
||||||
return render_template('invidious.html', videos=videos, form=form)
|
return render_template('invidious.html', videos=videos)
|
||||||
|
|
||||||
@app.route('/ytsearch', methods=['GET', 'POST'])
|
@app.route('/ytsearch', methods=['GET', 'POST'])
|
||||||
@login_required
|
@login_required
|
||||||
@ -301,18 +285,16 @@ def ytunfollow(channelId):
|
|||||||
flash("There was an error unfollowing the user. Try again.")
|
flash("There was an error unfollowing the user. Try again.")
|
||||||
return redirect(url_for('ytsearch'))
|
return redirect(url_for('ytsearch'))
|
||||||
|
|
||||||
@app.route('/video/<id>', methods=['POST', 'GET'])
|
@app.route('/watch', methods=['POST', 'GET'])
|
||||||
@login_required
|
@login_required
|
||||||
def video(id):
|
def watch():
|
||||||
if proxy:
|
id = request.args.get('v', None)
|
||||||
ydl_opts = {
|
ydl = YoutubeDL()
|
||||||
'proxy':proxy
|
|
||||||
}
|
|
||||||
else:
|
|
||||||
ydl_opts = {}
|
|
||||||
|
|
||||||
ydl = YoutubeDL(ydl_opts)
|
|
||||||
data = ydl.extract_info("{id}".format(id=id), download=False)
|
data = ydl.extract_info("{id}".format(id=id), download=False)
|
||||||
|
if data['formats'][-1]['url'].find("manifest.googlevideo") > 0:
|
||||||
|
flash("Livestreams are not yet supported!")
|
||||||
|
return redirect(url_for('youtube'))
|
||||||
|
|
||||||
video = {
|
video = {
|
||||||
'title':data['title'],
|
'title':data['title'],
|
||||||
'description':Markup(data['description']),
|
'description':Markup(data['description']),
|
||||||
@ -324,14 +306,20 @@ def video(id):
|
|||||||
}
|
}
|
||||||
return render_template("video.html", video=video)
|
return render_template("video.html", video=video)
|
||||||
|
|
||||||
## PROXY
|
## PROXY videos through Parasitter server to the client.
|
||||||
@app.route('/watch/<id>')
|
@app.route('/stream', methods=['GET'])
|
||||||
def watch(id):
|
@login_required
|
||||||
ydl = YoutubeDL()
|
def stream():
|
||||||
data = ydl.extract_info("{id}".format(id=id), download=False)
|
id = request.args.get('v', None)
|
||||||
req = requests.get(data['formats'][-2]['url'], stream = True)
|
if(id):
|
||||||
return Response(stream_with_context(req.iter_content(chunk_size=4096)), content_type = req.headers['content-type'])
|
ydl = YoutubeDL()
|
||||||
|
data = ydl.extract_info("{id}".format(id=id), download=False)
|
||||||
|
req = requests.get(data['formats'][-1]['url'], stream = True)
|
||||||
|
return Response(stream_with_context(req.iter_content(chunk_size=4096)), content_type = req.headers['content-type'])
|
||||||
|
else:
|
||||||
|
# Temporarilly play a blank video.
|
||||||
|
req = requests.get('https://cdn.plyr.io/static/blank.mp4', stream=True)
|
||||||
|
return Response(stream_with_context(req.iter_content(chunk_size=4096)), content_type = req.headers['content-type'])
|
||||||
|
|
||||||
#########################
|
#########################
|
||||||
#### General Logic ######
|
#### General Logic ######
|
||||||
@ -516,9 +504,8 @@ def getPosts(account):
|
|||||||
def getYoutubePosts(ids):
|
def getYoutubePosts(ids):
|
||||||
videos = []
|
videos = []
|
||||||
ydl = YoutubeDL()
|
ydl = YoutubeDL()
|
||||||
link = ydl.extract_info("https://www.youtube.com/watch?v=XCSfoiD8wUA", download=False)['formats'][-1]['url']
|
|
||||||
with FuturesSession() as session:
|
with FuturesSession() as session:
|
||||||
futures = [session.get('https://www.youtube.com/feeds/videos.xml?channel_id={id}'.format(instance=invidiousInstance, id=id.channelId)) for id in ids]
|
futures = [session.get('https://www.youtube.com/feeds/videos.xml?channel_id={id}'.format(id=id.channelId)) for id in ids]
|
||||||
for future in as_completed(futures):
|
for future in as_completed(futures):
|
||||||
resp = future.result()
|
resp = future.result()
|
||||||
rssFeed=feedparser.parse(resp.content)
|
rssFeed=feedparser.parse(resp.content)
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
<img src="{{video.videoThumb}}">
|
<img src="{{video.videoThumb}}">
|
||||||
</div>
|
</div>
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<a class="video-title" href="{{url_for('video', id=video.id)}}">{{video.videoTitle}}</a>
|
<a class="video-title" href="{{url_for('watch', v=video.id, _method='GET')}}">{{video.videoTitle}}</a>
|
||||||
<div class="meta">
|
<div class="meta">
|
||||||
<a href="{{video.channelUrl}}">{{video.channelName}}</a>
|
<a href="{{video.channelUrl}}">{{video.channelName}}</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
<a href="{{ url_for('search') }}" class="twitter item">Search</a>
|
<a href="{{ url_for('search') }}" class="twitter item">Search</a>
|
||||||
<a href="{{ url_for('following') }}" class="twitter item">Following</a>
|
<a href="{{ url_for('following') }}" class="twitter item">Following</a>
|
||||||
<a href="{{ url_for('saved') }}" class="twitter item">Saved</a>
|
<a href="{{ url_for('saved') }}" class="twitter item">Saved</a>
|
||||||
<a href="{{ url_for('invidious') }}" class="youtube item">Youtube</a>
|
<a href="{{ url_for('youtube') }}" class="youtube item">Youtube</a>
|
||||||
<a href="{{ url_for('ytsearch') }}" class="youtube item">Search</a>
|
<a href="{{ url_for('ytsearch') }}" class="youtube item">Search</a>
|
||||||
<a href="{{ url_for('logout') }}" class="item">Logout</a>
|
<a href="{{ url_for('logout') }}" class="item">Logout</a>
|
||||||
<a href="{{ url_for('settings') }}" class="item"><i class="cog icon"></i></a>
|
<a href="{{ url_for('settings') }}" class="item"><i class="cog icon"></i></a>
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
{% block content %}
|
{% block content %}
|
||||||
<div style="margin-top: 2em;" class="ui one column centered grid">
|
<div style="margin-top: 2em;" class="ui one column centered grid">
|
||||||
<video class="video-js vjs-default-skin" controls data-setup='{ "playbackRates": [0.5, 1, 1.25,1.5, 2] }' width="720" height="420" data-setup="{}">
|
<video class="video-js vjs-default-skin" controls data-setup='{ "playbackRates": [0.5, 1, 1.25,1.5, 2] }' width="720" height="420" data-setup="{}">
|
||||||
<source src="/watch/{{video.id}}" type="video/mp4">
|
<source src="/stream?v={{video.id}}" type="video/mp4">
|
||||||
</video>
|
</video>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user