| 76 | self.args = args |
| 77 | |
| 78 | def run(self): |
| 79 | fns = {"srt": None, "media": None, "md": None} |
| 80 | for fn in self.args.inputs: |
| 81 | ext = os.path.splitext(fn)[1][1:] |
| 82 | fns[ext if ext in fns else "media"] = fn |
| 83 | |
| 84 | assert fns["media"], "must provide a media filename" |
| 85 | assert fns["srt"], "must provide a srt filename" |
| 86 | |
| 87 | is_video_file = utils.is_video(fns["media"].lower()) |
| 88 | outext = "mp4" if is_video_file else "mp3" |
| 89 | output_fn = utils.change_ext(utils.add_cut(fns["media"]), outext) |
| 90 | if utils.check_exists(output_fn, self.args.force): |
| 91 | return |
| 92 | |
| 93 | with open(fns["srt"], encoding=self.args.encoding) as f: |
| 94 | subs = list(srt.parse(f.read())) |
| 95 | |
| 96 | if fns["md"]: |
| 97 | md = utils.MD(fns["md"], self.args.encoding) |
| 98 | if not md.done_editing(): |
| 99 | return |
| 100 | index = [] |
| 101 | for mark, sent in md.tasks(): |
| 102 | if not mark: |
| 103 | continue |
| 104 | m = re.match(r"\[(\d+)", sent.strip()) |
| 105 | if m: |
| 106 | index.append(int(m.groups()[0])) |
| 107 | subs = [s for s in subs if s.index in index] |
| 108 | logging.info(f'Cut {fns["media"]} based on {fns["srt"]} and {fns["md"]}') |
| 109 | else: |
| 110 | logging.info(f'Cut {fns["media"]} based on {fns["srt"]}') |
| 111 | |
| 112 | segments = [] |
| 113 | # Avoid disordered subtitles |
| 114 | subs.sort(key=lambda x: x.start) |
| 115 | for x in subs: |
| 116 | if len(segments) == 0: |
| 117 | segments.append( |
| 118 | {"start": x.start.total_seconds(), "end": x.end.total_seconds()} |
| 119 | ) |
| 120 | else: |
| 121 | if x.start.total_seconds() - segments[-1]["end"] < 0.5: |
| 122 | segments[-1]["end"] = x.end.total_seconds() |
| 123 | else: |
| 124 | segments.append( |
| 125 | {"start": x.start.total_seconds(), "end": x.end.total_seconds()} |
| 126 | ) |
| 127 | |
| 128 | if is_video_file: |
| 129 | media = editor.VideoFileClip(fns["media"]) |
| 130 | else: |
| 131 | media = editor.AudioFileClip(fns["media"]) |
| 132 | |
| 133 | # Add a fade between two clips. Not quite necessary. keep code here for reference |
| 134 | # fade = 0 |
| 135 | # segments = _expand_segments(segments, fade, 0, video.duration) |