-# Représente un ensemble de films\r
+# coding: utf-8\r
\r
require 'rexml/document'\r
require 'thwait'\r
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
# 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
i += 1\r
}\r
\r
+ # traite les films qui n'avaient aucune réponse\r
i = 1\r
@filmsAucuneReponse.each{|f|\r
puts\r
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
\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
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
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
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
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
\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