auto-editor 26.3.3__py3-none-any.whl → 27.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- auto_editor/__init__.py +1 -1
- auto_editor/__main__.py +9 -5
- auto_editor/analyze.py +30 -36
- auto_editor/cmds/info.py +1 -1
- auto_editor/cmds/levels.py +3 -3
- auto_editor/cmds/subdump.py +62 -8
- auto_editor/cmds/test.py +56 -40
- auto_editor/edit.py +34 -44
- auto_editor/ffwrapper.py +9 -9
- auto_editor/formats/json.py +2 -2
- auto_editor/{lang/json.py → json.py} +39 -43
- auto_editor/lang/palet.py +2 -2
- auto_editor/lang/stdenv.py +12 -0
- auto_editor/output.py +4 -4
- auto_editor/render/audio.py +26 -24
- auto_editor/render/subtitle.py +10 -14
- auto_editor/render/video.py +40 -44
- auto_editor/utils/container.py +3 -3
- {auto_editor-26.3.3.dist-info → auto_editor-27.0.0.dist-info}/METADATA +7 -6
- {auto_editor-26.3.3.dist-info → auto_editor-27.0.0.dist-info}/RECORD +25 -25
- {auto_editor-26.3.3.dist-info → auto_editor-27.0.0.dist-info}/WHEEL +1 -1
- docs/build.py +16 -7
- {auto_editor-26.3.3.dist-info → auto_editor-27.0.0.dist-info}/entry_points.txt +0 -0
- {auto_editor-26.3.3.dist-info → auto_editor-27.0.0.dist-info/licenses}/LICENSE +0 -0
- {auto_editor-26.3.3.dist-info → auto_editor-27.0.0.dist-info}/top_level.txt +0 -0
auto_editor/render/subtitle.py
CHANGED
@@ -6,7 +6,7 @@ import re
|
|
6
6
|
from dataclasses import dataclass
|
7
7
|
from typing import TYPE_CHECKING
|
8
8
|
|
9
|
-
import
|
9
|
+
import bv
|
10
10
|
|
11
11
|
from auto_editor.utils.func import to_timecode
|
12
12
|
|
@@ -17,7 +17,7 @@ if TYPE_CHECKING:
|
|
17
17
|
from auto_editor.utils.chunks import Chunks
|
18
18
|
from auto_editor.utils.log import Log
|
19
19
|
|
20
|
-
Input =
|
20
|
+
Input = bv.container.InputContainer
|
21
21
|
|
22
22
|
|
23
23
|
@dataclass(slots=True)
|
@@ -138,18 +138,14 @@ def make_srt(input_: Input, stream: int) -> str:
|
|
138
138
|
if packet.dts is None or packet.pts is None or packet.duration is None:
|
139
139
|
continue
|
140
140
|
|
141
|
-
|
142
|
-
|
141
|
+
start_num = packet.pts * input_stream.time_base
|
142
|
+
start = to_timecode(start_num, "srt")
|
143
|
+
end = to_timecode(start_num + packet.duration * input_stream.time_base, "srt")
|
143
144
|
|
144
|
-
for
|
145
|
-
|
146
|
-
end_time = to_timecode(end, "srt")
|
145
|
+
for sub in packet.decode():
|
146
|
+
assert isinstance(sub, bv.subtitles.subtitle.AssSubtitle)
|
147
147
|
|
148
|
-
|
149
|
-
assert len(subset) == 1
|
150
|
-
assert isinstance(sub, av.subtitles.subtitle.AssSubtitle)
|
151
|
-
|
152
|
-
output_bytes.write(f"{s}\n{start_time} --> {end_time}\n")
|
148
|
+
output_bytes.write(f"{s}\n{start} --> {end}\n")
|
153
149
|
output_bytes.write(sub.dialogue.decode("utf-8", errors="ignore") + "\n\n")
|
154
150
|
s += 1
|
155
151
|
|
@@ -159,7 +155,7 @@ def make_srt(input_: Input, stream: int) -> str:
|
|
159
155
|
|
160
156
|
def _ensure(input_: Input, format: str, stream: int) -> str:
|
161
157
|
output_bytes = io.BytesIO()
|
162
|
-
output =
|
158
|
+
output = bv.open(output_bytes, "w", format=format)
|
163
159
|
|
164
160
|
in_stream = input_.streams.subtitles[stream]
|
165
161
|
out_stream = output.add_stream_from_template(in_stream)
|
@@ -179,7 +175,7 @@ def make_new_subtitles(tl: v3, log: Log) -> list[str]:
|
|
179
175
|
if tl.v1 is None:
|
180
176
|
return []
|
181
177
|
|
182
|
-
input_ =
|
178
|
+
input_ = bv.open(tl.v1.source.path)
|
183
179
|
new_paths = []
|
184
180
|
|
185
181
|
for s, sub in enumerate(tl.v1.source.subtitles):
|
auto_editor/render/video.py
CHANGED
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
3
3
|
from dataclasses import dataclass
|
4
4
|
from typing import TYPE_CHECKING
|
5
5
|
|
6
|
-
import
|
6
|
+
import bv
|
7
7
|
import numpy as np
|
8
8
|
|
9
9
|
from auto_editor.output import parse_bitrate
|
@@ -11,7 +11,6 @@ from auto_editor.timeline import TlImage, TlRect, TlVideo
|
|
11
11
|
|
12
12
|
if TYPE_CHECKING:
|
13
13
|
from collections.abc import Iterator
|
14
|
-
from typing import Any
|
15
14
|
|
16
15
|
from auto_editor.__main__ import Args
|
17
16
|
from auto_editor.ffwrapper import FileInfo
|
@@ -25,15 +24,12 @@ class VideoFrame:
|
|
25
24
|
src: FileInfo
|
26
25
|
|
27
26
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
def make_solid(width: int, height: int, pix_fmt: str, bg: str) -> av.VideoFrame:
|
27
|
+
def make_solid(width: int, height: int, pix_fmt: str, bg: str) -> bv.VideoFrame:
|
32
28
|
hex_color = bg.lstrip("#").upper()
|
33
29
|
rgb_color = tuple(int(hex_color[i : i + 2], 16) for i in (0, 2, 4))
|
34
30
|
|
35
31
|
rgb_array = np.full((height, width, 3), rgb_color, dtype=np.uint8)
|
36
|
-
rgb_frame =
|
32
|
+
rgb_frame = bv.VideoFrame.from_ndarray(rgb_array, format="rgb24")
|
37
33
|
return rgb_frame.reformat(format=pix_fmt)
|
38
34
|
|
39
35
|
|
@@ -42,11 +38,11 @@ def make_image_cache(tl: v3) -> dict[tuple[FileInfo, int], np.ndarray]:
|
|
42
38
|
for clip in tl.v:
|
43
39
|
for obj in clip:
|
44
40
|
if isinstance(obj, TlImage) and (obj.src, obj.width) not in img_cache:
|
45
|
-
with
|
41
|
+
with bv.open(obj.src.path) as cn:
|
46
42
|
my_stream = cn.streams.video[0]
|
47
43
|
for frame in cn.decode(my_stream):
|
48
44
|
if obj.width != 0:
|
49
|
-
graph =
|
45
|
+
graph = bv.filter.Graph()
|
50
46
|
graph.link_nodes(
|
51
47
|
graph.add_buffer(template=my_stream),
|
52
48
|
graph.add("scale", f"{obj.width}:-1"),
|
@@ -61,17 +57,17 @@ def make_image_cache(tl: v3) -> dict[tuple[FileInfo, int], np.ndarray]:
|
|
61
57
|
|
62
58
|
|
63
59
|
def render_av(
|
64
|
-
output:
|
65
|
-
) ->
|
66
|
-
from_ndarray =
|
60
|
+
output: bv.container.OutputContainer, tl: v3, args: Args, log: Log
|
61
|
+
) -> Iterator[tuple[int, bv.VideoFrame]]:
|
62
|
+
from_ndarray = bv.VideoFrame.from_ndarray
|
67
63
|
|
68
64
|
src = tl.src
|
69
|
-
cns: dict[FileInfo,
|
70
|
-
decoders: dict[FileInfo, Iterator[
|
65
|
+
cns: dict[FileInfo, bv.container.InputContainer] = {}
|
66
|
+
decoders: dict[FileInfo, Iterator[bv.VideoFrame]] = {}
|
71
67
|
seek_cost: dict[FileInfo, int] = {}
|
72
68
|
tous: dict[FileInfo, int] = {}
|
73
69
|
|
74
|
-
|
70
|
+
pix_fmt = "yuv420p" # Reasonable default
|
75
71
|
target_fps = tl.tb # Always constant
|
76
72
|
img_cache = make_image_cache(tl)
|
77
73
|
|
@@ -81,7 +77,7 @@ def render_av(
|
|
81
77
|
first_src = src
|
82
78
|
|
83
79
|
if src not in cns:
|
84
|
-
cns[src] =
|
80
|
+
cns[src] = bv.open(f"{src.path}")
|
85
81
|
|
86
82
|
for src, cn in cns.items():
|
87
83
|
if len(cn.streams.video) > 0:
|
@@ -101,30 +97,30 @@ def render_av(
|
|
101
97
|
decoders[src] = cn.decode(stream)
|
102
98
|
|
103
99
|
if src == first_src and stream.pix_fmt is not None:
|
104
|
-
|
100
|
+
pix_fmt = stream.pix_fmt
|
105
101
|
|
106
102
|
log.debug(f"Tous: {tous}")
|
107
103
|
log.debug(f"Clips: {tl.v}")
|
108
104
|
|
109
|
-
codec =
|
105
|
+
codec = bv.Codec(args.video_codec, "w")
|
106
|
+
|
107
|
+
need_valid_fmt = True
|
108
|
+
if codec.video_formats is not None:
|
109
|
+
for video_format in codec.video_formats:
|
110
|
+
if pix_fmt == video_format.name:
|
111
|
+
need_valid_fmt = False
|
112
|
+
break
|
110
113
|
|
111
|
-
if
|
112
|
-
if codec.
|
113
|
-
|
114
|
-
|
115
|
-
|
114
|
+
if need_valid_fmt:
|
115
|
+
if codec.canonical_name == "gif":
|
116
|
+
pix_fmt = "rgb8"
|
117
|
+
elif codec.canonical_name == "prores":
|
118
|
+
pix_fmt = "yuv422p10le"
|
116
119
|
else:
|
117
|
-
|
118
|
-
elif codec.canonical_name == "prores":
|
119
|
-
target_pix_fmt = "yuv422p10le"
|
120
|
-
else:
|
121
|
-
target_pix_fmt = (
|
122
|
-
target_pix_fmt if target_pix_fmt in allowed_pix_fmt else "yuv420p"
|
123
|
-
)
|
120
|
+
pix_fmt = "yuv420p"
|
124
121
|
|
125
122
|
del codec
|
126
|
-
|
127
|
-
output_stream = output.add_stream(args.video_codec, rate=target_fps, options=ops)
|
123
|
+
output_stream = output.add_stream(args.video_codec, rate=target_fps)
|
128
124
|
|
129
125
|
cc = output_stream.codec_context
|
130
126
|
if args.vprofile is not None:
|
@@ -136,8 +132,8 @@ def render_av(
|
|
136
132
|
|
137
133
|
cc.profile = args.vprofile.title()
|
138
134
|
|
139
|
-
yield output_stream
|
140
|
-
if not isinstance(output_stream,
|
135
|
+
yield output_stream # type: ignore
|
136
|
+
if not isinstance(output_stream, bv.VideoStream):
|
141
137
|
log.error(f"Not a known video codec: {args.video_codec}")
|
142
138
|
if src.videos and src.videos[0].lang is not None:
|
143
139
|
output_stream.metadata["language"] = src.videos[0].lang
|
@@ -148,10 +144,10 @@ def render_av(
|
|
148
144
|
else:
|
149
145
|
target_width = max(round(tl.res[0] * args.scale), 2)
|
150
146
|
target_height = max(round(tl.res[1] * args.scale), 2)
|
151
|
-
scale_graph =
|
147
|
+
scale_graph = bv.filter.Graph()
|
152
148
|
scale_graph.link_nodes(
|
153
149
|
scale_graph.add(
|
154
|
-
"buffer", video_size="1x1", time_base="1/1", pix_fmt=
|
150
|
+
"buffer", video_size="1x1", time_base="1/1", pix_fmt=pix_fmt
|
155
151
|
),
|
156
152
|
scale_graph.add("scale", f"{target_width}:{target_height}"),
|
157
153
|
scale_graph.add("buffersink"),
|
@@ -159,7 +155,7 @@ def render_av(
|
|
159
155
|
|
160
156
|
output_stream.width = target_width
|
161
157
|
output_stream.height = target_height
|
162
|
-
output_stream.pix_fmt =
|
158
|
+
output_stream.pix_fmt = pix_fmt
|
163
159
|
output_stream.framerate = target_fps
|
164
160
|
|
165
161
|
color_range = src.videos[0].color_range
|
@@ -191,7 +187,7 @@ def render_av(
|
|
191
187
|
frames_saved = 0
|
192
188
|
|
193
189
|
bg = args.background
|
194
|
-
null_frame = make_solid(target_width, target_height,
|
190
|
+
null_frame = make_solid(target_width, target_height, pix_fmt, bg)
|
195
191
|
frame_index = -1
|
196
192
|
|
197
193
|
for index in range(tl.end):
|
@@ -250,7 +246,7 @@ def render_av(
|
|
250
246
|
|
251
247
|
if (frame.width, frame.height) != tl.res:
|
252
248
|
width, height = tl.res
|
253
|
-
graph =
|
249
|
+
graph = bv.filter.Graph()
|
254
250
|
graph.link_nodes(
|
255
251
|
graph.add_buffer(template=my_stream),
|
256
252
|
graph.add(
|
@@ -262,7 +258,7 @@ def render_av(
|
|
262
258
|
).vpush(frame)
|
263
259
|
frame = graph.vpull()
|
264
260
|
elif isinstance(obj, TlRect):
|
265
|
-
graph =
|
261
|
+
graph = bv.filter.Graph()
|
266
262
|
x, y = obj.x, obj.y
|
267
263
|
graph.link_nodes(
|
268
264
|
graph.add_buffer(template=my_stream),
|
@@ -308,9 +304,9 @@ def render_av(
|
|
308
304
|
scale_graph.vpush(frame)
|
309
305
|
frame = scale_graph.vpull()
|
310
306
|
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
yield (index,
|
307
|
+
frame = frame.reformat(format=pix_fmt)
|
308
|
+
frame.pts = None # type: ignore
|
309
|
+
frame.time_base = 0 # type: ignore
|
310
|
+
yield (index, frame)
|
315
311
|
|
316
312
|
log.debug(f"Total frames saved seeking: {frames_saved}")
|
auto_editor/utils/container.py
CHANGED
@@ -3,8 +3,8 @@ from __future__ import annotations
|
|
3
3
|
from dataclasses import dataclass
|
4
4
|
from typing import TypedDict
|
5
5
|
|
6
|
-
import
|
7
|
-
from
|
6
|
+
import bv
|
7
|
+
from bv.codec import Codec
|
8
8
|
|
9
9
|
|
10
10
|
class DictContainer(TypedDict, total=False):
|
@@ -61,7 +61,7 @@ def codec_type(x: str) -> str:
|
|
61
61
|
|
62
62
|
|
63
63
|
def container_constructor(ext: str) -> Container:
|
64
|
-
with
|
64
|
+
with bv.open(f".{ext}", "w") as container:
|
65
65
|
codecs = container.supported_codecs
|
66
66
|
if ext == "webm":
|
67
67
|
vdefault = "vp9"
|
@@ -1,6 +1,6 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.4
|
2
2
|
Name: auto-editor
|
3
|
-
Version:
|
3
|
+
Version: 27.0.0
|
4
4
|
Summary: Auto-Editor: Effort free video editing!
|
5
5
|
Author-email: WyattBlue <wyattblue@auto-editor.com>
|
6
6
|
License: Unlicense
|
@@ -11,8 +11,9 @@ Keywords: video,audio,media,editor,editing,processing,nonlinear,automatic,silenc
|
|
11
11
|
Requires-Python: <3.14,>=3.10
|
12
12
|
Description-Content-Type: text/markdown
|
13
13
|
License-File: LICENSE
|
14
|
-
Requires-Dist: numpy<3.0,>=
|
15
|
-
Requires-Dist:
|
14
|
+
Requires-Dist: numpy<3.0,>=2
|
15
|
+
Requires-Dist: basswood-av<16,>=15.0.0
|
16
|
+
Dynamic: license-file
|
16
17
|
|
17
18
|
<p align="center"><img src="https://auto-editor.com/img/auto-editor-banner.webp" title="Auto-Editor" width="700"></p>
|
18
19
|
|
@@ -175,9 +176,9 @@ auto-editor --margin --help
|
|
175
176
|
|
176
177
|
## Articles
|
177
178
|
- [How to Install Auto-Editor](https://auto-editor.com/installing)
|
178
|
-
- [All the Options (And What They Do)](https://auto-editor.com/options)
|
179
|
+
- [All the Options (And What They Do)](https://auto-editor.com/ref/options)
|
179
180
|
- [Docs](https://auto-editor.com/docs)
|
180
|
-
- [Blog](https://
|
181
|
+
- [Blog](https://basswood-io.com/blog/)
|
181
182
|
|
182
183
|
## Copyright
|
183
184
|
Auto-Editor is under the [Public Domain](https://github.com/WyattBlue/auto-editor/blob/master/LICENSE) and includes all directories besides the ones listed below. Auto-Editor was created by [these people.](https://auto-editor.com/blog/thank-you-early-testers)
|
@@ -1,11 +1,12 @@
|
|
1
|
-
auto_editor/__init__.py,sha256=
|
2
|
-
auto_editor/__main__.py,sha256=
|
3
|
-
auto_editor/analyze.py,sha256=
|
4
|
-
auto_editor/edit.py,sha256=
|
5
|
-
auto_editor/ffwrapper.py,sha256=
|
1
|
+
auto_editor/__init__.py,sha256=KViW4EBA7GbEItgvzRFMRG3Xq3ASIbwCSsNE9WwakVc,23
|
2
|
+
auto_editor/__main__.py,sha256=iKfQKFOQDv0-uZecLzfb8A-0k5dAxxe94FaIIEayGXc,15575
|
3
|
+
auto_editor/analyze.py,sha256=CeJG0LI9wXZk1R-QPrNGPS4za-_Avd8y7H-D437DqLg,12300
|
4
|
+
auto_editor/edit.py,sha256=9rJC6IY-jMdQDolJBxfzng43ddYQpC8zuZQHLzEct8s,20698
|
5
|
+
auto_editor/ffwrapper.py,sha256=b2XDsJMmBnYtRAGrIjqhYH909GNo30tMW3FCZUhhZ5k,4781
|
6
6
|
auto_editor/help.py,sha256=CzfDTsL4GuGu596ySHKj_wKnxGR9h8B0KUdkZpo33oE,8044
|
7
|
+
auto_editor/json.py,sha256=8IVhZJSLx2IVqJsbR5YKDvbHOhgIOvdQmYNpMdMG_xA,9332
|
7
8
|
auto_editor/make_layers.py,sha256=VKdBj6Kbe5CAoDIDK_MdqHVu2TXZ0sjeEbqyFTA27gI,9617
|
8
|
-
auto_editor/output.py,sha256=
|
9
|
+
auto_editor/output.py,sha256=YgkZw0WyVfcTYH-4j6kYfvB6A1BjxGLmfOQVFi-QK_o,2561
|
9
10
|
auto_editor/preview.py,sha256=cqQdozM2IB-5qXHNxeqiSrSdEIzlMfjD4SU-NX9sYZ0,3052
|
10
11
|
auto_editor/timeline.py,sha256=f1cxAhduoVHBTRgRwGqI3BKBb31aAVrWkEahH5gJ-0o,8379
|
11
12
|
auto_editor/vanparse.py,sha256=Ug5A2QaRqGiw4l55Z_h9T2QU1x0WqRibR7yY5rQ0WTk,10002
|
@@ -13,44 +14,43 @@ auto_editor/wavfile.py,sha256=afFfje8cK9lFjIkYoBbQHfvQIpsEPxWvspCtFhUKlAw,9499
|
|
13
14
|
auto_editor/cmds/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
14
15
|
auto_editor/cmds/cache.py,sha256=bViYbtVXefTeEIUvSanDfA6cG35ep1N_Jvtz7ZjgIkY,1959
|
15
16
|
auto_editor/cmds/desc.py,sha256=GDrKJYiHMaeTrplZAceXl1JwoqD78XsV2_5lc0Xd7po,869
|
16
|
-
auto_editor/cmds/info.py,sha256=
|
17
|
-
auto_editor/cmds/levels.py,sha256=
|
17
|
+
auto_editor/cmds/info.py,sha256=Af2aa9vW_bNfFGbRgQMqc7jj17skC6koE0XL3aF0jl0,7005
|
18
|
+
auto_editor/cmds/levels.py,sha256=EQ2hfRTe6779OtyzPIBZc5g3WhMZRddVkQWSCVV7UlE,5635
|
18
19
|
auto_editor/cmds/palet.py,sha256=ONzTqemaQq9YEfIOsDRNnwzfqnEMUMSXIQrETxyroRU,749
|
19
20
|
auto_editor/cmds/repl.py,sha256=8DgMw-XyfR5XctSmwtk4_1-zxs3ooMs72BfMRlVqLvY,3412
|
20
|
-
auto_editor/cmds/subdump.py,sha256=
|
21
|
-
auto_editor/cmds/test.py,sha256=
|
21
|
+
auto_editor/cmds/subdump.py,sha256=kHg8nfUi6I6VeJjEgMxupPa666qsYUh7ZEUxint7Gqo,2443
|
22
|
+
auto_editor/cmds/test.py,sha256=DK7T5BEtMhfrsTJSmXN_tlBKgHdajS-bICiGttq8M0c,27416
|
22
23
|
auto_editor/formats/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
23
24
|
auto_editor/formats/fcp11.py,sha256=sqjC36jI47ICPLjZJYiqGwY7foOnWOiNjkPFLdgSnI4,5208
|
24
25
|
auto_editor/formats/fcp7.py,sha256=x5cagTzGCAW3i3M6m7TZC1h8gLfSmX1UK-iiDuCpdfs,20289
|
25
|
-
auto_editor/formats/json.py,sha256=
|
26
|
+
auto_editor/formats/json.py,sha256=_dPrNr1ZC8kfSHRinG0rFudv1XFsZf2VlGAl084lMQ8,7663
|
26
27
|
auto_editor/formats/shotcut.py,sha256=-ES854LLFCMCBe100JRJedDmuk8zPev17aQMTrzPv-g,4923
|
27
28
|
auto_editor/formats/utils.py,sha256=LYXDiqOk9WwUorLGw2D0M7In9BNDkoKikNawuks7hqE,1648
|
28
29
|
auto_editor/lang/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
29
|
-
auto_editor/lang/json.py,sha256=D84vwyLtX5t5xl8S4r4jFXGVkbIg1L4IcexlS_a_k6w,9231
|
30
30
|
auto_editor/lang/libintrospection.py,sha256=6H1rGp0wqaCud5IPaoEmzULGnYt6ec7_0h32ATcw2oY,261
|
31
31
|
auto_editor/lang/libmath.py,sha256=z33A161Oe6vYYK7R6pgYjdZZe63dQkN38Qf36TL3prg,847
|
32
|
-
auto_editor/lang/palet.py,sha256=
|
33
|
-
auto_editor/lang/stdenv.py,sha256=
|
32
|
+
auto_editor/lang/palet.py,sha256=RQjyIZMJSWnzDkHTu-5mt74o9_4zO4VrcH-wLojCF7A,24113
|
33
|
+
auto_editor/lang/stdenv.py,sha256=Acf9CVXzglh3KgsJXrO7IyMMjTY5jqpz5u0QADXtDHA,44127
|
34
34
|
auto_editor/lib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
35
35
|
auto_editor/lib/contracts.py,sha256=lExGQymcQUmwG5lC1lO4qm4GY8W0q_yzK_miTaAoPA4,7586
|
36
36
|
auto_editor/lib/data_structs.py,sha256=Hnzl5gWvo-geTU0g-lGejj6HQW3VvPv0NBEj2XoGskY,7089
|
37
37
|
auto_editor/lib/err.py,sha256=UlszQJdzMZwkbT8x3sY4GkCV_5x9yrd6uVVUzvA8iiI,35
|
38
38
|
auto_editor/render/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
39
|
-
auto_editor/render/audio.py,sha256=
|
40
|
-
auto_editor/render/subtitle.py,sha256=
|
41
|
-
auto_editor/render/video.py,sha256=
|
39
|
+
auto_editor/render/audio.py,sha256=7iQMtex8hzzLH80pwLD_nwN_ZH3GHjWRmER45ZVEzPk,12646
|
40
|
+
auto_editor/render/subtitle.py,sha256=F27T8OsAojUIGTGBWqTdH36h0BnHXSExxIqzOtqyZoE,6129
|
41
|
+
auto_editor/render/video.py,sha256=g2TbuCNzhbE8KsS-_3XRLLdmQKFROdwfkymwIbGmtqc,12012
|
42
42
|
auto_editor/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
43
43
|
auto_editor/utils/bar.py,sha256=Ky9JRf37JTgLyvNuIXDfucaUE8H1vBbCqKLjttmsmmo,4156
|
44
44
|
auto_editor/utils/chunks.py,sha256=J-eGKtEz68gFtRrj1kOSgH4Tj_Yz6prNQ7Xr-d9NQJw,52
|
45
45
|
auto_editor/utils/cmdkw.py,sha256=aUGBvBel2Ko1o6Rwmr4rEL-BMc5hEnzYLbyZ1GeJdcY,5729
|
46
|
-
auto_editor/utils/container.py,sha256=
|
46
|
+
auto_editor/utils/container.py,sha256=UPqlAos7UIf_ARIAbB3wuaSv1iNLFgy22YFGK8559yM,2487
|
47
47
|
auto_editor/utils/func.py,sha256=C8ucgsSEzPyBc-8obhsCXd_uQW0cnCdBn1KVxB7FHjU,2747
|
48
48
|
auto_editor/utils/log.py,sha256=wPNf6AabV-0cnoS_bPLv1Lh7llQBtNqPKeh07einOuc,3701
|
49
49
|
auto_editor/utils/types.py,sha256=j2hd4zMQ9EftDy41Ji2_PFru_7HEZObd9yKA0BJxFaY,7616
|
50
|
-
|
51
|
-
|
52
|
-
auto_editor-
|
53
|
-
auto_editor-
|
54
|
-
auto_editor-
|
55
|
-
auto_editor-
|
56
|
-
auto_editor-
|
50
|
+
auto_editor-27.0.0.dist-info/licenses/LICENSE,sha256=yiq99pWITHfqS0pbZMp7cy2dnbreTuvBwudsU-njvIM,1210
|
51
|
+
docs/build.py,sha256=g1uc1H9T_naGaermUiVMMwUpbT0IWElRhjgT0fvCh8w,1914
|
52
|
+
auto_editor-27.0.0.dist-info/METADATA,sha256=VhQA-UaBuv5unUT8MUVkQ_oVwGisctF3BS5tTSTkDfA,6165
|
53
|
+
auto_editor-27.0.0.dist-info/WHEEL,sha256=tTnHoFhvKQHCh4jz3yCn0WPTYIy7wXx3CJtJ7SJGV7c,91
|
54
|
+
auto_editor-27.0.0.dist-info/entry_points.txt,sha256=UAsTc7qJQbnAzHd7KWg-ALo_X9Hj2yDs3M9I2DV3eyI,212
|
55
|
+
auto_editor-27.0.0.dist-info/top_level.txt,sha256=jBV5zlbWRbKOa-xaWPvTD45QL7lGExx2BDzv-Ji4dTw,17
|
56
|
+
auto_editor-27.0.0.dist-info/RECORD,,
|
docs/build.py
CHANGED
@@ -19,13 +19,22 @@ def main():
|
|
19
19
|
parser = main_options(parser)
|
20
20
|
|
21
21
|
with open("src/ref/options.html", "w") as file:
|
22
|
-
file.write(
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
22
|
+
file.write("""\
|
23
|
+
<!DOCTYPE html>
|
24
|
+
<html lang="en">
|
25
|
+
<head>
|
26
|
+
{{ init_head }}
|
27
|
+
{{ headerdesc "Options" "These are the options and flags that auto-editor uses." }}
|
28
|
+
{{ head_icon }}
|
29
|
+
<style>
|
30
|
+
{{ core_style }}
|
31
|
+
</style>
|
32
|
+
<body>
|
33
|
+
{{ nav }}
|
34
|
+
<section class="section">
|
35
|
+
<div class="container">
|
36
|
+
""")
|
37
|
+
|
29
38
|
for op in parser.args:
|
30
39
|
if isinstance(op, OptionText):
|
31
40
|
file.write(f"<h2>{escape(op.text)}</h2>\n")
|
File without changes
|
File without changes
|
File without changes
|