From 3617e4813b862dd69d6bdb02e9a7f98cef9f8ab6 Mon Sep 17 00:00:00 2001 From: Sam <17427046+Samillion@users.noreply.github.com> Date: Wed, 6 Nov 2024 03:33:31 +0200 Subject: [PATCH 1/2] pause-indicator: add fallback color and reduce callbacks --- .../pause_indicator_lite.lua | 173 ++++++++---------- 1 file changed, 79 insertions(+), 94 deletions(-) diff --git a/extras/pause-indicator-lite/pause_indicator_lite.lua b/extras/pause-indicator-lite/pause_indicator_lite.lua index 42e6121..76d72d9 100644 --- a/extras/pause-indicator-lite/pause_indicator_lite.lua +++ b/extras/pause-indicator-lite/pause_indicator_lite.lua @@ -5,46 +5,45 @@ --]] --- options -local opts = { +local options = { -- indicator icon type - indicator_icon = "pause", -- Which icon to show as indicator? pause, play - indicator_stay = true, -- Should the pause indicator stay visible during pause? - indicator_stay_timeout = 0.6, -- If it doesn't stay, how long should it last? (seconds) + indicator_icon = "pause", -- indicator icon type. "pause", "play" + indicator_stay = true, -- keep indicator visibile during pause + indicator_timeout = 0.6, -- timeout (seconds) if indicator doesn't stay -- keybind - keybind_allow = true, -- Allow keybind to toggle pause - keybind_set = "mbtn_left", -- The set keybind to toggle pause - keybind_mode = "onpause", -- Mode to activate keybind. onpause, always + keybind_allow = true, -- allow keybind to toggle pause + keybind_set = "mbtn_left", -- the used keybind to toggle pause + keybind_mode = "onpause", -- mode to activate keybind. "onpause", "always" -- icon colors & opacity - icon_color = "#FFFFFF", -- Icon fill color - icon_border_color = "#111111", -- Icon border color - icon_opacity = 40, -- Icon opacity (0-100) + icon_color = "#FFFFFF", -- icon fill color + icon_border_color = "#111111", -- icon border color + icon_opacity = 40, -- icon opacity (0-100) -- pause icon - rectangles_width = 30, -- Width of rectangles - rectangles_height = 80, -- Height of rectangles - rectangles_spacing = 20, -- Spacing between the two rectangles + rectangles_width = 30, -- width of rectangles + rectangles_height = 80, -- height of rectangles + rectangles_spacing = 20, -- spacing between the two rectangles -- play icon - triangle_width = 80, -- Width of triangle + triangle_width = 80, -- width of triangle triangle_height = 80, -- height of triangle -- best with pause icon - flash_play_icon = true, -- Flash play icon on unpause? - flash_icon_timeout = 0.3, -- How long should the flash last? - flash_icon_bigger_by = 0 -- Increase flash icon size from default by (0-100) + flash_play_icon = true, -- flash play icon on unpause + flash_icon_timeout = 0.3, -- timeout (seconds) for flash icon } -local msg = require 'mp.msg' +local msg = require "mp.msg" -- convert color from hex (credit to mpv/osc.lua) local function convert_color(color) if color:find("^#%x%x%x%x%x%x$") == nil then - msg.warn("'" .. color .. "' is not a valid color") + msg.warn("'" .. color .. "' is not a valid color, using default '#FFFFFF'") + return "FFFFFF" -- color fallback end - return color:sub(6,7) .. color:sub(4,5) .. color:sub(2,3) + return color:sub(6,7) .. color:sub(4,5) .. color:sub(2,3) end -- convert percentage opacity (0-100) to ASS alpha values @@ -54,109 +53,95 @@ local function convert_opacity(value) end -- colors and opaicty -local icon_color = convert_color(opts.icon_color) -local icon_border_color = convert_color(opts.icon_border_color) -local icon_opacity = convert_opacity(opts.icon_opacity) - --- rectangles parameters -local rect_width = opts.rectangles_width -local rect_height = opts.rectangles_height -local rect_spacing = opts.rectangles_spacing - --- triangle parameters -local triangle_width = opts.triangle_width -local triangle_height = opts.triangle_height - --- draw rectangles -local rectangles = string.format([[{\an5\p1\alpha&H%s\1c&H%s&\3c&H%s&}]], - icon_opacity, icon_color, icon_border_color) .. - string.format([[m 0 0 l %d 0 l %d %d l 0 %d m %d 0 l %d 0 l %d %d l %d %d]], - rect_width, rect_width, rect_height, rect_height, rect_width + rect_spacing, - rect_width + rect_spacing + rect_width, rect_width + rect_spacing + rect_width, - rect_height, rect_width + rect_spacing, rect_height) - --- draw triangle -local triangle = string.format([[{\an5\p1\alpha&H%s\1c&H%s&\3c&H%s&}]], - icon_opacity, icon_color, icon_border_color) .. - string.format([[m 0 0 l %d %d l 0 %d]], - triangle_width, triangle_height / 2, triangle_height) +local icon_color = convert_color(options.icon_color) +local icon_border_color = convert_color(options.icon_border_color) +local icon_opacity = convert_opacity(options.icon_opacity) + +-- pause icon +local function draw_rectangles() + return string.format([[{\an5\p1\alpha&H%s\1c&H%s&\3c&H%s&}m 0 0 l %d 0 l %d %d l 0 %d m %d 0 l %d 0 l %d %d l %d %d]], + icon_opacity, icon_color, icon_border_color, options.rectangles_width, options.rectangles_width, options.rectangles_height, options.rectangles_height, + options.rectangles_width + options.rectangles_spacing, options.rectangles_width * 2 + options.rectangles_spacing, options.rectangles_width * 2 + options.rectangles_spacing, options.rectangles_height, + options.rectangles_width + options.rectangles_spacing, options.rectangles_height) +end + +-- play icon +local function draw_triangle() + return string.format([[{\an5\p1\alpha&H%s\1c&H%s&\3c&H%s&}m 0 0 l %d %d l 0 %d]], + icon_opacity, icon_color, icon_border_color, options.triangle_width, options.triangle_height / 2, options.triangle_height) +end -- init local indicator = mp.create_osd_overlay("ass-events") local flash = mp.create_osd_overlay("ass-events") --- draw and update position based on window size -local function update_pause_indicator_position() +-- keep track of pause toggle +local toggled = false + +-- draw and update indicator +local function update_indicator() local _, _, display_aspect = mp.get_osd_size() - if display_aspect == 0 then return end + if display_aspect == 0 or (indicator.visible and not toggled) then return end + + indicator.data = options.indicator_icon == "play" and draw_triangle() or draw_rectangles() + indicator:update() - local icon = opts.indicator_icon == "play" and triangle or rectangles - indicator.data = icon + if not options.indicator_stay then + mp.add_timeout(options.indicator_timeout, function() indicator:remove() end) + end end -- flash play icon local function flash_icon() - if not opts.flash_play_icon then return flash:remove() end - - local mod = opts.flash_icon_bigger_by - -- set parameters for the flash play icon - local flash_play = string.format([[{\an5\p1\alpha&H%s\1c&H%s&\3c&H%s&}]], - icon_opacity, icon_color, icon_border_color) .. - string.format([[m 0 0 l %d %d l 0 %d]], - triangle_width + mod, (triangle_height + mod) / 2, triangle_height + mod) - - flash.data = flash_play + if not options.flash_play_icon then return end + flash.data = draw_triangle() flash:update() + mp.add_timeout(options.flash_icon_timeout, function() flash:remove() end) +end - -- set timeout for the flash icon - mp.add_timeout(opts.flash_icon_timeout, function() +-- check if file is video +local function is_video() + local t = mp.get_property_native("current-tracks/video") + if t and not (t.image or t.albumart) then + return true + else + indicator:remove() flash:remove() - end) + return false + end end --- keep track of pause toggle -local toggled = false - -- observe when pause state changes mp.observe_property("pause", "bool", function(_, paused) - mp.add_timeout(0.1, function() - if paused then - update_pause_indicator_position() - indicator:update() - toggled = true - if not opts.indicator_stay then - mp.add_timeout(opts.indicator_stay_timeout, function() indicator:remove() end) - end - if opts.flash_play_icon then - flash:remove() - end - else - indicator:remove() - if toggled then - flash_icon() - toggled = false - end + if not is_video() then return mp.unobserve_property("pause") end + if paused then + update_indicator() + toggled = true + else + indicator:remove() + if toggled then + flash_icon() + toggled = false end - end) + end - -- set keybind (only if opts allow it) - if opts.keybind_allow == true then + -- keybind setup (if options allow it) + if options.keybind_allow == true then mp.set_key_bindings({ - {opts.keybind_set, function() mp.commandv("cycle", "pause") end} + {options.keybind_set, function() mp.commandv("cycle", "pause") end} }, "pause-indicator", "force") - if opts.keybind_mode == "always" or (opts.keybind_mode == "onpause" and paused) then + if options.keybind_mode == "always" or (options.keybind_mode == "onpause" and paused) then mp.enable_key_bindings("pause-indicator") - elseif opts.keybind_mode == "onpause" and not paused then + else mp.disable_key_bindings("pause-indicator") end end end) --- update pause indicator position when window size changes +-- update pause indicator position if window size changes mp.observe_property("osd-dimensions", "native", function() if indicator and indicator.visible then - update_pause_indicator_position() - indicator:update() + update_indicator() end end) From 593f6fad7008c0140b8365ebe43fc25290c9b648 Mon Sep 17 00:00:00 2001 From: Sam <17427046+Samillion@users.noreply.github.com> Date: Wed, 6 Nov 2024 03:46:16 +0200 Subject: [PATCH 2/2] docs: update pause indicator options --- extras/pause-indicator-lite/README.md | 43 +++++++++++++-------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/extras/pause-indicator-lite/README.md b/extras/pause-indicator-lite/README.md index 1c5ce7c..b584faf 100644 --- a/extras/pause-indicator-lite/README.md +++ b/extras/pause-indicator-lite/README.md @@ -2,34 +2,33 @@ | ![pause-icon](https://github.com/user-attachments/assets/cd41333c-8fdd-4de9-8977-15eea95798dc) | ![play-icon](https://github.com/user-attachments/assets/0d1671f8-9b1b-4f10-ade3-82d1748b2d93) | |:---:|:---:| -A simple script that displays an indicator on pause, with options to adjust icon, color, height, width, opacity and whether to toggle pause with a keybind or not. +A simple script that displays an indicator on pause, with options to adjust icon type, color, height, width, opacity and whether to toggle pause with a keybind or not. I only decided to write this because the ones I found were either too complicated or too simple. The alternatives are great, this one just meets my simple use case scenario. **Script:** [Pause Indicator Lite](./pause_indicator_lite.lua) ### Indicator Options -Below is the full list for indicator options and their default values. To adjust them, simply change their values in `local opts` within the script. - -| Option | Value | Description | -|--------------------------|-------------|-----------------------------------------------------------------------------------------------------------------------------------------------| -| `indicator_icon` | "pause" | Which icon to show as indicator `pause`, `play` | -| `indicator_stay` | true | Should the pause indicator stay visible during pause? | -| `indicator_stay_timeout` | 0.6 | If it doesn't stay, how long should it last? (seconds) | -| `keybind_allow` | true | Allow keybind to toggle pause | -| `keybind_set` | "mbtn_left" | The set keybind to toggle pause [[reference](https://github.com/mpv-player/mpv/blob/master/etc/input.conf)] | -| `keybind_mode` | "onpause" | Mode to activate keybind.
`onpause`: only active when video is paused, to unpause
`always`: always active to toggle pause/unpause | -| `icon_color` | "#FFFFFF" | Icon fill color | -| `icon_border_color` | "#111111" | Icon border color | -| `icon_opacity` | 40 | Icon opacity (0-100) | -| `rectangles_width` | 30 | Width of rectangles (pause icon) | -| `rectangles_height` | 80 | Height of rectangles (pause icon) | -| `rectangles_spacing` | 20 | Spacing between the two rectangles (pause icon) | -| `triangle_width` | 80 | Width of triangle (play icon) | -| `triangle_height` | 80 | Height of triangle (play icon) | -| `flash_play_icon` | true | Flash play icon on unpause? (best with pause indicator icon) | -| `flash_icon_timeout` | 0.3 | How long should the flash last? (seconds) | -| `flash_icon_bigger_by` | 0 | Increase flash icon size from default by (0-100) | +Below is the full list for indicator options and their default values. To adjust them, simply change their values in `local options` within the script. + +| Option | Value | Description | +|--------------------------|-------------|--------------------------------------------------------------------------------------------------------------------------------------| +| `indicator_icon` | "pause" | indicator icon type. `pause`, `play` | +| `indicator_stay` | true | keep indicator visibile during pause | +| `indicator_timeout` | 0.6 | timeout (seconds) if indicator doesn't stay | +| `keybind_allow` | true | allow keybind to toggle pause | +| `keybind_set` | "mbtn_left" | the used keybind to toggle pause [[reference](https://github.com/mpv-player/mpv/blob/master/etc/input.conf)] | +| `keybind_mode` | "onpause" | mode to activate keybind.
`onpause`: only active when paused, to unpause
`always`: always active to toggle pause/unpause | +| `icon_color` | "#FFFFFF" | icon fill color | +| `icon_border_color` | "#111111" | icon border color | +| `icon_opacity` | 40 | icon opacity (0-100) | +| `rectangles_width` | 30 | width of rectangles (pause icon) | +| `rectangles_height` | 80 | height of rectangles (pause icon) | +| `rectangles_spacing` | 20 | spacing between the two rectangles (pause icon) | +| `triangle_width` | 80 | width of triangle (play icon) | +| `triangle_height` | 80 | height of triangle (play icon) | +| `flash_play_icon` | true | flash play icon on unpause (best with pause indicator icon) | +| `flash_icon_timeout` | 0.3 | timeout (seconds) for flash icon | ### How to install