| # |
| # 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 |
| try: |
| fp = open(name, 'r') |
| except IOError: |
| self.movies = {} |
| return |
| 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 |
| if header <> VERSION_STRING: |
| print 'VcrIndex: incorrect version string:', header |
| self.movies = {} |
| return |
| data = fp.read(100000) |
| self.movies = eval(data) |
| # |
| # 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) |