diff --git a/Dockerfile b/Dockerfile index ce0d7ba..bca6aa6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,10 +10,12 @@ WORKDIR /app ADD requirements.txt /app/requirements.txt RUN pip install -r requirements.txt RUN python3 -m spacy download en_core_web_sm -ADD . /app # tricks for pytube : https://github.com/elebumm/RedditVideoMakerBot/issues/142 # (NOTE : This is no longer useful since pytube was removed from the dependencies) # RUN sed -i 's/re.compile(r"^\\w+\\W")/re.compile(r"^\\$*\\w+\\W")/' /usr/local/lib/python3.8/dist-packages/pytube/cipher.py RUN echo ZmluZCAvIC1wYXRoICcqL21vdmllcHkvdG9vbHMucHknIC1wcmludDAgfCB3aGlsZSByZWFkIC1kICQnXDAnIGZpbGU7IGRvCiAgc2VkIC1pIC1lICdzLyciJyInTW92aWVweSAtIFJ1bm5pbmc6XFxuPj4+ICIrICIgIi5qb2luKGNtZCknIiciJy8iTW92aWVweSAtIFJ1bm5pbmc6XFxuPj4+ICIgKyAiICIuam9pbihjbWQpL2cnICIkZmlsZSIKZG9uZQ== | base64 --decode | bash + +ADD . /app + CMD ["python3", "main.py"] diff --git a/utils/ffmpeg.py b/utils/ffmpeg.py index 60d1b80..ccba26d 100644 --- a/utils/ffmpeg.py +++ b/utils/ffmpeg.py @@ -1,56 +1,57 @@ import ffmpeg from pydub import AudioSegment -# from moviepy.editor import VideoFileClip, AudioFileClip +from moviepy.editor import VideoFileClip, AudioFileClip # from tqdm import tqdm from rich.progress import Progress, BarColumn, TextColumn, TaskProgressColumn, TimeRemainingColumn from utils.ffmpeg_progress import ProgressFfmpeg -def get_duration(filename): - # ffmpeg_cmd = ffmpeg.input(filename).output('/dev/null', f="null", progress='/dev/stdout') - # ffmpeg_stdout, ffmpeg_stderr = ffmpeg_cmd.run(capture_stdout=True, capture_stderr=True) - # stdout=ffmpeg_stdout.decode('UTF-8') - # stdout_lines=stdout.splitlines() - # for line in reversed(stdout_lines): - # if "out_time_ms" in line: - # out_time_ms_str = line.split("=")[1].strip() - # if out_time_ms_str.isnumeric(): - # duration=float(out_time_ms_str) / 1000000.0 - # # print(f"Returning duration {duration} from ffmpeg null muxer out_time_ms for {filename}...") - # return duration - # stderr=ffmpeg_stderr.decode('UTF-8') - # stderr_lines=stderr.splitlines() - # stream_durations=[] - # for line in reversed(stderr_lines): - # if "Duration:" in line: - # timestamp = line.split("Duration:")[1].strip().split(',')[0].strip() - # h, m, s_ms = timestamp.split(':') - # s, ms = s_ms.split('.') - # stream_durations.append(int(h) * 3600 + int(m) * 60 + int(s) + float(f".{ms}")) - # if len(stream_durations) > 0: - # duration=max(stream_durations) # sum? - # # print(f"Returning duration {duration} from ffmpeg null muxer stream duration for {filename}...") - # return duration - # if filename.lower().endswith('.mp3'): - # try: - # duration=float(AudioSegment.from_mp3(filename).duration_seconds) - # # print(f"Returning duration {duration} from AudioSegment for {filename}...") - # return duration - # except: - # pass - # try: - # duration=float(AudioFileClip(filename).duration) - # # print(f"Returning duration {duration} from AudioFileClip for {filename}...") - # return duration - # except: - # pass - # if filename.lower().endswith('.mp4'): - # try: - # duration=float(VideoFileClip(filename).duration) - # # print(f"Returning duration {duration} from VideoFileClip for {filename}...") - # return duration - # except: - # pass +def get_duration(filename, skip_accurate_decode=False): + if not skip_accurate_decode: + ffmpeg_cmd = ffmpeg.input(filename).output('/dev/null', f="null", progress='/dev/stdout') + ffmpeg_stdout, ffmpeg_stderr = ffmpeg_cmd.run(capture_stdout=True, capture_stderr=True) + stdout=ffmpeg_stdout.decode('UTF-8') + stdout_lines=stdout.splitlines() + for line in reversed(stdout_lines): + if "out_time_ms" in line: + out_time_ms_str = line.split("=")[1].strip() + if out_time_ms_str.isnumeric(): + duration=float(out_time_ms_str) / 1000000.0 + # print(f"Returning duration {duration} from ffmpeg null muxer out_time_ms for {filename}...") + return duration + stderr=ffmpeg_stderr.decode('UTF-8') + stderr_lines=stderr.splitlines() + stream_durations=[] + for line in reversed(stderr_lines): + if "Duration:" in line: + timestamp = line.split("Duration:")[1].strip().split(',')[0].strip() + h, m, s_ms = timestamp.split(':') + s, ms = s_ms.split('.') + stream_durations.append(int(h) * 3600 + int(m) * 60 + int(s) + float(f".{ms}")) + if len(stream_durations) > 0: + duration=max(stream_durations) # sum? + # print(f"Returning duration {duration} from ffmpeg null muxer stream duration for {filename}...") + return duration + if filename.lower().endswith('.mp3'): + try: + duration=float(AudioSegment.from_mp3(filename).duration_seconds) + # print(f"Returning duration {duration} from AudioSegment for {filename}...") + return duration + except: + pass + try: + duration=float(AudioFileClip(filename).duration) + # print(f"Returning duration {duration} from AudioFileClip for {filename}...") + return duration + except: + pass + if filename.lower().endswith('.mp4'): + try: + duration=float(VideoFileClip(filename).duration) + # print(f"Returning duration {duration} from VideoFileClip for {filename}...") + return duration + except: + pass probe_info=ffmpeg.probe(filename) duration=float(probe_info["format"]["duration"]) # print(f"Returning duration {duration} from ffprobe for {filename}...") diff --git a/video_creation/background.py b/video_creation/background.py index e1e93e4..2f6ebfd 100644 --- a/video_creation/background.py +++ b/video_creation/background.py @@ -166,13 +166,11 @@ def chop_background(background_config: Dict[str, Tuple], video_length: int, redd # background_audio.write_audiofile(f"assets/temp/{id}/background.mp3") # background_audio.close() ffmpeg_progress_run( - ffmpeg.input(audio_file_path).output( + ffmpeg.input(audio_file_path, ss=("%0.2f" % start_time_audio), t=("%0.2f" % (end_time_audio-start_time_audio))).output( f"assets/temp/{id}/background.mp3", # acodec="copy", # acodec="libmp3lame", map="0", - ss=start_time_audio, - to=end_time_audio ).overwrite_output(), end_time_audio-start_time_audio, "✂️ Chopping background audio..."