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.
- typed_ffmpeg/__init__.py +4 -2
- typed_ffmpeg/_version.py +2 -2
- typed_ffmpeg/base.py +6 -5
- typed_ffmpeg/codecs/__init__.py +3 -0
- typed_ffmpeg/codecs/decoders.py +6644 -0
- typed_ffmpeg/codecs/encoders.py +6435 -0
- typed_ffmpeg/codecs/schema.py +17 -0
- typed_ffmpeg/common/serialize.py +1 -1
- typed_ffmpeg/compile/compile_cli.py +2 -0
- typed_ffmpeg/dag/global_runnable/global_args.py +59 -55
- typed_ffmpeg/dag/io/_input.py +72 -64
- typed_ffmpeg/dag/io/_output.py +114 -105
- typed_ffmpeg/dag/io/output_args.py +118 -104
- typed_ffmpeg/dag/nodes.py +1 -1
- typed_ffmpeg/dag/schema.py +1 -1
- typed_ffmpeg/filters.py +1717 -675
- typed_ffmpeg/sources.py +1641 -571
- typed_ffmpeg/streams/__init__.py +2 -1
- typed_ffmpeg/streams/audio.py +1994 -1554
- typed_ffmpeg/streams/video.py +4540 -2843
- typed_ffmpeg/utils/{forzendict.py → frozendict.py} +56 -1
- typed_ffmpeg/utils/run.py +1 -1
- typed_ffmpeg/utils/snapshot.py +1 -1
- typed_ffmpeg/utils/view.py +3 -2
- {typed_ffmpeg_compatible-3.3.dist-info → typed_ffmpeg_compatible-3.4.dist-info}/METADATA +1 -1
- {typed_ffmpeg_compatible-3.3.dist-info → typed_ffmpeg_compatible-3.4.dist-info}/RECORD +30 -26
- {typed_ffmpeg_compatible-3.3.dist-info → typed_ffmpeg_compatible-3.4.dist-info}/WHEEL +0 -0
- {typed_ffmpeg_compatible-3.3.dist-info → typed_ffmpeg_compatible-3.4.dist-info}/entry_points.txt +0 -0
- {typed_ffmpeg_compatible-3.3.dist-info → typed_ffmpeg_compatible-3.4.dist-info}/licenses/LICENSE +0 -0
- {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
typed_ffmpeg/utils/snapshot.py
CHANGED
@@ -21,7 +21,7 @@ from syrupy.types import (
|
|
21
21
|
from ..dag.schema import Stream
|
22
22
|
|
23
23
|
|
24
|
-
class
|
24
|
+
class DAGSnapshotExtension(JSONSnapshotExtension):
|
25
25
|
"""
|
26
26
|
A snapshot extension for serializing and testing FFmpeg DAG structures.
|
27
27
|
|
typed_ffmpeg/utils/view.py
CHANGED
@@ -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=
|
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"{
|
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
|
+
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=
|
2
|
-
typed_ffmpeg/_version.py,sha256=
|
3
|
-
typed_ffmpeg/base.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
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=
|
24
|
-
typed_ffmpeg/dag/schema.py,sha256=
|
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=
|
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=
|
31
|
-
typed_ffmpeg/dag/io/_output.py,sha256=
|
32
|
-
typed_ffmpeg/dag/io/output_args.py,sha256=
|
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=
|
39
|
-
typed_ffmpeg/streams/audio.py,sha256=
|
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=
|
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/
|
47
|
-
typed_ffmpeg/utils/run.py,sha256=
|
48
|
-
typed_ffmpeg/utils/snapshot.py,sha256=
|
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=
|
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.
|
55
|
-
typed_ffmpeg_compatible-3.
|
56
|
-
typed_ffmpeg_compatible-3.
|
57
|
-
typed_ffmpeg_compatible-3.
|
58
|
-
typed_ffmpeg_compatible-3.
|
59
|
-
typed_ffmpeg_compatible-3.
|
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,,
|
File without changes
|
{typed_ffmpeg_compatible-3.3.dist-info → typed_ffmpeg_compatible-3.4.dist-info}/entry_points.txt
RENAMED
File without changes
|
{typed_ffmpeg_compatible-3.3.dist-info → typed_ffmpeg_compatible-3.4.dist-info}/licenses/LICENSE
RENAMED
File without changes
|
{typed_ffmpeg_compatible-3.3.dist-info → typed_ffmpeg_compatible-3.4.dist-info}/top_level.txt
RENAMED
File without changes
|