12796a3f8d76752993a6adef07e89f8484e031a9
[pompage.git] / src / film.rb
1 # coding: utf-8
2
3 require 'pays.rb'
4 require 'genre.rb'
5 require 'personne.rb'
6 require 'constantes.rb'
7
8 require 'modules/allocine.rb'
9
10 # ajout de deux méthodes à la classe String
11 class String
12 def virerBalisesHTML
13 return gsub(/<(.*?)>/, '')
14 end
15 def virerBalisesHTML!
16 gsub!(/<(.*?)>/, '')
17 end
18 end
19
20 # Représente un Film.
21 # Permet de charger des données depuis allocine.fr
22 # Permet d'effectuer des recherches depuis allocine.fr
23 class Film
24
25 # toutes les données membres sont accessibles par défaut (écriture/lecture)
26 attr_accessor :id, :titre, :url, :fichiers, :mod, :annee, :realisateurs, :acteurs, :pays, :duree, :critiquePresse, :critiqueSpectateur, :genres, :synopsis, :budget
27
28 # Constructeur. N'entreprend aucune action (chargement), crée juste un film vide.
29 # p1 [String] : le fichier correspondant au film
30 def initialize(fichier, mod)
31 @fichiers = [] # le chemin des fichiers est relatif au repertoire de base
32 @fichiers << fichier if fichier != nil && fichier != ''
33
34 @mod = mod
35
36 @id = 0
37 @titre = ''
38 @annee = nil
39 @realisateurs = []
40 @acteurs = []
41 @pays = []
42 @duree = nil
43 @critiquePresse = nil
44 @critiqueSpectateur = nil
45 @genres = []
46 @synopsis = nil
47 @budget = nil
48 @budgetUnite = 'euro'
49 @url = nil
50
51 @nbReponses = 0
52
53 # mémorise les tuples {nom => id} dans le cas ou il y a plusieurs choix de films après une recherche
54 @choix = {}
55 end
56
57 def titre=(t)
58 if t == nil
59 @titre = ""
60 else
61 @titre = t
62 end
63 end
64
65 # Est-ce qu'il y a eu plusieurs réponses pour ce film lors de la cherche sur le net ?
66 def plusieursReponses?
67 return @nbReponses > 1
68 end
69
70 # Est-ce qu'il y a eu plusieurs réponses pour ce film lors de la cherche sur le net ?
71 def nbReponses
72 return @nbReponses
73 end
74
75 # Demande à l'utilisateur de faire un choix.
76 # ret : 1 si le conflit à été résolu, 2 si le film est à ignorer, 3 si tout les films sont à ignorer
77 def reglerConflitPlusieursReponses
78 @nbReponses = 1
79
80 puts " -> " + @fichiers[0]
81 puts "Fais ton choix jeune padawan (un caractère et pas plus)"
82 tabNoms = @choix.keys
83 choix = 1
84 loop do
85 i = 1
86 tabNoms.each{|n|
87 puts "#{i}. #{n}"
88 i += 1
89 }
90 puts "______"
91 puts "A. Passer et l'ajouter"
92 puts "B. Ignorer"
93 puts "C. Tout ignorer"
94 choix = STDIN.gets
95
96 if /A/i =~ choix
97 return 1
98 elsif /B/i =~ choix
99 return 2
100 elsif /C/i =~ choix
101 return 3
102 end
103
104 choix = choix.to_i
105 if choix > 0 && choix <= tabNoms.length
106 break;
107 else
108 puts
109 puts "Choix pas bon !!"
110 end
111 end
112
113 @mod.load(@choix[tabNoms[choix-1]], self)
114
115 return 1
116 end
117
118 # Ajoute un fichier comme faisant partie du film
119 def addFichier(fichier)
120 if !@fichiers.include?(fichier)
121 @fichiers << fichier
122 end
123 end
124
125 # Charge les informations du films à partir d'allocine.fr
126 # ret [Film]
127 def loadData
128 #extrait le nom à partir du nom du fichier
129 /^.*?([^\/]*?)\.(.{3,4})$/ =~ @fichiers[0]
130 #remplace undescores et points par des espaces
131 titre = $1.gsub(/[_\.]/, ' ')
132 #remplace les suites d'espaces par un seul
133 titre.gsub!(/ {2,}/,' ')
134 titre.gsub!(/\[.*?\]/,' ')
135 titre.gsub!(/\(.*?\)/,' ')
136 titre.gsub!(/\{.*?\}/,' ')
137 #vire les espaces au début et à la fin
138 titre.strip!
139
140 @titre = titre.dup
141
142 unless LOAD_DATA
143 return self
144 end
145
146 reponses = @mod.rechercherFilm(titre)
147 @nbReponses = reponses.size
148
149 if @nbReponses == 1
150 @mod.load(reponses.values[0], self)
151 else
152 @choix = reponses
153 end
154
155 self
156 end
157
158 def cheminImage
159 return $repBase + "/" + $repAffichette + @id.to_s + ".jpg";
160 end
161
162 def setImage(image)
163 f = File::new(cheminImage, 'w').binmode
164 f.write(image)
165 f.close
166 end
167
168 def possedeImage?
169 return File::exist?(cheminImage)
170 end
171
172 # Met à jour un ou plusieurs champs correspondant à 'champ'.
173 def update(champ)
174 return if @url == nil || @url == ""
175 @mod.setChamp(champ)
176 @mod.loadURL(@url, self)
177 end
178
179 # Renvoie un film sous la forme d'un élément XML .
180 # ret [REXML::Element] : un element xml <film>
181 def getXml
182
183 racine = REXML::Element::new('film')
184 racine.add_attribute('id', @id.to_s)
185
186 fichiers = REXML::Element::new('fichiers')
187 @fichiers.each{|f|
188 fichiers.add(REXML::Element::new('fichier').add_text(f))
189 }
190 racine.add(fichiers)
191
192 racine.add(REXML::Element::new('titre').add_text(@titre))
193 racine.add(REXML::Element::new('annee').add_text(@annee))
194
195 realisateurs = REXML::Element::new('realisateurs')
196 @realisateurs.each{|r|
197 realisateurs.add(REXML::Element::new('realisateur').add_text(r.nom))
198 }
199 racine.add(realisateurs)
200
201 acteurs = REXML::Element::new('acteurs')
202 @acteurs.each{|a|
203 acteurs.add(REXML::Element::new('acteur').add_text(a.nom))
204 }
205 racine.add(acteurs)
206
207 lespays = REXML::Element::new('lespays')
208 @pays.each{|p|
209 lespays.add(REXML::Element::new('pays').add_text(p.nom))
210 }
211 racine.add(lespays)
212
213 racine.add(REXML::Element::new('duree').add_text(@duree.to_s))
214
215 racine.add(REXML::Element::new('critiquePresse').add_text(@critiquePresse))
216 racine.add(REXML::Element::new('critiqueSpectateur').add_text(@critiqueSpectateur))
217
218 genres = REXML::Element::new('genres')
219 @genres.each{|g|
220 genres.add(REXML::Element::new('genre').add_text(g.nom))
221 }
222 racine.add(genres)
223
224 synopsisElement = REXML::Element::new('synopsis')
225 unless @synopsis.nil?
226 @synopsis.split("\n").each{|s|
227 next if s =~ /^\s*$/
228 synopsisElement.add(REXML::Element::new('p').add_text(s))
229 }
230 end
231 racine.add(synopsisElement)
232
233 budgetElement = REXML::Element::new('budget')
234 budgetElement.add_text(@budget)
235 budgetElement.add_attribute('unite', @budgetUnite)
236 racine.add(budgetElement)
237
238 racine.add(REXML::Element::new('url').add_text(@url))
239
240 racine
241 end
242 end
243