Journal MPRIS-Sync : Regardez des films ensemble par internet

Posté par  . Licence CC By‑SA.
44
5
juil.
2020

Sommaire

J’ai voulu regarder une série avec ma sœur, parce que c’est quand même bien sympa de s’entendre mutuellement rire pendant les épisodes.

Sauf que problème, on n’habite pas dans la même ville. Comment alors regarder en même temps, facilement, une série ensemble, sans trop de décalage avec possibilité de repasser une scène qui nous a particulièrement amusé ?

Je n’ai pas trouvé de solution libre permettant de diffuser facilement, sans gros décalage, depuis un ordinateur vers un autre ordinateur sur internet. VLC avec sa fonction de diffusion était une solution prometteuse, mais ça ne marchait pas trop bien. Je n’ai pas essayé VNC ou une session X11 déportée, mais de toute façon je ne suis même pas sûr que ça résolvait le problème du son. Il m’a traversé l’esprit d’utiliser Jitsi Meet et sa fonctionnalité de partage d’écran, d’autant que maintenant on peut diffuser le son de son ordi avec, mais ce n’est pas du tout adapté : la fréquence d’envoi des images est bien trop faible.

Et de toute façon toutes ces solutions demandaient un ré encodage et un envoi coûteux. Sauf que quand on est à la campagne avec une connexion rurale, la dernière chose qu’on a envie de faire, c’est envoyer de la vidéo. Et entendre le ventilateur de son ordinateur et sentir celui-ci chauffer, ce n’est pas fun.

MPRIS-Sync à la rescousse

Alors comment faire ? Prendre le problème autrement. Les deux côtés ont les fichiers vidéos à lire, il ne reste plus qu’à synchroniser la lecture. Coup de chance, le protocole MPRIS permet de contrôler très facilement n’importe quel lecteur audio et vidéo sur les distributions GNU/Linux et autres OS prenant en charge D-BUS (qui est un bus / protocole de communication entre applications).

Y a plus qu’à brancher MPRIS à des sockets et on est tout bon… ? Et c’est effectivement ce que fait MPRIS-Sync, un petit script Python de 300 lignes sous licence libre AGPLv3+ avec les commentaires (et aussi sans les commentaires, c’est le même nombre, ah ah), que j’ai écrit pour l’occasion. Moins de 10 Kio. De quoi rendre jaloux un programmeur C ou Rust et rendre vert un programmeur Javascript qui utiliserait des modules tels que is-number, téléchargé 30 000 fois par semaine, qui pèse déjà 20 Kio. Mais je digresse.

Comment ça s’utilise ?

On installe le module Python mpris2 et on est bons pour commencer.

Mise en place

C’est simple : on démarre le lecteur vidéo, on lance MPRIS-Sync et on lui dit de piloter ce lecteur vidéo (ou audio, hein, ça marche aussi).

Un des ordinateurs va se comporter comme un serveur : il faut lancer MPRIS-Sync avec une commande du style :

./mprissync.py --listen 0.0.0.0 8080

et faire les bonnes redirections de ports sur votre routeur. De l’autre côté, il “suffira” de lancer MPRIS-Sync de cette manière :

./mprissync.py --connect X.Y.Z.A 8080

en remplaçant bien sûr X.Y.Z.A par l’adresse IP du “serveur”.

Utilisation

Si la mise en place est un peu fastidieuse, il faut que l’utilisation soit naturelle. On ne peut pas se permettre des choses du genre « Ah bah attends, j’ai changé la position, tape sync dans le terminal ».

Non non. Il n’y a plus qu’à regarder la vidéo normalement avec le lecteur. On pourra mettre en pause, changer la position, stopper et reprendre la lecture de la vidéo, et ça fera pareil de l’autre côté. Quand la vidéo est mise en pause d’un côté, elle sera mise en pause de l’autre côté, sur la même image. Quand la lecture reprend, elle reprend depuis la même image au même moment des deux côtés.

Comment ça fonctionne ?

Vous vous demandez peut-être comment on fait pour que les choses soient synchros malgré les latences inévitables du réseau, et comment ça ne prend pas de plus en plus de décalage dans la figure au cours du temps.

Voilà comment MPRIS-Sync procède :

  • à la connexion, le temps de l’allez-retour est mesuré entre les deux ordinateurs, et leurs dates et heures respectives sont échangés.
  • lorsque l’un des deux lecteurs est mis en pause, l’ordre de mettre en pause de l’autre côté est tout de suite envoyé, avec la position en cours. De l’autre côté, le lecteur est mis en pause et la position est configurée sur la position fournie.
  • lors d’un changement de position ou d’une reprise, le lecteur qui contrôle est tout de suite mis en pause. Ensuite, l’ordre de reprendre la lecture dans le futur à la position donnée est envoyé. Ce mécanisme de pause et de reprise dans le futur, à la position indiquée, permet l’absence de décalage significatif. C’est l’instance où le lecteur a été piloté qui décide quand on reprend. Le temps d’attente choisi dans MPRIS-Sync est le maximum entre une seconde, et le double de l’allez-retour mesuré à la connexion.
  • lorsque la lecture est stoppée d’un côté, elle l’est de l’autre.

Problèmes rencontrés

Utilisation de NTP

Au départ, j’utilisais NTP pour avoir la même date des deux côtés. En fait, ça ne marche pas bien et il y a quand même un décalage, en plus de rendre MPRIS-Sync dépendant d’un service externe. Là, il fonctionne au sein d’un réseau local privé d’internet, même si cette caractéristique n’est probablement pas très intéressante en pratique.

Réseaux un peu agressifs avec les connexions « inactives »

MPRIS-Sync fonctionnait très bien à la campagne, mais j’ai eu des gros problèmes en ville (une fois n’est pas coutume. C’était dû au fait que le réseau Numericable coupe n’importe quelle connexion inactive plus d’une minute. Sauf que oui, quand on regarde un épisode de 45 minutes ou un film d’1h30 ou plus, on ne change pas la lecture toutes les minutes… après la mise en place d’un petit keep-alive des familles, tout devrait bien fonctionner.

Implémentations aléatoires d’MRPIS

MPRIS-Sync est censé fonctionner avec n’importe quel lecteur audio ou vidéo. En pratique, j’ai eu des soucis avec Clémentine, VLC et le lecteur de Gnome (alors que j’ai ciblé VLC, initialement). Notamment, sous VLC, il y a fréquemment des gros glitchs visuels ou des saccades à la reprise de la lecture…

MPRIS-Sync fonctionne par contre impeccablement bien avec MPV et Gnome-MPV, que je recommande plus que très fortement, du coup.

Limitations et pistes d’amélioration

Le projet est tout jeune, il répond déjà à mes attentes donc je n’ai pas spécialement d’intérêt purement égotiste à le faire évoluer plus que ça, mais je pense que travailler dessus peut être très intéressant, vu la taille minuscule du projet pour quelqu’un voulant se faire la main sur Python, les sockets, D-BUS, MPRIS et qui sait, sur le code des différents lecteurs pour corriger les petits problèmes avec leurs implémentations respectives du protocole MPRIS ?

Voici donc une liste longue comme le bras de limitations et de pistes d’améliorations possibles.

Prise en charge limitée à GNU/Linux

MPRIS-Sync se base sur MPRIS, d’où son nom, mais je ne crois pas que ce protocole existe hors des bureaux libres, en particulier sous Windows, macOS, Android et iOS, même pour les lecteurs qui existent à la fois sous Linux et ces OS et qui implémentent MPRIS. Sur Android, je suis à peu près sûr qu’il existe un protocole similaire : KDE Connect permet de contrôler la lecture sur un téléphone Android depuis un ordinateur. Pour les autres systèmes, je ne sais pas et il faudra peut-être, dans le pire des cas, faire une implémentation spécifique par lecteur. Il n’y a que sur les OS répandus et biens finis qu’on ne trouve un tel confort avec la présence d’interfaces comme MPRIS, malheureusement il y a un peu de travail côté finitions pour des OS un peu obscures tels que Windows (trollolo… en plus ça doit bien exister, il y a les touches du clavier pour piloter la lecture en cours, quand même… à moins que chacun surveille ces touches dans son coin ?).

Changement de piste / de vidéo

Ce n’est pas du tout géré. Pour le moment, il faut que l’une des deux personnes mette manuellement en pause et rétablisse la lecture pour s’assurer que la lecture est synchro après un changement de piste. Les deux personnes doivent s’assurer que les morceaux s’enchaînent bien dans le même ordre.

À part ma fainéantise et l’existence d’autres activités intéressante comme les randos ou les baignades aux lacs, je ne vois pas de raisons que ça ne puisse pas être implémenté, toutes les données nécessaires sont fournies par MPRIS.

Fermeture du lecteur ou interruption de MPRIS-Sync = tout est à refaire

Si quelqu’un ferme son lecteur ou MPRIS-Sync, il faut tout remettre en place. Il faudrait :

  • gérer les reconnexions au lecteur et à l’autre instance de MPRIS-sync.
  • peut-être permettre de sélectionner un autre lecteur quand le lecteur a été fermé.

Pour le moment, si MPRIS-Sync perd la connexion à l’autre instance ou au lecteur vidéo, il se quitte.

Pas très intuitif

Pour utiliser MPRIS-Sync, il faut lancer des lignes de commandes, et ouvrir des ports. Ce n’est pas super cool.

Ce serait top d’avoir une belle interface graphique pour piloter MPRIS-Sync, et peut-être aussi implémenter un contournement du NAT avec des astuces du style des connexions inversés. Sinon, mettre en place un petit serveur permettant la mise en relation de deux instances MPRIS-Sync (en gardant la fonctionnalité optionnelle).

Pas plus de deux utilisateurs / utilisatrices

On est d’accord, regarder des films en groupe ça doit être bien chouette aussi. Ce serait une extension intéressante à réaliser et très utile.

Partage des fichiers qui vont être lus ?

Pour l’instant, les gens doivent s’assurer qu’ils ont les mêmes fichiers. On pourrait imaginer une fonctionnalité de partage de fichiers sans effort intégrée à MPRIS-Sync.

Conclusion

Ce journal est plus long que le code dont il parle (mais sa rédaction a pris beaucoup moins de temps, il ne faut quand même pas abuser).

J’attends vos retours, vos suggestions, vos idées et vos améliorations avec impatience.

Lien du projet : https://framagit.org/raphj/mpris-sync

  • # Une version Web ?

    Posté par  . Évalué à 9 (+8/-1). Dernière modification le 05/07/20 à 18:06.

    En envoyant ce journal, et suite à ma découverte hier de Webamp (une copie de Winamp 2 pour le web), je me dis qu'en fait, on pourrait tout à fait faire ça direct facilement et proprement dans le navigateur : il y a tout ce qu'il faut en Javascript pour piloter la lecture d'une vidéo, pas d'installation nécessaire, il suffit que l'utilisateur / l'utilisatrice fournisse le fichier à lire en utilisant un <input type="file">. Ça permettrait une prise en charge multi-plateforme sans effort, sans installation pour la personne qui ne met pas en place le serveur.

    Avec la prise en charge imminente de VA-API dans Firefox pour accélérer matériellement lecture des vidéos sous X11, ça pourrait être sympa.

    • [^] # Re: Une version Web ?

      Posté par  (site Web personnel) . Évalué à 10 (+9/-0).

      J'avais fait ça il y a quelques années avec XMPP. La « radio collective» était une fonctionnalité expérimentale de Salut à Toi qui permettait d'écouter et partager la musique en même temps sur un salon de discussion :

      radio

      (d'ailleurs on voit en dessous de la dépêche une autre fonctionnalité — toujours en place — pour contrôler un lecteur multimédia à distance avec MPRIS)

      Et une vidéo qui présentait la fonctionnalité (en 2012, le temps passe !) :
      https://www.goffi.org/post/2012/02/02/Radio-collective

      Le code est toujours présent dans le backend, c'est juste que l'interface web a été refaite, mais j'envisage de remettre en place à l'occasion.

  • # Bravo et is_number

    Posté par  (site Web personnel) . Évalué à 3 (+2/-0).

    des modules tels que is-number, téléchargé 30 000 fois par semaine,

    J'ai cliqué sur le lien, ce serait 30 000 000 par semaine ? J’hallucine ?

    Concernant MPRIS-Sync, je ne vois pas trop dans quel cas je me servirai d'un truc pareil, mais je découvre MPRIS qui semble avoir pas mal de potentiel. Je comprends que ce n'est accessible qu'en local…

    Alors je cherche, je cherche et je découvre KDE Connect qui se base sur MPRIS et qui a un client pour mon téléphone mais qui ne semble pas fonctionner… (https://openrepos.net/content/piggz/kde-connect) Faut définitivement que je regarde ça plus en détail !

    • [^] # Re: Bravo et is_number

      Posté par  . Évalué à 2 (+0/-0).

      Concernant MPRIS-Sync, je ne vois pas trop dans quel cas je me servirai d'un truc pareil […]

      C'est pour les adeptes de soirées ciné je pense. Pendant le confinement j'ai des amis qui cherchaient ce genre de solution. Partager le visionnage d'un film c'est pas mal pour pouvoir rire ou faire des commentaires.

    • [^] # Re: Bravo et is_number

      Posté par  . Évalué à 1 (+0/-0).

      Vois du côté de sailfishconnect si tu utilise sailfishos.

    • [^] # Re: Bravo et is_number

      Posté par  . Évalué à 2 (+0/-0).

      Ah oui ! Je me suis trompé d'un facteur mille.

      Faut bien voir que beaucoup de projets en dépendent transitivement, parfois plusieurs fois à cause des différentes versions. Et le paquet est probablement pas mal retéléchargé par les outils d'intégration continue.

    • [^] # Re: Bravo et is_number

      Posté par  (site Web personnel) . Évalué à 6 (+4/-0).

      is-odd est a 480 000 par semaine

      Et son opposé is-even est a 100 000 par semaine

      alors que le code c'est

      'use strict';
      
      var isOdd = require('is-odd');
      
      module.exports = function isEven(i) {
        return !isOdd(i);
      };
      
  • # Syncplay

    Posté par  . Évalué à 10 (+10/-0).

    • [^] # Re: Syncplay

      Posté par  . Évalué à 6 (+4/-0). Dernière modification le 06/07/20 à 08:28.

      Ah, génial, je regarderai ça. Ça a l'air beaucoup mieux qu'MPRIS-Sync. C'est multiplateforme. On peut être plusieurs et rejoindre en cours de route. Il y a des instances publiques. Ça vérifie le fichier en cours de lecture. Un soin est apporté sur les questions de vie privée.

      Merci !

  • # Jellyfin

    Posté par  (site Web personnel) . Évalué à 2 (+1/-0).

    C'est probablement overkill à mettre en place uniquement pour la lecture synchronisée le serveur de medias Jellyfin permet de faire exactement ce que tu recherches depuis peu.

  • # un nouveau monde que je découvre...

    Posté par  . Évalué à 8 (+7/-1).

    …j'aurai cru qu'il était plus sympa de regarder une film séparément, à son propre rythme et sans être interrompu par des rires ou bruits externes et d'en parler après. Déjà que ça m'a toujours emmerdé de mettre la pause quand ma partenaire devait aller pisser/chercher un truc à grignoter à la maison, si en plus tu dois le faire quand une ribambelle d'amis regardent le même truc en même temps alors qu'ils n'ont pas cette limitation de l'écran unique… _^

    • [^] # Re: un nouveau monde que je découvre...

      Posté par  . Évalué à 5 (+2/-0).

      Je dirais que ça dépend du type de contenu et des gens avec qui tu regarde. Personnellement, ce genre de visionnage doit se faire sans pause (ou peut-être une au milieu si on parle d'une longue vidéo), et la communication plutôt par chat. Le but est plutôt de partager des réactions à chaud (ça m'a fait rire, je suis surpris que ce soit le juge l'assassin…) que tu n'as pas forcément en discussion après, ça ne veut pas dire que les discussions après ne sont pas intéressantes.

      « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

    • [^] # Re: un nouveau monde que je découvre...

      Posté par  . Évalué à 4 (+2/-0).

      C'est un type de visionnage particulier. Par exemple pour une soirée nanars, l'objectif n'est pas d'être subjugué par le film et d'être totalement immergé, mais plutôt de se taper des barres avec des amis. L'autre cas parlant ces de (re)regarder des films cultes (du moins pour ceux qui regardent) et avoir la possibilité de commenter le film en live voir faire les dialogues en même temps (« I am your father »).

    • [^] # Re: un nouveau monde que je découvre...

      Posté par  (site Web personnel) . Évalué à 3 (+2/-0).

      C'est parce que tu ne regardes pas les bons films, c'est pour ça.

      Tu devrais regarder Snapdragon. Tu verras, c'est mieux à plusieurs.

  • # uinput ?

    Posté par  (site Web personnel) . Évalué à 4 (+1/-0).

    Peut être que pour améliorer la compatibilité avec les lecteurs de flims, il serait possible d'utiliser https://www.kernel.org/doc/html/v4.12/input/uinput.html pour simuler la touche "lecture" d'un clavier ?

    Incubez l'excellence sur https://linuxfr.org/board/

    • [^] # Re: uinput ?

      Posté par  . Évalué à 4 (+2/-0).

      Ça ne suffirait pas, il faut aussi capter les changements de lecture et la position dans la vidéo. Et aussi changer la position.

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n’en sommes pas responsables.