X-Git-Url: http://git.euphorik.ch/?p=pompage.git;a=blobdiff_plain;f=src%2Fmodules%2Fallocine.rb;fp=src%2Fmodules%2Fallocine.rb;h=3883c3b8d4319640aca9e72c88e95479d0067ce7;hp=1a28000f705b5de3bfeb01e8a6686d309e4f0b3e;hb=29dd69679e2fa7c1b9d5a28265ad03aeac0f13b9;hpb=aaba068e2c52c67ba79edb55b4332bea66fda75f diff --git a/src/modules/allocine.rb b/src/modules/allocine.rb index 1a28000..3883c3b 100644 --- a/src/modules/allocine.rb +++ b/src/modules/allocine.rb @@ -1,227 +1,228 @@ -# coding: utf-8 - -require 'net/http' -require 'uri' -require 'cgi' -require 'thread' -require 'iconv' - -require "basemodule.rb" - -# 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 - - 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) - createConnexion - - begin - reponse = nil - begin - reponse = @connexion.get("/recherche/?rub=1&motcle=#{CGI::escape(Iconv.iconv("ISO-8859-1", "UTF-8", titre)[0])}") - rescue Exception => e - p e - 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] - - # 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! - else - break; - end - end while not titre.nil? and not titre.empty? - - reponses = {} - unless titre.nil? or titre.empty? - r = html.scan(/

(.*?)<\/a><\/h4>(?:
 (.*?)<\/a><\/h5>)?(?:(\d*?){4}<\/h4><\/div>)?(?:de (.*?)<\/h5><\/div>)?(?:avec (.*?)<\/h5><\/div>)?/) +# coding: utf-8 + +require 'net/http' +require 'uri' +require 'cgi' +require 'thread' +require 'iconv' + +require "basemodule.rb" + +# 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 + + 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) + createConnexion + + begin + reponse = nil + begin + reponse = @connexion.get("/recherche/?rub=1&motcle=#{CGI::escape(Iconv.iconv("ISO-8859-1", "UTF-8", titre)[0])}") + #reponse = @connexion.get("/recherche/?rub=1&motcle=#{CGI::escape(titre)}") + rescue Exception => e + p e + 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] + + # 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! + else + break; + end + end while not titre.nil? and not titre.empty? + + reponses = {} + unless titre.nil? or titre.empty? + r = html.scan(/

(.*?)<\/a><\/h4>(?:
 (.*?)<\/a><\/h5>)?(?:(\d*?){4}<\/h4><\/div>)?(?:de (.*?)<\/h5><\/div>)?(?:avec (.*?)<\/h5><\/div>)?/) # f[0] : l'id allocine du film # f[1] : nom # f[2] : nom original # f[3] : année # f[4] : réalisateur - # f[5] : acteurs - r.each{|f| - 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] - } - end - reponses - end - - # Voir le parent. - def load(id, film) - loadPath("/film/fichefilm_gen_cfilm=#{id}.html", film) - end - - # Voir le parent. - def loadURL(url, film) - loadPath(URI.parse(url).path, film) - end - - def loadPath(path, film) - createConnexion - - html = nil - begin - html = @connexion.get(path).body - rescue Exception => e - p e - puts "[!] Erreur lors du chargement de #{film.fichiers[0]}, retry.." - fermerConnexion - createConnexion - retry - end - - puts "Pompage de #{film.titre} (#{film.fichiers[0]}) ..." - - # convertit le code latin-1 en UTF8 - html = Iconv.iconv("UTF-8", "ISO-8859-1", html)[0] - - # pompage de l'image dans un thread séparé - if take?("image") && ($force || !film.possedeImage?) - // =~ html - unless $1.nil? - @threadImage = Thread::start($1){|imageUrl| - nbRetry = 0 - begin - imageUrlParsed = URI.parse(imageUrl) - connexionImage = Net::HTTP::new(imageUrlParsed.host).start - film.setImage(connexionImage.get(imageUrlParsed.path).body) - 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 - end - - if take?("url") && ($force || film.url == nil) - #url - film.url = "http://www.allocine.fr" + path - end - - if take?("titre") - # Titre - /(.*?)<\/title>/ =~ html - film.titre = $1 - end - - if take?("annee") && ($force || film.annee == nil) - # Année - /<h4>Année de production : (\d+)<\/h4>/ =~ html - film.annee = $1 unless $1.nil? - end - - if take?("realisateurs") && ($force || film.realisateurs.empty?) - # Réalisateurs - film.realisateurs.clear - /<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? - end - - if take?("acteurs") && ($force || film.acteurs.empty?) - # Acteurs - film.acteurs.clear - /<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? - end - - if take?("pays") && ($force || film.pays.empty?) - # Pays - film.pays.clear - /<h4>Film (.*?)\. <\/h4>/ =~ html - $1.split(',').each{|pays| - film.pays << Pays::ajouter(pays.strip) unless pays.nil? - } unless $1.nil? - end - - if take?("duree") && ($force || film.duree == nil) - # Duree (capture des heures et des minutes séparement vue que c'est le bordel sur allocine - /<h4>Durée :(?:.*?)(\d+)h/ =~ html - heure = $1.nil? ? 0 : $1.to_i - /<h4>Durée :(?:.*?)(\d+)min/ =~ html - min = $1.nil? ? 0 : $1.to_i - film.duree = heure * 60 + min - end - - if take?("critiquenote") && ($force || film.critiquePresse == nil || film.critiqueSpectateur == nil) - # Critiques presse et spectateur - /Presse.*etoile_([012345]).*Spectateurs.*etoile_([012345])"/m =~ html - film.critiquePresse = $1 unless $1.nil? - film.critiqueSpectateur = $2 unless $2.nil? - end - - if take?("genres") && ($force || film.genres.empty?) - # Genre - film.genres.clear - /<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? - end - - if take?("synopsis") && ($force || film.synopsis == nil) - # Synopsis - /Synopsis.*?<h4>(.*?)<\/h4>/m =~ html - unless $1.nil? - film.synopsis = $1 - film.synopsis.gsub!(/<br\s*\/>|<br\s*>/, "\n") - film.synopsis.virerBalisesHTML! - end - end - - if take?("budget") && ($force || film.budget == nil) - # Budget - /Budget<\/b> : (.+?) millions d'euros<\/h4>/ =~ html - film.budget = $1 unless $1.nil? - end - - fermerConnexion - end - - def finish - # on attend que tous les threads de pompage d'image aient terminé - @threadImage.join if defined? @threadImage - end -end \ No newline at end of file + # f[5] : acteurs + r.each{|f| + 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] + } + end + reponses + end + + # Voir le parent. + def load(id, film) + loadPath("/film/fichefilm_gen_cfilm=#{id}.html", film) + end + + # Voir le parent. + def loadURL(url, film) + loadPath(URI.parse(url).path, film) + end + + def loadPath(path, film) + createConnexion + + html = nil + begin + html = @connexion.get(path).body + rescue Exception => e + p e + puts "[!] Erreur lors du chargement de #{film.fichiers[0]}, retry.." + fermerConnexion + createConnexion + retry + end + + puts "Pompage de #{film.titre} (#{film.fichiers[0]}) ..." + + # convertit le code latin-1 en UTF8 + html = Iconv.iconv("UTF-8", "ISO-8859-1", html)[0] + + # pompage de l'image dans un thread séparé + if take?("image") && ($force || !film.possedeImage?) + /<img src="(.*?)" border="0" alt="" class="affichette" \/>/ =~ html + unless $1.nil? + @threadImage = Thread::start($1){|imageUrl| + nbRetry = 0 + begin + imageUrlParsed = URI.parse(imageUrl) + connexionImage = Net::HTTP::new(imageUrlParsed.host).start + film.setImage(connexionImage.get(imageUrlParsed.path).body) + 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 + end + + if take?("url") && ($force || film.url == nil) + #url + film.url = "http://www.allocine.fr" + path + end + + if take?("titre") + # Titre + /<title>(.*?)<\/title>/ =~ html + film.titre = $1 + end + + if take?("annee") && ($force || film.annee == nil) + # Année + /<h4>Année de production : (\d+)<\/h4>/ =~ html + film.annee = $1 unless $1.nil? + end + + if take?("realisateurs") && ($force || film.realisateurs.empty?) + # Réalisateurs + film.realisateurs.clear + /<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? + end + + if take?("acteurs") && ($force || film.acteurs.empty?) + # Acteurs + film.acteurs.clear + /<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? + end + + if take?("pays") && ($force || film.pays.empty?) + # Pays + film.pays.clear + /<h4>Film (.*?)\. <\/h4>/ =~ html + $1.split(',').each{|pays| + film.pays << Pays::ajouter(pays.strip) unless pays.nil? + } unless $1.nil? + end + + if take?("duree") && ($force || film.duree == nil) + # Duree (capture des heures et des minutes séparement vue que c'est le bordel sur allocine + /<h4>Durée :(?:.*?)(\d+)h/ =~ html + heure = $1.nil? ? 0 : $1.to_i + /<h4>Durée :(?:.*?)(\d+)min/ =~ html + min = $1.nil? ? 0 : $1.to_i + film.duree = heure * 60 + min + end + + if take?("critiquenote") && ($force || film.critiquePresse == nil || film.critiqueSpectateur == nil) + # Critiques presse et spectateur + /Presse.*etoile_([012345]).*Spectateurs.*etoile_([012345])"/m =~ html + film.critiquePresse = $1 unless $1.nil? + film.critiqueSpectateur = $2 unless $2.nil? + end + + if take?("genres") && ($force || film.genres.empty?) + # Genre + film.genres.clear + /<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? + end + + if take?("synopsis") && ($force || film.synopsis == nil) + # Synopsis + /Synopsis.*?<h4>(.*?)<\/h4>/m =~ html + unless $1.nil? + film.synopsis = $1 + film.synopsis.gsub!(/<br\s*\/>|<br\s*>/, "\n") + film.synopsis.virerBalisesHTML! + end + end + + if take?("budget") && ($force || film.budget == nil) + # Budget + /Budget<\/b> : (.+?) millions d'euros<\/h4>/ =~ html + film.budget = $1 unless $1.nil? + end + + fermerConnexion + end + + def finish + # on attend que tous les threads de pompage d'image aient terminé + @threadImage.join if defined? @threadImage + end +end