added diag script

This commit is contained in:
2026-01-12 10:53:06 -05:00
parent 0a6e9ed1d8
commit 7ad3715c52
4 changed files with 172 additions and 18 deletions
@@ -1,6 +1,7 @@
import os
import subprocess
import sys
import json
from utils import verify_file_not_empty
def run_ffmpeg(args):
@@ -20,6 +21,27 @@ def run_ffmpeg(args):
print("Error: 'ffmpeg' command not found. Please ensure it is installed on your host system.")
return False
def get_video_duration(file_path):
"""
Gets video duration in seconds using ffprobe.
"""
in_flatpak = os.path.exists("/.flatpak-info")
cmd_base = ["flatpak-spawn", "--host"] if in_flatpak else []
cmd = cmd_base + [
"ffprobe",
"-v", "error",
"-show_entries", "format=duration",
"-of", "default=noprint_wrappers=1:nokey=1",
file_path
]
try:
result = subprocess.run(cmd, capture_output=True, text=True, check=True)
return float(result.stdout.strip())
except Exception:
return 0.0
def extract_audio(video_path, output_path=None):
"""
Extracts audio from a video file using ffmpeg.
@@ -58,10 +80,19 @@ def extract_audio(video_path, output_path=None):
def embed_subtitles(video_path, srt_path, output_path=None):
"""
Embeds subtitles into the video file (Soft Subs) and sets them as primary.
Includes strict safety checks (Size & Duration) to prevent replacing videos with corrupted files.
"""
if not os.path.exists(video_path) or not os.path.exists(srt_path):
print("Error: Video or SRT file not found for embedding.")
return
return False
# Capture original stats
original_size = os.path.getsize(video_path)
original_duration = get_video_duration(video_path)
if original_size == 0:
print("Error: Source video is 0 bytes.")
return False
if output_path is None:
base, ext = os.path.splitext(video_path)
@@ -91,8 +122,39 @@ def embed_subtitles(video_path, srt_path, output_path=None):
]
if run_ffmpeg(args):
if not verify_file_not_empty(output_path):
raise Exception("FFmpeg succeeded but output video is empty.")
# --- Safety Checks ---
if not os.path.exists(output_path):
print("Error: Output file was not created.")
return False
new_size = os.path.getsize(output_path)
new_duration = get_video_duration(output_path)
# 1. Zero Byte Check
if new_size == 0:
print("❌ CRITICAL: Output file is 0 bytes. Deleting corrupted output.")
os.remove(output_path)
raise Exception("Embedding failed: Output is empty.")
# 2. Significant Size Drop Check
if new_size < (original_size * 0.8):
print(f"❌ CRITICAL: Output file is significantly smaller than source!")
print(f" Original: {original_size/1024/1024:.2f} MB")
print(f" New: {new_size/1024/1024:.2f} MB")
os.remove(output_path)
raise Exception("Embedding failed: Suspicious file size reduction.")
# 3. Duration Mismatch Check (New)
if abs(original_duration - new_duration) > 1.0:
print(f"❌ CRITICAL: Duration mismatch detected!")
print(f" Original: {original_duration:.2f}s")
print(f" New: {new_duration:.2f}s")
print(" This indicates truncated video stream. Aborting.")
os.remove(output_path)
raise Exception("Embedding failed: Duration mismatch > 1s.")
print(f"Subtitles embedded successfully: {output_path}")
return True
else:
print("Error: Embedding failed.")
return False