typed-ffmpeg-compatible 3.3__py3-none-any.whl → 3.4__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.
Files changed (30) hide show
  1. typed_ffmpeg/__init__.py +4 -2
  2. typed_ffmpeg/_version.py +2 -2
  3. typed_ffmpeg/base.py +6 -5
  4. typed_ffmpeg/codecs/__init__.py +3 -0
  5. typed_ffmpeg/codecs/decoders.py +6644 -0
  6. typed_ffmpeg/codecs/encoders.py +6435 -0
  7. typed_ffmpeg/codecs/schema.py +17 -0
  8. typed_ffmpeg/common/serialize.py +1 -1
  9. typed_ffmpeg/compile/compile_cli.py +2 -0
  10. typed_ffmpeg/dag/global_runnable/global_args.py +59 -55
  11. typed_ffmpeg/dag/io/_input.py +72 -64
  12. typed_ffmpeg/dag/io/_output.py +114 -105
  13. typed_ffmpeg/dag/io/output_args.py +118 -104
  14. typed_ffmpeg/dag/nodes.py +1 -1
  15. typed_ffmpeg/dag/schema.py +1 -1
  16. typed_ffmpeg/filters.py +1717 -675
  17. typed_ffmpeg/sources.py +1641 -571
  18. typed_ffmpeg/streams/__init__.py +2 -1
  19. typed_ffmpeg/streams/audio.py +1994 -1554
  20. typed_ffmpeg/streams/video.py +4540 -2843
  21. typed_ffmpeg/utils/{forzendict.py → frozendict.py} +56 -1
  22. typed_ffmpeg/utils/run.py +1 -1
  23. typed_ffmpeg/utils/snapshot.py +1 -1
  24. typed_ffmpeg/utils/view.py +3 -2
  25. {typed_ffmpeg_compatible-3.3.dist-info → typed_ffmpeg_compatible-3.4.dist-info}/METADATA +1 -1
  26. {typed_ffmpeg_compatible-3.3.dist-info → typed_ffmpeg_compatible-3.4.dist-info}/RECORD +30 -26
  27. {typed_ffmpeg_compatible-3.3.dist-info → typed_ffmpeg_compatible-3.4.dist-info}/WHEEL +0 -0
  28. {typed_ffmpeg_compatible-3.3.dist-info → typed_ffmpeg_compatible-3.4.dist-info}/entry_points.txt +0 -0
  29. {typed_ffmpeg_compatible-3.3.dist-info → typed_ffmpeg_compatible-3.4.dist-info}/licenses/LICENSE +0 -0
  30. {typed_ffmpeg_compatible-3.3.dist-info → typed_ffmpeg_compatible-3.4.dist-info}/top_level.txt +0 -0
@@ -6,7 +6,7 @@ where hashable dictionaries are needed, such as in sets or as keys in other
6
6
  dictionaries. Once created, a FrozenDict cannot be modified.
7
7
  """
8
8
 
9
- from collections.abc import Iterator, Mapping
9
+ from collections.abc import Iterable, Iterator, Mapping
10
10
  from typing import Any, Generic, TypeVar
11
11
 
12
12
  K = TypeVar("K")
@@ -106,3 +106,58 @@ class FrozenDict(Mapping[K, V], Generic[K, V]):
106
106
  # Create a stable hash based on sorted key-value pairs
107
107
  self._hash = hash(frozenset(self._data.items()))
108
108
  return self._hash
109
+
110
+ def __or__(self, other: Mapping[Any, Any]) -> dict[Any, Any]:
111
+ return dict(self) | dict(other)
112
+
113
+ def __ror__(self, other: Mapping[Any, Any]) -> dict[Any, Any]:
114
+ return dict(other) | dict(self)
115
+
116
+
117
+ def merge(*maps: Mapping[Any, Any] | None) -> FrozenDict[Any, Any]:
118
+ """
119
+ Merge multiple dictionaries into a single dictionary.
120
+
121
+ Args:
122
+ *maps: Dictionaries to merge
123
+
124
+ Returns:
125
+ A new dictionary containing the merged contents of all input dictionaries
126
+ """
127
+ output = {}
128
+
129
+ for map in maps:
130
+ if map is None:
131
+ continue
132
+ # exclude None values
133
+ output.update({k: v for k, v in map.items() if v is not None})
134
+
135
+ return FrozenDict(output)
136
+
137
+
138
+ def exclude(maps: Mapping[Any, Any], exclude: Iterable[Any]) -> FrozenDict[Any, Any]:
139
+ """
140
+ Exclude the keys of a dictionary.
141
+
142
+ Args:
143
+ maps: Dictionary to exclude from
144
+ exclude: Keys to exclude
145
+
146
+ Returns:
147
+ A new dictionary with the keys excluded
148
+ """
149
+ return FrozenDict({k: v for k, v in maps.items() if k not in exclude})
150
+
151
+
152
+ def rekey(maps: Mapping[Any, Any], rekey: Mapping[Any, Any]) -> FrozenDict[Any, Any]:
153
+ """
154
+ rekey the keys of a dictionary.
155
+
156
+ Args:
157
+ maps: Dictionary to rekey
158
+ rekey: Mapping of old keys to new keys
159
+
160
+ Returns:
161
+ A new dictionary with the keys remapped
162
+ """
163
+ return FrozenDict({rekey.get(k, k): v for k, v in maps.items()})
typed_ffmpeg/utils/run.py CHANGED
@@ -10,7 +10,7 @@ from collections.abc import Mapping
10
10
 
11
11
  from ..schema import Default
12
12
  from ..utils.lazy_eval.schema import LazyValue
13
- from .forzendict import FrozenDict
13
+ from .frozendict import FrozenDict
14
14
 
15
15
 
16
16
  def command_line(args: list[str]) -> str:
@@ -21,7 +21,7 @@ from syrupy.types import (
21
21
  from ..dag.schema import Stream
22
22
 
23
23
 
24
- class DAGSnapshotExtenstion(JSONSnapshotExtension):
24
+ class DAGSnapshotExtension(JSONSnapshotExtension):
25
25
  """
26
26
  A snapshot extension for serializing and testing FFmpeg DAG structures.
27
27
 
@@ -10,6 +10,7 @@ from __future__ import annotations
10
10
 
11
11
  from typing import Literal
12
12
 
13
+ from ..compile.compile_cli import get_args, get_stream_label
13
14
  from ..compile.context import DAGContext
14
15
  from ..dag.nodes import FilterNode, InputNode, OutputNode
15
16
  from ..dag.schema import Node
@@ -92,7 +93,7 @@ def view(node: Node, format: Literal["png", "svg", "dot"]) -> str:
92
93
  color = _get_node_color(node)
93
94
  graph.node(
94
95
  name=node.hex,
95
- label=node.repr(),
96
+ label=" ".join(get_args(node, context)),
96
97
  shape="box",
97
98
  style="filled",
98
99
  fillcolor=color,
@@ -105,7 +106,7 @@ def view(node: Node, format: Literal["png", "svg", "dot"]) -> str:
105
106
  graph.edge(
106
107
  stream.node.hex,
107
108
  node.hex,
108
- label=f"{'*' if stream.index is None else stream.index} => {idx}",
109
+ label=f"{get_stream_label(stream, context)} -> {idx}",
109
110
  )
110
111
 
111
112
  return graph.render(engine="dot")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: typed-ffmpeg-compatible
3
- Version: 3.3
3
+ Version: 3.4
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
@@ -1,59 +1,63 @@
1
- typed_ffmpeg/__init__.py,sha256=n1SZfENc9xhZ0eA3ZzkBNPuIY-Pt3-rOwB8-uUj5olU,1592
2
- typed_ffmpeg/_version.py,sha256=lgTPmPhRGLqWrHHDFV9z5QiSuA5Dn5Dch5YbYnpAWj4,506
3
- typed_ffmpeg/base.py,sha256=C5Tqbx2I0c-09D7aXKZoGkspu-lAAeAhuOns5zr3PXQ,6304
1
+ typed_ffmpeg/__init__.py,sha256=l53f6Iit3dLhGHxYg20TLkzmmh0vCMNYGIXCyXWcZfA,1652
2
+ typed_ffmpeg/_version.py,sha256=FOaITfYFdmbc5BCzn2TIcvOwuyawOglcSDQRSAu-J5U,506
3
+ typed_ffmpeg/base.py,sha256=JNNNnN-1A50i9zviR6uOjAs-bClCDx5qx9A5iSePBeI,6309
4
4
  typed_ffmpeg/exceptions.py,sha256=D4SID6WOwkjVV8O8mAjrEDHWn-8BRDnK_jteaDof1SY,2474
5
- typed_ffmpeg/filters.py,sha256=_lBpGZgPHK3KgGVrw-TCdQEsBRuEXVIgwggYNGd80MU,110076
5
+ typed_ffmpeg/filters.py,sha256=XY1LqXY6Ch1wOX-1XW3SzgwH3NQaAtSEQew6f3JoTeY,144001
6
6
  typed_ffmpeg/info.py,sha256=0KCzf8hJaI6ObPRT0uftLa96RlYvaQmoEq1sqFJSc24,9521
7
7
  typed_ffmpeg/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  typed_ffmpeg/schema.py,sha256=KVtmyGeJutjFot70r6Nj8W8WBqwvfg2-rSgjdhPVh-o,1615
9
- typed_ffmpeg/sources.py,sha256=ASt0l8FMW82X-70qw72167xpyBY7tQQClVuhy8r0HfU,86026
9
+ typed_ffmpeg/sources.py,sha256=gR8qH-Qf36X2veab4kh9ZE5CYu5K0Yz6eXzd0lCFdPE,122297
10
10
  typed_ffmpeg/types.py,sha256=ly3zLtg7KxRa_jsDDrFPAxRZRjTQdWVpiQzOD9NdrFM,4137
11
+ typed_ffmpeg/codecs/__init__.py,sha256=qEqV-Oo2vG06WIAm3obcArK6ZBDWNP7_Kw6cszSGqb8,87
12
+ typed_ffmpeg/codecs/decoders.py,sha256=5_s7TJoq98784GZ-6wE6QmF7Mzafmm7nwB98QgFWsUw,122104
13
+ typed_ffmpeg/codecs/encoders.py,sha256=iucSZt8zTdfBNvWaOXOfHHQdCx3bJTbn4-9MOlr5-zI,217955
14
+ typed_ffmpeg/codecs/schema.py,sha256=d0OeLkJAHf6GwUjUFgr_1sR38mQOCUQns3aSmpX7EF8,451
11
15
  typed_ffmpeg/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
16
  typed_ffmpeg/common/cache.py,sha256=j0JvfX7jewLpdJWxgo7Pwze0BkUJdYGHX2uGR8BZ-9M,1386
13
17
  typed_ffmpeg/common/schema.py,sha256=qM8yfMX9UU3EAQSNsTrr-SAmyqKx8eQCXTtu3RJWkEk,19673
14
- typed_ffmpeg/common/serialize.py,sha256=dLim0DBP5CdJ1JiMV9xEmmh1XMSIhBOWs61EopAL15s,7719
18
+ typed_ffmpeg/common/serialize.py,sha256=ECgnown2I6BpKK2xYxYKzBUE4tnWxDEyUiSvsymoG1I,7719
15
19
  typed_ffmpeg/compile/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
- typed_ffmpeg/compile/compile_cli.py,sha256=Xuz4gAp4kqeywOxBNgPXH_Ie8lrmwfEdAl-HxMGo9kI,32892
20
+ typed_ffmpeg/compile/compile_cli.py,sha256=FyFcFN2qgpi57M3fERzXlSdEs4Z7XwD0zKicXbl7_4M,32980
17
21
  typed_ffmpeg/compile/compile_json.py,sha256=YCiTyfAnUVSbFr7BiQpmJYs13K5sa-xo77Iih33mb6I,992
18
22
  typed_ffmpeg/compile/compile_python.py,sha256=YnnRRHE8TEUiqFF9DsqkYOwIcA2ejCYw12k-O5n825A,11506
19
23
  typed_ffmpeg/compile/context.py,sha256=macQ3HhEJ73j_WbWYtU9GCQCzcB_KQGAPimcuU-WOac,10946
20
24
  typed_ffmpeg/compile/validate.py,sha256=QsWksdvlRwWw6hnatFo-ABakms1qDXRbEmvMQGRLrD8,9579
21
25
  typed_ffmpeg/dag/__init__.py,sha256=qAApSNqjbZ1DtUaV5bSku9RwG7MpMPa1HJO764cSBt4,849
22
26
  typed_ffmpeg/dag/factory.py,sha256=2IMVKP_2UaTrlGXBg8YDx5KXBqhpScJiJQ87PRrppzY,3147
23
- typed_ffmpeg/dag/nodes.py,sha256=lfHChT8JqRs3UUDWtgrWnnXn845HXSD5S1QmHpIUT4U,20526
24
- typed_ffmpeg/dag/schema.py,sha256=xsVT46XgT3Usgb4N9OWdjP74MG9dBrXgZGbjsYhsUEM,5916
27
+ typed_ffmpeg/dag/nodes.py,sha256=TEBlG2299_sTjvt0eTbsULK6Ln8ndo1Z38ftNYUC5Lc,20526
28
+ typed_ffmpeg/dag/schema.py,sha256=ZIW2RTdSa484akezWnREEZC5FgdTZHvVLYC-Vl6-dF8,5916
25
29
  typed_ffmpeg/dag/utils.py,sha256=hydh7_kjpOCw8WEGhXMxIXR4Ek-3DeoOt6esInuK2Xw,1941
26
30
  typed_ffmpeg/dag/global_runnable/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
- typed_ffmpeg/dag/global_runnable/global_args.py,sha256=ehLtx4v-XxqkmODhpE_gik0r79hs4Sa8TJnRsH9Fj1o,8043
31
+ typed_ffmpeg/dag/global_runnable/global_args.py,sha256=PINtqw5QNDcZ9OC4w0frt-fWV8Yg6_We6w68dnXia94,7801
28
32
  typed_ffmpeg/dag/global_runnable/runnable.py,sha256=0QGBm3ghM4LFT4H9km9-h_N0w5BR3kTaESRapb-qTv0,11098
29
33
  typed_ffmpeg/dag/io/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
- typed_ffmpeg/dag/io/_input.py,sha256=KRLTSQPEfmgPcPEAJdeWRHZhNsClaJCB9Ac6czMOrmE,7214
31
- typed_ffmpeg/dag/io/_output.py,sha256=_no6ffAOABznbLNTki8CYr7pvr4Sa0LweRfn38-cszs,12470
32
- typed_ffmpeg/dag/io/output_args.py,sha256=SThIhZh9PXs2m6Fz5JsSy8oS-Te7GM_oz7HRuZo0-eI,13901
34
+ typed_ffmpeg/dag/io/_input.py,sha256=AHUtauMh31pCz6YSVa3WFJ-lEHqf44P8cvlWOSwic3Y,7607
35
+ typed_ffmpeg/dag/io/_output.py,sha256=PkluhHrXGF7GhqhQ3Pn6LknWi_Bk0PuC3f8JApXakGw,13027
36
+ typed_ffmpeg/dag/io/output_args.py,sha256=_MkoX6pRsECCkvLndrERq7674YDWlhOzAvUifVJZegE,14543
33
37
  typed_ffmpeg/ffprobe/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
38
  typed_ffmpeg/ffprobe/parse.py,sha256=fq1cGFkUpUdvyVi3S-TAQ7qn-tXUdae6ADhymZt7-t4,3791
35
39
  typed_ffmpeg/ffprobe/probe.py,sha256=D_opsKp3OgT2HSBzhxgY1b9SIqXpDhz3xh_k9HUGux0,10367
36
40
  typed_ffmpeg/ffprobe/schema.py,sha256=PBgBWYGO8wKnI0Lae9oCJ1Nprhv2ciPkdLrumzPVllY,13631
37
41
  typed_ffmpeg/ffprobe/xml2json.py,sha256=1TSuxR7SYc-M_-JmE-1khHGbXCapgW0Oap9kzL0nwNg,2455
38
- typed_ffmpeg/streams/__init__.py,sha256=Nt9uWpcVI1sQLl5Qt_kBCBcWOGZA1vczCQ0qvFbSko0,141
39
- typed_ffmpeg/streams/audio.py,sha256=2oNRhb5UetWtlPG3NW73AjUZoFPl303yMv-6W1sGWt0,259054
42
+ typed_ffmpeg/streams/__init__.py,sha256=32kiqBVigKH2EqS3cA6EfXCW8KpVdQNWSStAmQ0MktM,196
43
+ typed_ffmpeg/streams/audio.py,sha256=_40HQ4B1Hc5VLzkq1oNdjgY4uuDZXjaRmMmE-0EZCkc,274665
40
44
  typed_ffmpeg/streams/av.py,sha256=qrsO692BG6OVMWVwIeuCKPntBGTR685lc2ULbGPTSkQ,2594
41
45
  typed_ffmpeg/streams/channel_layout.py,sha256=hGagaoc1tnWS8K1yiITp4f_92qq5e7C_zB15bHOL0DI,1162
42
46
  typed_ffmpeg/streams/subtitle.py,sha256=zhbRKUYH0C972Hurm4hK_dqLvT4Y6v_VNZFzQrkCm9A,141
43
- typed_ffmpeg/streams/video.py,sha256=cQwHfew75YO_dbZjmpUYd-nXt1JHN0M7suFKKe5UH5s,453576
47
+ typed_ffmpeg/streams/video.py,sha256=_dPV_ZzXyNgu5MFr5W727t-SSbZo-gN3_w6OTELIouE,508354
44
48
  typed_ffmpeg/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
49
  typed_ffmpeg/utils/escaping.py,sha256=m6CTEBwWZTFdtZHTHW-3pQCgkpdZb9f9ynoO-gsD7uM,2937
46
- typed_ffmpeg/utils/forzendict.py,sha256=9QWdPQA2AbSfiC9-mrq1YeZFl1qN--zw8WlsqQ2ulCk,3114
47
- typed_ffmpeg/utils/run.py,sha256=mSoAdcvD-InldqkRgWNc8iXKgJJoEMAOE4PL2gVmtqw,2178
48
- typed_ffmpeg/utils/snapshot.py,sha256=mKILRm6qiQV2egaD-70MSUEl-DFoLD5w_v9GZIequI4,2181
50
+ typed_ffmpeg/utils/frozendict.py,sha256=oRlG0hQWIHhnYCrMeGQ6JE37yge_dB1gY3lDdoiJ0hw,4569
51
+ typed_ffmpeg/utils/run.py,sha256=R3WSxEUdY-QmJnHT03VrvdUVQDyyI1QEiMw6Nz8AH1s,2178
52
+ typed_ffmpeg/utils/snapshot.py,sha256=SHdfM1OXxR0cReNs4snDdAASjW45unz2KjF_6jMwq7c,2180
49
53
  typed_ffmpeg/utils/typing.py,sha256=DBQn_gCF8C_DTwsfMHeCgfnNUROwAjlIcHrQ7lNDOoE,1187
50
- typed_ffmpeg/utils/view.py,sha256=QCSlQoQkRBI-T0sWjiywGgM9DlKd8Te3CB2ZYX-pEVU,3413
54
+ typed_ffmpeg/utils/view.py,sha256=jiCKJnx-KVJh-uvhkADBQNlWH1uHPqyYgmSZ_iSEj0c,3484
51
55
  typed_ffmpeg/utils/lazy_eval/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
56
  typed_ffmpeg/utils/lazy_eval/operator.py,sha256=QWybd-UH3VdDa8kgWkqAMi3WV0b0WF1d1JixQr6is2E,4136
53
57
  typed_ffmpeg/utils/lazy_eval/schema.py,sha256=WSg-E3MS3itN1AT6Dq4Z9btnRHEReuN3o6zruXou7h4,9623
54
- typed_ffmpeg_compatible-3.3.dist-info/licenses/LICENSE,sha256=8Aaya5i_09Cou2i3QMxTwz6uHGzi_fGA4uhkco07-A4,1066
55
- typed_ffmpeg_compatible-3.3.dist-info/METADATA,sha256=FtrDI-yit60_yKnw5CfgYotZX9MLBIMiNtqCXBnDPmA,8383
56
- typed_ffmpeg_compatible-3.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
57
- typed_ffmpeg_compatible-3.3.dist-info/entry_points.txt,sha256=kUQvZ27paV-07qtkIFV-emKsYtjFOTw9kknBRSXPs04,45
58
- typed_ffmpeg_compatible-3.3.dist-info/top_level.txt,sha256=vuASJGVRQiNmhWY1pt0RXESWSNkknWXqWLIRAU7H_L4,13
59
- typed_ffmpeg_compatible-3.3.dist-info/RECORD,,
58
+ typed_ffmpeg_compatible-3.4.dist-info/licenses/LICENSE,sha256=8Aaya5i_09Cou2i3QMxTwz6uHGzi_fGA4uhkco07-A4,1066
59
+ typed_ffmpeg_compatible-3.4.dist-info/METADATA,sha256=3LLsFUWShSTQBmwmJILuByrK3GwjDTk95jq_Vo5lAr4,8383
60
+ typed_ffmpeg_compatible-3.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
61
+ typed_ffmpeg_compatible-3.4.dist-info/entry_points.txt,sha256=kUQvZ27paV-07qtkIFV-emKsYtjFOTw9kknBRSXPs04,45
62
+ typed_ffmpeg_compatible-3.4.dist-info/top_level.txt,sha256=vuASJGVRQiNmhWY1pt0RXESWSNkknWXqWLIRAU7H_L4,13
63
+ typed_ffmpeg_compatible-3.4.dist-info/RECORD,,