blob: 80212ee56193e0deb39444a924df883e7d583abc [file] [log] [blame]
#
# 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)