X-Git-Url: http://git.euphorik.ch/?p=pompage.git;a=blobdiff_plain;f=src%2Ffilms.rb;h=7d9c17ed9fea5395f626b7d35df1e3d11f0601be;hp=e93e6159fb2f14cad74dceb670733487d9a11fb0;hb=c3b0deb3d8c9f439739c79806e915c29bc1d4b84;hpb=cff6539539a79e014f6ac8df46716cafce2c8472 diff --git a/src/films.rb b/src/films.rb index e93e615..7d9c17e 100644 --- a/src/films.rb +++ b/src/films.rb @@ -1,4 +1,4 @@ -# Représente un ensemble de films +# coding: utf-8 require 'rexml/document' require 'thwait' @@ -10,6 +10,7 @@ require 'personne.rb' require 'constantes.rb' require 'iconv' +# Représente un ensemble de films. class Films def initialize(xmlFile, modClasse) @xmlFile = xmlFile @@ -28,18 +29,27 @@ class Films # Les films qui ont plusieurs réponses lors de la recherche, traité à la fin @filmsPlusieursReponses = [] - # Les films qui ont plusieurs réponses lors de la recherche, traité à la fin + # Les films qui n'ont aucune réponse après une recherche, traité à la fin @filmsAucuneReponse = [] # permet de traiter facilement des groupes de thread @threadsWait = ThreadsWait::new @nbConn = 0 # le nombre de connexion + @mutexAjout = Mutex::new # mutex pour protéger l'ajout + @mutexId = Mutex::new # mutex pour protéger la génération d'id + # le prochain id disponible @idDisponible = 1 chargerFilms end + + def each + @films.each{|t,f| + yield f + } + end # Lit un repertoire de manière recursive et va chercher les informations concernant le film sur le net def pomper(r) @@ -71,6 +81,7 @@ class Films i += 1 } + # traite les films qui n'avaient aucune réponse i = 1 @filmsAucuneReponse.each{|f| puts @@ -84,6 +95,7 @@ class Films i += 1 } + # annonce à chaque module d'importation que c'est fini @films.each{|t,f| f.mod.finish } @@ -117,11 +129,11 @@ class Films # Charge les films depuis le fichier XML def chargerFilms - # si le fichier n'existe pas il n'y a rien à charger + # si le fichier n'existe pas il n'y a rien à charger if !File.exists?(@xmlFile) return end - + racine = REXML::Document::new(File::new(@xmlFile)).root racine.each_element{|e| id = e.attribute('id').to_s.to_i @@ -187,7 +199,7 @@ class Films return id end - # Ajoute un film + # Ajoute un film à l'ensemble des films. def ajouterFilm(film) if film.plusieursReponses? @filmsPlusieursReponses << film @@ -200,7 +212,6 @@ class Films end if @films.has_key?(film.titre) - # le fichier n'est pas connu -> nième partie d'un film if !@filmsFichier.has_key?(film.fichiers[0]) puts "[i] movie #{film.titre} has a another file part : #{film.fichiers[0]}" @films[film.titre].addFichier(film.fichiers[0]) @@ -215,7 +226,7 @@ class Films end end - # Appelé par 'pomper'. Cette méthode est récursive. + # Appelé par 'pomper'. Cette méthode itère récursivement sur l'arborescence d'un repertoire. def pomperR(r) Dir::foreach(r){|f| next if f[0,1] == '.' @@ -224,21 +235,20 @@ class Films pomperR(fichier) else + #CGI::escapeHTML( + fichier = Iconv.iconv("UTF-8", "ISO-8859-1", fichier)[0] + # véfication de l'extension /^.*?\.([^.]{3,4})$/ =~ fichier if !FILMS_EXTENSIONS.include?($1) next end - - fichier = CGI::escapeHTML(Iconv.iconv("UTF-8", "ISO-8859-1", fichier)[0]) - + # on skip si le film est déjà dans la BD if film = @filmsFichier[fichier] puts "[i] Already exists in DB : #{film.titre} (#{fichier})" next end - - film = nil # pour limiter le nombre de connexion simultanée if @nbConn >= NB_CONN_MAX @@ -247,15 +257,17 @@ class Films @nbConn += 1 @threadsWait.join_nowait( - Thread::new{ + Thread::start{ begin film = Film::new(fichier, @modClasse::new) - film.id = getNewId # on lui donne un nouvel ID + @mutexId.synchronize { + film.id = getNewId # on lui donne un nouvel ID + } film.loadData # on charge ses données - unless film.nil? # le film a été correctement construit + @mutexAjout.synchronize { ajouterFilm(film) - end + } rescue Exception => e puts e.message puts e.backtrace