Files
twitch-highlight-detector/clipper/clipper.py
Vitalii Lebedynskyi 5cec84c26c Fixed clipper cut
2022-08-20 22:35:26 +03:00

87 lines
3.1 KiB
Python

import logging
import os
import subprocess
import sys
from datetime import datetime
from datetime import timedelta
logger = logging.getLogger(__name__)
class Clipper:
def run(self, video_file, chat_peaks_file, output_folder):
try:
self._run(video_file, chat_peaks_file, output_folder)
except BaseException as e:
logger.error(e)
def _run(self, source_video_file, chat_peaks_file, output_folder):
if not os.path.isdir(output_folder):
os.mkdir(output_folder)
with open(chat_peaks_file, "r") as stream:
lines = stream.readlines()
if not lines:
logger.error("No peaks found")
return
counter = 1
for line in lines:
# l = "2022-08-17 10:15 -> (1.0, 42.0)"
time_part = line.split("->")[1].strip() # (1.0, 42.0)
time = time_part.replace("(", "").replace(")", "").split(",")
video_time = datetime(2000, 1, 1, int(float(time[0])), int(float(time[1])), 0, 0)
start_time = video_time - timedelta(minutes=1)
end_time = video_time + timedelta(minutes=1)
ffmpeg_start_time = start_time.strftime("%H:%M:00")
ffmpeg_end_time = end_time.strftime("%H:%M:00")
ffmpeg_output_file = os.path.join(output_folder, f"clip_{counter}.mp4")
logger.info("ffmpeg start time %s", ffmpeg_start_time)
logger.info("ffmpeg end time %s", ffmpeg_end_time)
logger.info("ffmpeg output file %s", ffmpeg_output_file)
self._cut_clip(source_video_file, ffmpeg_start_time, ffmpeg_end_time, ffmpeg_output_file)
counter = counter + 1
def _cut_clip(self, source_video_file, start_time, end_time, output_name):
# ffmpeg -ss 00:01:00 -to 00:02:00 -i input.mp4 -c copy output.mp4
try:
subprocess.call([
"ffmpeg",
"-i",
source_video_file,
"-ss",
start_time,
"-to",
end_time,
"-c",
"copy",
"-err_detect",
"ignore_err",
output_name
])
except BaseException as e:
logger.error("Unable to run streamlink")
logger.error(e)
if __name__ == "__main__":
logging.basicConfig(stream=sys.stdout, level=logging.INFO)
args = sys.argv
if len(args) != 4:
logger.error("Wrong arguments passed")
logger.error("Usage clipper.py video_file chat_peaks_file output_folder")
exit(1)
video = args[1]
peaks = args[2]
result = args[3]
# "/Users/vetalll/Projects/Python/TwitchClipper/recorded/"
# video = "/Users/vetalll/Projects/Python/TwitchClipper/recorded/icebergdoto/17-08-2022_14-29-53/video.mp4"
# peaks = "/Users/vetalll/Projects/Python/TwitchClipper/recorded/icebergdoto/17-08-2022_14-29-53/chat_peaks.txt"
# result = "/Users/vetalll/Projects/Python/TwitchClipper/recorded/icebergdoto/17-08-2022_14-29-53/clips"
clipper = Clipper()
clipper.run(video, peaks, result)