|
|
@ -1,56 +1,57 @@
|
|
|
|
import ffmpeg
|
|
|
|
import ffmpeg
|
|
|
|
from pydub import AudioSegment
|
|
|
|
from pydub import AudioSegment
|
|
|
|
# from moviepy.editor import VideoFileClip, AudioFileClip
|
|
|
|
from moviepy.editor import VideoFileClip, AudioFileClip
|
|
|
|
# from tqdm import tqdm
|
|
|
|
# from tqdm import tqdm
|
|
|
|
from rich.progress import Progress, BarColumn, TextColumn, TaskProgressColumn, TimeRemainingColumn
|
|
|
|
from rich.progress import Progress, BarColumn, TextColumn, TaskProgressColumn, TimeRemainingColumn
|
|
|
|
|
|
|
|
|
|
|
|
from utils.ffmpeg_progress import ProgressFfmpeg
|
|
|
|
from utils.ffmpeg_progress import ProgressFfmpeg
|
|
|
|
|
|
|
|
|
|
|
|
def get_duration(filename):
|
|
|
|
def get_duration(filename, skip_accurate_decode=False):
|
|
|
|
# ffmpeg_cmd = ffmpeg.input(filename).output('/dev/null', f="null", progress='/dev/stdout')
|
|
|
|
if not skip_accurate_decode:
|
|
|
|
# ffmpeg_stdout, ffmpeg_stderr = ffmpeg_cmd.run(capture_stdout=True, capture_stderr=True)
|
|
|
|
ffmpeg_cmd = ffmpeg.input(filename).output('/dev/null', f="null", progress='/dev/stdout')
|
|
|
|
# stdout=ffmpeg_stdout.decode('UTF-8')
|
|
|
|
ffmpeg_stdout, ffmpeg_stderr = ffmpeg_cmd.run(capture_stdout=True, capture_stderr=True)
|
|
|
|
# stdout_lines=stdout.splitlines()
|
|
|
|
stdout=ffmpeg_stdout.decode('UTF-8')
|
|
|
|
# for line in reversed(stdout_lines):
|
|
|
|
stdout_lines=stdout.splitlines()
|
|
|
|
# if "out_time_ms" in line:
|
|
|
|
for line in reversed(stdout_lines):
|
|
|
|
# out_time_ms_str = line.split("=")[1].strip()
|
|
|
|
if "out_time_ms" in line:
|
|
|
|
# if out_time_ms_str.isnumeric():
|
|
|
|
out_time_ms_str = line.split("=")[1].strip()
|
|
|
|
# duration=float(out_time_ms_str) / 1000000.0
|
|
|
|
if out_time_ms_str.isnumeric():
|
|
|
|
# # print(f"Returning duration {duration} from ffmpeg null muxer out_time_ms for {filename}...")
|
|
|
|
duration=float(out_time_ms_str) / 1000000.0
|
|
|
|
# return duration
|
|
|
|
# print(f"Returning duration {duration} from ffmpeg null muxer out_time_ms for {filename}...")
|
|
|
|
# stderr=ffmpeg_stderr.decode('UTF-8')
|
|
|
|
return duration
|
|
|
|
# stderr_lines=stderr.splitlines()
|
|
|
|
stderr=ffmpeg_stderr.decode('UTF-8')
|
|
|
|
# stream_durations=[]
|
|
|
|
stderr_lines=stderr.splitlines()
|
|
|
|
# for line in reversed(stderr_lines):
|
|
|
|
stream_durations=[]
|
|
|
|
# if "Duration:" in line:
|
|
|
|
for line in reversed(stderr_lines):
|
|
|
|
# timestamp = line.split("Duration:")[1].strip().split(',')[0].strip()
|
|
|
|
if "Duration:" in line:
|
|
|
|
# h, m, s_ms = timestamp.split(':')
|
|
|
|
timestamp = line.split("Duration:")[1].strip().split(',')[0].strip()
|
|
|
|
# s, ms = s_ms.split('.')
|
|
|
|
h, m, s_ms = timestamp.split(':')
|
|
|
|
# stream_durations.append(int(h) * 3600 + int(m) * 60 + int(s) + float(f".{ms}"))
|
|
|
|
s, ms = s_ms.split('.')
|
|
|
|
# if len(stream_durations) > 0:
|
|
|
|
stream_durations.append(int(h) * 3600 + int(m) * 60 + int(s) + float(f".{ms}"))
|
|
|
|
# duration=max(stream_durations) # sum?
|
|
|
|
if len(stream_durations) > 0:
|
|
|
|
# # print(f"Returning duration {duration} from ffmpeg null muxer stream duration for {filename}...")
|
|
|
|
duration=max(stream_durations) # sum?
|
|
|
|
# return duration
|
|
|
|
# print(f"Returning duration {duration} from ffmpeg null muxer stream duration for {filename}...")
|
|
|
|
# if filename.lower().endswith('.mp3'):
|
|
|
|
return duration
|
|
|
|
# try:
|
|
|
|
if filename.lower().endswith('.mp3'):
|
|
|
|
# duration=float(AudioSegment.from_mp3(filename).duration_seconds)
|
|
|
|
try:
|
|
|
|
# # print(f"Returning duration {duration} from AudioSegment for {filename}...")
|
|
|
|
duration=float(AudioSegment.from_mp3(filename).duration_seconds)
|
|
|
|
# return duration
|
|
|
|
# print(f"Returning duration {duration} from AudioSegment for {filename}...")
|
|
|
|
# except:
|
|
|
|
return duration
|
|
|
|
# pass
|
|
|
|
except:
|
|
|
|
# try:
|
|
|
|
pass
|
|
|
|
# duration=float(AudioFileClip(filename).duration)
|
|
|
|
try:
|
|
|
|
# # print(f"Returning duration {duration} from AudioFileClip for {filename}...")
|
|
|
|
duration=float(AudioFileClip(filename).duration)
|
|
|
|
# return duration
|
|
|
|
# print(f"Returning duration {duration} from AudioFileClip for {filename}...")
|
|
|
|
# except:
|
|
|
|
return duration
|
|
|
|
# pass
|
|
|
|
except:
|
|
|
|
# if filename.lower().endswith('.mp4'):
|
|
|
|
pass
|
|
|
|
# try:
|
|
|
|
if filename.lower().endswith('.mp4'):
|
|
|
|
# duration=float(VideoFileClip(filename).duration)
|
|
|
|
try:
|
|
|
|
# # print(f"Returning duration {duration} from VideoFileClip for {filename}...")
|
|
|
|
duration=float(VideoFileClip(filename).duration)
|
|
|
|
# return duration
|
|
|
|
# print(f"Returning duration {duration} from VideoFileClip for {filename}...")
|
|
|
|
# except:
|
|
|
|
return duration
|
|
|
|
# pass
|
|
|
|
except:
|
|
|
|
|
|
|
|
pass
|
|
|
|
probe_info=ffmpeg.probe(filename)
|
|
|
|
probe_info=ffmpeg.probe(filename)
|
|
|
|
duration=float(probe_info["format"]["duration"])
|
|
|
|
duration=float(probe_info["format"]["duration"])
|
|
|
|
# print(f"Returning duration {duration} from ffprobe for {filename}...")
|
|
|
|
# print(f"Returning duration {duration} from ffprobe for {filename}...")
|
|
|
|