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

12 months ago
#!/usr/local/bin/python
# выбирает информацию по видео файлу.
import os
12 months ago
import subprocess
import json
import zlib
12 months ago
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()
12 months ago
# крманда 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
12 months ago
# =================== начало программы ====================
12 months ago
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)