9 require "basemodule.rb"
11 # doc : http://www.ruby-doc.org/stdlib/libdoc/net/http/rdoc/index.html
14 # hack : http://arosien.blogspot.com/2007/06/increasing-rubys-netbufferedio-buffer.html
18 timeout(@read_timeout) { @rbuf << @io.sysread(32768) }
23 # Un module d'importation pour le site "www.allocine.fr".
24 class Allocine
< Basemodule
28 @connexion = Net
::HTTP::new('www.allocine.fr').start
if @connexion == nil || !
@connexion.started
?
30 Puts
"[!] Impossible de se connecter à Allocine
. Retry
.."
36 @connexion.finish if defined? @connexion && @connexion.started? # on admet qu'après un load on a plus besoin de la connexion
41 def rechercherFilm(titre)
47 reponse = @connexion.get("/recherche/?rub
=1&motcle
=#{CGI::escape(Iconv.iconv("ISO-8859-1", "UTF-8", titre)[0])}")
50 puts "[!
] Erreur lors de la recherche du titre
#{titre}, retry.."
56 # convertit le code latin-1 en UTF8
57 html = Iconv.iconv("UTF-8
", "ISO-8859-1
", reponse.body)[0]
59 # si pas trouvé alors on enlève un mot à la fin
60 if /.*?Pas de résultats.*?/ =~ html || ! html
.include?("<h3><b>Films <h4>")
61 /(.*?)[^ ]+?$/ =~ titre
.strip
67 end while not titre
.nil? and not titre
.empty
?
70 unless titre
.nil? or titre
.empty
?
71 r
= html
.scan(/<h4><a href="\/film\
/fichefilm_gen_cfilm=(\d+)\.html".*?>(.*?)<\/a
><\
/h4>(?:<h5><a .*?> (.*?)<\/a
><\
/h5>)?(?:<div.*?><h4.*?>(\d*?){4}<\/h4
><\
/div>)?(?:<div.*?><h5.*?>de (.*?)<\/h5
><\
/div>)?(?:<div.*?><h5.*?>avec (.*?)<\/h5
><\
/div>)?/)
72 # f[0] : l'id allocine du film
79 reponses
[f
[1].virerBalisesHTML +
(f
[2] !
= nil ? " " + f
[2].virerBalisesHTML
: "") +
(f
[4] !
= nil ? " de " + f
[4].virerBalisesHTML
: "") +
(f
[5] !
= nil ? " avec " + f
[5].virerBalisesHTML
: "") +
(f
[3] !
= nil ? " (" + f
[3].virerBalisesHTML +
")" : "")] = f
[0]
87 loadPath("/film/fichefilm_gen_cfilm=#{id}.html", film
)
91 def loadURL(url
, film
)
92 loadPath(URI
.parse(url
).path
, film
)
95 def loadPath(path
, film
)
100 html
= @connexion.get(path
).body
101 rescue Exception
=> e
103 puts
"[!] Erreur lors du chargement de
#{film.fichiers[0]}, retry.."
109 puts "Pompage de
#{film.titre} (#{film.fichiers[0]}) ..."
111 # convertit le code latin-1 en UTF8
112 html = Iconv.iconv("UTF-8
", "ISO-8859-1
", html)[0]
114 # pompage de l'image dans un thread séparé
115 if take?("image
") && ($force || !film
.possedeImage
?)
116 /<img src="(.*?)" border="0" alt="" class="affichette" \/>/ =~ html
118 @threadImage = Thread
::start($1){|imageUrl
|
121 imageUrlParsed
= URI
.parse(imageUrl
)
122 connexionImage
= Net
::HTTP::new(imageUrlParsed
.host
).start
123 film
.setImage(connexionImage
.get(imageUrlParsed
.path
).body
)
124 connexionImage
.finish
125 rescue Exception
=> e
128 puts
"[!] Erreur lors du chargement de l
'image '#{imageUrl}', retry.."
129 retry if (nbRetry += 1) < 5
135 if take
?("url") && ($force || film
.url
== nil)
137 film
.url
= "http://www.allocine.fr" + path
142 /<title>(.*?)<\/title
>/ =~ html
146 if take
?("annee") && ($force || film
.annee
== nil)
148 /<h4>Année de production : (\d+)<\/h4
>/ =~ html
149 film
.annee
= $1 unless $1.nil?
152 if take
?("realisateurs") && ($force || film
.realisateurs
.empty
?)
154 film
.realisateurs
.clear
155 /<h4>Réalisé par(.*?)<\/h4
>/ =~ html
156 $1.scan(/\s*<a class="link1" href=".*?">(.*?)<\/a
>\s
*/m
){|a
|
157 film
.realisateurs
<< Personne
::ajouter(a
[0]) unless a
[0].nil?
161 if take
?("acteurs") && ($force || film
.acteurs
.empty
?)
164 /<h4>Avec(.*?)<\/h4
>/ =~ html
165 $1.scan(/\s*<a class="link1" href="\/personne\
/fichepersonne_gen_cpersonne=\d+\.html">(.+?)<\/a
>\s
*/m
){|a
|
166 film
.acteurs
<< Personne
::ajouter(a
[0]) unless a
[0].nil?
170 if take
?("pays") && ($force || film
.pays
.empty
?)
173 /<h4>Film (.*?)\. <\/h4
>/ =~ html
174 $1.split(',').each
{|pays
|
175 film
.pays
<< Pays
::ajouter(pays
.strip
) unless pays
.nil?
179 if take
?("duree") && ($force || film
.duree
== nil)
180 # Duree (capture des heures et des minutes séparement vue que c'est le bordel sur allocine
181 /<h4>Durée :(?:.*?)(\d+)h/ =~ html
182 heure
= $1.nil? ? 0 : $1.to_i
183 /<h4>Durée :(?:.*?)(\d+)min/ =~ html
184 min
= $1.nil? ? 0 : $1.to_i
185 film
.duree
= heure
* 60 + min
188 if take
?("critiquenote") && ($force || film
.critiquePresse
== nil || film
.critiqueSpectateur
== nil)
189 # Critiques presse et spectateur
190 /Presse.*etoile_([012345]).*Spectateurs.*etoile_([012345])"/m
=~ html
191 film
.critiquePresse
= $1 unless $1.nil?
192 film
.critiqueSpectateur
= $2 unless $2.nil?
195 if take
?("genres") && ($force || film
.genres
.empty
?)
198 /<h4>Genre : (.*?)<\/h4
>/ =~ html
199 $1.scan(/<a href="\/film\
/alaffiche_genre_gen_genre=.*?" class="link1">(.+?)<\/a
>/m
){|g
|
200 film
.genres
<< Genre
::ajouter(g
[0]) unless g
[0].nil?
204 if take
?("synopsis") && ($force || film
.synopsis
== nil)
206 /Synopsis.*?<h4>(.*?)<\/h4
>/m
=~ html
209 film
.synopsis
.gsub!
(/<br\s*\/>|<br\s
*>/, "\n")
210 film
.synopsis
.virerBalisesHTML!
214 if take
?("budget") && ($force || film
.budget
== nil)
216 /Budget<\/b
> : (.+
?) millions d
'euros<\/h4>/ =~ html
217 film.budget = $1 unless $1.nil?
224 # on attend que tous les threads de pompage d'image aient terminé
225 @threadImage.join
if defined? @threadImage