ADD Fonction pour ouvrir les détails de tous les films affichées
[pompage.git] / src / modules / allocine.rb
1 require 'net/http'
2 require 'uri'
3 require 'cgi'
4 require 'thread'
5 require 'iconv'
6
7 require "basemodule.rb"
8
9 # un module d'importation pour le site "www.allocine.fr"
10 class Allocine < Basemodule
11
12 def createConnexion
13 @connexion = Net::HTTP::new('www.allocine.fr') if @connexion.nil?
14 end
15
16 # Voir le parent.
17 def rechercherFilm(titre)
18 createConnexion
19
20 donneesHtml = nil
21 begin
22 begin
23 reponse, donneesHtml = @connexion.get("/recherche/?rub=1&motcle=#{CGI::escape(Iconv.iconv("ISO-8859-1", "UTF-8", titre)[0])}")
24 rescue Exception => e
25 p e
26 puts "[!] Connexion lost, retry.."
27 retry
28 end
29
30 #convertit le code latin-1 en UTF8
31 donneesHtml = Iconv.iconv("UTF-8", "ISO-8859-1", donneesHtml)[0]
32
33 #si pas trouvé alors on enlève un mot à la fin
34 if /.*?Pas de résultats.*?/ =~ donneesHtml || ! donneesHtml.include?("<h3><b>Films <h4>")
35 /(.*?)[^ ]+?$/ =~ titre.strip
36 titre = $1
37 titre.strip!
38 else
39 break;
40 end
41 end while not titre.nil? and not titre.empty?
42
43 reponses = {}
44 unless titre.nil? or titre.empty?
45 r = donneesHtml.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}/)
46
47 r.each{|f|
48 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]
49 }
50 end
51 reponses
52 end
53
54 # Voir le parent.
55 def load(id, film)
56 createConnexion
57
58 r, ficheHtml = @connexion.get("/film/fichefilm_gen_cfilm=#{id}.html")
59
60 /<img src="(.*?)" border="0" alt="" class="affichette" \/>/ =~ ficheHtml
61 unless $1.nil?
62 @threadImage = Thread::new($1){|imageUrl|
63 begin
64 imageUrl = URI.parse(imageUrl)
65 connexionImage = Net::HTTP::new(imageUrl.host)
66 r, image = connexionImage.get(imageUrl.path)
67 f = File::new($repBase + "/" + $repAffichette + film.id.to_s + ".jpg", 'w').binmode
68 f.write(image)
69 f.close
70 rescue Exception => e
71 puts e.message
72 puts e.backtrace
73 end
74 }
75 end
76
77 #convertit le code latin-1 en UTF8
78 ficheHtml = Iconv.iconv("UTF-8", "ISO-8859-1", ficheHtml)[0]
79
80 #url
81 film.url = "http://www.allocine.fr/film/fichefilm_gen_cfilm=#{id}.html"
82
83 # Titre
84 /<title>(.*?)<\/title>/ =~ ficheHtml
85 film.titre = $1 unless $1.nil?
86
87 puts "Movie found : #{film.titre} (#{film.fichiers[0]})"
88
89 # Année
90 /<h4>Année de production : (\d+)<\/h4>/ =~ ficheHtml
91 film.annee = $1 unless $1.nil?
92
93 # Réalisateurs
94 /<h4>Réalisé par(.*?)<\/h4>/ =~ ficheHtml
95 $1.scan(/\s*<a class="link1" href=".*?">(.*?)<\/a>\s*/m){|a|
96 film.realisateurs << Personne::ajouter(a[0]) unless a[0].nil?
97 } unless $1.nil?
98
99 # Acteurs
100 /<h4>Avec(.*?)<\/h4>/ =~ ficheHtml
101 $1.scan(/\s*<a class="link1" href="\/personne\/fichepersonne_gen_cpersonne=\d+\.html">(.+?)<\/a>\s*/m){|a|
102 film.acteurs << Personne::ajouter(a[0]) unless a[0].nil?
103 } unless $1.nil?
104
105 # Pays
106 /<h4>Film (.*?)\.&nbsp;<\/h4>/ =~ ficheHtml
107 $1.split(',').each{|pays|
108 film.pays << Pays::ajouter(pays) unless pays.nil?
109 } unless $1.nil?
110
111 # Duree (capture des heures et des minutes séparement vue que c'est le bordel sur allocine
112 /<h4>Durée :(?:.*?)(\d+)h/ =~ ficheHtml
113 heure = $1.nil? ? 0 : $1.to_i
114
115 /<h4>Durée :(?:.*?)(\d+)min/ =~ ficheHtml
116 min = $1.nil? ? 0 : $1.to_i
117
118 film.duree = heure * 60 + min
119
120 # Critiques presse et spectateur
121 /Presse.*etoile_([012345]).*Spectateurs.*etoile_([012345])"/m =~ ficheHtml
122 film.critiquePresse = $1 unless $1.nil?
123 film.critiqueSpectateur = $2 unless $2.nil?
124
125 # Genre
126 /<h4>Genre : (.*?)<\/h4>/ =~ ficheHtml
127 $1.scan(/<a href="\/film\/alaffiche_genre_gen_genre=.*?" class="link1">(.+?)<\/a>/m){|g|
128 film.genres << Genre::ajouter(g[0]) unless g[0].nil?
129 } unless $1.nil?
130
131 # Synopsis
132 /Synopsis.*?<h4>(.*?)<\/h4>/m =~ ficheHtml
133 unless $1.nil?
134 film.synopsis = $1
135 film.synopsis.gsub!(/<br\s*\/>|<br\s*>/, "\n")
136 film.synopsis.virerBalisesHTML!
137 end
138
139 # Budget
140 /Budget<\/b> : (.+?) millions d'euros<\/h4>/ =~ ficheHtml
141 film.budget = $1 unless $1.nil?
142 end
143
144 def finish
145 @threadImage.join if defined? @threadImage
146 end
147 end