Felix Schwarz Diplom-Informatiker
Software-Entwicklung und Beratung

Deutsch | Français

MediaCore – une plateforme vidéo extensible

Dans ces cinq dernières années, la vidéo sur Internet est devenue de plus en plus populaire. Évidemment, YouTube a une grosse part de ce marché et fournit beaucoup de fonctionnalités pour l'utilisateur. Cependant, plusieurs entreprises, associations et organisations veulent héberger leurs vidéos sur une plateforme dédiée. Les raisons que j'enetends sont le plus souvent :

  • Les pages doivent s'intégrer dans le site principal de la société (styles, intégration)
  • Faire apparaître des publicités pour gagner de l'argent
  • Plus de flexibilité, la possibilité d'ajouter des fonctionnalités personnalisées n'importe où

/posts/2011/mediacore/us.png This an unofficial translation of my English blog post kindly contributed by Quentin Theuret.

À propos de MediaCore

MediaCore est un logiciel open source d'hébergement de vidéos et de podcasts, publié la première fois en janvier 2010. Le paquet de distribution contient déjà beaucoup de fonctionnalités intéressantes :

  • vidéos embarquées depuis YouTube, Vimeo ou Google Video
  • Le support des podcasts
  • Un service de stockage sophistiqué (e.g. héberger les médias sur le cloud d'Amazon S3)
  • Intégration des réseaux sociaux (partage sur Facebook, Twitter, etc)

/posts/2011/mediacore/MediaCore_Website.png

Le principal développement est fait par Simple Station, un studio de graphisme canadien. Cependant le développement est transparent avec un répertoire github, un forum et une liste de diffusion pour les développeurs.

Une chose que vous devez garder à l'esprit avec MediaCore, c'est que ne n'est pas aujourd'hui une "solution clé en main pour tout le monde". Quelques fonctionnalités couramment demandées ne sont pas implémentées, tel que:

  • un encodage automatique des vidéos, (e.g. encoder les vidéos téléversées dans un format adéquat pour le visionnage web)
  • le système de permissions, la restriction de la possibilité de téverser, la possibilité de définir un quels utilisateurs (payants ?) peuvent voir uen vidéo
  • le support de la publicité incrustée dans une vidéo

Également, l'installation sur un espace web peu cher sans accès au terminal est quelque peu difficile, voir quelques fois impossible. La plupart des ces problèmes vont être corrigés avec des extensions après la sortie de MediaCore 0.9 (mi-mars 2001) ou vont fonctionner dans les futures versions. Elles ne sont simplement aujourd'hui pas présentes.

Personnalisation

Jusqu'ici, la personnalisation de MediaCore requierait toujours des changements dans le code source, ce qui rendait les mises à jour plus difficiles car vous aviez besoin de modifier le code source à chaque nouvelle version. Avec la venue de la version 0.9, MediaCore supporte les extensions, donc vous pouvez faire beaucoup de personnalisation sans modifier le code source de MediaCore. Exemples d'extensions :

  • Modifier le thème général de façon arbitraire en surchargeant les modèles
  • Ajouter de nouveaux lecteurs
  • Déclencher du code personnalisé sur certains événements (e.g. "nouvelle vidéo téléversée")

Avec Mediacore 0.9, vous pouvez développer vos propres modifications comme des extensions, c'est donc plus facile de mettre à jour le coeur de MediaCore sans avoir à modifier votre code. Allez voir la prochaine seection pour avoir plus de détails techniques.


Extensions pour MediaCore

Actuellement (06 mars 2011), il n'y a pas de documenation publique sur comment écrire une extension pour MediaCore, j'ai donc décidé de partager mon expérience avec vous. Cependant, ceci n'est pas un guide complet pour les nouveaux arrivants. Je considère que vous êtes familier avec les bases de Python.

Généralement, les extensions sont développées en utilisant Python (pour le code serveur), Genshi (pour les modèles) et les technologies web habituelles (HTML, CSS, Javascript) pour l'interface utilisateur. Pour le côté Python, vous pouvez également lire la page d'accueil de Pylons qui est le framework sur lequel repose MediaCore. Il y a également The Definitive Guide to Pylons (version en ligne) de James Gardner.

Structure

Premièremenet, regardez la structure d'u plugin (vous pouvez télécharger ce squelette):

/posts/2011/mediacore/mediacore_plugin_structure.png

  • "sample" est le nom de votre module Python, vous pouvez le modifier avec n'importe quel nom Python valide.
  • "mediacore_plugin.py" est un nom arbitraire mais j'utilie celui-ci comme un point d'entrée central où j'importe tout mon code.
  • Si votre extension requiert des ressources statiques comme du Javascript, des feuilles de styles ou des images, vous aurez besoin d'un répertoire nommé "public" à l'intérieur de "sample" (ou du nom que vous avez donné à votre module). Manifestement, les ressources statiques peuvent avoir des noms arbitraires, j'ai simplement ajouté un fichier CSS appelé "sample-style.css".
  • Si vous voulez ajouter de nouvelles pages à votre MediaCore, créez un répertoire "templates" à l'intérieur de "sample" (ou du nom que vous avez donné à votre module). À l'intérieur vous mettez vos modèles Genshi, comme "my-page.html" qui est simplement un exemple.

Chaque répertoire de votre extension doit contenir un fichier (vide) __init__.py (ceci est à cause du comportement des outils Python setuptools/zipimport). Dans le dossier racine, vous deveza voir un fichier "setup.py".

Exemple : Ajouter une nouvelle page

Pour ajouter une nouvelle page, vous avez besoin d'un contrôleur, une méthode "exposée" spécifique dans le contrôleur et le modèle. Regardez plutôt cet exemple :

# File: sample/mediacore_plugin.py

# ------------------------------------------------------------
# -*- coding: UTF-8 -*-

from mediacore.lib.base import BaseController
from mediacore.lib.decorators import expose

class MyController(BaseController):
    @expose('sample/my_page.html')
    def my_page(self, tag_name, **kwargs):
        # do your backend work here
        # …
        return {'tag_name': tag_name}
# ------------------------------------------------------------

__controller__ = MyController

Si vous utilisez cet exemple (et que vous avez remplis les morceaux manquants) dans votre extension, votre nouvelle page sera disponible sur http://<mediacore>/sample/my_page?tag_name=Something. Notez que la partie "sample" de votre URL dépend de vos paramètres dans setup.py (regader cette section sur l'installation en dessous),

Dans votre modèle vous pouvez référencer vos ressources statiques en utilisant ${h.url_for('/sample/public/<filename>')}.

Si je me souviens bien, chaque extension peut n'avoir qu'un seul contrôleur. Cependant un contrôleur peut avoir plusieurs fonctions exposées.

Exemple : Ajouter un nouveau lecteur

MediaCore supporte différents types de lecteur, plus spécialement des lecteurs HTML5 (utilisant la balise <video> et du Javascript) et des lecteurs Flash. Les deux classes importantes à voir sont mediacore.lib.players.AbstractHTML5Player et mediacore.lib.players.AbstractFlashPlayer.

Je vais vous montrer un exemple de comment construire un lecteur personnalisé basé sur FlowPlayer:

# File: sample/player.py
from mediacore.lib.players import FlowPlayer

class MyPlayer(FlowPlayer):
    name = u'my_player'
    display_name = u'Custom Player based on Flowplayer'

    # you could override flashvars() for example to add player some options

Ensuite vous devez enregistrer votre classe, en ajoutant ceci dans votre mediacore_plugin.py:

# …
from mediacore.lib.players import AbstractFlashPlayer
from sample.player import MyPlayer
AbstractFlashPlayer.register(MyPlayer)
# …

Si vous ["InstallervotreExtension avez installé] votre extension "après" avoir initialisé la base de données principale de MediaCore (paster development.ini setup-app, vous devez enresitrer votre lecteur via SQL :

insert  into players (name, enabled, priority, created_on, modified_on, data)  VALUES ('my_player', false, max(priority)+1, now(), now(), '{}');

Maintenant, votre lecteur doit être visible dans les paramètres d'administration (section "Lecteurs") et vous devez simplement l'activer. Toutes les vidéos utiliseront ce lecteur (si c'est possible).

Installer votre extension

MediaCore utilise setuptools pour trouver les extensions. Toutes les extensions trouvées sont automatiquement activées, il n'y a pas moyen de désactiver une extension (pour le moment).

C'est pourquoi votre extension a besoin d'un fichier setup.py qui reseemble à cela (grossièremen):

#!/usr/bin/env python
from setuptools import setup, find_packages

setup(
      name='SamplePlugin',
      version='1.0',

      author='Felix Schwarz',
      author_email='info@schwarz.eu',
      license='GPL v3 or later',

      packages=find_packages(),
      entry_points = {
          'mediacore.plugin': [
              'sample = sample.mediacore_plugin',
          ],
      }
)

En plus de quelques meta-informations, le point d'intérêt est le entry_point 'mediacore.plugin':

  1. La premireè partie ('sample = ...') définit le préfixe de l'URL où votre nouvelles pages/ressources est trouvée (http://<mediacore>/sample/….
  2. De plus c'est la ligne qui dit à MediaCore où regarder pour l'extension (sample/mediacore_plugin.py). Ce fichier est exécuté quand MediaCore charge cette extension, et vous pouvez utiliser l'attribut __controller__ ici pour ajouter de nouvelles pages.

Avant que vous puissiez utiliser votre nouvelle extension, vous avez besoin de l'installer (n'oubliez pas d'activer votre virtualenv avant !) :

python setup.py install

Pour le développement, vous aimeriez utiliser le mode 'development' à la place de 'install' ce qui vous permet de ne pas à réinstaller votre extension à chaque fois que vous modifier le code.

Ceci est ma grossière approche des extension de MediaCore. J'ai simplement fait l'impasse sur un sujet : Events. Ceci est dû au fait que je pense que l'architecture de l'API le rend pratiquement inutile/

J'espère que vous avez aimé ce paragraphe. Dans le cas où vous découvririez des erreurs, veuillez me contacter par courriel. Souvenez vous également que vous pouvez télécharger le squelette de base.


Mes contributions et adaptations

J'ai contribué à quelques correctifs pour MediaCore, par exemple:

  • Infrastructure basique de l'internationalisation (i18n) et une grande partie de la traduction allemande
  • Support de Python 2.6
  • Meilleurs diagnostics pour les problèmes d'extensions

Ces correctifs ont été créés pendant que je modifiais MediaCore en fonction des besoins de mes clients.

Exemples de personnalisation commerciales

Bien que je ne partage pas les personnalisations que j'ai effectuées pour mes clients, j'aimerai vous fournir deux exemples de modifications pour vous donner une idée de ce qui a été fait :

/posts/2011/mediacore/One_Goal.png

Une "ONG allemande" a lancé une campagne pendant la Coupe du Monde de Football 2010 en Afrique du Sud. Le but était d'avoir une plateforme web où les utilisateurs (plus particulièrement des écoles) puissent "téléverser des vidéos et des images". J'avais besoin d'un site allemand et la possibilité de gérer les images dans une instance MediaCore.


/posts/2011/mediacore/carousel_with_ads.png

Un "portail commercial" héberge des vidéos avec MediaCore but ne permettait pas d'"afficher des publicités dasn les vidéos en utilisant OpenX". J'ai dévelopé un lecteur MediaCore personnalisé qui affiche une liste d'annonces. J'ai également développé un carousel vidéo qui permet d'être embarqué dans d'autres sites (avec l'affichage de publicité). Toutes ces fonctionnalités sont contenues dans des extensions, MediaCore peut donc être facilement mis à jour.



Vous avez des questions ?

Comme toujours, si vous avez des questions à porpos de MediaCore, veuillez regarder dans forum des utilisateurs. Si vous avez des questions à propos du support commercial, d'une installation distante et de modifications, envoyez-moi simplement un courriel à info@schwarz.eu (en anglais ou allemand impérativement).


Credits

This translation was kindly contributed by Quentin Theuret (www.quentin-theuret.net). Thank you very much, Quentin.