Files
python/handle_imported_video.py
2024-09-24 20:34:09 +02:00

262 lines
9.1 KiB
Python

import os
from posixpath import ismount
import sys
import time
import subprocess
import datetime
import shutil
import json
import getopt
from ffmpeg_progress_yield import FfmpegProgress
from tqdm import tqdm
if sys.platform == "linux" or sys.platform == "linux2":
# linux
ops = "linux"
elif sys.platform == "darwin":
# OS X
ops = "osx"
elif sys.platform == "win32":
ops = "win"
try:
opts, args = getopt.getopt(sys.argv[1:], "ta:r:fp:d:s:", ["command=", "help", "output=", "backup"])
except getopt.GetoptError as err:
# print help information and exit:
print(str(err)) # will print something like "option -a not recognized"
#usage()
sys.exit(2)
output = None
# QJ : getopts
_DEV = "gopro9_1"
_SEQUENCES = []
_FLIP = False
_TEST = False
if ops == "win":
_SOURCE_DIR = "p:\\imported\\"
else:
_SOURCE_DIR = "/share/Photo/imported/"
for o, a in opts:
if o == "-h":
_ACTION = True
elif o in ("-d", "--device"):
_DEV = True
elif o in ("-p", "--part"):
_DAY_DIR = a
elif o in ("-f", "--flip"):
_FLIP = True
elif o in ("-r", "--source"):
_SOURCE_DIR = a
elif o in ("-a", "--action"):
_ACTION = a
elif o in ("-t", "--test"):
_TEST = True
elif o in ("-s", "--sequence"):
a = a.split(",")
for s in a:
print(s)
_SEQUENCES.append("{:04d}".format(int(s)))
else:
_WIZZARD = True
#_SOURCE_DIR = "/media/nas/nas-photo/imported/"
if ops == "win":
_FULL_PATH = _SOURCE_DIR + "\\" + _DEV + "\\" + _DAY_DIR + "\\"
else:
_FULL_PATH = _SOURCE_DIR + "/" + _DEV + "/" + _DAY_DIR + "/"
#print(_FULL_PATH)
if _ACTION == "join":
video_seq = {}
if os.path.exists(_FULL_PATH):
if os.path.exists(_FULL_PATH + "100GOPRO"):
_FULL_PATH = _FULL_PATH + "100GOPRO"
for filename in os.listdir(_FULL_PATH):
if filename.endswith(".MP4"):
prefix = filename[0:2]
part = prefix + filename[2:4]
seq = filename[4:8]
if not seq in video_seq:
video_seq[seq] = []
video_seq[seq].append(part + seq + ".MP4")
# print(filename)
# print(seq)
# print(part)
# print(json.dumps(video_seq,indent=2))
_PROCESSED = _FULL_PATH + "processed"
if not os.path.exists(_PROCESSED):
os.mkdir(_PROCESSED)
# print(f"SEQUENCES : {_SEQUENCES}")
for vid in video_seq:
if len(_SEQUENCES) != 0 and vid not in _SEQUENCES:
continue
export_name = "joined_" + vid + ".MP4"
parts = video_seq[vid]
parts.sort()
# print(parts)
if len(parts) > 1:
print("This need to be joined!")
# for p in parts:
# join_string =
else:
# continue
# print(parts)
shutil.move(parts[0], export_name)
continue
# print(type(parts))
#ffmpeg -i concat:"input1.mp4|input2.mp4" output.mp4
os.chdir(_FULL_PATH)
f = open("video.txt", "w")
f.write("# Files to join\n")
f.close()
f = open("video.txt", "a")
final_size = 0
for p in parts:
f.write(f"file '{p}'\n")
file_stats = os.stat(p)
final_size += file_stats.st_size
f.close()
print(final_size)
print(_FULL_PATH)
if _TEST:
input(" ???? ")
# if _FLIP:
# if ops == "win":
# myCmd = 'ffmpeg -display_rotation 180 -f concat -i video.txt -vcodec copy -acodec copy ' + export_name
# else:
# myCmd = '/opt/ffmpeg/ffmpeg -display_rotation 180 -f concat -i video.txt -vcodec copy -acodec copy ' + export_name
# else:
# if ops == "win":
# myCmd = 'ffmpeg -f concat -i video.txt -vcodec copy -acodec copy ' + export_name
# else:
# myCmd = '/opt/ffmpeg/ffmpeg -f concat -i video.txt -vcodec copy -acodec copy ' + export_name
# print(os.getcwd())
#status, output = subprocess.getstatusoutput(myCmd)
if _FLIP:
if ops == "win":
myCmd = [
"ffmpeg", "-display_rotation", "180", "-f", "concat", "-i", "video.txt ","-vcodec", "copy", "-acodec", "copy", export_name
]
else:
myCmd = [
"/opt/ffmpeg/ffmpeg", "-display_rotation", "180", "-f", "concat", "-i", "video.txt ","-vcodec", "copy", "-acodec", "copy", export_name
]
else:
if ops == "win":
myCmd = [
"ffmpeg", "-f", "concat", "-i", "video.txt ","-vcodec", "copy", "-acodec", "copy", export_name
]
else:
myCmd = [
"/opt/ffmpeg/ffmpeg", "-f", "concat", "-i", "video.txt ","-vcodec", "copy", "-acodec", "copy", export_name
]
print(myCmd)
print(f"Joining {len(parts)} files...")
proc = subprocess.Popen(myCmd,stdout=subprocess.DEVNULL,stderr=subprocess.STDOUT)
# with tqdm(total=100, position=1, desc="Convert") as pbar:
# for progress in ff.run_command_with_progress():
# pbar.update(progress - pbar.n)
with tqdm(total=100, position=1, desc="Join") as pbar:
position=0
while proc.returncode is None:
#pbar.update()
try:
file_stats = os.stat(export_name)
cur_size = file_stats.st_size
final_size
cur_stat = (cur_size / final_size) * 100
pbar.update(int(cur_stat) - position)
position = int(cur_stat)
print(proc.poll() )
except:
pass
time.sleep(3)
pbar.update(1)
# get the output
status = 0
if status == 0:
print("Moving...")
for p in parts:
try:
shutil.move(p, _PROCESSED)
except:
print(f"Failed to move {p}")
try:
shutil.move(p.replace("MP4", "THM"), _PROCESSED)
except:
print(f"Failed to move {p.replace("MP4", "THM")}")
try:
shutil.move(p.replace("MP4", "LRV").replace("GH","GL"), _PROCESSED)
except:
print(f"Failed to move {p.replace("MP4", "LRV")}")
os.remove("video.txt")
if _ACTION == "encode":
if os.path.exists(_FULL_PATH):
if os.path.exists(_FULL_PATH + "100GOPRO"):
_FULL_PATH = _FULL_PATH + "100GOPRO"
parts = []
for filename in os.listdir(_FULL_PATH):
if filename.startswith("joined_") and filename.endswith(".MP4"):
parts.append(filename)
else:
sys.exit()
for p in parts:
export_name = "encoded_" + p
if _FLIP:
if ops == "win":
myCmd = [
"ffmpeg", "-display_rotation", "180", "-i", p, "-c:v", "hevc_amf", "-rc", "cqp", "-qp_i", "42", "-qp_p", "42", "-quality", "quality", "-crf", "25", export_name, "-f", "null", "/dev/null",
]
else:
myCmd = [
"/opt/ffmpeg/ffmpeg", "-display_rotation", "180", "-i", p, "-c:v", "hevc_amf", "-rc", "cqp", "-qp_i", "42", "-qp_p", "42", "-quality", "quality", "-crf", "25", export_name, "-f", "null", "/dev/null",
]
else:
if ops == "win":
myCmd = [
"ffmpeg", "-i", p, "-c:v", "hevc_amf", "-rc", "cqp", "-qp_i", "42", "-qp_p", "42", "-quality", "quality", "-crf", "25", export_name , "-f", "null", "/dev/null",
]
else:
myCmd = [
"/opt/ffmpeg/ffmpeg", "-i", p, "-c:v", "hevc_amf", "-rc", "cqp", "-qp_i", "42", "-qp_p", "42", "-quality", "quality", "-crf", "25", export_name , "-f", "null", "/dev/null",
]
print(myCmd)
print(f"Encoding files...")
ff = FfmpegProgress(myCmd)
with tqdm(total=100, position=1, desc="Convert") as pbar:
for progress in ff.run_command_with_progress():
pbar.update(progress - pbar.n)
# get the output
print(ff.stderr)
#ffmpeg -i .\GH010149.MP4 -c:v hevc_amf -rc cqp -qp_i 42 -qp_p 42 -quality quality -crf 25 output7.mp4