typed-ffmpeg-compatible 3.5.1__tar.gz → 3.6__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 (89) hide show
  1. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/MANIFEST.in +1 -1
  2. {typed_ffmpeg_compatible-3.5.1/src/typed_ffmpeg_compatible.egg-info → typed_ffmpeg_compatible-3.6}/PKG-INFO +1 -1
  3. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/pyproject.toml +17 -0
  4. typed_ffmpeg_compatible-3.6/requirements.txt +435 -0
  5. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/__init__.py +4 -1
  6. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/_version.py +2 -2
  7. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/base.py +4 -1
  8. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/codecs/__init__.py +2 -0
  9. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/codecs/decoders.py +1852 -1853
  10. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/codecs/encoders.py +2001 -1782
  11. typed_ffmpeg_compatible-3.6/src/typed_ffmpeg/codecs/schema.py +11 -0
  12. typed_ffmpeg_compatible-3.6/src/typed_ffmpeg/common/__init__.py +1 -0
  13. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/common/cache.py +9 -6
  14. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/common/schema.py +11 -0
  15. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/common/serialize.py +13 -7
  16. typed_ffmpeg_compatible-3.6/src/typed_ffmpeg/compile/__init__.py +1 -0
  17. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/compile/compile_cli.py +55 -8
  18. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/compile/compile_json.py +4 -0
  19. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/compile/compile_python.py +15 -0
  20. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/compile/context.py +15 -4
  21. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/compile/validate.py +9 -8
  22. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/dag/factory.py +2 -0
  23. typed_ffmpeg_compatible-3.6/src/typed_ffmpeg/dag/global_runnable/__init__.py +1 -0
  24. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/dag/global_runnable/global_args.py +2 -2
  25. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/dag/global_runnable/runnable.py +51 -11
  26. typed_ffmpeg_compatible-3.6/src/typed_ffmpeg/dag/io/__init__.py +1 -0
  27. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/dag/io/_input.py +20 -5
  28. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/dag/io/_output.py +24 -9
  29. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/dag/io/output_args.py +21 -7
  30. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/dag/nodes.py +20 -0
  31. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/dag/schema.py +19 -6
  32. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/dag/utils.py +2 -2
  33. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/exceptions.py +2 -1
  34. typed_ffmpeg_compatible-3.6/src/typed_ffmpeg/expressions.py +884 -0
  35. typed_ffmpeg_compatible-3.6/src/typed_ffmpeg/ffprobe/__init__.py +1 -0
  36. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/ffprobe/parse.py +7 -1
  37. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/ffprobe/probe.py +3 -1
  38. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/ffprobe/schema.py +83 -1
  39. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/ffprobe/xml2json.py +8 -2
  40. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/filters.py +540 -631
  41. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/formats/__init__.py +2 -0
  42. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/formats/demuxers.py +1869 -1921
  43. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/formats/muxers.py +1382 -1107
  44. typed_ffmpeg_compatible-3.6/src/typed_ffmpeg/formats/schema.py +11 -0
  45. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/info.py +8 -0
  46. typed_ffmpeg_compatible-3.6/src/typed_ffmpeg/options/__init__.py +15 -0
  47. typed_ffmpeg_compatible-3.6/src/typed_ffmpeg/options/codec.py +711 -0
  48. typed_ffmpeg_compatible-3.6/src/typed_ffmpeg/options/format.py +196 -0
  49. typed_ffmpeg_compatible-3.6/src/typed_ffmpeg/options/framesync.py +43 -0
  50. typed_ffmpeg_compatible-3.6/src/typed_ffmpeg/options/timeline.py +22 -0
  51. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/schema.py +15 -0
  52. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/sources.py +392 -381
  53. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/streams/__init__.py +2 -0
  54. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/streams/audio.py +1071 -882
  55. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/streams/av.py +9 -3
  56. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/streams/subtitle.py +3 -3
  57. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/streams/video.py +1873 -1725
  58. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/types.py +3 -2
  59. typed_ffmpeg_compatible-3.6/src/typed_ffmpeg/utils/__init__.py +1 -0
  60. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/utils/escaping.py +8 -4
  61. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/utils/frozendict.py +31 -1
  62. typed_ffmpeg_compatible-3.6/src/typed_ffmpeg/utils/lazy_eval/__init__.py +1 -0
  63. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/utils/lazy_eval/operator.py +75 -27
  64. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/utils/lazy_eval/schema.py +176 -4
  65. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/utils/run.py +2 -0
  66. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/utils/snapshot.py +3 -2
  67. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/utils/typing.py +2 -1
  68. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/utils/view.py +2 -1
  69. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6/src/typed_ffmpeg_compatible.egg-info}/PKG-INFO +1 -1
  70. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg_compatible.egg-info/SOURCES.txt +7 -0
  71. typed_ffmpeg_compatible-3.5.1/src/typed_ffmpeg/codecs/schema.py +0 -17
  72. typed_ffmpeg_compatible-3.5.1/src/typed_ffmpeg/common/__init__.py +0 -0
  73. typed_ffmpeg_compatible-3.5.1/src/typed_ffmpeg/compile/__init__.py +0 -0
  74. typed_ffmpeg_compatible-3.5.1/src/typed_ffmpeg/dag/global_runnable/__init__.py +0 -0
  75. typed_ffmpeg_compatible-3.5.1/src/typed_ffmpeg/dag/io/__init__.py +0 -0
  76. typed_ffmpeg_compatible-3.5.1/src/typed_ffmpeg/ffprobe/__init__.py +0 -0
  77. typed_ffmpeg_compatible-3.5.1/src/typed_ffmpeg/formats/schema.py +0 -17
  78. typed_ffmpeg_compatible-3.5.1/src/typed_ffmpeg/utils/__init__.py +0 -0
  79. typed_ffmpeg_compatible-3.5.1/src/typed_ffmpeg/utils/lazy_eval/__init__.py +0 -0
  80. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/LICENSE +0 -0
  81. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/README.md +0 -0
  82. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/setup.cfg +0 -0
  83. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/dag/__init__.py +0 -0
  84. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/py.typed +0 -0
  85. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg/streams/channel_layout.py +0 -0
  86. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg_compatible.egg-info/dependency_links.txt +0 -0
  87. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg_compatible.egg-info/entry_points.txt +0 -0
  88. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/src/typed_ffmpeg_compatible.egg-info/requires.txt +0 -0
  89. {typed_ffmpeg_compatible-3.5.1 → typed_ffmpeg_compatible-3.6}/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.1
3
+ Version: 3.6
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
@@ -101,9 +101,12 @@ disallow_untyped_defs = true
101
101
  line-length = 88
102
102
  exclude = ["**/cassettes/", "**/__snapshots__/"]
103
103
  src = ["src"]
104
+ preview = true
104
105
 
105
106
  [tool.ruff.lint]
106
107
  select = [
108
+ "DOC",
109
+ "D", # docstring
107
110
  "E", # pycodestyle errors
108
111
  "W", # pycodestyle warnings
109
112
  "F", # pyflakes
@@ -113,6 +116,11 @@ select = [
113
116
  "UP", # pyupgrade
114
117
  ]
115
118
  ignore = [
119
+ "D417",
120
+ "D401",
121
+ "D203",
122
+ "D212",
123
+ "DOC502",
116
124
  "E741", # Ambiguous variable name: `I`
117
125
  "E501", # Line too long
118
126
  "E402", # Module level import not at top of file
@@ -120,6 +128,15 @@ ignore = [
120
128
  "F811", # FIXME: we relay on it to share fixture across app
121
129
  ]
122
130
 
131
+ [tool.ruff.lint.per-file-ignores]
132
+ "**/tests/**.py" = ["D103", "D104", "D100"]
133
+
123
134
  [tool.ruff.format]
124
135
  quote-style = "double"
125
136
  docstring-code-format = true
137
+
138
+ [tool.pytest.ini_options]
139
+ markers = [
140
+ "dev_only: marks tests to be run only on the main branch"
141
+ ]
142
+ addopts = "--cov-report=term-missing"
@@ -0,0 +1,435 @@
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.27.1
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==6.0.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.6.2
218
+ # via yarl
219
+ mypy-extensions==1.1.0
220
+ # via black
221
+ nbclient==0.10.2
222
+ # via nbconvert
223
+ nbconvert==7.16.6
224
+ # via mknotebooks
225
+ nbformat==5.10.4
226
+ # via
227
+ # nbclient
228
+ # nbconvert
229
+ nest-asyncio==1.6.0
230
+ # via ipykernel
231
+ nh3==0.2.21
232
+ # via readme-renderer
233
+ nodeenv==1.9.1
234
+ # via pre-commit
235
+ packaging==25.0
236
+ # via
237
+ # black
238
+ # build
239
+ # ipykernel
240
+ # mkdocs
241
+ # nbconvert
242
+ # pytest
243
+ # setuptools-scm
244
+ # twine
245
+ paginate==0.5.7
246
+ # via mkdocs-material
247
+ pandocfilters==1.5.1
248
+ # via nbconvert
249
+ parso==0.8.4
250
+ # via jedi
251
+ pathspec==0.12.1
252
+ # via
253
+ # black
254
+ # mkdocs
255
+ pexpect==4.9.0
256
+ # via ipython
257
+ platformdirs==4.3.8
258
+ # via
259
+ # black
260
+ # jupyter-core
261
+ # mkdocs-get-deps
262
+ # virtualenv
263
+ pluggy==1.6.0
264
+ # via
265
+ # pytest
266
+ # pytest-cov
267
+ pre-commit==4.2.0
268
+ # via -r requirements.in
269
+ prompt-toolkit==3.0.51
270
+ # via ipython
271
+ propcache==0.3.2
272
+ # via yarl
273
+ psutil==7.0.0
274
+ # via ipykernel
275
+ ptyprocess==0.7.0
276
+ # via pexpect
277
+ pure-eval==0.2.3
278
+ # via stack-data
279
+ pycparser==2.22
280
+ # via cffi
281
+ pygments==2.19.2
282
+ # via
283
+ # devtools
284
+ # ipython
285
+ # mkdocs-material
286
+ # nbconvert
287
+ # pytest
288
+ # readme-renderer
289
+ # rich
290
+ pymdown-extensions==10.16
291
+ # via
292
+ # -r requirements.in
293
+ # mkdocs-material
294
+ # mkdocstrings
295
+ pyproject-hooks==1.2.0
296
+ # via build
297
+ pytest==8.4.1
298
+ # via
299
+ # pytest-cov
300
+ # pytest-datadir
301
+ # pytest-recording
302
+ # syrupy
303
+ pytest-cov==6.2.1
304
+ # via -r requirements.in
305
+ pytest-datadir==1.7.2
306
+ # via -r requirements.in
307
+ pytest-recording==0.13.4
308
+ # via -r requirements.in
309
+ python-dateutil==2.9.0.post0
310
+ # via
311
+ # ghp-import
312
+ # jupyter-client
313
+ pyyaml==6.0.2
314
+ # via
315
+ # mkdocs
316
+ # mkdocs-get-deps
317
+ # pre-commit
318
+ # pymdown-extensions
319
+ # pyyaml-env-tag
320
+ # vcrpy
321
+ pyyaml-env-tag==1.1
322
+ # via mkdocs
323
+ pyzmq==27.0.0
324
+ # via
325
+ # ipykernel
326
+ # jupyter-client
327
+ readme-renderer==44.0
328
+ # via twine
329
+ referencing==0.36.2
330
+ # via
331
+ # jsonschema
332
+ # jsonschema-specifications
333
+ requests==2.32.4
334
+ # via
335
+ # id
336
+ # mkdocs-material
337
+ # requests-toolbelt
338
+ # twine
339
+ requests-toolbelt==1.0.0
340
+ # via twine
341
+ rfc3986==2.0.0
342
+ # via twine
343
+ rich==14.0.0
344
+ # via
345
+ # twine
346
+ # typer
347
+ rpds-py==0.25.1
348
+ # via
349
+ # jsonschema
350
+ # referencing
351
+ ruff==0.12.1
352
+ # via -r requirements.in
353
+ secretstorage==3.3.3
354
+ # via keyring
355
+ setuptools-scm==8.3.1
356
+ # via -r requirements.in
357
+ shellingham==1.5.4
358
+ # via typer
359
+ six==1.17.0
360
+ # via
361
+ # asttokens
362
+ # python-dateutil
363
+ smmap==5.0.2
364
+ # via gitdb
365
+ soupsieve==2.7
366
+ # via beautifulsoup4
367
+ stack-data==0.6.3
368
+ # via ipython
369
+ syrupy==4.9.1
370
+ # via -r requirements.in
371
+ tinycss2==1.4.0
372
+ # via bleach
373
+ tomli==2.2.1
374
+ # via
375
+ # black
376
+ # build
377
+ # coverage
378
+ # pytest
379
+ # setuptools-scm
380
+ tornado==6.5.1
381
+ # via
382
+ # ipykernel
383
+ # jupyter-client
384
+ traitlets==5.14.3
385
+ # via
386
+ # comm
387
+ # ipykernel
388
+ # ipython
389
+ # jupyter-client
390
+ # jupyter-core
391
+ # matplotlib-inline
392
+ # nbclient
393
+ # nbconvert
394
+ # nbformat
395
+ twine==6.1.0
396
+ # via -r requirements.in
397
+ ty==0.0.1a12
398
+ # via -r requirements.in
399
+ typer==0.16.0
400
+ # via -r requirements.in
401
+ typing-extensions==4.14.0
402
+ # via
403
+ # beautifulsoup4
404
+ # black
405
+ # exceptiongroup
406
+ # ipython
407
+ # mistune
408
+ # mkdocstrings-python
409
+ # multidict
410
+ # referencing
411
+ # rich
412
+ # typer
413
+ urllib3==2.5.0
414
+ # via
415
+ # requests
416
+ # twine
417
+ # vcrpy
418
+ vcrpy==7.0.0
419
+ # via pytest-recording
420
+ virtualenv==20.31.2
421
+ # via pre-commit
422
+ watchdog==6.0.0
423
+ # via mkdocs
424
+ wcwidth==0.2.13
425
+ # via prompt-toolkit
426
+ webencodings==0.5.1
427
+ # via
428
+ # bleach
429
+ # tinycss2
430
+ wrapt==1.17.2
431
+ # via vcrpy
432
+ yarl==1.20.1
433
+ # via vcrpy
434
+ zipp==3.23.0
435
+ # via importlib-metadata
@@ -20,9 +20,10 @@ Example:
20
20
  # Simple video transcoding
21
21
  (ffmpeg.input("input.mp4").output("output.mp4").run())
22
22
  ```
23
+
23
24
  """
24
25
 
25
- from . import codecs, compile, dag, filters, formats, sources
26
+ from . import codecs, compile, dag, expressions, filters, formats, options, sources
26
27
  from .base import afilter, filter_multi_output, input, merge_outputs, output, vfilter
27
28
  from .dag import Stream
28
29
  from .exceptions import FFMpegExecuteError, FFMpegTypeError, FFMpegValueError
@@ -56,4 +57,6 @@ __all__ = [
56
57
  "get_codecs",
57
58
  "get_decoders",
58
59
  "get_encoders",
60
+ "options",
61
+ "expressions",
59
62
  ]
@@ -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.1'
21
- __version_tuple__ = version_tuple = (3, 5, 1)
20
+ __version__ = version = '3.6'
21
+ __version_tuple__ = version_tuple = (3, 6)
@@ -47,6 +47,7 @@ def merge_outputs(*streams: OutputStream) -> GlobalStream:
47
47
  merged = ffmpeg.merge_outputs(output1, output2)
48
48
  merged.run() # Executes both outputs in a single FFmpeg command
49
49
  ```
50
+
50
51
  """
51
52
  return GlobalNode(inputs=streams).stream()
52
53
 
@@ -82,6 +83,7 @@ def vfilter(
82
83
  Note:
83
84
  This function is for custom filters not implemented in typed-ffmpeg.
84
85
  Use the built-in filters from the filters module when available.
86
+
85
87
  """
86
88
  return FilterNode(
87
89
  name=name,
@@ -123,6 +125,7 @@ def afilter(
123
125
  Note:
124
126
  This function is for custom filters not implemented in typed-ffmpeg.
125
127
  Use the built-in filters from the filters module when available.
128
+
126
129
  """
127
130
  return FilterNode(
128
131
  name=name,
@@ -171,8 +174,8 @@ def filter_multi_output(
171
174
  Note:
172
175
  This function is for custom filters not implemented in typed-ffmpeg.
173
176
  Use the built-in filters from the filters module when available.
174
- """
175
177
 
178
+ """
176
179
  return FilterNode(
177
180
  name=name,
178
181
  kwargs=FrozenDict(kwargs),
@@ -1,3 +1,5 @@
1
+ """FFmpeg codecs package."""
2
+
1
3
  from . import decoders, encoders, schema
2
4
 
3
5
  __all__ = ["encoders", "decoders", "schema"]