XSPF : une play-liste XML ( de MP3 )

Le XSPF , c’est une liste de documents multimedia, ici MP3, au format XML.

Cette contribution ne fournit que cette liste à destination d’un player comme Musicplayer pour la jouer, ou tout autre utilitaire.
La liste est constituée de tous les documents mp3 joints à un article.
Cela produit un .xspf , l’url est utilisable à la place d’un fichier .xspf comme dans :

<embed src=”[(#URL_SITE_SPIP)]/XSPF/xspf_player.swf?
playlist_url=[(#URL_SITE_SPIP|urlencode)]%2Fxspf.php3%3Fid_article%3D[(#ENV{id_article})]”
name=”xspf_player” allowscriptaccess=”sameDomain” type=”application/x-shockwave-flash”
quality=”high” pluginspage=”http://www.macromedia.com/go/getflashplayer”
align=”center” width=”<?php echo [(#ENV{largeur})] – 20; ?>” height=”153″ />

(lignes volontairement coupées pour faciliter la lecture)

Voilà donc la constitution d’un xspf simple de tous les documents mp3 associés à un article.
Il référence la version 0 de XSPF pour un maximum de compatibilité.
C’est du LGPL pour 1.8.x.

Créez un xspf.php3 à la racine comme :

  1. <?php
  2. $fond = “xspf”;
  3. $delais = 24 * 3600;
  4. $flag_preserver = true;
  5. function ascii($texte) {
  6. return translitteration($texte);
  7. }
  8. include (“inc-public.php3”);
  9. ?>

Notes :
- $fond précise que nous appelons le fond du même nom “xspf” , soit xspf.html
- $delai 1 jour
- $flag_preserver à true pour ne pas avoir le menu admin
- la fonction ascii() est un filtre pour les titres , que tous les caractères soient 7-bit 🙁
- elle utilise translitteration() qui est dans le noyau de spip.

Il référence donc dans le dossier squelette, un xspf.html :

  1. <BOUCLE_article_principal(ARTICLES) {id_article}>
  2. <?php
  3. header(‘Content-type: application/xspf+xml’);
  4. echo ‘<?xml version=”1.0″ encoding=”#CHARSET”?>’ . “\n”;
  5. $def = ‘[(#LOGO_ARTICLE_RUBRIQUE||extraire_attribut{src})]’;
  6. if (!$def) {
  7. $def = ‘IMG/jpg/jukebox.jpg’;
  8. }
  9. ?>
  10. <playlist version=”0″ xmlns = “http://xspf.org/ns/0/”>
  11. <title>[(#NOM_SITE_SPIP|ascii)]: [(#TITRE|ascii)]</title>
  12. <B_morceaux>
  13. <trackList>
  14. <BOUCLE_morceaux(DOCUMENTS){id_article}{mode=document}{extension==mp3$}{par num titre}{par id_document}>
  15. <?php
  16. $img = ‘[(#LOGO_DOCUMENT||extraire_attribut{src})]’;
  17. if ($img == ‘IMG/icones/mp3-dist.png’) {
  18. $img = $def;
  19. }
  20. ?>
  21. <track>
  22. <location>[(#URL_DOCUMENT|url_absolue)]</location>
  23. <image>[(#URL_SITE_SPIP)]/<?php echo $img; ?></image>
  24. <annotation>[(#TITRE|supprimer_numero|texte_backend)]</annotation>
  25. </track>
  26. </BOUCLE_morceaux>
  27. </trackList>
  28. </B_morceaux>
  29. </playlist>
  30. </BOUCLE_article_principal>
  31. <:aucun_article:>
  32. <//B_article_principal>

Les 2 premières lignes fixent le format produit. Le header est important pour les navigateurs sensibles.

Ensuite, $def essaye de récupérer une image défaut , oui , une image est associée à chaque morceau , donc ce sera $def si un document mp3 n’a pas de vignette.
Le défaut est le logo de l’article , s’il n’y en a pas , c’est bétonné ’IMG/jpg/jukebox.jpg’

C’est assez court , beaucoup d’intrusion de php , ça ne sert à rient sans un player comme Musicplayer
Il y a des exemples d’utilisation chez Léon Larchet
J’ai entendu dire que boOz préparait des choses du même genre , et peut-être une même liste préparée “on the fly” en javascript

2Pistes2
- Il serait possible de constituer un XSPF beaucoup plus complet, avec les durées , auteurs , titres … mais ça serait beucoup plus lourd puisqu’il faudrait accéder à chaque document pour récupérer ces données dans les ID3 tags ou même les frames. Contactez-moi si besoin.
Voyez aussi getid3
- je pense étendre cette contrib pour éventuellement balayer une rubrique aussi , c’est à dire fabriquer la même liste avec tous les mp3 joints aux articles d’une rubrique.

This entry was posted in Uncategorized. Bookmark the permalink.

Leave a Reply