1 require 'rexml/document'
7 # G.Burri fait à l'arrache d'après : 'www.la-rache.com'
10 FILMS_EXTENSIONS
= ['avi', 'mkv', 'rmvb', 'ogm', 'divx']
11 FICHIER_PATTERN
= "<title> [<codec>] [<lang-audio>] [<lang-st>] [<team>]" # la structure d'un fichier
12 LOAD_DATA
= true # charge les informations depuis le web ?
14 #le nombre de connexions simultanés sur le site de films
29 class Personne
< Objet
34 #ajoute une personne et la retourne
35 def Personne
::ajouter(nom
)
36 if nil == personne
= @
@personnes[nom
]
37 personne
= Personne
::new(nom
)
38 @
@personnes[nom
] = personne
57 #ajoute un genre et le retourne
58 def Genre
::ajouter(nom
)
59 if nil == genre
= @
@genres[nom
]
60 genre
= Genre
::new(nom
)
80 #ajoute un pays et le retourne
81 def Pays
::ajouter(nom
)
82 if nil == pays
= @
@pays[nom
]
99 attr_accessor
:titre, :fichier, :annee, :realisateurs, :acteurs, :pays, :duree, :critiquePresse, :critiqueSpectateur, :genres, :synopsis, :budget
101 # les films indexés par leur titre
103 #les films indexés par leur nom de fichier
107 @
@threadsWait = ThreadsWait
::new
110 def Film
::litRepertoire(r
)
111 Film
::litRepertoireR(r
)
112 #on attends que les threads se terminent
113 @
@threadsWait.all_waits
116 # Charge les films contenus dans un fichier XML.
117 def Film
::loadFilmsXml(xmlFile
)
118 racine
= REXML
::Document::new(File
::new(xmlFile
)).root
119 racine
.each_element
{|e
|
120 fichier
= e
.get_elements('fichier')[0].get_text
121 next if fichier
== nil
122 titre
= e
.get_elements('titre')[0].get_text
123 annee
= e
.get_elements('annee')[0].get_text
124 duree
= e
.get_elements('duree')[0].get_text
125 critiquePresse
= e
.get_elements('critiquePresse')[0].get_text
126 critiqueSpectateur
= e
.get_elements('critiqueSpectateur')[0].get_text
127 synopsis
= e
.get_elements('synopsis')[0].get_text
128 budget
= e
.get_elements('budget')[0].get_text
129 realisateurs
= e
.get_elements('realisateur')
130 acteurs
= e
.get_elements('acteur')
131 pays
= e
.get_elements('pays')
132 genres
= e
.get_elements('genres')
135 film
= Film
::new(fichier
.value
)
136 film
.titre
= titre
.value
unless titre
.nil?
137 film
.annee
= annee
.value
unless annee
.nil?
138 realisateurs
.each
{|e
|
139 film
.realisateurs
<< Personne
::ajouter(e
.get_text
.value
)
142 film
.acteurs
<< Personne
::ajouter(e
.get_text
.value
)
145 film
.pays
<< Pays
::ajouter(e
.get_text
.value
)
147 film
.duree
= duree
.value
unless duree
.nil?
148 film
.critiquePresse
= critiquePresse
.value
unless critiquePresse
.nil?
149 film
.critiqueSpectateur
= critiqueSpectateur
.value
unless critiqueSpectateur
.nil?
151 film
.genres
<< Genre
::ajouter(e
.get_text
.value
)
153 film
.synopsis
= synopsis
.value
unless synopsis
.nil?
154 film
.budget
= budget
.value
unless budget
.nil?
155 @
@films[film
.titre
] = film
156 @
@filmsFichier[film
.fichier
] = film
160 # Renvoie tous les films sous la forme d'un élement XML.
161 def Film
::getFilmsXml
162 racine
= REXML
::Element::new('filmographie')
163 @
@films.each
{|nom
, f
|
166 return REXML
::Document::new.add(racine
)
170 def Film
::litRepertoireR(r
)
172 next if f
== '.' or f
== '..'
173 fichier
= r +
"/" + f
174 if File
::directory?(fichier
)
175 litRepertoireR(fichier
)
178 #si le film n'existe pas déjà dans la liste
179 if film
= @
@filmsFichier[fichier
]
180 puts
"[i] Already exists in DB : #{film.titre} (#{film.fichier})"
186 @
@threadsWait.join_nowait(
189 @
@mutex.lock
if @
@nbConn >= NB_CONN_MAX
191 film
= Film
::filmsFactory(fichier
)
193 if @
@films.has_key
?(film
.titre
)
194 puts
"[!] Duplicate movie
: #{film.titre} (#{film.fichier})"
196 puts "[i
] movie added
: #{film.titre} (#{film.fichier})"
197 @@films[film.titre] = film
198 @@filmsFichier[film.fichier] = film
204 rescue Exception => e
214 def Film::filmsFactory(fichier)
215 /^.*?\.(.{3,4})$/ =~ fichier
216 if FILMS_EXTENSIONS.include?($1)
217 Film::new(fichier).loadData
223 def initialize(fichier)
231 @critiquePresse = nil
232 @critiqueSpectateur = nil
236 @budgetUnite = 'euro'
239 #charge les informations du films à partir d'allocine
246 connexionHttp = Net::HTTP::new('www.allocine.fr');
248 #extrait le nom à partire du nom du fichier
249 /^.*?([^\/]*?)\.(.{3,4})$/ =~ @fichier
250 #remplace undescores et points par des espaces
251 titre = $1.gsub(/[_\.]/, ' ')
252 #vire les espaces au début et à la fin
254 #remplace les suites d'espaces par un seul
255 titre
.gsub!
(/ {2,}/,' ')
256 titre
.gsub!
(/\[.*?\]/,'')
257 titre
.gsub!
(/\(.*?\)/,'')
262 reponse
, donneesHtml
= connexionHttp
.get("/recherche/?motcle=#{CGI::escape(titre)}")
263 #si pas trouvé alors on enlève un mot à la fin
264 if /.*?Pas de résultats.*?/ =~ donneesHtml
265 /(.*?)[^ ]+?$/ =~ titre
.strip
271 end while not titre
.nil? and not titre
.empty
?
273 unless titre
.nil? or titre
.empty
?
274 /<a href="\/film\
/fichefilm_gen_cfilm=(\d+)\.html" class="link1">/ =~ donneesHtml
276 r
, ficheHtml
= connexionHttp
.get("/film/fichefilm_gen_cfilm=#{$1}.html")
279 /<title>(.*?)<\/title
>/ =~ ficheHtml
280 @titre = $1 unless $1.nil?
282 #puts "Movie found : #{@titre} (#{@fichier})"
285 /<h4>Année de production : (\d+)<\/h4
>/ =~ ficheHtml
286 @annee = $1.to_i
unless $1.nil?
289 /Réalisé par <a class="link1" href=".*?" target="">(.*?)<\/a
>/ =~ ficheHtml
290 @realisateurs << Personne
::ajouter($1) unless $1.nil?
293 /Avec(.*)/ =~ ficheHtml
294 $1.scan(/<a class="link1" href="\/personne\
/fichepersonne_gen_cpersonne=\d+\.html" target="">(.+?)<\/a
>/m
){|a
|
295 @acteurs << Personne
::ajouter(a
[0]) unless a
[0].nil?
299 /^<h4>Film (.*?)\.<\/h4
>/ =~ ficheHtml
300 $1.split(',').each
{|pays
|
301 @pays << Pays
::ajouter(pays
) unless pays
.nil?
305 /<h4>Durée : (\d+?)h (\d+?)min.<\/h4
>/ =~ ficheHtml
306 @duree = $1.nil? ? $2.to_i
: $1.to_i
* 60 +
$2.to_i
309 /Presse<\/a
> <img src
=".*?etoile_(\d)\.gif"/ =~ ficheHtml
310 @critiquePresse = $1.to_i
unless $1.nil?
312 # Critique spectateur
313 /Spectateurs<\/a
> <img src
=".*?etoile_(\d)\.gif"/ =~ ficheHtml
314 @critiqueSpectateur = $1.to_i
unless $1.nil?
317 /Genre : (.*)/ =~ ficheHtml
318 $1.scan(/<a href="\/film\
/alaffiche_genre_gen_genre=.*?" class="link1">(.+?)<\/a
>/m
){|g
|
319 @genres << Genre
::ajouter(g
[0]) unless g
[0].nil?
323 /Synopsis.*?<h4>(.+?)<\/h4
>/m
=~ ficheHtml
324 @synopsis = $1 unless $1.nil?
327 /Budget<\/b
> : (.+
?) millions d
'euros<\/h4>/ =~ ficheHtml
328 @budget = $1.to_i unless $1.nil?
330 puts "[!] Movie
not found
: #{@titre} (#{@fichier})"
337 racine = REXML::Element::new('film')
338 racine.add(REXML::Element::new('fichier').add_text(@fichier))
339 racine.add(REXML::Element::new('titre').add_text(@titre))
340 racine.add(REXML::Element::new('annee').add_text(@annee.to_s))
343 @realisateurs.each{|r|
344 racine.add(REXML::Element::new('realisateur').add_text(r.nom))
348 racine.add(REXML::Element::new('acteur').add_text(a.nom))
351 racine.add(REXML::Element::new('pays').add_text(p.nom))
353 racine.add(REXML::Element::new('duree').add_text(@duree.to_s))
355 racine.add(REXML::Element::new('critiquePresse').add_text(@critiquePresse.to_s))
356 racine.add(REXML::Element::new('critiqueSpectateur').add_text(@critiqueSpectateur.to_s))
358 racine.add(REXML::Element::new('genre').add_text(g.nom))
360 racine.add(REXML::Element::new('synopsis').add_text(@synopsis))
361 budgetElement = REXML::Element::new('budget')
362 budgetElement.add_text(@budget.to_s)
363 budgetElement.add_attribute('unite', @budgetUnite)
364 racine.add(budgetElement)
373 puts 'USAGE : <xml file> [<directory>]'
376 puts 'no directory given, use the current'
382 unless File::directory?(rep)
383 puts "'#{rep}' is
not a valid directory
"
387 # charge les films à partir du fichier xml
388 Film::loadFilmsXml(xmlFile)
391 Film::litRepertoire(rep)
393 # ecrit le fichier XML
394 Film::getFilmsXml.write(File::new(xmlFile, 'w'))