X-Git-Url: http://git.euphorik.ch/?a=blobdiff_plain;f=src%2Ffilms.rb;fp=src%2Ffilms.rb;h=a934dbb29dc948ffff8415e35125933ba3efaa4c;hb=c967b07b58b4588996be0ebefa5a2d10e0663cf6;hp=0000000000000000000000000000000000000000;hpb=360b03e976f53bd285b4f88e41bedf72e644898b;p=pompage.git diff --git a/src/films.rb b/src/films.rb new file mode 100644 index 0000000..a934dbb --- /dev/null +++ b/src/films.rb @@ -0,0 +1,230 @@ +# Représente un ensemble de films + +require 'rexml/document' +require 'thwait' + +require 'film.rb' +require 'pays.rb' +require 'genre.rb' +require 'personne.rb' +require 'constantes.rb' + +class Films + def initialize(xmlFile) + @xmlFile = xmlFile + + # repertoire de base, par exemple C:/Divx/ + @repBase = '' + + # Les films indexés par leur titre + @films = {} + + # Les films indexés 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 + @filmsPlusieursReponses = [] + + @threadsWait = ThreadsWait::new + @nbConn = 0 # le nombre de connexion + + # le prochain id disponible + @idDisponible = 1 + + chargerFilms + end + + # 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) + + pomperR('.') + + # on attends que les threads se terminent + @threadsWait.all_waits + + # 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) + end + i += 1 + } + + Dir::chdir(repPrecedant) + end + + # Sauve les films dans un fichier XML + def sauverFilms + # le document + docXml = REXML::Document::new + docXml.xml_decl().encoding = "UTF-8" # normalement UTF-8 + docXml.xml_decl().dowrite + + # la racine du document + racine = REXML::Element::new('filmographie') + docXml.add(racine) + pi = REXML::Instruction.new("xml-stylesheet", "type=\"text/xsl\" href=\"../xsl/yopyop.xsl\"") + racine.previous_sibling = pi + + # on ajoute chaque film à la racine + @films.each{|nom, f| + racine.add(f.getXml) + } + + # sauve le document + docXml.write(File::new(@xmlFile, 'w'), 0) + end + + private + + # Charge les films depuis le fichier XML + def chargerFilms + # 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 + @idDisponible = id + 1 + end + + titre = e.get_elements('titre')[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 + critiquePresse = e.get_elements('critiquePresse')[0].get_text + critiqueSpectateur = e.get_elements('critiqueSpectateur')[0].get_text + synopsis = e.get_elements('synopsis')[0].get_elements('p') + budget = e.get_elements('budget')[0].get_text + realisateurs = e.get_elements('realisateurs')[0].get_elements('realisateur') + acteurs = e.get_elements('acteurs')[0].get_elements('acteur') + 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.titre = titre.value unless titre.nil? + film.id = id + fichiers.each{|e| + film.addFichier(e.get_text.value) + @filmsFichier[e.get_text.value] = film + } + film.annee = annee.value unless annee.nil? + acteurs.each{|e| + film.acteurs << Personne::ajouter(e.get_text.value) + } + pays.each{|e| + film.pays << Pays::ajouter(e.get_text.value) + } + film.duree = duree.value unless duree.nil? + film.critiquePresse = critiquePresse.value unless critiquePresse.nil? + 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.budget = budget.value unless budget.nil? + @films[film.titre] = film + } + end + + # Retourne un nouvel id, utilisé lors de la création d'un nouveau film + def getNewId + id = @idDisponible + @idDisponible += 1 + return id + end + + # Ajoute un film + def ajouterFilm(film) + if film.plusieursReponses? + @filmsPlusieursReponses << film + return + end + + # le film existe déjà + 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]) + @filmsFichier[film.fichiers[0]] = @films[film.titre] + else + puts "[!] Duplicate movie : #{film.titre} (#{film.fichiers[0]})" + end + else + puts "[i] movie added : #{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. + def pomperR(r) + Dir::foreach(r){|f| + next if f[0,1] == '.' + fichier = (r == '.' ? '' : r + "/") + f + if File::directory?(fichier) + litRepertoireR(fichier) + else + + # vérification de l'extension + /^.*?\.(.{3,4})$/ =~ fichier + if !FILMS_EXTENSIONS.include?($1) + next + end + + fichier = CGI::escapeHTML(fichier.unpack("C*").pack("U*")) + + # on skip si le film est déjàa 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 + @threadsWait.next_wait + end + + @nbConn += 1 + @threadsWait.join_nowait( + Thread::new{ + begin + film = Film::new(fichier).loadData + film.id = getNewId # on lui donne un nouvel ID + + unless film.nil? # le film a été correctement construit + ajouterFilm(film) + end + rescue Exception => e + puts e.message + puts e.backtrace + end + @nbConn -= 1 + } + ) + end + } + end +end \ No newline at end of file