At the release of 1.0.1.
[python/dscho.git] / Demo / sgi / video / VcrIndex.py
blob80212ee56193e0deb39444a924df883e7d583abc
2 # A VCR index.
4 import os
5 import string
7 error='VcrIndex.error'
8 VERSION_STRING='#!VcrIndex 1.1\n'
9 PREV_VERSION_STRING='#!VcrIndex 1.0\n'
11 class 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
22 try:
23 fp = open(name, 'r')
24 except IOError:
25 self.movies = {}
26 return
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
42 self.movies[m] = newd
43 print 'Done.'
44 return
45 if header <> VERSION_STRING:
46 print 'VcrIndex: incorrect version string:', header
47 self.movies = {}
48 return
49 data = fp.read(100000)
50 self.movies = eval(data)
52 # Save database to given file (or same file as read from if no
53 # filename given).
55 def save(self, name):
56 if not name:
57 name = self.filename
58 if not name:
59 raise error, 'No filename given'
60 self.filename = name
61 bupname = name + '~'
62 try:
63 os.unlink(bupname)
64 except os.error:
65 pass
66 try:
67 os.rename(name, bupname)
68 except os.error:
69 pass
70 fp = open(name, 'w')
71 data = str(self.movies)
72 fp.write(VERSION_STRING)
73 fp.write(data)
74 fp.write('\n')
75 fp.close()
76 self.modified = 0
78 # Get a list of movie names in tape order
80 def get_movienames(self):
81 names = self.movies.keys()
82 sorted = []
83 for name in names:
84 sorted.append(self.movies[name]['-ALL-']['START'], name)
85 sorted.sort()
86 rv = []
87 for pos, name in sorted:
88 rv.append(name)
89 return rv
91 # Get a list of scene names in tape order
93 def get_scenenames(self):
94 if not self.curmovie:
95 return []
96 scenedict = self.movies[self.curmovie]
97 names = scenedict.keys()
98 sorted = []
99 for name in names:
100 sorted.append(scenedict[name], name)
101 sorted.sort()
102 rv = []
103 for pos, name in sorted:
104 rv.append(name)
105 return rv
107 # Get a list of scene ids (format '00:02:32:12 name') in tape order
109 def get_sceneids(self):
110 if not self.curmovie:
111 return []
112 scenedict = self.movies[self.curmovie]
113 names = scenedict.keys()
114 sorted = []
115 for name in names:
116 sorted.append(scenedict[name]['START'], name)
117 sorted.sort()
118 rv = []
119 for pos, name in sorted:
120 str = '%02d:%02d:%02d:%02d ' % pos
121 rv.append(str + name)
122 return rv
124 # Does a movie exist?
126 def movie_exists(self, name):
127 return self.movies.has_key(name)
129 # Select a movie.
131 def movie_select(self, name):
132 if not self.movies.has_key(name):
133 raise error, 'No such movie: '+name
134 self.curmovie = name
135 self.curscene = None
137 # Get movie dictionary, or raise an error if no current movie.
139 def _getmoviedict(self):
140 if not self.curmovie:
141 raise error, 'No current movie'
142 return self.movies[self.curmovie]
144 # Rename a movie.
146 def movie_rename(self, newname):
147 scenedict = self._getmoviedict()
148 if self.movie_exists(newname):
149 raise error, 'Movie already exists: '+newname
150 del self.movies[self.curmovie]
151 self.movies[newname] = scenedict
152 self.curmovie = newname
153 self.modified = 1
155 # Copy a movie.
157 def movie_copy(self, newname):
158 scenedict = self._getmoviedict()
159 if self.movie_exists(newname):
160 raise error, 'Movie already exists: '+newname
161 newdict = {}
162 for k in scenedict.keys():
163 olddata = scenedict[k]
164 newdata = {}
165 for i in olddata.keys():
166 newdata[i] = olddata[i]
167 newdict[k] = newdata
168 self.movies[newname] = newdict
169 self.curmovie = newname
170 self.modified = 1
172 # Delete a movie.
174 def movie_delete(self):
175 if not self.curmovie:
176 raise error, 'No current movie'
177 del self.movies[self.curmovie]
178 self.curmovie = None
179 self.curscene = None
180 self.modified = 1
182 # Create a new movie.
184 def movie_new(self, name, pos):
185 if self.movie_exists(name):
186 raise error, 'Movie already exists: '+name
187 newdict = {}
188 newsdict = {}
189 newsdict['START'] = pos
190 newdict['-ALL-'] = newsdict
191 self.movies[name] = newdict
192 self.curmovie = name
193 self.curscene = None
194 self.modified = 1
196 # Does a scene exist?
198 def scene_exists(self, name):
199 scenedict = self._getmoviedict()
200 return scenedict.has_key(name)
202 # Select a current scene.
204 def scene_select(self, name):
205 scenedict = self._getmoviedict()
206 if not scenedict.has_key(name):
207 raise error, 'No such scene: '+name
208 self.curscene = name
210 # Rename a scene.
212 def scene_rename(self, newname):
213 scenedict = self._getmoviedict()
214 if not self.curscene:
215 raise error, 'No current scene'
216 if scenedict.has_key(newname):
217 raise error, 'Scene already exists: '+newname
218 if self.curscene == '-ALL-':
219 raise error, 'Cannot rename -ALL-'
220 scenedict[newname] = scenedict[self.curscene]
221 del scenedict[self.curscene]
222 self.curscene = newname
223 self.modified = 1
225 # Copy a scene.
227 def scene_copy(self, newname):
228 scenedict = self._getmoviedict()
229 if not self.curscene:
230 raise error, 'No current scene'
231 if scenedict.has_key(newname):
232 raise error, 'Scene already exists: '+newname
233 scenedict[newname] = scenedict[self.curscene]
234 self.curscene = newname
235 self.modified = 1
237 # Delete a scene.
239 def scene_delete(self):
240 scenedict = self._getmoviedict()
241 if not self.curscene:
242 raise error, 'No current scene'
243 if self.curscene == '-ALL-':
244 raise error, 'Cannot delete -ALL-'
245 del scenedict[self.curscene]
246 self.curscene = None
247 self.modified = 1
249 # Add a new scene.
251 def scene_new(self, newname, pos):
252 scenedict = self._getmoviedict()
253 if scenedict.has_key(newname):
254 raise error, 'Scene already exists: '+newname
255 newdict = {}
256 newdict['START'] = pos
257 scenedict[newname] = newdict
258 self.curscene = newname
259 self.modified = 1
261 # Get scene data.
263 def _getscenedata(self):
264 scenedict = self._getmoviedict()
265 if not self.curscene:
266 raise error, 'No current scene'
267 return scenedict[self.curscene]
269 # Data manipulation routines.
271 def pos_get(self):
272 return self._getscenedata()['START']
274 def pos_set(self, pos):
275 data = self._getscenedata()
276 data['START'] = pos
277 self.modified = 1
279 def comment_get(self):
280 data = self._getscenedata()
281 if data.has_key('COMMENT'):
282 return data['COMMENT']
283 else:
284 return ''
286 def comment_set(self, comment):
287 data = self._getscenedata()
288 data['COMMENT'] = comment
289 self.modified = 1
291 # Get the scene id of the current scene.
293 def get_cursceneid(self):
294 pos = self._getscenedata()['START']
295 str = '%02d:%02d:%02d:%02d ' % pos
296 return str + self.curscene
298 # Convert a scene id to a scene name.
300 def scene_id2name(self, id):
301 pos = string.find(id, ' ')
302 if pos <= 0:
303 raise error, 'Not a scene id: '+id
304 return id[pos+1:]
306 # Select a scene given a position.
308 def pos_select(self, pos):
309 prevmovie = None
310 movies = self.get_movienames()
311 for movie in movies:
312 mpos = self.movies[movie]['-ALL-']['START']
313 if mpos > pos:
314 break
315 prevmovie = movie
316 if not prevmovie:
317 raise error, 'Scene before BOT'
319 self.movie_select(prevmovie)
320 scenes = self.get_scenenames()
321 scenedict = self._getmoviedict()
322 prevscene = 'START'
323 for scene in scenes:
324 if scenedict[scene]['START'] > pos:
325 break
326 prevscene = scene
327 self.scene_select(prevscene)