git-svn-id: svn://euphorik.ch/pompage@45 02bbb61a-6d21-0410-aba0-cb053bdfd66a
[pompage.git] / src / films.rb
index e93e615..7d9c17e 100644 (file)
@@ -1,4 +1,4 @@
-# Représente un ensemble de films\r
+# coding: utf-8\r
 \r
 require 'rexml/document'\r
 require 'thwait'\r
@@ -10,6 +10,7 @@ require 'personne.rb'
 require 'constantes.rb'\r
 require 'iconv'\r
 \r
+# Représente un ensemble de films.\r
 class Films\r
    def initialize(xmlFile, modClasse)\r
       @xmlFile = xmlFile\r
@@ -28,18 +29,27 @@ class Films
       # Les films qui ont plusieurs réponses lors de la recherche, traité à la fin\r
       @filmsPlusieursReponses = []\r
 \r
-      # Les films qui ont plusieurs réponses lors de la recherche, traité à la fin\r
+      # Les films qui n'ont aucune réponse après une 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
+      @mutexAjout = Mutex::new # mutex pour protéger l'ajout\r
+      @mutexId = Mutex::new # mutex pour protéger la génération d'id\r
+      \r
       # le prochain id disponible\r
       @idDisponible = 1\r
       \r
       chargerFilms\r
    end\r
+   \r
+   def each\r
+      @films.each{|t,f|\r
+         yield f\r
+      }\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
@@ -71,6 +81,7 @@ class Films
          i += 1\r
       }\r
       \r
+      # traite les films qui n'avaient aucune réponse\r
       i = 1\r
       @filmsAucuneReponse.each{|f|\r
          puts\r
@@ -84,6 +95,7 @@ class Films
          i += 1\r
       }\r
       \r
+      # annonce à chaque module d'importation que c'est fini\r
       @films.each{|t,f|\r
          f.mod.finish\r
       }\r
@@ -117,11 +129,11 @@ class Films
       \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
+      # si le fichier n'existe pas il n'y a rien à charger\r
       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
@@ -187,7 +199,7 @@ class Films
       return id\r
    end   \r
    \r
-   # Ajoute un film\r
+   # Ajoute un film à l'ensemble des films.\r
    def ajouterFilm(film)\r
       if film.plusieursReponses?\r
          @filmsPlusieursReponses << film\r
@@ -200,7 +212,6 @@ class Films
       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
             puts "[i] movie #{film.titre} has a another file part : #{film.fichiers[0]}"\r
             @films[film.titre].addFichier(film.fichiers[0])\r
@@ -215,7 +226,7 @@ class Films
       end\r
    end\r
    \r
-   # Appelé par 'pomper'. Cette méthode est récursive.\r
+   # Appelé par 'pomper'. Cette méthode itère récursivement sur l'arborescence d'un repertoire.\r
    def pomperR(r)\r
       Dir::foreach(r){|f|\r
          next if f[0,1] == '.'\r
@@ -224,21 +235,20 @@ class Films
             pomperR(fichier) \r
          else\r
             \r
+            #CGI::escapeHTML(\r
+            fichier = Iconv.iconv("UTF-8", "ISO-8859-1", fichier)[0]\r
+                        \r
             # véfication de l'extension\r
             /^.*?\.([^.]{3,4})$/ =~ fichier\r
             if !FILMS_EXTENSIONS.include?($1)\r
                next\r
             end\r
-            \r
-            fichier = CGI::escapeHTML(Iconv.iconv("UTF-8", "ISO-8859-1", fichier)[0])\r
-            \r
+                        \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
             end\r
-            \r
-            film = nil\r
              \r
             # pour limiter le nombre de connexion simultanée\r
             if @nbConn >= NB_CONN_MAX\r
@@ -247,15 +257,17 @@ class Films
              \r
             @nbConn += 1    \r
             @threadsWait.join_nowait(\r
-               Thread::new{\r
+               Thread::start{\r
                   begin                  \r
                      film = Film::new(fichier, @modClasse::new)\r
-                     film.id = getNewId # on lui donne un nouvel ID\r
+                     @mutexId.synchronize {\r
+                        film.id = getNewId # on lui donne un nouvel ID\r
+                     }\r
                      film.loadData # on charge ses données\r
                      \r
-                     unless film.nil? # le film a été correctement construit\r
+                     @mutexAjout.synchronize {\r
                         ajouterFilm(film)\r
-                     end\r
+                     }                     \r
                   rescue Exception => e\r
                      puts e.message\r
                      puts e.backtrace\r