Blog

Controlar MPV sin tener el foco

Controlar MPV sin tener el foco

Controlando mpv a través de atajos de teclado. El foco está en el navegador web, no en MPV.

Utilizo el reproductor de vídeo mpv, junto con mpv_websocket y texthooker-ui para leer subtítulos en japones a través del navegador web, donde puedo buscar kanjis y vocabulario con Yomitan. Pauso la reproducción muy a menudo para leer con detenimiento. Lo hago con el teclado, pulsando espacio. También avanzo o retrocedo a través de los subtítulos con Ctrl+Izquierda/Derecha. Se necesita tener el foco en la ventana de MPV para que funcione. Es incómodo porque en ocasiones tengo el foco en el navegador web. Necesito soltar el ratón, moverme a la ventana de MPV, pulsar el atajo de teclado deseado y finalmente volver al ratón para seguir con Yomitan en el navegador.

X11 puede ejecutar atajos de teclado asociados a una aplicación, independientemente de si ésta tenía o no el foco. Son los llamados «global shortcuts». Mi gestor de ventanas es Sway, que funciona sobre Wayland, no X11. El protocolo de Wayland para «global shortcuts» no está terminado todavía. Otros gestores de ventanas ofrecen soluciones no estándar, pero no es el caso de Sway, así que se necesita alguna alternativa como IPC para controlar MPV. Para habilitarlo, tal y como se explica en las instrucciones de mpv-websocket:

# ~/.config/mpv/mpv.conf
# mpv_websocket
# https://github.com/kuroahna/mpv_websocket

# Setting input-ipc-server=/tmp/mpv-socket will work on both Windows and Linux
#
# On Windows, the socket will be available at \\.\pipe\tmp\mpv-socket
# On Linux, the socket will be available at /tmp/mpv-socket
#
# See: https://mpv.io/manual/stable/#options-input-ipc-server
input-ipc-server=/tmp/mpv-socket

Si teníamos arrancado mpv, habrá que reiniciarlo.

Asigno a Sway key los bindings con los comandos enviados al socket, basándome en esto:

# ~/.config/sway/config
bindsym F1 exec echo '{ "command": ["sub-seek", "-1"] }' | socat - /tmp/mpv-socket
bindsym F2 exec echo '{ "command": ["sub-seek", "1"] }' | socat - /tmp/mpv-socket
bindsym F3 exec echo '{ "command": ["cycle", "pause"] }' | socat - /tmp/mpv-socket

El comando sub-seek (que entiendo significa subtitle-seek) se puede encontrar aquí.

Otra posibilidad para controlar mpv es a través de MPRIS, con el comando playerctl:

playerctl --player=mpv play-pause

Sin embargo, desconozco si es posible hacer sub-seek con este método.