def import_ses(self, path: Path, scening_list: SceningList, out_of_range_count: int) -> None: ''' Imports bookmarks as single-frame scenes ''' import pickle with path.open('rb') as f: try: session = pickle.load(f) except pickle.UnpicklingError: logging.warning('Scening import: failed to load .ses file.') return if 'bookmarks' not in session: return for bookmark in session['bookmarks']: scening_list.add(Frame(bookmark[0]))
def import_ogm_chapters(self, path: Path, scening_list: SceningList, out_of_range_count: int) -> None: ''' Imports chapters as signle-frame scenes. Uses NAME for scene label. ''' pattern = re.compile( r'(CHAPTER\d+)=(\d{2}):(\d{2}):(\d{2}(?:\.\d{3})?)\n\1NAME=(.*)', re.RegexFlag.MULTILINE) for match in pattern.finditer(path.read_text()): time = Time( hours = int(match[2]), minutes = int(match[3]), seconds = float(match[4])) try: scening_list.add(Frame(time), label=match[5]) except ValueError: out_of_range_count += 1
def import_tfm(self, path: Path, scening_list: SceningList, out_of_range_count: int) -> None: ''' Imports TFM's 'OVR HELP INFORMATION'. Single combed frames are put into single-frame scenes. Frame groups are put into regular scenes. Combed probability is used for label. ''' class TFMFrame(Frame): mic: Optional[int] tfm_frame_pattern = re.compile(r'(\d+)\s\((\d+)\)') tfm_group_pattern = re.compile(r'(\d+),(\d+)\s\((\d+(?:\.\d+)%)\)') log = path.read_text() start_pos = log.find('OVR HELP INFORMATION') if start_pos == -1: logging.warning( 'Scening import: TFM log doesn\'t contain OVR Help Information.' ) return log = log[start_pos:] tfm_frames: Set[TFMFrame] = set() for match in tfm_frame_pattern.finditer(log): tfm_frame = TFMFrame(int(match[1])) tfm_frame.mic = int(match[2]) tfm_frames.add(tfm_frame) for match in tfm_group_pattern.finditer(log): try: scene = scening_list.add(Frame(int(match[1])), Frame(int(match[2])), '{} combed'.format(match[3])) except ValueError: out_of_range_count += 1 continue tfm_frames -= set(range(int(scene.start), int(scene.end) + 1)) for tfm_frame in tfm_frames: try: scening_list.add(tfm_frame, label=str(tfm_frame.mic)) except ValueError: out_of_range_count += 1
def import_cue(self, path: Path, scening_list: SceningList, out_of_range_count: int) -> None: ''' Imports tracks as scenes. Uses TITLE for scene label. ''' from cueparser import CueSheet def offset_to_time(offset: str) -> Optional[Time]: pattern = re.compile(r'(\d{1,2}):(\d{1,2}):(\d{1,2})') match = pattern.match(offset) if match is None: return None return Time( minutes = int(match[1]), seconds = int(match[2]), milliseconds = int(match[3]) / 75 * 1000) cue_sheet = CueSheet() cue_sheet.setOutputFormat('') cue_sheet.setData(path.read_text()) cue_sheet.parse() for track in cue_sheet.tracks: if track.offset is None: continue offset = offset_to_time(track.offset) if offset is None: logging.warning( f'Scening import: INDEX timestamp \'{track.offset}\'' ' format isn\'t suported.') continue start = Frame(offset) end = None if track.duration is not None: end = Frame(offset + TimeInterval(track.duration)) label = '' if track.title is not None: label = track.title try: scening_list.add(start, end, label) except ValueError: out_of_range_count += 1