typed-ffmpeg-compatible 2.7.2__py3-none-any.whl → 2.7.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 +2 -1
- typed_ffmpeg/common/cache/.gitignore +3 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/acrossover.json +6 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/afir.json +9 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/aiir.json +6 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/ainterleave.json +9 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/amerge.json +9 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/amix.json +9 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/amovie.json +6 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/anequalizer.json +6 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/aphasemeter.json +6 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/asegment.json +6 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/aselect.json +6 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/asplit.json +6 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/astreamselect.json +9 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/bm3d.json +6 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/channelsplit.json +6 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/concat.json +9 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/decimate.json +6 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/ebur128.json +6 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/extractplanes.json +6 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/fieldmatch.json +6 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/guided.json +6 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/headphone.json +6 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/hstack.json +9 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/interleave.json +9 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/join.json +9 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/libplacebo.json +9 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/limitdiff.json +6 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/mergeplanes.json +6 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/mix.json +9 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/movie.json +6 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/premultiply.json +6 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/segment.json +6 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/select.json +6 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/signature.json +9 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/split.json +6 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/streamselect.json +9 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/unpremultiply.json +6 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/vstack.json +9 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/xmedian.json +9 -0
- typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/xstack.json +9 -0
- typed_ffmpeg/common/cache/list/filters.json +90747 -0
- typed_ffmpeg/common/cache/list/options.json +1694 -0
- typed_ffmpeg/common/cache.py +66 -0
- typed_ffmpeg/common/schema.py +9 -5
- typed_ffmpeg/common/serialize.py +12 -8
- typed_ffmpeg/compile/__init__.py +0 -0
- typed_ffmpeg/compile/compile_cli.py +415 -0
- typed_ffmpeg/compile/compile_json.py +38 -0
- typed_ffmpeg/compile/compile_python.py +325 -0
- typed_ffmpeg/{dag → compile}/context.py +26 -45
- typed_ffmpeg/{dag → compile}/validate.py +2 -2
- typed_ffmpeg/dag/factory.py +25 -4
- typed_ffmpeg/dag/global_runnable/runnable.py +6 -6
- typed_ffmpeg/dag/nodes.py +2 -230
- typed_ffmpeg/dag/schema.py +2 -18
- typed_ffmpeg/streams/av.py +36 -3
- typed_ffmpeg/utils/view.py +1 -1
- {typed_ffmpeg_compatible-2.7.2.dist-info → typed_ffmpeg_compatible-2.7.4.dist-info}/METADATA +1 -1
- typed_ffmpeg_compatible-2.7.4.dist-info/RECORD +95 -0
- typed_ffmpeg/dag/compile.py +0 -86
- typed_ffmpeg_compatible-2.7.2.dist-info/RECORD +0 -48
- {typed_ffmpeg_compatible-2.7.2.dist-info → typed_ffmpeg_compatible-2.7.4.dist-info}/LICENSE +0 -0
- {typed_ffmpeg_compatible-2.7.2.dist-info → typed_ffmpeg_compatible-2.7.4.dist-info}/WHEEL +0 -0
- {typed_ffmpeg_compatible-2.7.2.dist-info → typed_ffmpeg_compatible-2.7.4.dist-info}/entry_points.txt +0 -0
typed_ffmpeg/dag/nodes.py
CHANGED
@@ -7,10 +7,8 @@ from pathlib import Path
|
|
7
7
|
from typing import TYPE_CHECKING, Any
|
8
8
|
|
9
9
|
from ..exceptions import FFMpegTypeError, FFMpegValueError
|
10
|
-
from ..schema import
|
11
|
-
from ..utils.escaping import escape
|
10
|
+
from ..schema import StreamType
|
12
11
|
from ..utils.forzendict import FrozenDict
|
13
|
-
from ..utils.lazy_eval.schema import LazyValue
|
14
12
|
from ..utils.typing import override
|
15
13
|
from .global_runnable.runnable import GlobalRunable
|
16
14
|
from .io.output_args import OutputArgs
|
@@ -20,7 +18,6 @@ if TYPE_CHECKING:
|
|
20
18
|
from ..streams.audio import AudioStream
|
21
19
|
from ..streams.av import AVStream
|
22
20
|
from ..streams.video import VideoStream
|
23
|
-
from .context import DAGContext
|
24
21
|
|
25
22
|
|
26
23
|
logger = logging.getLogger(__name__)
|
@@ -167,64 +164,6 @@ class FilterNode(Node):
|
|
167
164
|
f"Expected input {i} to have audio component, got {stream.__class__.__name__}"
|
168
165
|
)
|
169
166
|
|
170
|
-
@override
|
171
|
-
def get_args(self, context: DAGContext = None) -> list[str]:
|
172
|
-
"""
|
173
|
-
Generate the FFmpeg filter string for this filter node.
|
174
|
-
|
175
|
-
This method creates the filter string that will be used in the
|
176
|
-
filter_complex argument of the FFmpeg command. The format follows
|
177
|
-
FFmpeg's syntax where input labels are followed by the filter name
|
178
|
-
and parameters, and then output labels.
|
179
|
-
|
180
|
-
Args:
|
181
|
-
context: Optional DAG context for resolving stream labels.
|
182
|
-
If not provided, a new context will be built.
|
183
|
-
|
184
|
-
Returns:
|
185
|
-
A list of strings that, when joined, form the filter string
|
186
|
-
for this node in the filter_complex argument
|
187
|
-
|
188
|
-
Example:
|
189
|
-
For a scale filter with width=1280 and height=720, this might return:
|
190
|
-
['[0:v]', 'scale=', 'width=1280:height=720', '[s0]']
|
191
|
-
"""
|
192
|
-
from .context import DAGContext
|
193
|
-
|
194
|
-
if not context:
|
195
|
-
context = DAGContext.build(self)
|
196
|
-
|
197
|
-
incoming_labels = "".join(f"[{k.label(context)}]" for k in self.inputs)
|
198
|
-
outputs = context.get_outgoing_streams(self)
|
199
|
-
|
200
|
-
outgoing_labels = ""
|
201
|
-
for output in sorted(outputs, key=lambda stream: stream.index or 0):
|
202
|
-
# NOTE: all outgoing streams must be filterable
|
203
|
-
assert isinstance(output, FilterableStream)
|
204
|
-
outgoing_labels += f"[{output.label(context)}]"
|
205
|
-
|
206
|
-
commands = []
|
207
|
-
for key, value in self.kwargs.items():
|
208
|
-
assert not isinstance(value, LazyValue), (
|
209
|
-
f"LazyValue should have been evaluated: {key}={value}"
|
210
|
-
)
|
211
|
-
|
212
|
-
# Note: the -nooption syntax cannot be used for boolean AVOptions, use -option 0/-option 1.
|
213
|
-
if isinstance(value, bool):
|
214
|
-
value = str(int(value))
|
215
|
-
|
216
|
-
if not isinstance(value, Default):
|
217
|
-
commands += [f"{key}={escape(value)}"]
|
218
|
-
|
219
|
-
if commands:
|
220
|
-
return (
|
221
|
-
[incoming_labels]
|
222
|
-
+ [f"{self.name}="]
|
223
|
-
+ [escape(":".join(commands), "\\'[],;")]
|
224
|
-
+ [outgoing_labels]
|
225
|
-
)
|
226
|
-
return [incoming_labels] + [f"{self.name}"] + [outgoing_labels]
|
227
|
-
|
228
167
|
|
229
168
|
@dataclass(frozen=True, kw_only=True)
|
230
169
|
class FilterableStream(Stream, OutputArgs):
|
@@ -397,64 +336,8 @@ class FilterableStream(Stream, OutputArgs):
|
|
397
336
|
output_typings=output_typings,
|
398
337
|
)
|
399
338
|
|
400
|
-
def label(self, context: DAGContext = None) -> str:
|
401
|
-
"""
|
402
|
-
Generate the FFmpeg label for this stream in filter graphs.
|
403
|
-
|
404
|
-
This method creates the label string used to identify this stream in
|
405
|
-
FFmpeg filter graphs. The format of the label depends on the stream's
|
406
|
-
source (input file or filter) and type (video or audio).
|
407
|
-
|
408
|
-
For input streams, labels follow FFmpeg's stream specifier syntax:
|
409
|
-
- Video streams: "0:v" (first input, video stream)
|
410
|
-
- Audio streams: "0:a" (first input, audio stream)
|
411
|
-
- AV streams: "0" (first input, all streams)
|
412
|
-
|
413
|
-
For filter outputs, labels use the filter's label:
|
414
|
-
- Single output filters: "filterlabel"
|
415
|
-
- Multi-output filters: "filterlabel#index"
|
416
|
-
|
417
|
-
Args:
|
418
|
-
context: Optional DAG context for resolving node labels.
|
419
|
-
If not provided, a new context will be built.
|
420
|
-
|
421
|
-
Returns:
|
422
|
-
A string label for this stream in FFmpeg filter syntax
|
423
|
-
|
424
|
-
Raises:
|
425
|
-
FFMpegValueError: If the stream has an unknown type or node type
|
426
|
-
"""
|
427
|
-
from ..streams.audio import AudioStream
|
428
|
-
from ..streams.av import AVStream
|
429
|
-
from ..streams.video import VideoStream
|
430
|
-
from .context import DAGContext
|
431
|
-
|
432
|
-
if not context:
|
433
|
-
context = DAGContext.build(self.node)
|
434
|
-
|
435
|
-
if isinstance(self.node, InputNode):
|
436
|
-
if isinstance(self, AVStream):
|
437
|
-
return f"{context.get_node_label(self.node)}"
|
438
|
-
elif isinstance(self, VideoStream):
|
439
|
-
return f"{context.get_node_label(self.node)}:v"
|
440
|
-
elif isinstance(self, AudioStream):
|
441
|
-
return f"{context.get_node_label(self.node)}:a"
|
442
|
-
raise FFMpegValueError(
|
443
|
-
f"Unknown stream type: {self.__class__.__name__}"
|
444
|
-
) # pragma: no cover
|
445
|
-
|
446
|
-
if isinstance(self.node, FilterNode):
|
447
|
-
if len(self.node.output_typings) > 1:
|
448
|
-
return f"{context.get_node_label(self.node)}#{self.index}"
|
449
|
-
return f"{context.get_node_label(self.node)}"
|
450
|
-
raise FFMpegValueError(
|
451
|
-
f"Unknown node type: {self.node.__class__.__name__}"
|
452
|
-
) # pragma: no cover
|
453
|
-
|
454
339
|
def __post_init__(self) -> None:
|
455
|
-
if isinstance(self.node, InputNode):
|
456
|
-
assert self.index is None, "Input streams cannot have an index"
|
457
|
-
else:
|
340
|
+
if not isinstance(self.node, InputNode):
|
458
341
|
assert self.index is not None, "Filter streams must have an index"
|
459
342
|
|
460
343
|
|
@@ -560,36 +443,6 @@ class InputNode(Node):
|
|
560
443
|
|
561
444
|
return AVStream(node=self)
|
562
445
|
|
563
|
-
@override
|
564
|
-
def get_args(self, context: DAGContext = None) -> list[str]:
|
565
|
-
"""
|
566
|
-
Generate the FFmpeg command-line arguments for this input file.
|
567
|
-
|
568
|
-
This method creates the command-line arguments needed to specify
|
569
|
-
this input file to FFmpeg, including any input-specific options.
|
570
|
-
|
571
|
-
Args:
|
572
|
-
context: Optional DAG context (not used for input nodes)
|
573
|
-
|
574
|
-
Returns:
|
575
|
-
A list of strings representing FFmpeg command-line arguments
|
576
|
-
|
577
|
-
Example:
|
578
|
-
For an input file "input.mp4" with options like seeking to 10 seconds:
|
579
|
-
['-ss', '10', '-i', 'input.mp4']
|
580
|
-
"""
|
581
|
-
commands = []
|
582
|
-
for key, value in self.kwargs.items():
|
583
|
-
if isinstance(value, bool):
|
584
|
-
if value is True:
|
585
|
-
commands += [f"-{key}"]
|
586
|
-
elif value is False:
|
587
|
-
commands += [f"-no{key}"]
|
588
|
-
else:
|
589
|
-
commands += [f"-{key}", str(value)]
|
590
|
-
commands += ["-i", self.filename]
|
591
|
-
return commands
|
592
|
-
|
593
446
|
|
594
447
|
@dataclass(frozen=True, kw_only=True)
|
595
448
|
class OutputNode(Node):
|
@@ -642,47 +495,6 @@ class OutputNode(Node):
|
|
642
495
|
"""
|
643
496
|
return OutputStream(node=self)
|
644
497
|
|
645
|
-
@override
|
646
|
-
def get_args(self, context: DAGContext = None) -> list[str]:
|
647
|
-
"""
|
648
|
-
Generate the FFmpeg command-line arguments for this output file.
|
649
|
-
|
650
|
-
This method creates the command-line arguments needed to specify
|
651
|
-
this output file to FFmpeg, including stream mapping and output-specific
|
652
|
-
options like codecs and formats.
|
653
|
-
|
654
|
-
Args:
|
655
|
-
context: Optional DAG context for resolving stream labels.
|
656
|
-
If not provided, a new context will be built.
|
657
|
-
|
658
|
-
Returns:
|
659
|
-
A list of strings representing FFmpeg command-line arguments
|
660
|
-
|
661
|
-
Example:
|
662
|
-
For an output file "output.mp4" with H.264 video codec:
|
663
|
-
['-map', '[v0]', '-c:v', 'libx264', 'output.mp4']
|
664
|
-
"""
|
665
|
-
# !handle mapping
|
666
|
-
commands = []
|
667
|
-
|
668
|
-
if context:
|
669
|
-
for input in self.inputs:
|
670
|
-
if isinstance(input.node, InputNode):
|
671
|
-
commands += ["-map", input.label(context)]
|
672
|
-
else:
|
673
|
-
commands += ["-map", f"[{input.label(context)}]"]
|
674
|
-
|
675
|
-
for key, value in self.kwargs.items():
|
676
|
-
if isinstance(value, bool):
|
677
|
-
if value is True:
|
678
|
-
commands += [f"-{key}"]
|
679
|
-
elif value is False:
|
680
|
-
commands += [f"-no{key}"]
|
681
|
-
else:
|
682
|
-
commands += [f"-{key}", str(value)]
|
683
|
-
commands += [self.filename]
|
684
|
-
return commands
|
685
|
-
|
686
498
|
|
687
499
|
@dataclass(frozen=True, kw_only=True)
|
688
500
|
class OutputStream(Stream, GlobalRunable):
|
@@ -736,16 +548,6 @@ class GlobalNode(Node):
|
|
736
548
|
inputs: tuple[OutputStream, ...]
|
737
549
|
"""The output streams this node applies to"""
|
738
550
|
|
739
|
-
@override
|
740
|
-
def repr(self) -> str:
|
741
|
-
"""
|
742
|
-
Get a string representation of this global node.
|
743
|
-
|
744
|
-
Returns:
|
745
|
-
A space-separated string of the global options
|
746
|
-
"""
|
747
|
-
return " ".join(self.get_args())
|
748
|
-
|
749
551
|
def stream(self) -> GlobalStream:
|
750
552
|
"""
|
751
553
|
Get a global stream representing this global node.
|
@@ -768,36 +570,6 @@ class GlobalNode(Node):
|
|
768
570
|
"""
|
769
571
|
return GlobalStream(node=self)
|
770
572
|
|
771
|
-
@override
|
772
|
-
def get_args(self, context: DAGContext = None) -> list[str]:
|
773
|
-
"""
|
774
|
-
Generate the FFmpeg command-line arguments for these global options.
|
775
|
-
|
776
|
-
This method creates the command-line arguments needed to specify
|
777
|
-
global options to FFmpeg, such as -y for overwrite or -loglevel for
|
778
|
-
controlling log output.
|
779
|
-
|
780
|
-
Args:
|
781
|
-
context: Optional DAG context (not used for global options)
|
782
|
-
|
783
|
-
Returns:
|
784
|
-
A list of strings representing FFmpeg command-line arguments
|
785
|
-
|
786
|
-
Example:
|
787
|
-
For global options like overwrite and quiet logging:
|
788
|
-
['-y', '-loglevel', 'quiet']
|
789
|
-
"""
|
790
|
-
commands = []
|
791
|
-
for key, value in self.kwargs.items():
|
792
|
-
if isinstance(value, bool):
|
793
|
-
if value is True:
|
794
|
-
commands += [f"-{key}"]
|
795
|
-
elif value is False:
|
796
|
-
commands += [f"-no{key}"]
|
797
|
-
else:
|
798
|
-
commands += [f"-{key}", str(value)]
|
799
|
-
return commands
|
800
|
-
|
801
573
|
|
802
574
|
@dataclass(frozen=True, kw_only=True)
|
803
575
|
class GlobalStream(Stream, GlobalRunable):
|
typed_ffmpeg/dag/schema.py
CHANGED
@@ -1,18 +1,14 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
|
-
from abc import ABC, abstractmethod
|
4
3
|
from dataclasses import dataclass, replace
|
5
4
|
from functools import cached_property
|
6
|
-
from typing import
|
5
|
+
from typing import Literal
|
7
6
|
|
8
7
|
from ..common.serialize import Serializable
|
9
8
|
from ..utils.forzendict import FrozenDict
|
10
9
|
from ..utils.lazy_eval.schema import LazyValue
|
11
10
|
from .utils import is_dag
|
12
11
|
|
13
|
-
if TYPE_CHECKING:
|
14
|
-
from .context import DAGContext
|
15
|
-
|
16
12
|
|
17
13
|
@dataclass(frozen=True, kw_only=True)
|
18
14
|
class HashableBaseModel(Serializable):
|
@@ -77,7 +73,7 @@ class Stream(HashableBaseModel):
|
|
77
73
|
|
78
74
|
|
79
75
|
@dataclass(frozen=True, kw_only=True)
|
80
|
-
class Node(HashableBaseModel
|
76
|
+
class Node(HashableBaseModel):
|
81
77
|
"""
|
82
78
|
A 'Node' represents a single operation in the Directed Acyclic Graph (DAG).
|
83
79
|
|
@@ -117,18 +113,6 @@ class Node(HashableBaseModel, ABC):
|
|
117
113
|
if not is_dag(output):
|
118
114
|
raise ValueError(f"Graph is not a DAG: {output}") # pragma: no cover
|
119
115
|
|
120
|
-
@abstractmethod
|
121
|
-
def get_args(self, context: DAGContext = None) -> list[str]:
|
122
|
-
"""
|
123
|
-
Get the arguments of the node.
|
124
|
-
|
125
|
-
Args:
|
126
|
-
context: The DAG context.
|
127
|
-
|
128
|
-
Returns:
|
129
|
-
The arguments of the node.
|
130
|
-
"""
|
131
|
-
|
132
116
|
def repr(self) -> str:
|
133
117
|
"""
|
134
118
|
Get the representation of the node.
|
typed_ffmpeg/streams/av.py
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
from ..dag.nodes import InputNode
|
2
|
-
from ..utils.typing import override
|
3
2
|
from .audio import AudioStream
|
4
3
|
from .video import VideoStream
|
5
4
|
|
@@ -12,11 +11,45 @@ class AVStream(AudioStream, VideoStream):
|
|
12
11
|
node: InputNode
|
13
12
|
|
14
13
|
@property
|
15
|
-
@override
|
16
14
|
def video(self) -> VideoStream:
|
15
|
+
"""
|
16
|
+
Get the video stream from the input node.
|
17
|
+
|
18
|
+
Returns:
|
19
|
+
VideoStream: The video stream from the input node.
|
20
|
+
"""
|
17
21
|
return VideoStream(node=self.node, index=self.index)
|
18
22
|
|
19
23
|
@property
|
20
|
-
@override
|
21
24
|
def audio(self) -> AudioStream:
|
25
|
+
"""
|
26
|
+
Get the audio stream from the input node.
|
27
|
+
|
28
|
+
Returns:
|
29
|
+
AudioStream: The audio stream from the input node.
|
30
|
+
"""
|
22
31
|
return AudioStream(node=self.node, index=self.index)
|
32
|
+
|
33
|
+
def video_stream(self, index: int) -> VideoStream:
|
34
|
+
"""
|
35
|
+
Get the video stream from the input node with a specified index.
|
36
|
+
|
37
|
+
Args:
|
38
|
+
index: The index of the video stream.
|
39
|
+
|
40
|
+
Returns:
|
41
|
+
VideoStream: The video stream from the input node.
|
42
|
+
"""
|
43
|
+
return VideoStream(node=self.node, index=index)
|
44
|
+
|
45
|
+
def audio_stream(self, index: int) -> AudioStream:
|
46
|
+
"""
|
47
|
+
Get the audio stream from the input node with a specified index.
|
48
|
+
|
49
|
+
Args:
|
50
|
+
index: The index of the audio stream.
|
51
|
+
|
52
|
+
Returns:
|
53
|
+
AudioStream: The audio stream from the input node.
|
54
|
+
"""
|
55
|
+
return AudioStream(node=self.node, index=index)
|
typed_ffmpeg/utils/view.py
CHANGED
{typed_ffmpeg_compatible-2.7.2.dist-info → typed_ffmpeg_compatible-2.7.4.dist-info}/METADATA
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: typed-ffmpeg-compatible
|
3
|
-
Version: 2.7.
|
3
|
+
Version: 2.7.4
|
4
4
|
Summary: Modern Python FFmpeg wrappers offer comprehensive support for complex filters, complete with detailed typing and documentation.
|
5
5
|
Home-page: https://livingbio.github.io/typed-ffmpeg/
|
6
6
|
License: MIT
|
@@ -0,0 +1,95 @@
|
|
1
|
+
typed_ffmpeg/__init__.py,sha256=XOCKaSLlOqdt5QwQ1AxzhSEnQPEnxBQOK0HMByVITJY,1556
|
2
|
+
typed_ffmpeg/base.py,sha256=C5Tqbx2I0c-09D7aXKZoGkspu-lAAeAhuOns5zr3PXQ,6304
|
3
|
+
typed_ffmpeg/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
4
|
+
typed_ffmpeg/common/cache/.gitignore,sha256=17NwFqixyEtfIYn7YcesC-xwPVrQN1ri38tUOuFJ4eU,36
|
5
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/acrossover.json,sha256=MCFEAf3S7HInm5HO4yQIUeGEWeFg-38FCS9B_uPMhcw,194
|
6
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/afir.json,sha256=Cf95GM3AEMCLNKsh4-uPBcBMa16p0JFFoJ5ZEPo9LAE,207
|
7
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/aiir.json,sha256=w-xp6cTsxuGPD7UeGSWtZhLTFTRDbwLrXNrXS4sxaTc,191
|
8
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/ainterleave.json,sha256=AZar-1iL97a7YZfFbxV5dMnLZJx2neIu8UCxXVq7Pz8,222
|
9
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/amerge.json,sha256=4ov8qCfk8C9658pf9AJ-TIrzaK3zeJgbVFyjk_exbfg,211
|
10
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/amix.json,sha256=wEO69U3vyC4CsI5_ZzLFVrB0KA7tdCJmdRYucXp-aFo,209
|
11
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/amovie.json,sha256=1CYWGk8er90Rir_ZP0D5rG791ECQjDdRpIKUbjJo85s,220
|
12
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/anequalizer.json,sha256=APMfbI_kWr2LxEuRp_lECgO9cJsDuW8xN_-b32ix6zI,196
|
13
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/aphasemeter.json,sha256=dSPkiI4pIstHThqLjPAb2Sl7ZfagzexRda8rHMIn_Ik,197
|
14
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/asegment.json,sha256=vFv2BAeGwd4mZTayiJjNHPAqenzexBWHX4ZCP83YG7w,199
|
15
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/aselect.json,sha256=3caMvUKzEr88xlxIUZagN4AM6uw40nTX4bYxQ2TwtNs,168
|
16
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/asplit.json,sha256=kjc6MKsrNIMqG4-6kMq2DyMdrTOAAEAvxAH538xlBqQ,167
|
17
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/astreamselect.json,sha256=p99jM9KNj0EbDiEZoEs1PcmtYiv0w9feBOY_4PgbZZQ,271
|
18
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/bm3d.json,sha256=hnk2is_jSFbf2VnDWFIOJvFZnpFs0CkAmBFVHZfv0d0,186
|
19
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/channelsplit.json,sha256=Tt0yEFVpIt5PZualsmXWZU_ig8SkC6OKnSATk6xRJ3w,196
|
20
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/concat.json,sha256=HBn-z3m8GgP9QM8Pal5Oqhc93IJ8aBss-rfrktZ0IIc,308
|
21
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/decimate.json,sha256=BNQ72EVOxyPJ_z-WxXDsqw6SL6DMGZkRQyJamOrP4H8,194
|
22
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/ebur128.json,sha256=mMMh07Ba42j92KTdnKMJMn77GjKcD26f7vNsrToXgMw,191
|
23
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/extractplanes.json,sha256=bUkO7g51t0Gt2Rhxay_oLViVz14a6YuWGqqs_lNSP8c,184
|
24
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/fieldmatch.json,sha256=3fAxnq6kaVSM7gK1g81mkPv-he_H31DapVC6QjCWBGk,194
|
25
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/guided.json,sha256=G7jZeq_XrmOx_zbcHi9KGLstBzjzl0LeUoDe_AAxfQM,193
|
26
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/headphone.json,sha256=hUHkuNzO54IgZ9Nsa2Sm692wW5sYDcct9JSmIZdw_4Q,235
|
27
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/hstack.json,sha256=xQX9TznZnggWCvzKF0SJZTIuMKqTPVJ_xGbjebrPAP4,211
|
28
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/interleave.json,sha256=8i0eqokfOF5hTAYUjdVKYjL-j6xoaWsCIBtcbsRdcao,221
|
29
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/join.json,sha256=_rEatiLjZ3SQQ90814r-QxrHVfcDrcsoGvCJ0kF3ih4,209
|
30
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/libplacebo.json,sha256=oSjAMvu3bemRMRL2gN_4NTcm_LL-qwxutRISla4B9qo,215
|
31
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/limitdiff.json,sha256=4GR2tpPFzc5mQfQb2AtIhqXKI_6T7okObj_M5SuNCck,217
|
32
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/mergeplanes.json,sha256=kCFb3CNlsRpkVZbIPhILcrEwbOM1ds5zToEkalSELUE,193
|
33
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/mix.json,sha256=dDF3A__jPcKPuax_Ybt0sk0aSGw5IaK1-lpzSc4YuVs,208
|
34
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/movie.json,sha256=cx80m5BmdJvFvSAago-bXEgOj_QlbKUh-moLs-MvkHY,219
|
35
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/premultiply.json,sha256=UTjO7j50Dd_Hk1Y74yrcAhHngxuahQL2JHMgkNc9AFc,197
|
36
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/segment.json,sha256=Q44z5bqBuBiAwqkqPr0hLl2tRZr5Re5kUu7eOJiBR4I,199
|
37
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/select.json,sha256=2SSYM-FvvTQBTw9KTOB3nt9RXotBLvO5gC7iWUQ_s0o,167
|
38
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/signature.json,sha256=9SdqeN6pUhXE8t7Kx_ysJR5GwhjcUyRBi-59qVabp1Q,220
|
39
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/split.json,sha256=ZzhAgLvQRRET4v-qOx56mOP-G5SgzVQ0S3uKV8hRgmg,166
|
40
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/streamselect.json,sha256=gdjx7MuegrcuTO4wvV29Kgk9CW_51U7Qetf6jF2Az6o,270
|
41
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/unpremultiply.json,sha256=pBnyP1zTkjJfEqRBqZYypGcj4MSiYMQ4Zust04CJ4Z8,201
|
42
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/vstack.json,sha256=MMulT4NEaO0wP7OpfEwZUM7JNMNOx262OcQEH6K2_dQ,211
|
43
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/xmedian.json,sha256=Er7eTcYZCop6QMZT0OXC9QV6tf76mRBYXjqPIqdKDtU,212
|
44
|
+
typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/xstack.json,sha256=6Svn1w2FopoYufK0kWCJR7xZndMyTItRs63-TafWMnk,211
|
45
|
+
typed_ffmpeg/common/cache/list/filters.json,sha256=s5-tRP3Jrun2nlj5nV_StPozuC5y3cNcb_xCc4OSulg,2390250
|
46
|
+
typed_ffmpeg/common/cache/list/options.json,sha256=bmODg-h8ZI90IWICSW44CllVkPRnUs6nJ4pOOQ__cqw,40453
|
47
|
+
typed_ffmpeg/common/cache.py,sha256=j0JvfX7jewLpdJWxgo7Pwze0BkUJdYGHX2uGR8BZ-9M,1386
|
48
|
+
typed_ffmpeg/common/schema.py,sha256=qM8yfMX9UU3EAQSNsTrr-SAmyqKx8eQCXTtu3RJWkEk,19673
|
49
|
+
typed_ffmpeg/common/serialize.py,sha256=dLim0DBP5CdJ1JiMV9xEmmh1XMSIhBOWs61EopAL15s,7719
|
50
|
+
typed_ffmpeg/compile/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
51
|
+
typed_ffmpeg/compile/compile_cli.py,sha256=qwcBtl4-ha7rYAY6dWoM12ngbP8i6QzqwtrQrL3mqC0,14826
|
52
|
+
typed_ffmpeg/compile/compile_json.py,sha256=YCiTyfAnUVSbFr7BiQpmJYs13K5sa-xo77Iih33mb6I,992
|
53
|
+
typed_ffmpeg/compile/compile_python.py,sha256=rsoF4spI3cq6uMHU3iN-j8QByj2yE5pEqjatWCaf0D4,11522
|
54
|
+
typed_ffmpeg/compile/context.py,sha256=macQ3HhEJ73j_WbWYtU9GCQCzcB_KQGAPimcuU-WOac,10946
|
55
|
+
typed_ffmpeg/compile/validate.py,sha256=QsWksdvlRwWw6hnatFo-ABakms1qDXRbEmvMQGRLrD8,9579
|
56
|
+
typed_ffmpeg/dag/__init__.py,sha256=qAApSNqjbZ1DtUaV5bSku9RwG7MpMPa1HJO764cSBt4,849
|
57
|
+
typed_ffmpeg/dag/factory.py,sha256=2IMVKP_2UaTrlGXBg8YDx5KXBqhpScJiJQ87PRrppzY,3147
|
58
|
+
typed_ffmpeg/dag/global_runnable/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
59
|
+
typed_ffmpeg/dag/global_runnable/global_args.py,sha256=ehLtx4v-XxqkmODhpE_gik0r79hs4Sa8TJnRsH9Fj1o,8043
|
60
|
+
typed_ffmpeg/dag/global_runnable/runnable.py,sha256=0QGBm3ghM4LFT4H9km9-h_N0w5BR3kTaESRapb-qTv0,11098
|
61
|
+
typed_ffmpeg/dag/io/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
62
|
+
typed_ffmpeg/dag/io/_input.py,sha256=KRLTSQPEfmgPcPEAJdeWRHZhNsClaJCB9Ac6czMOrmE,7214
|
63
|
+
typed_ffmpeg/dag/io/_output.py,sha256=_no6ffAOABznbLNTki8CYr7pvr4Sa0LweRfn38-cszs,12470
|
64
|
+
typed_ffmpeg/dag/io/output_args.py,sha256=SThIhZh9PXs2m6Fz5JsSy8oS-Te7GM_oz7HRuZo0-eI,13901
|
65
|
+
typed_ffmpeg/dag/nodes.py,sha256=lfHChT8JqRs3UUDWtgrWnnXn845HXSD5S1QmHpIUT4U,20526
|
66
|
+
typed_ffmpeg/dag/schema.py,sha256=dSq0o8e9qFazyd55k2yXcxbjoKZJEtqeROd91w1O3Wo,5728
|
67
|
+
typed_ffmpeg/dag/utils.py,sha256=hydh7_kjpOCw8WEGhXMxIXR4Ek-3DeoOt6esInuK2Xw,1941
|
68
|
+
typed_ffmpeg/exceptions.py,sha256=D4SID6WOwkjVV8O8mAjrEDHWn-8BRDnK_jteaDof1SY,2474
|
69
|
+
typed_ffmpeg/filters.py,sha256=_lBpGZgPHK3KgGVrw-TCdQEsBRuEXVIgwggYNGd80MU,110076
|
70
|
+
typed_ffmpeg/info.py,sha256=0KCzf8hJaI6ObPRT0uftLa96RlYvaQmoEq1sqFJSc24,9521
|
71
|
+
typed_ffmpeg/probe.py,sha256=ABfM0ZfDNwBHpPfhu2hpx61_oXb8zdhD9oofwSEcODg,2588
|
72
|
+
typed_ffmpeg/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
73
|
+
typed_ffmpeg/schema.py,sha256=KVtmyGeJutjFot70r6Nj8W8WBqwvfg2-rSgjdhPVh-o,1615
|
74
|
+
typed_ffmpeg/sources.py,sha256=ASt0l8FMW82X-70qw72167xpyBY7tQQClVuhy8r0HfU,86026
|
75
|
+
typed_ffmpeg/streams/__init__.py,sha256=Nt9uWpcVI1sQLl5Qt_kBCBcWOGZA1vczCQ0qvFbSko0,141
|
76
|
+
typed_ffmpeg/streams/audio.py,sha256=2oNRhb5UetWtlPG3NW73AjUZoFPl303yMv-6W1sGWt0,259054
|
77
|
+
typed_ffmpeg/streams/av.py,sha256=Nu6M7uV4aMNQf_kxADZuBdpDwFx_B7Z7x0p5j32n9iA,1500
|
78
|
+
typed_ffmpeg/streams/channel_layout.py,sha256=hGagaoc1tnWS8K1yiITp4f_92qq5e7C_zB15bHOL0DI,1162
|
79
|
+
typed_ffmpeg/streams/video.py,sha256=cQwHfew75YO_dbZjmpUYd-nXt1JHN0M7suFKKe5UH5s,453576
|
80
|
+
typed_ffmpeg/types.py,sha256=ly3zLtg7KxRa_jsDDrFPAxRZRjTQdWVpiQzOD9NdrFM,4137
|
81
|
+
typed_ffmpeg/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
82
|
+
typed_ffmpeg/utils/escaping.py,sha256=m6CTEBwWZTFdtZHTHW-3pQCgkpdZb9f9ynoO-gsD7uM,2937
|
83
|
+
typed_ffmpeg/utils/forzendict.py,sha256=9QWdPQA2AbSfiC9-mrq1YeZFl1qN--zw8WlsqQ2ulCk,3114
|
84
|
+
typed_ffmpeg/utils/lazy_eval/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
85
|
+
typed_ffmpeg/utils/lazy_eval/operator.py,sha256=QWybd-UH3VdDa8kgWkqAMi3WV0b0WF1d1JixQr6is2E,4136
|
86
|
+
typed_ffmpeg/utils/lazy_eval/schema.py,sha256=WSg-E3MS3itN1AT6Dq4Z9btnRHEReuN3o6zruXou7h4,9623
|
87
|
+
typed_ffmpeg/utils/run.py,sha256=mSoAdcvD-InldqkRgWNc8iXKgJJoEMAOE4PL2gVmtqw,2178
|
88
|
+
typed_ffmpeg/utils/snapshot.py,sha256=mKILRm6qiQV2egaD-70MSUEl-DFoLD5w_v9GZIequI4,2181
|
89
|
+
typed_ffmpeg/utils/typing.py,sha256=DBQn_gCF8C_DTwsfMHeCgfnNUROwAjlIcHrQ7lNDOoE,1187
|
90
|
+
typed_ffmpeg/utils/view.py,sha256=QCSlQoQkRBI-T0sWjiywGgM9DlKd8Te3CB2ZYX-pEVU,3413
|
91
|
+
typed_ffmpeg_compatible-2.7.4.dist-info/LICENSE,sha256=8Aaya5i_09Cou2i3QMxTwz6uHGzi_fGA4uhkco07-A4,1066
|
92
|
+
typed_ffmpeg_compatible-2.7.4.dist-info/METADATA,sha256=-V4vF5ykf9Xw12VdfGn8eg35hk22_TCi0iV_p-8UCBg,7249
|
93
|
+
typed_ffmpeg_compatible-2.7.4.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
|
94
|
+
typed_ffmpeg_compatible-2.7.4.dist-info/entry_points.txt,sha256=KfZmNsM16GT_lF1otASIN6E3i6xXHXoB1gMeEdlptjA,44
|
95
|
+
typed_ffmpeg_compatible-2.7.4.dist-info/RECORD,,
|
typed_ffmpeg/dag/compile.py
DELETED
@@ -1,86 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
Compiles FFmpeg filter graphs into command-line arguments.
|
3
|
-
|
4
|
-
This module provides functionality to convert the internal DAG (Directed Acyclic Graph)
|
5
|
-
representation of an FFmpeg filter chain into the actual command-line arguments
|
6
|
-
that would be passed to FFmpeg. It traverses the graph in the correct order,
|
7
|
-
handling global options, inputs, complex filtergraphs, and outputs.
|
8
|
-
"""
|
9
|
-
|
10
|
-
from __future__ import annotations
|
11
|
-
|
12
|
-
from .context import DAGContext
|
13
|
-
from .nodes import FilterNode, GlobalNode, InputNode, OutputNode
|
14
|
-
from .schema import Stream
|
15
|
-
from .validate import validate
|
16
|
-
|
17
|
-
|
18
|
-
def compile(stream: Stream, auto_fix: bool = True) -> list[str]:
|
19
|
-
"""
|
20
|
-
Compile a stream into a list of FFmpeg command-line arguments.
|
21
|
-
|
22
|
-
This function takes a Stream object representing an FFmpeg filter graph
|
23
|
-
and converts it into a list of command-line arguments that can be passed
|
24
|
-
to FFmpeg. It processes the graph in the correct order:
|
25
|
-
1. Global nodes (general FFmpeg options)
|
26
|
-
2. Input nodes (input files and their options)
|
27
|
-
3. Filter nodes (combined into a -filter_complex argument)
|
28
|
-
4. Output nodes (output files and their options)
|
29
|
-
|
30
|
-
The function validates the graph before compilation to ensure it's properly
|
31
|
-
formed. If auto_fix is enabled, it will attempt to fix common issues.
|
32
|
-
|
33
|
-
Args:
|
34
|
-
stream: The Stream object to compile into arguments
|
35
|
-
auto_fix: Whether to automatically fix issues in the stream
|
36
|
-
(e.g., reconnecting disconnected nodes)
|
37
|
-
|
38
|
-
Returns:
|
39
|
-
A list of strings representing FFmpeg command-line arguments
|
40
|
-
|
41
|
-
Example:
|
42
|
-
```python
|
43
|
-
# Create a simple video scaling filter graph
|
44
|
-
input_stream = ffmpeg.input("input.mp4")
|
45
|
-
scaled = input_stream.filter("scale", 1280, 720)
|
46
|
-
output_stream = scaled.output("output.mp4")
|
47
|
-
|
48
|
-
# Compile to FFmpeg arguments
|
49
|
-
args = ffmpeg.dag.compile(output_stream)
|
50
|
-
print(
|
51
|
-
args
|
52
|
-
) # ['ffmpeg', '-i', 'input.mp4', '-filter_complex', '...', 'output.mp4']
|
53
|
-
```
|
54
|
-
"""
|
55
|
-
|
56
|
-
stream = validate(stream, auto_fix=auto_fix)
|
57
|
-
node = stream.node
|
58
|
-
context = DAGContext.build(node)
|
59
|
-
|
60
|
-
# compile the global nodes
|
61
|
-
commands = []
|
62
|
-
global_nodes = [node for node in context.all_nodes if isinstance(node, GlobalNode)]
|
63
|
-
for node in global_nodes:
|
64
|
-
commands += node.get_args(context)
|
65
|
-
|
66
|
-
# compile the input nodes
|
67
|
-
input_nodes = [node for node in context.all_nodes if isinstance(node, InputNode)]
|
68
|
-
for node in input_nodes:
|
69
|
-
commands += node.get_args(context)
|
70
|
-
|
71
|
-
# compile the filter nodes
|
72
|
-
vf_commands = []
|
73
|
-
filter_nodes = [node for node in context.all_nodes if isinstance(node, FilterNode)]
|
74
|
-
|
75
|
-
for node in sorted(filter_nodes, key=lambda node: len(node.upstream_nodes)):
|
76
|
-
vf_commands += ["".join(node.get_args(context))]
|
77
|
-
|
78
|
-
if vf_commands:
|
79
|
-
commands += ["-filter_complex", ";".join(vf_commands)]
|
80
|
-
|
81
|
-
# compile the output nodes
|
82
|
-
output_nodes = [node for node in context.all_nodes if isinstance(node, OutputNode)]
|
83
|
-
for node in output_nodes:
|
84
|
-
commands += node.get_args(context)
|
85
|
-
|
86
|
-
return commands
|
@@ -1,48 +0,0 @@
|
|
1
|
-
typed_ffmpeg/__init__.py,sha256=NL_jH6nUb5pF8pMt3S51243qBTUvZdN-9sJpeuiznRE,1532
|
2
|
-
typed_ffmpeg/base.py,sha256=C5Tqbx2I0c-09D7aXKZoGkspu-lAAeAhuOns5zr3PXQ,6304
|
3
|
-
typed_ffmpeg/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
4
|
-
typed_ffmpeg/common/schema.py,sha256=Gfq_C8T4F0Ie6E9vzmWMn-mzjN0tOfTK0mKHugW5vEs,19547
|
5
|
-
typed_ffmpeg/common/serialize.py,sha256=QH7UVPCXAHrqbAMK11DzFfy03XgFEHXWOrCVUJxBxR0,7764
|
6
|
-
typed_ffmpeg/dag/__init__.py,sha256=qAApSNqjbZ1DtUaV5bSku9RwG7MpMPa1HJO764cSBt4,849
|
7
|
-
typed_ffmpeg/dag/compile.py,sha256=GXMTFE1vqRDI-nuIZPtJwXQhCc61uCIGh5u4OBRp8gg,3129
|
8
|
-
typed_ffmpeg/dag/context.py,sha256=pv77lltW6yk-PRYlZ0MC6FICVxYLuyxQAS9Vx5vko0s,11691
|
9
|
-
typed_ffmpeg/dag/factory.py,sha256=7iRB2Inth97wxvklI-MoL_47Cl7rZOogNj10qM7wUTs,2600
|
10
|
-
typed_ffmpeg/dag/global_runnable/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
11
|
-
typed_ffmpeg/dag/global_runnable/global_args.py,sha256=ehLtx4v-XxqkmODhpE_gik0r79hs4Sa8TJnRsH9Fj1o,8043
|
12
|
-
typed_ffmpeg/dag/global_runnable/runnable.py,sha256=wvfvojrLFvu-Vz0N2AIXbla2kptwcu0Dba4TfKYOH3I,11041
|
13
|
-
typed_ffmpeg/dag/io/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
14
|
-
typed_ffmpeg/dag/io/_input.py,sha256=KRLTSQPEfmgPcPEAJdeWRHZhNsClaJCB9Ac6czMOrmE,7214
|
15
|
-
typed_ffmpeg/dag/io/_output.py,sha256=_no6ffAOABznbLNTki8CYr7pvr4Sa0LweRfn38-cszs,12470
|
16
|
-
typed_ffmpeg/dag/io/output_args.py,sha256=SThIhZh9PXs2m6Fz5JsSy8oS-Te7GM_oz7HRuZo0-eI,13901
|
17
|
-
typed_ffmpeg/dag/nodes.py,sha256=rV6pGPOo6hCuI_4Iipq8pwEz32U2iz7vITaG4C6dmCs,28964
|
18
|
-
typed_ffmpeg/dag/schema.py,sha256=51t38NHgztXp5RAPKgSKqFoSQaU5IsnhIxuxnx2Udl4,6098
|
19
|
-
typed_ffmpeg/dag/utils.py,sha256=hydh7_kjpOCw8WEGhXMxIXR4Ek-3DeoOt6esInuK2Xw,1941
|
20
|
-
typed_ffmpeg/dag/validate.py,sha256=tWswVibP_BFNOiWX0LgnfMrg3TBm7QIt060Ofd9ychE,9569
|
21
|
-
typed_ffmpeg/exceptions.py,sha256=D4SID6WOwkjVV8O8mAjrEDHWn-8BRDnK_jteaDof1SY,2474
|
22
|
-
typed_ffmpeg/filters.py,sha256=_lBpGZgPHK3KgGVrw-TCdQEsBRuEXVIgwggYNGd80MU,110076
|
23
|
-
typed_ffmpeg/info.py,sha256=0KCzf8hJaI6ObPRT0uftLa96RlYvaQmoEq1sqFJSc24,9521
|
24
|
-
typed_ffmpeg/probe.py,sha256=ABfM0ZfDNwBHpPfhu2hpx61_oXb8zdhD9oofwSEcODg,2588
|
25
|
-
typed_ffmpeg/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
26
|
-
typed_ffmpeg/schema.py,sha256=KVtmyGeJutjFot70r6Nj8W8WBqwvfg2-rSgjdhPVh-o,1615
|
27
|
-
typed_ffmpeg/sources.py,sha256=ASt0l8FMW82X-70qw72167xpyBY7tQQClVuhy8r0HfU,86026
|
28
|
-
typed_ffmpeg/streams/__init__.py,sha256=Nt9uWpcVI1sQLl5Qt_kBCBcWOGZA1vczCQ0qvFbSko0,141
|
29
|
-
typed_ffmpeg/streams/audio.py,sha256=2oNRhb5UetWtlPG3NW73AjUZoFPl303yMv-6W1sGWt0,259054
|
30
|
-
typed_ffmpeg/streams/av.py,sha256=SWcy8Q9hk36ZZJ4WosG08NR-r1f2IzOgZ4tsAZ7nX18,544
|
31
|
-
typed_ffmpeg/streams/channel_layout.py,sha256=hGagaoc1tnWS8K1yiITp4f_92qq5e7C_zB15bHOL0DI,1162
|
32
|
-
typed_ffmpeg/streams/video.py,sha256=cQwHfew75YO_dbZjmpUYd-nXt1JHN0M7suFKKe5UH5s,453576
|
33
|
-
typed_ffmpeg/types.py,sha256=ly3zLtg7KxRa_jsDDrFPAxRZRjTQdWVpiQzOD9NdrFM,4137
|
34
|
-
typed_ffmpeg/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
35
|
-
typed_ffmpeg/utils/escaping.py,sha256=m6CTEBwWZTFdtZHTHW-3pQCgkpdZb9f9ynoO-gsD7uM,2937
|
36
|
-
typed_ffmpeg/utils/forzendict.py,sha256=9QWdPQA2AbSfiC9-mrq1YeZFl1qN--zw8WlsqQ2ulCk,3114
|
37
|
-
typed_ffmpeg/utils/lazy_eval/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
38
|
-
typed_ffmpeg/utils/lazy_eval/operator.py,sha256=QWybd-UH3VdDa8kgWkqAMi3WV0b0WF1d1JixQr6is2E,4136
|
39
|
-
typed_ffmpeg/utils/lazy_eval/schema.py,sha256=WSg-E3MS3itN1AT6Dq4Z9btnRHEReuN3o6zruXou7h4,9623
|
40
|
-
typed_ffmpeg/utils/run.py,sha256=mSoAdcvD-InldqkRgWNc8iXKgJJoEMAOE4PL2gVmtqw,2178
|
41
|
-
typed_ffmpeg/utils/snapshot.py,sha256=mKILRm6qiQV2egaD-70MSUEl-DFoLD5w_v9GZIequI4,2181
|
42
|
-
typed_ffmpeg/utils/typing.py,sha256=DBQn_gCF8C_DTwsfMHeCgfnNUROwAjlIcHrQ7lNDOoE,1187
|
43
|
-
typed_ffmpeg/utils/view.py,sha256=4DJmyGIkUeE6-V0azudDCWm608mRdeRhTZHMgnew9Kw,3409
|
44
|
-
typed_ffmpeg_compatible-2.7.2.dist-info/LICENSE,sha256=8Aaya5i_09Cou2i3QMxTwz6uHGzi_fGA4uhkco07-A4,1066
|
45
|
-
typed_ffmpeg_compatible-2.7.2.dist-info/METADATA,sha256=djaV8dOPAbYJax4MQV1G0kDMuZXwlOxNbCpxzbgD3pw,7249
|
46
|
-
typed_ffmpeg_compatible-2.7.2.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
|
47
|
-
typed_ffmpeg_compatible-2.7.2.dist-info/entry_points.txt,sha256=KfZmNsM16GT_lF1otASIN6E3i6xXHXoB1gMeEdlptjA,44
|
48
|
-
typed_ffmpeg_compatible-2.7.2.dist-info/RECORD,,
|
File without changes
|
File without changes
|
{typed_ffmpeg_compatible-2.7.2.dist-info → typed_ffmpeg_compatible-2.7.4.dist-info}/entry_points.txt
RENAMED
File without changes
|