X-Git-Url: http://git.euphorik.ch/?p=pompage.git;a=blobdiff_plain;f=src%2Ffilm.rb;h=30a5bc8487ed283dbc31267a24c8e1cd0e2f4bad;hp=b8b3e07e82032272f60cfcc1280babab5e1f51e5;hb=c967b07b58b4588996be0ebefa5a2d10e0663cf6;hpb=360b03e976f53bd285b4f88e41bedf72e644898b
diff --git a/src/film.rb b/src/film.rb
index b8b3e07..30a5bc8 100644
--- a/src/film.rb
+++ b/src/film.rb
@@ -1,15 +1,14 @@
-# Attention, le but de ce fichier n'est pas d'être le plus clair possible ^-^´´
+# Représente un Film.
+# Permet de charger des données depuis allocine.fr
+# Permet d'effectuer des recherches depuis allocine.fr
+# TODO : rendre la classe indépendant de la source de donnée pour pouvoir utiliser d'autres sites comme par exemple imdb.com
-require 'rexml/document'
require 'net/http'
-require 'thread'
-require 'thwait'
require 'cgi'
require 'pays.rb'
require 'genre.rb'
require 'personne.rb'
-
require 'constantes.rb'
class String
@@ -23,215 +22,8 @@ end
class Film
attr_accessor :id, :titre, :fichiers, :annee, :realisateurs, :acteurs, :pays, :duree, :critiquePresse, :critiqueSpectateur, :genres, :synopsis, :budget
-
- # 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 prochain id disponible
- @@idDisponible = 1
-
- # retourne un nouvel id, utilisé lors de la création d'un nouveau film
- def Film::getNewId
- id = @@idDisponible
- @@idDisponible += 1
- return id
- end
-
- # Lit un repertoire de manière recursive
- def Film::litRepertoire(r)
- @@repBase = r
- repPrecedant = Dir::getwd
- Dir::chdir(r)
-
- Film::litRepertoireR('.')
-
- # 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
- Film::ajouterFilm(f)
- end
- i += 1
- }
-
- Dir::chdir(repPrecedant)
- end
-
- # Charge les films contenus dans un fichier XML.
- def Film::loadFilmsXml(xmlFile)
- # 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_text
- 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
- }
- film.synopsis = synopsis.value unless synopsis.nil?
- film.budget = budget.value unless budget.nil?
- @@films[film.titre] = film
- }
- end
-
- # Renvoie tous les films sous la forme d'un document XML.
- def Film::getFilmsXml
- # 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)
- }
-
- # revoie le document
- docXml
- end
-
-private
- def Film::filmsFactory(fichier)
- Film::new(fichier).loadData
- end
-
- def Film::litRepertoireR(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
-
- #p fichier
-
- film = nil
-
- if @@nbConn >= NB_CONN_MAX
- @@threadsWait.next_wait
- end
-
- @@nbConn += 1
- @@threadsWait.join_nowait(
- Thread::new{
- begin
- film = Film::filmsFactory(fichier)
- unless film.nil? # le film a été correctement construit
- Film::ajouterFilm(film)
- end
- rescue Exception => e
- puts e.message
- puts e.backtrace
- end
- @@nbConn -= 1
- }
- )
- end
- }
- end
-
- def Film::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
-
-
+ # Constructeur. N'entreprend aucune action (chargement), crée juste un film vide.
def initialize(fichier)
@fichiers = [fichier]
@@ -255,13 +47,12 @@ private
@idsAllocine = {}
end
-public
-
+ # Est-ce qu'il y a eu plusieurs réponses pour ce film lors de la cherche sur le net ?
def plusieursReponses?
return @aPlusieursReponses
end
- # demande à l'utilisateur de faire un choix
+ # Demande à l'utilisateur de faire un choix
# ret : true si le conflit à été résolu sinon false
def reglerConflitPlusieursReponses
@@ -301,6 +92,7 @@ public
return true
end
+ # Ajoute un fichier comme faisant partie du film
def addFichier(fichier)
if !@fichiers.include?(fichier)
@fichiers << fichier
@@ -314,8 +106,6 @@ public
@titre = @fichiers[0]
return self
end
-
- @id = Film::getNewId
connexionHttp = Net::HTTP::new('www.allocine.fr')
@@ -358,8 +148,6 @@ public
unless titre.nil? or titre.empty?
- #// =~ donneesHtml
- #r = donneesHtml.scan(/(.*?)<\/a>/)
r = donneesHtml.scan(/(.*?)<\/a>(?:<\/h4>