typed-ffmpeg-compatible 3.5.0__tar.gz → 3.5.2__tar.gz

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.
Files changed (74) hide show
  1. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/MANIFEST.in +1 -1
  2. {typed_ffmpeg_compatible-3.5.0/src/typed_ffmpeg_compatible.egg-info → typed_ffmpeg_compatible-3.5.2}/PKG-INFO +1 -1
  3. typed_ffmpeg_compatible-3.5.2/requirements.txt +440 -0
  4. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/_version.py +2 -2
  5. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/compile/compile_cli.py +32 -4
  6. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/compile/validate.py +5 -5
  7. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/dag/global_runnable/runnable.py +45 -9
  8. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/types.py +18 -18
  9. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/utils/snapshot.py +2 -2
  10. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2/src/typed_ffmpeg_compatible.egg-info}/PKG-INFO +1 -1
  11. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg_compatible.egg-info/SOURCES.txt +1 -0
  12. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/LICENSE +0 -0
  13. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/README.md +0 -0
  14. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/pyproject.toml +0 -0
  15. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/setup.cfg +0 -0
  16. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/__init__.py +0 -0
  17. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/base.py +0 -0
  18. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/codecs/__init__.py +0 -0
  19. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/codecs/decoders.py +0 -0
  20. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/codecs/encoders.py +0 -0
  21. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/codecs/schema.py +0 -0
  22. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/common/__init__.py +0 -0
  23. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/common/cache.py +0 -0
  24. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/common/schema.py +0 -0
  25. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/common/serialize.py +0 -0
  26. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/compile/__init__.py +0 -0
  27. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/compile/compile_json.py +0 -0
  28. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/compile/compile_python.py +0 -0
  29. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/compile/context.py +0 -0
  30. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/dag/__init__.py +0 -0
  31. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/dag/factory.py +0 -0
  32. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/dag/global_runnable/__init__.py +0 -0
  33. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/dag/global_runnable/global_args.py +0 -0
  34. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/dag/io/__init__.py +0 -0
  35. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/dag/io/_input.py +0 -0
  36. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/dag/io/_output.py +0 -0
  37. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/dag/io/output_args.py +0 -0
  38. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/dag/nodes.py +0 -0
  39. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/dag/schema.py +0 -0
  40. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/dag/utils.py +0 -0
  41. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/exceptions.py +0 -0
  42. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/ffprobe/__init__.py +0 -0
  43. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/ffprobe/parse.py +0 -0
  44. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/ffprobe/probe.py +0 -0
  45. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/ffprobe/schema.py +0 -0
  46. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/ffprobe/xml2json.py +0 -0
  47. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/filters.py +0 -0
  48. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/formats/__init__.py +0 -0
  49. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/formats/demuxers.py +0 -0
  50. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/formats/muxers.py +0 -0
  51. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/formats/schema.py +0 -0
  52. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/info.py +0 -0
  53. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/py.typed +0 -0
  54. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/schema.py +0 -0
  55. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/sources.py +0 -0
  56. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/streams/__init__.py +0 -0
  57. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/streams/audio.py +0 -0
  58. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/streams/av.py +0 -0
  59. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/streams/channel_layout.py +0 -0
  60. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/streams/subtitle.py +0 -0
  61. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/streams/video.py +0 -0
  62. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/utils/__init__.py +0 -0
  63. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/utils/escaping.py +0 -0
  64. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/utils/frozendict.py +0 -0
  65. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/utils/lazy_eval/__init__.py +0 -0
  66. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/utils/lazy_eval/operator.py +0 -0
  67. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/utils/lazy_eval/schema.py +0 -0
  68. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/utils/run.py +0 -0
  69. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/utils/typing.py +0 -0
  70. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg/utils/view.py +0 -0
  71. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg_compatible.egg-info/dependency_links.txt +0 -0
  72. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg_compatible.egg-info/entry_points.txt +0 -0
  73. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg_compatible.egg-info/requires.txt +0 -0
  74. {typed_ffmpeg_compatible-3.5.0 → typed_ffmpeg_compatible-3.5.2}/src/typed_ffmpeg_compatible.egg-info/top_level.txt +0 -0
@@ -19,7 +19,7 @@ global-exclude codecov.yml
19
19
  global-exclude mkdocs.yml
20
20
  global-exclude pyproject-compatible.toml
21
21
  global-exclude requirements.in
22
- global-exclude requirements.txt
22
+ global-exclude requirements.in
23
23
  global-exclude tox.ini
24
24
  global-exclude uv.lock
25
25
  global-exclude README.ipynb
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: typed-ffmpeg-compatible
3
- Version: 3.5.0
3
+ Version: 3.5.2
4
4
  Summary: Modern Python FFmpeg wrappers offer comprehensive support for complex filters, complete with detailed typing and documentation.
5
5
  Author-email: lucemia <lucemia@gmail.com>
6
6
  License-Expression: MIT
@@ -0,0 +1,440 @@
1
+ # This file was autogenerated by uv via the following command:
2
+ # uv pip compile requirements.in
3
+ asttokens==2.4.1
4
+ # via
5
+ # devtools
6
+ # stack-data
7
+ attrs==25.3.0
8
+ # via
9
+ # jsonschema
10
+ # referencing
11
+ babel==2.17.0
12
+ # via mkdocs-material
13
+ backports-tarfile==1.2.0
14
+ # via jaraco-context
15
+ backrefs==5.9
16
+ # via mkdocs-material
17
+ beautifulsoup4==4.13.4
18
+ # via
19
+ # -r requirements.in
20
+ # nbconvert
21
+ black==25.1.0
22
+ # via -r requirements.in
23
+ bleach[css]==6.2.0
24
+ # via nbconvert
25
+ build==1.2.2.post1
26
+ # via -r requirements.in
27
+ certifi==2025.6.15
28
+ # via requests
29
+ cffi==1.17.1
30
+ # via cryptography
31
+ cfgv==3.4.0
32
+ # via pre-commit
33
+ charset-normalizer==3.4.2
34
+ # via requests
35
+ click==8.2.1
36
+ # via
37
+ # black
38
+ # mkdocs
39
+ # typer
40
+ colorama==0.4.6
41
+ # via
42
+ # griffe
43
+ # mkdocs-material
44
+ comm==0.2.2
45
+ # via ipykernel
46
+ coverage[toml]==7.8.2
47
+ # via pytest-cov
48
+ cryptography==45.0.4
49
+ # via secretstorage
50
+ debugpy==1.8.14
51
+ # via ipykernel
52
+ decorator==5.2.1
53
+ # via ipython
54
+ defusedxml==0.7.1
55
+ # via nbconvert
56
+ devtools==0.12.2
57
+ # via -r requirements.in
58
+ distlib==0.3.9
59
+ # via virtualenv
60
+ docutils==0.21.2
61
+ # via readme-renderer
62
+ exceptiongroup==1.3.0
63
+ # via
64
+ # ipython
65
+ # pytest
66
+ executing==2.2.0
67
+ # via
68
+ # devtools
69
+ # stack-data
70
+ fastjsonschema==2.21.1
71
+ # via nbformat
72
+ filelock==3.18.0
73
+ # via virtualenv
74
+ ghp-import==2.1.0
75
+ # via mkdocs
76
+ gitdb==4.0.12
77
+ # via gitpython
78
+ gitpython==3.1.44
79
+ # via mknotebooks
80
+ graphviz==0.21 ; platform_system != "Windows"
81
+ # via -r requirements.in
82
+ griffe==1.7.3
83
+ # via
84
+ # griffe-inherited-docstrings
85
+ # mkdocstrings-python
86
+ griffe-inherited-docstrings==1.1.1
87
+ # via -r requirements.in
88
+ html2text==2025.4.15
89
+ # via -r requirements.in
90
+ id==1.5.0
91
+ # via twine
92
+ identify==2.6.12
93
+ # via pre-commit
94
+ idna==3.10
95
+ # via
96
+ # requests
97
+ # yarl
98
+ importlib-metadata==8.7.0
99
+ # via keyring
100
+ iniconfig==2.1.0
101
+ # via pytest
102
+ ipykernel==6.29.5
103
+ # via -r requirements.in
104
+ ipython==8.37.0
105
+ # via ipykernel
106
+ jaraco-classes==3.4.0
107
+ # via keyring
108
+ jaraco-context==6.0.1
109
+ # via keyring
110
+ jaraco-functools==4.2.1
111
+ # via keyring
112
+ jedi==0.19.2
113
+ # via ipython
114
+ jeepney==0.9.0
115
+ # via
116
+ # keyring
117
+ # secretstorage
118
+ jinja2==3.1.6
119
+ # via
120
+ # -r requirements.in
121
+ # mkdocs
122
+ # mkdocs-material
123
+ # mkdocstrings
124
+ # nbconvert
125
+ jsonschema==4.24.0
126
+ # via nbformat
127
+ jsonschema-specifications==2025.4.1
128
+ # via jsonschema
129
+ jupyter-client==8.6.3
130
+ # via
131
+ # ipykernel
132
+ # mknotebooks
133
+ # nbclient
134
+ jupyter-core==5.8.1
135
+ # via
136
+ # ipykernel
137
+ # jupyter-client
138
+ # nbclient
139
+ # nbconvert
140
+ # nbformat
141
+ jupyterlab-pygments==0.3.0
142
+ # via nbconvert
143
+ keyring==25.6.0
144
+ # via twine
145
+ lxml==5.4.0
146
+ # via -r requirements.in
147
+ markdown==3.8.2
148
+ # via
149
+ # markdown-callouts
150
+ # mkdocs
151
+ # mkdocs-autorefs
152
+ # mkdocs-material
153
+ # mkdocstrings
154
+ # mknotebooks
155
+ # pymdown-extensions
156
+ markdown-callouts==0.4.0
157
+ # via -r requirements.in
158
+ markdown-it-py==3.0.0
159
+ # via rich
160
+ markupsafe==3.0.2
161
+ # via
162
+ # jinja2
163
+ # mkdocs
164
+ # mkdocs-autorefs
165
+ # mkdocstrings
166
+ # nbconvert
167
+ matplotlib-inline==0.1.7
168
+ # via
169
+ # ipykernel
170
+ # ipython
171
+ mdurl==0.1.2
172
+ # via markdown-it-py
173
+ mergedeep==1.3.4
174
+ # via
175
+ # mkdocs
176
+ # mkdocs-get-deps
177
+ mistune==3.1.3
178
+ # via nbconvert
179
+ mkdocs==1.6.1
180
+ # via
181
+ # -r requirements.in
182
+ # mkdocs-autorefs
183
+ # mkdocs-gen-files
184
+ # mkdocs-literate-nav
185
+ # mkdocs-material
186
+ # mkdocs-section-index
187
+ # mkdocstrings
188
+ # mknotebooks
189
+ mkdocs-autorefs==1.4.2
190
+ # via
191
+ # mkdocstrings
192
+ # mkdocstrings-python
193
+ mkdocs-gen-files==0.5.0
194
+ # via -r requirements.in
195
+ mkdocs-get-deps==0.2.0
196
+ # via mkdocs
197
+ mkdocs-literate-nav==0.6.2
198
+ # via -r requirements.in
199
+ mkdocs-material==9.6.14
200
+ # via -r requirements.in
201
+ mkdocs-material-extensions==1.3.1
202
+ # via mkdocs-material
203
+ mkdocs-section-index==0.3.10
204
+ # via -r requirements.in
205
+ mkdocstrings==0.29.1
206
+ # via
207
+ # -r requirements.in
208
+ # mkdocstrings-python
209
+ mkdocstrings-python==1.16.12
210
+ # via -r requirements.in
211
+ mknotebooks==0.8.0
212
+ # via -r requirements.in
213
+ more-itertools==10.7.0
214
+ # via
215
+ # jaraco-classes
216
+ # jaraco-functools
217
+ multidict==6.5.0
218
+ # via yarl
219
+ mypy==1.16.1
220
+ # via -r requirements.in
221
+ mypy-extensions==1.1.0
222
+ # via
223
+ # black
224
+ # mypy
225
+ nbclient==0.10.2
226
+ # via nbconvert
227
+ nbconvert==7.16.6
228
+ # via mknotebooks
229
+ nbformat==5.10.4
230
+ # via
231
+ # nbclient
232
+ # nbconvert
233
+ nest-asyncio==1.6.0
234
+ # via ipykernel
235
+ nh3==0.2.21
236
+ # via readme-renderer
237
+ nodeenv==1.9.1
238
+ # via pre-commit
239
+ packaging==25.0
240
+ # via
241
+ # black
242
+ # build
243
+ # ipykernel
244
+ # mkdocs
245
+ # nbconvert
246
+ # pytest
247
+ # setuptools-scm
248
+ # twine
249
+ paginate==0.5.7
250
+ # via mkdocs-material
251
+ pandocfilters==1.5.1
252
+ # via nbconvert
253
+ parso==0.8.4
254
+ # via jedi
255
+ pathspec==0.12.1
256
+ # via
257
+ # black
258
+ # mkdocs
259
+ # mypy
260
+ pexpect==4.9.0
261
+ # via ipython
262
+ platformdirs==4.3.8
263
+ # via
264
+ # black
265
+ # jupyter-core
266
+ # mkdocs-get-deps
267
+ # virtualenv
268
+ pluggy==1.6.0
269
+ # via
270
+ # pytest
271
+ # pytest-cov
272
+ pre-commit==4.2.0
273
+ # via -r requirements.in
274
+ prompt-toolkit==3.0.51
275
+ # via ipython
276
+ propcache==0.3.2
277
+ # via yarl
278
+ psutil==7.0.0
279
+ # via ipykernel
280
+ ptyprocess==0.7.0
281
+ # via pexpect
282
+ pure-eval==0.2.3
283
+ # via stack-data
284
+ pycparser==2.22
285
+ # via cffi
286
+ pygments==2.19.2
287
+ # via
288
+ # devtools
289
+ # ipython
290
+ # mkdocs-material
291
+ # nbconvert
292
+ # pytest
293
+ # readme-renderer
294
+ # rich
295
+ pymdown-extensions==10.16
296
+ # via
297
+ # -r requirements.in
298
+ # mkdocs-material
299
+ # mkdocstrings
300
+ pyproject-hooks==1.2.0
301
+ # via build
302
+ pytest==8.4.1
303
+ # via
304
+ # pytest-cov
305
+ # pytest-datadir
306
+ # pytest-recording
307
+ # syrupy
308
+ pytest-cov==6.2.1
309
+ # via -r requirements.in
310
+ pytest-datadir==1.7.2
311
+ # via -r requirements.in
312
+ pytest-recording==0.13.4
313
+ # via -r requirements.in
314
+ python-dateutil==2.9.0.post0
315
+ # via
316
+ # ghp-import
317
+ # jupyter-client
318
+ pyyaml==6.0.2
319
+ # via
320
+ # mkdocs
321
+ # mkdocs-get-deps
322
+ # pre-commit
323
+ # pymdown-extensions
324
+ # pyyaml-env-tag
325
+ # vcrpy
326
+ pyyaml-env-tag==1.1
327
+ # via mkdocs
328
+ pyzmq==27.0.0
329
+ # via
330
+ # ipykernel
331
+ # jupyter-client
332
+ readme-renderer==44.0
333
+ # via twine
334
+ referencing==0.36.2
335
+ # via
336
+ # jsonschema
337
+ # jsonschema-specifications
338
+ requests==2.32.4
339
+ # via
340
+ # id
341
+ # mkdocs-material
342
+ # requests-toolbelt
343
+ # twine
344
+ requests-toolbelt==1.0.0
345
+ # via twine
346
+ rfc3986==2.0.0
347
+ # via twine
348
+ rich==14.0.0
349
+ # via
350
+ # twine
351
+ # typer
352
+ rpds-py==0.25.1
353
+ # via
354
+ # jsonschema
355
+ # referencing
356
+ ruff==0.12.0
357
+ # via -r requirements.in
358
+ secretstorage==3.3.3
359
+ # via keyring
360
+ setuptools-scm==8.3.1
361
+ # via -r requirements.in
362
+ shellingham==1.5.4
363
+ # via typer
364
+ six==1.17.0
365
+ # via
366
+ # asttokens
367
+ # python-dateutil
368
+ smmap==5.0.2
369
+ # via gitdb
370
+ soupsieve==2.7
371
+ # via beautifulsoup4
372
+ stack-data==0.6.3
373
+ # via ipython
374
+ syrupy==4.9.1
375
+ # via -r requirements.in
376
+ tinycss2==1.4.0
377
+ # via bleach
378
+ tomli==2.2.1
379
+ # via
380
+ # black
381
+ # build
382
+ # coverage
383
+ # mypy
384
+ # pytest
385
+ # setuptools-scm
386
+ tornado==6.5.1
387
+ # via
388
+ # ipykernel
389
+ # jupyter-client
390
+ traitlets==5.14.3
391
+ # via
392
+ # comm
393
+ # ipykernel
394
+ # ipython
395
+ # jupyter-client
396
+ # jupyter-core
397
+ # matplotlib-inline
398
+ # nbclient
399
+ # nbconvert
400
+ # nbformat
401
+ twine==6.1.0
402
+ # via -r requirements.in
403
+ typer==0.16.0
404
+ # via -r requirements.in
405
+ typing-extensions==4.14.0
406
+ # via
407
+ # beautifulsoup4
408
+ # black
409
+ # exceptiongroup
410
+ # ipython
411
+ # mistune
412
+ # mkdocstrings-python
413
+ # multidict
414
+ # mypy
415
+ # referencing
416
+ # rich
417
+ # typer
418
+ urllib3==2.5.0
419
+ # via
420
+ # requests
421
+ # twine
422
+ # vcrpy
423
+ vcrpy==7.0.0
424
+ # via pytest-recording
425
+ virtualenv==20.31.2
426
+ # via pre-commit
427
+ watchdog==6.0.0
428
+ # via mkdocs
429
+ wcwidth==0.2.13
430
+ # via prompt-toolkit
431
+ webencodings==0.5.1
432
+ # via
433
+ # bleach
434
+ # tinycss2
435
+ wrapt==1.17.2
436
+ # via vcrpy
437
+ yarl==1.20.1
438
+ # via vcrpy
439
+ zipp==3.23.0
440
+ # via importlib-metadata
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '3.5.0'
21
- __version_tuple__ = version_tuple = (3, 5, 0)
20
+ __version__ = version = '3.5.2'
21
+ __version_tuple__ = version_tuple = (3, 5, 2)
@@ -16,8 +16,10 @@ filter graph syntax, and escaping of special characters in FFmpeg commands.
16
16
 
17
17
  from __future__ import annotations
18
18
 
19
+ import logging
19
20
  import re
20
21
  import shlex
22
+ import tempfile
21
23
  from collections import defaultdict
22
24
  from collections.abc import Mapping
23
25
  from dataclasses import replace
@@ -47,6 +49,8 @@ from ..utils.run import command_line
47
49
  from .context import DAGContext
48
50
  from .validate import validate
49
51
 
52
+ logger = logging.getLogger(__name__)
53
+
50
54
 
51
55
  def get_options_dict() -> dict[str, FFMpegOption]:
52
56
  """
@@ -502,7 +506,9 @@ def parse(cli: str) -> Stream:
502
506
  return result
503
507
 
504
508
 
505
- def compile(stream: Stream, auto_fix: bool = True) -> str:
509
+ def compile(
510
+ stream: Stream, auto_fix: bool = True, use_filter_complex_script: bool = False
511
+ ) -> str:
506
512
  """
507
513
  Compile a stream into a command-line string.
508
514
 
@@ -512,14 +518,20 @@ def compile(stream: Stream, auto_fix: bool = True) -> str:
512
518
  Args:
513
519
  stream: The Stream object to compile into a command-line string
514
520
  auto_fix: Whether to automatically fix issues in the stream
521
+ use_filter_complex_script: If True, use -filter_complex_script with a
522
+ temporary file instead of -filter_complex
515
523
 
516
524
  Returns:
517
525
  A command-line string that can be passed to FFmpeg
518
526
  """
519
- return "ffmpeg " + command_line(compile_as_list(stream, auto_fix))
527
+ return "ffmpeg " + command_line(
528
+ compile_as_list(stream, auto_fix, use_filter_complex_script)
529
+ )
520
530
 
521
531
 
522
- def compile_as_list(stream: Stream, auto_fix: bool = True) -> list[str]:
532
+ def compile_as_list(
533
+ stream: Stream, auto_fix: bool = True, use_filter_complex_script: bool = False
534
+ ) -> list[str]:
523
535
  """
524
536
  Compile a stream into a list of FFmpeg command-line arguments.
525
537
 
@@ -545,6 +557,8 @@ def compile_as_list(stream: Stream, auto_fix: bool = True) -> list[str]:
545
557
  - Properly labels all streams
546
558
  - Maintains correct filter chain order
547
559
  - Handles stream splitting and merging
560
+ - If use_filter_complex_script is True, creates a temporary file
561
+ with the filter complex content and uses -filter_complex_script
548
562
 
549
563
  5. Output Files: Processes destination files
550
564
  - File paths and output options
@@ -560,6 +574,8 @@ def compile_as_list(stream: Stream, auto_fix: bool = True) -> list[str]:
560
574
  stream: The Stream object to compile into arguments
561
575
  auto_fix: Whether to automatically fix issues in the stream
562
576
  (e.g., reconnecting disconnected nodes)
577
+ use_filter_complex_script: If True, use -filter_complex_script with a
578
+ temporary file instead of -filter_complex
563
579
 
564
580
  Returns:
565
581
  A list of strings representing FFmpeg command-line arguments
@@ -605,7 +621,19 @@ def compile_as_list(stream: Stream, auto_fix: bool = True) -> list[str]:
605
621
  vf_commands += ["".join(get_args(node, context))]
606
622
 
607
623
  if vf_commands:
608
- commands += ["-filter_complex", ";".join(vf_commands)]
624
+ filter_complex_content = ";".join(vf_commands)
625
+
626
+ if use_filter_complex_script:
627
+ # Create a temporary file with the filter complex content
628
+ with tempfile.NamedTemporaryFile(
629
+ mode="w", suffix=".txt", delete=False
630
+ ) as f:
631
+ f.write(filter_complex_content)
632
+ temp_filename = f.name
633
+
634
+ commands += ["-filter_complex_script", temp_filename]
635
+ else:
636
+ commands += ["-filter_complex", filter_complex_content]
609
637
 
610
638
  # compile the output nodes
611
639
  output_nodes = [node for node in context.all_nodes if isinstance(node, OutputNode)]
@@ -21,7 +21,7 @@ from .context import DAGContext
21
21
 
22
22
 
23
23
  def remove_split(
24
- current_stream: Stream, mapping: dict[Stream, Stream] = None
24
+ current_stream: Stream, mapping: dict[Stream, Stream] | None = None
25
25
  ) -> tuple[Stream, dict[Stream, Stream]]:
26
26
  """
27
27
  Remove all split nodes from the graph to prepare for reconstruction.
@@ -91,10 +91,10 @@ def remove_split(
91
91
 
92
92
  def add_split(
93
93
  current_stream: Stream,
94
- down_node: Node = None,
95
- down_index: int = None,
96
- context: DAGContext = None,
97
- mapping: dict[tuple[Stream, Node | None, int | None], Stream] = None,
94
+ down_node: Node | None = None,
95
+ down_index: int | None = None,
96
+ context: DAGContext | None = None,
97
+ mapping: dict[tuple[Stream, Node | None, int | None], Stream] | None = None,
98
98
  ) -> tuple[Stream, dict[tuple[Stream, Node | None, int | None], Stream]]:
99
99
  """
100
100
  Add split nodes to the graph where streams are reused.
@@ -83,6 +83,7 @@ class GlobalRunable(GlobalArgs):
83
83
  cmd: str | list[str] = "ffmpeg",
84
84
  overwrite_output: bool | None = None,
85
85
  auto_fix: bool = True,
86
+ use_filter_complex_script: bool = False,
86
87
  ) -> list[str]:
87
88
  """
88
89
  Build command-line arguments for invoking FFmpeg.
@@ -100,6 +101,8 @@ class GlobalRunable(GlobalArgs):
100
101
  If None (default), use the current settings
101
102
  auto_fix: Whether to automatically fix issues in the filter graph,
102
103
  such as adding split filters for reused streams
104
+ use_filter_complex_script: If True, use -filter_complex_script with a
105
+ temporary file instead of -filter_complex
103
106
 
104
107
  Returns:
105
108
  A list of strings representing the complete FFmpeg command
@@ -117,17 +120,30 @@ class GlobalRunable(GlobalArgs):
117
120
  cmd = [cmd]
118
121
 
119
122
  if overwrite_output is True:
120
- return self.global_args(y=True).compile(cmd, auto_fix=auto_fix)
123
+ return self.global_args(y=True).compile(
124
+ cmd,
125
+ auto_fix=auto_fix,
126
+ use_filter_complex_script=use_filter_complex_script,
127
+ )
121
128
  elif overwrite_output is False:
122
- return self.global_args(n=True).compile(cmd, auto_fix=auto_fix)
129
+ return self.global_args(n=True).compile(
130
+ cmd,
131
+ auto_fix=auto_fix,
132
+ use_filter_complex_script=use_filter_complex_script,
133
+ )
123
134
 
124
- return cmd + compile_as_list(self._global_node().stream(), auto_fix=auto_fix)
135
+ return cmd + compile_as_list(
136
+ self._global_node().stream(),
137
+ auto_fix=auto_fix,
138
+ use_filter_complex_script=use_filter_complex_script,
139
+ )
125
140
 
126
141
  def compile_line(
127
142
  self,
128
143
  cmd: str | list[str] = "ffmpeg",
129
144
  overwrite_output: bool | None = None,
130
145
  auto_fix: bool = True,
146
+ use_filter_complex_script: bool = False,
131
147
  ) -> str:
132
148
  """
133
149
  Build a command-line string for invoking FFmpeg.
@@ -143,6 +159,8 @@ class GlobalRunable(GlobalArgs):
143
159
  If False, add the -n option to never overwrite
144
160
  If None (default), use the current settings
145
161
  auto_fix: Whether to automatically fix issues in the filter graph
162
+ use_filter_complex_script: If True, use -filter_complex_script with a
163
+ temporary file instead of -filter_complex
146
164
 
147
165
  Returns:
148
166
  A string representing the complete FFmpeg command with proper escaping
@@ -155,7 +173,12 @@ class GlobalRunable(GlobalArgs):
155
173
  ```
156
174
  """
157
175
  return command_line(
158
- self.compile(cmd, overwrite_output=overwrite_output, auto_fix=auto_fix)
176
+ self.compile(
177
+ cmd,
178
+ overwrite_output=overwrite_output,
179
+ auto_fix=auto_fix,
180
+ use_filter_complex_script=use_filter_complex_script,
181
+ )
159
182
  )
160
183
 
161
184
  def run_async(
@@ -167,6 +190,7 @@ class GlobalRunable(GlobalArgs):
167
190
  quiet: bool = False,
168
191
  overwrite_output: bool | None = None,
169
192
  auto_fix: bool = True,
193
+ use_filter_complex_script: bool = False,
170
194
  ) -> subprocess.Popen[bytes]:
171
195
  """
172
196
  Run FFmpeg asynchronously as a subprocess.
@@ -186,6 +210,8 @@ class GlobalRunable(GlobalArgs):
186
210
  If False, add the -n option to never overwrite
187
211
  If None (default), use the current settings
188
212
  auto_fix: Whether to automatically fix issues in the filter graph
213
+ use_filter_complex_script: If True, use -filter_complex_script with a
214
+ temporary file instead of -filter_complex
189
215
 
190
216
  Returns:
191
217
  A subprocess.Popen object representing the running FFmpeg process
@@ -199,14 +225,17 @@ class GlobalRunable(GlobalArgs):
199
225
  ```
200
226
  """
201
227
 
202
- args = self.compile(cmd, overwrite_output=overwrite_output, auto_fix=auto_fix)
228
+ args = self.compile(
229
+ cmd,
230
+ overwrite_output=overwrite_output,
231
+ auto_fix=auto_fix,
232
+ use_filter_complex_script=use_filter_complex_script,
233
+ )
203
234
  stdin_stream = subprocess.PIPE if pipe_stdin else None
204
235
  stdout_stream = subprocess.PIPE if pipe_stdout or quiet else None
205
236
  stderr_stream = subprocess.PIPE if pipe_stderr or quiet else None
206
237
 
207
- logger.info(
208
- f"Running command: {self.compile_line(cmd, overwrite_output=overwrite_output, auto_fix=auto_fix)}"
209
- )
238
+ logger.info(f"Running command: {' '.join(args)}")
210
239
 
211
240
  return subprocess.Popen(
212
241
  args,
@@ -224,6 +253,7 @@ class GlobalRunable(GlobalArgs):
224
253
  quiet: bool = False,
225
254
  overwrite_output: bool | None = None,
226
255
  auto_fix: bool = True,
256
+ use_filter_complex_script: bool = False,
227
257
  ) -> tuple[bytes, bytes]:
228
258
  """
229
259
  Run FFmpeg synchronously and wait for completion.
@@ -243,6 +273,8 @@ class GlobalRunable(GlobalArgs):
243
273
  If False, add the -n option to never overwrite
244
274
  If None (default), use the current settings
245
275
  auto_fix: Whether to automatically fix issues in the filter graph
276
+ use_filter_complex_script: If True, use -filter_complex_script with a
277
+ temporary file instead of -filter_complex
246
278
 
247
279
  Returns:
248
280
  A tuple of (stdout_bytes, stderr_bytes), which will be empty bytes
@@ -272,6 +304,7 @@ class GlobalRunable(GlobalArgs):
272
304
  quiet=quiet,
273
305
  overwrite_output=overwrite_output,
274
306
  auto_fix=auto_fix,
307
+ use_filter_complex_script=use_filter_complex_script,
275
308
  )
276
309
  stdout, stderr = process.communicate(input)
277
310
  retcode = process.poll()
@@ -280,7 +313,10 @@ class GlobalRunable(GlobalArgs):
280
313
  raise FFMpegExecuteError(
281
314
  retcode=retcode,
282
315
  cmd=self.compile_line(
283
- cmd, overwrite_output=overwrite_output, auto_fix=auto_fix
316
+ cmd,
317
+ overwrite_output=overwrite_output,
318
+ auto_fix=auto_fix,
319
+ use_filter_complex_script=use_filter_complex_script,
284
320
  ),
285
321
  stdout=stdout,
286
322
  stderr=stderr,
@@ -9,14 +9,14 @@ from typing import Literal
9
9
  from .schema import Default
10
10
  from .utils.lazy_eval.schema import LazyValue
11
11
 
12
- Boolean = bool | Literal["true", "false", "1", "0"] | Default | LazyValue
12
+ Boolean = bool | Literal["true", "false", "1", "0"] | Default | LazyValue | None
13
13
  """
14
14
  This represents FFmpeg's boolean type. It can accept either a Python boolean value (`True` or `False`)
15
15
  or a string that represents a boolean value ("true", "false", "1", or "0").
16
16
 
17
17
  """
18
18
 
19
- Duration = str | int | float | Default | LazyValue
19
+ Duration = str | int | float | Default | LazyValue | None
20
20
  """
21
21
  This represents FFmpeg's duration type. It can accept either a Python integer or float value
22
22
  or a string that represents a duration value.
@@ -25,7 +25,7 @@ Note:
25
25
  [Document](https://ffmpeg.org/ffmpeg-utils.html#Time-duration)
26
26
  """
27
27
 
28
- Color = str | Default | LazyValue
28
+ Color = str | Default | LazyValue | None
29
29
  """
30
30
  It can be the name of a color as defined below (case insensitive match) or a [0x|#]RRGGBB[AA] sequence, possibly followed by @ and a string representing the alpha component.
31
31
  The alpha component may be a string composed by "0x" followed by an hexadecimal number or a decimal number between 0.0 and 1.0, which represents the opacity value (‘0x00’ or ‘0.0’ means completely transparent, ‘0xff’ or ‘1.0’ completely opaque). If the alpha component is not specified then ‘0xff’ is assumed.
@@ -35,50 +35,50 @@ Note:
35
35
  [Document](https://ffmpeg.org/ffmpeg-utils.html#Color)
36
36
  """
37
37
 
38
- Flags = str | Default | LazyValue
38
+ Flags = str | Default | LazyValue | None
39
39
  """
40
40
  This represents FFmpeg's flags type. It accepts a string in the format "A+B",
41
41
  where "A" and "B" are individual flags. For example, "fast+bilinear" would
42
42
  represent two flags, "fast" and "bilinear", to be used in FFmpeg's command line.
43
43
  """
44
44
 
45
- Dictionary = str | Default | LazyValue
45
+ Dictionary = str | Default | LazyValue | None
46
46
  # format A=B:C=D:E=F
47
- Pix_fmt = str | Default | LazyValue
47
+ Pix_fmt = str | Default | LazyValue | None
48
48
  """
49
49
  please see `ffmpeg -pix_fmts` for a list of supported pixel formats.
50
50
  """
51
51
 
52
- Int = str | int | Default | LazyValue
52
+ Int = str | int | Default | LazyValue | None
53
53
  """
54
54
  This represents FFmpeg's integer type. It can accept either a Python integer value
55
55
  or a string that represents a integer value.
56
56
  """
57
57
 
58
- Int64 = str | int | Default | LazyValue
58
+ Int64 = str | int | Default | LazyValue | None
59
59
  """
60
60
  This represents FFmpeg's integer type. It can accept either a Python integer value
61
61
  or a string that represents a integer value.
62
62
  """
63
63
 
64
- Double = str | int | float | Default | LazyValue
64
+ Double = str | int | float | Default | LazyValue | None
65
65
  """
66
66
  This represents FFmpeg's double type. It can accept either a Python integer or float value
67
67
  or a string that represents a double value.
68
68
  """
69
69
  # TODO: more info
70
- Float = str | int | float | Default | LazyValue
70
+ Float = str | int | float | Default | LazyValue | None
71
71
  """
72
72
  This represents FFmpeg's float type. It can accept either a Python integer or float value
73
73
  or a string that represents a float value.
74
74
  """
75
- String = str | int | float | Default | LazyValue
75
+ String = str | int | float | Default | LazyValue | None
76
76
  """
77
77
  This represents FFmpeg's string type. It can accept either a Python string value
78
78
  or a int/float that will be converted to a string.
79
79
  """
80
80
 
81
- Video_rate = str | int | float | Default | LazyValue
81
+ Video_rate = str | int | float | Default | LazyValue | None
82
82
  """
83
83
  Specify the frame rate of a video, expressed as the number of frames generated per second. It has to be a string in the format frame_rate_num/frame_rate_den, an integer number, a float number or a valid video frame rate abbreviation.
84
84
 
@@ -87,7 +87,7 @@ Note:
87
87
  """
88
88
 
89
89
  # TODO: enum
90
- Image_size = str | Default | LazyValue
90
+ Image_size = str | Default | LazyValue | None
91
91
  """
92
92
  Specify the size of the sourced video, it may be a string of the form widthxheight, or the name of a size abbreviation.
93
93
 
@@ -95,7 +95,7 @@ Note:
95
95
  [Document](https://ffmpeg.org/ffmpeg-utils.html#Video-size)
96
96
  """
97
97
 
98
- Rational = str | Default | LazyValue
98
+ Rational = str | Default | LazyValue | None
99
99
  """
100
100
  Specify the frame rate of a video, expressed as the number of frames generated per second. It has to be a string in the format frame_rate_num/frame_rate_den, an integer number, a float number or a valid video frame rate abbreviation.
101
101
 
@@ -104,16 +104,16 @@ Note:
104
104
  """
105
105
 
106
106
 
107
- Sample_fmt = str | Default | LazyValue
108
- Binary = str | Default | LazyValue
107
+ Sample_fmt = str | Default | LazyValue | None
108
+ Binary = str | Default | LazyValue | None
109
109
 
110
110
  # OPT Type
111
- Func = str | int | float | Default | LazyValue
111
+ Func = str | int | float | Default | LazyValue | None
112
112
  """
113
113
  ref: OPT_TYPE_FUNC
114
114
  """
115
115
 
116
- Time = str | int | float | Default | LazyValue
116
+ Time = str | int | float | Default | LazyValue | None
117
117
  """
118
118
  ref: OPT_TYPE_TIME
119
119
  """
@@ -12,8 +12,8 @@ from typing import Optional
12
12
 
13
13
  from syrupy.extensions.json import JSONSnapshotExtension
14
14
  from syrupy.types import (
15
- PropertyFilter,
16
- PropertyMatcher,
15
+ PropertyFilter, # ty: ignore[possibly-unbound-import]
16
+ PropertyMatcher, # ty: ignore[possibly-unbound-import]
17
17
  SerializableData,
18
18
  SerializedData,
19
19
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: typed-ffmpeg-compatible
3
- Version: 3.5.0
3
+ Version: 3.5.2
4
4
  Summary: Modern Python FFmpeg wrappers offer comprehensive support for complex filters, complete with detailed typing and documentation.
5
5
  Author-email: lucemia <lucemia@gmail.com>
6
6
  License-Expression: MIT
@@ -2,6 +2,7 @@ LICENSE
2
2
  MANIFEST.in
3
3
  README.md
4
4
  pyproject.toml
5
+ requirements.txt
5
6
  src/typed_ffmpeg/__init__.py
6
7
  src/typed_ffmpeg/_version.py
7
8
  src/typed_ffmpeg/base.py