3 require 'rexml/document'
10 require 'constantes.rb'
13 # Représente un ensemble de films.
15 def initialize(xmlFile
, modClasse
)
18 @modClasse = modClasse
20 # repertoire de base, par exemple C:/Divx/
23 # Les films indexé par leur titre
26 # Les films indexé par leur nom de fichier, deux fichiers différents peuvent pointer sur le même film
29 # Les films qui ont plusieurs réponses lors de la recherche, traité à la fin
30 @filmsPlusieursReponses = []
32 # Les films qui n'ont aucune réponse après une recherche, traité à la fin
33 @filmsAucuneReponse = []
35 # permet de traiter facilement des groupes de thread
36 @threadsWait = ThreadsWait
::new
37 @nbConn = 0 # le nombre de connexion
39 @mutexAjout = Mutex
::new # mutex pour protéger l'ajout
40 @mutexId = Mutex
::new # mutex pour protéger la génération d'id
42 # le prochain id disponible
54 # Lit un repertoire de manière recursive et va chercher les informations concernant le film sur le net.
57 repPrecedant
= Dir
::getwd
64 # on attends que les threads se terminent
65 @threadsWait.all_waits
67 puts
"Pompage terminé, temps : #{Time::now - t} secondes"
69 # traite les films qui avaient plusieurs réponses lors de la recherche
70 # l'utilisateur doit faire un choix
72 @filmsPlusieursReponses.each
{|f
|
74 puts
"Plop, ya un conflit #{i} / #{@filmsPlusieursReponses.length} :"
75 case f
.reglerConflitPlusieursReponses
84 # traite les films qui n'avaient aucune réponse
86 @filmsAucuneReponse.each
{|f
|
88 puts
"Plop, Ce film n'a pas été trouvé #{i} / #{@filmsAucuneReponse.length} :"
89 case f
.reglerConflitPlusieursReponses
98 # annonce à chaque module d'importation que c'est fini
103 Dir
::chdir(repPrecedant
)
106 # Mise à jour des films dans la BD.
107 # p1 string : un motif Regex correspondant à un ou plusieurs champs
108 def update(champ
, titre
)
110 next if !f
.titre
.match(Regexp
::new(titre
, true))
112 ## si le film est complet on ne fait rien
113 if $force || f
.url
== nil || f
.titre
== '' || f
.annee
== nil ||
114 f
.realisateurs
.empty
? || f
.acteurs
.empty
? || f
.pays
.empty
? ||
115 f
.genres
.empty
? || f
.synopsis
== nil || !f
.possedeImage
?
122 # Sauve les films dans un fichier XML
124 #puts self # print all files before saving in XML
127 docXml
= REXML
::Document::new
128 docXml
.xml_decl().encoding
= "UTF-8" # normalement UTF-8
129 docXml
.xml_decl().dowrite
131 # la racine du document
132 racine
= REXML
::Element::new('filmographie')
134 pi
= REXML
::Instruction.new("xml-stylesheet", "type=\"text/xsl\" href=\"../xsl/yopyop.xsl\"")
135 racine
.previous_sibling
= pi
137 # on ajoute chaque film à la racine
143 docXml
.write(File
::new(@xmlFile, 'w'))
148 @films.each_value
{|f
|
156 # Enlève les \n et espace au début et à la fin de 'texte' et retourne le résultat
157 def nettoyer_texte(texte
)
158 texte
=~
/^[\n ]*(.*?)[\n ]*$/
162 # Charge les films depuis le fichier XML
164 # si le fichier n'existe pas il n'y a rien à charger
165 if !File
.exists
?(@xmlFile)
169 racine
= REXML
::Document::new(File
::new(@xmlFile)).root
170 racine
.elements
.each("film"){|e
|
171 id
= e
.attribute('id').to_s
.to_i
173 if id
>= @idDisponible
174 @idDisponible = id +
1
177 film
= Film
::new(nil, @modClasse::new)
180 film
.titre
= e
.get_text('titre')
181 film
.titre
= nettoyer_texte(film
.titre
.value
) if film
.titre !
= nil
183 print
"#{film.titre}.. "
185 film
.url
= e
.get_text('url')
186 film
.url
= nettoyer_texte(film
.url
.value
) if film
.url !
= nil
188 film
.annee
= e
.get_text('annee')
189 film
.annee
= nettoyer_texte(film
.annee
.value
) if film
.annee !
= nil
191 film
.duree
= e
.get_text('duree')
192 film
.duree
= nettoyer_texte(film
.duree
.value
) if film
.duree !
= nil
194 film
.critiquePresse
= e
.get_text('critiquePresse')
195 film
.critiquePresse
= nettoyer_texte(film
.critiquePresse
.value
) if film
.critiquePresse !
= nil
197 film
.critiqueSpectateur
= e
.get_text('critiqueSpectateur')
198 film
.critiqueSpectateur
= nettoyer_texte(film
.critiqueSpectateur
.value
) if film
.critiqueSpectateur !
= nil
200 film
.budget
= e
.get_text('budget')
201 film
.budget
= nettoyer_texte(film
.budget
.value
) if film
.budget !
= nil
203 e
.elements
.each('fichiers/fichier'){|f
|
204 next if f
.get_text
== nil
205 film
.addFichier(nettoyer_texte(f
.get_text
.value
))
206 @filmsFichier[nettoyer_texte(f
.get_text
.value
)] = film
209 e
.elements
.each('realisateurs/realisateur'){|f
|
210 film
.realisateurs
<< Personne
::ajouter(nettoyer_texte(f
.get_text
.value
))
213 e
.elements
.each('acteurs/acteur'){|f
|
214 film
.acteurs
<< Personne
::ajouter(nettoyer_texte(f
.get_text
.value
))
217 e
.elements
.each('lespays/pays'){|f
|
218 film
.pays
<< Pays
::ajouter(nettoyer_texte(f
.get_text
.value
))
221 e
.elements
.each('genres/genre'){|f
|
222 film
.genres
<< Genre
::ajouter(nettoyer_texte(f
.get_text
.value
))
227 e
.elements
.each('synopsis/p'){|f
|
228 film
.synopsis +
= "\n" unless debut
229 film
.synopsis +
= nettoyer_texte(f
.get_text
.value
) if f
.get_text !
= nil
232 film
.synopsis
= nil if film
.synopsis
== ""
234 @films[film
.titre
] = film
238 # Retourne un nouvel id, utilisé alors de la création d'un nouveau film
245 # Ajoute un film à l'ensemble des films.
246 def ajouterFilm(film
)
247 if film
.plusieursReponses
?
248 @filmsPlusieursReponses << film
252 if film
.nbReponses
== 0
253 @filmsAucuneReponse << film
257 if @films.has_key
?(film
.titre
)
258 if !
@filmsFichier.has_key
?(film
.fichiers
[0])
259 puts
"[i] Le film #{film.titre} possède une autre partie : #{film.fichiers[0]}"
260 @films[film
.titre
].addFichier(film
.fichiers
[0])
261 @filmsFichier[film
.fichiers
[0]] = @films[film
.titre
]
263 puts
"[!] Film déjà dans la BD
: #{film.titre} (#{film.fichiers[0]})"
266 puts "[i
] Film ajouté
: (#{film.id}) #{film.titre} (#{film.fichiers[0]}) #{film.id}"
267 @films[film.titre] = film
268 @filmsFichier[film.fichiers[0]] = film
272 # Appelé par 'pomper'. Cette méthode itère récursivement sur l'arborescence d'un repertoire.
275 next if f[0,1] == '.'
276 fichier = (r == '.' ? '' : r + "/") + f
277 if File
::directory?(fichier
)
280 #fichier = Iconv.iconv("UTF-8", "ISO-8859-1", fichier)[0]
282 # véfication de l'extension
283 /^.*?\.([^.]{3,4})$/ =~ fichier
284 if !FILMS_EXTENSIONS
.include?($1)
288 # on skip si le film est déjà dans la BD
289 if film
= @filmsFichier[fichier
]
290 puts
"[!] Film déjà dans la BD
: (#{film.id}) #{film.titre} (#{film.fichiers[0]})"
294 # pour limiter le nombre de connexion simultanée
295 if @nbConn >= NB_CONN_MAX
296 @threadsWait.next_wait
300 @threadsWait.join_nowait(
303 film
= Film
::new(fichier
, @modClasse::new)
304 @mutexId.synchronize
{
305 film
.id
= getNewId
# on lui donne un nouvel ID
308 film
.loadData
# chargement de ses données
310 @mutexAjout.synchronize
{
313 rescue Exception
=> e