From 70c25f097f8a1d503b003c67797dc5d29fb2ccef Mon Sep 17 00:00:00 2001 From: pluja Date: Sat, 29 Aug 2020 22:35:29 +0200 Subject: [PATCH] Video seeking is now possible --- app/routes.py | 15 +++++++++++++-- app/templates/_video_item.html | 2 +- app/templates/video.html | 5 +++-- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/app/routes.py b/app/routes.py index eed2cd9..0d98f36 100644 --- a/app/routes.py +++ b/app/routes.py @@ -4,6 +4,7 @@ from app.models import User, twitterPost, ytPost, Post, youtubeFollow, twitterFo from flask_login import login_user, logout_user, current_user, login_required from flask import Flask, Response, stream_with_context from requests_futures.sessions import FuturesSession +from werkzeug.datastructures import Headers from concurrent.futures import as_completed from werkzeug.utils import secure_filename from youtube_search import YoutubeSearch @@ -12,6 +13,7 @@ from youtube_dl import YoutubeDL from numerize import numerize from bs4 import BeautifulSoup from app import app, db +from re import findall import random, string import time, datetime import feedparser @@ -321,18 +323,27 @@ def watch(): return render_template("video.html", video=video) ## PROXY videos through Parasitter server to the client. -@app.route('/stream', methods=['GET']) +@app.route('/stream', methods=['GET', 'POST']) @login_required def stream(): + #This function proxies the video stream from GoogleVideo to the client. id = request.args.get('v', None) + headers = Headers() if(id): ydl = YoutubeDL() data = ydl.extract_info("{id}".format(id=id), download=False) req = requests.get(data['formats'][-1]['url'], stream = True) - return Response(req.iter_content(chunk_size=10*1024), mimetype=req.headers['Content-Type'], direct_passthrough=True, content_type=req.headers['Content-Type']) + headers.add('Accept-Ranges','bytes') + headers.add('Content-Length', str(int(req.headers['Content-Length'])+1)) + response = Response(req.iter_content(chunk_size=12*1024), mimetype=req.headers['Content-Type'], content_type=req.headers['Content-Type'], direct_passthrough=True, headers=headers) + #enable browser file caching with etags + response.cache_control.public = True + response.cache_control.max_age = int(60000) + return response else: flash("Something went wrong loading the video... Try again.") return redirect(url_for('youtube')) + ######################### #### General Logic ###### ######################### diff --git a/app/templates/_video_item.html b/app/templates/_video_item.html index abcb958..f69e3b4 100644 --- a/app/templates/_video_item.html +++ b/app/templates/_video_item.html @@ -7,7 +7,7 @@
{{video.channelName}}
-
+
{{video.description}}
diff --git a/app/templates/video.html b/app/templates/video.html index 44c9d54..7b234bf 100644 --- a/app/templates/video.html +++ b/app/templates/video.html @@ -8,8 +8,9 @@