ADD Pompage des images ! :)
authorpifou <pifou@02bbb61a-6d21-0410-aba0-cb053bdfd66a>
Fri, 29 Jun 2007 16:29:33 +0000 (16:29 +0000)
committerpifou <pifou@02bbb61a-6d21-0410-aba0-cb053bdfd66a>
Fri, 29 Jun 2007 16:29:33 +0000 (16:29 +0000)
git-svn-id: svn://euphorik.ch/pompage@42 02bbb61a-6d21-0410-aba0-cb053bdfd66a

js/yopyop.js
src/basemodule.rb
src/constantes.rb
src/film.rb
src/films.rb
src/modules/allocine.rb
src/yopyop.rb
xml/test.xml
xsl/yopyop.xsl

index c4b2af0..da49920 100644 (file)
@@ -122,7 +122,7 @@ function doRecherche(f)
       if (\r
          afficherTout ||\r
          document.getElementById("checkRechercheTitre").checked && rechercheRegExp.test(lignes[i].childNodes[2].textContent) \r
-         || document.getElementById("checkRechercheGenres").checked && rechercheRegExp.test(tableDetails[0].firstChild.nextSibling.textContent) \r
+         || document.getElementById("checkRechercheGenres").checked && rechercheRegExp.test(tableDetails[0].firstChild.nextSibling.nextSibling.textContent) \r
          || document.getElementById("checkRechercheRealisateurs").checked && rechercheRegExp.test(tableDetails[1].firstChild.nextSibling.textContent)\r
          || document.getElementById("checkRechercheActeurs").checked && rechercheRegExp.test(tableDetails[2].firstChild.nextSibling.textContent) \r
          || document.getElementById("checkRecherchePays").checked && rechercheRegExp.test(tableDetails[3].firstChild.nextSibling.textContent))      \r
index 725b212..38849f2 100644 (file)
@@ -1,5 +1,5 @@
-# Attention : les méthodes peuvent être accédées par plusieurs threads simultanément\r
-class Basemodule\r
+\r
+class Basemodule   \r
    # Retourne un Hash contenant les ids (de allocine) trouvés indexés par une chaine.\r
    # Cette chaine contient des infos du film, par exemple le titre et l'année.\r
    # Cette chaine sert, dans le cas ou il y a plusieurs réponses, à proposer un choix à l'utilisateur.\r
@@ -15,4 +15,9 @@ class Basemodule
    def load(id)\r
       raise\r
    end   \r
+    \r
+   # appelé lorsque le module n'est plus utile (permet de libérer des ressource par exemple).\r
+   def finish\r
+      \r
+   end\r
 end
\ No newline at end of file
index b0d2428..f7461c2 100644 (file)
@@ -16,4 +16,4 @@ LOAD_DATA = true
 NB_CONN_MAX = 1\r
 \r
 # une aide pour l'utilisateur\r
-USAGE = 'USAGE : yopyop.rb -x <xml file> [-d <directory>] [-m <module>]'
\ No newline at end of file
+USAGE = 'USAGE : yopyop.rb -x <xml file> [-d <directory>] [-m <module>] [-a <dir affichettes>]'
\ No newline at end of file
index a282441..309f686 100644 (file)
@@ -21,18 +21,15 @@ class String
 end\r
 \r
 class Film\r
-   \r
-   def Film::setModule(m)\r
-      @@module = m\r
-   end\r
-   \r
+      \r
    # toutes les données membres sont accessibles par défaut (écriture/lecture)\r
-   attr_accessor :id, :titre, :url, :fichiers, :annee, :realisateurs, :acteurs, :pays, :duree, :critiquePresse, :critiqueSpectateur, :genres, :synopsis, :budget\r
+   attr_accessor :id, :titre, :url, :fichiers, :mod, :annee, :realisateurs, :acteurs, :pays, :duree, :critiquePresse, :critiqueSpectateur, :genres, :synopsis, :budget\r
 \r
    # Constructeur. N'entreprend aucune action (chargement), crée juste un film vide.\r
    # p1 [String] : le fichier correspondant au film\r
-   def initialize(fichier)\r
+   def initialize(fichier, mod)\r
       @fichiers = [fichier] # le chemin des fichiers est relatif au repertoire de base\r
+      @mod = mod\r
            \r
       @id = 0\r
       @titre = ''\r
@@ -102,7 +99,7 @@ class Film
          end\r
       end\r
       \r
-      @@module.load(@choix[tabNoms[choix-1]], self)\r
+      @mod.load(@choix[tabNoms[choix-1]], self)\r
       \r
       return 1\r
    end\r
@@ -135,11 +132,11 @@ class Film
          return self\r
       end\r
       \r
-      reponses = @@module.rechercherFilm(titre)\r
+      reponses = @mod.rechercherFilm(titre)\r
       @nbReponses = reponses.size\r
       \r
       if @nbReponses == 1\r
-         @@module.load(reponses.values[0], self)\r
+         @mod.load(reponses.values[0], self)\r
       else\r
          @choix = reponses   \r
       end\r
index 585970e..e93e615 100644 (file)
@@ -1,4 +1,4 @@
-# Représente un ensemble de films\r
+# Représente un ensemble de films\r
 \r
 require 'rexml/document'\r
 require 'thwait'\r
@@ -11,9 +11,11 @@ require 'constantes.rb'
 require 'iconv'\r
 \r
 class Films\r
-   def initialize(xmlFile)\r
+   def initialize(xmlFile, modClasse)\r
       @xmlFile = xmlFile\r
       \r
+      @modClasse = modClasse\r
+      \r
       # repertoire de base, par exemple C:/Divx/\r
       @repBase = ''   \r
          \r
@@ -82,6 +84,10 @@ class Films
          i += 1\r
       }\r
       \r
+      @films.each{|t,f|\r
+         f.mod.finish\r
+      }\r
+      \r
       Dir::chdir(repPrecedant)      \r
    end\r
    \r
@@ -120,7 +126,7 @@ class Films
       racine.each_element{|e|       \r
          id = e.attribute('id').to_s.to_i\r
        \r
-         if id > @idDisponible\r
+         if id >= @idDisponible\r
             @idDisponible = id + 1   \r
          end\r
          \r
@@ -138,7 +144,7 @@ class Films
          pays = e.get_elements('lespays')[0].get_elements('pays')\r
          genres = e.get_elements('genres')[0].get_elements('genre')\r
          \r
-         film = Film::new(fichiers[0].get_text.value)\r
+         film = Film::new(fichiers[0].get_text.value, @modClasse::new)\r
          \r
          film.id = id\r
          film.titre = titre.value unless titre.nil?\r
@@ -243,8 +249,9 @@ class Films
             @threadsWait.join_nowait(\r
                Thread::new{\r
                   begin                  \r
-                     film = Film::new(fichier).loadData\r
+                     film = Film::new(fichier, @modClasse::new)\r
                      film.id = getNewId # on lui donne un nouvel ID\r
+                     film.loadData # on charge ses données\r
                      \r
                      unless film.nil? # le film a été correctement construit\r
                         ajouterFilm(film)\r
index e4173bb..d5da08c 100644 (file)
@@ -1,4 +1,5 @@
 require 'net/http'\r
+require 'uri'\r
 require 'cgi'\r
 require 'thread'\r
 require 'iconv'\r
@@ -7,16 +8,15 @@ require "basemodule.rb"
 \r
 # un mixin pour allocine\r
 class Allocine  < Basemodule\r
-   \r
+      \r
    # Voir le parent.\r
    def rechercherFilm(titre)\r
-      Thread.current["connexion"] = Net::HTTP::new('www.allocine.fr') if Thread.current["connexion"].nil?\r
-      connexion = Thread.current["connexion"]\r
+      @connexion = Net::HTTP::new('www.allocine.fr') if @connexion.nil?\r
       \r
       donneesHtml = nil\r
       begin\r
          begin\r
-            reponse, donneesHtml = connexion.get("/recherche/?rub=1&motcle=#{CGI::escape(Iconv.iconv("ISO-8859-1", "UTF-8", titre)[0])}")\r
+            reponse, donneesHtml = @connexion.get("/recherche/?rub=1&motcle=#{CGI::escape(Iconv.iconv("ISO-8859-1", "UTF-8", titre)[0])}")\r
          rescue Exception => e\r
             p e\r
             puts "[!] Connexion lost, retry.."\r
@@ -38,7 +38,6 @@ class Allocine  < Basemodule
       \r
       reponses = {}\r
       unless titre.nil? or titre.empty?\r
-            \r
          r = donneesHtml.scan(/<a href="\/film\/fichefilm_gen_cfilm=(\d+)\.html" class="link1">(.*?)<\/a>(?:<\/h4><h5 style="color: #666666">&nbsp;(.*?)<\/h5>){0,1}(?:<h4><br \/><\/h4>){0,1}(?:<h4 style="color: #666666"> de (.*?)<\/h4>){0,1}(?:<h4 style="color: #666666">&nbsp;avec (.*?)<\/h4>){0,1}(?:<h4 style="color: #666666">&nbsp;\((.*?)\)<\/h4>){0,1}/)\r
          \r
          r.each{|f|\r
@@ -50,11 +49,27 @@ class Allocine  < Basemodule
    \r
    # Voir le parent.\r
    def load(id, film)      \r
-      Thread.current["connexion"] = Net::HTTP::new('www.allocine.fr') if Thread.current["connexion"].nil?\r
-      connexion = Thread.current["connexion"]\r
-         \r
-      r, ficheHtml = connexion.get("/film/fichefilm_gen_cfilm=#{id}.html") \r
+      @connexion = Net::HTTP::new('www.allocine.fr') if @connexion.nil?\r
+\r
+      r, ficheHtml = @connexion.get("/film/fichefilm_gen_cfilm=#{id}.html") \r
       \r
+      /<img src="(.*?)" border="0" alt="" class="affichette" \/>/ =~ ficheHtml\r
+      unless $1.nil?\r
+         @threadImage = Thread::new($1){|imageUrl|\r
+            begin\r
+               imageUrl = URI.parse(imageUrl)               \r
+               connexionImage = Net::HTTP::new(imageUrl.host)\r
+               r, image = connexionImage.get(imageUrl.path)\r
+               f = File::new($repBase + "/" + $repAffichette + film.id.to_s + ".jpg", 'w').binmode\r
+               f.write(image)\r
+               f.close\r
+            rescue Exception => e\r
+               puts e.message\r
+               puts e.backtrace            \r
+            end\r
+         }\r
+      end\r
+\r
       #convertit le code latin-1 en UTF8\r
       ficheHtml = Iconv.iconv("UTF-8", "ISO-8859-1", ficheHtml)[0]\r
 \r
@@ -121,4 +136,8 @@ class Allocine  < Basemodule
       /Budget<\/b> : (.+?) millions d'euros<\/h4>/ =~ ficheHtml\r
       film.budget = $1 unless $1.nil?\r
    end   \r
+   \r
+   def finish\r
+      @threadImage.join if defined? @threadImage\r
+   end\r
 end
\ No newline at end of file
index 786e6a1..6514cec 100644 (file)
@@ -20,42 +20,44 @@ require 'film.rb'
 $: << Dir::getwd + "/" + __FILE__.split('/')[0]\r
 \r
 # vérifie les arguments donnés\r
-xmlFile = nil\r
-rep = '.'\r
+$xmlFile = nil\r
+$repBase = Dir::getwd\r
+$repFilms = '.'\r
+$repAffichette = '../img/affichette/'\r
 mod = 'Allocine'\r
 \r
 aPrec = ''\r
 $*.each{|a|\r
    case aPrec\r
       when '-x'\r
-         xmlFile = a\r
+         $xmlFile = a\r
       when '-d'\r
-         rep = a\r
+         $repFilms = a\r
       when '-m'\r
          mod = a\r
+      when '-a'\r
+         mod = a\r
    end      \r
    aPrec = a\r
 }\r
 \r
-if xmlFile.nil?\r
+if $xmlFile.nil?\r
    puts USAGE\r
    exit 0\r
 end\r
 \r
-unless File::directory?(rep)\r
- puts "'#{rep}' is not a valid directory"\r
+unless File::directory?($repFilms)\r
+ puts "'#{$repFilms}' is not a valid directory"\r
  exit 1\r
 end      \r
 \r
 require "modules/#{mod}"\r
 \r
-Film::setModule(Module.class_eval(mod)::new)\r
-\r
 # charge les films à partir du fichier xml\r
-films = Films::new(xmlFile)\r
+films = Films::new($xmlFile, Module.class_eval(mod))\r
 \r
 # parcours le dossier donné et recherche les infos sur le net\r
-films.pomper(rep)\r
+films.pomper($repFilms)\r
 \r
 # ecrit le fichier XML\r
 films.sauverFilms()\r
index 8e78ac3..8b710cc 100644 (file)
@@ -1,7 +1,71 @@
 <?xml version='1.0' encoding='UTF-8'?>\r
 <?xml-stylesheet type="text/xsl" href="../xsl/yopyop.xsl"?>\r
 <filmographie>\r
+  <film id='9'>\r
+    <fichiers>\r
+      <fichier>Rocky [x264 Aac] [Fr Eng] [Fr Eng].mkv</fichier>\r
+    </fichiers>\r
+    <titre>Rocky Balboa</titre>\r
+    <annee>2006</annee>\r
+    <realisateurs>\r
+      <realisateur>Sylvester Stallone</realisateur>\r
+    </realisateurs>\r
+    <acteurs>\r
+      <acteur>Sylvester Stallone</acteur>\r
+      <acteur>Burt Young</acteur>\r
+      <acteur>Antonio Tarver</acteur>\r
+    </acteurs>\r
+    <lespays>\r
+      <pays>américain</pays>\r
+    </lespays>\r
+    <duree>105</duree>\r
+    <critiquePresse>4</critiquePresse>\r
+    <critiqueSpectateur>3</critiqueSpectateur>\r
+    <genres>\r
+      <genre>Drame</genre>\r
+      <genre>Action</genre>\r
+    </genres>\r
+    <synopsis>\r
+      <p>Rocky Balboa, le légendaire boxeur, a depuis longtemps quitté le ring. De ses succès, il ne reste plus que des histoires qu&apos;il raconte aux clients de son restaurant. La mort de son épouse lui pèse chaque jour et son fils ne vient jamais le voir.</p>\r
+      <p>Le champion d&apos;aujourd&apos;hui s&apos;appelle Mason Dixon, et tout le monde s&apos;accorde à le définir comme un tueur sans élégance ni coeur. Alors que les promoteurs lui cherchent désespérément un adversaire à sa taille, la légende de Rocky refait surface. L&apos;idée d&apos;opposer deux écoles, deux époques et deux titans aussi différents enflamme tout le monde. Pour Balboa, c&apos;est l&apos;occasion de ranimer les braises d&apos;une passion qui ne l&apos;a jamais quitté. L&apos;esprit d&apos;un champion ne meurt jamais...</p>\r
+    </synopsis>\r
+    <budget unite='euro'/>\r
+    <url>http://www.allocine.fr/film/fichefilm_gen_cfilm=109061.html</url>\r
+  </film>\r
   <film id='5'>\r
+    <fichiers>\r
+      <fichier>Big Boss.avi</fichier>\r
+    </fichiers>\r
+    <titre>Big boss</titre>\r
+    <annee>1971</annee>\r
+    <realisateurs>\r
+      <realisateur>Lo Wei</realisateur>\r
+    </realisateurs>\r
+    <acteurs>\r
+      <acteur>Bruce Lee</acteur>\r
+      <acteur>James Tien</acteur>\r
+      <acteur>Yin-Chieh Han</acteur>\r
+    </acteurs>\r
+    <lespays>\r
+      <pays>hong-kongais</pays>\r
+    </lespays>\r
+    <duree>94</duree>\r
+    <critiquePresse/>\r
+    <critiqueSpectateur/>\r
+    <genres>\r
+      <genre>Drame</genre>\r
+      <genre>Arts Martiaux</genre>\r
+      <genre>Divers</genre>\r
+      <genre>Action</genre>\r
+      <genre>Drame</genre>\r
+    </genres>\r
+    <synopsis>\r
+      <p>Un ouvrier venant de la campagne se révolte contre la milice engagée par son patron pour briser une grève.</p>\r
+    </synopsis>\r
+    <budget unite='euro'/>\r
+    <url>http://www.allocine.fr/film/fichefilm_gen_cfilm=53367.html</url>\r
+  </film>\r
+  <film id='4'>\r
     <fichiers>\r
       <fichier>Banlieue 13.avi</fichier>\r
     </fichiers>\r
@@ -32,7 +96,7 @@
     <budget unite='euro'/>\r
     <url>http://www.allocine.fr/film/fichefilm_gen_cfilm=54107.html</url>\r
   </film>\r
-  <film id='9'>\r
+  <film id='6'>\r
     <fichiers>\r
       <fichier>Le 51e Etat.rmvb</fichier>\r
     </fichiers>\r
     <budget unite='euro'/>\r
     <url>http://www.allocine.fr/film/fichefilm_gen_cfilm=29085.html</url>\r
   </film>\r
-  <film id='2'>\r
-    <fichiers>\r
-      <fichier>Ace Ventura detective chiens et chats [x264 AC3] [Fr Eng] [Fr Eng] [\99]..mkv</fichier>\r
-    </fichiers>\r
-    <titre>Ace Ventura, détective chiens et chats</titre>\r
-    <annee>1994</annee>\r
-    <realisateurs>\r
-      <realisateur>Tom Shadyac</realisateur>\r
-    </realisateurs>\r
-    <acteurs>\r
-      <acteur>Jim Carrey</acteur>\r
-      <acteur>Courteney Cox</acteur>\r
-      <acteur>Sean Young</acteur>\r
-    </acteurs>\r
-    <lespays>\r
-      <pays>américain</pays>\r
-    </lespays>\r
-    <duree>90</duree>\r
-    <critiquePresse/>\r
-    <critiqueSpectateur/>\r
-    <genres>\r
-      <genre>Comédie</genre>\r
-    </genres>\r
-    <synopsis>\r
-      <p>Ace Ventura, un jeune homme décontracté à la banane arrogante et à la démarche élastique, est le Sherlock Holmes de la gent canine. Le voici à nouveau sur les dents quand le dauphin Flocon de neige, la mascotte de l&apos;équipe de football americain de Miami, manque à l&apos;appel.</p>\r
-    </synopsis>\r
-    <budget unite='euro'/>\r
-    <url>http://www.allocine.fr/film/fichefilm_gen_cfilm=11944.html</url>\r
-  </film>\r
-  <film id='12'>\r
+  <film id='8'>\r
     <fichiers>\r
       <fichier>Robocop 3.avi</fichier>\r
     </fichiers>\r
     <budget unite='euro'/>\r
     <url>http://www.allocine.fr/film/fichefilm_gen_cfilm=8143.html</url>\r
   </film>\r
-  <film id='4'>\r
+  <film id='3'>\r
     <fichiers>\r
       <fichier>Assaut sur le central 13 [H264 Aac] [Fr Eng] [Fr Eng Spa] [XCT].mkv</fichier>\r
     </fichiers>\r
       <acteur>John Leguizamo</acteur>\r
     </acteurs>\r
     <lespays>\r
-      <pays>français</pays>\r
-      <pays> américain</pays>\r
+      <pays>américain</pays>\r
+      <pays> français</pays>\r
     </lespays>\r
     <duree>110</duree>\r
     <critiquePresse>4</critiquePresse>\r
     <budget unite='euro'/>\r
     <url>http://www.allocine.fr/film/fichefilm_gen_cfilm=55907.html</url>\r
   </film>\r
+  <film id='1'>\r
+    <fichiers>\r
+      <fichier>A Toute Epreuve.rmvb</fichier>\r
+    </fichiers>\r
+    <titre>A toute epreuve</titre>\r
+    <annee>1992</annee>\r
+    <realisateurs>\r
+      <realisateur>John Woo</realisateur>\r
+    </realisateurs>\r
+    <acteurs>\r
+      <acteur>Tony Leung Chiu Wai</acteur>\r
+      <acteur>Chow Yun-Fat</acteur>\r
+      <acteur>Teresa Mo</acteur>\r
+    </acteurs>\r
+    <lespays>\r
+      <pays>hong-kongais</pays>\r
+      <pays> chinois</pays>\r
+    </lespays>\r
+    <duree>130</duree>\r
+    <critiquePresse/>\r
+    <critiqueSpectateur/>\r
+    <genres>\r
+      <genre>Policier</genre>\r
+      <genre>Action</genre>\r
+    </genres>\r
+    <synopsis>\r
+      <p>Hong-Kong 1997. Les Britannique vont rendre dans quelques mois a la Chine populaire une ville corrompue par le crime. Alors que les policiers ont baissé les bras, un groupe d&apos;inspecteurs, mene par Yuen, surnommé Tequila, décide de mettre fin a la suprématie des gangs.</p>\r
+    </synopsis>\r
+    <budget unite='euro'/>\r
+    <url>http://www.allocine.fr/film/fichefilm_gen_cfilm=8035.html</url>\r
+  </film>\r
+  <film id='10'>\r
+    <fichiers>\r
+      <fichier>Sky High.avi</fichier>\r
+    </fichiers>\r
+    <titre>L&apos;Ecole fantastique</titre>\r
+    <annee>2003</annee>\r
+    <realisateurs>\r
+      <realisateur>Mike Mitchell</realisateur>\r
+    </realisateurs>\r
+    <acteurs>\r
+      <acteur>Michael Angarano</acteur>\r
+      <acteur>Danielle Panabaker</acteur>\r
+      <acteur>Mary Elizabeth Winstead</acteur>\r
+    </acteurs>\r
+    <lespays>\r
+      <pays>américain</pays>\r
+    </lespays>\r
+    <duree>102</duree>\r
+    <critiquePresse/>\r
+    <critiqueSpectateur/>\r
+    <genres>\r
+      <genre>Comédie</genre>\r
+      <genre>Famille</genre>\r
+      <genre>Fantastique</genre>\r
+    </genres>\r
+    <synopsis>\r
+      <p>Will est un jeune garçon tout à fait normal si ce n&apos;est qu&apos;il doit intégrer la prestigieuse école de super-héros appelée Sky High et qu&apos;il n&apos;a pour le moment, aucune idée des super-pouvoirs qui le caractérisent... Il devra jongler entre les super-moqueries de ses camarades et la déception de ses parents, un couple de super-héros légendaires...</p>\r
+    </synopsis>\r
+    <budget unite='euro'/>\r
+    <url>http://www.allocine.fr/film/fichefilm_gen_cfilm=50152.html</url>\r
+  </film>\r
+  <film id='7'>\r
+    <fichiers>\r
+      <fichier>Robocop 1.avi</fichier>\r
+    </fichiers>\r
+    <titre>Robocop</titre>\r
+    <annee>1987</annee>\r
+    <realisateurs>\r
+      <realisateur>Paul Verhoeven</realisateur>\r
+    </realisateurs>\r
+    <acteurs>\r
+      <acteur>Nancy Allen</acteur>\r
+      <acteur>Peter Weller</acteur>\r
+      <acteur>Dan O&apos;Herlihy</acteur>\r
+    </acteurs>\r
+    <lespays>\r
+      <pays>américain</pays>\r
+    </lespays>\r
+    <duree>102</duree>\r
+    <critiquePresse/>\r
+    <critiqueSpectateur/>\r
+    <genres>\r
+      <genre>Fantastique</genre>\r
+    </genres>\r
+    <synopsis>\r
+      <p>A l&apos;aube de l&apos;an 2000, Detroit est, comme toujours dans cette sorte d&apos;histoire, la proie du crime et de la corruption. Pour pallier ce terrible etat, les services de police inventent une nouvelle arme infaillible, Robocop, mi-homme, mi-robot, policier electronique de chair et d&apos;acier qui a pour mission de sauvegarder la tranquillite de la ville. Mais comme souvent, ce cyborg a aussi une ame.</p>\r
+    </synopsis>\r
+    <budget unite='euro'/>\r
+    <url>http://www.allocine.fr/film/fichefilm_gen_cfilm=3085.html</url>\r
+  </film>\r
 </filmographie>
\ No newline at end of file
index e21f409..4ca43e9 100644 (file)
@@ -12,7 +12,7 @@
    <body onload="doRecherche(true)" >\r
    \r
     <div class="entete" >
-     <h1>DivX - TV</h1>\r
+     <h1>DivX</h1>\r
      <div id="nbFilms" ></div>\r
      <img src="../img/logo.png" />\r
      <form class="formulaireRecherche">\r
@@ -52,6 +52,9 @@
         <td colspan="5" class="detail">\r
          <table class="detail" id="detail{@id}">\r
           <tr>\r
+           <td rowspan="5">\r
+            <img src="../img/affichette/{@id}.jpg" />\r
+           </td>           \r
            <td class="titreDetail">Genre<xsl:if test="count(genres/genre) > 1">s</xsl:if></td>\r
            <td><xsl:for-each select="genres/genre"><a onclick="rechercheElement('{.}', 'Genres')"><xsl:value-of select="."/></a><xsl:if test="not(position() = last())">, </xsl:if></xsl:for-each></td>\r
           </tr>\r