Nolife, les outils (5) : Papoum

Après Marvin, Logolife et Time Attack, au tour d’un autre logiciel propriétaire de Nolife de se voir dévoilé ici : Papoum. Ce sera un peu plus long… car le sujet est plus complexe 🙂

La situation mi-2008, plus d’un an après le début de la diffusion de Nolife, était que la chaîne avait un sérieux soucis à la diffusion : les personnes en charge de la conduite antenne (à l’époque, principalement Alex Pilot) n’avaient aucun moyen automatisé de vérifier qu’un programme était actuellement online sur la régie de diffusion ou pas. Le seul moyen était manuel : il fallait y accéder par ftp et vérifier, parmi des centaines de fichiers, que les émissions qui avaient dernièrement été uploadées étaient bien présentes.

Tout le problème résidait dans le système d’upload, qui n’était pas trivial : la première étape était d’uploader les fichiers par FTP dans un dossier dans lequel Nolife possédait des droits d’écriture. Ensuite lorsque l’upload était terminé, un script distant était sensé détecter que le fichier était uploadé (en réalité que sa taille ne changeait plus…) et faisait une vérification d’intégrité de la vidéo. Si la vidéo était ok, elle était copiée automatiquement dans le dossier contenant tous les fichiers disponible pour la diffusion (vidéos dites « PAD » pour « Prêt À Diffuser »), sur lequel Nolife n’avait qu’un droit en listing+lecture, une règle imposée par Cognacq-Jay pour des raisons de sécurité. Sinon, le fichier partait dans un dossier « quarantaine » de vidéos non-viables pour la diffusion.

Le système s’arrêtait là : pas d’alerte, pas d’avertissement. Si jamais il y avait une interruption lors de l’upload (ce qui était fréquent…), le script se lançait, en concluait que la vidéo était incorrecte et la mettait en quarantaine. De plus, un autre script était régulièrement lancé qui allait nettoyer le dossier en effaçant des vidéos PAD en fonction de règles prédéfinies (exemple : les 101% qui ont plus d’un mois), car la place disque était extrêmement limitée.

Au niveau de la diffusion à proprement parler, lorsqu’un fichier de la playlist courante n’était pas présent, la régie passait simplement au fichier suivant – un comportement qui est normalement interdit en diffusion télé : les régies génèrent normalement un noir équivalent à la durée du programme manquant pour ne pas décaler le reste de la programmation. Lorsqu’il s’agissait de clips ou de rediffusions de courtes rubriques, ce n’était pas grave. Mais lorsqu’il s’agissait du 101% du jour, c’était un problème évidemment très gênant, et en général la saute d’une émission se traduisait par un décalage catastrophique de l’enchaînement des playlists (se terminant souvent, encore une fois, par un coup de fil à Cognacq-Jay pour sauter un programme).

Autrement dit, il fallait absolument trouver un moyen de vérifier automatiquement si tous les programmes d’une playlist étaient bien « online » en régie. L’idée a commencé à germer en juin 2008 : en effet, sur la fin de saison l’équipe de Nolife est en général très fatiguée et les erreurs humaines se multiplient, ce qui a été le cas à cette période. Peu de temps auparavant, si mes souvenirs sont bons, Sébastien avait développé Time Attack, dont on a déjà parlé ici. À la rentrée de septembre 2008, après de nouvelles erreurs d’émissions non diffusées, je me suis mis au travail.

Ce fût ma première contribution à la création des outils de Nolife. Ça n’était pas si évident que ça : ma dernière vraie expérience de développement datait de 7 ans plus tôt. De plus, j’ai choisi de travailler en C# (.NET 3.0 à l’époque) et en WPF, ce qui n’était pas répandu (le WPF sont les nouvelles API d’interface homme-machine de Microsoft qui ont été introduites avec Windows Vista). Seb n’ayant pas l’expérience du WPF, il n’a pas pu m’aider et je me suis souvent bien fait chier pour comprendre la logique du bouzin. Mais au final je ne l’ai pas regretté… comme vous pourrez le voir plus tard.

Papoum 0.1 – L’origine
(septembre 2008)

Papoum, dans sa version 0.1, avait été développé sur le modèle d’interface de Time Attack que je trouvais très pratique et qu’Alex connaissait déjà.

Le fonctionnement était relativement simple : Papoum téléchargeait au lancement la liste des fichiers par FTP sur la régie de diffusion. Ensuite, il suffisait de glisser sur la fenêtre un m3u généré par Marvin et retouché par Alex. Papoum affichait alors la playlist à la façon de Time Attack, sauf qu’il vérifiait que le fichier était bien en ligne sur la régie. Dans le cas contraire, la ligne apparaissait en rouge. C’était tout, mais cela a suffit pour qu’Alex l’utilise immédiatement ! Évidemment, à partir de fin septembre 2008, les erreurs de diffusion dues à des fichiers offline ont baissé de façon spectaculaire (c’est toujours un peu gratifiant de voir un résultat quasi-immédiat ^^).

(Je fais une petite parenthèse sur le nom : au départ ce devait être un tout petit projet et je m’étais imaginé mettre un petit son qui faisait « Papoum ! » lorsqu’on droppait une playlist. Le son n’est jamais arrivé mais par contre le nom est resté. C’est toujours un peu délicat du coup quand on le présente à des professionnels :))

Papoum 0.1 permettait aussi d’afficher la liste complète des fichiers disponibles en régie (bouton « Afficher CJI » sur l’interface), ce qui évitait d’avoir à utiliser un client FTP pour vérifier des uploads manuellement.


Version 0.2a de Papoum. Ici, tous les fichiers de la playlist apparaissent offline. Je ne peux plus le faire fonctionner car ses paramètres sont entièrement hardcodés et la configuration de Nolife a changé.

Dès le départ, Papoum intégrait certains bout de code de Marvin, comme celui qui permettait de déduire la durée d’une vidéo de la taille du fichier, ce qui lui donnait un air de « Time Attack ++ ». Puis Alex a commencé à demander plus de fonctions, comme par exemple éviter de charger le listing du ftp à chaque lancement.

La version 0.3 (renommée ensuite 0.30) permettait de scanner les fichiers stockés localement à Nolife afin de les comparer avec ceux en ligne. Cela permettait de détecter les différences de versions car les émissions étaient parfois recompressées ; c’est notamment arrivé lorsque Nolife a commencé à être diffusée sur Neufbox, car la compression utilisée par Nolife jusque-là était incompatible avec ce réseau.

Pour éviter le scan des fichiers systématique à chaque lancement, les metadatas des médias de Nolife étaient sauvegardés en XML : la base de données de Papoum était née. Cela permettait de faire des stats (du genre : tous les 101% additionnés font tant d’heure, etc), mais surtout cela a eu une incidence notable par la suite sur le fonctionnement de Nolife.

Papoum a ensuite continué à évoluer avec deux mises à jour majeures.


Papoum 0.31 : les stats de durée totale des émissions, disponibles pour la première fois, ont également servi pour faire la promotion de Nolife.

Papoum 0.40 – Rock the Playlist
(décembre 2008)

La version 0.40 a intégré une véritable simulation de la diffusion des playlists par IPPlay. Pour résumer, au lieu de glisser une seule playlist, on pouvait désormais en glisser plusieurs ; Papoum affichait ensuite ce qui allait effectivement être diffusé à l’antenne en simulant le comportement de la régie, y compris les enchaînement foirés et les playlists qui bouclaient (avec un avertissement quand ça arrivait).
Cette fonctionnalité est, après encore bien des améliorations, celle qui sert encore actuellement pour checker les playlists et les envoyer en régie (cf les screenshots en fin d’article).

Papoum 0.50 – De bien belles assets
(janvier 2009)

La seconde étape majeure a été la transformation de logiciel de vérification de playlist à celle de MAM (Media Asset Management), fin janvier 2009.

Je m’étais en effet rendu compte que je pouvais récupérer les infos de Marvin (via une passerelle intégrée à Papoum) et en faire une espèce de base de données un peu mieux foutue. De plus, je disposais d’informations supplémentaires : par exemple, la simulation de playlists implémentée dans Papoum 0.40 me permettait de déduire les heures de premières et dernières diffusions d’un programme.
Je me suis donc dit qu’en structurant un peu tout ça, il serait peut-être possible de centraliser un minimum les informations que l’on avait sur les émissions de Nolife tout en ajoutant d’autres, comme par exemple lier un titre à chaque type d’émission (CU : « 101% », CM : « Chez Marcus », etc), donner des numéros, des sous-titres, des descriptions, la couleur du logo, etc.

Donc, d’une base stockée sur un fichier XML, Papoum est passé à plusieurs. Comme je viens de le dire, il était possible de rentrer des informations sur chaque émission. Une autre nouveauté, plus discrète mais essentielle, était que ces metadatas n’étaient plus liées au fichier media mais à une entité de plus haut niveau : l’émission (« show »). À la base, l’idée était de préparer Papoum à la connexion avec une vraie base de donnée relationnelle (type MySQL). De plus je caressais l’espoir de pouvoir envoyer les infos un jour ou l’autre aux différents EPG (guide des programmes), et également d’indiquer sur le site web les programmes en cours de diffusion ; la centralisation des informations était essentielle pour cela.

D’autres fonctions sont apparues dans cette version : la recherche, la possibilité de donner un niveau d’importance aux émissions…

Bien sûr un travail de nettoyage et de réécriture a dû également être fait en parallèle pour supporter tout ça, et c’est à ce moment-là par exemple que la maintenance (debuggage…) a commencé à prendre du temps, et que la configuration via des fichiers externes est apparue (fin du paramétrage « en dur » dans le code).


Papoum 0.50. Beaucoup de choses étaient déjà prévues dans la structure de cette version, qui ont été implémentées dans les versions 0.5x suivantes.

Papoum 0.60 – L’apogée
(mars 2009)

La base de code de la version 0.60 de Papoum a été la plus stable et la plus aboutie techniquement, ce qui a fait d’elle la version qui a le mieux fonctionné, et ce pendant 15 mois. Je crois que c’est un record dans la vie de ce logiciel !

Principalement il s’agissait de grosses améliorations techniques ou la réutilisation de fonctionnalités déjà existantes. Par exemple est arrivée la possibilité de « lier » virtuellement plusieurs médias pour en faire une émission (principalement pour le J-Top et Ami Ami Idol). Mais la première fonctionnalité « publique » de Papoum, celle qui l’a un peu fait connaître des gens suivant assidûment la chaîne, fût NoAir, en avril 2009 (Papoum 0.63).

NoAir part du principe qu’on pouvait faire un « guide des programmes » avec tout ce que j’avais déjà dévelopé pour Papoum. Cela consistait tout simplement à aller chercher les playlists déjà entrées en régie (on en a toujours conservé une copie en local), et faire une simulation de diffusion sur celles correspondants aux 12 dernières et 24 prochaines heures. De là on garde les programmes uniquement marqués comme « importants », et hop ! On a la liste des programmes qu’on peut partager avec les téléspectateurs. Ceci s’est fait par l’upload d’un XML sur le site web (qu’il fallait déclencher via un bouton dans Papoum). NoAir existe toujours à l’heure actuelle même s’il n’est plus généré de la même manière : vous pouvez en avoir un exemple et apprendre comment créer votre propre client.


L’implémentation de Nolife de NoAir, disponible sur le site officiel.

Un autre amélioration technique concernait le scan des médias car le format de compression avait encore changé pour s’adapter à des modifications dans IPPlay. Du coup, on se retrouvait avec une multitude de formats différents (MPEG2 en 544×576 4/3 et 16/9, 720×576 16/9, upper field first, lower field first et deux bitrates différents) et le scan « à l’arrache » ne suffisait plus. Papoum a donc intégré un vrai scan des médias grâce à l’excellent mediainfo.dll et pouvait sonner l’alerte dès qu’un fichier non compatible avec la diffusion était programmé, car chaque type de fichier était reconnu et classifié. L’algorithme de scan a dû être pas mal affiné à cette occasion car mediainfo prend son temps et il est hors de question de rescanner intégralement 16000 fichiers à chaque fois.

La version 0.60 a aussi introduit le multi-utilisateur qui était TRÈS bancal. En fait les XML étaient centralisés sur le réseau et au démarrage, Papoum en chargeait une copie. L’utilisateur pouvait ensuite centraliser les informations de son poste vers le réseau (en écrasant les anciennes)… j’ai dit que c’était bancal ?

Ensuite, et c’est plus subtil, la terminologie a évolué. Par exemple on a vu apparaître la notion de « stocks » pour définir les emplacements des médias. Ce changement vient du fait que Nolife, avec l’aide d’Ankama, avait déposé des dossiers pour la reprise sur le câble et le satellite ; or IPPlay n’était pas une régie suffisamment fiable pour ces réseaux – de toute façon, IPPlay était une bonne solution pour démarrer, mais pas sur le long terme. Ankama avait donc lancé l’achat d’une nouvelle régie pour Nolife, construite par la société MBT et avec laquelle, à terme, Papoum devait s’interfacer. La terminologie s’est donc adaptée à celle en vigueur dans le milieu.

Pour finir, une sombre version 0.70 est sortie mi-juillet 2009. En fait la seule vraie nouveauté était une passerelle écrite pour récupérer toutes les informations concernant les clips japonais et français qui étaient stockées dans un tableau Excel et que Seb recopiait à la main dans Marvin (comme vous le voyez, on partait de loin). Le but était de centraliser toutes les informations concernant les émissions de Nolife dans Papoum, car la véritable base de données à été construite durant l’été 2009 à partir des XML de ce dernier.

Papoum 0.90 – Adieu IPPlay… Adieu Papoum ?
(octobre 2009)

Mais, mais mais, où est la version 0.80 ?

En fait, la 0.80 n’a jamais été déployée sous ce nom. Il s’agit d’un « fork », une branche parallèle dans le développement de Papoum qui s’est créée mi-2009. Elle sera mise en production durant l’été mais déployée sur l’ensemble des postes de Nolife uniquement début 2010. Je vous laisse deviner ce qui a motivé cette bifurcation soudaine ! 🙂

La branche 0.60 de Papoum a tout de même continué à évoluer sous le numéro « 0.9x » pour la différentier de la nouvelle branche (qui sera finalement numérotée 1.0). Au départ, la 0.60 devait être abandonnée, mais elle est restée, jusqu’à ce jour, le seul outil que l’on avait pour vérifier les playlists avant diffusion. Elle est donc encore en production et curieusement, est revenue à sa fonction de base.
Les autres fonctions de Papoum ont été progressivement désactivées ou modifiées car Papoum et ses XML n’était plus la référence. Par exemple, les métadatas des émissions sont désormais automatiquement récupérés de la nouvelle base de données, mais Papoum ne peut pas les renvoyer dans l’autre sens. C’est en quelque sorte devenu une « impasse » logicielle.

Entre temps, les choses avaient pas mal changées au niveau de la diffusion.

Car même si Nolife n’a finalement pas été reprise sur le câble et le satellite, Médiamétrie a commencé à mesurer l’audience sur l’ADSL dès février 2010… mais le signal envoyé par IPPlay interdisait à Nolife de se faire mesurer. Donc la régie de MBT (le « Chameleon »), qui était restée en sommeil, a finalement été mise en production en juin 2010, et IPPlay complètement abandonné.

Or, le Chameleon ne fonctionne pas du tout comme IPPlay ! Le principe est absolument contraire : le player vidéo est asservi par un logiciel (« Phoenix ») qui gère une seule playlist (dite « playlist antenne »).
Autrement dit, c’est la playlist antenne qui définit à quelle moment précis chaque média doit être joué, et à quel moment il doit s’arrêter, et ce, à l’image près. Il faut évidemment que ces données correspondent au média qu’on veut jouer… donc on ne peut plus simplement donner une liste de fichiers, il faut aussi donner un timecode de début de lecture (par exemple le 20/05/2011 à 14:35:24:12, soit 14h 35mn 24s et 12 images) et une durée précise pour chaque média. Le player qui joue le média est dans une couche plus basse et si le média joué est en réalité plus long que ce qui est indiqué dans la playlist, il sera coupé ; s’il est plus court, il y aura un écran noir à l’antenne.

Du coup, impossible de balancer nos m3u moisis dans ce système. La solution, encore une fois, a été d’utiliser la simulation IPPlay intégrée à Papoum et tout simplement d’exporter une playlist antenne au bon format, avec tous les TC, pour la nouvelle régie. Pour être vraiment précis sur cette partie, MBT nous a aussi aidé en développant de leur côté une autre passerelle pour nous permettre de fusionner la playlist exportée de Papoum dans la playlist antenne de Phoenix.

C’est donc Papoum qui fait la passerelle entre Marvin et le Chameleon, alors qu’au départ il avait un simple rôle de vérification. Ce qui explique en partie sa longévité en production, car il est assez difficile de changer un composant critique de la diffusion.

Enfin (ouf !), la dernière modif a concerné l’arrivée toute récente de la publicité, le challenge ici étant que les noms des médias et leur durée nous sont communiqués par France Télévision Publicités bien avant leur diffusion, mais que Papoum n’a pas accès aux médias pour les scanner. Or ce dernier n’a pas été prévu pour gérer des émissions sans média (par défaut quand ça arrive la durée est ramenée à 0).

Le problème là-dedans, c’est que la nouvelle régie, la publicité et d’autres changement structurels à Nolife n’étaient pas du tout prévus dans la mécanique originale de Papoum. Du coup depuis début 2010 les patchs s’enchaînent, le rendant de moins en moins stable, et chaque nouveau patch génère des comportement imprévisibles. La branche 1.0 ayant considérablement évolué depuis, sa retraite est donc très proche et il sera vraisemblablement entièrement remplacé dans le courant de l’été 2011 par… Shin Papoum !

Et pour finir, voici quelques screenshots de Papoum 0.98 :


Papoum 0.98, qui devrait être la version finale.
Notez le fichier offline (non disponible en régie pour une diffusion immédiate) et les petites images dans l’interface qui sont là grâce à la souplesse de WPF ! De plus, un clic droit sur un média ouvre un menu contextuel permettant soit de localiser le média sur le réseau, soit de le jouer dans VLC. La colonne de gauche est la liste des types d’émissions, générée à partir des noms de l’ensemble des médias trouvés.


Un exemple de recherche qui s’effectue en live, « à la iTunes ». Le niveau de vert des émission correspond à leur niveau de visibilité publique (pour NoAir). Notez qu’un scan des médias est effectué en parallèle (en bas).


Les metadatas d’émissions sont désormais principalement importées d’une source extérieure mais sont toujours dispo dans l’ancienne fenêtre d’édition pour consultation. Le rouge indique que toute modification sera perdue.


Voici le fameux simulateur de conduite antenne IPPlay, introduit dans Papoum 0.40.
Ici il y a trois playlists, et on voit que la simulation est correcte (la playlist de 18h33 commence à 18h55 à cause du Chez Marcus). Les pubs sont en violet pour qu’elles soient bien visibles (Nolife a l’obligation de les diffuser dans certaines plages horaires). Trois fichiers sont actuellement offline sur la régie, mais la playlist antenne peut tout de même être générée avec les bons timecodes et les médias copiés plus tard. Enfin, le bouton « Exporter vers Phoenix » permet d’exporter ce que l’on voit vers la nouvelle régie de diffusion.

Diverses infos. Le switch entre régie a été désactivé une fois la migration de la diffusion effectuée.

6 réflexions sur “Nolife, les outils (5) : Papoum”

  1. Pour la recherche à la itunes vive le binding parce qu’en WinForms classique, je ne sais pas si ca aurait été aussi simple 🙂

    Bravo en tout cas, ca a bien évolué ! (Y a aussi du SVN pour le versionning non ? Quand je vois « branche »…^^ un ptit Ankh sur VS 2010 et SNV notifier ? J’ai bon ?^^)

  2. Wahoo!!! Et tout ça, avec le reste du taf en plus. J’aime aussi beaucoup le framework .Net, bien que je me sois cantonner au dév d’intranet/outils interne. D’ailleurs pourquoi le choix des xml plutot qu’un sqlite?

  3. bah avec la sérialisation j’imagine que c’est bien plus simple à manipuler et puis avec Linq maintenant, on peut faire des requêtes sur des listes d’objets. Donc en gros je pense qu’ils ont choisi la méthode simple et efficace^^

  4. Alors si je me souviens bien tout était géré par des Dictionary<String,T>, donc des listes avec index (grosso-modo). Par contre ça impliquait que dès que je voulais utiliser un autre index que le String je devais créer d’autres listes à côté… comme je l’ai expliqué le projet a pris ampleur que je n’avais pas imaginée et c’est très rapidement devenu le bordel.

    Pour la recherche, c’est un vrai parcours de la liste des objets et une liste résultante était générée qui était bindée à la vue. Le système de binding de .NET est pratique mais malheureusement la vue (listview+gridview) rame énormément avec des listes.

    La sauvegarde en XML était le plus simple de mon point de vue car effectivement j’ai utilisé Linq et tout se fait en quelques lignes. Cependant je ne serialize pas les objets, je sauvegarde les paramètres bien proprement (j’ai pas confiance dans le système de serialization des objets pour la rétro-compatibilité des fichiers de données… et la serialization rend les sauvegardes humainement illisibles).

    Pour la version 0.80 (-> 1.0) j’ai tout réécrit en utilisant une base de données relationnelle hébergée sur un serveur centralisé. C’est plus pratique d’un certain point de vue, les performances sont meilleures mais ça apporte un tas de problèmes gigantesques, comme l’impossibilité de générer des données à la volée simplement lors du binding alors qu’avec une liste d’objets on peut mettre du procédural dans les propriétés bindées. D’autre part la gestion du cache de données est une horreur pure et simple – la manière la plus simple est de copier l’ensemble de la base en RAM, ce qui me fait toujours quand même très mal au cul, j’aime bien programmer propre. Et le système de DataSet de .NET est très faiblard, par exemple on ne peut créer que des clés primaires sur les DataTable, pas d’index sur les autres champs à moins de faire des DataView… on perd vraiment pas mal d’intérêt d’avoir une base de données. Je reviendrai sur Shin Papoum dans un prochain article et vous verrez que ce n’est pas la même sauce que Papoum, on se situe vraiment un bon cran au-dessus niveau fonctionnalités.

    Sinon je n’utilise pas de SVN, je garde juste une copie complète des sources de chaque version majeure et quand j’ai forké pour la 0.80 j’ai juste dupliqué le projet.

  5. Ouahhhhhhhhhhhhh quel plaisir comme souvent Cyril. Déjà Grand Merci, je suis plus que friand de ces longues explications complètes. Relire plusieurs fois une phrase et toujours pas la comprendre, c’est quand même cool en fin de compte 😀
    Niveau programmation j’ai beaucoup de lacune, donc je comprend pas tout, heureusement que je comprend bien plus le coté playlist et conduite antenne, ce qui m’a permis de vraiment apprécier cet article.

    MERCI CYRIL

Les commentaires sont fermés.