def parse(self): """Parse dairies from database.""" Log.debug("Extracting diaries from database...") tables = { 'CameraDairy': { 'name': 'TB_CameraDairy', }, 'IPUDairy': { 'name': 'TB_IPUDairy', }, 'ISC3Dairy': { 'name': 'TB_ISC3Dairy', }, 'SensorDairy': { 'name': 'TB_SensorDairy', } } # get dairies from database with sqlite3.connect(self.database) as con: con.row_factory = dict_factory cur = con.cursor() for key in tables.keys(): name = tables[key]['name'] cur.execute(f"SELECT * FROM {name}") tables[key]['data'] = cur.fetchall() Log.debug("Successfully parsed data from database.") self.save(tables)
def parse(self): """Parse timeline from database.""" Log.debug("Extracting activities from database...") with sqlite3.connect(self.database) as con: con.row_factory = dict_factory cur = con.cursor() cur.execute("SELECT * FROM TIMELINE") activities = cur.fetchall() documents = [] for activity in activities: documents.append({ 'time': self.convert_time(activity['date'], activity['time']), 'user': activity['user'], 'short': activity['short'], 'desc': activity['desc'], 'notes': activity['notes'] }) Log.info("Successfully parsed data from database.") self.save(documents)
def parse(self): """Parse activity from database.""" Log.debug("Extracting activities from database...") with sqlite3.connect(self.database) as con: con.row_factory = dict_factory cur = con.cursor() cur.execute("SELECT * FROM Elements WHERE Type='activity'") data = cur.fetchall() Log.debug("Successfully parsed activities from database.") self.save(data)
def extract(self, merge, frame, add_timeline): """Extract frames from database.""" Log.debug("Extracting videos from database...") if frame: with sqlite3.connect(self.database) as con: cur = con.cursor() cur.execute("SELECT frame_time, gop_start_rowid, sps_bytes, pps_bytes, frame_bytes, chunk_complete FROM frame_raw_data_table") rows = cur.fetchall() sps_bytes = None pps_bytes = None videobuf = None count = 0 timestamps_by_video = {} frames_by_video = {} for frame in rows: frame_time, gop_start_rowid, _sps_bytes, _pps_bytes, frame_bytes, chunk_complete = frame if gop_start_rowid == -1: # set new sps and pps bytes sps_bytes = _sps_bytes pps_bytes = _pps_bytes videobuf = pps_bytes + sps_bytes + frame_bytes timestamps_by_video[count] = [frame_time] else: videobuf = videobuf + frame_bytes timestamps_by_video[count].append(frame_time) if chunk_complete == 1: frames_by_video[count] = videobuf sps_bytes = None pps_bytes = None videobuf = None count += 1 if videobuf: frames_by_video[count] = videobuf for key in frames_by_video.keys(): # save h264 file with open(os.path.join(self.output, f'{key}.h264'), 'wb') as f: f.write(frames_by_video[key]) i = 0 for timestamp in timestamps_by_video[key]: os.system(f'ffmpeg -i {self.output}/{key}.h264 -c:v libx264 -filter:v "select=gte(n\,{i})" -frames:v 1 -f h264 {self.output}/{key}_{i}.h264') os.system(f'ffmpeg -i {self.output}/{key}_{i}.h264 -frames:v 1 -f image2 {self.output}/{self._gen_filename(timestamp)}.png') os.remove(f'{self.output}/{key}_{i}.h264') i += 1 os.remove(f'{self.output}/{key}.h264') Log.info(f"Successfully saved image by frame.") else: with sqlite3.connect(self.database) as con: cur = con.cursor() cur.execute("SELECT * FROM frame_raw_data_table") rows = cur.fetchall() videobuf = "" # temporary buffer for constructing video videoname = "" # name of video file count = 0 # video file counter for row in rows: if row[4]: if videoname: with open(videoname, "wb") as f: f.write(videobuf) self.rawvideos.append(videoname) videobuf = row[5] videobuf += row[4] videobuf += row[6] videoname = os.path.join(self.output, f"{count}.tmp") self.videotimes[videoname] = [row[0]] count += 1 else: videobuf = videobuf + row[6] if row[0] not in self.videotimes[videoname]: self.videotimes[videoname].append(row[0]) if videobuf: with open(videoname, "wb") as f: f.write(videobuf) self.rawvideos.append(videoname) Log.info(f"Successfully extrated {count} video files.") self.save(merge) documents = [] for filename in self.videotimes.keys(): runtime = self.videotimes[filename] start, end = to_datetime(runtime[0]), to_datetime(runtime[-1]) filename = os.path.basename(filename).replace('tmp', 'mp4') documents.append({ 'start_time': start, 'end_time': end, 'filename': filename }) # write history as file with open(os.path.join(self.output, 'video_list.txt'), 'w') as f: for document in documents: f.write(f"{document['filename']}: {document['start_time']} - {document['end_time']}\n") # upload to elasticsearch for add timeline if add_timeline: with Elastic(index='nest', doc_type='video') as elastic: elastic.upload(documents, 'start_time')