git-svn-id: svn://euphorik.ch/pompage@24 02bbb61a-6d21-0410-aba0-cb053bdfd66a
[pompage.git] / src / film.rb
index 1eaa33f..c97e518 100644 (file)
@@ -10,9 +10,18 @@ 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 :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
@@ -22,7 +31,6 @@ class Film
    # 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
@@ -38,17 +46,28 @@ class Film
 \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
@@ -57,12 +76,15 @@ 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
-         id = e.attribute('id').to_s().to_i()\r
+         id = e.attribute('id').to_s.to_i\r
        \r
-         @@idDisponible = id + 1         \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
@@ -129,44 +151,52 @@ class Film
 private\r
 \r
    def Film::filmsFactory(fichier)\r
-      /^.*?\.(.{3,4})$/ =~ fichier\r
-      if FILMS_EXTENSIONS.include?($1)\r
-         #convertit le code latin-1 en UTF8\r
-         Film::new(fichier.unpack("C*").pack("U*")).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.fichiers[0]})"\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
-                     @@mutex.lock if @@nbConn >= NB_CONN_MAX                     \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
-                     @@mutex.unlock\r
                   rescue Exception => e\r
                      puts e.message\r
                      puts e.backtrace\r
-                  end\r
+                  end      \r
+                  @@nbConn -= 1\r
                }\r
             )\r
          end\r
@@ -187,7 +217,7 @@ private
             @@films[film.titre].addFichier(film.fichiers[0])\r
             @@filmsFichier[film.fichiers[0]] = @@films[film.titre]                     \r
          else\r
-            puts "[!] Duplicate movie : #{film.titre} (#{film.fichier})"\r
+            puts "[!] Duplicate movie : #{film.titre} (#{film.fichiers[0]})"\r
          end\r
       else\r
          puts "[i] movie added : #{film.titre} (#{film.fichiers[0]})"\r
@@ -229,13 +259,45 @@ public
    # demande à l'utilisateur de faire un choix\r
    # ret : true si le conflit à été résolu sinon false\r
    def reglerConflitPlusieursReponses\r
-      puts "prout"\r
       \r
-      return false\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
+      if !@fichiers.include?(fichier)\r
          @fichiers << fichier\r
       end\r
    end\r
@@ -269,7 +331,7 @@ public
       donneesHtml = nil\r
       begin\r
          begin\r
-            reponse, donneesHtml = connexionHttp.get("/recherche/?motcle=#{CGI::escape(titre)}")\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
@@ -292,12 +354,13 @@ public
       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>/)\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].gsub(/<(.*?)>/, '')] = f[0]\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
@@ -309,7 +372,11 @@ public
    end\r
    \r
 private\r
-   def loadDepuisIdAllocine(id, connexionHttp)\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
@@ -322,11 +389,11 @@ private
       /<title>(.*?)<\/title>/ =~ ficheHtml\r
       @titre = $1 unless $1.nil?\r
       \r
-      puts "Movie found : #{@titre} (#{@fichier})"\r
+      puts "Movie found : #{@titre} (#{@fichiers[0]})"\r
       \r
       # Année\r
       /<h4>Année de production : (\d+)<\/h4>/ =~ ficheHtml\r
-      @annee = $1.to_i unless $1.nil?\r
+      @annee = $1 unless $1.nil?\r
       \r
       # Réalisateurs\r
       /<h4>Réalisé par(.*?)<\/h4>/ =~ ficheHtml\r
@@ -340,21 +407,25 @@ private
          @acteurs << Personne::ajouter(a[0]) unless a[0].nil? \r
       } unless $1.nil? \r
                 \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\r
-      /<h4>Durée : (\d+)h (\d+)min./ =~ ficheHtml\r
-      @duree = $1.nil? ? $2.to_i : $1.to_i * 60 + $2.to_i\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.to_i unless $1.nil?\r
-      @critiqueSpectateur = $2.to_i unless $2.nil?\r
+      @critiquePresse = $1 unless $1.nil?\r
+      @critiqueSpectateur = $2 unless $2.nil?\r
       \r
       # Genre\r
       /<h4>Genre : (.*?)<\/h4>/ =~ ficheHtml\r
@@ -368,7 +439,7 @@ private
       \r
       # Budget       \r
       /Budget<\/b> : (.+?) millions d'euros<\/h4>/ =~ ficheHtml\r
-      @budget = $1.to_i unless $1.nil?\r
+      @budget = $1 unless $1.nil?\r
    end     \r
       \r
 public\r
@@ -386,7 +457,7 @@ public
       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
@@ -408,8 +479,8 @@ public
       \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
@@ -419,7 +490,7 @@ public
       \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