summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xDemo/sgi/video/VcrIndex.py328
1 files changed, 328 insertions, 0 deletions
diff --git a/Demo/sgi/video/VcrIndex.py b/Demo/sgi/video/VcrIndex.py
new file mode 100755
index 0000000..d73342b
--- /dev/null
+++ b/Demo/sgi/video/VcrIndex.py
@@ -0,0 +1,328 @@
+#
+# A VCR index.
+#
+import os
+import string
+
+error='VcrIndex.error'
+VERSION_STRING='#!VcrIndex 1.1\n'
+PREV_VERSION_STRING='#!VcrIndex 1.0\n'
+
+class VcrIndex:
+ def init(self, name):
+ self.curmovie = None
+ self.curscene = None
+ self.modified = 0
+ self.filename = name
+ self.basename = os.path.basename(name)
+ self.editable = []
+ if not name:
+ self.movies = {}
+ return self
+ try:
+ fp = open(name, 'r')
+ except IOError:
+ self.movies = {}
+ return self
+ header = fp.readline()
+ if header == PREV_VERSION_STRING:
+ print 'Converting old-format database...'
+ data = fp.read(100000)
+ self.movies = eval(data)
+ for m in self.movies.keys():
+ d = self.movies[m]
+ newd = {}
+ for s in d.keys():
+ newsd = {}
+ newsd['START'] = d[s]
+ if s == 'START':
+ s = '-ALL-'
+ newd[s] = newsd
+
+ self.movies[m] = newd
+ print 'Done.'
+ return self
+ if header <> VERSION_STRING:
+ print 'VcrIndex: incorrect version string:', header
+ self.movies = {}
+ return self
+ data = fp.read(100000)
+ self.movies = eval(data)
+ return self
+ #
+ # Save database to given file (or same file as read from if no
+ # filename given).
+ #
+ def save(self, name):
+ if not name:
+ name = self.filename
+ if not name:
+ raise error, 'No filename given'
+ self.filename = name
+ bupname = name + '~'
+ try:
+ os.unlink(bupname)
+ except os.error:
+ pass
+ try:
+ os.rename(name, bupname)
+ except os.error:
+ pass
+ fp = open(name, 'w')
+ data = str(self.movies)
+ fp.write(VERSION_STRING)
+ fp.write(data)
+ fp.write('\n')
+ fp.close()
+ self.modified = 0
+ #
+ # Get a list of movie names in tape order
+ #
+ def get_movienames(self):
+ names = self.movies.keys()
+ sorted = []
+ for name in names:
+ sorted.append(self.movies[name]['-ALL-']['START'], name)
+ sorted.sort()
+ rv = []
+ for pos, name in sorted:
+ rv.append(name)
+ return rv
+ #
+ # Get a list of scene names in tape order
+ #
+ def get_scenenames(self):
+ if not self.curmovie:
+ return []
+ scenedict = self.movies[self.curmovie]
+ names = scenedict.keys()
+ sorted = []
+ for name in names:
+ sorted.append(scenedict[name], name)
+ sorted.sort()
+ rv = []
+ for pos, name in sorted:
+ rv.append(name)
+ return rv
+ #
+ # Get a list of scene ids (format '00:02:32:12 name') in tape order
+ #
+ def get_sceneids(self):
+ if not self.curmovie:
+ return []
+ scenedict = self.movies[self.curmovie]
+ names = scenedict.keys()
+ sorted = []
+ for name in names:
+ sorted.append(scenedict[name]['START'], name)
+ sorted.sort()
+ rv = []
+ for pos, name in sorted:
+ str = '%02d:%02d:%02d:%02d ' % pos
+ rv.append(str + name)
+ return rv
+ #
+ # Does a movie exist?
+ #
+ def movie_exists(self, name):
+ return self.movies.has_key(name)
+ #
+ # Select a movie.
+ #
+ def movie_select(self, name):
+ if not self.movies.has_key(name):
+ raise error, 'No such movie: '+name
+ self.curmovie = name
+ self.curscene = None
+ #
+ # Get movie dictionary, or raise an error if no current movie.
+ #
+ def _getmoviedict(self):
+ if not self.curmovie:
+ raise error, 'No current movie'
+ return self.movies[self.curmovie]
+ #
+ # Rename a movie.
+ #
+ def movie_rename(self, newname):
+ scenedict = self._getmoviedict()
+ if self.movie_exists(newname):
+ raise error, 'Movie already exists: '+newname
+ del self.movies[self.curmovie]
+ self.movies[newname] = scenedict
+ self.curmovie = newname
+ self.modified = 1
+ #
+ # Copy a movie.
+ #
+ def movie_copy(self, newname):
+ scenedict = self._getmoviedict()
+ if self.movie_exists(newname):
+ raise error, 'Movie already exists: '+newname
+ newdict = {}
+ for k in scenedict.keys():
+ olddata = scenedict[k]
+ newdata = {}
+ for i in olddata.keys():
+ newdata[i] = olddata[i]
+ newdict[k] = newdata
+ self.movies[newname] = newdict
+ self.curmovie = newname
+ self.modified = 1
+ #
+ # Delete a movie.
+ #
+ def movie_delete(self):
+ if not self.curmovie:
+ raise error, 'No current movie'
+ del self.movies[self.curmovie]
+ self.curmovie = None
+ self.curscene = None
+ self.modified = 1
+ #
+ # Create a new movie.
+ #
+ def movie_new(self, name, pos):
+ if self.movie_exists(name):
+ raise error, 'Movie already exists: '+name
+ newdict = {}
+ newsdict = {}
+ newsdict['START'] = pos
+ newdict['-ALL-'] = newsdict
+ self.movies[name] = newdict
+ self.curmovie = name
+ self.curscene = None
+ self.modified = 1
+ #
+ # Does a scene exist?
+ #
+ def scene_exists(self, name):
+ scenedict = self._getmoviedict()
+ return scenedict.has_key(name)
+ #
+ # Select a current scene.
+ #
+ def scene_select(self, name):
+ scenedict = self._getmoviedict()
+ if not scenedict.has_key(name):
+ raise error, 'No such scene: '+name
+ self.curscene = name
+ #
+ # Rename a scene.
+ #
+ def scene_rename(self, newname):
+ scenedict = self._getmoviedict()
+ if not self.curscene:
+ raise error, 'No current scene'
+ if scenedict.has_key(newname):
+ raise error, 'Scene already exists: '+newname
+ if self.curscene == '-ALL-':
+ raise error, 'Cannot rename -ALL-'
+ scenedict[newname] = scenedict[self.curscene]
+ del scenedict[self.curscene]
+ self.curscene = newname
+ self.modified = 1
+ #
+ # Copy a scene.
+ #
+ def scene_copy(self, newname):
+ scenedict = self._getmoviedict()
+ if not self.curscene:
+ raise error, 'No current scene'
+ if scenedict.has_key(newname):
+ raise error, 'Scene already exists: '+newname
+ scenedict[newname] = scenedict[self.curscene]
+ self.curscene = newname
+ self.modified = 1
+ #
+ # Delete a scene.
+ #
+ def scene_delete(self):
+ scenedict = self._getmoviedict()
+ if not self.curscene:
+ raise error, 'No current scene'
+ if self.curscene == '-ALL-':
+ raise error, 'Cannot delete -ALL-'
+ del scenedict[self.curscene]
+ self.curscene = None
+ self.modified = 1
+ #
+ # Add a new scene.
+ #
+ def scene_new(self, newname, pos):
+ scenedict = self._getmoviedict()
+ if scenedict.has_key(newname):
+ raise error, 'Scene already exists: '+newname
+ newdict = {}
+ newdict['START'] = pos
+ scenedict[newname] = newdict
+ self.curscene = newname
+ self.modified = 1
+ #
+ # Get scene data.
+ #
+ def _getscenedata(self):
+ scenedict = self._getmoviedict()
+ if not self.curscene:
+ raise error, 'No current scene'
+ return scenedict[self.curscene]
+ #
+ # Data manipulation routines.
+ #
+ def pos_get(self):
+ return self._getscenedata()['START']
+ #
+ def pos_set(self, pos):
+ data = self._getscenedata()
+ data['START'] = pos
+ self.modified = 1
+ #
+ def comment_get(self):
+ data = self._getscenedata()
+ if data.has_key('COMMENT'):
+ return data['COMMENT']
+ else:
+ return ''
+ #
+ def comment_set(self, comment):
+ data = self._getscenedata()
+ data['COMMENT'] = comment
+ self.modified = 1
+ #
+ # Get the scene id of the current scene.
+ #
+ def get_cursceneid(self):
+ pos = self._getscenedata()['START']
+ str = '%02d:%02d:%02d:%02d ' % pos
+ return str + self.curscene
+ #
+ # Convert a scene id to a scene name.
+ #
+ def scene_id2name(self, id):
+ pos = string.find(id, ' ')
+ if pos <= 0:
+ raise error, 'Not a scene id: '+id
+ return id[pos+1:]
+ #
+ # Select a scene given a position.
+ #
+ def pos_select(self, pos):
+ prevmovie = None
+ movies = self.get_movienames()
+ for movie in movies:
+ mpos = self.movies[movie]['-ALL-']['START']
+ if mpos > pos:
+ break
+ prevmovie = movie
+ if not prevmovie:
+ raise error, 'Scene before BOT'
+
+ self.movie_select(prevmovie)
+ scenes = self.get_scenenames()
+ scenedict = self._getmoviedict()
+ prevscene = 'START'
+ for scene in scenes:
+ if scenedict[scene]['START'] > pos:
+ break
+ prevscene = scene
+ self.scene_select(prevscene)