29-11-2011 : Remettre dans le débat politique les principes du Conseil National de la Résistance
29-01-2012 : Parce que nous sommes un peuple debout, agissons pour rester dignes et responsables !
Logo de mon site
Logo de mon site
Faire un don

Luxpopuli / eZ Publish / Trucs & astuces / Playlist automatique : créer les playlists - V





Right menu

Logo du site ez.no  Logo XHTML 1.O du W3C  Logo XHTML 1.O du W3C  Site francophone officiel de Firefox

Playlist automatique : créer les playlists - V

Date de publication: le vendredi 15 mai 2009 à 18h06
Dernière modification: par Pascal BOYER le vendredi 15 mai 2009 à 22h53
« Article précédent: Playlist automatique : créer les templates et leur surcharges - IV
» Article suivant: eZ Publish : système de gestion des mails - page « Contact » I

La dernière étape que présente cet article est celle de la création automatique des playlists, c'est à dire des fichiers xml que liront chacun des players flash.

Il peut être intéressant de rappeler que le modèle de fichier xml à reproduire est donné par le code source de la page suivante: mrss.xml

Le module layout

Rappels

Le module layout permet d'indiquer à eZ Publish d'utiliser un template de mise en page différent du template pagelayout.tpl utilisé par défaut.

L'usage de ce module est réalisé par le biais d'un URI de la forme:

http://monsite.com/layout/set/XXX/content/view/YYY/ZZZ

où:

  • XXX désigne le nom du layout, c'est à dire le nom de la mise en page que l'on souhaite obtenir. Mise en page liée, via le fichier de surcharge layout.ini.append.php, à un template de mise en page particulier.
  • YYY désigne le nom du template de vue que le système doit utiliser.
  • ZZZ désigne le numéro de ID du noeud dont il faut afficher l'objet qu'il encapsule.

Partant, voici les différentes étapes qui mèneront, in fine, à la création des playlist.

I - Définition du la mise en page (layout) playlist

Dans le fichier de surcharge layout.ini.append.php du siteaccess public, à créer s'il n'existe pas déjà, ajoutons les lignes suivantes:

[playlist]   <=== NOM DE LA MISE EN PAGE
PageLayout=creationplaylist_layout.tpl  <=== TEMPLATE ASSOCIÉ AU NOM DE LA MISE EN PAGE

Le template creationplaylist_layout.tpl sera placé dans le répertoire:

design/plain_site/templates/

et contient cette seule et unique ligne:

{$module_result.content}

Pour être tout à fait clair, l'URI indiquant à eZ Publish d'employer le template creationplaylist_layout.tpl commencera par:

http://monsite.com/layout/set/playlist/

Bien sûr, {$module_result.content} contiendra le résultat de l'exécution du module content et du template de vue YYY.

II - Création du template de vue

Le template de vue YYY est nommé creationplaylist.tpl, est placé obligatoirement dans le répertoire:

design/plain_site/templates/node/view/

et contient le code (commenté) suivant:

1 {* CE TEMPLATE EST APPELÉ PAR L'EXÉCUTION DU SCRIPT creationPlaylist.txt (LIGNE 5)
2
3    DANS UN PREMIER TEMPS ON RÉCUPÈRE LE ID DU NOEUD Discotheque
4    PUIS ON RÉCUPÈRE LA LISTE DE TOUS LES NOEUDS artiste EXISTANT SOUS LE NOEUD DE ID 10 (= Discotheque)
5 *}
6 {def  $idRubriqueDiscotheque=fetch( 'content', list, hash('parent_node_id', 2,
7                                     'depth', 1,
8                                     'limite', 1,
9                                     'class_filter_type', 'include',
10                                     'class_filter_array', array( 'discotheque')))
11       $liste_artistes=fetch_alias( children, hash('parent_node_id', $idRubriqueDiscotheque.0.node_id,
12                                        'depth', 1,
13                                        'class_filter_type', 'include',
14                                        'class_filter_array', array( 'artiste')))}
15 {* SI $liste_artistes N'EST PAS VIDE *}
16 {if $liste_artistes}
17     {* POUR CHACUN DES ARTISTES *}
18     {foreach $liste_artistes as $artiste}
19         {* ON RECUPÈRE TOUS LES NOEUDS album *}
20         {def  $liste_albums=fetch_alias( children, hash('parent_node_id', $artiste.node_id,
21                                             'depth', 1,
22                                             'class_filter_type', 'include',
23                                             'class_filter_array', array( 'album')))}
24         {* ET POUR CHACUN DES ALBUMS *}
25         {foreach $liste_albums as $album}
26             {* ON CRÉE UN URI UTILISANT UN NOUVEAU layout ET SE TERMINANT PAR LE ID DU NOEUD DE L'OBJET album *}
27             http://femoca.fr/index.php/layout/set/xml/content/view/playerlist/{$album.node_id}
28         {/foreach}
29     {/foreach}
30 {* SI $liste_artistes EST VIDE *}
31 {else}
32 {* ALORS ON N'AFFICHE RIEN *}
33 {/if}

Point important:

  • Ligne 27 : l'URI construit fait à nouveau appel au module layout composé:
    • d'une nouvelle mise en page nommée xml
    • d'un nouveau template de vue nommé playerlist.tpl

Anticipons un peu

La ligne 1 ci-dessus indique en commentaire que le template creationplaylist.tpl est appelé par la ligne 5 du script creationPlaylist.txt que nous créerons ultérieurement. Voici cette ligne 5:

wget -q http://femoca.fr/index.php/layout/set/playlist/content/view/creationplaylist/60 -O listes.txt

:
60 est le N° de ID du noeud illustré par la figure 1b.

Si on affiche l'URI http://femoca.fr/index.php/layout/set/playlist/content/view/creationplaylist/60, le navigateur affiche ceci:

http://femoca.fr/index.php/layout/set/xml/content/view/playerlist/30  http://femoca.fr/index.php/layout/set/xml/content/view/playerlist/31 http://femoca.fr/index.php/layout/set/xml/content/view/playerlist/32

Et le code source de cette page ne contient que cela:

http://femoca.fr/index.php/layout/set/xml/content/view/playerlist/30
http://femoca.fr/index.php/layout/set/xml/content/view/playerlist/31
http://femoca.fr/index.php/layout/set/xml/content/view/playerlist/32

L'affichage d'une telle page ne présente pas le moindre intérêt. En revanche, créer un fichier texte contenu la liste des URI ci-dessus constitue l'objectif à atteindre. Et c'est exactement ce que réalise la commande wget de la ligne 5 du script creationPlaylist.txt.

Les numéros qui terminent chacun des URI correspondent au N° de ID des noeuds album de l'ensemble de tous les artistes. Dans notre exemple nous n'avos qu'un seul artiste et trois de ses albums.

Poursuivons....

III - Définition du la mise en page (layout) xml

Nous venons de voir que la commande wget crée un fichier texte listes.txt ( voir l'option finale de la commande: -O listes.txt) dont le contenu est une liste d'URI de la forme:

http://femoca.fr/index.php/layout/set/AAA/content/view/BBB/CCC

où:

  • AAA vaut xml et désigne le nom du layout, c'est à dire le nom de la mise en page que l'on souhaite obtenir.
  • BBB vaut playerlist et désigne le nom du template de vue que le système doit utiliser.
  • CCC désigne le numéro de ID d'un noeud album.

Il devient donc nécessaire de créer une nouvelle mise en page nommée xml dans le fichier de surcharge layout.ini.append.php du siteaccess public:

[xml]   <=== NOM DE LA MISE EN PAGE
PageLayout=listplayer_layout.tpl    <=== TEMPLATE ASSOCIÉ AU NOM DE LA MISE EN PAGE

Le template listplayer_layout.tpl sera placé dans le répertoire:

design/plain_site/templates/

et contient les 7 lignes suivantes:

1 <rss version="2.0"  xmlns:media="http://luxpopuli.fr/">
2     <channel>
3     <title>Example media RSS playlist for the JW Player</title>
4      <link>http://www.jeroenwijering.com</link>
5    {$module_result.content}
6     </channel>
7 </rss>

Bien sûr, {$module_result.content} contiendra cette fois-ci le résultat de l'exécution du module content et du template de vue BBB, c'est à dire playerlist.tpl.

IV - Création du template de vue playerlist.tpl

Ce template de vue est placé obligatoirement dans le répertoire:

design/plain_site/templates/node/view/

et contient le code (commenté) suivant:

1 {*  $node EST LIE AU NOEUD SOUS LEQUEL SONT PLACÉS LES FICHIERS AUDIO.
2     $node CORRESPOND DONC AU NOEUD DES ALBUMS *}
3 {* ON COMMENCE PAR RÉCUPÉRER LA LISTE DES fichier_audio PLACÉS SOUS LE NOEUD album TRAITÉ *}
4 {let    $tracks=fetch_alias(children,hash( 'parent_node_id', $node.node_id,
5                                             'sort_by', array('name',true()),
6                                             'class_filter_type', 'include',
7                                             'class_filter_array', array( 'femoca_fichier_audio')),
8                                             'depth', 1)}
9 {if not($tracks)}{* S'IL N'Y A PAS DE fichier_audio ALORS ON AFFICHE UN MESSAGE EN FRANÇAIS ET EN ANGLAIS EN LIEU ET PLACE DES TITRES *}
10     <item>
11         <title>Liste à venir</title>
12         <link>http://femoca.fr</link>
13         <description>Les listes de lecture sont constitutées toutes les 30 minutes. Merci de patienter.</description>
14         <media:content url='#' type="audio/mpeg" />
15     </item>
16     <item>
17         <title>The playlist is comming soon</title>
18         <link>http://femoca.fr</link>
19         <description>The playlists are generated every 30 minutes. Thank's for your patience.</description>
20         <media:content url='#' type="audio/mpeg" />
21     </item>
22 {else} {* S'IL Y A DES fichier_audio *}
23 {foreach $tracks as $track}{* ALORS POUR CHACUN D'EUX *}
24     <item>
25         <title>{$track.data_map.nom_fichier_audio.content}</title>{* ON AFFICHE LE TITRE *}
26         <link>http://femoca.fr</link>
27         <description>{$track.data_map.description_fichier_audio.data_text}</description>{* ON AFFICHE UNE PETITE DESCRIPTION SI ELLE EXISTE *}
28         <media:content url={concat('"http://',ezsys('hostname'),$track.data_map.fichier_telecharge.content.filepath|ezroot(no),'"')} type="audio/mpeg" />{* LE LIEN VERS LE FICHIER mp3 *}
29     </item>
30 {/foreach}
31 {/if}

A ce stade, videz tous les caches.

:
Dans ce template, tous les caractères accentués doivent être remplacés par la valeur de leur code numérique : dans le cadre ci-dessus, eZ Publish transforme automatiquement les codes, donc on peut lire directement le mot «constituées». Suis-je clair ?!

Anticipons un peu

A présent que nous disposons du template de mise en page listplayer_layout.tpl et du template de vue playerlist.tpl, nous sommes en mesure de tester l'affichage (tout à fait inutile pour nous) de cet URI:

http://femoca.fr/index.php/layout/set/xml/content/view/playerlist/30

qui renvoie ceci:

et dont le code source est:

<!-- CE FICHIER EST UTILISE EN RAISON DE CE QUI EST INDIQUE DANS settings/siteaccess/plain_site/layout.ini.append.php -->
<rss version="2.0"  xmlns:media="http://luxpopuli.fr/">
    <channel>
    <title>Example media RSS playlist for the JW Player</title>
     <link>http://www.jeroenwijering.com</link>
 
 
    <item>
        <title>bunny</title>
        <link>http://femoca.fr</link>
        <description>Bunny</description>
        <media:content url="http://femoca.fr/var/plain_site/storage/original/audio/629c7143364cc9d740ba24bddf05cea9.mp3" type="audio/mpeg" />
    </item>
    <item>
        <title>Piste01</title>
        <link>http://femoca.fr</link>
        <description></description>
        <media:content url="http://femoca.fr/var/plain_site/storage/original/audio/23a978a4eefb8e74d3dd088731f3f9ae" type="audio/mpeg" />
    </item>
    <item>
        <title>Piste02</title>
        <link>http://femoca.fr</link>
        <description></description>
        <media:content url="http://femoca.fr/var/plain_site/storage/original/audio/7c26afdfeb9f07b334d463dd8ece057b" type="audio/mpeg" />
    </item>
    <item>
        <title>Piste03</title>
        <link>http://femoca.fr</link>
        <description></description>
        <media:content url="http://femoca.fr/var/plain_site/storage/original/audio/58d9aa09b57b18202b1932ec65bb151f" type="audio/mpeg" />
    </item>
    <item>
        <title>Piste04</title>
        <link>http://femoca.fr</link>
        <description></description>
        <media:content url="http://femoca.fr/var/plain_site/storage/original/audio/7212763a21b712101ce70d05a07f3e67" type="audio/mpeg" />
    </item>
    <item>
        <title>Piste05</title>
        <link>http://femoca.fr</link>
        <description></description>
        <media:content url="http://femoca.fr/var/plain_site/storage/original/audio/1b5449fa39db793dbae9d22643f765f4" type="audio/mpeg" />
    </item>
    </channel>
</rss>

Encore une fois, afficher une telle page ne nous intéresse pas le moins du monde. Par contre, créer des fichiers xml contenant le code source ci-dessus constitue rien mois que le but à atteindre. Ce sera le rôle dévolu au script creationPlaylist.txt.

V - Création du script creationPlaylist.txt

C'est la dernière étape.

Voici le contenu de ce script:

1 #!/bin/bash
2 cd /usr/local/www/linuxorable/femoca/design/plain_site/listesAlbums/
3 wget -q http://femoca.fr/index.php/layout/set/playlist/content/view/creationplaylist/60 -O listes.txt
4 for i in `cat listes.txt`
5 do
6 nomfichier=$(echo $i|cut -d '/' -f11);
7 wget -q $i -O liste.$nomfichier.xml
8 done
9 exit 0
  • Ligne 2 : le système se place dans le sous-répertoire (à créer) listesAlbums qui contiendra l'ensemble des playlists de tous les albums de tous les artistes.
  • Ligne 3 : le script, par le biais de la commande wget ( -q = mode silencieux), crée le fichier listes.txt. L'option -O listes.txt force le système à écraser tout précédent fichier du même nom déjà existant dans le répertoire.
  • Ligne 4 : on démarre une boucle qui va lire ligne à ligne le fchier listes.txt et affecter à la variable i la chaîne de caratères que constitue la ligne traitée. La variable $i vaudra donc, par exemple, au premier passage de la boucle http://femoca.fr/index.php/layout/set/xml/content/view/playerlist/30
  • Ligne 6 : on affecte à la variable $nomfichier le dernier champ (le 11ème) de la variable $i, c'est à dire 30 pour le premier passage de la boucle. C'est le / (slash) qui délimite chaque champ.
  • Ligne 7 : c'est la plus importante puisque c'est elle qui crée les playlists ! En effet, toujours dans le sous-répertoire listesAlbums et pour le premier passage par exemple, la ligne de commande lancée est la suivante:
    wget -q http://femoca.fr/index.php/layout/set/xml/content/view/playerlist/30 -O liste.30.xml
    ce qui a pour conséquence de créer un fichier liste.30.xml dans le répertoire listesAlbums. Et ceci est parfaitement en adéquation avec la ligne 20 du code du template dossierDiscotheque.tpl qui indique au player d'aller lire la liste de lecture « listesAlbums/liste.', $album.node_id,'.xml'».

Ce script, placé par exemple à la racine du site, est rendu exécutable par la commande suivante:

chmod +x creationPlaylist.txt

Puis on lui affecte le bos utilisateur et groupe d'utilisateurs:

chown www-data:www-data creationPlaylist.txt

Création de la tâche cron

Cette tâche aura pour mission d'exécuter à intervalle régulier, toutes les 30 minutes dans l'exemple ci-dessous, le script creationPlaylist.txt.

Pour éditer le tableau des tâches cron de l'utilisateur sous lequel s'exécute le serveur Apache (voir la valeur de la directive User du fichier de configuration de Apache), on lace la commande suivante:

crontab -u www-data -e

Puis on ajoute cette ligne (commande VI):

*/30 * * * *    /usr/local/www/linuxorable/femoca/creationPlaylist.txt

Voilà, c'est terminé.

Commentaires