Mercurial > hg > config
annotate python/ffslice.py @ 929:7c4be71a560b default tip
remove old aliases
| author | Jeff Hammel <k0scist@gmail.com> | 
|---|---|
| date | Mon, 20 Oct 2025 15:22:19 -0700 | 
| parents | f011ec45b8e8 | 
| children | 
| rev | line source | 
|---|---|
| 
741
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
1 #!/usr/bin/env python | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
2 # -*- coding: utf-8 -*- | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
3 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
4 """ | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
5 slice a clip with `ffmpeg`: | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
6 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
7 ffmpeg -ss <00:00:00> -t <sec> -i <input_file> -q 1 <output_file> # | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
8 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
9 --ss = start time ; | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
10 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
11 -t = length of video to create from the start time in seconds. | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
12 """ | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
13 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
14 # imports | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
15 import argparse | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
16 import os | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
17 import subprocess | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
18 import sys | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
19 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
20 # module globals | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
21 __all__ = ['main', 'Parser'] | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
22 here = os.path.dirname(os.path.realpath(__file__)) | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
23 string = (str, unicode) | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
24 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
25 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
26 def ensure_dir(directory): | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
27 """ensure a directory exists""" | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
28 if os.path.exists(directory): | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
29 assert os.path.isdir(directory) | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
30 return directory | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
31 os.makedirs(directory) | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
32 return directory | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
33 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
34 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
35 def convert_seconds_to_hhmmss(time_sec): | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
36 """converts `time_sec` to (hh,mm,ss)""" | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
37 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
38 hh = int(time_sec / 3600) | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
39 mm = int((time_sec % 3600) / 60) | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
40 ss = int((time_sec % 3600) % 60) | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
41 return (hh,mm,ss) | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
42 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
43 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
44 def format_seconds_to_hhmmss(time_sec, separator=':'): | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
45 """converts `time_sec` to string 'hh:mm:ss'""" | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
46 return separator.join(['{:0>2d}'.format(i) | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
47 for i in convert_seconds_to_hhmmss(time_sec)]) | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
48 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
49 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
50 def duration(clip, ffprobe='ffprobe'): | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
51 """get the duration in seconds using `ffprobe` from ffmpeg""" | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
52 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
53 command = [ffprobe, clip] | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
54 assert os.path.exists(clip), "Missing clip, duration not available" | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
55 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
56 # probe the file | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
57 try: | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
58 output = subprocess.check_output(command, stderr=subprocess.STDOUT) | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
59 # (for some reason, ffprobe sends output to stderr) | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
60 except subprocess.CalledProcessError as e: | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
61 print (e.output) | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
62 raise | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
63 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
64 duration = None | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
65 for line in output.splitlines(): | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
66 # Parse the output of `ffprobe` | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
67 # look for a line like: | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
68 # Duration: 00:00:59.73, start: 0.000000, bitrate: 7783 kb/s | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
69 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
70 line = line.strip() | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
71 if line.startswith("Duration:"): | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
72 if duration: | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
73 raise AssertionError("Duplicate duration - already found: {}".format(duration)) | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
74 line = line.split(',')[0] | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
75 duration = line.split(':', 1)[1].strip() | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
76 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
77 if duration: | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
78 hh, mm, ss = [float(i) for i in duration.split(':')] | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
79 duration = 3600*hh + 60*mm + ss | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
80 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
81 return duration | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
82 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
83 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
84 class FFSliceParser(argparse.ArgumentParser): | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
85 """fflice CLI option parser""" | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
86 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
87 default_slice_time = 300. | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
88 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
89 def __init__(self): | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
90 argparse.ArgumentParser.__init__(self, description=__doc__) | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
91 self.add_argument('clips', metavar='clip', nargs='+', help="clips to slice") | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
92 self.add_argument('-d', '--directory', dest='directory', | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
93 default=os.getcwd(), | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
94 help="output directory [DEFAULT: %(default)s]") | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
95 self.add_argument('--durations', '--print-durations', dest='print_durations', | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
96 action='store_true', default=False, | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
97 help="print durations and exit") | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
98 self.add_argument('-n', dest='number', type=int, | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
99 help="number of slices") | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
100 self.add_argument('-t', '--time', dest='slice_time', | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
101 type=float, | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
102 help="time of each slice [DEFAULT: {}]".format(self.default_slice_time)) | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
103 self.add_argument('--dry-run', dest='dry_run', | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
104 action='store_true', default=False, | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
105 help="print out what will be done") | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
106 self.add_argument('--hhmmss', dest='hhmmss', | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
107 action='store_true', default=False, | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
108 help="display times in 'hh:mm:ss' format; thedefault is in seconds") | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
109 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
110 self.add_argument('-v', '--verbose', dest='verbose', | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
111 action='store_true', default=False, | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
112 help="be verbose") | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
113 self.options = None | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
114 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
115 def parse_args(self, *args, **kw): | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
116 options = argparse.ArgumentParser.parse_args(self, *args, **kw) | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
117 self.validate(options) | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
118 self.options = options | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
119 return options | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
120 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
121 def validate(self, options): | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
122 """validate options""" | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
123 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
124 missing = [clip for clip in options.clips | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
125 if not os.path.exists(clip)] | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
126 if missing: | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
127 self.error("Not found: {}".format(', '.join(missing))) | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
128 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
129 if options.slice_time and options.number: | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
130 self.error("Cannot specify slice time and number of slices") | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
131 # TODO: allow specification of both | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
132 elif options.slice_time is None and options.number is None: | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
133 options.slice_time = self.default_slice_time | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
134 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
135 ensure_dir(options.directory) | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
136 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
137 def format_seconds(self, seconds): | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
138 """format seconds to string""" | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
139 if self.options.hhmmss: | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
140 return format_seconds_to_hhmmss(seconds) | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
141 return '{:.2}'.format(seconds) | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
142 | 
| 
754
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
143 def slice(self): | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
144 """ | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
145 iterates over all the specified clips and slices them as per input params. | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
146 The sliced clips are stored under the provided coommand line destinati | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
147 on directory or current working dir | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
148 """ | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
149 | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
150 for clip_path in self.options.clip_paths: | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
151 print "***** Processing {0}".format(clip_path) | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
152 | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
153 if not os.path.exists(clip_path): | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
154 print "File not found! skipping {0}".format(clip_path) | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
155 continue | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
156 | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
157 #making sure the slice time is within bounds of the clip duration | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
158 duration = self.duration(clip_path) | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
159 print "Duration: {0}".format(duration) | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
160 if self.options.slice_length_sec > duration: | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
161 print "Skipping {0}, slice_time {1} is GREATER than file duration {2} ".format(clip_path,self.options.slice_length_sec ,duration) | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
162 continue | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
163 | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
164 #calculating the number slices to create | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
165 num_slices = 0 | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
166 if self.options.num_slices: | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
167 num_slices = min (self.options.num_slices, int(duration/(self.options.slice_length_sec))) | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
168 else: #number of slice were not specified | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
169 num_slices = int(duration/(self.options.slice_length_sec)) | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
170 print "Slicing in {0} parts, {1} seconds each".format(num_slices,self.options.slice_length_sec) | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
171 | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
172 hh = 0 | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
173 mm = 0 | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
174 ss = 0 | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
175 start_time_secs = 0 | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
176 [out_filename,out_file_ext] = clip_path.split("/")[-1].split(".") #assuming the file path to be something like /df/dsf/dsf/dsf.mp4 | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
177 ensure_dir(self.options.out_directory) | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
178 #creating slices | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
179 for i in range(num_slices): | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
180 [hh,mm,ss] = self.format_seconds_to_hhmmss(start_time_secs) | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
181 out_file_path = "{0}/{1}_{2}.{3}".format(self.options.out_directory,out_filename,i,out_file_ext) | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
182 command = "ffmpeg -ss {0}:{1}:{2} -t {3} -i {4} -q {5} -strict -2 {6}".format(hh,mm,ss,self.options.slice_length_sec, | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
183 clip_path,1, out_file_path) | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
184 | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
185 try: | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
186 output = subprocess.call(command, shell=True) | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
187 except subprocess.CalledProcessError as e: | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
188 print (e.output) | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
189 raise | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
190 start_time_secs += self.options.slice_length_sec | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
191 | 
| 
741
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
192 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
193 def main(args=sys.argv[1:]): | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
194 """CLI""" | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
195 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
196 # parse command line options | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
197 parser = FFSliceParser() | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
198 options = parser.parse_args(args) | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
199 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
200 # compute durations | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
201 durations = {clip: duration(clip) for clip in options.clips} | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
202 if options.print_durations: | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
203 returncode = 0 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
204 total = 0. | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
205 for clip in options.clips: | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
206 _duration = durations[clip] | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
207 if _duration is None: | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
208 print ("Duration not found: '{}'".format(clip)) | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
209 returncode = 1 | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
210 else: | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
211 print ('{} : {}'.format(clip, | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
212 parser.format_seconds(_duration))) | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
213 sys.exit(returncode) | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
214 | 
| 
754
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
215 parser.slice() | 
| 
 
f011ec45b8e8
add example load type interface
 
Jeff Hammel <k0scist@gmail.com> 
parents: 
741 
diff
changeset
 | 
216 | 
| 
741
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
217 if __name__ == '__main__': | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
218 main() | 
| 
 
9681a0bd74d6
add utility for slicing video files
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
219 | 
