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