MOD Le fichier film.rb et divisé en film.rb et films.rb pour une meilleure lecture
[pompage.git] / src / film.rb
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