Specify video height in html so page doesn't shift down after load

Use true video height extracted from youtube to handle videos
shorter than their quality size. (e.g. widescreen videos)
This commit is contained in:
James Taylor 2020-09-24 18:50:54 -07:00
parent 9f0d84ddb9
commit 20152a6316
3 changed files with 19 additions and 12 deletions

View File

@ -54,7 +54,6 @@
justify-self: center; justify-self: center;
max-width: 100%; max-width: 100%;
width: {{ theater_video_target_width }}px; width: {{ theater_video_target_width }}px;
max-height: {{ video_height }}px;
margin-bottom: 10px; margin-bottom: 10px;
background-color: var(--video-background-color); background-color: var(--video-background-color);
} }
@ -339,7 +338,7 @@ Reload without invidious (for usage of new identity button).</a>
</ol> </ol>
</div> </div>
{% else %} {% else %}
<video controls autofocus class="video"> <video controls autofocus class="video" height="{{ video_height }}px">
{% for video_source in video_sources %} {% for video_source in video_sources %}
<source src="{{ video_source['src'] }}" type="{{ video_source['type'] }}"> <source src="{{ video_source['src'] }}" type="{{ video_source['type'] }}">
{% endfor %} {% endfor %}

View File

@ -28,20 +28,21 @@ def get_video_sources(info):
max_resolution = 360 max_resolution = 360
else: else:
max_resolution = settings.default_resolution max_resolution = settings.default_resolution
for format in info['formats']: for fmt in info['formats']:
if not all(format[attr] for attr in ('height', 'width', 'ext', 'url')): if not all(fmt[attr] for attr in ('quality', 'width', 'ext', 'url')):
continue continue
if format['acodec'] and format['vcodec'] and format['height'] <= max_resolution: if fmt['acodec'] and fmt['vcodec'] and fmt['height'] <= max_resolution:
video_sources.append({ video_sources.append({
'src': format['url'], 'src': fmt['url'],
'type': 'video/' + format['ext'], 'type': 'video/' + fmt['ext'],
'height': format['height'], 'quality': fmt['quality'],
'width': format['width'], 'height': fmt['height'],
'width': fmt['width'],
}) })
#### order the videos sources so the preferred resolution is first ### #### order the videos sources so the preferred resolution is first ###
video_sources.sort(key=lambda source: source['height'], reverse=True) video_sources.sort(key=lambda source: source['quality'], reverse=True)
return video_sources return video_sources

View File

@ -348,12 +348,14 @@ def _extract_formats(info, player_response):
streaming_data.get('dash_manifest_url')) streaming_data.get('dash_manifest_url'))
for yt_fmt in yt_formats: for yt_fmt in yt_formats:
itag = yt_fmt.get('itag')
fmt = {} fmt = {}
fmt['itag'] = itag
fmt['ext'] = None fmt['ext'] = None
fmt['audio_bitrate'] = None fmt['audio_bitrate'] = None
fmt['acodec'] = None fmt['acodec'] = None
fmt['vcodec'] = None fmt['vcodec'] = None
fmt['itag'] = yt_fmt.get('itag')
fmt['width'] = yt_fmt.get('width') fmt['width'] = yt_fmt.get('width')
fmt['height'] = yt_fmt.get('height') fmt['height'] = yt_fmt.get('height')
fmt['file_size'] = yt_fmt.get('contentLength') fmt['file_size'] = yt_fmt.get('contentLength')
@ -368,7 +370,12 @@ def _extract_formats(info, player_response):
fmt['url'] = yt_fmt.get('url') fmt['url'] = yt_fmt.get('url')
fmt['s'] = cipher.get('s') fmt['s'] = cipher.get('s')
fmt['sp'] = cipher.get('sp') fmt['sp'] = cipher.get('sp')
fmt.update(_formats.get(str(yt_fmt.get('itag')), {}))
# update with information from big table
hardcoded_itag_info = _formats.get(str(itag), {})
for key, value in hardcoded_itag_info.items():
conservative_update(fmt, key, value) # prefer info from Youtube
fmt['quality'] = hardcoded_itag_info.get('height')
info['formats'].append(fmt) info['formats'].append(fmt)