|
|
import subprocess |
|
|
import os |
|
|
import re |
|
|
|
|
|
def get_video_duration(file_path): |
|
|
try: |
|
|
result = subprocess.run( |
|
|
[ |
|
|
"ffprobe", |
|
|
"-v", "error", |
|
|
"-select_streams", "v:0", |
|
|
"-show_entries", "format=duration", |
|
|
"-of", "default=noprint_wrappers=1:nokey=1", |
|
|
file_path |
|
|
], |
|
|
stdout=subprocess.PIPE, |
|
|
stderr=subprocess.STDOUT, |
|
|
text=True, |
|
|
timeout=180 |
|
|
) |
|
|
duration_str = result.stdout.strip() |
|
|
|
|
|
|
|
|
try: |
|
|
duration = float(duration_str) |
|
|
return int(duration) |
|
|
except ValueError: |
|
|
print("⚠️ Invalid duration format:", duration_str) |
|
|
return 0 |
|
|
|
|
|
except subprocess.TimeoutExpired: |
|
|
print("⚠️ ffprobe timed out") |
|
|
return 0 |
|
|
except Exception as e: |
|
|
print(f"⚠️ Duration error: {e}") |
|
|
return 0 |
|
|
|
|
|
def sanitize_filename(filename): |
|
|
return re.sub(r'[\\/*?:"<>|]', "_", filename) |
|
|
|