X-Git-Url: http://git.euphorik.ch/?a=blobdiff_plain;f=src%2Ffilms.rb;h=e93e6159fb2f14cad74dceb670733487d9a11fb0;hb=84fd971104c7cc367ecca4b7ae7073fb7a7e5a7a;hp=a934dbb29dc948ffff8415e35125933ba3efaa4c;hpb=c967b07b58b4588996be0ebefa5a2d10e0663cf6;p=pompage.git diff --git a/src/films.rb b/src/films.rb index a934dbb..e93e615 100644 --- a/src/films.rb +++ b/src/films.rb @@ -1,4 +1,4 @@ -# Représente un ensemble de films +# Représente un ensemble de films require 'rexml/document' require 'thwait' @@ -8,23 +8,30 @@ require 'pays.rb' require 'genre.rb' require 'personne.rb' require 'constantes.rb' +require 'iconv' class Films - def initialize(xmlFile) + def initialize(xmlFile, modClasse) @xmlFile = xmlFile + @modClasse = modClasse + # repertoire de base, par exemple C:/Divx/ @repBase = '' - # Les films indexés par leur titre + # Les films indexé par leur titre @films = {} - # Les films indexés par leur nom de fichier, deux fichiers différents peuvent pointer sur le même film + # Les films indexé par leur nom de fichier, deux fichiers différents peuvent pointer sur le même film @filmsFichier = {} - # Les films qui ont plusieurs réponses lors de la recherche, traités à la fin + # 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 + @filmsAucuneReponse = [] + + # permet de traiter facilement des groupes de thread @threadsWait = ThreadsWait::new @nbConn = 0 # le nombre de connexion @@ -34,29 +41,53 @@ class Films chargerFilms end - # Lit un repertoire de manière recursive et va chercher les informations concernant le film sur le net + # Lit un repertoire de manière recursive et va chercher les informations concernant le film sur le net def pomper(r) @repBase = r repPrecedant = Dir::getwd Dir::chdir(r) + t = Time::now + pomperR('.') # on attends que les threads se terminent @threadsWait.all_waits - # traite les films qui avaient plusieurs réponses lors de la recherche + puts "Pompage terminé, temps : #{Time::now - t} secondes" + + # traite les films qui avaient plusieurs réponses lors de la recherche # l'utilisateur doit faire un choix i = 1 @filmsPlusieursReponses.each{|f| puts puts "Plop, ya un conflit #{i} / #{@filmsPlusieursReponses.length} :" - if f.reglerConflitPlusieursReponses - ajouterFilm(f) + case f.reglerConflitPlusieursReponses + when 1 + ajouterFilm(f) + when 3 + break + end + i += 1 + } + + i = 1 + @filmsAucuneReponse.each{|f| + puts + puts "Plop, Ce film n'a pas été trouvé #{i} / #{@filmsAucuneReponse.length} :" + case f.reglerConflitPlusieursReponses + when 1 + ajouterFilm(f) + when 3 + break end i += 1 } + @films.each{|t,f| + f.mod.finish + } + Dir::chdir(repPrecedant) end @@ -73,7 +104,7 @@ class Films pi = REXML::Instruction.new("xml-stylesheet", "type=\"text/xsl\" href=\"../xsl/yopyop.xsl\"") racine.previous_sibling = pi - # on ajoute chaque film à la racine + # on ajoute chaque film à la racine @films.each{|nom, f| racine.add(f.getXml) } @@ -95,12 +126,12 @@ class Films racine.each_element{|e| id = e.attribute('id').to_s.to_i - if id > @idDisponible + if id >= @idDisponible @idDisponible = id + 1 end titre = e.get_elements('titre')[0].get_text - + url = e.get_elements('url')[0].get_text fichiers = e.get_elements('fichiers')[0].get_elements('fichier') annee = e.get_elements('annee')[0].get_text duree = e.get_elements('duree')[0].get_text @@ -113,10 +144,13 @@ 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.titre = titre.value unless titre.nil? film.id = id + film.titre = titre.value unless titre.nil? + + film.url = url.value unless url.nil? + fichiers.each{|e| film.addFichier(e.get_text.value) @filmsFichier[e.get_text.value] = film @@ -146,7 +180,7 @@ class Films } end - # Retourne un nouvel id, utilisé lors de la création d'un nouveau film + # Retourne un nouvel id, utilisé alors de la création d'un nouveau film def getNewId id = @idDisponible @idDisponible += 1 @@ -160,7 +194,11 @@ class Films return end - # le film existe déjà + if film.nbReponses == 0 + @filmsAucuneReponse << film + return + 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]) @@ -177,24 +215,24 @@ class Films end end - # Appelé par 'pomper'. Cette méthode est récursive. + # Appelé par 'pomper'. Cette méthode est récursive. def pomperR(r) Dir::foreach(r){|f| next if f[0,1] == '.' fichier = (r == '.' ? '' : r + "/") + f if File::directory?(fichier) - litRepertoireR(fichier) + pomperR(fichier) else - # vérification de l'extension - /^.*?\.(.{3,4})$/ =~ fichier + # véfication de l'extension + /^.*?\.([^.]{3,4})$/ =~ fichier if !FILMS_EXTENSIONS.include?($1) next end - fichier = CGI::escapeHTML(fichier.unpack("C*").pack("U*")) + fichier = CGI::escapeHTML(Iconv.iconv("UTF-8", "ISO-8859-1", fichier)[0]) - # on skip si le film est déjàa dans la BD + # 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 @@ -202,7 +240,7 @@ class Films film = nil - # pour limiter le nombre de connexion simultanée + # pour limiter le nombre de connexion simultanée if @nbConn >= NB_CONN_MAX @threadsWait.next_wait end @@ -211,16 +249,17 @@ class Films @threadsWait.join_nowait( Thread::new{ begin - film = Film::new(fichier).loadData + film = Film::new(fichier, @modClasse::new) 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 + unless film.nil? # le film a été correctement construit ajouterFilm(film) end rescue Exception => e puts e.message puts e.backtrace - end + end @nbConn -= 1 } )