class Videos( Handler ): def __init__(self): self.db = MythDB() self.be = MythBE(db=db) self.vids = {} self._addCallback = doNothing self._events = [self.handleUpdate] self.be.registerevent(self.handleUpdate) def add(self, vid): if not vid.browse: return if vid.intid in self.vids: return vid.path = vid.filename vid.attr = Attr() try: ctime = vid.insertdate.timestamp() except: ctime = 0 vid.attr.st_ctime = ctime vid.attr.st_atime = atime vid.attr.st_mtime = ctime vid.attr.st_mode = stat.S_IFREG | 0444 t,s = self.be.getSGFile(vid.host, 'Videos', vid.filename) vid.attr.st_size = int(s) self._addCallback(vid) self.vids[vid.intid] = vid.attr.st_ino def getAll(self): for vid in Video.getAllEntries(db=self.db): self.add(vid) def handleUpdate(self, event=None): if event is None: self._reUp = re.compile( re.escape(static.BACKEND_SEP).\ join(['BACKEND_MESSAGE', 'VIDEO_LIST_CHANGE', 'empty'])) return self._reUp with self.db as cursor: cursor.execute("""SELECT intid FROM videometadata""") newids = [id[0] for id in cursor.fetchall()] oldids = self.vids.keys() for id in list(oldids): if id in newids: oldids.remove(id) newids.remove(id) for id in oldids: self._deleteCallback(self.vids[id]) for id in newids: self.add(Video(id, db=self.db))
class Videos(Handler): def __init__(self): self.db = MythDB() self.be = MythBE(db=db) self.vids = {} self._addCallback = doNothing self._events = [self.handleUpdate] self.be.registerevent(self.handleUpdate) def add(self, vid): if not vid.browse: return if vid.intid in self.vids: return vid.path = vid.filename vid.attr = Attr() try: ctime = vid.insertdate.timestamp() except: ctime = 0 vid.attr.st_ctime = ctime vid.attr.st_atime = atime vid.attr.st_mtime = ctime vid.attr.st_mode = stat.S_IFREG | 0444 t, s = self.be.getSGFile(vid.host, 'Videos', vid.filename) vid.attr.st_size = int(s) self._addCallback(vid) self.vids[vid.intid] = vid.attr.st_ino def getAll(self): for vid in Video.getAllEntries(db=self.db): self.add(vid) def handleUpdate(self, event=None): if event is None: self._reUp = re.compile( re.escape(static.BACKEND_SEP).\ join(['BACKEND_MESSAGE', 'VIDEO_LIST_CHANGE', 'empty'])) return self._reUp with self.db as cursor: cursor.execute("""SELECT intid FROM videometadata""") newids = [id[0] for id in cursor.fetchall()] oldids = self.vids.keys() for id in list(oldids): if id in newids: oldids.remove(id) newids.remove(id) for id in oldids: self._deleteCallback(self.vids[id]) for id in newids: self.add(Video(id, db=self.db))
class Recordings( Handler ): def __init__(self): self.be = MythBE() self.recs = {} self._events = [self.handleAdd, self.handleDelete, self.handleUpdate] for e in self._events: self.be.registerevent(e) def add(self, rec): # check for duplicates match = (str(rec.chanid),rec.recstartts.isoformat()) if match in self.recs: return # add attributes rec.attr = Attr() ctime = rec.lastmodified.timestamp() rec.attr.st_ctime = ctime rec.attr.st_mtime = ctime rec.attr.st_atime = ctime rec.attr.st_size = rec.filesize rec.attr.st_mode = stat.S_IFREG | 0444 # process name rec.path = rec.formatPath(self.fmt, ' ') # add file self._addCallback(rec) self.recs[match] = rec.attr.st_ino def genAttr(self, rec): attr = Attr() ctime = rec.lastmodified.timestamp() attr.st_ctime = ctime attr.st_mtime = ctime attr.st_atime = ctime attr.st_size = rec.filesize attr.st_mode = stat.S_IFREG | 0444 return attr def getAll(self): for rec in self.be.getRecordings(): self.add(rec) def handleAdd(self, event=None): if event is None: self._reAdd = re.compile( re.escape(static.BACKEND_SEP).\ join(['BACKEND_MESSAGE', 'RECORDING_LIST_CHANGE ADD ' '(?P<chanid>[0-9]*) ' '(?P<starttime>[0-9-]*T[0-9:]*)', 'empty'])) return self._reAdd LOG(LOG.FILE, 'add event received', event) match = self._reAdd.match(event).groups() if match in self.recs: return rec = self.be.getRecording(match[0], match[1]) self.add(rec) def handleDelete(self, event=None): if event is None: self._reDel = re.compile( re.escape(static.BACKEND_SEP).\ join(['BACKEND_MESSAGE', 'RECORDING_LIST_CHANGE DELETE ' '(?P<chanid>[0-9]*) ' '(?P<starttime>[0-9-]*T[0-9:]*)', 'empty'])) return self._reDel LOG(LOG.FILE, 'delete event received', event) match = self._reDel.match(event).groups() if match not in self.recs: return self._deleteCallback(self.recs[match]) del self.recs[match] def handleUpdate(self, event=None): if event is None: self._reUp = re.compile( re.escape(static.BACKEND_SEP).\ join(['BACKEND_MESSAGE', 'UPDATE_FILE_SIZE ' '(?P<chanid>[0-9]*) ' '(?P<starttime>[0-9-]*T[0-9:]*) ' '(?P<size>[0-9]*)', 'empty'])) return self._reUp LOG(LOG.FILE, 'update event received', event) match = self._reUp.match(event) size = match.group(3) match = match.group(1,2) if match not in self.recs: return inode = self.recs[match] rec = self._inodeCallback(inode) rec.filesize = int(size) rec.attr.st_size = int(size) def setFormat(self, fmt): if '%' not in fmt: LOG(LOG.FILE, 'pulling format from database', 'mythfs.format.%s' % fmt) fmt = self.be.db.settings.NULL['mythfs.format.%s' % fmt] LOG(LOG.FILE, 'using format', fmt) self.fmt = fmt
class Recordings(Handler): def __init__(self): self.be = MythBE() self.recs = {} self._events = [self.handleAdd, self.handleDelete, self.handleUpdate] for e in self._events: self.be.registerevent(e) def add(self, rec): # check for duplicates match = (str(rec.chanid), rec.recstartts.isoformat()) if match in self.recs: return # add attributes rec.attr = Attr() ctime = rec.lastmodified.timestamp() rec.attr.st_ctime = ctime rec.attr.st_mtime = ctime rec.attr.st_atime = ctime rec.attr.st_size = rec.filesize rec.attr.st_mode = stat.S_IFREG | 0444 # process name rec.path = rec.formatPath(self.fmt, ' ') # add file self._addCallback(rec) self.recs[match] = rec.attr.st_ino def genAttr(self, rec): attr = Attr() ctime = rec.lastmodified.timestamp() attr.st_ctime = ctime attr.st_mtime = ctime attr.st_atime = ctime attr.st_size = rec.filesize attr.st_mode = stat.S_IFREG | 0444 return attr def getAll(self): for rec in self.be.getRecordings(): self.add(rec) def handleAdd(self, event=None): if event is None: self._reAdd = re.compile( re.escape(static.BACKEND_SEP).\ join(['BACKEND_MESSAGE', 'RECORDING_LIST_CHANGE ADD ' '(?P<chanid>[0-9]*) ' '(?P<starttime>[0-9-]*T[0-9:]*)', 'empty'])) return self._reAdd LOG(LOG.FILE, 'add event received', event) match = self._reAdd.match(event).groups() if match in self.recs: return rec = self.be.getRecording(match[0], match[1]) self.add(rec) def handleDelete(self, event=None): if event is None: self._reDel = re.compile( re.escape(static.BACKEND_SEP).\ join(['BACKEND_MESSAGE', 'RECORDING_LIST_CHANGE DELETE ' '(?P<chanid>[0-9]*) ' '(?P<starttime>[0-9-]*T[0-9:]*)', 'empty'])) return self._reDel LOG(LOG.FILE, 'delete event received', event) match = self._reDel.match(event).groups() if match not in self.recs: return self._deleteCallback(self.recs[match]) del self.recs[match] def handleUpdate(self, event=None): if event is None: self._reUp = re.compile( re.escape(static.BACKEND_SEP).\ join(['BACKEND_MESSAGE', 'UPDATE_FILE_SIZE ' '(?P<chanid>[0-9]*) ' '(?P<starttime>[0-9-]*T[0-9:]*) ' '(?P<size>[0-9]*)', 'empty'])) return self._reUp LOG(LOG.FILE, 'update event received', event) match = self._reUp.match(event) size = match.group(3) match = match.group(1, 2) if match not in self.recs: return inode = self.recs[match] rec = self._inodeCallback(inode) rec.filesize = int(size) rec.attr.st_size = int(size) def setFormat(self, fmt): if '%' not in fmt: LOG(LOG.FILE, 'pulling format from database', 'mythfs.format.%s' % fmt) fmt = self.be.db.settings.NULL['mythfs.format.%s' % fmt] LOG(LOG.FILE, 'using format', fmt) self.fmt = fmt