Add support for livestreams and scheduled videos on /watch

This commit is contained in:
pluja 2020-09-10 16:24:53 +02:00
parent 2a3668a645
commit 745b816864
7 changed files with 47 additions and 79 deletions

View File

@ -321,8 +321,13 @@ def watch():
id = request.args.get('v', None) id = request.args.get('v', None)
info = ytvids.get_video_info(id) info = ytvids.get_video_info(id)
hostName = urllib.parse.urlparse(info['video']['url']).netloc hostName = urllib.parse.urlparse(info['video']['url']).netloc
# Use nginx # Use nginx
try:
url = info['video']['url'].replace(hostName, config['serverName'])+"&hostname="+hostName url = info['video']['url'].replace(hostName, config['serverName'])+"&hostname="+hostName
except:
url = "#"
video={ video={
'title':info['video']['title'], 'title':info['video']['title'],
'description':Markup(markupString(info['video']['description'])), 'description':Markup(markupString(info['video']['description'])),

BIN
app/static/img/live.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View File

@ -4,6 +4,17 @@
{% extends "base.html" %} {% extends "base.html" %}
{% block content %} {% block content %}
<div class="ui text container"> <div class="ui text container">
{% if video.nginxUrl == "#" and video.isLive %}
<div class="ui center aligned text container">
<img alt="Empty feed image" class="ui image" src="{{ url_for('static',filename='img/live.png') }}">
</div>
{% elif video.isUpcoming %}
<div class="ui center aligned text container">
<div class="ui row">
<img alt="Empty feed image" class="ui image" src="{{ url_for('static',filename='img/scheduled.png') }}">
</div>
</div>
{%else%}
<div class="video-js-responsive-container vjs-hd"> <div class="video-js-responsive-container vjs-hd">
<video class="video-js vjs-default-skin" <video class="video-js vjs-default-skin"
data-setup='{ "playbackRates": [0.5, 1, 1.25,1.5, 2] }' data-setup='{ "playbackRates": [0.5, 1, 1.25,1.5, 2] }'
@ -18,6 +29,7 @@
{% endif %} {% endif %}
</video> </video>
</div> </div>
{%endif%}
<div class="ui segments"> <div class="ui segments">
<div class="ui segment"> <div class="ui segment">

0
youtube_data/channels.py Normal file
View File

View File

@ -1,59 +0,0 @@
import requests
import urllib.parse
import json
from bs4 import BeautifulSoup as bs
nested_renderer_dispatch = {
'singleColumnBrowseResultsRenderer',
'twoColumnBrowseResultsRenderer', # Channel renderer
'twoColumnSearchResultsRenderer',
}
# these renderers contain a list of renderers inside them
nested_renderer_list_dispatch = {
'sectionListRenderer',
'itemSectionRenderer',
'gridRenderer',
'playlistVideoListRenderer',
'singleColumnWatchNextResults',
}
_item_types = {
'movieRenderer',
'didYouMeanRenderer',
'showingResultsForRenderer',
'videoRenderer',
'compactVideoRenderer',
'compactAutoplayRenderer',
'videoWithContextRenderer',
'gridVideoRenderer',
'playlistVideoRenderer',
'playlistRenderer',
'compactPlaylistRenderer',
'gridPlaylistRenderer',
'radioRenderer',
'compactRadioRenderer',
'gridRadioRenderer',
'showRenderer',
'compactShowRenderer',
'gridShowRenderer',
'channelRenderer',
'compactChannelRenderer',
'gridChannelRenderer',
}
def getRenderers(data):
renderers = []
for renderer in nested_renderer_dispatch:
renderers.append(data['contents'][renderer])
return renderers
def getRenderedItems(renderer):
'''Given a renderer, return its items'''

View File

@ -17,19 +17,28 @@ def get_video_primary_info(datad, datai):
details = datad['videoDetails'] details = datad['videoDetails']
try: try:
isUpcoming = details['isUpcoming'] isUpcoming = details['isUpcoming']
views = "Scheduled video"
except: except:
isUpcoming = False isUpcoming = False
if not isUpcoming:
views = details['viewCount']
ydl = YoutubeDL() ydl = YoutubeDL()
try:
data = ydl.extract_info(details['videoId'], False) data = ydl.extract_info(details['videoId'], False)
if not details['isLiveContent']: if not details['isLiveContent']:
url = data['formats'][-1]['url'] url = data['formats'][-1]['url']
else:
url = data['formats'][-1]['url']
except:
url = "#"
try: try:
primaryInfo = { primaryInfo = {
"id": details['videoId'], "id": details['videoId'],
"title": details['title'], "title": details['title'],
"description": details['shortDescription'], "description": details['shortDescription'],
"views": details['viewCount'], "views": views,
"duration": details['lengthSeconds'], "duration": details['lengthSeconds'],
"date": item['dateText']['simpleText'], "date": item['dateText']['simpleText'],
"rating": details['averageRating'], "rating": details['averageRating'],
@ -53,9 +62,10 @@ def get_video_primary_info(datad, datai):
"rating": details['averageRating'], "rating": details['averageRating'],
"author": details['author'], "author": details['author'],
"isPrivate":False, "isPrivate":False,
"isLive":False, "isLive":details['isLiveContent'],
"isUpcoming":False, "isUpcoming":isUpcoming,
"allowRatings":True, "allowRatings":True,
"url":url,
"thumbnail": details['thumbnail']['thumbnails'][0]['url'] "thumbnail": details['thumbnail']['thumbnails'][0]['url']
} }
return primaryInfo return primaryInfo