X-Git-Url: http://git.euphorik.ch/?a=blobdiff_plain;f=src%2Ffilm.rb;h=21c27cbe33c91fb792d5ea051413e5c7f9ea0108;hb=e34f06962c1450efb1aab6d814540c415466a01c;hp=1eaa33f9ed97f307d68e3098dcd58cbad26602b9;hpb=44c2f215b80fe438522f2daaa0bd33f1a60c619f;p=pompage.git
diff --git a/src/film.rb b/src/film.rb
index 1eaa33f..21c27cb 100644
--- a/src/film.rb
+++ b/src/film.rb
@@ -1,3 +1,5 @@
+# Attention, le but de ce fichier n'est pas d'être le plus clair possible ^-^´´
+
require 'rexml/document'
require 'net/http'
require 'thread'
@@ -10,9 +12,21 @@ require 'personne.rb'
require 'constantes.rb'
+class String
+ def virerBalisesHTML
+ return gsub(/<(.*?)>/, '')
+ end
+ def virerBalisesHTML!
+ gsub!(/<(.*?)>/, '')
+ end
+end
+
class Film
attr_accessor :id, :titre, :fichiers, :annee, :realisateurs, :acteurs, :pays, :duree, :critiquePresse, :critiqueSpectateur, :genres, :synopsis, :budget
+ # repertoire de base, par exemple C:/Divx/
+ @@repBase = ''
+
# Les films indexés par leur titre
@@films = {}
@@ -22,7 +36,6 @@ class Film
# Les films qui ont plusieurs réponses lors de la recherche, traités à la fin
@@filmsPlusieursReponses = []
- @@mutex = Mutex::new
@@threadsWait = ThreadsWait::new
@@nbConn = 0
@@ -38,17 +51,28 @@ class Film
# Lit un repertoire de manière recursive
def Film::litRepertoire(r)
- Film::litRepertoireR(r)
+ @@repBase = r
+ repPrecedant = Dir::getwd
+ Dir::chdir(r)
+
+ Film::litRepertoireR('.')
+
# on attends que les threads se terminent
@@threadsWait.all_waits
# traite les films qui avaient plusieurs réponses lors de la recherche
# l'utilisateur doit faire un choix
+ i = 1
@@filmsPlusieursReponses.each{|f|
+ puts
+ puts "Plop, ya un conflit #{i} / #{@@filmsPlusieursReponses.length} :"
if f.reglerConflitPlusieursReponses
Film::ajouterFilm(f)
end
+ i += 1
}
+
+ Dir::chdir(repPrecedant)
end
# Charge les films contenus dans un fichier XML.
@@ -57,12 +81,15 @@ class Film
if !File.exists?(xmlFile)
return
end
-
+
racine = REXML::Document::new(File::new(xmlFile)).root
racine.each_element{|e|
- id = e.attribute('id').to_s().to_i()
+ id = e.attribute('id').to_s.to_i
- @@idDisponible = id + 1
+ if id > @@idDisponible
+ @@idDisponible = id + 1
+ end
+
titre = e.get_elements('titre')[0].get_text
fichiers = e.get_elements('fichiers')[0].get_elements('fichier')
@@ -129,44 +156,52 @@ class Film
private
def Film::filmsFactory(fichier)
- /^.*?\.(.{3,4})$/ =~ fichier
- if FILMS_EXTENSIONS.include?($1)
- #convertit le code latin-1 en UTF8
- Film::new(fichier.unpack("C*").pack("U*")).loadData
- end
- end
+ Film::new(fichier).loadData
+ end
def Film::litRepertoireR(r)
Dir::foreach(r){|f|
- next if f == '.' or f == '..'
- fichier = r + "/" + f
+ next if f[0,1] == '.'
+ fichier = (r == '.' ? '' : r + "/") + f
if File::directory?(fichier)
litRepertoireR(fichier)
else
-
- #si le film n'existe pas déjà dans la liste
+
+ # vérification de l'extension
+ /^.*?\.(.{3,4})$/ =~ fichier
+ if !FILMS_EXTENSIONS.include?($1)
+ next
+ end
+
+ fichier = CGI::escapeHTML(fichier.unpack("C*").pack("U*"))
+
+ # on skip si le film est déjà a dans la BD
if film = @@filmsFichier[fichier]
- puts "[i] Already exists in DB : #{film.titre} (#{film.fichiers[0]})"
+ puts "[i] Already exists in DB : #{film.titre} (#{fichier})"
next
end
+ #p fichier
+
film = nil
+ if @@nbConn >= NB_CONN_MAX
+ @@threadsWait.next_wait
+ end
+
@@nbConn += 1
@@threadsWait.join_nowait(
- Thread::new{
- begin
- @@mutex.lock if @@nbConn >= NB_CONN_MAX
+ Thread::new{
+ begin
film = Film::filmsFactory(fichier)
unless film.nil? # le film a été correctement construit
Film::ajouterFilm(film)
end
- @@nbConn -= 1
- @@mutex.unlock
rescue Exception => e
puts e.message
puts e.backtrace
- end
+ end
+ @@nbConn -= 1
}
)
end
@@ -187,7 +222,7 @@ private
@@films[film.titre].addFichier(film.fichiers[0])
@@filmsFichier[film.fichiers[0]] = @@films[film.titre]
else
- puts "[!] Duplicate movie : #{film.titre} (#{film.fichier})"
+ puts "[!] Duplicate movie : #{film.titre} (#{film.fichiers[0]})"
end
else
puts "[i] movie added : #{film.titre} (#{film.fichiers[0]})"
@@ -229,13 +264,45 @@ public
# demande à l'utilisateur de faire un choix
# ret : true si le conflit à été résolu sinon false
def reglerConflitPlusieursReponses
- puts "prout"
- return false
+ @aPlusieursReponses = false # pour faire les choses bien
+
+ puts " -> " + @fichiers[0]
+ puts "Fais ton choix jeune padawan (un caractère et pas plus)"
+ tabNoms = @idsAllocine.keys
+ choix = 1
+ loop do
+ i = 1
+ tabNoms.each{|n|
+ puts "#{i}. #{n}"
+ i += 1
+ }
+ puts "A. Passer et l'ajouter"
+ puts "B. Ignorer"
+ choix = STDIN.gets
+
+ if /A/i =~ choix
+ return true
+ elsif /B/i =~ choix
+ return false
+ end
+
+ choix = choix.to_i
+ if choix > 0 && choix <= tabNoms.length
+ break;
+ else
+ puts
+ puts "Choix pas bon !!"
+ end
+ end
+
+ loadDepuisIdAllocine(@idsAllocine[tabNoms[choix-1]])
+
+ return true
end
def addFichier(fichier)
- if (!@fichiers.include?(fichier))
+ if !@fichiers.include?(fichier)
@fichiers << fichier
end
end
@@ -269,7 +336,7 @@ public
donneesHtml = nil
begin
begin
- reponse, donneesHtml = connexionHttp.get("/recherche/?motcle=#{CGI::escape(titre)}")
+ reponse, donneesHtml = connexionHttp.get("/recherche/?motcle=#{CGI::escape(titre.unpack("U*").pack("C*"))}")
rescue Exception => e
p e
puts "[!] Connexion lost, retry.."
@@ -292,12 +359,13 @@ public
unless titre.nil? or titre.empty?
#// =~ donneesHtml
- r = donneesHtml.scan(/(.*?)<\/a>/)
+ #r = donneesHtml.scan(/(.*?)<\/a>/)
+ r = donneesHtml.scan(/(.*?)<\/a>(?:<\/h4> (.*?)<\/h5>){0,1}(?:
<\/h4>){0,1}(?: de (.*?)<\/h4>){0,1}(?: avec (.*?)<\/h4>){0,1}(?: \((.*?)\)<\/h4>){0,1}/)
if r.length > 1
@aPlusieursReponses = true
r.each{|f|
- @idsAllocine[f[1].gsub(/<(.*?)>/, '')] = f[0]
+ @idsAllocine[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]
}
elsif r.length == 1
loadDepuisIdAllocine(r[0][0], connexionHttp)
@@ -309,7 +377,11 @@ public
end
private
- def loadDepuisIdAllocine(id, connexionHttp)
+ def loadDepuisIdAllocine(id, connexionHttp = nil)
+ if (connexionHttp == nil)
+ connexionHttp = Net::HTTP::new('www.allocine.fr')
+ end
+
r, ficheHtml = connexionHttp.get("/film/fichefilm_gen_cfilm=#{id}.html")
#convertit le code latin-1 en UTF8
@@ -322,11 +394,11 @@ private
/(.*?)<\/title>/ =~ ficheHtml
@titre = $1 unless $1.nil?
- puts "Movie found : #{@titre} (#{@fichier})"
+ puts "Movie found : #{@titre} (#{@fichiers[0]})"
# Année
/Année de production : (\d+)<\/h4>/ =~ ficheHtml
- @annee = $1.to_i unless $1.nil?
+ @annee = $1 unless $1.nil?
# Réalisateurs
/Réalisé par(.*?)<\/h4>/ =~ ficheHtml
@@ -340,21 +412,25 @@ private
@acteurs << Personne::ajouter(a[0]) unless a[0].nil?
} unless $1.nil?
-
# Pays
/Film (.*?)\. <\/h4>/ =~ ficheHtml
$1.split(',').each{|pays|
@pays << Pays::ajouter(pays) unless pays.nil?
} unless $1.nil?
- # Duree
- /Durée : (\d+)h (\d+)min./ =~ ficheHtml
- @duree = $1.nil? ? $2.to_i : $1.to_i * 60 + $2.to_i
+ # Duree (capture des heures et des minutes séparement vue que c'est le bordel sur allocine
+ /Durée :(?:.*?)(\d+)h/ =~ ficheHtml
+ heure = $1.nil? ? 0 : $1.to_i
+
+ /Durée :(?:.*?)(\d+)min/ =~ ficheHtml
+ min = $1.nil? ? 0 : $1.to_i
+
+ @duree = heure * 60 + min
# Critiques presse et spectateur
/Presse.*etoile_([012345]).*Spectateurs.*etoile_([012345])"/m =~ ficheHtml
- @critiquePresse = $1.to_i unless $1.nil?
- @critiqueSpectateur = $2.to_i unless $2.nil?
+ @critiquePresse = $1 unless $1.nil?
+ @critiqueSpectateur = $2 unless $2.nil?
# Genre
/Genre : (.*?)<\/h4>/ =~ ficheHtml
@@ -363,12 +439,14 @@ private
} unless $1.nil?
# Synopsis
- /Synopsis.*?(.+?)<\/h4>/m =~ ficheHtml
+ /Synopsis.*?(.*?)<\/h4>/m =~ ficheHtml
@synopsis = $1 unless $1.nil?
+ @synopsis.gsub!(/
|
/, "\n")
+ @synopsis.virerBalisesHTML!
# Budget
/Budget<\/b> : (.+?) millions d'euros<\/h4>/ =~ ficheHtml
- @budget = $1.to_i unless $1.nil?
+ @budget = $1 unless $1.nil?
end
public
@@ -386,7 +464,7 @@ public
racine.add(fichiers)
racine.add(REXML::Element::new('titre').add_text(@titre))
- racine.add(REXML::Element::new('annee').add_text(@annee.to_s))
+ racine.add(REXML::Element::new('annee').add_text(@annee))
realisateurs = REXML::Element::new('realisateurs')
@realisateurs.each{|r|
@@ -408,8 +486,8 @@ public
racine.add(REXML::Element::new('duree').add_text(@duree.to_s))
- racine.add(REXML::Element::new('critiquePresse').add_text(@critiquePresse.to_s))
- racine.add(REXML::Element::new('critiqueSpectateur').add_text(@critiqueSpectateur.to_s))
+ racine.add(REXML::Element::new('critiquePresse').add_text(@critiquePresse))
+ racine.add(REXML::Element::new('critiqueSpectateur').add_text(@critiqueSpectateur))
genres = REXML::Element::new('genres')
@genres.each{|g|
@@ -417,9 +495,15 @@ public
}
racine.add(genres)
- racine.add(REXML::Element::new('synopsis').add_text(@synopsis))
+ synopsisElement = REXML::Element::new('synopsis')
+ @synopsis.split("\n").each{|s|
+ next if s =~ /^\s*$/
+ synopsisElement.add(REXML::Element::new('p').add_text(s))
+ }
+ racine.add(synopsisElement)
+
budgetElement = REXML::Element::new('budget')
- budgetElement.add_text(@budget.to_s)
+ budgetElement.add_text(@budget)
budgetElement.add_attribute('unite', @budgetUnite)
racine.add(budgetElement)