Source code for hello.video.info

import sys
from pathlib import Path

import cv2 as cv

suffix_set = set(".avi,.mp4,.MOV,.mkv".split(","))


[docs] def find_videos(input_dir): video_paths = [] for f in sorted(Path(input_dir).glob("**/*")): if f.suffix in suffix_set: video_paths.append(f.as_posix()) return video_paths
[docs] def get_info(video_path): cap = cv.VideoCapture(video_path) fps = int(cap.get(cv.CAP_PROP_FPS)) count = int(cap.get(cv.CAP_PROP_FRAME_COUNT)) width = int(cap.get(cv.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv.CAP_PROP_FRAME_HEIGHT)) cap.release() video_info = ", ".join(Path(video_path).parts[-2:]) return f"{video_info}, seconds={count//fps:04d}, size={width}x{height}, {fps=}"
[docs] def func(input_dir): input_dir = Path(input_dir) if input_dir.is_file(): video_paths = [input_dir.as_posix()] input_dir = input_dir.parent else: video_paths = find_videos(input_dir) data = [] for video_path in video_paths: data.append(get_info(video_path)) _sum = sum([int(t.split(",")[2].split("=")[1]) for t in data]) data.append(f"\n{_sum}s, {_sum//60}:{_sum%60:02d}") return "\n".join(data)
[docs] def parse_args(args=None): from argparse import ArgumentDefaultsHelpFormatter, ArgumentParser parser = ArgumentParser(formatter_class=ArgumentDefaultsHelpFormatter) parser.add_argument("input_dir", type=str, help="videos dir or file path") args = parser.parse_args(args=args) return vars(args)
[docs] def main(args=None): kwargs = parse_args(args) print(f"{__file__}: {kwargs}") print(func(**kwargs)) return 0
if __name__ == "__main__": sys.exit(main())