KaraokeVideoDownloader/karaoke_downloader/check_resolution.py

169 lines
4.7 KiB
Python

#!/usr/bin/env python3
"""
Script to check the actual resolution of downloaded MP4 files.
"""
import sys
import json
import subprocess
from pathlib import Path
def get_video_info_ffprobe(file_path):
"""Get video information using ffprobe."""
try:
cmd = [
"ffprobe",
"-v",
"quiet",
"-print_format",
"json",
"-show_streams",
str(file_path),
]
result = subprocess.run(cmd, capture_output=True, text=True, check=True)
data = json.loads(result.stdout)
# Find video stream
for stream in data.get("streams", []):
if stream.get("codec_type") == "video":
width = stream.get("width")
height = stream.get("height")
codec = stream.get("codec_name")
bitrate = stream.get("bit_rate")
return {
"width": width,
"height": height,
"codec": codec,
"bitrate": bitrate,
"resolution": (
f"{width}x{height}" if width and height else "Unknown"
),
}
return None
except (
subprocess.CalledProcessError,
json.JSONDecodeError,
FileNotFoundError,
) as e:
return None
def get_video_info_python(file_path):
"""Get video information using Python libraries (fallback)."""
try:
import cv2
cap = cv2.VideoCapture(str(file_path))
if cap.isOpened():
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
cap.release()
return {
"width": width,
"height": height,
"codec": "Unknown",
"bitrate": None,
"resolution": f"{width}x{height}",
}
except ImportError:
pass
try:
from moviepy.editor import VideoFileClip
clip = VideoFileClip(str(file_path))
width, height = clip.size
clip.close()
return {
"width": width,
"height": height,
"codec": "Unknown",
"bitrate": None,
"resolution": f"{width}x{height}",
}
except ImportError:
pass
return None
def check_resolutions(downloads_dir="downloads"):
"""Check resolutions of all MP4 files in the downloads directory."""
downloads_path = Path(downloads_dir)
if not downloads_path.exists():
print(f"❌ Downloads directory '{downloads_dir}' not found!")
return
mp4_files = list(downloads_path.rglob("*.mp4"))
if not mp4_files:
print(f"❌ No MP4 files found in '{downloads_dir}'!")
return
print(f"🔍 Checking resolution of {len(mp4_files)} MP4 files...")
print("=" * 80)
resolutions = {}
total_files = 0
successful_checks = 0
for mp4_file in sorted(mp4_files):
total_files += 1
relative_path = mp4_file.relative_to(downloads_path)
# Try ffprobe first, then Python libraries
info = get_video_info_ffprobe(mp4_file)
if not info:
info = get_video_info_python(mp4_file)
if info:
successful_checks += 1
resolution = info["resolution"]
resolutions[resolution] = resolutions.get(resolution, 0) + 1
# Determine if it's 720p or not
width, height = info["width"], info["height"]
is_720p = (width == 1280 and height == 720) or (
width == 720 and height == 1280
)
status = "✅ 720p" if is_720p else "❌ Not 720p"
print(f"{status} | {resolution:>12} | {relative_path}")
else:
print(f"❓ Unknown | {'Unknown':>12} | {relative_path}")
print("=" * 80)
print(f"📊 Summary:")
print(f" Total files checked: {total_files}")
print(f" Successfully analyzed: {successful_checks}")
print(f" Failed to analyze: {total_files - successful_checks}")
print()
print("📈 Resolution breakdown:")
for resolution, count in sorted(
resolutions.items(), key=lambda x: x[1], reverse=True
):
percentage = (count / successful_checks) * 100
is_720p = "1280x720" in resolution or "720x1280" in resolution
status = "✅ 720p" if is_720p else "❌ Other"
print(
f" {status} | {resolution:>12} | {count:>3} files ({percentage:>5.1f}%)"
)
def main():
"""Main function."""
if len(sys.argv) > 1:
downloads_dir = sys.argv[1]
else:
downloads_dir = "downloads"
check_resolutions(downloads_dir)
if __name__ == "__main__":
main()