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