Add stream quality menu

ref #9
This commit is contained in:
Tomas Sardyha
2020-11-05 17:06:03 +01:00
parent 5e243e86bf
commit c9b22efc2d
3 changed files with 60 additions and 0 deletions

View File

@@ -131,6 +131,8 @@ total_time=no
autohide=no autohide=no
# can be: none, flash, static # can be: none, flash, static
pause_indicator=flash pause_indicator=flash
# sizes to list in stream quality menu
stream_quality_options=4320,2160,1440,1080,720,480,360,240,144
# load first file when calling next on a last file in a directory and vice versa # load first file when calling next on a last file in a directory and vice versa
directory_navigation_loops=no directory_navigation_loops=no
# file types to look for when navigating media files # file types to look for when navigating media files
@@ -270,6 +272,10 @@ Playlist navigation.
Chapter navigation. Chapter navigation.
#### `stream-quality`
Switch stream quality. This is just a basic re-assignment of `ytdl-format` mpv property from predefined options (configurable with `stream_quality_options`) and video reload, there is no fetching of available formats going on.
#### `open-file` #### `open-file`
Open file menu. Browsing starts in current file directory, or user directory when file not available. Open file menu. Browsing starts in current file directory, or user directory when file not available.

View File

@@ -79,6 +79,8 @@ total_time=no
autohide=no autohide=no
# can be: none, flash, static # can be: none, flash, static
pause_indicator=flash pause_indicator=flash
# sizes to list in stream quality menu
stream_quality_options=4320,2160,1440,1080,720,480,360,240,144
# load first file when calling next on a last file in a directory and vice versa # load first file when calling next on a last file in a directory and vice versa
directory_navigation_loops=no directory_navigation_loops=no
# file types to look for when navigating media files # file types to look for when navigating media files

View File

@@ -100,6 +100,8 @@ total_time=no
autohide=no autohide=no
# can be: none, flash, static # can be: none, flash, static
pause_indicator=flash pause_indicator=flash
# sizes to list in stream quality menu
stream_quality_options=4320,2160,1440,1080,720,480,360,240,144
# load first file when calling next on a last file in a directory and vice versa # load first file when calling next on a last file in a directory and vice versa
directory_navigation_loops=no directory_navigation_loops=no
# file types to look for when navigating media files # file types to look for when navigating media files
@@ -169,6 +171,7 @@ Key script-binding uosc/audio
Key script-binding uosc/video Key script-binding uosc/video
Key script-binding uosc/playlist Key script-binding uosc/playlist
Key script-binding uosc/chapters Key script-binding uosc/chapters
Key script-binding uosc/stream-quality
Key script-binding uosc/open-file Key script-binding uosc/open-file
Key script-binding uosc/next Key script-binding uosc/next
Key script-binding uosc/prev Key script-binding uosc/prev
@@ -254,6 +257,7 @@ local options = {
font_bold = false, font_bold = false,
autohide = false, autohide = false,
pause_indicator = 'flash', pause_indicator = 'flash',
stream_quality_options = '4320,2160,1440,1080,720,480,360,240,144',
directory_navigation_loops = false, directory_navigation_loops = false,
media_types = '3gp,asf,avi,bmp,flac,flv,gif,h264,h265,jpeg,jpg,m4a,m4v,mid,midi,mkv,mov,mp3,mp4,mp4a,mp4v,mpeg,mpg,oga,ogg,ogm,ogv,opus,png,rmvb,svg,tif,tiff,wav,weba,webm,webp,wma,wmv', media_types = '3gp,asf,avi,bmp,flac,flv,gif,h264,h265,jpeg,jpg,m4a,m4v,mid,midi,mkv,mov,mp3,mp4,mp4a,mp4v,mpeg,mpg,oga,ogg,ogm,ogv,opus,png,rmvb,svg,tif,tiff,wav,weba,webm,webp,wma,wmv',
subtitle_types = 'aqt,gsub,jss,sub,ttxt,pjs,psb,rt,smi,slt,ssf,srt,ssa,ass,usf,idx,vt', subtitle_types = 'aqt,gsub,jss,sub,ttxt,pjs,psb,rt,smi,slt,ssf,srt,ssa,ass,usf,idx,vt',
@@ -2908,6 +2912,7 @@ options.proximity_out = math.max(options.proximity_out, options.proximity_in + 1
options.chapters = itable_find({'dots', 'lines', 'lines-top', 'lines-bottom'}, options.chapters) and options.chapters or 'none' options.chapters = itable_find({'dots', 'lines', 'lines-top', 'lines-bottom'}, options.chapters) and options.chapters or 'none'
options.media_types = split(options.media_types, ' *, *') options.media_types = split(options.media_types, ' *, *')
options.subtitle_types = split(options.subtitle_types, ' *, *') options.subtitle_types = split(options.subtitle_types, ' *, *')
options.stream_quality_options = split(options.stream_quality_options, ' *, *')
options.timeline_cached_ranges = (function() options.timeline_cached_ranges = (function()
if options.timeline_cached_ranges == '' or options.timeline_cached_ranges == 'no' then return nil end if options.timeline_cached_ranges == '' or options.timeline_cached_ranges == 'no' then return nil end
local parts = split(options.timeline_cached_ranges, ':') local parts = split(options.timeline_cached_ranges, ':')
@@ -3208,6 +3213,53 @@ mp.add_key_binding(nil, 'show-in-directory', function()
end end
end end
end) end)
mp.add_key_binding(nil, 'stream-quality', function()
if menu:is_open('stream-quality') then menu:close() return end
local ytdl_format = mp.get_property_native('ytdl-format')
local active_item = nil
local formats = {}
for index, height in ipairs(options.stream_quality_options) do
local format = 'bestvideo[height<=?'..height..']+bestaudio/best[height<=?'..height..']'
formats[#formats + 1] = {
title = height..'p',
value = format
}
if format == ytdl_format then active_item = index end
end
menu:open(formats, function(format)
mp.set_property('ytdl-format', format)
-- Reload the video to apply new format
-- This is taken from https://github.com/jgreco/mpv-youtube-quality
-- which is in turn taken from https://github.com/4e6/mpv-reload/
-- Dunno if playlist_pos shenanigans below are necessary.
local playlist_pos = mp.get_property_number('playlist-pos')
local duration = mp.get_property_native('duration')
local time_pos = mp.get_property('time-pos')
mp.set_property_number('playlist-pos', playlist_pos)
-- Tries to determine live stream vs. pre-recordered VOD. VOD has non-zero
-- duration property. When reloading VOD, to keep the current time position
-- we should provide offset from the start. Stream doesn't have fixed start.
-- Decent choice would be to reload stream from it's current 'live' positon.
-- That's the reason we don't pass the offset when reloading streams.
if duration and duration > 0 then
local function seeker()
mp.commandv('seek', time_pos, 'absolute')
mp.unregister_event(seeker)
end
mp.register_event('file-loaded', seeker)
end
end, {
type = 'stream-quality',
title = 'Stream quality',
active_item = active_item,
})
end)
mp.add_key_binding(nil, 'open-file', function() mp.add_key_binding(nil, 'open-file', function()
if menu:is_open('open-file') then menu:close() return end if menu:is_open('open-file') then menu:close() return end