add custom configs for mpv, enabled by default, switchable in settings

This commit is contained in:
Martin Rotter 2023-11-30 13:49:32 +01:00
parent c79146b2ee
commit 725ca569bc
15 changed files with 510 additions and 35 deletions

View file

@ -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>

View 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)

View file

@ -0,0 +1,3 @@
volume=50
osd-color=1.0/0.5/0.25
hwdec=auto-safe

View file

@ -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();

View file

@ -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);

View file

@ -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";

View file

@ -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;

View file

@ -47,7 +47,7 @@
<number>9</number>
</property>
<property name="topMargin">
<number>9</number>
<number>0</number>
</property>
<property name="rightMargin">
<number>9</number>

View file

@ -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

View file

@ -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();

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -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,