2 # Permet de charger des données depuis allocine.fr
3 # Permet d'effectuer des recherches depuis allocine.fr
4 # TODO : rendre la classe indépendant de la source de donnée pour pouvoir utiliser d'autres sites comme par exemple imdb.com
12 require 'constantes.rb'
16 return gsub(/<(.*?)>/, '')
24 attr_accessor
:id, :titre, :url, :fichiers, :annee, :realisateurs, :acteurs, :pays, :duree, :critiquePresse, :critiqueSpectateur, :genres, :synopsis, :budget
26 # Constructeur. N'entreprend aucune action (chargement), crée juste un film vide.
27 def initialize(fichier
)
38 @critiqueSpectateur = nil
45 @aPlusieursReponses = false
46 # mémorise les tuples {nom => id} dans le cas ou il y a plusieurs réponses
50 # Est-ce qu'il y a eu plusieurs réponses pour ce film lors de la cherche sur le net ?
51 def plusieursReponses
?
52 return @aPlusieursReponses
55 # Demande à l'utilisateur de faire un choix
56 # ret : true si le conflit à été résolu sinon false
57 def reglerConflitPlusieursReponses
59 @aPlusieursReponses = false # pour faire les choses bien
61 puts
" -> " +
@fichiers[0]
62 puts
"Fais ton choix jeune padawan (un caractère et pas plus)"
63 tabNoms
= @idsAllocine.keys
71 puts
"A. Passer et l'ajouter"
82 if choix
> 0 && choix
<= tabNoms
.length
86 puts
"Choix pas bon !!
"
90 loadDepuisIdAllocine(@idsAllocine[tabNoms[choix-1]])
95 # Ajoute un fichier comme faisant partie du film
96 def addFichier(fichier)
97 if !@fichiers.include?(fichier
)
102 # Charge les informations du films à partir d'allocine.fr
106 @titre = @fichiers[0]
110 connexionHttp
= Net
::HTTP::new('www.allocine.fr')
112 #extrait le nom à partir du nom du fichier
113 /^.*?([^\/]*?)\
.(.{3,4})$/ =~
@fichiers[0]
114 #remplace undescores et points par des espaces
115 titre
= $1.gsub(/[_\.]/, ' ')
116 #remplace les suites d'espaces par un seul
117 titre
.gsub!
(/ {2,}/,' ')
118 titre
.gsub!
(/\[.*?\]/,'')
119 titre
.gsub!
(/\(.*?\)/,'')
120 titre
.gsub!
(/\{.*?\}/,'')
121 #vire les espaces au début et à la fin
129 reponse
, donneesHtml
= connexionHttp
.get("/recherche/?motcle=#{CGI::escape(titre.unpack("U*").pack("C*"))}")
130 rescue Exception
=> e
132 puts
"[!] Connexion lost
, retry.."
136 #convertit le code latin-1 en UTF8
137 donneesHtml = donneesHtml.unpack("C
*").pack("U
*")
139 #si pas trouvé alors on enlève un mot à la fin
140 if /.*?Pas de résultats.*?/ =~ donneesHtml || ! donneesHtml
.include?("<h3><b>Films <h4>")
141 /(.*?)[^ ]+?$/ =~ titre
.strip
147 end while not titre
.nil? and not titre
.empty
?
149 unless titre
.nil? or titre
.empty
?
151 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}/)
154 @aPlusieursReponses = true
156 @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]
159 loadDepuisIdAllocine(r
[0][0], connexionHttp
)
161 puts
"[!] Movie
not found
: #{@titre} (#{@fichier})"
167 # Renvoie un film sous la forme d'un élément XML de type REXML::Element.
170 racine = REXML::Element::new('film')
171 racine.add_attribute('id', @id.to_s)
173 fichiers = REXML::Element::new('fichiers')
175 fichiers.add(REXML::Element::new('fichier').add_text(f))
179 racine.add(REXML::Element::new('titre').add_text(@titre))
180 racine.add(REXML::Element::new('annee').add_text(@annee))
182 realisateurs = REXML::Element::new('realisateurs')
183 @realisateurs.each{|r|
184 realisateurs.add(REXML::Element::new('realisateur').add_text(r.nom))
186 racine.add(realisateurs)
188 acteurs = REXML::Element::new('acteurs')
190 acteurs.add(REXML::Element::new('acteur').add_text(a.nom))
194 lespays = REXML::Element::new('lespays')
196 lespays.add(REXML::Element::new('pays').add_text(p.nom))
200 racine.add(REXML::Element::new('duree').add_text(@duree.to_s))
202 racine.add(REXML::Element::new('critiquePresse').add_text(@critiquePresse))
203 racine.add(REXML::Element::new('critiqueSpectateur').add_text(@critiqueSpectateur))
205 genres = REXML::Element::new('genres')
207 genres.add(REXML::Element::new('genre').add_text(g.nom))
211 synopsisElement = REXML::Element::new('synopsis')
212 unless @synopsis.nil?
213 @synopsis.split("\n").each{|s|
215 synopsisElement.add(REXML::Element::new('p').add_text(s))
218 racine.add(synopsisElement)
220 budgetElement = REXML::Element::new('budget')
221 budgetElement.add_text(@budget)
222 budgetElement.add_attribute('unite', @budgetUnite)
223 racine.add(budgetElement)
225 racine.add(REXML::Element::new('url').add_text(@url))
231 def loadDepuisIdAllocine(id, connexionHttp = nil)
232 if (connexionHttp == nil)
233 connexionHttp = Net::HTTP::new('www.allocine.fr')
236 r, ficheHtml = connexionHttp.get("/film/fichefilm_gen_cfilm
=#{id}.html
")
238 #convertit le code latin-1 en UTF8
239 ficheHtml = ficheHtml.unpack("C
*").pack("U
*")
242 @url = "http
://www
.allocine
.fr
/film/fichefilm_gen_cfilm
=#{id}.html
"
245 /<title>(.*?)<\/title>/ =~ ficheHtml
246 @titre = $1 unless $1.nil?
248 puts "Movie found
: #{@titre} (#{@fichiers[0]})"
251 /<h4>Année de production : (\d+)<\
/h4
>/ =~ ficheHtml
252 @annee = $1 unless $1.nil?
255 /<h4>Réalisé par(.*?)<\/h4
>/ =~ ficheHtml
256 $1.scan(/\s*<a class="link1" href=".*?">(.*?)<\/a
>\s
*/m
){|a
|
257 @realisateurs << Personne
::ajouter(a
[0]) unless a
[0].nil?
261 /<h4>Avec(.*?)<\/h4
>/ =~ ficheHtml
262 $1.scan(/\s*<a class="link1" href="\/personne\
/fichepersonne_gen_cpersonne=\d+\.html">(.+?)<\/a
>\s
*/m
){|a
|
263 @acteurs << Personne
::ajouter(a
[0]) unless a
[0].nil?
267 /<h4>Film (.*?)\. <\/h4
>/ =~ ficheHtml
268 $1.split(',').each
{|pays
|
269 @pays << Pays
::ajouter(pays
) unless pays
.nil?
272 # Duree (capture des heures et des minutes séparement vue que c'est le bordel sur allocine
273 /<h4>Durée :(?:.*?)(\d+)h/ =~ ficheHtml
274 heure
= $1.nil? ? 0 : $1.to_i
276 /<h4>Durée :(?:.*?)(\d+)min/ =~ ficheHtml
277 min
= $1.nil? ? 0 : $1.to_i
279 @duree = heure
* 60 + min
281 # Critiques presse et spectateur
282 /Presse.*etoile_([012345]).*Spectateurs.*etoile_([012345])"/m
=~ ficheHtml
283 @critiquePresse = $1 unless $1.nil?
284 @critiqueSpectateur = $2 unless $2.nil?
287 /<h4>Genre : (.*?)<\/h4
>/ =~ ficheHtml
288 $1.scan(/<a href="\/film\
/alaffiche_genre_gen_genre=.*?" class="link1">(.+?)<\/a
>/m
){|g
|
289 @genres << Genre
::ajouter(g
[0]) unless g
[0].nil?
293 /Synopsis.*?<h4>(.*?)<\/h4
>/m
=~ ficheHtml
296 @synopsis.gsub!
(/<br\s*\/>|<br\s
*>/, "\n")
297 @synopsis.virerBalisesHTML!
301 /Budget<\/b
> : (.+
?) millions d
'euros<\/h4>/ =~ ficheHtml
302 @budget = $1 unless $1.nil?