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

:date: 2021-07-04
:tags: blog, mpv, lua, osd
:keywords: mpv, lua, osd, afficher chapitre
:slug: mpv-osd-et-chapitre
:url: mpv-osd-et-chapitre

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 @devnull[ref] `<https://mamot.fr/@devnull/106521784534006704>`_ [/ref] sur le Fediverse[ref]Pour n̶e̶ ̶p̶a̶s̶ changer…[/ref]. 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).

. code-block:: lua

       --affichage du chapitre en cours
       -- Licence WTFPL v2
       -- @[email protected]

       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 externe[ref]Cf. documentation de mpv -> https://mpv.io/manual/stable/ [/ref], ce qui évite de modifier le script[ref]On peut très bien modifier le script en fait.[/ref].

À 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 surtout[ref]On ne peut pas y échapper.[/ref] beaucoup de lecture de documentation[ref]Bon, ça va, je sais à peu près comment fonctionne mpv et comment est organisée la documentation.[/ref].

--