git-svn-id: svn://euphorik.ch/pompage@24 02bbb61a-6d21-0410-aba0-cb053bdfd66a
[pompage.git] / src / film.rb
index b795841..c97e518 100644 (file)
@@ -10,25 +10,64 @@ require 'personne.rb'
 \r
 require 'constantes.rb'\r
 \r
+class String\r
+   def virerBalisesHTML\r
+      return self.gsub(/<(.*?)>/, '')\r
+   end\r
+end\r
+\r
 class Film\r
-   attr_accessor :titre, :fichier, :annee, :realisateurs, :acteurs, :pays, :duree, :critiquePresse, :critiqueSpectateur, :genres, :synopsis, :budget\r
+   attr_accessor :id, :titre, :fichiers, :annee, :realisateurs, :acteurs, :pays, :duree, :critiquePresse, :critiqueSpectateur, :genres, :synopsis, :budget\r
+      \r
+   # repertoire de base, par exemple C:/Divx/\r
+   @@repBase = ''   \r
       \r
-   # Les films indexés par leur titre\r
+   # Les films indexés par leur titre\r
    @@films = {}\r
    \r
-   # Les films indexés par leur nom de fichier\r
+   # Les films indexés par leur nom de fichier, deux fichiers différents peuvent pointer sur le même film\r
    @@filmsFichier = {}\r
+   \r
+   # Les films qui ont plusieurs réponses lors de la recherche, traités à la fin\r
+   @@filmsPlusieursReponses = []\r
 \r
-   @@mutex = Mutex::new\r
    @@threadsWait = ThreadsWait::new\r
    @@nbConn = 0\r
+   \r
+   # le prochain id disponible\r
+   @@idDisponible = 1\r
+   \r
+   # retourne un nouvel id, utilisé lors de la création d'un nouveau film\r
+   def Film::getNewId\r
+      id = @@idDisponible\r
+      @@idDisponible += 1\r
+      return id\r
+   end\r
 \r
-\r
-   # Lit un repertoire de manière recursive\r
+   # Lit un repertoire de manière recursive\r
    def Film::litRepertoire(r)\r
-      Film::litRepertoireR(r)\r
+      @@repBase = r\r
+      repPrecedant = Dir::getwd\r
+      Dir::chdir(r)\r
+      \r
+      Film::litRepertoireR('.')\r
+      \r
       # on attends que les threads se terminent\r
       @@threadsWait.all_waits\r
+      \r
+      # traite les films qui avaient plusieurs réponses lors de la recherche\r
+      # l'utilisateur doit faire un choix\r
+      i = 1\r
+      @@filmsPlusieursReponses.each{|f|\r
+         puts\r
+         puts "Plop, ya un conflit #{i} / #{@@filmsPlusieursReponses.length} :"\r
+         if f.reglerConflitPlusieursReponses\r
+            Film::ajouterFilm(f)\r
+         end\r
+         i += 1\r
+      }\r
+      \r
+      Dir::chdir(repPrecedant)      \r
    end\r
    \r
    # Charge les films contenus dans un fichier XML.\r
@@ -37,30 +76,38 @@ class Film
       if !File.exists?(xmlFile)\r
          return\r
       end\r
-            \r
+      \r
       racine = REXML::Document::new(File::new(xmlFile)).root\r
-      racine.each_element{|e|\r
-         fichier = e.get_elements('fichier')[0].get_text\r
-         next if fichier == nil\r
+      racine.each_element{|e|       \r
+         id = e.attribute('id').to_s.to_i\r
+       \r
+         if id > @@idDisponible\r
+            @@idDisponible = id + 1   \r
+         end\r
+         \r
          titre = e.get_elements('titre')[0].get_text\r
+         \r
+         fichiers = e.get_elements('fichiers')[0].get_elements('fichier')\r
          annee = e.get_elements('annee')[0].get_text\r
          duree = e.get_elements('duree')[0].get_text\r
          critiquePresse = e.get_elements('critiquePresse')[0].get_text\r
          critiqueSpectateur = e.get_elements('critiqueSpectateur')[0].get_text\r
          synopsis = e.get_elements('synopsis')[0].get_text\r
          budget = e.get_elements('budget')[0].get_text  \r
-         realisateurs = e.get_elements('realisateur')\r
-         acteurs = e.get_elements('acteur')\r
-         pays = e.get_elements('pays')\r
-         genres = e.get_elements('genres')\r
+         realisateurs = e.get_elements('realisateurs')[0].get_elements('realisateur')\r
+         acteurs = e.get_elements('acteurs')[0].get_elements('acteur')\r
+         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
          \r
-      \r
-         film = Film::new(fichier.value)\r
          film.titre = titre.value unless titre.nil?\r
+         film.id = id\r
+         fichiers.each{|e|\r
+            film.addFichier(e.get_text.value)\r
+            @@filmsFichier[e.get_text.value] = film\r
+         }\r
          film.annee = annee.value unless annee.nil?\r
-         realisateurs.each{|e|\r
-            film.realisateurs << Personne::ajouter(e.get_text.value)\r
-         }        \r
          acteurs.each{|e|\r
             film.acteurs << Personne::ajouter(e.get_text.value)\r
          }\r
@@ -71,80 +118,119 @@ class Film
          film.critiquePresse = critiquePresse.value unless critiquePresse.nil?\r
          film.critiqueSpectateur = critiqueSpectateur.value unless critiqueSpectateur.nil?\r
          genres.each{|e|\r
-            film.genres << Genre::ajouter(e.get_text.value)\r
+            film.genres << Genre::ajouter(e.get_text.value) if e.get_text != nil\r
          }\r
          film.synopsis = synopsis.value unless synopsis.nil?\r
          film.budget = budget.value unless budget.nil?\r
          @@films[film.titre] = film\r
-         @@filmsFichier[film.fichier] = film\r
-      }   \r
+      }\r
    end\r
 \r
-   # Renvoie tous les films sous la forme d'un élement XML.\r
+   # Renvoie tous les films sous la forme d'un document XML.\r
    def Film::getFilmsXml\r
+      # le document\r
+      docXml = REXML::Document::new\r
+      docXml.xml_decl().encoding = "UTF-8"  # normalement UTF-8\r
+      docXml.xml_decl().dowrite\r
+            \r
+      # la racine du document\r
       racine = REXML::Element::new('filmographie')\r
+      docXml.add(racine)\r
+      pi = REXML::Instruction.new("xml-stylesheet", "type=\"text/xsl\" href=\"../xsl/yopyop.xsl\"")\r
+      racine.previous_sibling = pi\r
+      \r
+      # on ajoute chaque film à la racine\r
       @@films.each{|nom, f|\r
          racine.add(f.getXml)\r
-      }\r
-      return REXML::Document::new.add(racine)\r
+      } \r
+      \r
+      # revoie le document\r
+      docXml\r
    end\r
    \r
 private\r
 \r
    def Film::filmsFactory(fichier)\r
-      /^.*?\.(.{3,4})$/ =~ fichier\r
-      if FILMS_EXTENSIONS.include?($1)\r
-         Film::new(fichier).loadData\r
-      end\r
-    end\r
+      Film::new(fichier).loadData\r
+   end\r
     \r
    def Film::litRepertoireR(r)\r
       Dir::foreach(r){|f|\r
-         next if f == '.' or f == '..'\r
-         fichier = r + "/" + f\r
+         next if f[0,1] == '.'\r
+         fichier = (r == '.' ? '' : r + "/") + f\r
          if File::directory?(fichier)\r
             litRepertoireR(fichier) \r
          else\r
-         \r
-            #si le film n'existe pas déjà dans la liste\r
+            \r
+            # vérification de l'extension\r
+            /^.*?\.(.{3,4})$/ =~ fichier\r
+            if !FILMS_EXTENSIONS.include?($1)\r
+               next\r
+            end\r
+            \r
+            fichier = CGI::escapeHTML(fichier.unpack("C*").pack("U*"))\r
+            \r
+            # on skip si le film est déjàa dans la BD\r
             if film = @@filmsFichier[fichier]\r
-               puts "[i] Already exists in DB : #{film.titre} (#{film.fichier})"\r
+               puts "[i] Already exists in DB : #{film.titre} (#{fichier})"\r
                next\r
             end\r
             \r
-            film = nil   \r
+            #p fichier\r
+            \r
+            film = nil\r
+             \r
+            if @@nbConn >= NB_CONN_MAX\r
+               @@threadsWait.next_wait\r
+            end\r
+             \r
             @@nbConn += 1    \r
             @@threadsWait.join_nowait(\r
-               Thread::new{    \r
-                  begin\r
-                     @@mutex.lock if @@nbConn >= NB_CONN_MAX                     \r
-                     #p @@nbConn     \r
-                     film = Film::filmsFactory(fichier)\r
-                     unless film.nil?\r
-                        if @@films.has_key?(film.titre)\r
-                           puts "[!] Duplicate movie : #{film.titre} (#{film.fichier})"\r
-                        else\r
-                           puts "[i] movie added : #{film.titre} (#{film.fichier})"\r
-                           @@films[film.titre] = film\r
-                           @@filmsFichier[film.fichier] = film\r
-                        end\r
+               Thread::new{\r
+                  begin                  \r
+                     film = Film::filmsFactory(fichier)                     \r
+                     unless film.nil? # le film a été correctement construit\r
+                        Film::ajouterFilm(film)\r
                      end\r
-                     @@nbConn -= 1\r
-                     #p @@nbConn\r
-                     @@mutex.unlock\r
-                  rescue  Exception => e\r
+                  rescue Exception => e\r
                      puts e.message\r
                      puts e.backtrace\r
-                  end\r
+                  end      \r
+                  @@nbConn -= 1\r
                }\r
             )\r
          end\r
       }\r
-    end\r
-\r
+   end\r
+   \r
+   def Film::ajouterFilm(film)\r
+      if film.plusieursReponses?\r
+         @@filmsPlusieursReponses << film\r
+         return\r
+      end\r
+      \r
+      # le film existe déjà\r
+      if @@films.has_key?(film.titre)\r
+         # le fichier n'est pas connu -> nième partie d'un film\r
+         if !@@filmsFichier.has_key?(film.fichiers[0])\r
+            puts "[i] movie #{film.titre} has a another file part : #{film.fichiers[0]}"\r
+            @@films[film.titre].addFichier(film.fichiers[0])\r
+            @@filmsFichier[film.fichiers[0]] = @@films[film.titre]                     \r
+         else\r
+            puts "[!] Duplicate movie : #{film.titre} (#{film.fichiers[0]})"\r
+         end\r
+      else\r
+         puts "[i] movie added : #{film.titre} (#{film.fichiers[0]})"\r
+         @@films[film.titre] = film\r
+         @@filmsFichier[film.fichiers[0]] = film\r
+      end\r
+   end\r
+      \r
    \r
    def initialize(fichier)\r
-      @fichier = fichier\r
+      @fichiers = [fichier]\r
+           \r
+      @id = 0\r
       @titre = ''\r
       @annee = nil\r
       @realisateurs = []\r
@@ -157,35 +243,106 @@ private
       @synopsis = nil\r
       @budget = nil      \r
       @budgetUnite = 'euro'\r
+      @url\r
+      \r
+      @aPlusieursReponses = false\r
+      # mémorise les tuples {nom => id} dans le cas ou il y a plusieurs réponses\r
+      @idsAllocine = {}\r
    end\r
 \r
 public \r
-   #charge les informations du films à partir d'allocine.fr\r
+\r
+   def plusieursReponses?\r
+      return @aPlusieursReponses\r
+   end \r
+   \r
+   # demande à l'utilisateur de faire un choix\r
+   # ret : true si le conflit à été résolu sinon false\r
+   def reglerConflitPlusieursReponses\r
+      \r
+      @aPlusieursReponses = false # pour faire les choses bien\r
+      \r
+      puts @fichiers[0]\r
+      puts "Fais ton choix jeune padawan (un caractère et pas plus)"\r
+      tabNoms = @idsAllocine.keys\r
+      choix = 1\r
+      loop do \r
+         i = 1\r
+         tabNoms.each{|n|\r
+           puts "#{i}. #{n}"\r
+           i += 1\r
+         }\r
+         puts "A. Passer et l'ajouter"\r
+         puts "B. Ignorer"\r
+         choix = STDIN.gets\r
+         \r
+         if /A/i =~ choix\r
+            return true\r
+         elsif /B/i =~ choix\r
+            return false\r
+         end\r
+         \r
+         choix = choix.to_i\r
+         if choix > 0 && choix <= tabNoms.length\r
+            break;\r
+         else\r
+            puts\r
+            puts "Choix pas bon !!"\r
+         end\r
+      end\r
+      \r
+      loadDepuisIdAllocine(@idsAllocine[tabNoms[choix-1]])\r
+      \r
+      return true\r
+   end\r
+   \r
+   def addFichier(fichier)\r
+      if !@fichiers.include?(fichier)\r
+         @fichiers << fichier\r
+      end\r
+   end\r
+\r
+   # Charge les informations du films à partir d'allocine.fr\r
+   # ret [Film]\r
    def loadData\r
       unless LOAD_DATA\r
-         @titre = @fichier\r
+         @titre = @fichiers[0]\r
          return self\r
       end\r
+      \r
+      @id = Film::getNewId\r
 \r
-      connexionHttp = Net::HTTP::new('www.allocine.fr');\r
+      connexionHttp = Net::HTTP::new('www.allocine.fr')\r
    \r
-      #extrait le nom à partire du nom du fichier\r
-      /^.*?([^\/]*?)\.(.{3,4})$/ =~ @fichier\r
+      #extrait le nom à partir du nom du fichier\r
+      /^.*?([^\/]*?)\.(.{3,4})$/ =~ @fichiers[0]\r
       #remplace undescores et points par des espaces\r
       titre = $1.gsub(/[_\.]/, ' ')\r
-      #vire les espaces au début et à la fin\r
-      titre.strip!\r
       #remplace les suites d'espaces par un seul\r
       titre.gsub!(/ {2,}/,' ')\r
       titre.gsub!(/\[.*?\]/,'')\r
       titre.gsub!(/\(.*?\)/,'')\r
+      titre.gsub!(/\{.*?\}/,'')\r
+      #vire les espaces au début et à la fin\r
+      titre.strip!\r
+      \r
       @titre = titre.dup\r
       \r
       donneesHtml = nil\r
       begin\r
-         reponse, donneesHtml = connexionHttp.get("/recherche/?motcle=#{CGI::escape(titre)}")\r
-         #si pas trouvé alors on enlève un mot à la fin\r
-         if /.*?Pas de résultats.*?/ =~ donneesHtml\r
+         begin\r
+            reponse, donneesHtml = connexionHttp.get("/recherche/?motcle=#{CGI::escape(titre.unpack("U*").pack("C*"))}")\r
+         rescue Exception => e\r
+            p e\r
+            puts "[!] Connexion lost, retry.."\r
+            retry\r
+         end\r
+         \r
+         #convertit le code latin-1 en UTF8\r
+         donneesHtml = donneesHtml.unpack("C*").pack("U*")\r
+         \r
+         #si pas trouvé alors on enlève un mot à la fin\r
+         if /.*?Pas de résultats.*?/ =~ donneesHtml || ! donneesHtml.include?("<h3><b>Films <h4>")\r
             /(.*?)[^ ]+?$/ =~ titre.strip\r
             titre = $1\r
             titre.strip!\r
@@ -195,96 +352,149 @@ public
       end while not titre.nil? and not titre.empty?\r
       \r
       unless titre.nil? or titre.empty?\r
-         /<a href="\/film\/fichefilm_gen_cfilm=(\d+)\.html" class="link1">/ =~ donneesHtml\r
-         if $1\r
-            r, ficheHtml = connexionHttp.get("/film/fichefilm_gen_cfilm=#{$1}.html")      \r
-            \r
-            # Titre\r
-            /<title>(.*?)<\/title>/ =~ ficheHtml\r
-            @titre = $1 unless $1.nil?\r
-            \r
-            #puts "Movie found : #{@titre} (#{@fichier})"\r
-            \r
-            # Année\r
-            /<h4>Année de production : (\d+)<\/h4>/ =~ ficheHtml\r
-            @annee = $1.to_i unless $1.nil?     \r
             \r
-            # Réalisateurs\r
-            /Réalisé par <a class="link1" href=".*?" target="">(.*?)<\/a>/ =~ ficheHtml\r
-            @realisateurs << Personne::ajouter($1) unless $1.nil?\r
-                        \r
-            # Acteurs\r
-            /Avec(.*)/ =~ ficheHtml\r
-            $1.scan(/<a class="link1" href="\/personne\/fichepersonne_gen_cpersonne=\d+\.html" target="">(.+?)<\/a>/m){|a|\r
-               @acteurs << Personne::ajouter(a[0]) unless a[0].nil? \r
-            } unless $1.nil?     \r
-                      \r
-            # Pays\r
-            /^<h4>Film (.*?)\.<\/h4>/ =~ ficheHtml\r
-            $1.split(',').each{|pays|\r
-               @pays << Pays::ajouter(pays) unless pays.nil?\r
-            } unless $1.nil? \r
-            \r
-            # Duree\r
-            /<h4>Durée : (\d+?)h (\d+?)min.<\/h4>/ =~ ficheHtml\r
-            @duree = $1.nil? ? $2.to_i : $1.to_i * 60 + $2.to_i\r
-            \r
-            # Critique presse\r
-            /Presse<\/a> <img src=".*?etoile_(\d)\.gif"/ =~ ficheHtml\r
-            @critiquePresse = $1.to_i unless $1.nil?\r
-                                    \r
-            # Critique spectateur\r
-            /Spectateurs<\/a> <img src=".*?etoile_(\d)\.gif"/ =~ ficheHtml\r
-            @critiqueSpectateur = $1.to_i unless $1.nil?\r
-            \r
-            # Genre\r
-            /Genre : (.*)/ =~ ficheHtml\r
-            $1.scan(/<a href="\/film\/alaffiche_genre_gen_genre=.*?" class="link1">(.+?)<\/a>/m){|g|\r
-               @genres << Genre::ajouter(g[0]) unless g[0].nil?\r
-            } unless $1.nil?     \r
-            \r
-            # Synopsis            \r
-            /Synopsis.*?<h4>(.+?)<\/h4>/m =~ ficheHtml\r
-            @synopsis = $1 unless $1.nil?\r
-            \r
-            # Budget       \r
-            /Budget<\/b> : (.+?) millions d'euros<\/h4>/ =~ ficheHtml\r
-            @budget = $1.to_i unless $1.nil?\r
-         else         \r
+         #/<a href="\/film\/fichefilm_gen_cfilm=(\d+)\.html" class="link1">/ =~ donneesHtml\r
+         #r = donneesHtml.scan(/<a href="\/film\/fichefilm_gen_cfilm=(\d+)\.html" class="link1">(.*?)<\/a>/)\r
+         r = donneesHtml.scan(/<a href="\/film\/fichefilm_gen_cfilm=(\d+)\.html" class="link1">(.*?)<\/a>(?:<\/h4><h5 style="color: #666666">&nbsp;(.*?)<\/h5>){0,1}/)\r
+         \r
+         if r.length > 1\r
+            @aPlusieursReponses = true\r
+            r.each{|f|\r
+               @idsAllocine[f[1].virerBalisesHTML + (f[2] != nil ? " " + f[2].virerBalisesHTML : "")] = f[0]\r
+            }\r
+         elsif r.length == 1\r
+            loadDepuisIdAllocine(r[0][0], connexionHttp) \r
+         else\r
             puts "[!] Movie not found : #{@titre} (#{@fichier})"\r
          end\r
       end\r
       self\r
    end\r
    \r
-   def getXml   \r
+private\r
+   def loadDepuisIdAllocine(id, connexionHttp = nil)\r
+      if (connexionHttp == nil)\r
+         connexionHttp = Net::HTTP::new('www.allocine.fr')\r
+      end\r
+         \r
+      r, ficheHtml = connexionHttp.get("/film/fichefilm_gen_cfilm=#{id}.html") \r
+      \r
+      #convertit le code latin-1 en UTF8\r
+      ficheHtml = ficheHtml.unpack("C*").pack("U*")\r
+\r
+      #url\r
+      @url = "http://www.allocine.fr/film/fichefilm_gen_cfilm=#{id}.html"\r
+      \r
+      # Titre\r
+      /<title>(.*?)<\/title>/ =~ ficheHtml\r
+      @titre = $1 unless $1.nil?\r
+      \r
+      puts "Movie found : #{@titre} (#{@fichiers[0]})"\r
+      \r
+      # Année\r
+      /<h4>Année de production : (\d+)<\/h4>/ =~ ficheHtml\r
+      @annee = $1 unless $1.nil?\r
+      \r
+      # Réalisateurs\r
+      /<h4>Réalisé par(.*?)<\/h4>/ =~ ficheHtml\r
+      $1.scan(/<a class="link1" href=".*?">(.*?)<\/a>/m){|a|\r
+        @realisateurs << Personne::ajouter(a[0]) unless a[0].nil?\r
+      } unless $1.nil?\r
+      \r
+      # Acteurs\r
+      /<h4>Avec(.*?)<\/h4>/ =~ ficheHtml\r
+      $1.scan(/<a class="link1" href="\/personne\/fichepersonne_gen_cpersonne=\d+\.html">(.+?)<\/a>/m){|a|\r
+         @acteurs << Personne::ajouter(a[0]) unless a[0].nil? \r
+      } unless $1.nil? \r
+                \r
+      # Pays\r
+      /<h4>Film (.*?)\.&nbsp;<\/h4>/ =~ ficheHtml\r
+      $1.split(',').each{|pays|\r
+         @pays << Pays::ajouter(pays) unless pays.nil?\r
+      } unless $1.nil? \r
+      \r
+      # Duree (capture des heures et des minutes séparement vue que c'est le bordel sur allocine\r
+      /<h4>Durée :(?:.*?)(\d+)h/ =~ ficheHtml\r
+      heure = $1.nil? ? 0 : $1.to_i\r
+      \r
+      /<h4>Durée :(?:.*?)(\d+)min/ =~ ficheHtml\r
+      min = $1.nil? ? 0 : $1.to_i\r
+         \r
+      @duree = heure * 60 + min\r
+      \r
+      # Critiques presse et spectateur\r
+      /Presse.*etoile_([012345]).*Spectateurs.*etoile_([012345])"/m =~ ficheHtml\r
+      @critiquePresse = $1 unless $1.nil?\r
+      @critiqueSpectateur = $2 unless $2.nil?\r
+      \r
+      # Genre\r
+      /<h4>Genre : (.*?)<\/h4>/ =~ ficheHtml\r
+      $1.scan(/<a href="\/film\/alaffiche_genre_gen_genre=.*?" class="link1">(.+?)<\/a>/m){|g|\r
+         @genres << Genre::ajouter(g[0]) unless g[0].nil?\r
+      } unless $1.nil?     \r
+      \r
+      # Synopsis            \r
+      /Synopsis.*?<h4>(.+?)<\/h4>/m =~ ficheHtml\r
+      @synopsis = $1 unless $1.nil?\r
+      \r
+      # Budget       \r
+      /Budget<\/b> : (.+?) millions d'euros<\/h4>/ =~ ficheHtml\r
+      @budget = $1 unless $1.nil?\r
+   end     \r
+      \r
+public\r
+   \r
+   # Renvoie un film sous la forme d'un élément XML de type REXML\r
+   def getXml\r
+      \r
       racine = REXML::Element::new('film')\r
-      racine.add(REXML::Element::new('fichier').add_text(@fichier))\r
+      racine.add_attribute('id', @id.to_s)\r
+      \r
+      fichiers = REXML::Element::new('fichiers')\r
+      @fichiers.each{|f|\r
+         fichiers.add(REXML::Element::new('fichier').add_text(f))  \r
+      }\r
+      racine.add(fichiers)      \r
+      \r
       racine.add(REXML::Element::new('titre').add_text(@titre))\r
-      racine.add(REXML::Element::new('annee').add_text(@annee.to_s))\r
+      racine.add(REXML::Element::new('annee').add_text(@annee))\r
 \r
+      realisateurs = REXML::Element::new('realisateurs')      \r
       @realisateurs.each{|r|\r
-         racine.add(REXML::Element::new('realisateur').add_text(r.nom))\r
+         realisateurs.add(REXML::Element::new('realisateur').add_text(r.nom))\r
       }\r
+      racine.add(realisateurs)\r
    \r
+      acteurs = REXML::Element::new('acteurs')  \r
       @acteurs.each{|a|\r
-         racine.add(REXML::Element::new('acteur').add_text(a.nom))\r
+         acteurs.add(REXML::Element::new('acteur').add_text(a.nom))\r
       }\r
+      racine.add(acteurs)      \r
+      \r
+      lespays = REXML::Element::new('lespays')\r
       @pays.each{|p|\r
-         racine.add(REXML::Element::new('pays').add_text(p.nom))\r
+         lespays.add(REXML::Element::new('pays').add_text(p.nom))\r
       }      \r
+      racine.add(lespays) \r
+      \r
       racine.add(REXML::Element::new('duree').add_text(@duree.to_s))\r
 \r
-      racine.add(REXML::Element::new('critiquePresse').add_text(@critiquePresse.to_s))\r
-      racine.add(REXML::Element::new('critiqueSpectateur').add_text(@critiqueSpectateur.to_s))\r
+      racine.add(REXML::Element::new('critiquePresse').add_text(@critiquePresse))\r
+      racine.add(REXML::Element::new('critiqueSpectateur').add_text(@critiqueSpectateur))\r
+      \r
+      genres = REXML::Element::new('genres')\r
       @genres.each{|g|\r
-         racine.add(REXML::Element::new('genre').add_text(g.nom))\r
+         genres.add(REXML::Element::new('genre').add_text(g.nom))\r
       }      \r
+      racine.add(genres) \r
+      \r
       racine.add(REXML::Element::new('synopsis').add_text(@synopsis))\r
       budgetElement = REXML::Element::new('budget')\r
-      budgetElement.add_text(@budget.to_s)\r
+      budgetElement.add_text(@budget)\r
       budgetElement.add_attribute('unite', @budgetUnite)\r
       racine.add(budgetElement)\r
+      \r
+      racine.add(REXML::Element::new('url').add_text(@url))\r
 \r
       racine\r
    end\r