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 if f
.reglerConflitPlusieursReponses
70 @filmsAucuneReponse.each
{|f
|
72 puts
"Plop, Ce film n'a pas été trouvé{i} / #{@filmsAucuneReponse.length} :"
73 if f
.reglerConflitPlusieursReponses
79 Dir
::chdir(repPrecedant
)
82 # Sauve les films dans un fichier XML
85 docXml
= REXML
::Document::new
86 docXml
.xml_decl().encoding
= "UTF-8" # normalement UTF-8
87 docXml
.xml_decl().dowrite
89 # la racine du document
90 racine
= REXML
::Element::new('filmographie')
92 pi
= REXML
::Instruction.new("xml-stylesheet", "type=\"text/xsl\" href=\"../xsl/yopyop.xsl\"")
93 racine
.previous_sibling
= pi
95 # on ajoute chaque film à la racine
101 docXml
.write(File
::new(@xmlFile, 'w'), 0)
106 # Charge les films depuis le fichier XML
108 # si le fichier n'existe pas il n'y a rien à charger
109 if !File
.exists
?(@xmlFile)
113 racine
= REXML
::Document::new(File
::new(@xmlFile)).root
114 racine
.each_element
{|e
|
115 id
= e
.attribute('id').to_s
.to_i
117 if id
> @idDisponible
118 @idDisponible = id +
1
121 titre
= e
.get_elements('titre')[0].get_text
122 url
= e
.get_elements('url')[0].get_text
123 fichiers
= e
.get_elements('fichiers')[0].get_elements('fichier')
124 annee
= e
.get_elements('annee')[0].get_text
125 duree
= e
.get_elements('duree')[0].get_text
126 critiquePresse
= e
.get_elements('critiquePresse')[0].get_text
127 critiqueSpectateur
= e
.get_elements('critiqueSpectateur')[0].get_text
128 synopsis
= e
.get_elements('synopsis')[0].get_elements('p')
129 budget
= e
.get_elements('budget')[0].get_text
130 realisateurs
= e
.get_elements('realisateurs')[0].get_elements('realisateur')
131 acteurs
= e
.get_elements('acteurs')[0].get_elements('acteur')
132 pays
= e
.get_elements('lespays')[0].get_elements('pays')
133 genres
= e
.get_elements('genres')[0].get_elements('genre')
135 film
= Film
::new(fichiers
[0].get_text
.value
)
138 film
.titre
= titre
.value
unless titre
.nil?
140 film
.url
= url
.value
unless url
.nil?
143 film
.addFichier(e
.get_text
.value
)
144 @filmsFichier[e
.get_text
.value
] = film
146 film
.annee
= annee
.value
unless annee
.nil?
148 film
.acteurs
<< Personne
::ajouter(e
.get_text
.value
)
151 film
.pays
<< Pays
::ajouter(e
.get_text
.value
)
153 film
.duree
= duree
.value
unless duree
.nil?
154 film
.critiquePresse
= critiquePresse
.value
unless critiquePresse
.nil?
155 film
.critiqueSpectateur
= critiqueSpectateur
.value
unless critiqueSpectateur
.nil?
157 film
.genres
<< Genre
::ajouter(e
.get_text
.value
) if e
.get_text !
= nil
162 film
.synopsis +
= "\n" unless debut
163 film
.synopsis +
= e
.get_text
.value
if e
.get_text !
= nil
166 film
.budget
= budget
.value
unless budget
.nil?
167 @films[film
.titre
] = film
171 # Retourne un nouvel id, utilisé alors de la création d'un nouveau film
179 def ajouterFilm(film
)
180 if film
.plusieursReponses
?
181 @filmsPlusieursReponses << film
185 if film
.nbReponses
== 0
186 @filmsAucuneReponse << film
190 if @films.has_key
?(film
.titre
)
191 # le fichier n'est pas connu -> nième partie d'un film
192 if !
@filmsFichier.has_key
?(film
.fichiers
[0])
193 puts
"[i] movie #{film.titre} has a another file part : #{film.fichiers[0]}"
194 @films[film
.titre
].addFichier(film
.fichiers
[0])
195 @filmsFichier[film
.fichiers
[0]] = @films[film
.titre
]
197 puts
"[!] Duplicate movie
: #{film.titre} (#{film.fichiers[0]})"
200 puts "[i
] movie added
: #{film.titre} (#{film.fichiers[0]})"
201 @films[film.titre] = film
202 @filmsFichier[film.fichiers[0]] = film
206 # Appelé par 'pomper'. Cette méthode est récursive.
209 next if f[0,1] == '.'
210 fichier = (r == '.' ? '' : r + "/") + f
211 if File
::directory?(fichier
)
212 litRepertoireR(fichier
)
215 # véfication de l'extension
216 /^.*?\.(.{3,4})$/ =~ fichier
217 if !FILMS_EXTENSIONS
.include?($1)
221 fichier
= CGI
::escapeHTML(Iconv
.iconv("UTF-8", "ISO-8859-1", fichier
)[0])
223 # on skip si le film est déjà dans la BD
224 if film
= @filmsFichier[fichier
]
225 puts
"[i] Already exists in DB : #{film.titre} (#{fichier})"
231 # pour limiter le nombre de connexion simultanée
232 if @nbConn >= NB_CONN_MAX
233 @threadsWait.next_wait
237 @threadsWait.join_nowait(
240 film
= Film
::new(fichier
).loadData
241 film
.id
= getNewId
# on lui donne un nouvel ID
243 unless film
.nil? # le film a été correctement construit
246 rescue Exception
=> e