Skip to content

Commit 654b9ef

Browse files
authored
Merge pull request #26 from maoiscat/dev01
Dev01
2 parents fd2e846 + 5d76c47 commit 654b9ef

File tree

3 files changed

+97
-33
lines changed

3 files changed

+97
-33
lines changed

README.md

+9-8
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
# mpv-osc-modern
22

3-
updated 2022.7.8
3+
VER 1.1.0
44

5-
I have to say sorry that I misspelled the word "modern" to "morden". Now it is corrected.
5+
changelog:
6+
1. Gui activation area is limited to gui area.
7+
2. Time slider show chapter name in tooltip.
8+
3. Volume slider show volume number in tooltip.
9+
4. Volume slider use processed volume number to make loudness transition fluent.
10+
5. Mouse wheel up/down over volume slider to change volume.
611

7-
This osc is updated to provide a mute button and a simple volume slider, yet they can be disabled through the conf file.
8-
9-
This modern.lua file is coded with [Lua](https://www.lua.org/), anyone can learn to develop his demanding feature.
10-
11-
---
12+
------
1213

1314
Yet another mpv osc script, based on mpv built-in osc
1415

@@ -48,7 +49,6 @@ Config file locates at "\~\~/script-opts/osc.conf". Supported options are listed
4849
minmousemove=3 -- minimum amount of pixels the mouse has to move between ticks to make the OSC show up
4950
iamaprogrammer=yes/no -- use native mpv values and disable OSC internal track list management (and some functions that depend on it)
5051
font='mpv-osd-symbols' -- default osc font
51-
seekbarhandlesize=1.0 -- size ratio of the slider handle range 0 ~ 1
5252
seekrange=yes/no -- show seekrange overlay
5353
seekrangealpha=128 -- transparency of seekranges
5454
seekbarkeyframes=yes/no -- use keyframes when dragging the seekbar
@@ -58,6 +58,7 @@ Config file locates at "\~\~/script-opts/osc.conf". Supported options are listed
5858
visibility=auto/yes/no -- only used at init to set visibility_mode(...)
5959
windowcontrols=auto/yes/no -- whether to show window controls
6060
volumecontrol=yes/no -- whether to show mute button and volumne slider
61+
processvolume=yes/no -- volume bar show processd volume
6162
language=eng/chs -- eng=English chs=Chinese
6263
```
6364

changelog.md

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Changelog
2+
|#|ACTION|CONTENT|
3+
|---|---|---|
4+
|1.|**remove**|user_opts.seekbarhandesize, since it causes side effects.|
5+
|2.|**add**|user_opts.processvolume. the processed volume is to keep the loudness transition fluent, since the internal control gives the loudness dropping to fast when volume is high|
6+
|3.|**add**|state.sys_volume.|
7+
|4.|**add**|state.proc_volume.|
8+
|5.|**add**|function set_volume(val)|
9+
|6.|**change**|inhibit slider.seekRange when nil|
10+
|7.|**change**|time slider show chapter name in tooltip|
11+
|8.|**change**|volume slider show volume in tooltip|
12+
|9.|**add**|when mouse over volume slider, wheel up/down change volume|
13+
|10.|**add**|mp.observer_property('volume', 'number')|

modern.lua

+75-25
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ local user_opts = {
2929
-- internal track list management (and some
3030
-- functions that depend on it)
3131
font = 'mpv-osd-symbols', -- default osc font
32-
seekbarhandlesize = 1.0, -- size ratio of the slider handle, range 0 ~ 1
3332
seekrange = true, -- show seekrange overlay
3433
seekrangealpha = 128, -- transparency of seekranges
3534
seekbarkeyframes = true, -- use keyframes when dragging the seekbar
@@ -40,6 +39,7 @@ local user_opts = {
4039
visibility = 'auto', -- only used at init to set visibility_mode(...)
4140
windowcontrols = 'auto', -- whether to show window controls
4241
volumecontrol = true, -- whether to show mute button and volumne slider
42+
processvolume = true, -- volue slider show processd volume
4343
language = 'eng', -- eng=English, chs=Chinese
4444
}
4545

@@ -135,7 +135,9 @@ local state = {
135135
maximized = false,
136136
osd = mp.create_osd_overlay('ass-events'),
137137
mute = false,
138-
lastvisibility = user_opts.visibility, -- save last visibility on pause if showtitle
138+
lastvisibility = user_opts.visibility, -- save last visibility on pause if showtitle
139+
sys_volume, --system volume
140+
proc_volume, --processed volume
139141
}
140142

141143
local window_control_box_width = 138
@@ -324,7 +326,14 @@ function ass_draw_rr_h_ccw(ass, x0, y0, x1, y1, r1, hexagon, r2)
324326
end
325327
end
326328

327-
329+
-- set volume
330+
function set_volume(val)
331+
if user_opts.processvolume then
332+
val = 10*math.sqrt(val)
333+
end
334+
mp.commandv('set', 'volume', val)
335+
mp.commandv('add', 'volume', 0) --this prevent volume exceeds limit
336+
end
328337
--
329338
-- Tracklist Management
330339
--
@@ -485,7 +494,7 @@ function prepare_elements()
485494
--draw static slider parts
486495
local slider_lo = element.layout.slider
487496
-- calculate positions of min and max points
488-
element.slider.min.ele_pos = user_opts.seekbarhandlesize * elem_geo.h / 2
497+
element.slider.min.ele_pos = elem_geo.h / 2
489498
element.slider.max.ele_pos = elem_geo.w - element.slider.min.ele_pos
490499
element.slider.min.glob_pos = element.hitbox.x1 + element.slider.min.ele_pos
491500
element.slider.max.glob_pos = element.hitbox.x1 + element.slider.max.ele_pos
@@ -584,16 +593,16 @@ function render_elements(master_ass)
584593
local s_max = element.slider.max.value
585594
-- draw pos marker
586595
local pos = element.slider.posF()
587-
local seekRanges = element.slider.seekRangesF()
588-
local rh = user_opts.seekbarhandlesize * elem_geo.h / 2 -- Handle radius
596+
local seekRanges
597+
local rh = elem_geo.h / 2 -- Handle radius
589598
local xp
590599

591600
if pos then
592601
xp = get_slider_ele_pos_for(element, pos)
593602
ass_draw_cir_cw(elem_ass, xp, elem_geo.h/2, rh)
594603
elem_ass:rect_cw(0, slider_lo.gap, xp, elem_geo.h - slider_lo.gap)
595604
end
596-
605+
if element.slider.seekRangesF ~= nil then seekRanges = element.slider.seekRangesF() end
597606
if seekRanges then
598607
elem_ass:draw_stop()
599608
elem_ass:merge(element.style_ass)
@@ -991,8 +1000,9 @@ layouts = function ()
9911000
add_area('input', get_hitbox_coords(posX, posY, 1, osc_geo.w, 104))
9921001

9931002
-- area for show/hide
994-
add_area('showhide', 0, 0, osc_param.playresx, osc_param.playresy)
995-
1003+
add_area('showhide', 0, osc_param.playresy-200, osc_param.playresx, osc_param.playresy)
1004+
add_area('showhide_wc', osc_param.playresx*0.67, 0, osc_param.playresx, 48)
1005+
9961006
-- fetch values
9971007
local osc_w, osc_h=
9981008
osc_geo.w, osc_geo.h
@@ -1380,7 +1390,23 @@ function osc_init()
13801390
ne.slider.tooltipF = function (pos)
13811391
local duration = mp.get_property_number('duration', nil)
13821392
if not ((duration == nil) or (pos == nil)) then
1383-
possec = duration * (pos / 100)
1393+
local possec = duration * (pos / 100)
1394+
local chapters = mp.get_property_native('chapter-list', {})
1395+
if #chapters > 0 then
1396+
local ch = #chapters
1397+
local i
1398+
for i = 1, #chapters do
1399+
if chapters[i].time / duration * 100 >= pos then
1400+
ch = i - 1
1401+
break
1402+
end
1403+
end
1404+
if ch == 0 then
1405+
return string.format('[%s] [0/%d]', mp.format_time(possec), #chapters)
1406+
elseif chapters[ch].title then
1407+
return string.format('[%s] [%d/%d][%s]', mp.format_time(possec), ch, #chapters, chapters[ch].title)
1408+
end
1409+
end
13841410
return mp.format_time(possec)
13851411
else
13861412
return ''
@@ -1462,38 +1488,52 @@ function osc_init()
14621488
ne = new_element('volumebar', 'slider')
14631489
ne.visible = (osc_param.playresx >= 700) and user_opts.volumecontrol
14641490
ne.enabled = (get_track('audio')>0)
1465-
ne.slider.markerF = function ()
1466-
return {}
1467-
end
1468-
ne.slider.seekRangesF = function()
1469-
return nil
1470-
end
1491+
ne.slider.tooltipF =
1492+
function (pos)
1493+
local refpos = state.proc_volume
1494+
if refpos > 100 then refpos = 100 end
1495+
if pos+3 >= refpos and pos-3 <= refpos then
1496+
return string.format('%d', state.proc_volume)
1497+
else
1498+
return ''
1499+
end
1500+
end
1501+
ne.slider.markerF = nil
1502+
ne.slider.seekRangesF = nil
14711503
ne.slider.posF =
14721504
function ()
1473-
local val = mp.get_property_number('volume', nil)
1474-
return val*val/100
1505+
return state.proc_volume
14751506
end
14761507
ne.eventresponder['mouse_move'] =
14771508
function (element)
1478-
if not element.state.mbtnleft then return end -- allow drag for mbtnleft only!
1509+
if not element.state.mbtnleft then return end
14791510
local seekto = get_slider_value(element)
14801511
if (element.state.lastseek == nil) or
14811512
(not (element.state.lastseek == seekto)) then
1482-
mp.commandv('set', 'volume', 10*math.sqrt(seekto))
1513+
set_volume(seekto)
14831514
element.state.lastseek = seekto
14841515
end
14851516
end
14861517
ne.eventresponder['mbtn_left_down'] = --exact seeks on single clicks
14871518
function (element)
14881519
local seekto = get_slider_value(element)
1489-
mp.commandv('set', 'volume', 10*math.sqrt(seekto))
1520+
set_volume(seekto)
14901521
element.state.mbtnleft = true
14911522
end
14921523
ne.eventresponder['mbtn_left_up'] =
1493-
function (element) element.state.mbtnleft = false end
1524+
function (element)
1525+
element.state.mbtnleft = false
1526+
end
14941527
ne.eventresponder['reset'] =
14951528
function (element) element.state.lastseek = nil end
1496-
1529+
ne.eventresponder['wheel_up_press'] =
1530+
function (element)
1531+
set_volume(state.proc_volume+5)
1532+
end
1533+
ne.eventresponder['wheel_down_press'] =
1534+
function (element)
1535+
set_volume(state.proc_volume-5)
1536+
end
14971537
-- tc_left (current pos)
14981538
ne = new_element('tc_left', 'button')
14991539
ne.content = function () return (mp.get_property_osd('playback-time')) end
@@ -1576,7 +1616,7 @@ function pause_state(name, enabled)
15761616
if user_opts.showtitle then
15771617
if enabled then
15781618
state.lastvisibility = user_opts.visibility
1579-
visibility_mode("always", true)
1619+
visibility_mode('always', true)
15801620
show_osc()
15811621
else
15821622
visibility_mode(state.lastvisibility, true)
@@ -2005,6 +2045,16 @@ mp.observe_property('mute', 'bool',
20052045
state.mute = val
20062046
end
20072047
)
2048+
mp.observe_property('volume', 'number',
2049+
function(name, val)
2050+
state.sys_volume = val
2051+
if user_opts.processvolume then
2052+
state.proc_volume = val*val/100
2053+
else
2054+
state.proc_volume = val
2055+
end
2056+
end
2057+
)
20082058
mp.observe_property('border', 'bool',
20092059
function(name, val)
20102060
state.border = val
@@ -2098,7 +2148,7 @@ function visibility_mode(mode, no_osd)
20982148
elseif mode == 'never' then
20992149
enable_osc(false)
21002150
else
2101-
msg.warn('Ignoring unknown visibility mode \"' .. mode .. '\"')
2151+
msg.warn('Ignoring unknown visibility mode \'' .. mode .. '\'')
21022152
return
21032153
end
21042154

0 commit comments

Comments
 (0)