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














