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