alistair
4 years ago
commit
9d73658bf0
1 changed files with 145 additions and 0 deletions
@ -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…
Reference in new issue