git-svn-id: svn://euphorik.ch/pompage@35 02bbb61a-6d21-0410-aba0-cb053bdfd66a
authorpifou <pifou@02bbb61a-6d21-0410-aba0-cb053bdfd66a>
Thu, 28 Jun 2007 15:24:24 +0000 (15:24 +0000)
committerpifou <pifou@02bbb61a-6d21-0410-aba0-cb053bdfd66a>
Thu, 28 Jun 2007 15:24:24 +0000 (15:24 +0000)
src/basemodule.rb [new file with mode: 0644]
src/constantes.rb
src/film.rb
src/films.rb
src/modules/allocine.rb [new file with mode: 0644]
src/yopyop.rb
start.bat
start_test.bat
test/Sky High.srt [deleted file]
test/alksgsdv.avi [new file with mode: 0644]
xml/test.xml

diff --git a/src/basemodule.rb b/src/basemodule.rb
new file mode 100644 (file)
index 0000000..725b212
--- /dev/null
@@ -0,0 +1,18 @@
+# Attention : les méthodes peuvent être accédées par plusieurs threads simultanément\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
+   # Si la requête n'a pas aboutie alors le Hash est vide.\r
+   # p1 : le titre\r
+   # ret {infos => id} : le résultat de la recherche\r
+   def rechercherFilm(titre)\r
+      raise\r
+   end \r
+   \r
+   # Charge toutes les informations d'un films à partir de son id.\r
+   # p1 : l'id de allocine\r
+   def load(id)\r
+      raise\r
+   end   \r
+end
\ No newline at end of file
index 23452e5..af5b42d 100644 (file)
@@ -1,13 +1,19 @@
-\r
-$KCODE = 'u' # UTF-8\r
-\r
 #require 'profile'\r
 \r
 #require 'profile'\r
 \r
+# UTF-8\r
+$KCODE = 'u'\r
 \r
 #constantes\r
 FILMS_EXTENSIONS = ['avi', 'mkv', 'rmvb', 'ogm', 'divx']\r
 \r
 #constantes\r
 FILMS_EXTENSIONS = ['avi', 'mkv', 'rmvb', 'ogm', 'divx']\r
-FICHIER_PATTERN = "<title> [<codec>] [<lang-audio>] [<lang-st>] [<team>]" # la structure d'un fichier\r
-LOAD_DATA = true # charge les informations depuis le web ?\r
+\r
+# la structure d'un fichier (pas utilisé)\r
+FICHIER_PATTERN = "<title> [<codec>] [<lang-audio>] [<lang-st>] [<team>]"\r
+\r
+# charge les informations depuis le web ?\r
+LOAD_DATA = true \r
 \r
 #le nombre de connexions simultanées sur le site de films\r
 \r
 #le nombre de connexions simultanées sur le site de films\r
-NB_CONN_MAX = 10\r
+NB_CONN_MAX = 5\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
index a8a813b..b56ad07 100644 (file)
@@ -3,14 +3,14 @@
 # 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
 # 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 'net/http'\r
-require 'cgi'\r
-\r
 require 'pays.rb'\r
 require 'genre.rb'\r
 require 'personne.rb'\r
 require 'constantes.rb'\r
 \r
 require 'pays.rb'\r
 require 'genre.rb'\r
 require 'personne.rb'\r
 require 'constantes.rb'\r
 \r
+require 'modules/allocine.rb'\r
+\r
+# ajout de deux méthodes à la classe String\r
 class String\r
    def virerBalisesHTML\r
       return gsub(/<(.*?)>/, '')\r
 class String\r
    def virerBalisesHTML\r
       return gsub(/<(.*?)>/, '')\r
@@ -21,11 +21,18 @@ class String
 end\r
 \r
 class Film\r
 end\r
 \r
 class Film\r
+   \r
+   def Film::setModule(m)\r
+      @@module = m\r
+   end\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
 \r
    # Constructeur. N'entreprend aucune action (chargement), crée juste un film vide.\r
    attr_accessor :id, :titre, :url, :fichiers, :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)\r
-      @fichiers = [fichier]\r
+      @fichiers = [fichier] # le chemin des fichiers est relatif au repertoire de base\r
            \r
       @id = 0\r
       @titre = ''\r
            \r
       @id = 0\r
       @titre = ''\r
@@ -41,26 +48,31 @@ class Film
       @budget = nil      \r
       @budgetUnite = 'euro'\r
       @url\r
       @budget = nil      \r
       @budgetUnite = 'euro'\r
       @url\r
+            \r
+      @nbReponses = 0\r
       \r
       \r
-      @aPlusieursReponses = false\r
-      # mémorise les tuples {nom => id} dans le cas ou il y a plusieurs réponses\r
-      @idsAllocine = {}\r
+      # mémorise les tuples {nom => id} dans le cas ou il y a plusieurs choix de films après une recherche\r
+      @choix = {}\r
    end\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
    end\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
+      return @nbReponses > 1\r
+   end    \r
+\r
+   # Est-ce qu'il y a eu plusieurs réponses pour ce film lors de la cherche sur le net ?\r
+   def nbReponses\r
+      return @nbReponses\r
    end \r
    \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
    # ret : true si le conflit à été résolu sinon false\r
    def reglerConflitPlusieursReponses\r
-      \r
-      @aPlusieursReponses = false # pour faire les choses bien\r
+      @nbReponses = 1\r
       \r
       puts " -> " + @fichiers[0]\r
       puts "Fais ton choix jeune padawan (un caractère et pas plus)"\r
       \r
       puts " -> " + @fichiers[0]\r
       puts "Fais ton choix jeune padawan (un caractère et pas plus)"\r
-      tabNoms = @idsAllocine.keys\r
+      tabNoms = @choix.keys\r
       choix = 1\r
       loop do \r
          i = 1\r
       choix = 1\r
       loop do \r
          i = 1\r
@@ -87,7 +99,7 @@ class Film
          end\r
       end\r
       \r
          end\r
       end\r
       \r
-      loadDepuisIdAllocine(@idsAllocine[tabNoms[choix-1]])\r
+      @@module.load(@choix[tabNoms[choix-1]], self)\r
       \r
       return true\r
    end\r
       \r
       return true\r
    end\r
@@ -101,14 +113,7 @@ class Film
 \r
    # Charge les informations du films à partir d'allocine.fr\r
    # ret [Film]\r
 \r
    # Charge les informations du films à partir d'allocine.fr\r
    # ret [Film]\r
-   def loadData\r
-      unless LOAD_DATA\r
-         @titre = @fichiers[0]\r
-         return self\r
-      end\r
-\r
-      connexionHttp = Net::HTTP::new('www.allocine.fr')\r
-   \r
+   def loadData   \r
       #extrait le nom à partir du nom du fichier\r
       /^.*?([^\/]*?)\.(.{3,4})$/ =~ @fichiers[0]\r
       #remplace undescores et points par des espaces\r
       #extrait le nom à partir du nom du fichier\r
       /^.*?([^\/]*?)\.(.{3,4})$/ =~ @fichiers[0]\r
       #remplace undescores et points par des espaces\r
@@ -123,48 +128,24 @@ class Film
       \r
       @titre = titre.dup\r
       \r
       \r
       @titre = titre.dup\r
       \r
-      donneesHtml = nil\r
-      begin\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
-         else\r
-            break;\r
-         end\r
-      end while not titre.nil? and not titre.empty?\r
+      unless LOAD_DATA\r
+         return self\r
+      end\r
       \r
       \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
-         if r.length > 1\r
-            @aPlusieursReponses = true\r
-            r.each{|f|\r
-               @idsAllocine[f[1].virerBalisesHTML + (f[2] != nil ? " " + f[2].virerBalisesHTML : "") + (f[3] != nil ? " de " + f[3].virerBalisesHTML : "") + (f[4] != nil ? " avec " + f[4].virerBalisesHTML : "") + (f[5] != nil ? " (" + f[5].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
+      reponses = @@module.rechercherFilm(titre)\r
+      @nbReponses = reponses.size\r
+      \r
+      if @nbReponses == 1\r
+         @@module.load(reponses.values[0], self)\r
+      else\r
+         @choix = reponses   \r
       end\r
       end\r
+\r
       self\r
    end\r
    \r
       self\r
    end\r
    \r
-   # Renvoie un film sous la forme d'un élément XML de type REXML::Element.\r
+   # Renvoie un film sous la forme d'un élément XML .\r
+   # ret [REXML::Element] : un element xml <film>\r
    def getXml\r
       \r
       racine = REXML::Element::new('film')\r
    def getXml\r
       \r
       racine = REXML::Element::new('film')\r
@@ -226,80 +207,5 @@ class Film
 \r
       racine\r
    end\r
 \r
       racine\r
    end\r
-   \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(/\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(/\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
-      # 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
-      unless $1.nil?\r
-         @synopsis = $1\r
-         @synopsis.gsub!(/<br\s*\/>|<br\s*>/, "\n")\r
-         @synopsis.virerBalisesHTML!\r
-      end\r
-      \r
-      # Budget       \r
-      /Budget<\/b> : (.+?) millions d'euros<\/h4>/ =~ ficheHtml\r
-      @budget = $1 unless $1.nil?\r
-   end     \r
 end\r
   
\ No newline at end of file
 end\r
   
\ No newline at end of file
index bc23fdc..59f4af7 100644 (file)
@@ -8,6 +8,7 @@ require 'pays.rb'
 require 'genre.rb'\r
 require 'personne.rb'\r
 require 'constantes.rb'\r
 require 'genre.rb'\r
 require 'personne.rb'\r
 require 'constantes.rb'\r
+require 'iconv'\r
 \r
 class Films\r
    def initialize(xmlFile)\r
 \r
 class Films\r
    def initialize(xmlFile)\r
@@ -16,15 +17,19 @@ class Films
       # repertoire de base, par exemple C:/Divx/\r
       @repBase = ''   \r
          \r
       # repertoire de base, par exemple C:/Divx/\r
       @repBase = ''   \r
          \r
-      # Les films indexés par leur titre\r
+      # Les films indexé par leur titre\r
       @films = {}\r
       \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
+      # Les films indexé par leur nom de fichier, deux fichiers différents peuvent pointer sur le même film\r
       @filmsFichier = {}\r
       \r
       @filmsFichier = {}\r
       \r
-      # Les films qui ont plusieurs réponses lors de la recherche, traités à la fin\r
+      # Les films qui ont plusieurs réponses lors de la recherche, traité à la fin\r
       @filmsPlusieursReponses = []\r
 \r
       @filmsPlusieursReponses = []\r
 \r
+      # Les films qui ont plusieurs réponses lors de la recherche, traité à la fin\r
+      @filmsAucuneReponse = []\r
+\r
+      # permet de traiter facilement des groupes de thread\r
       @threadsWait = ThreadsWait::new\r
       @nbConn = 0 # le nombre de connexion\r
       \r
       @threadsWait = ThreadsWait::new\r
       @nbConn = 0 # le nombre de connexion\r
       \r
@@ -34,17 +39,21 @@ class Films
       chargerFilms\r
    end\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
+   # 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
    def pomper(r)\r
       @repBase = r\r
       repPrecedant = Dir::getwd\r
       Dir::chdir(r)\r
       \r
+      t = Time::now\r
+      \r
       pomperR('.')\r
       \r
       # on attends que les threads se terminent\r
       @threadsWait.all_waits\r
       \r
       pomperR('.')\r
       \r
       # on attends que les threads se terminent\r
       @threadsWait.all_waits\r
       \r
+      puts "Pompage terminé, temps : #{Time::now - t} secondes"\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
       # traite les films qui avaient plusieurs réponses lors de la recherche\r
       # l'utilisateur doit faire un choix\r
       i = 1\r
@@ -57,6 +66,16 @@ class Films
          i += 1\r
       }\r
       \r
          i += 1\r
       }\r
       \r
+      i = 1\r
+      @filmsAucuneReponse.each{|f|\r
+         puts\r
+         puts "Plop, Ce film n'a pas été trouvé{i} / #{@filmsAucuneReponse.length} :"\r
+         if f.reglerConflitPlusieursReponses\r
+            ajouterFilm(f)\r
+         end\r
+         i += 1\r
+      }\r
+      \r
       Dir::chdir(repPrecedant)      \r
    end\r
    \r
       Dir::chdir(repPrecedant)      \r
    end\r
    \r
@@ -73,7 +92,7 @@ class Films
       pi = REXML::Instruction.new("xml-stylesheet", "type=\"text/xsl\" href=\"../xsl/yopyop.xsl\"")\r
       racine.previous_sibling = pi\r
       \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
+      # on ajoute chaque film à la racine\r
       @films.each{|nom, f|\r
          racine.add(f.getXml)\r
       } \r
       @films.each{|nom, f|\r
          racine.add(f.getXml)\r
       } \r
@@ -149,7 +168,7 @@ class Films
       }\r
    end\r
    \r
       }\r
    end\r
    \r
-   # Retourne un nouvel id, utilisé lors de la création d'un nouveau film\r
+   # Retourne un nouvel id, utilisé alors de la création d'un nouveau film\r
    def getNewId\r
       id = @idDisponible\r
       @idDisponible += 1\r
    def getNewId\r
       id = @idDisponible\r
       @idDisponible += 1\r
@@ -163,7 +182,11 @@ class Films
          return\r
       end\r
       \r
          return\r
       end\r
       \r
-      # le film existe déjà\r
+      if film.nbReponses == 0\r
+         @filmsAucuneReponse << film\r
+         return\r
+      end\r
+      \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
       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
@@ -180,7 +203,7 @@ class Films
       end\r
    end\r
    \r
       end\r
    end\r
    \r
-   # Appelé par 'pomper'. Cette méthode est récursive.\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
    def pomperR(r)\r
       Dir::foreach(r){|f|\r
          next if f[0,1] == '.'\r
@@ -189,15 +212,15 @@ class Films
             litRepertoireR(fichier) \r
          else\r
             \r
             litRepertoireR(fichier) \r
          else\r
             \r
-            # vérification de l'extension\r
+            # véfication de l'extension\r
             /^.*?\.(.{3,4})$/ =~ fichier\r
             if !FILMS_EXTENSIONS.include?($1)\r
                next\r
             end\r
             \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
+            fichier = CGI::escapeHTML(Iconv.iconv("UTF-8", "ISO-8859-1", fichier)[0])\r
             \r
             \r
-            # on skip si le film est déjàa dans la BD\r
+            # on skip si le film est déjà dans la BD\r
             if film = @filmsFichier[fichier]\r
                puts "[i] Already exists in DB : #{film.titre} (#{fichier})"\r
                next\r
             if film = @filmsFichier[fichier]\r
                puts "[i] Already exists in DB : #{film.titre} (#{fichier})"\r
                next\r
@@ -205,7 +228,7 @@ class Films
             \r
             film = nil\r
              \r
             \r
             film = nil\r
              \r
-            # pour limiter le nombre de connexion simultanée\r
+            # pour limiter le nombre de connexion simultanée\r
             if @nbConn >= NB_CONN_MAX\r
                @threadsWait.next_wait\r
             end\r
             if @nbConn >= NB_CONN_MAX\r
                @threadsWait.next_wait\r
             end\r
@@ -217,13 +240,13 @@ class Films
                      film = Film::new(fichier).loadData\r
                      film.id = getNewId # on lui donne un nouvel ID\r
                      \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
+                     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
                         ajouterFilm(film)\r
                      end\r
                   rescue Exception => e\r
                      puts e.message\r
                      puts e.backtrace\r
-                  end      \r
+                  end\r
                   @nbConn -= 1\r
                }\r
             )\r
                   @nbConn -= 1\r
                }\r
             )\r
diff --git a/src/modules/allocine.rb b/src/modules/allocine.rb
new file mode 100644 (file)
index 0000000..bdbfa1c
--- /dev/null
@@ -0,0 +1,124 @@
+require 'net/http'\r
+require 'cgi'\r
+require 'thread'\r
+require 'iconv'\r
+\r
+require "basemodule.rb"\r
+\r
+# un mixin pour allocine\r
+class Allocine  < Basemodule\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
+      \r
+      donneesHtml = nil\r
+      begin\r
+         begin\r
+            reponse, donneesHtml = connexion.get("/recherche/?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
+            retry\r
+         end\r
+         \r
+         #convertit le code latin-1 en UTF8\r
+         donneesHtml = Iconv.iconv("UTF-8", "ISO-8859-1", donneesHtml)[0]\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
+         else\r
+            break;\r
+         end\r
+      end while not titre.nil? and not titre.empty?\r
+      \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
+            reponses[f[1].virerBalisesHTML + (f[2] != nil ? " " + f[2].virerBalisesHTML : "") + (f[3] != nil ? " de " + f[3].virerBalisesHTML : "") + (f[4] != nil ? " avec " + f[4].virerBalisesHTML : "") + (f[5] != nil ? " (" + f[5].virerBalisesHTML + ")" : "")] = f[0]\r
+         }\r
+      end\r
+      reponses\r
+   end\r
+   \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
+      \r
+      #convertit le code latin-1 en UTF8\r
+      ficheHtml = Iconv.iconv("UTF-8", "ISO-8859-1", ficheHtml)[0]\r
+\r
+      #url\r
+      film.url = "http://www.allocine.fr/film/fichefilm_gen_cfilm=#{id}.html"\r
+      \r
+      # Titre\r
+      /<title>(.*?)<\/title>/ =~ ficheHtml\r
+      film.titre = $1 unless $1.nil?\r
+      \r
+      puts "Movie found : #{film.titre} (#{film.fichiers[0]})"\r
+      \r
+      # Année\r
+      /<h4>Année de production : (\d+)<\/h4>/ =~ ficheHtml\r
+      film.annee = $1 unless $1.nil?\r
+      \r
+      # Réalisateurs\r
+      /<h4>Réalisé par(.*?)<\/h4>/ =~ ficheHtml\r
+      $1.scan(/\s*<a class="link1" href=".*?">(.*?)<\/a>\s*/m){|a|\r
+         film.realisateurs << Personne::ajouter(a[0]) unless a[0].nil?\r
+      } unless $1.nil?\r
+      \r
+      # Acteurs\r
+      /<h4>Avec(.*?)<\/h4>/ =~ ficheHtml\r
+      $1.scan(/\s*<a class="link1" href="\/personne\/fichepersonne_gen_cpersonne=\d+\.html">(.+?)<\/a>\s*/m){|a|\r
+         film.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
+         film.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
+      film.duree = heure * 60 + min\r
+      \r
+      # Critiques presse et spectateur\r
+      /Presse.*etoile_([012345]).*Spectateurs.*etoile_([012345])"/m =~ ficheHtml\r
+      film.critiquePresse = $1 unless $1.nil?\r
+      film.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
+         film.genres << Genre::ajouter(g[0]) unless g[0].nil?\r
+      } unless $1.nil?     \r
+      \r
+      # Synopsis            \r
+      /Synopsis.*?<h4>(.*?)<\/h4>/m =~ ficheHtml\r
+      unless $1.nil?\r
+         film.synopsis = $1\r
+         film.synopsis.gsub!(/<br\s*\/>|<br\s*>/, "\n")\r
+         film.synopsis.virerBalisesHTML!\r
+      end\r
+      \r
+      # Budget       \r
+      /Budget<\/b> : (.+?) millions d'euros<\/h4>/ =~ ficheHtml\r
+      film.budget = $1 unless $1.nil?\r
+   end   \r
+end
\ No newline at end of file
index 8d87adf..786e6a1 100644 (file)
 # - Etablir une petit base de données des films au format xml\r
 \r
 require 'films.rb'\r
 # - Etablir une petit base de données des films au format xml\r
 \r
 require 'films.rb'\r
+require 'film.rb'\r
 \r
 # non ce n'est pas du perl ;)\r
 $: << Dir::getwd + "/" + __FILE__.split('/')[0]\r
 \r
 # vérifie les arguments donnés\r
 \r
 # non ce n'est pas du perl ;)\r
 $: << Dir::getwd + "/" + __FILE__.split('/')[0]\r
 \r
 # vérifie les arguments donnés\r
+xmlFile = nil\r
 rep = '.'\r
 rep = '.'\r
-if $*.empty?\r
-   puts 'USAGE : <xml file> [<directory>]'\r
+mod = 'Allocine'\r
+\r
+aPrec = ''\r
+$*.each{|a|\r
+   case aPrec\r
+      when '-x'\r
+         xmlFile = a\r
+      when '-d'\r
+         rep = a\r
+      when '-m'\r
+         mod = a\r
+   end      \r
+   aPrec = a\r
+}\r
+\r
+if xmlFile.nil?\r
+   puts USAGE\r
    exit 0\r
    exit 0\r
-elsif $*.size == 1\r
-   puts 'no directory given, use the current'\r
-else\r
-   rep = $*[1]\r
 end\r
 end\r
-xmlFile = $*[0]\r
 \r
 unless File::directory?(rep)\r
  puts "'#{rep}' is not a valid directory"\r
  exit 1\r
 \r
 unless File::directory?(rep)\r
  puts "'#{rep}' is not a valid directory"\r
  exit 1\r
-end            \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
 \r
 # charge les films à partir du fichier xml\r
 films = Films::new(xmlFile)\r
index f9a110a..3aeee8c 100644 (file)
--- a/start.bat
+++ b/start.bat
@@ -1,3 +1,3 @@
 cd src\r
 cd src\r
-C:\ruby\bin\ruby yopyop.rb ../xml/divx.xml F:\Films\r
+C:\ruby\bin\ruby yopyop.rb -x ../xml/divx.xml -d F:\Films\r
 cd ..
\ No newline at end of file
 cd ..
\ No newline at end of file
index 07dc28f..17bc1d2 100644 (file)
@@ -1,3 +1,3 @@
 cd src\r
 cd src\r
-C:\ruby\bin\ruby yopyop.rb ../xml/test.xml ../test\r
+C:\ruby\bin\ruby yopyop.rb -x ../xml/test.xml -d ../test\r
 cd ..
\ No newline at end of file
 cd ..
\ No newline at end of file
diff --git a/test/Sky High.srt b/test/Sky High.srt
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/test/alksgsdv.avi b/test/alksgsdv.avi
new file mode 100644 (file)
index 0000000..e69de29
index 21f5bc8..6f7eb80 100644 (file)
@@ -1,275 +1,3 @@
 <?xml version='1.0' encoding='UTF-8'?>\r
 <?xml-stylesheet type="text/xsl" href="../xsl/yopyop.xsl"?>\r
 <?xml version='1.0' encoding='UTF-8'?>\r
 <?xml-stylesheet type="text/xsl" href="../xsl/yopyop.xsl"?>\r
-<filmographie>\r
-  <film id='10'>\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>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>http://www.allocine.fr/film/fichefilm_gen_cfilm=53367.html</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
-    <acteurs>\r
-      <acteur>Cyril Raffaelli</acteur>\r
-      <acteur>David Belle</acteur>\r
-      <acteur>Tony D&apos;Amario</acteur>\r
-    </acteurs>\r
-    <lespays>\r
-      <pays>français</pays>\r
-    </lespays>\r
-    <duree>95</duree>\r
-    <critiquePresse>4</critiquePresse>\r
-    <critiqueSpectateur>3</critiqueSpectateur>\r
-    <genres>\r
-      <genre>Action</genre>\r
-      <genre>Policier</genre>\r
-    </genres>\r
-    <synopsis>\r
-      <p>Paris, 2013. Damien est l&apos;élite de la police. Officier d&apos;une unité spéciale d&apos;intervention, expert en arts martiaux, il est passé maître dans l&apos;art de l&apos;infiltration et sait mener à terme ses opérations par des actions rapides, précises et néanmoins musclées.</p>\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
-  </film>\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
-    <acteurs>\r
-      <acteur>Samuel L. Jackson</acteur>\r
-      <acteur>Robert Carlyle</acteur>\r
-      <acteur>Emily Mortimer</acteur>\r
-    </acteurs>\r
-    <lespays>\r
-      <pays>canadien</pays>\r
-      <pays> britannique</pays>\r
-      <pays> américain</pays>\r
-    </lespays>\r
-    <duree>91</duree>\r
-    <critiquePresse>4</critiquePresse>\r
-    <critiqueSpectateur>3</critiqueSpectateur>\r
-    <genres>\r
-      <genre>Comédie</genre>\r
-      <genre>Action</genre>\r
-    </genres>\r
-    <synopsis>\r
-      <p>Elmo McElroy est vraiment un individu à part. Chimiste génial, il a mis au point le POS 51, LA drogue parfaite, celle qui vous donne l&apos;impression que Dieu lui-même est venu vous faire signe. Bien décidé à commercialiser son petit chef-d&apos;oeuvre sans intermédiaire, Elmo se débarasse de son encombrant patron, Le Lézard, pour rallier l&apos;Angleterre - le 51e Etat - et s&apos;associe avec Félix Desouza, un petit nerveux qui règne sur l&apos;underground de Liverpool, parle tout le temps et ne supporte pas ce qui est Américain.</p>\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
-  </film>\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
-    <acteurs>\r
-      <acteur>Robert John Burke</acteur>\r
-      <acteur>Nancy Allen</acteur>\r
-      <acteur>Jill Hennessy</acteur>\r
-    </acteurs>\r
-    <lespays>\r
-      <pays>américain</pays>\r
-    </lespays>\r
-    <duree>105</duree>\r
-    <critiquePresse/>\r
-    <critiqueSpectateur/>\r
-    <genres>\r
-      <genre>Fantastique</genre>\r
-      <genre>Action</genre>\r
-      <genre>Science fiction</genre>\r
-    </genres>\r
-    <synopsis>\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
-  </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
-    <acteurs>\r
-      <acteur>Ethan Hawke</acteur>\r
-      <acteur>Laurence Fishburne</acteur>\r
-      <acteur>John Leguizamo</acteur>\r
-    </acteurs>\r
-    <lespays>\r
-      <pays>américain</pays>\r
-      <pays> français</pays>\r
-    </lespays>\r
-    <duree>110</duree>\r
-    <critiquePresse>4</critiquePresse>\r
-    <critiqueSpectateur>3</critiqueSpectateur>\r
-    <genres>\r
-      <genre>Action</genre>\r
-    </genres>\r
-    <synopsis>\r
-      <p>Une nuit de réveillon, l&apos;un des membres les plus dangereux de la mafia, Marion Bishop, est temporairement incarcéré dans un bâtiment gardé par une équipe de police placée sous le commandement du sergent Jake Roenick.</p>\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
-  </film>\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>http://www.allocine.fr/film/fichefilm_gen_cfilm=8035.html</url>\r
-  </film>\r
-  <film id='13'>\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
-  <film id='11'>\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='12'>\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
-      <realisateur>John G. Avildsen</realisateur>\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>Action</genre>\r
-      <genre>Drame</genre>\r
-    </genres>\r
-    <synopsis>\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=28251.html</url>\r
-  </film>\r
-</filmographie>
\ No newline at end of file
+<filmographie/>
\ No newline at end of file