-# Représente un Film.\r
-# Permet de charger des données depuis allocine.fr\r
-# Permet d'effectuer des recherches depuis allocine.fr\r
-# TODO : rendre la classe indépendant de la source de donnée pour pouvoir utiliser d'autres sites comme par exemple imdb.com\r
-\r
-require 'net/http'\r
-require 'cgi'\r
+# coding: utf-8\r
\r
require 'pays.rb'\r
require 'genre.rb'\r
require 'personne.rb'\r
require 'constantes.rb'\r
\r
+require 'modules/allocine.rb'\r
+\r
+# ajout de deux méthodes à la classe String\r
class String\r
def virerBalisesHTML\r
return gsub(/<(.*?)>/, '')\r
end\r
end\r
\r
+# Représente un Film.\r
+# Permet de charger des données depuis allocine.fr\r
+# Permet d'effectuer des recherches depuis allocine.fr\r
class Film\r
- attr_accessor :id, :titre, :fichiers, :annee, :realisateurs, :acteurs, :pays, :duree, :critiquePresse, :critiqueSpectateur, :genres, :synopsis, :budget\r
+ \r
+ # toutes les données membres sont accessibles par défaut (écriture/lecture)\r
+ attr_accessor :id, :titre, :url, :fichiers, :mod, :annee, :realisateurs, :acteurs, :pays, :duree, :critiquePresse, :critiqueSpectateur, :genres, :synopsis, :budget\r
\r
# Constructeur. N'entreprend aucune action (chargement), crée juste un film vide.\r
- def initialize(fichier)\r
- @fichiers = [fichier]\r
+ # p1 [String] : le fichier correspondant au film\r
+ def initialize(fichier, mod)\r
+ @fichiers = [] # le chemin des fichiers est relatif au repertoire de base\r
+ @fichiers << fichier if fichier != nil && fichier != ''\r
+ \r
+ @mod = mod\r
\r
@id = 0\r
@titre = ''\r
@synopsis = nil\r
@budget = nil \r
@budgetUnite = 'euro'\r
- @url\r
+ @url = nil\r
+ \r
+ @nbReponses = 0\r
\r
- @aPlusieursReponses = false\r
- # mémorise les tuples {nom => id} dans le cas ou il y a plusieurs réponses\r
- @idsAllocine = {}\r
+ # mémorise les tuples {nom => id} dans le cas ou il y a plusieurs choix de films après une recherche\r
+ @choix = {}\r
+ end\r
+ \r
+ def titre=(t)\r
+ if t == nil\r
+ @titre = ""\r
+ else\r
+ @titre = t\r
+ end\r
end\r
\r
# Est-ce qu'il y a eu plusieurs réponses pour ce film lors de la cherche sur le net ?\r
def plusieursReponses?\r
- return @aPlusieursReponses\r
+ return @nbReponses > 1\r
+ end \r
+\r
+ # Est-ce qu'il y a eu plusieurs réponses pour ce film lors de la cherche sur le net ?\r
+ def nbReponses\r
+ return @nbReponses\r
end \r
\r
- # Demande à l'utilisateur de faire un choix\r
- # ret : true si le conflit à été résolu sinon false\r
+ # Demande à l'utilisateur de faire un choix.\r
+ # ret : 1 si le conflit à été résolu, 2 si le film est à ignorer, 3 si tout les films sont à ignorer\r
def reglerConflitPlusieursReponses\r
- \r
- @aPlusieursReponses = false # pour faire les choses bien\r
+ @nbReponses = 1\r
\r
puts " -> " + @fichiers[0]\r
puts "Fais ton choix jeune padawan (un caractère et pas plus)"\r
- tabNoms = @idsAllocine.keys\r
+ tabNoms = @choix.keys\r
choix = 1\r
loop do \r
i = 1\r
puts "#{i}. #{n}"\r
i += 1\r
}\r
+ puts "______"\r
puts "A. Passer et l'ajouter"\r
puts "B. Ignorer"\r
+ puts "C. Tout ignorer"\r
choix = STDIN.gets\r
\r
if /A/i =~ choix\r
- return true\r
+ return 1\r
elsif /B/i =~ choix\r
- return false\r
+ return 2\r
+ elsif /C/i =~ choix\r
+ return 3\r
end\r
\r
choix = choix.to_i\r
end\r
end\r
\r
- loadDepuisIdAllocine(@idsAllocine[tabNoms[choix-1]])\r
+ @mod.load(@choix[tabNoms[choix-1]], self)\r
\r
- return true\r
+ return 1\r
end\r
\r
# Ajoute un fichier comme faisant partie du film\r
\r
# Charge les informations du films à partir d'allocine.fr\r
# ret [Film]\r
- def loadData\r
- unless LOAD_DATA\r
- @titre = @fichiers[0]\r
- return self\r
- end\r
-\r
- connexionHttp = Net::HTTP::new('www.allocine.fr')\r
- \r
+ def loadData \r
#extrait le nom à partir du nom du fichier\r
/^.*?([^\/]*?)\.(.{3,4})$/ =~ @fichiers[0]\r
#remplace undescores et points par des espaces\r
titre = $1.gsub(/[_\.]/, ' ')\r
#remplace les suites d'espaces par un seul\r
titre.gsub!(/ {2,}/,' ')\r
- titre.gsub!(/\[.*?\]/,'')\r
- titre.gsub!(/\(.*?\)/,'')\r
- titre.gsub!(/\{.*?\}/,'')\r
- #vire les espaces au début et à la fin\r
+ titre.gsub!(/\[.*?\]/,' ')\r
+ titre.gsub!(/\(.*?\)/,' ')\r
+ titre.gsub!(/\{.*?\}/,' ')\r
+ # vire les espaces au début et à la fin\r
titre.strip!\r
\r
@titre = titre.dup\r
\r
- donneesHtml = nil\r
- begin\r
- begin\r
- reponse, donneesHtml = connexionHttp.get("/recherche/?motcle=#{CGI::escape(titre.unpack("U*").pack("C*"))}")\r
- rescue Exception => e\r
- p e\r
- puts "[!] Connexion lost, retry.."\r
- retry\r
- end\r
- \r
- #convertit le code latin-1 en UTF8\r
- donneesHtml = donneesHtml.unpack("C*").pack("U*")\r
- \r
- #si pas trouvé alors on enlève un mot à la fin\r
- if /.*?Pas de résultats.*?/ =~ donneesHtml || ! donneesHtml.include?("<h3><b>Films <h4>")\r
- /(.*?)[^ ]+?$/ =~ titre.strip\r
- titre = $1\r
- titre.strip!\r
- else\r
- break;\r
- end\r
- end while not titre.nil? and not titre.empty?\r
+ unless LOAD_DATA\r
+ return self\r
+ end\r
\r
- unless titre.nil? or titre.empty?\r
- \r
- r = donneesHtml.scan(/<a href="\/film\/fichefilm_gen_cfilm=(\d+)\.html" class="link1">(.*?)<\/a>(?:<\/h4><h5 style="color: #666666"> (.*?)<\/h5>){0,1}(?:<h4><br \/><\/h4>){0,1}(?:<h4 style="color: #666666"> de (.*?)<\/h4>){0,1}(?:<h4 style="color: #666666"> avec (.*?)<\/h4>){0,1}(?:<h4 style="color: #666666"> \((.*?)\)<\/h4>){0,1}/)\r
- \r
- if r.length > 1\r
- @aPlusieursReponses = true\r
- r.each{|f|\r
- @idsAllocine[f[1].virerBalisesHTML + (f[2] != nil ? " " + f[2].virerBalisesHTML : "") + (f[3] != nil ? " de " + f[3].virerBalisesHTML : "") + (f[4] != nil ? " avec " + f[4].virerBalisesHTML : "") + (f[5] != nil ? " (" + f[5].virerBalisesHTML + ")" : "")] = f[0]\r
- }\r
- elsif r.length == 1\r
- loadDepuisIdAllocine(r[0][0], connexionHttp) \r
- else\r
- puts "[!] Movie not found : #{@titre} (#{@fichier})"\r
- end\r
+ reponses = @mod.rechercherFilm(titre)\r
+ @nbReponses = reponses.size\r
+ \r
+ if @nbReponses == 1\r
+ @mod.load(reponses.values[0], self)\r
+ else\r
+ @choix = reponses \r
end\r
+\r
self\r
end\r
\r
- # Renvoie un film sous la forme d'un élément XML de type REXML::Element.\r
+ def cheminImage\r
+ return $repBase + "/" + $repAffichette + @id.to_s + ".jpg";\r
+ end\r
+ \r
+ def setImage(image)\r
+ f = File::new(cheminImage, 'w').binmode\r
+ f.write(image)\r
+ f.close\r
+ end\r
+ \r
+ def possedeImage?\r
+ return File::exist?(cheminImage)\r
+ end\r
+ \r
+ # Met à jour un ou plusieurs champs correspondant à 'champ'.\r
+ def update(champ)\r
+ return if @url == nil || @url == ""\r
+ @mod.setChamp(champ)\r
+ @mod.loadURL(@url, self)\r
+ end\r
+ \r
+ # Renvoie un film sous la forme d'un élément XML .\r
+ # ret [REXML::Element] : un element xml <film>\r
def getXml\r
\r
racine = REXML::Element::new('film')\r
racine.add_attribute('id', @id.to_s)\r
- \r
+\r
fichiers = REXML::Element::new('fichiers')\r
@fichiers.each{|f|\r
fichiers.add(REXML::Element::new('fichier').add_text(f)) \r
}\r
- racine.add(fichiers) \r
- \r
+ racine.add(fichiers)\r
+\r
racine.add(REXML::Element::new('titre').add_text(@titre))\r
racine.add(REXML::Element::new('annee').add_text(@annee))\r
\r
\r
racine\r
end\r
- \r
-private\r
- def loadDepuisIdAllocine(id, connexionHttp = nil)\r
- if (connexionHttp == nil)\r
- connexionHttp = Net::HTTP::new('www.allocine.fr')\r
- end\r
- \r
- r, ficheHtml = connexionHttp.get("/film/fichefilm_gen_cfilm=#{id}.html") \r
- \r
- #convertit le code latin-1 en UTF8\r
- ficheHtml = ficheHtml.unpack("C*").pack("U*")\r
\r
- #url\r
- @url = "http://www.allocine.fr/film/fichefilm_gen_cfilm=#{id}.html"\r
- \r
- # Titre\r
- /<title>(.*?)<\/title>/ =~ ficheHtml\r
- @titre = $1 unless $1.nil?\r
- \r
- puts "Movie found : #{@titre} (#{@fichiers[0]})"\r
- \r
- # Année\r
- /<h4>Année de production : (\d+)<\/h4>/ =~ ficheHtml\r
- @annee = $1 unless $1.nil?\r
- \r
- # Réalisateurs\r
- /<h4>Réalisé par(.*?)<\/h4>/ =~ ficheHtml\r
- $1.scan(/\s*<a class="link1" href=".*?">(.*?)<\/a>\s*/m){|a|\r
- @realisateurs << Personne::ajouter(a[0]) unless a[0].nil?\r
- } unless $1.nil?\r
- \r
- # Acteurs\r
- /<h4>Avec(.*?)<\/h4>/ =~ ficheHtml\r
- $1.scan(/\s*<a class="link1" href="\/personne\/fichepersonne_gen_cpersonne=\d+\.html">(.+?)<\/a>\s*/m){|a|\r
- @acteurs << Personne::ajouter(a[0]) unless a[0].nil? \r
- } unless $1.nil? \r
- \r
- # Pays\r
- /<h4>Film (.*?)\. <\/h4>/ =~ ficheHtml\r
- $1.split(',').each{|pays|\r
- @pays << Pays::ajouter(pays) unless pays.nil?\r
- } unless $1.nil? \r
- \r
- # Duree (capture des heures et des minutes séparement vue que c'est le bordel sur allocine\r
- /<h4>Durée :(?:.*?)(\d+)h/ =~ ficheHtml\r
- heure = $1.nil? ? 0 : $1.to_i\r
- \r
- /<h4>Durée :(?:.*?)(\d+)min/ =~ ficheHtml\r
- min = $1.nil? ? 0 : $1.to_i\r
- \r
- @duree = heure * 60 + min\r
- \r
- # Critiques presse et spectateur\r
- /Presse.*etoile_([012345]).*Spectateurs.*etoile_([012345])"/m =~ ficheHtml\r
- @critiquePresse = $1 unless $1.nil?\r
- @critiqueSpectateur = $2 unless $2.nil?\r
- \r
- # Genre\r
- /<h4>Genre : (.*?)<\/h4>/ =~ ficheHtml\r
- $1.scan(/<a href="\/film\/alaffiche_genre_gen_genre=.*?" class="link1">(.+?)<\/a>/m){|g|\r
- @genres << Genre::ajouter(g[0]) unless g[0].nil?\r
- } unless $1.nil? \r
- \r
- # Synopsis \r
- /Synopsis.*?<h4>(.*?)<\/h4>/m =~ ficheHtml\r
- unless $1.nil?\r
- @synopsis = $1\r
- @synopsis.gsub!(/<br\s*\/>|<br\s*>/, "\n")\r
- @synopsis.virerBalisesHTML!\r
- end\r
- \r
- # Budget \r
- /Budget<\/b> : (.+?) millions d'euros<\/h4>/ =~ ficheHtml\r
- @budget = $1 unless $1.nil?\r
- end \r
+ def to_s \r
+ acc = "'#{@titre}'\n" +\r
+ " id = #{@id}\n" +\r
+ " annee = #{@annee}\n" +\r
+ " réalisateurs :\n"\r
+ @realisateurs.each{|r|\r
+ acc += " - " + r.to_s\r
+ }\r
+ acc += " acteurs :\n"\r
+ @acteurs.each{|a|\r
+ acc += " - " + a.to_s\r
+ }\r
+ acc += " pays :\n"\r
+ @pays.each{|p|\r
+ acc += " - " + p.to_s\r
+ }\r
+ acc += " genres :\n"\r
+ @genres.each{|g|\r
+ acc += " - " + g.to_s\r
+ }\r
+ acc += " fichiers :\n"\r
+ @fichiers.each{|f|\r
+ acc += " - " + f + "\n"\r
+ }\r
+ \r
+ acc += " durée : #{@duree}\n"\r
+ acc += " critique presse : #{@critiquePresse}\n"\r
+ acc += " critique specatateur : #{@critiqueSpectateur}\n"\r
+ acc += " synopsis : #{@synopsis}\n"\r
+ acc += " budget : #{@budget} #{@budgetUnite}\n"\r
+ acc += " url : #{@url}\n" \r
+\r
+ return acc\r
+ end\r
end\r
-
\ No newline at end of file
+ \r