1 # Représente un ensemble de films
3 require 'rexml/document'
10 require 'constantes.rb'
14 def initialize(xmlFile
)
17 # repertoire de base, par exemple C:/Divx/
20 # Les films indexé par leur titre
23 # Les films indexé par leur nom de fichier, deux fichiers différents peuvent pointer sur le même film
26 # Les films qui ont plusieurs réponses lors de la recherche, traité à la fin
27 @filmsPlusieursReponses = []
29 # Les films qui ont plusieurs réponses lors de la recherche, traité à la fin
30 @filmsAucuneReponse = []
32 # permet de traiter facilement des groupes de thread
33 @threadsWait = ThreadsWait
::new
34 @nbConn = 0 # le nombre de connexion
36 # le prochain id disponible
42 # Lit un repertoire de manière recursive et va chercher les informations concernant le film sur le net
45 repPrecedant
= Dir
::getwd
52 # on attends que les threads se terminent
53 @threadsWait.all_waits
55 puts
"Pompage terminé, temps : #{Time::now - t} secondes"
57 # traite les films qui avaient plusieurs réponses lors de la recherche
58 # l'utilisateur doit faire un choix
60 @filmsPlusieursReponses.each
{|f
|
62 puts
"Plop, ya un conflit #{i} / #{@filmsPlusieursReponses.length} :"
63 case f
.reglerConflitPlusieursReponses
73 @filmsAucuneReponse.each
{|f
|
75 puts
"Plop, Ce film n'a pas été trouvé #{i} / #{@filmsAucuneReponse.length} :"
76 case f
.reglerConflitPlusieursReponses
85 Dir
::chdir(repPrecedant
)
88 # Sauve les films dans un fichier XML
91 docXml
= REXML
::Document::new
92 docXml
.xml_decl().encoding
= "UTF-8" # normalement UTF-8
93 docXml
.xml_decl().dowrite
95 # la racine du document
96 racine
= REXML
::Element::new('filmographie')
98 pi
= REXML
::Instruction.new("xml-stylesheet", "type=\"text/xsl\" href=\"../xsl/yopyop.xsl\"")
99 racine
.previous_sibling
= pi
101 # on ajoute chaque film à la racine
107 docXml
.write(File
::new(@xmlFile, 'w'), 0)
112 # Charge les films depuis le fichier XML
114 # si le fichier n'existe pas il n'y a rien à charger
115 if !File
.exists
?(@xmlFile)
119 racine
= REXML
::Document::new(File
::new(@xmlFile)).root
120 racine
.each_element
{|e
|
121 id
= e
.attribute('id').to_s
.to_i
123 if id
> @idDisponible
124 @idDisponible = id +
1
127 titre
= e
.get_elements('titre')[0].get_text
128 url
= e
.get_elements('url')[0].get_text
129 fichiers
= e
.get_elements('fichiers')[0].get_elements('fichier')
130 annee
= e
.get_elements('annee')[0].get_text
131 duree
= e
.get_elements('duree')[0].get_text
132 critiquePresse
= e
.get_elements('critiquePresse')[0].get_text
133 critiqueSpectateur
= e
.get_elements('critiqueSpectateur')[0].get_text
134 synopsis
= e
.get_elements('synopsis')[0].get_elements('p')
135 budget
= e
.get_elements('budget')[0].get_text
136 realisateurs
= e
.get_elements('realisateurs')[0].get_elements('realisateur')
137 acteurs
= e
.get_elements('acteurs')[0].get_elements('acteur')
138 pays
= e
.get_elements('lespays')[0].get_elements('pays')
139 genres
= e
.get_elements('genres')[0].get_elements('genre')
141 film
= Film
::new(fichiers
[0].get_text
.value
)
144 film
.titre
= titre
.value
unless titre
.nil?
146 film
.url
= url
.value
unless url
.nil?
149 film
.addFichier(e
.get_text
.value
)
150 @filmsFichier[e
.get_text
.value
] = film
152 film
.annee
= annee
.value
unless annee
.nil?
154 film
.acteurs
<< Personne
::ajouter(e
.get_text
.value
)
157 film
.pays
<< Pays
::ajouter(e
.get_text
.value
)
159 film
.duree
= duree
.value
unless duree
.nil?
160 film
.critiquePresse
= critiquePresse
.value
unless critiquePresse
.nil?
161 film
.critiqueSpectateur
= critiqueSpectateur
.value
unless critiqueSpectateur
.nil?
163 film
.genres
<< Genre
::ajouter(e
.get_text
.value
) if e
.get_text !
= nil
168 film
.synopsis +
= "\n" unless debut
169 film
.synopsis +
= e
.get_text
.value
if e
.get_text !
= nil
172 film
.budget
= budget
.value
unless budget
.nil?
173 @films[film
.titre
] = film
177 # Retourne un nouvel id, utilisé alors de la création d'un nouveau film
185 def ajouterFilm(film
)
186 if film
.plusieursReponses
?
187 @filmsPlusieursReponses << film
191 if film
.nbReponses
== 0
192 @filmsAucuneReponse << film
196 if @films.has_key
?(film
.titre
)
197 # le fichier n'est pas connu -> nième partie d'un film
198 if !
@filmsFichier.has_key
?(film
.fichiers
[0])
199 puts
"[i] movie #{film.titre} has a another file part : #{film.fichiers[0]}"
200 @films[film
.titre
].addFichier(film
.fichiers
[0])
201 @filmsFichier[film
.fichiers
[0]] = @films[film
.titre
]
203 puts
"[!] Duplicate movie
: #{film.titre} (#{film.fichiers[0]})"
206 puts "[i
] movie added
: #{film.titre} (#{film.fichiers[0]})"
207 @films[film.titre] = film
208 @filmsFichier[film.fichiers[0]] = film
212 # Appelé par 'pomper'. Cette méthode est récursive.
215 next if f[0,1] == '.'
216 fichier = (r == '.' ? '' : r + "/") + f
217 if File
::directory?(fichier
)
221 # véfication de l'extension
222 /^.*?\.([^.]{3,4})$/ =~ fichier
223 if !FILMS_EXTENSIONS
.include?($1)
227 fichier
= CGI
::escapeHTML(Iconv
.iconv("UTF-8", "ISO-8859-1", fichier
)[0])
229 # on skip si le film est déjà dans la BD
230 if film
= @filmsFichier[fichier
]
231 puts
"[i] Already exists in DB : #{film.titre} (#{fichier})"
237 # pour limiter le nombre de connexion simultanée
238 if @nbConn >= NB_CONN_MAX
239 @threadsWait.next_wait
243 @threadsWait.join_nowait(
246 film
= Film
::new(fichier
).loadData
247 film
.id
= getNewId
# on lui donne un nouvel ID
249 unless film
.nil? # le film a été correctement construit
252 rescue Exception
=> e