Browse Source

initial, mostly works

master
alistair 4 years ago
commit
9d73658bf0
  1. 145
      clip.py

145
clip.py

@ -0,0 +1,145 @@ @@ -0,0 +1,145 @@
#!/usr/bin/python3
from tkinter import *
from tkinter.filedialog import askopenfilename
from datetime import datetime
import re
import os
import sys
# see man (1)ffmpeg-utils
# Time must be in format [-][<HH>:]<MM>:<SS>[.<m>...]
# or just a decimal number of seconds
timestamp_matcher = re.compile('((^([0-9]{1,2}:){1,2}([0-9]{1,2})(\\.[0-9]{1,8})?$)|(^([0-9]+(\\.[0-9]+)*$)))')
match_seconds = re.compile('[0-9]+(\\.[0-9]+)*$')
window = Tk()
window.title("Clip Video")
use_copy = IntVar() # whether to use copy filter
# should probably have a dialog to explain this
filetext = Entry(window)
outtext = Entry(window)
def write_message(msgtext:str):
message.configure(text = msgtext)
def get_time(text):
fmt = ""
if "." in text:
fmt = ".%f"
s_end = text.split(":")
if len(s_end) == 2:
return datetime.strptime(text, "%M:%S" + fmt)
if len(s_end) == 3:
return datetime.strptime(text, "%H:%M:%S" + fmt)
else:
write_message("wot")
raise Exception()
def clicked():
# TODO:
# Use Exiftool / FFmpeg to get metadata to check duration
start = sttext.get()
end = edtext.get()
infile = filetext.get()
outfile = outtext.get()
if (infile == ""):
write_message("File not specified")
return
if outfile == "":
splitp = os.path.split(infile)[1].split(".")
splitp.insert(-1,"clipped")
outfile = ".".join(splitp)
outfile = os.path.join(os.path.split(infile)[0] , outfile)
if not timestamp_matcher.match(start) or not timestamp_matcher.match(end):
write_message("Start and End must\nbe in mm:ss format")
return
else:
write_message("")
if not os.path.exists(filetext.get()):
write_message("File doesn't exist?")
return
print(use_copy)
command = "ffmpeg "
if (use_copy.get() == 1):
command += " -c copy "
delta = get_time(end) - get_time(start)
if (delta.total_seconds() < 0):
write_message("Start is after end")
return
dur = str(delta)
command += f" -i \"{infile}\" -ss {start} -t {dur} \"{outfile}\""
print(command)
result = os.system(command)
write_message("Converting")
if (result != 0):
write_message("Failed")
else:
write_message("Success!")
def get_file():
filename = askopenfilename()
if len(filename) != 0:
filetext.delete(0,END)
filetext.insert(0, string=filename)
if len(sys.argv) > 1:
filetext.insert(0, sys.argv[1])
filebtn = Button(window, text="Choose File", command=get_file)
filebtn.grid(row=0, column=4)
st = Label(window, text="Start Timestamp")
ed = Label(window, text="End Timestamp")
copyq = Checkbutton(window,text="Don't re-encode",variable=use_copy)
outfileinstr = Label(window, text="Output file (same directory as input)", anchor="w")
sttext = Entry(window,width=10)
edtext = Entry(window,width=10)
message = Label(window, text="", anchor="w", fg='red')
btn = Button(window, text="Submit", command=clicked)
filetext.grid(column=0, row=0, columnspan=3, sticky=W+E+N+S)
outfileinstr.grid(column=0, row=4, columnspan=3, sticky=W+E+N+S)
outtext.grid(column=0, row=5, columnspan=3, sticky=W+E+N+S)
st.grid(column=0, row=1, sticky=W)
ed.grid(column=0, row=2, sticky=W)
message.grid(column=0, row=6)
btn.grid(column=4, row=5, sticky=W+E+N+S)
copyq.grid(column=0,row=3)
sttext.grid(column=1, row=1)
edtext.grid(column=1, row=2)
def keypress(e):
if e.keycode == 36:
clicked()
if e.keycode == 9:
window.quit()
window.bind("<Key>", keypress)
window.mainloop()
Loading…
Cancel
Save