def split(args): """必要なストリームのみ残す""" remained_pids = set() with tsopen(args.inpath) as ts: pat = next(ts.sections(ProgramAssociationSection)) # 置き換え後の新しいPAT new_pat = replace_pat(pat._packet) remained_pmt_pid = next(pat.pmt_pids) remained_pids.add(remained_pmt_pid) ProgramMapSection._pids = [remained_pmt_pid] pmt = next(ts.sections(ProgramMapSection)) # PCRと最初のストリームのPIDを残す remained_pids.add(pmt.PCR_PID) remained_pids.update(pmt_map.elementary_PID for pmt_map in pmt.maps if pmt_map.stream_type != 0x0d) pat_pid = ProgramAssociationSection._pids[0] with tsopen(args.inpath) as ts, open(args.outpath, 'wb') as out: for p in ts: pid = packet.pid(p) if pid == pat_pid: out.write(p[:5]) out.write(new_pat) elif pid in remained_pids: out.write(p)
def vtt(args): if args.outpath == '-': outpath = sys.stdout.fileno() else: outpath = args.outpath with tsopen(args.inpath) as ts, open(outpath, 'w') as out: SynchronizedPacketizedElementaryStream._pids = [ts.get_caption_pid()] base_pcr = next(ts.pcrs()) base_time = next(ts.sections(TimeOffsetSection)).JST_time out.write('WEBVTT\n\n') number = 1 base_date = datetime(2000, 1, 1) #fixme: DRCS処理を隠蔽して字幕文字オブジェクトだけ返すラッパークラスが必要 # for caption in ts.captions(drcs=True, color=True): # print(caption.datetime, caption.body) みたいな prev_caption_date = None prev_caption = '' for spes in ts.sections(SynchronizedPacketizedElementaryStream): caption_date = base_date + (spes.pts - base_pcr) for data in spes.data_units: if data.data_unit_parameter == 0x20: caption = WebVTTCProfileString(data.data_unit_data) if prev_caption_date: out.write('{}\n{}.{:03d} --> {}.{:03d}\n{}\n\n'.format( number, prev_caption_date.strftime('%H:%M:%S'), prev_caption_date.microsecond // 1000, caption_date.strftime('%H:%M:%S'), caption_date.microsecond // 1000, prev_caption)) number += 1 prev_caption_date = caption_date prev_caption = caption if prev_caption: out.write('{}\n{}.{:03d} --> {}.{:03d}\n{}\n\n'.format( number, prev_caption_date.strftime('%H:%M:%S'), prev_caption_date.microsecond // 1000, caption_date.strftime('%H:%M:%S'), caption_date.microsecond // 1000, prev_caption))
nibble.content_nibble_level_2]) self.user_nibble.append(nibble.user_nibble) self.user_genre.append(USER_TYPE.get(nibble.user_nibble, '')) detail = [('', [])] for eed in desc.get(ExtendedEventDescriptor, []): for item in eed.items: key = item.item_description_char # タイトルが空か一つ前と同じ場合は本文を一つ前のものにつなげる if str(key) == '' or str(detail[-1][0]) == str(key): detail[-1][1].extend(item.item_char) else: detail.append((key, item.item_char)) detail = [(str(key), AribString(value)) for key, value in detail[1:]] if detail: self.detail = dict(detail) self.longdesc = '\n'.join("{}\n{}\n".format(key, value) for key, value in detail) if __name__ == '__main__': from subprocess import Popen, PIPE from ariblib import tsopen recpt1 = Popen(['recpt1', '236', '130', '-'], stdout=PIPE) with tsopen(recpt1.stdout.fileno()) as ts: for event in events(ts): print(dir(event)) try: print(event.title, event.free_CA_mode) except: pass
CONTENT_TYPE[nibble.content_nibble_level_1][1] [nibble.content_nibble_level_2]) self.user_nibble.append(nibble.user_nibble) self.user_genre.append(USER_TYPE.get(nibble.user_nibble, '')) detail = [('', [])] for eed in desc.get(ExtendedEventDescriptor, []): for item in eed.items: key = item.item_description_char # タイトルが空か一つ前と同じ場合は本文を一つ前のものにつなげる if str(key) == '' or str(detail[-1][0]) == str(key): detail[-1][1].extend(item.item_char) else: detail.append((key, item.item_char)) detail = [(str(key), AribString(value)) for key, value in detail[1:]] if detail: self.detail = dict(detail) self.longdesc = '\n'.join( "{}\n{}\n".format(key, value) for key, value in detail) if __name__ == '__main__': from subprocess import Popen, PIPE from ariblib import tsopen recpt1 = Popen(['recpt1', '236', '130', '-'], stdout=PIPE) with tsopen(recpt1.stdout.fileno()) as ts: for event in events(ts): print(dir(event)) try: print(event.title, event.free_CA_mode) except: pass