git-svn-id: svn://euphorik.ch/pompage@45 02bbb61a-6d21-0410-aba0-cb053bdfd66a
[pompage.git] / src / modules / allocine.rb
1 # coding: utf-8
2
3 require 'net/http'
4 require 'uri'
5 require 'cgi'
6 require 'thread'
7 require 'iconv'
8
9 require "basemodule.rb"
10
11 # doc : http://www.ruby-doc.org/stdlib/libdoc/net/http/rdoc/index.html
12 Net::HTTP.version_1_2
13
14 # hack : http://arosien.blogspot.com/2007/06/increasing-rubys-netbufferedio-buffer.html
15 module Net
16 class BufferedIO
17 def rbuf_fill
18 timeout(@read_timeout) { @rbuf << @io.sysread(32768) }
19 end
20 end
21 end
22
23
24 # un module d'importation pour le site "www.allocine.fr"
25 class Allocine < Basemodule
26
27 def createConnexion
28 @connexion = Net::HTTP::new('www.allocine.fr').start if @connexion == nil || !@connexion.started?
29 end
30
31 def fermerConnexion
32 @connexion.finish if defined? @connexion && @connexion.started? # on admet qu'après un load on a plus besoin de la connexion
33 @connexion = nil
34 end
35
36 # voir le parent.
37 def rechercherFilm(titre)
38 createConnexion
39
40 begin
41 reponse = nil
42 begin
43 reponse = @connexion.get("/recherche/?rub=1&motcle=#{CGI::escape(Iconv.iconv("ISO-8859-1", "UTF-8", titre)[0])}")
44 rescue Exception => e
45 p e
46 puts "[!] Erreur lors de la recherche du titre #{titre}, retry.."
47 fermerConnexion
48 createConnexion
49 retry
50 end
51
52 # convertit le code latin-1 en UTF8
53 html = Iconv.iconv("UTF-8", "ISO-8859-1", reponse.body)[0]
54
55 # si pas trouvé alors on enlève un mot à la fin
56 if /.*?Pas de résultats.*?/ =~ html || ! html.include?("<h3><b>Films <h4>")
57 /(.*?)[^ ]+?$/ =~ titre.strip
58 titre = $1
59 titre.strip!
60 else
61 break;
62 end
63 end while not titre.nil? and not titre.empty?
64
65 reponses = {}
66 unless titre.nil? or titre.empty?
67 r = html.scan(/<a href="\/film\/fichefilm_gen_cfilm=(\d+)\.html" class="link1">(.*?)<\/a>(?:<\/h4><h5 style="color: #666666">&nbsp;(.*?)<\/h5>){0,1}(?:<h4><br \/><\/h4>){0,1}(?:<h4 style="color: #666666"> de (.*?)<\/h4>){0,1}(?:<h4 style="color: #666666">&nbsp;avec (.*?)<\/h4>){0,1}(?:<h4 style="color: #666666">&nbsp;\((.*?)\)<\/h4>){0,1}/)
68
69 r.each{|f|
70 reponses[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]
71 }
72 end
73 reponses
74 end
75
76 # Voir le parent.
77 def load(id, film)
78 createConnexion
79
80 html = nil
81 begin
82 html = @connexion.get("/film/fichefilm_gen_cfilm=#{id}.html").body
83 rescue Exception => e
84 p e
85 puts "[!] Erreur lors du chargement de #{film.fichiers[0]}, retry.."
86 fermerConnexion
87 createConnexion
88 retry
89 end
90
91 /<img src="(.*?)" border="0" alt="" class="affichette" \/>/ =~ html
92 unless $1.nil?
93 @threadImage = Thread::start($1){|imageUrl|
94 begin
95 imageUrl = URI.parse(imageUrl)
96 connexionImage = Net::HTTP::new(imageUrl.host).start
97 image = connexionImage.get(imageUrl.path).body
98 f = File::new($repBase + "/" + $repAffichette + film.id.to_s + ".jpg", 'w').binmode
99 f.write(image)
100 f.close
101 connexionImage.finish
102 rescue Exception => e
103 puts e.message
104 puts e.backtrace
105 puts "[!] Erreur lors du chargement de l'image #{imageUrl}, retry.."
106 retry
107 end
108 }
109 end
110
111 #convertit le code latin-1 en UTF8
112 html = Iconv.iconv("UTF-8", "ISO-8859-1", html)[0]
113 #url
114 film.url = "http://www.allocine.fr/film/fichefilm_gen_cfilm=#{id}.html"
115
116 # Titre
117 /<title>(.*?)<\/title>/ =~ html
118 film.titre = $1 unless $1.nil?
119
120 puts "Movie found : #{film.titre} (#{film.fichiers[0]})"
121
122 # Année
123 /<h4>Année de production : (\d+)<\/h4>/ =~ html
124 film.annee = $1 unless $1.nil?
125
126 # Réalisateurs
127 /<h4>Réalisé par(.*?)<\/h4>/ =~ html
128 $1.scan(/\s*<a class="link1" href=".*?">(.*?)<\/a>\s*/m){|a|
129 film.realisateurs << Personne::ajouter(a[0]) unless a[0].nil?
130 } unless $1.nil?
131
132 # Acteurs
133 /<h4>Avec(.*?)<\/h4>/ =~ html
134 $1.scan(/\s*<a class="link1" href="\/personne\/fichepersonne_gen_cpersonne=\d+\.html">(.+?)<\/a>\s*/m){|a|
135 film.acteurs << Personne::ajouter(a[0]) unless a[0].nil?
136 } unless $1.nil?
137
138 # Pays
139 /<h4>Film (.*?)\.&nbsp;<\/h4>/ =~ html
140 $1.split(',').each{|pays|
141 film.pays << Pays::ajouter(pays) unless pays.nil?
142 } unless $1.nil?
143
144 # Duree (capture des heures et des minutes séparement vue que c'est le bordel sur allocine
145 /<h4>Durée :(?:.*?)(\d+)h/ =~ html
146 heure = $1.nil? ? 0 : $1.to_i
147
148 /<h4>Durée :(?:.*?)(\d+)min/ =~ html
149 min = $1.nil? ? 0 : $1.to_i
150
151 film.duree = heure * 60 + min
152
153 # Critiques presse et spectateur
154 /Presse.*etoile_([012345]).*Spectateurs.*etoile_([012345])"/m =~ html
155 film.critiquePresse = $1 unless $1.nil?
156 film.critiqueSpectateur = $2 unless $2.nil?
157
158 # Genre
159 /<h4>Genre : (.*?)<\/h4>/ =~ html
160 $1.scan(/<a href="\/film\/alaffiche_genre_gen_genre=.*?" class="link1">(.+?)<\/a>/m){|g|
161 film.genres << Genre::ajouter(g[0]) unless g[0].nil?
162 } unless $1.nil?
163
164 # Synopsis
165 /Synopsis.*?<h4>(.*?)<\/h4>/m =~ html
166 unless $1.nil?
167 film.synopsis = $1
168 film.synopsis.gsub!(/<br\s*\/>|<br\s*>/, "\n")
169 film.synopsis.virerBalisesHTML!
170 end
171
172 # Budget
173 /Budget<\/b> : (.+?) millions d'euros<\/h4>/ =~ html
174 film.budget = $1 unless $1.nil?
175
176 fermerConnexion
177 end
178
179 def finish
180 @threadImage.join if defined? @threadImage
181 end
182 end