You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

131 lines
3.5 KiB
Python

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#!/usr/local/bin/python
# выбирает информацию по видео файлу.
import os
import subprocess
import json
import zlib
import datetime
# правильный перевод!
def humanbytes(B):
"""Return the given bytes as a human friendly KB, MB, GB, or TB string."""
B = float(B)
KB = float(1024)
MB = float(KB ** 2) # 1,048,576
GB = float(KB ** 3) # 1,073,741,824
TB = float(KB ** 4) # 1,099,511,627,776
if B < KB:
return '{0} {1}'.format(B,'Bytes' if 0 == B > 1 else 'Byte')
elif KB <= B < MB:
return '{0:.2f} KB'.format(B / KB)
elif MB <= B < GB:
return '{0:.2f} MB'.format(B / MB)
elif GB <= B < TB:
return '{0:.2f} GB'.format(B / GB)
elif TB <= B:
return '{0:.2f} TB'.format(B / TB)
# file_info
def file_info(fn):
meta = {}
with open(fn, 'rb') as fp:
filename, file_extension = os.path.splitext(fn)
created = os.path.getmtime(fn)
dt_m = datetime.datetime.fromtimestamp(created)
size = os.path.getsize(fn)
data = fp.read()
meta["name"] = fn
meta["path"] = os.path.splitdrive(fn)[1]
meta["ext"] = file_extension.lower()
meta["date"] = dt_m
meta["type"] = "meta"
meta["crc"] = zlib.crc32(data)
meta["size"] = size
return meta
def humanbitrate(s):
items = s.split("/")
a = float(items[0])
b = float(items[1])
bitrate = "%8.1f" % (a / b)
return bitrate.strip()
# крманда ffmpeg для получения постера
def poster(fn):
seconds = 5
path = fn
image = postername(fn)
ffmpeg = "ffmpeg -ss %s -i \"%s\" -f image2 -vframes 1 -y \"%s\"" % (seconds, path, image)
return ffmpeg
def postername(file_path):
file_name, file_extension = os.path.splitext(file_path)
return file_name + ".jpg"
def check_file(file):
meta = file_info(file)
#print(meta)
cmd = "ffprobe -v quiet -print_format json -show_format -show_streams \"%s\"" % file
output = subprocess.run(cmd, capture_output=True, text=True, shell=True)
# обычный вывод
#output = subprocess.run(cmd, text=True, shell=True)
#print(output)
data = json.loads(output.stdout)
info = {}
info["audio"] = len(data["streams"]) > 1
total_seconds = datetime.timedelta(seconds=float(data["format"]["duration"]))
info["duration"] = total_seconds
#print("seconds", total_seconds, file)
info["hduration"] = "00:00:00"
try:
info["hduration"] = datetime.datetime.strptime(str(total_seconds), "%H:%M:%S.%f").strftime("%H:%M:%S")
except:
print("не удалось получить:", total_seconds)
info["width"] = data["streams"][0]["width"]
info["height"] = data["streams"][0]["height"]
info["bit_rate"] = humanbitrate(data["streams"][0]["avg_frame_rate"])
info["codec"] = data["streams"][0]["codec_name"]
info["filename"] = meta["name"]
info["ext"] = meta["ext"]
info["crc"] = meta["crc"]
info["created"] = meta["date"]
info["hcreated"] = meta["date"].strftime("%d.%m.%Y")
info["size"] = data["format"]["size"]
info["hsize"] = humanbytes(data["format"]["size"])
info["poster"] = poster(file)
return info
def valid_file(file):
valid_ext = ["mp4", "mpeg", "webm"]
ext = file.split(".")[-1]
for e in valid_ext:
if ext == e:
return True
return False
# =================== начало программы ====================
dir = "d:\\vids\\ero"
files = os.listdir(dir)
for file in files:
if valid_file(file):
path = os.path.join(dir, file)
print(path)
try:
meta = check_file(path)
print(meta)
except:
print("=== Не удалось обработать файл:", path)
else:
print("пропускаем файл:", file)