1 # Représente un ensemble de films
3 require 'rexml/document'
10 require 'constantes.rb'
14 def initialize(xmlFile
, modClasse
)
17 @modClasse = modClasse
19 # repertoire de base, par exemple C:/Divx/
22 # Les films indexé par leur titre
25 # Les films indexé par leur nom de fichier, deux fichiers différents peuvent pointer sur le même film
28 # Les films qui ont plusieurs réponses lors de la recherche, traité à la fin
29 @filmsPlusieursReponses = []
31 # Les films qui ont plusieurs réponses lors de la recherche, traité à la fin
32 @filmsAucuneReponse = []
34 # permet de traiter facilement des groupes de thread
35 @threadsWait = ThreadsWait
::new
36 @nbConn = 0 # le nombre de connexion
38 # le prochain id disponible
44 # Lit un repertoire de manière recursive et va chercher les informations concernant le film sur le net
47 repPrecedant
= Dir
::getwd
54 # on attends que les threads se terminent
55 @threadsWait.all_waits
57 puts
"Pompage terminé, temps : #{Time::now - t} secondes"
59 # traite les films qui avaient plusieurs réponses lors de la recherche
60 # l'utilisateur doit faire un choix
62 @filmsPlusieursReponses.each
{|f
|
64 puts
"Plop, ya un conflit #{i} / #{@filmsPlusieursReponses.length} :"
65 case f
.reglerConflitPlusieursReponses
75 @filmsAucuneReponse.each
{|f
|
77 puts
"Plop, Ce film n'a pas été trouvé #{i} / #{@filmsAucuneReponse.length} :"
78 case f
.reglerConflitPlusieursReponses
91 Dir
::chdir(repPrecedant
)
94 # Sauve les films dans un fichier XML
97 docXml
= REXML
::Document::new
98 docXml
.xml_decl().encoding
= "UTF-8" # normalement UTF-8
99 docXml
.xml_decl().dowrite
101 # la racine du document
102 racine
= REXML
::Element::new('filmographie')
104 pi
= REXML
::Instruction.new("xml-stylesheet", "type=\"text/xsl\" href=\"../xsl/yopyop.xsl\"")
105 racine
.previous_sibling
= pi
107 # on ajoute chaque film à la racine
113 docXml
.write(File
::new(@xmlFile, 'w'), 0)
118 # Charge les films depuis le fichier XML
120 # si le fichier n'existe pas il n'y a rien à charger
121 if !File
.exists
?(@xmlFile)
125 racine
= REXML
::Document::new(File
::new(@xmlFile)).root
126 racine
.each_element
{|e
|
127 id
= e
.attribute('id').to_s
.to_i
129 if id
>= @idDisponible
130 @idDisponible = id +
1
133 titre
= e
.get_elements('titre')[0].get_text
134 url
= e
.get_elements('url')[0].get_text
135 fichiers
= e
.get_elements('fichiers')[0].get_elements('fichier')
136 annee
= e
.get_elements('annee')[0].get_text
137 duree
= e
.get_elements('duree')[0].get_text
138 critiquePresse
= e
.get_elements('critiquePresse')[0].get_text
139 critiqueSpectateur
= e
.get_elements('critiqueSpectateur')[0].get_text
140 synopsis
= e
.get_elements('synopsis')[0].get_elements('p')
141 budget
= e
.get_elements('budget')[0].get_text
142 realisateurs
= e
.get_elements('realisateurs')[0].get_elements('realisateur')
143 acteurs
= e
.get_elements('acteurs')[0].get_elements('acteur')
144 pays
= e
.get_elements('lespays')[0].get_elements('pays')
145 genres
= e
.get_elements('genres')[0].get_elements('genre')
147 film
= Film
::new(fichiers
[0].get_text
.value
, @modClasse::new)
150 film
.titre
= titre
.value
unless titre
.nil?
152 film
.url
= url
.value
unless url
.nil?
155 film
.addFichier(e
.get_text
.value
)
156 @filmsFichier[e
.get_text
.value
] = film
158 film
.annee
= annee
.value
unless annee
.nil?
160 film
.acteurs
<< Personne
::ajouter(e
.get_text
.value
)
163 film
.pays
<< Pays
::ajouter(e
.get_text
.value
)
165 film
.duree
= duree
.value
unless duree
.nil?
166 film
.critiquePresse
= critiquePresse
.value
unless critiquePresse
.nil?
167 film
.critiqueSpectateur
= critiqueSpectateur
.value
unless critiqueSpectateur
.nil?
169 film
.genres
<< Genre
::ajouter(e
.get_text
.value
) if e
.get_text !
= nil
174 film
.synopsis +
= "\n" unless debut
175 film
.synopsis +
= e
.get_text
.value
if e
.get_text !
= nil
178 film
.budget
= budget
.value
unless budget
.nil?
179 @films[film
.titre
] = film
183 # Retourne un nouvel id, utilisé alors de la création d'un nouveau film
191 def ajouterFilm(film
)
192 if film
.plusieursReponses
?
193 @filmsPlusieursReponses << film
197 if film
.nbReponses
== 0
198 @filmsAucuneReponse << film
202 if @films.has_key
?(film
.titre
)
203 # le fichier n'est pas connu -> nième partie d'un film
204 if !
@filmsFichier.has_key
?(film
.fichiers
[0])
205 puts
"[i] movie #{film.titre} has a another file part : #{film.fichiers[0]}"
206 @films[film
.titre
].addFichier(film
.fichiers
[0])
207 @filmsFichier[film
.fichiers
[0]] = @films[film
.titre
]
209 puts
"[!] Duplicate movie
: #{film.titre} (#{film.fichiers[0]})"
212 puts "[i
] movie added
: #{film.titre} (#{film.fichiers[0]})"
213 @films[film.titre] = film
214 @filmsFichier[film.fichiers[0]] = film
218 # Appelé par 'pomper'. Cette méthode est récursive.
221 next if f[0,1] == '.'
222 fichier = (r == '.' ? '' : r + "/") + f
223 if File
::directory?(fichier
)
227 # véfication de l'extension
228 /^.*?\.([^.]{3,4})$/ =~ fichier
229 if !FILMS_EXTENSIONS
.include?($1)
233 fichier
= CGI
::escapeHTML(Iconv
.iconv("UTF-8", "ISO-8859-1", fichier
)[0])
235 # on skip si le film est déjà dans la BD
236 if film
= @filmsFichier[fichier
]
237 puts
"[i] Already exists in DB : #{film.titre} (#{fichier})"
243 # pour limiter le nombre de connexion simultanée
244 if @nbConn >= NB_CONN_MAX
245 @threadsWait.next_wait
249 @threadsWait.join_nowait(
252 film
= Film
::new(fichier
, @modClasse::new)
253 film
.id
= getNewId
# on lui donne un nouvel ID
254 film
.loadData
# on charge ses données
256 unless film
.nil? # le film a été correctement construit
259 rescue Exception
=> e