X-Git-Url: http://git.euphorik.ch/?a=blobdiff_plain;f=src%2Fmodules%2Fallocine.rb;h=23a26b890ba26ba735f6ecfc7e50fb44f51182cb;hb=28e1ecf7c5b45d5deeb87d488f32d44e0ea2fd11;hp=bdbfa1c74482fce07040671725da1673b0e57f07;hpb=f2d0f55dc2e3dc77561c26703e382b1917498242;p=pompage.git diff --git a/src/modules/allocine.rb b/src/modules/allocine.rb index bdbfa1c..23a26b8 100644 --- a/src/modules/allocine.rb +++ b/src/modules/allocine.rb @@ -1,33 +1,64 @@ +# coding: utf-8 + require 'net/http' +require 'uri' require 'cgi' require 'thread' require 'iconv' require "basemodule.rb" -# un mixin pour allocine +# doc : http://www.ruby-doc.org/stdlib/libdoc/net/http/rdoc/index.html +Net::HTTP.version_1_2 + +# hack : http://arosien.blogspot.com/2007/06/increasing-rubys-netbufferedio-buffer.html +module Net + class BufferedIO + def rbuf_fill + timeout(@read_timeout) { @rbuf << @io.sysread(32768) } + end + end +end + + +# un module d'importation pour le site "www.allocine.fr" class Allocine < Basemodule - # Voir le parent. + def createConnexion + begin + @connexion = Net::HTTP::new('www.allocine.fr').start if @connexion == nil || !@connexion.started? + rescue + Puts "Impossible de se connecter à Allocine. Retry.." + retry + end + end + + def fermerConnexion + @connexion.finish if defined? @connexion && @connexion.started? # on admet qu'après un load on a plus besoin de la connexion + @connexion = nil + end + + # voir le parent. def rechercherFilm(titre) - Thread.current["connexion"] = Net::HTTP::new('www.allocine.fr') if Thread.current["connexion"].nil? - connexion = Thread.current["connexion"] + createConnexion - donneesHtml = nil begin + reponse = nil begin - reponse, donneesHtml = connexion.get("/recherche/?motcle=#{CGI::escape(Iconv.iconv("ISO-8859-1", "UTF-8", titre)[0])}") + reponse = @connexion.get("/recherche/?rub=1&motcle=#{CGI::escape(Iconv.iconv("ISO-8859-1", "UTF-8", titre)[0])}") rescue Exception => e p e - puts "[!] Connexion lost, retry.." + puts "[!] Erreur lors de la recherche du titre #{titre}, retry.." + fermerConnexion + createConnexion retry end + + # convertit le code latin-1 en UTF8 + html = Iconv.iconv("UTF-8", "ISO-8859-1", reponse.body)[0] - #convertit le code latin-1 en UTF8 - donneesHtml = Iconv.iconv("UTF-8", "ISO-8859-1", donneesHtml)[0] - - #si pas trouvé alors on enlève un mot à la fin - if /.*?Pas de résultats.*?/ =~ donneesHtml || ! donneesHtml.include?("

Films

") + # si pas trouvé alors on enlève un mot à la fin + if /.*?Pas de résultats.*?/ =~ html || ! html.include?("

Films

") /(.*?)[^ ]+?$/ =~ titre.strip titre = $1 titre.strip! @@ -38,9 +69,8 @@ class Allocine < Basemodule reponses = {} unless titre.nil? or titre.empty? - - r = donneesHtml.scan(/(.*?)<\/a>(?:<\/h4>
 (.*?)<\/h5>){0,1}(?:


<\/h4>){0,1}(?:

de (.*?)<\/h4>){0,1}(?:

 avec (.*?)<\/h4>){0,1}(?:

 \((.*?)\)<\/h4>){0,1}/) - + r = html.scan(/(.*?)<\/a>(?:<\/h4>
 (.*?)<\/h5>){0,1}(?:


<\/h4>){0,1}(?:

de (.*?)<\/h4>){0,1}(?:

 avec (.*?)<\/h4>){0,1}(?:

 \((.*?)\)<\/h4>){0,1}/) + r.each{|f| 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,68 +79,96 @@ class Allocine < Basemodule end # Voir le parent. - def load(id, film) - Thread.current["connexion"] = Net::HTTP::new('www.allocine.fr') if Thread.current["connexion"].nil? - connexion = Thread.current["connexion"] + def load(id, film) + createConnexion + + html = nil + begin + html = @connexion.get("/film/fichefilm_gen_cfilm=#{id}.html").body + rescue Exception => e + p e + puts "[!] Erreur lors du chargement de #{film.fichiers[0]}, retry.." + fermerConnexion + createConnexion + retry + end - r, ficheHtml = connexion.get("/film/fichefilm_gen_cfilm=#{id}.html") - - #convertit le code latin-1 en UTF8 - ficheHtml = Iconv.iconv("UTF-8", "ISO-8859-1", ficheHtml)[0] + // =~ html + unless $1.nil? + @threadImage = Thread::start($1){|imageUrl| + nbRetry = 0 + begin + imageUrlParsed = URI.parse(imageUrl) + connexionImage = Net::HTTP::new(imageUrlParsed.host).start + image = connexionImage.get(imageUrlParsed.path).body + f = File::new($repBase + "/" + $repAffichette + film.id.to_s + ".jpg", 'w').binmode + f.write(image) + f.close + connexionImage.finish + rescue Exception => e + puts e.message + puts e.backtrace + puts "[!] Erreur lors du chargement de l'image '#{imageUrl}', retry.." + retry if (nbRetry += 1) < 5 + end + } + end + #convertit le code latin-1 en UTF8 + html = Iconv.iconv("UTF-8", "ISO-8859-1", html)[0] #url film.url = "http://www.allocine.fr/film/fichefilm_gen_cfilm=#{id}.html" # Titre - /(.*?)<\/title>/ =~ ficheHtml + /<title>(.*?)<\/title>/ =~ html film.titre = $1 unless $1.nil? puts "Movie found : #{film.titre} (#{film.fichiers[0]})" # Année - /<h4>Année de production : (\d+)<\/h4>/ =~ ficheHtml + /<h4>Année de production : (\d+)<\/h4>/ =~ html film.annee = $1 unless $1.nil? # Réalisateurs - /<h4>Réalisé par(.*?)<\/h4>/ =~ ficheHtml + /<h4>Réalisé par(.*?)<\/h4>/ =~ html $1.scan(/\s*<a class="link1" href=".*?">(.*?)<\/a>\s*/m){|a| film.realisateurs << Personne::ajouter(a[0]) unless a[0].nil? } unless $1.nil? # Acteurs - /<h4>Avec(.*?)<\/h4>/ =~ ficheHtml + /<h4>Avec(.*?)<\/h4>/ =~ html $1.scan(/\s*<a class="link1" href="\/personne\/fichepersonne_gen_cpersonne=\d+\.html">(.+?)<\/a>\s*/m){|a| film.acteurs << Personne::ajouter(a[0]) unless a[0].nil? } unless $1.nil? # Pays - /<h4>Film (.*?)\. <\/h4>/ =~ ficheHtml + /<h4>Film (.*?)\. <\/h4>/ =~ html $1.split(',').each{|pays| film.pays << Pays::ajouter(pays) unless pays.nil? } unless $1.nil? # Duree (capture des heures et des minutes séparement vue que c'est le bordel sur allocine - /<h4>Durée :(?:.*?)(\d+)h/ =~ ficheHtml + /<h4>Durée :(?:.*?)(\d+)h/ =~ html heure = $1.nil? ? 0 : $1.to_i - /<h4>Durée :(?:.*?)(\d+)min/ =~ ficheHtml + /<h4>Durée :(?:.*?)(\d+)min/ =~ html min = $1.nil? ? 0 : $1.to_i film.duree = heure * 60 + min # Critiques presse et spectateur - /Presse.*etoile_([012345]).*Spectateurs.*etoile_([012345])"/m =~ ficheHtml + /Presse.*etoile_([012345]).*Spectateurs.*etoile_([012345])"/m =~ html film.critiquePresse = $1 unless $1.nil? film.critiqueSpectateur = $2 unless $2.nil? # Genre - /<h4>Genre : (.*?)<\/h4>/ =~ ficheHtml + /<h4>Genre : (.*?)<\/h4>/ =~ html $1.scan(/<a href="\/film\/alaffiche_genre_gen_genre=.*?" class="link1">(.+?)<\/a>/m){|g| film.genres << Genre::ajouter(g[0]) unless g[0].nil? } unless $1.nil? # Synopsis - /Synopsis.*?<h4>(.*?)<\/h4>/m =~ ficheHtml + /Synopsis.*?<h4>(.*?)<\/h4>/m =~ html unless $1.nil? film.synopsis = $1 film.synopsis.gsub!(/<br\s*\/>|<br\s*>/, "\n") @@ -118,7 +176,13 @@ class Allocine < Basemodule end # Budget - /Budget<\/b> : (.+?) millions d'euros<\/h4>/ =~ ficheHtml + /Budget<\/b> : (.+?) millions d'euros<\/h4>/ =~ html film.budget = $1 unless $1.nil? + + fermerConnexion end + + def finish + @threadImage.join if defined? @threadImage + end end \ No newline at end of file