X-Git-Url: http://git.euphorik.ch/?a=blobdiff_plain;f=src%2Ffilms.rb;h=be1ebf959788636ce2846bda3c4505de2fd0c6c8;hb=339621e8669fbd4b09e2d0825f5521469503837b;hp=585970e5c029620a20440c681214e79332c78802;hpb=202a3b4495bc486dc0f5bb6a34da66d5e34832bf;p=pompage.git diff --git a/src/films.rb b/src/films.rb index 585970e..be1ebf9 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,10 +10,13 @@ require 'personne.rb' require 'constantes.rb' require 'iconv' +# Représente un ensemble de films. class Films - def initialize(xmlFile) + def initialize(xmlFile, modClasse) @xmlFile = xmlFile + @modClasse = modClasse + # repertoire de base, par exemple C:/Divx/ @repBase = '' @@ -26,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) @@ -69,6 +81,7 @@ class Films i += 1 } + # traite les films qui n'avaient aucune réponse i = 1 @filmsAucuneReponse.each{|f| puts @@ -82,9 +95,30 @@ class Films i += 1 } + # annonce à chaque module d'importation que c'est fini + @films.each{|t,f| + f.mod.finish + } + Dir::chdir(repPrecedant) end + # Mise à jour des films dans la BD. + # p1 string : un motif Regex correspondant à un ou plusieurs champs + def update(champ, titre) + @films.each{|t, f| + next if !f.titre.match(Regexp::new(titre, true)) + + ## si le film est complet on ne fait rien + if $force || f.url == nil || f.titre == '' || f.annee == nil || + f.realisateurs.empty? || f.acteurs.empty? || f.pays.empty? || + f.genres.empty? || f.synopsis == nil || !f.possedeImage? + + f.update(champ) + end + } + end + # Sauve les films dans un fichier XML def sauverFilms # le document @@ -111,16 +145,16 @@ 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 - if id > @idDisponible + if id >= @idDisponible @idDisponible = id + 1 end @@ -138,7 +172,7 @@ class Films pays = e.get_elements('lespays')[0].get_elements('pays') genres = e.get_elements('genres')[0].get_elements('genre') - film = Film::new(fichiers[0].get_text.value) + film = Film::new(fichiers[0].get_text.value, @modClasse::new) film.id = id film.titre = titre.value unless titre.nil? @@ -153,6 +187,9 @@ class Films acteurs.each{|e| film.acteurs << Personne::ajouter(e.get_text.value) } + realisateurs.each{|e| + film.realisateurs << Personne::ajouter(e.get_text.value) + } pays.each{|e| film.pays << Pays::ajouter(e.get_text.value) } @@ -161,14 +198,15 @@ class Films film.critiqueSpectateur = critiqueSpectateur.value unless critiqueSpectateur.nil? genres.each{|e| film.genres << Genre::ajouter(e.get_text.value) if e.get_text != nil - } + } debut = true film.synopsis = "" synopsis.each{|e| film.synopsis += "\n" unless debut film.synopsis += e.get_text.value if e.get_text != nil debut = false - } + } + film.synopsis = nil if film.synopsis == "" film.budget = budget.value unless budget.nil? @films[film.titre] = film } @@ -181,7 +219,7 @@ class Films return id end - # Ajoute un film + # Ajoute un film à l'ensemble des films. def ajouterFilm(film) if film.plusieursReponses? @filmsPlusieursReponses << film @@ -194,22 +232,21 @@ 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]}" + puts "[i] Le film #{film.titre} possède une autre partie : #{film.fichiers[0]}" @films[film.titre].addFichier(film.fichiers[0]) @filmsFichier[film.fichiers[0]] = @films[film.titre] else - puts "[!] Duplicate movie : #{film.titre} (#{film.fichiers[0]})" + puts "[!] Film déjà dans la BD : #{film.titre} (#{film.fichiers[0]})" end else - puts "[i] movie added : #{film.titre} (#{film.fichiers[0]})" + puts "[i] Film ajouté : #{film.titre} (#{film.fichiers[0]})" @films[film.titre] = film @filmsFichier[film.fichiers[0]] = film 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] == '.' @@ -218,21 +255,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})" + puts "[!] Film déjà dans la BD : #{film.titre} (#{film.fichiers[0]})" next end - - film = nil # pour limiter le nombre de connexion simultanée if @nbConn >= NB_CONN_MAX @@ -241,14 +277,17 @@ class Films @nbConn += 1 @threadsWait.join_nowait( - Thread::new{ + Thread::start{ begin - film = Film::new(fichier).loadData - film.id = getNewId # on lui donne un nouvel ID + film = Film::new(fichier, @modClasse::new) + @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