blob: d73342b2a9478f0e4aa38a5ec67297e257348992 [file] [log] [blame]
Jack Jansen827cc191993-07-19 16:13:04 +00001#
2# A VCR index.
3#
4import os
5import string
6
7error='VcrIndex.error'
8VERSION_STRING='#!VcrIndex 1.1\n'
9PREV_VERSION_STRING='#!VcrIndex 1.0\n'
10
11class VcrIndex:
12 def init(self, name):
13 self.curmovie = None
14 self.curscene = None
15 self.modified = 0
16 self.filename = name
17 self.basename = os.path.basename(name)
18 self.editable = []
19 if not name:
20 self.movies = {}
21 return self
22 try:
23 fp = open(name, 'r')
24 except IOError:
25 self.movies = {}
26 return self
27 header = fp.readline()
28 if header == PREV_VERSION_STRING:
29 print 'Converting old-format database...'
30 data = fp.read(100000)
31 self.movies = eval(data)
32 for m in self.movies.keys():
33 d = self.movies[m]
34 newd = {}
35 for s in d.keys():
36 newsd = {}
37 newsd['START'] = d[s]
38 if s == 'START':
39 s = '-ALL-'
40 newd[s] = newsd
41
42 self.movies[m] = newd
43 print 'Done.'
44 return self
45 if header <> VERSION_STRING:
46 print 'VcrIndex: incorrect version string:', header
47 self.movies = {}
48 return self
49 data = fp.read(100000)
50 self.movies = eval(data)
51 return self
52 #
53 # Save database to given file (or same file as read from if no
54 # filename given).
55 #
56 def save(self, name):
57 if not name:
58 name = self.filename
59 if not name:
60 raise error, 'No filename given'
61 self.filename = name
62 bupname = name + '~'
63 try:
64 os.unlink(bupname)
65 except os.error:
66 pass
67 try:
68 os.rename(name, bupname)
69 except os.error:
70 pass
71 fp = open(name, 'w')
72 data = str(self.movies)
73 fp.write(VERSION_STRING)
74 fp.write(data)
75 fp.write('\n')
76 fp.close()
77 self.modified = 0
78 #
79 # Get a list of movie names in tape order
80 #
81 def get_movienames(self):
82 names = self.movies.keys()
83 sorted = []
84 for name in names:
85 sorted.append(self.movies[name]['-ALL-']['START'], name)
86 sorted.sort()
87 rv = []
88 for pos, name in sorted:
89 rv.append(name)
90 return rv
91 #
92 # Get a list of scene names in tape order
93 #
94 def get_scenenames(self):
95 if not self.curmovie:
96 return []
97 scenedict = self.movies[self.curmovie]
98 names = scenedict.keys()
99 sorted = []
100 for name in names:
101 sorted.append(scenedict[name], name)
102 sorted.sort()
103 rv = []
104 for pos, name in sorted:
105 rv.append(name)
106 return rv
107 #
108 # Get a list of scene ids (format '00:02:32:12 name') in tape order
109 #
110 def get_sceneids(self):
111 if not self.curmovie:
112 return []
113 scenedict = self.movies[self.curmovie]
114 names = scenedict.keys()
115 sorted = []
116 for name in names:
117 sorted.append(scenedict[name]['START'], name)
118 sorted.sort()
119 rv = []
120 for pos, name in sorted:
121 str = '%02d:%02d:%02d:%02d ' % pos
122 rv.append(str + name)
123 return rv
124 #
125 # Does a movie exist?
126 #
127 def movie_exists(self, name):
128 return self.movies.has_key(name)
129 #
130 # Select a movie.
131 #
132 def movie_select(self, name):
133 if not self.movies.has_key(name):
134 raise error, 'No such movie: '+name
135 self.curmovie = name
136 self.curscene = None
137 #
138 # Get movie dictionary, or raise an error if no current movie.
139 #
140 def _getmoviedict(self):
141 if not self.curmovie:
142 raise error, 'No current movie'
143 return self.movies[self.curmovie]
144 #
145 # Rename a movie.
146 #
147 def movie_rename(self, newname):
148 scenedict = self._getmoviedict()
149 if self.movie_exists(newname):
150 raise error, 'Movie already exists: '+newname
151 del self.movies[self.curmovie]
152 self.movies[newname] = scenedict
153 self.curmovie = newname
154 self.modified = 1
155 #
156 # Copy a movie.
157 #
158 def movie_copy(self, newname):
159 scenedict = self._getmoviedict()
160 if self.movie_exists(newname):
161 raise error, 'Movie already exists: '+newname
162 newdict = {}
163 for k in scenedict.keys():
164 olddata = scenedict[k]
165 newdata = {}
166 for i in olddata.keys():
167 newdata[i] = olddata[i]
168 newdict[k] = newdata
169 self.movies[newname] = newdict
170 self.curmovie = newname
171 self.modified = 1
172 #
173 # Delete a movie.
174 #
175 def movie_delete(self):
176 if not self.curmovie:
177 raise error, 'No current movie'
178 del self.movies[self.curmovie]
179 self.curmovie = None
180 self.curscene = None
181 self.modified = 1
182 #
183 # Create a new movie.
184 #
185 def movie_new(self, name, pos):
186 if self.movie_exists(name):
187 raise error, 'Movie already exists: '+name
188 newdict = {}
189 newsdict = {}
190 newsdict['START'] = pos
191 newdict['-ALL-'] = newsdict
192 self.movies[name] = newdict
193 self.curmovie = name
194 self.curscene = None
195 self.modified = 1
196 #
197 # Does a scene exist?
198 #
199 def scene_exists(self, name):
200 scenedict = self._getmoviedict()
201 return scenedict.has_key(name)
202 #
203 # Select a current scene.
204 #
205 def scene_select(self, name):
206 scenedict = self._getmoviedict()
207 if not scenedict.has_key(name):
208 raise error, 'No such scene: '+name
209 self.curscene = name
210 #
211 # Rename a scene.
212 #
213 def scene_rename(self, newname):
214 scenedict = self._getmoviedict()
215 if not self.curscene:
216 raise error, 'No current scene'
217 if scenedict.has_key(newname):
218 raise error, 'Scene already exists: '+newname
219 if self.curscene == '-ALL-':
220 raise error, 'Cannot rename -ALL-'
221 scenedict[newname] = scenedict[self.curscene]
222 del scenedict[self.curscene]
223 self.curscene = newname
224 self.modified = 1
225 #
226 # Copy a scene.
227 #
228 def scene_copy(self, newname):
229 scenedict = self._getmoviedict()
230 if not self.curscene:
231 raise error, 'No current scene'
232 if scenedict.has_key(newname):
233 raise error, 'Scene already exists: '+newname
234 scenedict[newname] = scenedict[self.curscene]
235 self.curscene = newname
236 self.modified = 1
237 #
238 # Delete a scene.
239 #
240 def scene_delete(self):
241 scenedict = self._getmoviedict()
242 if not self.curscene:
243 raise error, 'No current scene'
244 if self.curscene == '-ALL-':
245 raise error, 'Cannot delete -ALL-'
246 del scenedict[self.curscene]
247 self.curscene = None
248 self.modified = 1
249 #
250 # Add a new scene.
251 #
252 def scene_new(self, newname, pos):
253 scenedict = self._getmoviedict()
254 if scenedict.has_key(newname):
255 raise error, 'Scene already exists: '+newname
256 newdict = {}
257 newdict['START'] = pos
258 scenedict[newname] = newdict
259 self.curscene = newname
260 self.modified = 1
261 #
262 # Get scene data.
263 #
264 def _getscenedata(self):
265 scenedict = self._getmoviedict()
266 if not self.curscene:
267 raise error, 'No current scene'
268 return scenedict[self.curscene]
269 #
270 # Data manipulation routines.
271 #
272 def pos_get(self):
273 return self._getscenedata()['START']
274 #
275 def pos_set(self, pos):
276 data = self._getscenedata()
277 data['START'] = pos
278 self.modified = 1
279 #
280 def comment_get(self):
281 data = self._getscenedata()
282 if data.has_key('COMMENT'):
283 return data['COMMENT']
284 else:
285 return ''
286 #
287 def comment_set(self, comment):
288 data = self._getscenedata()
289 data['COMMENT'] = comment
290 self.modified = 1
291 #
292 # Get the scene id of the current scene.
293 #
294 def get_cursceneid(self):
295 pos = self._getscenedata()['START']
296 str = '%02d:%02d:%02d:%02d ' % pos
297 return str + self.curscene
298 #
299 # Convert a scene id to a scene name.
300 #
301 def scene_id2name(self, id):
302 pos = string.find(id, ' ')
303 if pos <= 0:
304 raise error, 'Not a scene id: '+id
305 return id[pos+1:]
306 #
307 # Select a scene given a position.
308 #
309 def pos_select(self, pos):
310 prevmovie = None
311 movies = self.get_movienames()
312 for movie in movies:
313 mpos = self.movies[movie]['-ALL-']['START']
314 if mpos > pos:
315 break
316 prevmovie = movie
317 if not prevmovie:
318 raise error, 'Scene before BOT'
319
320 self.movie_select(prevmovie)
321 scenes = self.get_scenenames()
322 scenedict = self._getmoviedict()
323 prevscene = 'START'
324 for scene in scenes:
325 if scenedict[scene]['START'] > pos:
326 break
327 prevscene = scene
328 self.scene_select(prevscene)