aboutsummaryrefslogtreecommitdiff
path: root/preview.py
diff options
context:
space:
mode:
authorMelody Horn <melody@boringcactus.com>2021-01-29 01:10:56 -0700
committerMelody Horn <melody@boringcactus.com>2021-01-29 01:10:56 -0700
commit326cbf53a2cfa1c115523b9eb4837f629011a1f7 (patch)
tree58531cc0f849d4e146b71130734775b2af0c6041 /preview.py
parentc81da475babdda24000488da62b33048d3239947 (diff)
downloadvidslice-326cbf53a2cfa1c115523b9eb4837f629011a1f7.tar.gz
vidslice-326cbf53a2cfa1c115523b9eb4837f629011a1f7.zip
pull code out into a python module
Diffstat (limited to 'preview.py')
-rw-r--r--preview.py89
1 files changed, 0 insertions, 89 deletions
diff --git a/preview.py b/preview.py
deleted file mode 100644
index f22c6ba..0000000
--- a/preview.py
+++ /dev/null
@@ -1,89 +0,0 @@
-import subprocess
-import tempfile
-import threading
-from tkinter import *
-from tkinter import ttk
-
-from options import FFmpegOptions
-
-
-class PreviewPanel(ttk.LabelFrame):
- def __init__(self, *args, get_ffmpeg_args=lambda: FFmpegOptions([], []), get_frame_count=lambda: 0, **kw):
- super(PreviewPanel, self).__init__(*args, text='Preview', **kw)
- self.input_path = None
- self.get_ffmpeg_args = get_ffmpeg_args
- self.get_frame_count = get_frame_count
-
- def button(text, command, column):
- ttk.Button(self, text=text, command=command).grid(column=column, row=0, sticky=(N, W, S, E))
- self.columnconfigure(column, weight=1)
-
- button("Preview Start", self.preview_start, 0)
- button("Preview Middle", self.preview_middle, 1)
- button("Preview End", self.preview_end, 2)
-
- self.image = None
- self.image_label = ttk.Label(self, anchor='center')
- self.image_label.grid(column=0, row=1, columnspan=3, sticky=(N, W, S, E))
- self.rowconfigure(1, weight=1)
-
- self.enable(False)
-
- def preview_at(self, offset):
- offset = int(offset)
- self.enable(False)
- real_args = self.get_ffmpeg_args()
- input_args = real_args.input
- width = self.image_label.winfo_width()
- height = self.image_label.winfo_height()
- real_args.vf += [
- rf'select=eq(n\,{offset})',
- f'scale=w={width}:h={height}:force_original_aspect_ratio=decrease'
- ]
- real_args.output += ['-frames:v', '1']
- output_args = real_args.output_with_vf()
-
- def run():
- _, output_path = tempfile.mkstemp(suffix='.png')
- args = ['ffmpeg', '-hide_banner', '-v', 'warning', '-y'] + input_args + \
- ['-i', self.input_path] + output_args + [output_path]
- print(args)
- # noinspection PyArgumentList
- proc = subprocess.Popen(args, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT, text=True, creationflags=subprocess.CREATE_NO_WINDOW)
- while proc.poll() is None:
- out_data = proc.stdout.readline()
- if out_data != '':
- print(out_data, end='')
- self.enable(True)
- self.image = PhotoImage(file=output_path)
- self.image_label['image'] = self.image
-
- threading.Thread(target=run).start()
-
- def preview_start(self, *args):
- self.preview_at(0)
-
- def preview_middle(self, *args):
- self.preview_at(self.get_frame_count() / 2)
-
- def preview_end(self, *args):
- self.preview_at(self.get_frame_count() - 1)
-
- def enable(self, enabled):
- state = 'disabled'
- if enabled:
- state = '!' + state
- self.state([state])
- for child in self.winfo_children():
- try:
- child.state([state])
- except AttributeError:
- pass
-
- def set_input_path(self, path, data):
- self.enable(data is not None)
- if data is None:
- self.input_path = None
- else:
- self.input_path = path