Chibi-nah::blog

Des geekeries, de la MAO, de tout et de rien…

Archives

mpv, OSD et affichage du nom du chapitre en cours de lecture

TL;DR (trop long, flemme de tout lire) : Un appui sur la touche 'g' affiche le chapitre en cours de lecture dans mpv. Copier le script https://aeka.chibi-nah.net/~alex/brol/showCurrentChapter.lua dans ~/.config/mpv/scripts

Contexte

Tout est parti d'un pouët de @devnull1 sur le Fediverse2. En résumé : Est-il possible d'afficher la piste d'un fichier .cue en cours de lecture dans mpv ? Soit de manière permanente, soit pendant une certaine durée, ou lors de l'appui sur une touche.

Le script

Le moyen le plus simple pour arriver à ce résultat, c'est l'écriture d'un script lua, et de l'enregistrer dans ~/.config/mpv/scripts (sous GNU/Linux et BSD, chemin à adapter sous Windows et Mac OS).

--affichage du chapitre en cours
-- Licence WTFPL v2
-- @alex@social.nah.re

local options = require("mp.options")
local utils = require("mp.utils")

--paramètres par défaut
local cfg = {
        key = 'g',
        osdDuration = 5,
        name = 'showCurrentChapter'
}

options.read_options(cfg, 'showCurrentChapter')

local function showCurrentChapter()
        local chapter = mp.get_property_osd('chapter')
        mp.osd_message(chapter, cfg.osdDuration)

end

if(cfg.key) then
        mp.add_key_binding(cfg.key, cfg.name, showCurrentChapter)
        mp.msg.verbose("key:'"..cfg.key.."' bound to '"..cfg.name.."'")
end

Pas grand-chose à dire en fait.

Définir les paramètres par défaut, notamment la touche sur laquelle il faudra appuyer pour exécuter le script (ici, 'g'), et la durée d'affichage (5 secondes).

Ces options peuvent être redéfinies dans un fichier de configuration externe3, ce qui évite de modifier le script4.

À la fin, si la touche (cfg.key) est définie, alors on demande à mpv de l'ajouter dans sa liste des touches "mappées", et en lui indiquant quelle est la fonction à appeler (showCurrentChapter) lors de l'appui sur cette touche (g).

Et au dessus, la fonction affichant le chapitre.

J'avais d'abord essayé l'appel à mp.get_property('chapter'), mais je récupérais uniquement l'index du chapitre en cours de lecture (par exemple : 5).

J'ai pensé charger la liste des chapitres dans un tableau, via chapter-list, mais cela complexifiait le code. Et en lisant la doc, en fait, le moyen le plus simple, c'était d'appeler mp.get_property_osd('chapter') directement.

Et pour l'affichage, il suffit d'appeler la fonction mp.osd_message(texte à afficher, durée).

La durée étant stockée dans les paramètres, on n'a pas besoin de modifier la valeur dans cette fonction.

Conclusion

Rien de compliqué. Un peu de code, quelques tests, et surtout5 beaucoup de lecture de documentation6.

--

  1. https://mamot.fr/@devnull/106521784534006704
  2. Pour n̶e̶ ̶p̶a̶s̶ changer…
  3. Cf. documentation de mpv -> https://mpv.io/manual/stable/
  4. On peut très bien modifier le script en fait.
  5. On ne peut pas y échapper.
  6. Bon, ça va, je sais à peu près comment fonctionne mpv et comment est organisée la documentation.