MOD Le fichier film.rb et divisé en film.rb et films.rb pour une meilleure lecture
authorpifou <pifou@02bbb61a-6d21-0410-aba0-cb053bdfd66a>
Thu, 28 Jun 2007 07:41:29 +0000 (07:41 +0000)
committerpifou <pifou@02bbb61a-6d21-0410-aba0-cb053bdfd66a>
Thu, 28 Jun 2007 07:41:29 +0000 (07:41 +0000)
MOD correction de différents bugs

git-svn-id: svn://euphorik.ch/pompage@32 02bbb61a-6d21-0410-aba0-cb053bdfd66a

src/film.rb
src/films.rb [new file with mode: 0644]
src/yopyop.rb
start_test.bat
xml/test.xml

index b8b3e07..30a5bc8 100644 (file)
@@ -1,15 +1,14 @@
-# Attention, le but de ce fichier n'est pas d'être le plus clair possible ^-^´´\r
+# Représente un Film.\r
+# Permet de charger des données depuis allocine.fr\r
+# Permet d'effectuer des recherches depuis allocine.fr\r
+# TODO : rendre la classe indépendant de la source de donnée pour pouvoir utiliser d'autres sites comme par exemple imdb.com\r
 \r
-require 'rexml/document'\r
 require 'net/http'\r
-require 'thread'\r
-require 'thwait'\r
 require 'cgi'\r
 \r
 require 'pays.rb'\r
 require 'genre.rb'\r
 require 'personne.rb'\r
-\r
 require 'constantes.rb'\r
 \r
 class String\r
@@ -23,215 +22,8 @@ end
 \r
 class Film\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
-   @@films = {}\r
-   \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
-   @@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
-   # Lit un repertoire de manière recursive\r
-   def Film::litRepertoire(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
-   def Film::loadFilmsXml(xmlFile)\r
-      # si le fichier n'existe pas il n'y a rien à charger\r
-      if !File.exists?(xmlFile)\r
-         return\r
-      end\r
-      \r
-      racine = REXML::Document::new(File::new(xmlFile)).root\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('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
-         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
-         acteurs.each{|e|\r
-            film.acteurs << Personne::ajouter(e.get_text.value)\r
-         }\r
-         pays.each{|e|\r
-            film.pays << Pays::ajouter(e.get_text.value)\r
-         }\r
-         film.duree = duree.value unless duree.nil?\r
-         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) 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
-      }\r
-   end\r
-\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
-      \r
-      # revoie le document\r
-      docXml\r
-   end\r
-   \r
-private\r
 \r
-   def Film::filmsFactory(fichier)\r
-      Film::new(fichier).loadData\r
-   end\r
-    \r
-   def Film::litRepertoireR(r)\r
-      Dir::foreach(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
-            # 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} (#{fichier})"\r
-               next\r
-            end\r
-            \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
-                     film = Film::filmsFactory(fichier)                     \r
-                     unless film.nil? # le film a été correctement construit\r
-                        Film::ajouterFilm(film)\r
-                     end\r
-                  rescue Exception => e\r
-                     puts e.message\r
-                     puts e.backtrace\r
-                  end      \r
-                  @@nbConn -= 1\r
-               }\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
+   # Constructeur. N'entreprend aucune action (chargement), crée juste un film vide.\r
    def initialize(fichier)\r
       @fichiers = [fichier]\r
            \r
@@ -255,13 +47,12 @@ private
       @idsAllocine = {}\r
    end\r
 \r
-public \r
-\r
+   # Est-ce qu'il y a eu plusieurs réponses pour ce film lors de la cherche sur le net ?\r
    def plusieursReponses?\r
       return @aPlusieursReponses\r
    end \r
    \r
-   # demande à l'utilisateur de faire un choix\r
+   # Demande à l'utilisateur de faire un choix\r
    # ret : true si le conflit à été résolu sinon false\r
    def reglerConflitPlusieursReponses\r
       \r
@@ -301,6 +92,7 @@ public
       return true\r
    end\r
    \r
+   # Ajoute un fichier comme faisant partie du film\r
    def addFichier(fichier)\r
       if !@fichiers.include?(fichier)\r
          @fichiers << fichier\r
@@ -314,8 +106,6 @@ public
          @titre = @fichiers[0]\r
          return self\r
       end\r
-      \r
-      @id = Film::getNewId\r
 \r
       connexionHttp = Net::HTTP::new('www.allocine.fr')\r
    \r
@@ -358,8 +148,6 @@ public
       \r
       unless titre.nil? or titre.empty?\r
             \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}(?:<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
          if r.length > 1\r
@@ -376,6 +164,69 @@ public
       self\r
    end\r
    \r
+   # Renvoie un film sous la forme d'un élément XML de type REXML::Element.\r
+   def getXml\r
+      \r
+      racine = REXML::Element::new('film')\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))\r
+\r
+      realisateurs = REXML::Element::new('realisateurs')      \r
+      @realisateurs.each{|r|\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
+         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
+         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))\r
+      racine.add(REXML::Element::new('critiqueSpectateur').add_text(@critiqueSpectateur))\r
+      \r
+      genres = REXML::Element::new('genres')\r
+      @genres.each{|g|\r
+         genres.add(REXML::Element::new('genre').add_text(g.nom))\r
+      }      \r
+      racine.add(genres) \r
+      \r
+      synopsisElement = REXML::Element::new('synopsis')\r
+      unless @synopsis.nil?\r
+         @synopsis.split("\n").each{|s|\r
+            next if s =~ /^\s*$/\r
+            synopsisElement.add(REXML::Element::new('p').add_text(s))\r
+         }\r
+      end         \r
+      racine.add(synopsisElement)\r
+      \r
+      budgetElement = REXML::Element::new('budget')\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
+   \r
 private\r
    def loadDepuisIdAllocine(id, connexionHttp = nil)\r
       if (connexionHttp == nil)\r
@@ -402,13 +253,13 @@ private
       \r
       # Réalisateurs\r
       /<h4>Réalisé par(.*?)<\/h4>/ =~ ficheHtml\r
-      $1.scan(/<a class="link1" href=".*?">(.*?)<\/a>/m){|a|\r
+      $1.scan(/\s*<a class="link1" href=".*?">(.*?)<\/a>\s*/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
+      $1.scan(/\s*<a class="link1" href="\/personne\/fichepersonne_gen_cpersonne=\d+\.html">(.+?)<\/a>\s*/m){|a|\r
          @acteurs << Personne::ajouter(a[0]) unless a[0].nil? \r
       } unless $1.nil? \r
                 \r
@@ -440,79 +291,15 @@ private
       \r
       # Synopsis            \r
       /Synopsis.*?<h4>(.*?)<\/h4>/m =~ ficheHtml\r
-      unless $1.nil\r
-      {\r
+      unless $1.nil?\r
          @synopsis = $1\r
          @synopsis.gsub!(/<br\s*\/>|<br\s*>/, "\n")\r
          @synopsis.virerBalisesHTML!\r
-      }\r
+      end\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_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))\r
-\r
-      realisateurs = REXML::Element::new('realisateurs')      \r
-      @realisateurs.each{|r|\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
-         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
-         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))\r
-      racine.add(REXML::Element::new('critiqueSpectateur').add_text(@critiqueSpectateur))\r
-      \r
-      genres = REXML::Element::new('genres')\r
-      @genres.each{|g|\r
-         genres.add(REXML::Element::new('genre').add_text(g.nom))\r
-      }      \r
-      racine.add(genres) \r
-      \r
-      synopsisElement = REXML::Element::new('synopsis')\r
-      @synopsis.split("\n").each{|s|\r
-         next if s =~ /^\s*$/\r
-         synopsisElement.add(REXML::Element::new('p').add_text(s))\r
-      }\r
-      racine.add(synopsisElement)\r
-      \r
-      budgetElement = REXML::Element::new('budget')\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
 end\r
   
\ No newline at end of file
diff --git a/src/films.rb b/src/films.rb
new file mode 100644 (file)
index 0000000..a934dbb
--- /dev/null
@@ -0,0 +1,230 @@
+# Représente un ensemble de films\r
+\r
+require 'rexml/document'\r
+require 'thwait'\r
+\r
+require 'film.rb'\r
+require 'pays.rb'\r
+require 'genre.rb'\r
+require 'personne.rb'\r
+require 'constantes.rb'\r
+\r
+class Films\r
+   def initialize(xmlFile)\r
+      @xmlFile = xmlFile\r
+      \r
+      # repertoire de base, par exemple C:/Divx/\r
+      @repBase = ''   \r
+         \r
+      # Les films indexés par leur titre\r
+      @films = {}\r
+      \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
+      @threadsWait = ThreadsWait::new\r
+      @nbConn = 0 # le nombre de connexion\r
+      \r
+      # le prochain id disponible\r
+      @idDisponible = 1\r
+      \r
+      chargerFilms\r
+   end\r
+\r
+   # Lit un repertoire de manière recursive et va chercher les informations concernant le film sur le net\r
+   def pomper(r)\r
+      @repBase = r\r
+      repPrecedant = Dir::getwd\r
+      Dir::chdir(r)\r
+      \r
+      pomperR('.')\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
+            ajouterFilm(f)\r
+         end\r
+         i += 1\r
+      }\r
+      \r
+      Dir::chdir(repPrecedant)      \r
+   end\r
+   \r
+   # Sauve les films dans un fichier XML\r
+   def sauverFilms\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
+      \r
+      # sauve le document\r
+      docXml.write(File::new(@xmlFile, 'w'), 0)\r
+   end   \r
+   \r
+   private\r
+      \r
+   # Charge les films depuis le fichier XML\r
+   def chargerFilms\r
+      # si le fichier n'existe pas il n'y a rien à charger\r
+      if !File.exists?(@xmlFile)\r
+         return\r
+      end\r
+      \r
+      racine = REXML::Document::new(File::new(@xmlFile)).root\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_elements('p')\r
+         budget = e.get_elements('budget')[0].get_text  \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
+         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
+         acteurs.each{|e|\r
+            film.acteurs << Personne::ajouter(e.get_text.value)\r
+         }\r
+         pays.each{|e|\r
+            film.pays << Pays::ajouter(e.get_text.value)\r
+         }\r
+         film.duree = duree.value unless duree.nil?\r
+         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) if e.get_text != nil\r
+         }\r
+         debut = true\r
+         film.synopsis = ""\r
+         synopsis.each{|e|\r
+            film.synopsis += "\n" unless debut\r
+            film.synopsis += e.get_text.value if e.get_text != nil\r
+            debut = false\r
+         }\r
+         film.budget = budget.value unless budget.nil?\r
+         @films[film.titre] = film\r
+      }\r
+   end\r
+   \r
+   # Retourne un nouvel id, utilisé lors de la création d'un nouveau film\r
+   def getNewId\r
+      id = @idDisponible\r
+      @idDisponible += 1\r
+      return id\r
+   end   \r
+   \r
+   # Ajoute un film\r
+   def 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
+   # Appelé par 'pomper'. Cette méthode est récursive.\r
+   def pomperR(r)\r
+      Dir::foreach(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
+            # 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} (#{fichier})"\r
+               next\r
+            end\r
+            \r
+            film = nil\r
+             \r
+            # pour limiter le nombre de connexion simultanée\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
+                     film = Film::new(fichier).loadData\r
+                     film.id = getNewId # on lui donne un nouvel ID\r
+                     \r
+                     unless film.nil? # le film a été correctement construit\r
+                        ajouterFilm(film)\r
+                     end\r
+                  rescue Exception => e\r
+                     puts e.message\r
+                     puts e.backtrace\r
+                  end      \r
+                  @nbConn -= 1\r
+               }\r
+            )\r
+         end\r
+      }\r
+   end\r
+end
\ No newline at end of file
index f9ddd91..8d87adf 100644 (file)
 # - Rechercher chaque film sur le site 'allocine.com' et 'imdb.com' et en pomper un max d'infos\r
 # - Etablir une petit base de données des films au format xml\r
 \r
+require 'films.rb'\r
+\r
 # non ce n'est pas du perl ;)\r
 $: << Dir::getwd + "/" + __FILE__.split('/')[0]\r
 \r
-#$KCODE = 'UTF-8'\r
-#require 'jcode.rb'\r
-require 'film.rb'\r
-\r
 # vérifie les arguments donnés\r
 rep = '.'\r
 if $*.empty?\r
@@ -38,10 +36,10 @@ unless File::directory?(rep)
 end            \r
 \r
 # charge les films à partir du fichier xml\r
-Film::loadFilmsXml(xmlFile)\r
+films = Films::new(xmlFile)\r
 \r
-# lit le repertoire\r
-Film::litRepertoire(rep)\r
+# parcours le dossier donné et recherche les infos sur le net\r
+films.pomper(rep)\r
 \r
 # ecrit le fichier XML\r
-Film::getFilmsXml.write(File::new(xmlFile, 'w'), 0)\r
+films.sauverFilms()\r
index 6524781..07dc28f 100644 (file)
@@ -1 +1,3 @@
-C:\ruby\bin\ruby src/yopyop.rb xml/test.xml test
\ No newline at end of file
+cd src\r
+C:\ruby\bin\ruby yopyop.rb ../xml/test.xml ../test\r
+cd ..
\ No newline at end of file
index b19ebda..ced216a 100644 (file)
@@ -1,15 +1,44 @@
 <?xml version='1.0' encoding='UTF-8'?>\r
 <?xml-stylesheet type="text/xsl" href="../xsl/yopyop.xsl"?>\r
 <filmographie>\r
-  <film id='4'>\r
+  <film id='1'>\r
+    <fichiers>\r
+      <fichier>Big Boss.avi</fichier>\r
+    </fichiers>\r
+    <titre>Big boss</titre>\r
+    <annee>1971</annee>\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>Divers</genre>\r
+      <genre>Action</genre>\r
+      <genre>Drame</genre>\r
+      <genre>Arts Martiaux</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/>\r
+  </film>\r
+  <film id='9'>\r
     <fichiers>\r
       <fichier>Banlieue 13.avi</fichier>\r
     </fichiers>\r
     <titre>Banlieue 13</titre>\r
     <annee>2003</annee>\r
-    <realisateurs>\r
-      <realisateur>Pierre Morel</realisateur>\r
-    </realisateurs>\r
+    <realisateurs/>\r
     <acteurs>\r
       <acteur>Cyril Raffaelli</acteur>\r
       <acteur>David Belle</acteur>\r
       <p>Et c&apos;est bien la mission la plus extrême de sa carrière qui vient de lui être confiée : une arme de destruction massive a été dérobée par le plus puissant gang de la banlieue. Damien est chargé d&apos;infiltrer dans le secteur pour désamorcer la bombe ou la récupérer.</p>\r
     </synopsis>\r
     <budget unite='euro'/>\r
-    <url>http://www.allocine.fr/film/fichefilm_gen_cfilm=54107.html</url>\r
+    <url/>\r
   </film>\r
-  <film id='8'>\r
+  <film id='7'>\r
     <fichiers>\r
       <fichier>Le 51e Etat.rmvb</fichier>\r
     </fichiers>\r
     <titre>Le 51e Etat</titre>\r
     <annee>2001</annee>\r
-    <realisateurs>\r
-      <realisateur>Ronny Yu</realisateur>\r
-    </realisateurs>\r
+    <realisateurs/>\r
     <acteurs>\r
       <acteur>Samuel L. Jackson</acteur>\r
       <acteur>Robert Carlyle</acteur>\r
       <p>Ce qu&apos;ignore Elmo c&apos;est que son ex-patron est toujours vivant, déterminé à se venger et à mettre la main sur la formule chimique. Et en plus il n&apos;est pas le seul : la superbe et dangereuse Dakota Phillips est également sur ses traces.</p>\r
     </synopsis>\r
     <budget unite='euro'/>\r
-    <url>http://www.allocine.fr/film/fichefilm_gen_cfilm=29085.html</url>\r
+    <url/>\r
   </film>\r
-  <film id='11'>\r
+  <film id='6'>\r
     <fichiers>\r
       <fichier>Robocop 3.avi</fichier>\r
     </fichiers>\r
     <titre>Robocop 3</titre>\r
     <annee>1992</annee>\r
-    <realisateurs>\r
-      <realisateur>Fred Dekker</realisateur>\r
-    </realisateurs>\r
+    <realisateurs/>\r
     <acteurs>\r
       <acteur>Robert John Burke</acteur>\r
       <acteur>Nancy Allen</acteur>\r
       <p>Dans un futur proche, la multinationale OCP decide de construire Delta City sur les ruines du vieux Detroit. Un groupe d&apos;habitants irreductibles refuse de quitter les lieux. Pour les convaincre, OCP decide de reprogrammer Rococop, policier d&apos;elite fabrique a partir de l&apos;officier Murphy. Mais le docteur Lazarus, charge de l&apos;entretien de Robocop, refuse d&apos;effacer la memoire de Murphy.</p>\r
     </synopsis>\r
     <budget unite='euro'/>\r
-    <url>http://www.allocine.fr/film/fichefilm_gen_cfilm=8143.html</url>\r
+    <url/>\r
   </film>\r
-  <film id='3'>\r
+  <film id='5'>\r
+    <fichiers>\r
+      <fichier>A Toute Epreuve.rmvb</fichier>\r
+    </fichiers>\r
+    <titre>A toute epreuve</titre>\r
+    <annee>1992</annee>\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/>\r
+  </film>\r
+  <film id='8'>\r
     <fichiers>\r
       <fichier>Assaut sur le central 13 [H264 Aac] [Fr Eng] [Fr Eng Spa] [XCT].mkv</fichier>\r
     </fichiers>\r
     <titre>Assaut sur le central 13</titre>\r
     <annee>2004</annee>\r
-    <realisateurs>\r
-      <realisateur>Jean-Francois Richet</realisateur>\r
-    </realisateurs>\r
+    <realisateurs/>\r
     <acteurs>\r
       <acteur>Ethan Hawke</acteur>\r
       <acteur>Laurence Fishburne</acteur>\r
       <p>Alors que le monde entier fait la fête, flics et malfrats vont devoir s&apos;unir pour avoir une chance de survivre à l&apos;assaut mortel venu du dehors. Face aux moyens démesurés des attaquants, un seul objectif : tenir jusqu&apos;à l&apos;aube... </p>\r
     </synopsis>\r
     <budget unite='euro'/>\r
-    <url>http://www.allocine.fr/film/fichefilm_gen_cfilm=55907.html</url>\r
+    <url/>\r
   </film>\r
-  <film id='1'>\r
+  <film id='2'>\r
     <fichiers>\r
-      <fichier>A Toute Epreuve.rmvb</fichier>\r
+      <fichier>Sky High.avi</fichier>\r
     </fichiers>\r
-    <titre>A toute epreuve</titre>\r
-    <annee>1992</annee>\r
-    <realisateurs>\r
-      <realisateur>John Woo</realisateur>\r
-    </realisateurs>\r
+    <titre>L&apos;Ecole fantastique</titre>\r
+    <annee>2003</annee>\r
+    <realisateurs/>\r
     <acteurs>\r
-      <acteur>Tony Leung Chiu Wai</acteur>\r
-      <acteur>Chow Yun-Fat</acteur>\r
-      <acteur>Teresa Mo</acteur>\r
+      <acteur>Michael Angarano</acteur>\r
+      <acteur>Danielle Panabaker</acteur>\r
+      <acteur>Mary Elizabeth Winstead</acteur>\r
     </acteurs>\r
     <lespays>\r
-      <pays>hong-kongais</pays>\r
-      <pays> chinois</pays>\r
+      <pays>américain</pays>\r
     </lespays>\r
-    <duree>130</duree>\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/>\r
+  </film>\r
+  <film id='4'>\r
+    <fichiers>\r
+      <fichier>Robocop 1.avi</fichier>\r
+    </fichiers>\r
+    <titre>Robocop</titre>\r
+    <annee>1987</annee>\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/>\r
+  </film>\r
+  <film id='3'>\r
+    <fichiers>\r
+      <fichier>Rocky [x264 Aac] [Fr Eng] [Fr Eng].mkv</fichier>\r
+    </fichiers>\r
+    <titre>Rocky</titre>\r
+    <annee>1976</annee>\r
+    <realisateurs/>\r
+    <acteurs>\r
+      <acteur>Sylvester Stallone</acteur>\r
+      <acteur>Talia Shire</acteur>\r
+      <acteur>Burt Young</acteur>\r
+    </acteurs>\r
+    <lespays>\r
+      <pays>américain</pays>\r
+    </lespays>\r
+    <duree>119</duree>\r
     <critiquePresse/>\r
     <critiqueSpectateur/>\r
     <genres>\r
-      <genre>Policier</genre>\r
       <genre>Action</genre>\r
+      <genre>Drame</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
+      <p>Dans les quartiers populaires de Philadelphie, Rocky Balboa collecte des dettes non payées pour Tony Gazzo, un usurier, et dispute de temps à autre, pour quelques dizaines de dollars, des combats de boxe sous l&apos;appellation de &quot;l&apos;étalon italien&quot;. Cependant, Mickey, son vieil entraîneur, le laisse tomber. Son ami Paulie, qui travaille dans un entrepôt frigorifique, encourage Rocky à sortir avec sa soeur Adrian, une jeune vendeuse réservée d&apos;un magasin d&apos;animaux domestiques.</p>\r
+      <p>Pendant ce temps, Apollo Creed, le champion du monde de boxe catégorie poids lourd, recherche un nouvel adversaire pour remettre son titre en jeu. Son choix se portera sur Rocky.</p>\r
     </synopsis>\r
     <budget unite='euro'/>\r
-    <url>http://www.allocine.fr/film/fichefilm_gen_cfilm=8035.html</url>\r
+    <url/>\r
   </film>\r
 </filmographie>
\ No newline at end of file