Signed-off-by: mbrucedogs <mbrucedogs@gmail.com>
This commit is contained in:
parent
fe576965b7
commit
b22a7d2e16
146
check_resolution.py
Normal file
146
check_resolution.py
Normal file
@ -0,0 +1,146 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Script to check the actual resolution of downloaded MP4 files.
|
||||
"""
|
||||
|
||||
import subprocess
|
||||
import json
|
||||
from pathlib import Path
|
||||
import sys
|
||||
|
||||
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()
|
||||
Loading…
Reference in New Issue
Block a user