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 # Sauve les films dans un fichier XML
109 docXml
= REXML
::Document::new
110 docXml
.xml_decl().encoding
= "UTF-8" # normalement UTF-8
111 docXml
.xml_decl().dowrite
113 # la racine du document
114 racine
= REXML
::Element::new('filmographie')
116 pi
= REXML
::Instruction.new("xml-stylesheet", "type=\"text/xsl\" href=\"../xsl/yopyop.xsl\"")
117 racine
.previous_sibling
= pi
119 # on ajoute chaque film à la racine
125 docXml
.write(File
::new(@xmlFile, 'w'), 0)
130 # Charge les films depuis le fichier XML
132 # si le fichier n'existe pas il n'y a rien à charger
133 if !File
.exists
?(@xmlFile)
137 racine
= REXML
::Document::new(File
::new(@xmlFile)).root
138 racine
.each_element
{|e
|
139 id
= e
.attribute('id').to_s
.to_i
141 if id
>= @idDisponible
142 @idDisponible = id +
1
145 titre
= e
.get_elements('titre')[0].get_text
146 url
= e
.get_elements('url')[0].get_text
147 fichiers
= e
.get_elements('fichiers')[0].get_elements('fichier')
148 annee
= e
.get_elements('annee')[0].get_text
149 duree
= e
.get_elements('duree')[0].get_text
150 critiquePresse
= e
.get_elements('critiquePresse')[0].get_text
151 critiqueSpectateur
= e
.get_elements('critiqueSpectateur')[0].get_text
152 synopsis
= e
.get_elements('synopsis')[0].get_elements('p')
153 budget
= e
.get_elements('budget')[0].get_text
154 realisateurs
= e
.get_elements('realisateurs')[0].get_elements('realisateur')
155 acteurs
= e
.get_elements('acteurs')[0].get_elements('acteur')
156 pays
= e
.get_elements('lespays')[0].get_elements('pays')
157 genres
= e
.get_elements('genres')[0].get_elements('genre')
159 film
= Film
::new(fichiers
[0].get_text
.value
, @modClasse::new)
162 film
.titre
= titre
.value
unless titre
.nil?
164 film
.url
= url
.value
unless url
.nil?
167 film
.addFichier(e
.get_text
.value
)
168 @filmsFichier[e
.get_text
.value
] = film
170 film
.annee
= annee
.value
unless annee
.nil?
172 film
.acteurs
<< Personne
::ajouter(e
.get_text
.value
)
175 film
.pays
<< Pays
::ajouter(e
.get_text
.value
)
177 film
.duree
= duree
.value
unless duree
.nil?
178 film
.critiquePresse
= critiquePresse
.value
unless critiquePresse
.nil?
179 film
.critiqueSpectateur
= critiqueSpectateur
.value
unless critiqueSpectateur
.nil?
181 film
.genres
<< Genre
::ajouter(e
.get_text
.value
) if e
.get_text !
= nil
186 film
.synopsis +
= "\n" unless debut
187 film
.synopsis +
= e
.get_text
.value
if e
.get_text !
= nil
190 film
.budget
= budget
.value
unless budget
.nil?
191 @films[film
.titre
] = film
195 # Retourne un nouvel id, utilisé alors de la création d'un nouveau film
202 # Ajoute un film à l'ensemble des films.
203 def ajouterFilm(film
)
204 if film
.plusieursReponses
?
205 @filmsPlusieursReponses << film
209 if film
.nbReponses
== 0
210 @filmsAucuneReponse << film
214 if @films.has_key
?(film
.titre
)
215 if !
@filmsFichier.has_key
?(film
.fichiers
[0])
216 puts
"[i] movie #{film.titre} has a another file part : #{film.fichiers[0]}"
217 @films[film
.titre
].addFichier(film
.fichiers
[0])
218 @filmsFichier[film
.fichiers
[0]] = @films[film
.titre
]
220 puts
"[!] Duplicate movie
: #{film.titre} (#{film.fichiers[0]})"
223 puts "[i
] movie added
: #{film.titre} (#{film.fichiers[0]})"
224 @films[film.titre] = film
225 @filmsFichier[film.fichiers[0]] = film
229 # Appelé par 'pomper'. Cette méthode itère récursivement sur l'arborescence d'un repertoire.
232 next if f[0,1] == '.'
233 fichier = (r == '.' ? '' : r + "/") + f
234 if File
::directory?(fichier
)
239 fichier
= Iconv
.iconv("UTF-8", "ISO-8859-1", fichier
)[0]
241 # véfication de l'extension
242 /^.*?\.([^.]{3,4})$/ =~ fichier
243 if !FILMS_EXTENSIONS
.include?($1)
247 # on skip si le film est déjà dans la BD
248 if film
= @filmsFichier[fichier
]
249 puts
"[i] Already exists in DB : #{film.titre} (#{fichier})"
253 # pour limiter le nombre de connexion simultanée
254 if @nbConn >= NB_CONN_MAX
255 @threadsWait.next_wait
259 @threadsWait.join_nowait(
262 film
= Film
::new(fichier
, @modClasse::new)
263 @mutexId.synchronize
{
264 film
.id
= getNewId
# on lui donne un nouvel ID
266 film
.loadData
# on charge ses données
268 @mutexAjout.synchronize
{
271 rescue Exception
=> e