def cmd_match(segment_kwargs, directory=None, match_all=False, fail_if_cut=False): if 'youtube' in segment_kwargs: video = ytdl_video(segment_kwargs['youtube']) elif 'direct' in segment_kwargs: video = Clip(segment_kwargs['direct'], ar=1000) template = video.slice(300, 300)[0] candidates = sorted( [s for s in streams.segments if can_match(s, segment_kwargs, directory, match_all)], key=lambda s: abs(int(s.abs_end - s.abs_start) - video.duration) ) original = None matching_stream = None video_offset = None for segment in candidates: path = original_video(segment, directory) print(f'Checking segment {segment.hash} (path: {path})', file=sys.stderr) original = Clip(path, ar=1000) try: offset, score = find_offset( template, original, start=int(segment.abs_start), end=int(segment.abs_end) - video.duration + 10 * 60, min_score=10) except Exception: continue offset -= 300 if score > 0: matching_stream = segment.stream video_offset = Timecode(round(offset)) break if matching_stream is None: print('Error: Video does not match any streams', file=sys.stderr) sys.exit(2) segment_kwargs['offset'] = video_offset if fail_if_cut: print('Checking for cuts...') diff = check_cuts(original, video, offset=video_offset.value) if diff > 1: print(f'Error: The video is {int(diff)} seconds shorter ' 'than the original.', file=sys.stderr) sys.exit(3) segment = cmd_add(matching_stream, segment_kwargs) return matching_stream, segment
def check_cuts(original_video, input_video, offset=0): template = input_video.slice(input_video.duration - 600, 300)[0] new_offset, _ = find_offset(template, original_video, start=offset, end=offset + int(input_video.duration), reverse=True, min_score=10) return new_offset - (input_video.duration - 600) - offset
def check_cuts(original_video, input_video, offset=0): duration = min(input_video.duration, original_video.duration) template = input_video.slice(duration - MATCH_OFFSET - MATCH_CHUNK, MATCH_CHUNK)[0] try: new_offset, _ = find_offset(template, original_video, start=offset, end=offset + int(duration), reverse=True, min_score=10) except Exception: return -255 return new_offset - (duration - MATCH_OFFSET - MATCH_CHUNK) - offset
def cmd_match(segment_kwargs, directory=None, match_all=False, fail_if_cut=False): if 'youtube' in segment_kwargs: dupes = [ s for s in streams.segments if s.youtube == segment_kwargs['youtube'] ] if len(dupes) != 0: print( f'Error: Video is already assigned to segment {dupes[0].hash}', file=sys.stderr) sys.exit(2) video = ytdl_video(segment_kwargs['youtube']) elif 'direct' in segment_kwargs: video = Clip(segment_kwargs['direct'], ar=1000) else: print('Error: Video source is not supported') sys.exit(2) segment_kwargs['duration'] = video.duration candidates = sorted(match_candidates(segment_kwargs, directory, match_all), key=lambda s: abs(int(s[1].duration) - video.duration)) if len(candidates) == 0: print('Error: No candidates found', file=sys.stderr) sys.exit(2) print('Possible candidates:') for segment, t_range, s_range in candidates: print(f' {segment.twitch} - {t_range} - {s_range}') print('Preparing template...', file=sys.stderr) template = video.slice(MATCH_OFFSET, MATCH_CHUNK)[0] original = None matching_segment = None video_offset = None for segment, _, s_range in candidates: path = original_video(segment, directory) print(f'Checking segment {segment.hash} {s_range} (path: {path})', file=sys.stderr) original = Clip(path, ar=1000) try: offset, score = find_offset(template, original, start=int(s_range.start), end=int(s_range.end), min_score=50) except Exception: continue offset -= MATCH_OFFSET if score == 0: continue video_offset = Timecode(round(offset)) print(f'Match found: segment {segment.hash}, offset {video_offset}', file=sys.stderr) if segment.stream.type == StreamType.JOINED and not fail_if_cut: print('Matching stream is joined, forcing --fail-if-cut') fail_if_cut = True if fail_if_cut: print('Checking for cuts...') diff = check_cuts(original, video, offset=int(video_offset)) if diff > 1: print( f'Error: The video is {int(diff)} seconds shorter ' 'than the original.', file=sys.stderr) continue matching_segment = segment break if matching_segment is None: print('Error: Video does not match any streams', file=sys.stderr) sys.exit(2) segment_kwargs['offset'] = video_offset if matching_segment.note: segment_kwargs['note'] = matching_segment.note if video_offset == 0 and fail_if_cut: if len(matching_segment.cuts) > 0: segment_kwargs['cuts'] = matching_segment._cuts if matching_segment.stream.type == StreamType.JOINED: segment_kwargs['offsets'] = matching_segment.offsets if matching_segment.offset(0) != 0: segment_kwargs['offset'] = matching_segment.offset(0) segment = cmd_add(matching_segment.stream, segment_kwargs) return matching_segment.stream, segment
def cmd_match(segment_kwargs, directory=None, match_all=False, fail_if_cut=False): if 'youtube' in segment_kwargs: dupes = [ s for s in streams.segments if s.youtube == segment_kwargs['youtube'] ] if len(dupes) != 0: print( f'Error: Video is already assigned to segment {dupes[0].hash}', file=sys.stderr) sys.exit(2) video = ytdl_video(segment_kwargs['youtube']) elif 'direct' in segment_kwargs: video = Clip(segment_kwargs['direct'], ar=1000) segment_kwargs['duration'] = video.duration candidates = sorted(match_candidates(segment_kwargs, directory, match_all), key=lambda s: abs(int(s[1].duration) - video.duration)) if len(candidates) == 0: print('Error: No candidates found', file=sys.stderr) sys.exit(2) print(f'Preparing template...', file=sys.stderr) template = video.slice(300, 300)[0] original = None matching_stream = None video_offset = None for segment, t_range in candidates: path = original_video(segment, directory) print(f'Checking segment {segment.hash} {t_range} (path: {path})', file=sys.stderr) original = Clip(path, ar=1000) start = t_range.value end = t_range.value + max(t_range.duration - video.duration, 0) + 600 try: offset, score = find_offset(template, original, start=start, end=end, min_score=10) except Exception: continue offset -= 300 if score > 0: matching_stream = segment.stream video_offset = Timecode(round(offset)) print( f'Match found: segment {segment.hash}, offset {video_offset}', file=sys.stderr) break if matching_stream is None: print('Error: Video does not match any streams', file=sys.stderr) sys.exit(2) segment_kwargs['offset'] = video_offset if fail_if_cut: print('Checking for cuts...') diff = check_cuts(original, video, offset=video_offset.value) if diff > 1: print( f'Error: The video is {int(diff)} seconds shorter ' 'than the original.', file=sys.stderr) sys.exit(3) segment = cmd_add(matching_stream, segment_kwargs) return matching_stream, segment