add custom configs for mpv, enabled by default, switchable in settings
This commit is contained in:
parent
c79146b2ee
commit
725ca569bc
15 changed files with 510 additions and 35 deletions
|
@ -18,6 +18,9 @@
|
|||
<file>sounds/fanfare2.wav</file>
|
||||
<file>sounds/goodresult.wav</file>
|
||||
|
||||
<file>scripts/mpv/mpv.conf</file>
|
||||
<file>scripts/mpv/input.conf</file>
|
||||
|
||||
<file>scripts/adblock/adblock-server.js</file>
|
||||
<file>scripts/readability/readabilize-article.js</file>
|
||||
|
||||
|
|
431
resources/scripts/mpv/input.conf
Normal file
431
resources/scripts/mpv/input.conf
Normal file
|
@ -0,0 +1,431 @@
|
|||
# Mouse
|
||||
MOUSE_BTN0 ignore
|
||||
MOUSE_BTN0_DBL cycle fullscreen
|
||||
MOUSE_BTN2 cycle pause
|
||||
#MOUSE_BTN3 ignore
|
||||
#MOUSE_BTN4 ignore
|
||||
#MOUSE_BTN5 ignore
|
||||
#MOUSE_BTN6 ignore
|
||||
|
||||
# Trackpad
|
||||
AXIS_UP ignore
|
||||
AXIS_DOWN ignore
|
||||
AXIS_LEFT ignore
|
||||
AXIS_RIGHT ignore
|
||||
|
||||
# Arrow/navigation keys
|
||||
RIGHT osd-msg-bar seek +5 relative+keyframes
|
||||
LEFT osd-msg-bar seek -5 relative+keyframes
|
||||
SHIFT+RIGHT osd-msg-bar seek +1 relative+exact
|
||||
SHIFT+LEFT osd-msg-bar seek -1 relative+exact
|
||||
CTRL+RIGHT frame-step ; show-text "Frame: ${estimated-frame-number} / ${estimated-frame-count}"
|
||||
CTRL+LEFT frame-back-step ; show-text "Frame: ${estimated-frame-number} / ${estimated-frame-count}"
|
||||
|
||||
UP osd-msg-bar seek +30 relative+keyframes
|
||||
DOWN osd-msg-bar seek -30 relative+keyframes
|
||||
SHIFT+UP osd-msg-bar seek +120 relative+keyframes
|
||||
SHIFT+DOWN osd-msg-bar seek -120 relative+keyframes
|
||||
|
||||
PGUP osd-msg-bar seek +600 relative+keyframes
|
||||
PGDWN osd-msg-bar seek -600 relative+keyframes
|
||||
|
||||
SHIFT+PGUP osd-msg-bar seek +1200 relative+keyframes
|
||||
SHIFT+PGDWN osd-msg-bar seek +1200 relative+keyframes
|
||||
|
||||
ALT+RIGHT sub-seek +1 ; show-text "Sub Seek +1"
|
||||
ALT+LEFT sub-seek -1 ; show-text "Sub Seek -1"
|
||||
|
||||
#ALT+RIGHT add video-pan-x -0.01
|
||||
#ALT+LEFT add video-pan-x +0.01
|
||||
#ALT+UP add video-pan-y +0.01
|
||||
#ALT+DOWN add video-pan-y -0.01
|
||||
|
||||
#META+RIGHT add video-zoom +0.05
|
||||
#META+LEFT add video-zoom -0.05
|
||||
#META+UP add video-zoom +0.05
|
||||
#META+DOWN add video-zoom -0.05
|
||||
|
||||
# ` [1] [2] [3] [4] [5] [6] [7] [8] [9] [0] - =
|
||||
# ~ [!] @ # $ % ^ & * ( ) _ +
|
||||
|
||||
1 add contrast -1 ; show-text "ContrastT: ${contrast}"
|
||||
2 add contrast +1 ; show-text "ContrastT: ${contrast}"
|
||||
3 add brightness -1 ; show-text "Brightness: ${brightness}"
|
||||
4 add brightness +1 ; show-text "Brightness: ${brightness}"
|
||||
5 add gamma -1 ; show-text "Gamma: ${gamma}"
|
||||
6 add gamma +1 ; show-text "Gamma: ${gamma}"
|
||||
7 add saturation -1 ; show-text "Saturation: ${saturation}"
|
||||
8 add saturation +1 ; show-text "Saturation: ${saturation}"
|
||||
|
||||
9 add volume -2 ; show-text "Volume: ${volume}"
|
||||
0 add volume +2 ; show-text "Volume: ${volume}"
|
||||
|
||||
! cycle ontop
|
||||
|
||||
` ignore
|
||||
~ ignore
|
||||
# ignore
|
||||
$ ignore
|
||||
% ignore
|
||||
^ ignore
|
||||
& ignore
|
||||
* ignore
|
||||
§ ignore
|
||||
± ignore
|
||||
|
||||
# [q] [w] [e] [r] [t] [y] [u] [i] [o] [p] [ ]
|
||||
# [Q] [W] E R [T] [Y] [U] [I] O [P] { }
|
||||
|
||||
Q quit
|
||||
# q script-binding auto_save_state/quit-watch-later-conditional
|
||||
|
||||
w script-message osc-playlist
|
||||
W playlist-shuffle
|
||||
e playlist-prev ; show-text "${playlist-pos-1}/${playlist-count}"
|
||||
E ignore
|
||||
|
||||
r playlist-next ; show-text "${playlist-pos-1}/${playlist-count}"
|
||||
R ignore
|
||||
|
||||
t cycle-values sub-use-margins "yes" "no"
|
||||
T cycle-values ass-force-margins "yes" "no" # does not work with :blend-subtitles
|
||||
CTRL+t cycle-values blend-subtitles "yes" "video" "no"
|
||||
|
||||
y cycle-values stretch-image-subs-to-screen "yes" "no"
|
||||
Y cycle-values stretch-dvd-subs "yes" "no"
|
||||
|
||||
u cycle-values hwdec "auto" "no"
|
||||
U cycle-values vf "format=colorlevels=full" "format=colorlevels=auto" "format=colorlevels=limited"
|
||||
|
||||
i script-binding stats/display-stats
|
||||
I script-binding stats/display-stats-toggle
|
||||
o cycle-values osd-level 3 1
|
||||
O ignore
|
||||
p cycle-values video-rotate 90 180 270 0
|
||||
P cycle-values video-aspect "16:9" "4:3" "2.35:1" "16:10"
|
||||
|
||||
[ ignore
|
||||
] ignore
|
||||
{ ignore
|
||||
} ignore
|
||||
|
||||
# [a] [s] [d] [f] [g] [h] [j] [k] [l]
|
||||
# [A] [S] [D] [F] [G] [H] [J] [K] [L]
|
||||
|
||||
a cycle audio # switch audio streams
|
||||
A cycle-values af "lavfi=[dynaudnorm=f=200:g=5:r=0.1]" "" # dynamic range compression
|
||||
CTRL+a script-binding auto_audio_device/toggle-switching # toggle automatic audio device switching
|
||||
|
||||
s cycle sub # cycle through subtitles
|
||||
S cycle sub-visibility
|
||||
CTRL+s cycle secondary-sid
|
||||
|
||||
d cycle-values window-scale "1.5" "2.0" "3.0" "0.5" "1.0" ; show-text "Scale: ${window-scale}"
|
||||
D cycle edition
|
||||
CTRL+d cycle video
|
||||
|
||||
f cycle fullscreen ; show-text "Scale: ${window-scale}"
|
||||
F vf clr "" ; show-text "Filters cleared"
|
||||
|
||||
g cycle-values video-sync display-resample audio ; cycle-values interpolation yes no ; show-text "Interpolation: ${interpolation} (${tscale})"
|
||||
G cycle-values tscale "linear" "catmull_rom" "mitchell" "bicubic" "oversample" ; show-text "Interpolation: ${interpolation} (${tscale})"
|
||||
CTRL+g cycle-values interpolation no yes ; show-text "Interpolation: ${interpolation} (${tscale})"
|
||||
|
||||
h cycle deinterlace
|
||||
H script-binding autodeint
|
||||
|
||||
j cycle deband
|
||||
J vf toggle "lavfi=[hqdn3d=2.0]"
|
||||
|
||||
K ignore
|
||||
|
||||
l cycle-values loop-file yes no ; show-text "${?=loop-file==inf:Looping enabled (file)}${?=loop-file==no:Looping disabled (file)}"
|
||||
L cycle-values loop-playlist yes no ; show-text "${?=loop-playlist==inf:Looping enabled}${?=loop-playlist==no:Looping disabled}"
|
||||
CTRL+l ab-loop
|
||||
|
||||
# [z] [x] [c] [v] [b] [n] [m] [,] [.]
|
||||
# [Z] X C V [B] [N] [M] [<] [>]
|
||||
|
||||
x script-message osc-chapterlist
|
||||
X ignore
|
||||
c script-message osc-playlist
|
||||
C ignore
|
||||
v script-message osc-tracklist
|
||||
V ignore
|
||||
|
||||
b add speed +0.05
|
||||
B add speed -0.05
|
||||
CTRL+b set speed 1.0
|
||||
|
||||
n add audio-delay +0.10
|
||||
N add audio-delay -0.10
|
||||
CTRL+n set audio-delay 0
|
||||
|
||||
m add sub-delay +0.10
|
||||
M add sub-delay -0.10
|
||||
CTRL+m set sub-delay 0
|
||||
|
||||
, add sub-scale -0.05 # decrease subtitle font size
|
||||
< add sub-scale +0.05 # increase subtitle font size
|
||||
. add sub-pos -1 # move subtitles up
|
||||
> add sub-pos +1 # move subtitles down
|
||||
|
||||
# Adjust timing so that next/prev subtitle is displayed now
|
||||
/ sub-step +1 ; show-text "Sub Step +1 (timing adjustment)"
|
||||
? sub-step -1 ; show-text "Sub Step -1 (timing adjustment)"
|
||||
|
||||
# [esc] [space] [backspace]
|
||||
# [tab] [enter]
|
||||
|
||||
ESC cycle fullscreen
|
||||
SPACE cycle pause
|
||||
IDEOGRAPHIC_SPACE cycle pause
|
||||
TAB cycle mute
|
||||
ENTER show-progress
|
||||
|
||||
BS revert-seek
|
||||
SHIFT+BS set speed 1.0 ; set gamma 0 ; set brightness 0 ; set contrast 0 ; set saturation 0 ; set hue 0 ; show-text "Speed/Gamma/Brightness/Contrast/Saturation/Hue resetted"
|
||||
ALT+BS set video-pan-x 0 ; set video-pan-y 0 ; show-text "Pan resetted"
|
||||
META+BS set video-zoom 0 ; show-text "Zoom resetted"
|
||||
|
||||
# [F1] F2 F3 F4 F5 F6 F7 [F8] [F9] [F10] [F11] [F12]
|
||||
|
||||
F1 script-binding console/enable
|
||||
F8 vf toggle "interpolation=yes,tscale=oversample" ; show-text "Toggled Realtime Motion Interpolation (native) [interpolation=yes,tscale=oversample]" # Soap-opera effect for frame smoothing
|
||||
F9 apply-profile "upscale-lowres-using-GPU-shaders" ; show-text "Applied GPU upscaler shaders"
|
||||
F10 cycle-values speed 0.8 0.6 0.4 0.2 1 # Slow speed
|
||||
F11 cycle-values speed 1.2 1.4 1.6 1.8 2 1 # Faster speed
|
||||
F12 af toggle "lavfi=[loudnorm=I=-22:TP=-1.5:LRA=2]" # Useful audio normalization for low-audio or whispering scenes (can cause annoying background noise amplification)
|
||||
|
||||
# Numpad
|
||||
|
||||
KP0 ignore
|
||||
KP1 ignore
|
||||
KP2 ignore
|
||||
KP3 ignore
|
||||
KP4 ignore
|
||||
KP5 ignore
|
||||
KP6 ignore
|
||||
KP7 ignore
|
||||
KP8 ignore
|
||||
KP9 ignore
|
||||
KP_DEC ignore
|
||||
KP_ENTER ignore
|
||||
|
||||
# Testing at 2023-11-21 09:19:09PM
|
||||
|
||||
# Show Loaded Shaders (for dev testing)
|
||||
` script-binding sview/shader-view
|
||||
|
||||
# Show progress bar on MOUSE BUTTON 2 double-click
|
||||
# MOUSE_BTN2_DBL show-progress
|
||||
|
||||
# Seek using mouse wheel
|
||||
# Quieter alternative for video playback seeking
|
||||
# (Mechanical keyboard are common these days so this can mindful of other people
|
||||
# living in the same house)
|
||||
SHIFT+WHEEL_UP osd-msg-bar seek +120 relative+keyframes
|
||||
SHIFT+WHEEL_DOWN osd-msg-bar seek -120 relative+keyframes
|
||||
ALT+WHEEL_UP osd-msg-bar seek +30 relative+keyframes
|
||||
ALT+WHEEL_DOWN osd-msg-bar seek -30 relative+keyframes
|
||||
WHEEL_UP osd-msg-bar seek +1 relative+keyframes
|
||||
WHEEL_DOWN osd-msg-bar seek -1 relative+keyframes
|
||||
CTRL+WHEEL_UP frame-step
|
||||
CTRL+WHEEL_DOWN frame-back-step
|
||||
|
||||
# Seek using numbers
|
||||
CTRL+1 osd-msg-bar seek -1 relative+exact
|
||||
ALT+1 osd-msg-bar seek +1 relative+exact
|
||||
CTRL+2 osd-msg-bar seek -2 relative+keyframes
|
||||
ALT+2 osd-msg-bar seek +2 relative+keyframes
|
||||
CTRL+3 osd-msg-bar seek -3 relative+keyframes
|
||||
ALT+3 osd-msg-bar seek +3 relative+keyframes
|
||||
CTRL+4 osd-msg-bar seek -4 relative+keyframes
|
||||
ALT+4 osd-msg-bar seek +4 relative+keyframes
|
||||
CTRL+5 osd-msg-bar seek -5 relative+keyframes
|
||||
ALT+5 osd-msg-bar seek +5 relative+keyframes
|
||||
CTRL+6 osd-msg-bar seek -6 relative+keyframes
|
||||
ALT+6 osd-msg-bar seek +6 relative+keyframes
|
||||
|
||||
|
||||
# mpv keybindings
|
||||
#
|
||||
# Location of user-defined bindings: ~/.config/mpv/input.conf
|
||||
#
|
||||
# Lines starting with # are comments. Use SHARP to assign the # key.
|
||||
# Copy this file and uncomment and edit the bindings you want to change.
|
||||
#
|
||||
# List of commands and further details: DOCS/man/input.rst
|
||||
# List of special keys: --input-keylist
|
||||
# Keybindings testing mode: mpv --input-test --force-window --idle
|
||||
#
|
||||
# Use 'ignore' to unbind a key fully (e.g. 'ctrl+a ignore').
|
||||
#
|
||||
# Strings need to be quoted and escaped:
|
||||
# KEY show-text "This is a single backslash: \\ and a quote: \" !"
|
||||
#
|
||||
# You can use modifier-key combinations like Shift+Left or Ctrl+Alt+x with
|
||||
# the modifiers Shift, Ctrl, Alt and Meta (may not work on the terminal).
|
||||
#
|
||||
# The default keybindings are hardcoded into the mpv binary.
|
||||
# You can disable them completely with: --no-input-default-bindings
|
||||
|
||||
# Developer note:
|
||||
# On compilation, this file is baked into the mpv binary, and all lines are
|
||||
# uncommented (unless '#' is followed by a space) - thus this file defines the
|
||||
# default key bindings.
|
||||
|
||||
# If this is enabled, treat all the following bindings as default.
|
||||
#default-bindings start
|
||||
|
||||
#MBTN_LEFT ignore # don't do anything
|
||||
#MBTN_LEFT_DBL cycle fullscreen # toggle fullscreen
|
||||
#MBTN_RIGHT cycle pause # toggle pause/playback mode
|
||||
#MBTN_BACK playlist-prev # skip to the previous file
|
||||
#MBTN_FORWARD playlist-next # skip to the next file
|
||||
|
||||
# Mouse wheels, touchpad or other input devices that have axes
|
||||
# if the input devices supports precise scrolling it will also scale the
|
||||
# numeric value accordingly
|
||||
#WHEEL_UP add volume 2
|
||||
#WHEEL_DOWN add volume -2
|
||||
#WHEEL_LEFT seek -10 # seek 10 seconds backward
|
||||
#WHEEL_RIGHT seek 10 # seek 10 seconds forward
|
||||
|
||||
## Seek units are in seconds, but note that these are limited by keyframes
|
||||
#RIGHT seek 5 # seek 5 seconds forward
|
||||
#LEFT seek -5 # seek 5 seconds backward
|
||||
#UP seek 60 # seek 1 minute forward
|
||||
#DOWN seek -60 # seek 1 minute backward
|
||||
# Do smaller, always exact (non-keyframe-limited), seeks with shift.
|
||||
# Don't show them on the OSD (no-osd).
|
||||
#Shift+RIGHT no-osd seek 1 exact # seek exactly 1 second forward
|
||||
#Shift+LEFT no-osd seek -1 exact # seek exactly 1 second backward
|
||||
#Shift+UP no-osd seek 5 exact # seek exactly 5 seconds forward
|
||||
#Shift+DOWN no-osd seek -5 exact # seek exactly 5 seconds backward
|
||||
#Ctrl+LEFT no-osd sub-seek -1 # seek to the previous subtitle
|
||||
#Ctrl+RIGHT no-osd sub-seek 1 # seek to the next subtitle
|
||||
#Ctrl+Shift+LEFT sub-step -1 # change subtitle timing such that the previous subtitle is displayed
|
||||
#Ctrl+Shift+RIGHT sub-step 1 # change subtitle timing such that the next subtitle is displayed
|
||||
#Alt+left add video-pan-x 0.1 # move the video right
|
||||
#Alt+right add video-pan-x -0.1 # move the video left
|
||||
#Alt+up add video-pan-y 0.1 # move the video down
|
||||
#Alt+down add video-pan-y -0.1 # move the video up
|
||||
#Alt++ add video-zoom 0.1 # zoom in
|
||||
#ZOOMIN add video-zoom 0.1 # zoom in
|
||||
#Alt+- add video-zoom -0.1 # zoom out
|
||||
#ZOOMOUT add video-zoom -0.1 # zoom out
|
||||
#Alt+BS set video-zoom 0 ; set video-pan-x 0 ; set video-pan-y 0 # reset zoom and pan settings
|
||||
#PGUP add chapter 1 # seek to the next chapter
|
||||
#PGDWN add chapter -1 # seek to the previous chapter
|
||||
#Shift+PGUP seek 600 # seek 10 minutes forward
|
||||
#Shift+PGDWN seek -600 # seek 10 minutes backward
|
||||
#[ multiply speed 1/1.1 # decrease the playback speed
|
||||
#] multiply speed 1.1 # increase the playback speed
|
||||
#{ multiply speed 0.5 # halve the playback speed
|
||||
#} multiply speed 2.0 # double the playback speed
|
||||
#BS set speed 1.0 # reset the speed to normal
|
||||
#Shift+BS revert-seek # undo the previous (or marked) seek
|
||||
#Shift+Ctrl+BS revert-seek mark # mark the position for revert-seek
|
||||
#q quit
|
||||
#Q quit-watch-later # exit and remember the playback position
|
||||
#q {encode} quit 4
|
||||
#ESC set fullscreen no # leave fullscreen
|
||||
#ESC {encode} quit 4
|
||||
#p cycle pause # toggle pause/playback mode
|
||||
#. frame-step # advance one frame and pause
|
||||
#, frame-back-step # go back by one frame and pause
|
||||
#SPACE cycle pause # toggle pause/playback mode
|
||||
#> playlist-next # skip to the next file
|
||||
#ENTER playlist-next # skip to the next file
|
||||
#< playlist-prev # skip to the previous file
|
||||
#O no-osd cycle-values osd-level 3 1 # toggle displaying the OSD on user interaction or always
|
||||
#o show-progress # show playback progress
|
||||
#P show-progress # show playback progress
|
||||
#i script-binding stats/display-stats # display information and statistics
|
||||
#I script-binding stats/display-stats-toggle # toggle displaying information and statistics
|
||||
#` script-binding console/enable # open the console
|
||||
#z add sub-delay -0.1 # shift subtitles 100 ms earlier
|
||||
#Z add sub-delay +0.1 # delay subtitles by 100 ms
|
||||
#x add sub-delay +0.1 # delay subtitles by 100 ms
|
||||
#ctrl++ add audio-delay 0.100 # change audio/video sync by delaying the audio
|
||||
#ctrl+- add audio-delay -0.100 # change audio/video sync by shifting the audio earlier
|
||||
#Shift+g add sub-scale +0.1 # increase the subtitle font size
|
||||
#Shift+f add sub-scale -0.1 # decrease the subtitle font size
|
||||
#9 add volume -2
|
||||
#/ add volume -2
|
||||
#0 add volume 2
|
||||
#* add volume 2
|
||||
#m cycle mute # toggle mute
|
||||
#1 add contrast -1
|
||||
#2 add contrast 1
|
||||
#3 add brightness -1
|
||||
#4 add brightness 1
|
||||
#5 add gamma -1
|
||||
#6 add gamma 1
|
||||
#7 add saturation -1
|
||||
#8 add saturation 1
|
||||
#Alt+0 set current-window-scale 0.5 # halve the window size
|
||||
#Alt+1 set current-window-scale 1.0 # reset the window size
|
||||
#Alt+2 set current-window-scale 2.0 # double the window size
|
||||
#d cycle deinterlace # toggle the deinterlacing filter
|
||||
#r add sub-pos -1 # move subtitles up
|
||||
#R add sub-pos +1 # move subtitles down
|
||||
#t add sub-pos +1 # move subtitles down
|
||||
#v cycle sub-visibility # hide or show the subtitles
|
||||
#Alt+v cycle secondary-sub-visibility # hide or show the secondary subtitles
|
||||
#V cycle sub-ass-vsfilter-aspect-compat # toggle stretching SSA/ASS subtitles with anamorphic videos to match the historical renderer
|
||||
#u cycle-values sub-ass-override "force" "yes" # toggle overriding SSA/ASS subtitle styles with the normal styles
|
||||
#j cycle sub # switch subtitle track
|
||||
#J cycle sub down # switch subtitle track backwards
|
||||
#SHARP cycle audio # switch audio track
|
||||
#_ cycle video # switch video track
|
||||
#T cycle ontop # toggle placing the video on top of other windows
|
||||
#f cycle fullscreen # toggle fullscreen
|
||||
#s screenshot # take a screenshot of the video in its original resolution with subtitles
|
||||
#S screenshot video # take a screenshot of the video in its original resolution without subtitles
|
||||
#Ctrl+s screenshot window # take a screenshot of the window with OSD and subtitles
|
||||
#Alt+s screenshot each-frame # automatically screenshot every frame; issue this command again to stop taking screenshots
|
||||
#w add panscan -0.1 # decrease panscan
|
||||
#W add panscan +0.1 # shrink black bars by cropping the video
|
||||
#e add panscan +0.1 # shrink black bars by cropping the video
|
||||
#A cycle-values video-aspect-override "16:9" "4:3" "2.35:1" "-1" # cycle the video aspect ratio ("-1" is the container aspect)
|
||||
#POWER quit
|
||||
#PLAY cycle pause # toggle pause/playback mode
|
||||
#PAUSE cycle pause # toggle pause/playback mode
|
||||
#PLAYPAUSE cycle pause # toggle pause/playback mode
|
||||
#PLAYONLY set pause no # unpause
|
||||
#PAUSEONLY set pause yes # pause
|
||||
#STOP quit
|
||||
#FORWARD seek 60 # seek 1 minute forward
|
||||
#REWIND seek -60 # seek 1 minute backward
|
||||
#NEXT playlist-next # skip to the next file
|
||||
#PREV playlist-prev # skip to the previous file
|
||||
#VOLUME_UP add volume 2
|
||||
#VOLUME_DOWN add volume -2
|
||||
#MUTE cycle mute # toggle mute
|
||||
#CLOSE_WIN quit
|
||||
#CLOSE_WIN {encode} quit 4
|
||||
#ctrl+w quit
|
||||
#E cycle edition # switch edition
|
||||
#l ab-loop # set/clear A-B loop points
|
||||
#L cycle-values loop-file "inf" "no" # toggle infinite looping
|
||||
#ctrl+c quit 4
|
||||
#DEL script-binding osc/visibility # cycle OSC visibility between never, auto (mouse-move) and always
|
||||
#ctrl+h cycle-values hwdec "auto-safe" "no" # toggle hardware decoding
|
||||
#F8 show-text ${playlist} # show the playlist
|
||||
#F9 show-text ${track-list} # show the list of video, audio and sub tracks
|
||||
|
||||
#
|
||||
# Legacy bindings (may or may not be removed in the future)
|
||||
#
|
||||
#! add chapter -1 # seek to the previous chapter
|
||||
#@ add chapter 1 # seek to the next chapter
|
||||
|
||||
#
|
||||
# Not assigned by default
|
||||
# (not an exhaustive list of unbound commands)
|
||||
#
|
||||
|
||||
# ? cycle sub-forced-events-only # display only DVD/PGS forced subtitle events
|
||||
# ? stop # stop playback (quit or enter idle mode)
|
3
resources/scripts/mpv/mpv.conf
Normal file
3
resources/scripts/mpv/mpv.conf
Normal file
|
@ -0,0 +1,3 @@
|
|||
volume=50
|
||||
osd-color=1.0/0.5/0.25
|
||||
hwdec=auto-safe
|
|
@ -9,7 +9,7 @@
|
|||
MessageFilter::MessageFilter(int id, QObject* parent) : QObject(parent), m_id(id) {}
|
||||
|
||||
MessageObject::FilteringAction MessageFilter::filterMessage(QJSEngine* engine) {
|
||||
QJSValue filter_func = engine->evaluate(qApp->replaceDataUserDataFolderPlaceholder(m_script));
|
||||
QJSValue filter_func = engine->evaluate(qApp->replaceUserDataFolderPlaceholder(m_script));
|
||||
|
||||
if (filter_func.isError()) {
|
||||
QJSValue::ErrorType error = filter_func.errorType();
|
||||
|
|
|
@ -155,7 +155,6 @@ void FormSettings::addSettingsPanel(SettingsPanel* panel) {
|
|||
itm->setText(panel->title());
|
||||
itm->setIcon(panel->icon());
|
||||
|
||||
// m_ui.m_listSettings->addItem(itm);
|
||||
m_panels.append(panel);
|
||||
|
||||
QScrollArea* scr = new QScrollArea(m_ui.m_stackedSettings);
|
||||
|
|
|
@ -6,11 +6,13 @@
|
|||
#include "definitions/definitions.h"
|
||||
#include "gui/mediaplayer/libmpv/qthelper.h"
|
||||
#include "miscellaneous/settings.h"
|
||||
#include "miscellaneous/textfactory.h"
|
||||
|
||||
#include <clocale>
|
||||
#include <sstream>
|
||||
#include <stdexcept>
|
||||
|
||||
#include <QDir>
|
||||
#include <QJsonArray>
|
||||
#include <QJsonDocument>
|
||||
#include <QKeyEvent>
|
||||
|
@ -28,6 +30,9 @@
|
|||
#define EVENT_CODE_IDLE 11
|
||||
#define EVENT_CODE_STOP 12
|
||||
|
||||
#define CONFIG_MAIN_NAME "mpv.conf"
|
||||
#define CONFIG_INPUT_NAME "input.conf"
|
||||
|
||||
static void wakeup(void* ctx) {
|
||||
// This callback is invoked from any mpv thread (but possibly also
|
||||
// recursively from a thread that is calling the mpv API). Just notify
|
||||
|
@ -70,34 +75,35 @@ LibMpvBackend::LibMpvBackend(Application* app, QWidget* parent)
|
|||
|
||||
mpv_set_option(m_mpvHandle, "wid", MPV_FORMAT_INT64, &wid);
|
||||
|
||||
mpv_set_option_string(m_mpvHandle, "input-default-bindings", "yes");
|
||||
mpv_set_option_string(m_mpvHandle, "msg-level", "all=v");
|
||||
mpv_set_option_string(m_mpvHandle, "config", "yes");
|
||||
mpv_set_option_string(m_mpvHandle, "hwdec", "auto");
|
||||
mpv_set_option_string(m_mpvHandle, "osd-playing-msg", "${media-title}");
|
||||
mpv_set_option_string(m_mpvHandle, "osc", "yes");
|
||||
mpv_set_option_string(m_mpvHandle, "input-cursor", "yes");
|
||||
// mpv_set_option_string(m_mpvHandle, "keep-open", "no");
|
||||
mpv_set_option_string(m_mpvHandle, "idle", "yes");
|
||||
mpv_set_option_string(m_mpvHandle, "save-position-on-quit", "no");
|
||||
mpv_set_option_string(m_mpvHandle, "no-resume-playback", "yes");
|
||||
|
||||
#if !defined(NDEBUG)
|
||||
mpv_set_option_string(m_mpvHandle, "terminal", "yes");
|
||||
#endif
|
||||
|
||||
//
|
||||
// NOTE: Just random options for testing here.
|
||||
//
|
||||
// mpv_set_option_string(m_mpvHandle, "keep-open", "no");
|
||||
// mpv_set_option_string(m_mpvHandle, "terminal", "yes");
|
||||
// mpv_set_option_string(m_mpvHandle, "osd-italic", "yes");
|
||||
// mpv_set_option_string(m_mpvHandle, "osd-color", "1.0/0.0/0.0");
|
||||
|
||||
//
|
||||
// mpv_set_option_string(m_mpvHandle, "watch-later-dir", "mpv");
|
||||
mpv_set_option_string(m_mpvHandle, "config-dir", "mpv");
|
||||
// mpv_set_option_string(m_mpvHandle, "input-builtin-bindings", "no");
|
||||
// mpv_set_option_string(m_mpvHandle, "input-test", "yes");
|
||||
|
||||
// Enable keyboard input on the X11 window. For the messy details, see
|
||||
// --input-vo-keyboard on the manpage.
|
||||
// mpv_set_option_string(mpv, "input-vo-keyboard", "yes");
|
||||
if (!m_customConfigFolder.isEmpty()) {
|
||||
QByteArray cfg_folder = QDir::toNativeSeparators(m_customConfigFolder).toLocal8Bit();
|
||||
|
||||
mpv_set_option_string(m_mpvHandle, "config-dir", cfg_folder.constData());
|
||||
}
|
||||
else {
|
||||
mpv_set_option_string(m_mpvHandle, "input-default-bindings", "yes");
|
||||
}
|
||||
|
||||
// Observe some properties.
|
||||
mpv_observe_property(m_mpvHandle, EVENT_CODE_FS, "fullscreen", MPV_FORMAT_FLAG);
|
||||
|
@ -134,7 +140,16 @@ void LibMpvBackend::destroyHandle() {
|
|||
}
|
||||
}
|
||||
|
||||
void LibMpvBackend::loadSettings() {}
|
||||
void LibMpvBackend::loadSettings() {
|
||||
if (m_app->settings()->value(GROUP(VideoPlayer), SETTING(VideoPlayer::MpvUseCustomConfigFolder)).toBool()) {
|
||||
m_customConfigFolder =
|
||||
m_app->replaceUserDataFolderPlaceholder(m_app->settings()
|
||||
->value(GROUP(VideoPlayer), SETTING(VideoPlayer::MpvCustomConfigFolder))
|
||||
.toString());
|
||||
|
||||
installCustomConfig(m_customConfigFolder);
|
||||
}
|
||||
}
|
||||
|
||||
LibMpvBackend::~LibMpvBackend() {
|
||||
destroyHandle();
|
||||
|
@ -198,6 +213,10 @@ double LibMpvBackend::mpvDecodeDouble(void* data) const {
|
|||
return *(double*)data;
|
||||
}
|
||||
|
||||
QString LibMpvBackend::mpvEncodeKeyboardButton(int btn) const {
|
||||
return QString((QChar)btn);
|
||||
}
|
||||
|
||||
QString LibMpvBackend::errorToString(mpv_error error) const {
|
||||
switch (mpv_error(error)) {
|
||||
case mpv_error::MPV_ERROR_EVENT_QUEUE_FULL:
|
||||
|
@ -455,16 +474,14 @@ bool LibMpvBackend::eventFilter(QObject* watched, QEvent* event) {
|
|||
mpv_command_async(m_mpvHandle, 0, args);
|
||||
}
|
||||
|
||||
if (event->type() == QEvent::Type::KeyPress) {
|
||||
if (event->type() == QEvent::Type::KeyRelease) {
|
||||
// We catch all keypresses (even from surrounding widgets).
|
||||
QKeyEvent* key_event = dynamic_cast<QKeyEvent*>(event);
|
||||
char txt = (char)key_event->key();
|
||||
char str[2];
|
||||
QString keys =
|
||||
QKeySequence(key_event->key() | key_event->modifiers()).toString(QKeySequence::SequenceFormat::PortableText);
|
||||
QByteArray byte_named_key = keys.toLocal8Bit();
|
||||
|
||||
str[0] = txt;
|
||||
str[1] = '\0';
|
||||
|
||||
const char* args[] = {"keypress", str, nullptr};
|
||||
const char* args[] = {"keypress", byte_named_key.constData(), nullptr};
|
||||
|
||||
mpv_command_async(m_mpvHandle, 0, args);
|
||||
event->accept();
|
||||
|
@ -563,6 +580,22 @@ int LibMpvBackend::duration() const {
|
|||
return out;
|
||||
}
|
||||
|
||||
void LibMpvBackend::installCustomConfig(const QString& directory) {
|
||||
QDir().mkpath(directory);
|
||||
QDir config_dir(directory);
|
||||
|
||||
for (const QString& cfg_file : QStringList{QSL(CONFIG_MAIN_NAME), QSL(CONFIG_INPUT_NAME)}) {
|
||||
if (!config_dir.exists(cfg_file)) {
|
||||
qDebugNN << LOGSEC_MPV << "Copying sample" << QUOTE_W_SPACE(cfg_file) << "to"
|
||||
<< QUOTE_W_SPACE_DOT(config_dir.absolutePath());
|
||||
IOFactory::copyFile(QSL(":/scripts/mpv/%1").arg(cfg_file), config_dir.absoluteFilePath(cfg_file));
|
||||
}
|
||||
else {
|
||||
qDebugNN << LOGSEC_MPV << "Configuration file" << QUOTE_W_SPACE(cfg_file) << "already exists.";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LibMpvBackend::setMuted(bool muted) {
|
||||
if (m_mpvHandle != nullptr) {
|
||||
const char* mtd = muted ? "yes" : "no";
|
||||
|
|
|
@ -21,6 +21,8 @@ class LibMpvBackend : public PlayerBackend {
|
|||
virtual int position() const;
|
||||
virtual int duration() const;
|
||||
|
||||
static void installCustomConfig(const QString& directory);
|
||||
|
||||
public slots:
|
||||
virtual void setMuted(bool muted);
|
||||
virtual void playUrl(const QUrl& url);
|
||||
|
@ -51,12 +53,14 @@ class LibMpvBackend : public PlayerBackend {
|
|||
bool mpvDecodeBool(void* data) const;
|
||||
int mpvDecodeInt(void* data) const;
|
||||
double mpvDecodeDouble(void* data) const;
|
||||
QString mpvEncodeKeyboardButton(int btn) const;
|
||||
QString errorToString(mpv_error error) const;
|
||||
|
||||
void destroyHandle();
|
||||
void loadSettings();
|
||||
|
||||
private:
|
||||
QString m_customConfigFolder;
|
||||
QWidget* m_mpvContainer;
|
||||
mpv_handle* m_mpvHandle;
|
||||
QUrl m_url;
|
||||
|
|
|
@ -47,7 +47,7 @@
|
|||
<number>9</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>9</number>
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>9</number>
|
||||
|
|
|
@ -65,7 +65,9 @@ void SettingsMediaPlayer::saveSettings() {
|
|||
m_ui.m_gbMpvCustomConfigFolder->isChecked());
|
||||
settings()->setValue(GROUP(VideoPlayer), VideoPlayer::MpvCustomConfigFolder, m_ui.m_txtMpvConfigFolder->text());
|
||||
|
||||
// LibMpvBackend::installCustomConfig()
|
||||
if (m_ui.m_gbMpvCustomConfigFolder->isChecked()) {
|
||||
LibMpvBackend::installCustomConfig(m_ui.m_txtMpvConfigFolder->text());
|
||||
}
|
||||
#elif defined(ENABLE_MEDIAPLAYER_QTMULTIMEDIA)
|
||||
|
||||
#else
|
||||
|
|
|
@ -71,7 +71,7 @@ void SettingsNodejs::changeFileFolder(LineEditWithStatus* tb, bool directory_sel
|
|||
d.setNameFilter(file_filter);
|
||||
}
|
||||
|
||||
QString current = qApp->replaceDataUserDataFolderPlaceholder(tb->lineEdit()->text());
|
||||
QString current = qApp->replaceUserDataFolderPlaceholder(tb->lineEdit()->text());
|
||||
|
||||
d.selectFile(current);
|
||||
|
||||
|
@ -128,7 +128,7 @@ void SettingsNodejs::testNpm() {
|
|||
}
|
||||
|
||||
void SettingsNodejs::testPackageFolder() {
|
||||
QString folder = qApp->replaceDataUserDataFolderPlaceholder(m_ui.m_tbPackageFolder->lineEdit()->text());
|
||||
QString folder = qApp->replaceUserDataFolderPlaceholder(m_ui.m_tbPackageFolder->lineEdit()->text());
|
||||
|
||||
const auto fi = QFileInfo(folder);
|
||||
const auto is_file = fi.isFile() && fi.exists();
|
||||
|
|
|
@ -539,13 +539,13 @@ QString Application::cacheFolder() {
|
|||
#endif
|
||||
}
|
||||
|
||||
QString Application::replaceDataUserDataFolderPlaceholder(QString text) const {
|
||||
QString Application::replaceUserDataFolderPlaceholder(QString text) const {
|
||||
auto user_data_folder = qApp->userDataFolder();
|
||||
|
||||
return text.replace(QSL(USER_DATA_PLACEHOLDER), user_data_folder);
|
||||
}
|
||||
|
||||
QStringList Application::replaceDataUserDataFolderPlaceholder(QStringList texts) const {
|
||||
QStringList Application::replaceUserDataFolderPlaceholder(QStringList texts) const {
|
||||
auto user_data_folder = qApp->userDataFolder();
|
||||
|
||||
return texts.replaceInStrings(QSL(USER_DATA_PLACEHOLDER), user_data_folder);
|
||||
|
|
|
@ -155,8 +155,8 @@ class RSSGUARD_DLLSPEC Application : public SingleApplication {
|
|||
|
||||
int customAdblockPort() const;
|
||||
|
||||
QString replaceDataUserDataFolderPlaceholder(QString text) const;
|
||||
QStringList replaceDataUserDataFolderPlaceholder(QStringList texts) const;
|
||||
QString replaceUserDataFolderPlaceholder(QString text) const;
|
||||
QStringList replaceUserDataFolderPlaceholder(QStringList texts) const;
|
||||
|
||||
void setMainForm(FormMain* main_form);
|
||||
|
||||
|
|
|
@ -53,7 +53,7 @@ QString NodeJs::packageFolder() const {
|
|||
}
|
||||
|
||||
QString NodeJs::processedPackageFolder() const {
|
||||
QString path = qApp->replaceDataUserDataFolderPlaceholder(packageFolder());
|
||||
QString path = qApp->replaceUserDataFolderPlaceholder(packageFolder());
|
||||
|
||||
if (!QDir().mkpath(path)) {
|
||||
qCriticalNN << LOGSEC_NODEJS << "Failed to create package folder structure" << QUOTE_W_SPACE_DOT(path);
|
||||
|
|
|
@ -55,7 +55,7 @@ void Notification::playSound(Application* app) const {
|
|||
play
|
||||
->setSource(QUrl::
|
||||
fromLocalFile(QDir::toNativeSeparators(app
|
||||
->replaceDataUserDataFolderPlaceholder(m_soundPath))));
|
||||
->replaceUserDataFolderPlaceholder(m_soundPath))));
|
||||
}
|
||||
|
||||
play->setVolume(fractionalVolume());
|
||||
|
@ -85,7 +85,7 @@ void Notification::playSound(Application* app) const {
|
|||
play
|
||||
->setSource(QUrl::
|
||||
fromLocalFile(QDir::toNativeSeparators(app
|
||||
->replaceDataUserDataFolderPlaceholder(m_soundPath))));
|
||||
->replaceUserDataFolderPlaceholder(m_soundPath))));
|
||||
}
|
||||
|
||||
play->audioOutput()->setVolume(fractionalVolume());
|
||||
|
@ -102,7 +102,7 @@ void Notification::playSound(Application* app) const {
|
|||
}
|
||||
else {
|
||||
play->setMedia(QMediaContent(
|
||||
QUrl::fromLocalFile(QDir::toNativeSeparators(app->replaceDataUserDataFolderPlaceholder(m_soundPath)))));
|
||||
QUrl::fromLocalFile(QDir::toNativeSeparators(app->replaceUserDataFolderPlaceholder(m_soundPath)))));
|
||||
}
|
||||
|
||||
play->setVolume(m_volume);
|
||||
|
|
|
@ -403,7 +403,7 @@ void StandardFeed::setEncoding(const QString& encoding) {
|
|||
QStringList StandardFeed::prepareExecutionLine(const QString& execution_line) {
|
||||
auto args = TextFactory::tokenizeProcessArguments(execution_line);
|
||||
|
||||
return qApp->replaceDataUserDataFolderPlaceholder(args);
|
||||
return qApp->replaceUserDataFolderPlaceholder(args);
|
||||
}
|
||||
|
||||
QByteArray StandardFeed::runScriptProcess(const QStringList& cmd_args,
|
||||
|
|
Loading…
Add table
Reference in a new issue