typed-ffmpeg-compatible 3.0.1__tar.gz → 3.2.1__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.
- typed_ffmpeg_compatible-3.2.1/MANIFEST.in +41 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/PKG-INFO +36 -17
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/README.md +22 -3
- typed_ffmpeg_compatible-3.2.1/pyproject.toml +122 -0
- typed_ffmpeg_compatible-3.2.1/setup.cfg +4 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/__init__.py +2 -1
- typed_ffmpeg_compatible-3.2.1/src/typed_ffmpeg/_version.py +21 -0
- typed_ffmpeg_compatible-3.2.1/src/typed_ffmpeg/compile/compile_cli.py +815 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/compile/compile_python.py +3 -4
- typed_ffmpeg_compatible-3.2.1/src/typed_ffmpeg/ffprobe/parse.py +133 -0
- typed_ffmpeg_compatible-3.2.1/src/typed_ffmpeg/ffprobe/probe.py +272 -0
- typed_ffmpeg_compatible-3.2.1/src/typed_ffmpeg/ffprobe/schema.py +455 -0
- typed_ffmpeg_compatible-3.2.1/src/typed_ffmpeg/ffprobe/xml2json.py +70 -0
- typed_ffmpeg_compatible-3.2.1/src/typed_ffmpeg/utils/lazy_eval/__init__.py +0 -0
- typed_ffmpeg_compatible-3.2.1/src/typed_ffmpeg_compatible.egg-info/PKG-INFO +201 -0
- typed_ffmpeg_compatible-3.2.1/src/typed_ffmpeg_compatible.egg-info/SOURCES.txt +61 -0
- typed_ffmpeg_compatible-3.2.1/src/typed_ffmpeg_compatible.egg-info/dependency_links.txt +1 -0
- typed_ffmpeg_compatible-3.2.1/src/typed_ffmpeg_compatible.egg-info/requires.txt +3 -0
- typed_ffmpeg_compatible-3.2.1/src/typed_ffmpeg_compatible.egg-info/top_level.txt +1 -0
- typed_ffmpeg_compatible-3.0.1/pyproject.toml +0 -102
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/.gitignore +0 -3
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/acrossover.json +0 -6
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/afir.json +0 -9
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/aiir.json +0 -6
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/ainterleave.json +0 -9
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/amerge.json +0 -9
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/amix.json +0 -9
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/amovie.json +0 -6
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/anequalizer.json +0 -6
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/aphasemeter.json +0 -6
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/asegment.json +0 -6
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/aselect.json +0 -6
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/asplit.json +0 -6
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/astreamselect.json +0 -9
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/bm3d.json +0 -6
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/channelsplit.json +0 -6
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/concat.json +0 -9
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/decimate.json +0 -6
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/ebur128.json +0 -6
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/extractplanes.json +0 -6
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/fieldmatch.json +0 -6
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/guided.json +0 -6
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/headphone.json +0 -6
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/hstack.json +0 -9
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/interleave.json +0 -9
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/join.json +0 -9
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/libplacebo.json +0 -9
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/limitdiff.json +0 -6
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/mergeplanes.json +0 -6
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/mix.json +0 -9
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/movie.json +0 -6
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/premultiply.json +0 -6
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/segment.json +0 -6
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/select.json +0 -6
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/signature.json +0 -9
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/split.json +0 -6
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/streamselect.json +0 -9
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/unpremultiply.json +0 -6
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/vstack.json +0 -9
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/xmedian.json +0 -9
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/FFMpegFilterManuallyDefined/xstack.json +0 -9
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/list/filters.json +0 -90747
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/common/cache/list/options.json +0 -1694
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/compile/compile_cli.py +0 -415
- typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/probe.py +0 -75
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/LICENSE +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/base.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/common/__init__.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/common/cache.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/common/schema.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/common/serialize.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/compile/__init__.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/compile/compile_json.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/compile/context.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/compile/validate.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/dag/__init__.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/dag/factory.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/dag/global_runnable/__init__.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/dag/global_runnable/global_args.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/dag/global_runnable/runnable.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/dag/io/__init__.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/dag/io/_input.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/dag/io/_output.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/dag/io/output_args.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/dag/nodes.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/dag/schema.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/dag/utils.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/exceptions.py +0 -0
- {typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/utils → typed_ffmpeg_compatible-3.2.1/src/typed_ffmpeg/ffprobe}/__init__.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/filters.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/info.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/py.typed +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/schema.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/sources.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/streams/__init__.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/streams/audio.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/streams/av.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/streams/channel_layout.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/streams/video.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/types.py +0 -0
- {typed_ffmpeg_compatible-3.0.1/src/typed_ffmpeg/utils/lazy_eval → typed_ffmpeg_compatible-3.2.1/src/typed_ffmpeg/utils}/__init__.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/utils/escaping.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/utils/forzendict.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/utils/lazy_eval/operator.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/utils/lazy_eval/schema.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/utils/run.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/utils/snapshot.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/utils/typing.py +0 -0
- {typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/utils/view.py +0 -0
@@ -0,0 +1,41 @@
|
|
1
|
+
global-exclude **/tests/**
|
2
|
+
global-exclude **/scripts/**
|
3
|
+
global-exclude **/__snapshots__/**
|
4
|
+
global-exclude **/test_*
|
5
|
+
global-exclude **/*_test.py
|
6
|
+
global-exclude **/*.test.py
|
7
|
+
global-exclude **/conftest.py
|
8
|
+
|
9
|
+
# Exclude development and documentation files
|
10
|
+
global-exclude .coveragerc
|
11
|
+
global-exclude .eslintrc.json
|
12
|
+
global-exclude .gitignore
|
13
|
+
global-exclude .gitmodules
|
14
|
+
global-exclude .pre-commit-config.yaml
|
15
|
+
global-exclude .prettierignore
|
16
|
+
global-exclude .prettierrc
|
17
|
+
global-exclude blog.md
|
18
|
+
global-exclude codecov.yml
|
19
|
+
global-exclude mkdocs.yml
|
20
|
+
global-exclude pyproject-compatible.toml
|
21
|
+
global-exclude requirements.in
|
22
|
+
global-exclude requirements.txt
|
23
|
+
global-exclude tox.ini
|
24
|
+
global-exclude uv.lock
|
25
|
+
global-exclude README.ipynb
|
26
|
+
|
27
|
+
# Exclude development container files
|
28
|
+
global-exclude .devcontainer/**
|
29
|
+
global-exclude .github/**
|
30
|
+
|
31
|
+
# Exclude documentation
|
32
|
+
global-exclude docs/**
|
33
|
+
|
34
|
+
# Exclude uv configuration
|
35
|
+
global-exclude .uv/**
|
36
|
+
|
37
|
+
# Include only necessary files
|
38
|
+
include LICENSE
|
39
|
+
include README.md
|
40
|
+
include pyproject.toml
|
41
|
+
include MANIFEST.in
|
@@ -1,15 +1,13 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.4
|
2
2
|
Name: typed-ffmpeg-compatible
|
3
|
-
Version: 3.
|
3
|
+
Version: 3.2.1
|
4
4
|
Summary: Modern Python FFmpeg wrappers offer comprehensive support for complex filters, complete with detailed typing and documentation.
|
5
|
-
|
6
|
-
License: MIT
|
5
|
+
Author-email: lucemia <lucemia@gmail.com>
|
6
|
+
License-Expression: MIT
|
7
|
+
Project-URL: Homepage, https://livingbio.github.io/typed-ffmpeg/
|
8
|
+
Project-URL: Repository, https://github.com/livingbio/typed-ffmpeg
|
7
9
|
Keywords: ffmpeg,video,audio,multimedia,filter
|
8
|
-
Author: lucemia
|
9
|
-
Author-email: lucemia@gmail.com
|
10
|
-
Requires-Python: >=3.10,<4.0
|
11
10
|
Classifier: Intended Audience :: Developers
|
12
|
-
Classifier: License :: OSI Approved :: MIT License
|
13
11
|
Classifier: Natural Language :: English
|
14
12
|
Classifier: Operating System :: OS Independent
|
15
13
|
Classifier: Programming Language :: Python
|
@@ -17,15 +15,18 @@ Classifier: Programming Language :: Python :: 3
|
|
17
15
|
Classifier: Programming Language :: Python :: 3.10
|
18
16
|
Classifier: Programming Language :: Python :: 3.11
|
19
17
|
Classifier: Programming Language :: Python :: 3.12
|
20
|
-
Classifier:
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
21
19
|
Classifier: Topic :: Multimedia :: Video
|
20
|
+
Classifier: Topic :: Multimedia :: Sound/Audio
|
21
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
22
22
|
Classifier: Topic :: Software Development :: Libraries
|
23
23
|
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
|
24
|
-
|
25
|
-
Provides-Extra: graph
|
26
|
-
Requires-Dist: graphviz ; extra == "graph"
|
27
|
-
Project-URL: Repository, https://github.com/livingbio/typed-ffmpeg
|
24
|
+
Requires-Python: >=3.10
|
28
25
|
Description-Content-Type: text/markdown
|
26
|
+
License-File: LICENSE
|
27
|
+
Provides-Extra: graph
|
28
|
+
Requires-Dist: graphviz; extra == "graph"
|
29
|
+
Dynamic: license-file
|
29
30
|
|
30
31
|
## typed-ffmpeg
|
31
32
|
|
@@ -44,6 +45,7 @@ Description-Content-Type: text/markdown
|
|
44
45
|
- [Installation](#installation)
|
45
46
|
- [Quick Usage](#quick-usage)
|
46
47
|
- [Documentation](https://livingbio.github.io/typed-ffmpeg/)
|
48
|
+
- [Interactive Playground](#interactive-playground)
|
47
49
|
- [Acknowledgements](#acknowledgements)
|
48
50
|
|
49
51
|
---
|
@@ -63,6 +65,7 @@ Description-Content-Type: text/markdown
|
|
63
65
|
- **Validation and Auto-correction:** Assists in identifying and fixing errors within filter graphs.
|
64
66
|
- **Input and Output Options Support:** Provide a more comprehensive interface for input and output options, including support for additional codecs and formats.
|
65
67
|
- **Partial Evaluation:** Enhance the flexibility of filter graphs by enabling partial evaluation, allowing for modular construction and reuse.
|
68
|
+
- **Media File Analysis:** Built-in support for analyzing media files using FFmpeg's ffprobe utility, providing detailed metadata extraction with both dictionary and dataclass interfaces.
|
66
69
|
|
67
70
|
### Planned Features
|
68
71
|
|
@@ -101,12 +104,14 @@ Note: This requires Graphviz to be installed on your system.
|
|
101
104
|
|
102
105
|
Here's how to quickly start using `typed-ffmpeg`:
|
103
106
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
107
|
```python
|
108
108
|
import ffmpeg
|
109
109
|
|
110
|
+
# Analyze a media file
|
111
|
+
info = ffmpeg.probe("video.mp4")
|
112
|
+
print(f"Duration: {float(info['format']['duration']):.2f} seconds")
|
113
|
+
print(f"Streams: {len(info['streams'])}")
|
114
|
+
|
110
115
|
# Flip video horizontally and output
|
111
116
|
f = (
|
112
117
|
ffmpeg
|
@@ -163,6 +168,21 @@ f
|
|
163
168
|
|
164
169
|
See the [Usage](https://livingbio.github.io/typed-ffmpeg/usage/typed/) section in our documentation for more examples and detailed guides.
|
165
170
|
|
171
|
+
---
|
172
|
+
|
173
|
+
## Interactive Playground
|
174
|
+
|
175
|
+
Try out `typed-ffmpeg` directly in your browser with our [Interactive Playground](https://livingbio.github.io/typed-ffmpeg-playground/)! The playground provides a live environment where you can:
|
176
|
+
|
177
|
+

|
178
|
+
|
179
|
+
- Experiment with FFmpeg filters and commands
|
180
|
+
- Visualize filter graphs in real-time
|
181
|
+
- Test different input/output configurations
|
182
|
+
- Learn through interactive examples
|
183
|
+
- Share your filter graphs with others
|
184
|
+
|
185
|
+
The playground is perfect for learning and prototyping FFmpeg filter chains without setting up a local environment.
|
166
186
|
|
167
187
|
---
|
168
188
|
|
@@ -179,4 +199,3 @@ This project is dedicated to my son, Austin, on his seventh birthday (February 2
|
|
179
199
|
---
|
180
200
|
|
181
201
|
Feel free to check the [Documentation](https://livingbio.github.io/typed-ffmpeg/) for detailed information and more advanced features.
|
182
|
-
|
@@ -15,6 +15,7 @@
|
|
15
15
|
- [Installation](#installation)
|
16
16
|
- [Quick Usage](#quick-usage)
|
17
17
|
- [Documentation](https://livingbio.github.io/typed-ffmpeg/)
|
18
|
+
- [Interactive Playground](#interactive-playground)
|
18
19
|
- [Acknowledgements](#acknowledgements)
|
19
20
|
|
20
21
|
---
|
@@ -34,6 +35,7 @@
|
|
34
35
|
- **Validation and Auto-correction:** Assists in identifying and fixing errors within filter graphs.
|
35
36
|
- **Input and Output Options Support:** Provide a more comprehensive interface for input and output options, including support for additional codecs and formats.
|
36
37
|
- **Partial Evaluation:** Enhance the flexibility of filter graphs by enabling partial evaluation, allowing for modular construction and reuse.
|
38
|
+
- **Media File Analysis:** Built-in support for analyzing media files using FFmpeg's ffprobe utility, providing detailed metadata extraction with both dictionary and dataclass interfaces.
|
37
39
|
|
38
40
|
### Planned Features
|
39
41
|
|
@@ -72,12 +74,14 @@ Note: This requires Graphviz to be installed on your system.
|
|
72
74
|
|
73
75
|
Here's how to quickly start using `typed-ffmpeg`:
|
74
76
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
77
|
```python
|
79
78
|
import ffmpeg
|
80
79
|
|
80
|
+
# Analyze a media file
|
81
|
+
info = ffmpeg.probe("video.mp4")
|
82
|
+
print(f"Duration: {float(info['format']['duration']):.2f} seconds")
|
83
|
+
print(f"Streams: {len(info['streams'])}")
|
84
|
+
|
81
85
|
# Flip video horizontally and output
|
82
86
|
f = (
|
83
87
|
ffmpeg
|
@@ -134,6 +138,21 @@ f
|
|
134
138
|
|
135
139
|
See the [Usage](https://livingbio.github.io/typed-ffmpeg/usage/typed/) section in our documentation for more examples and detailed guides.
|
136
140
|
|
141
|
+
---
|
142
|
+
|
143
|
+
## Interactive Playground
|
144
|
+
|
145
|
+
Try out `typed-ffmpeg` directly in your browser with our [Interactive Playground](https://livingbio.github.io/typed-ffmpeg-playground/)! The playground provides a live environment where you can:
|
146
|
+
|
147
|
+

|
148
|
+
|
149
|
+
- Experiment with FFmpeg filters and commands
|
150
|
+
- Visualize filter graphs in real-time
|
151
|
+
- Test different input/output configurations
|
152
|
+
- Learn through interactive examples
|
153
|
+
- Share your filter graphs with others
|
154
|
+
|
155
|
+
The playground is perfect for learning and prototyping FFmpeg filter chains without setting up a local environment.
|
137
156
|
|
138
157
|
---
|
139
158
|
|
@@ -0,0 +1,122 @@
|
|
1
|
+
[project]
|
2
|
+
name = "typed-ffmpeg-compatible"
|
3
|
+
dynamic = ["version"]
|
4
|
+
description = "Modern Python FFmpeg wrappers offer comprehensive support for complex filters, complete with detailed typing and documentation."
|
5
|
+
authors = [
|
6
|
+
{name = "lucemia", email = "lucemia@gmail.com"}
|
7
|
+
]
|
8
|
+
readme = "README.md"
|
9
|
+
requires-python = ">=3.10"
|
10
|
+
license = "MIT"
|
11
|
+
keywords = [
|
12
|
+
"ffmpeg",
|
13
|
+
"video",
|
14
|
+
"audio",
|
15
|
+
"multimedia",
|
16
|
+
"filter",
|
17
|
+
]
|
18
|
+
classifiers = [
|
19
|
+
"Intended Audience :: Developers",
|
20
|
+
"Natural Language :: English",
|
21
|
+
"Operating System :: OS Independent",
|
22
|
+
"Programming Language :: Python",
|
23
|
+
"Programming Language :: Python :: 3",
|
24
|
+
"Programming Language :: Python :: 3.10",
|
25
|
+
"Programming Language :: Python :: 3.11",
|
26
|
+
"Programming Language :: Python :: 3.12",
|
27
|
+
"Programming Language :: Python :: 3.13",
|
28
|
+
"Topic :: Multimedia :: Video",
|
29
|
+
"Topic :: Multimedia :: Sound/Audio",
|
30
|
+
"Topic :: Software Development :: Libraries :: Python Modules",
|
31
|
+
"Topic :: Software Development :: Libraries",
|
32
|
+
"Topic :: Software Development :: Libraries :: Application Frameworks",
|
33
|
+
]
|
34
|
+
|
35
|
+
[project.urls]
|
36
|
+
Homepage = "https://livingbio.github.io/typed-ffmpeg/"
|
37
|
+
Repository = "https://github.com/livingbio/typed-ffmpeg"
|
38
|
+
|
39
|
+
[project.optional-dependencies]
|
40
|
+
graph = ["graphviz"]
|
41
|
+
|
42
|
+
[build-system]
|
43
|
+
requires = ["setuptools>=61.0", "setuptools-scm>=6.2"]
|
44
|
+
build-backend = "setuptools.build_meta"
|
45
|
+
|
46
|
+
[tool.setuptools]
|
47
|
+
package-dir = {"" = "src"}
|
48
|
+
|
49
|
+
[tool.setuptools.packages.find]
|
50
|
+
where = ["src"]
|
51
|
+
include = ["typed_ffmpeg*"]
|
52
|
+
exclude = [
|
53
|
+
"**/tests/**",
|
54
|
+
"**/scripts/**",
|
55
|
+
"**/__snapshots__/**",
|
56
|
+
"**/test_*",
|
57
|
+
"**/*_test.py",
|
58
|
+
"**/*.test.py",
|
59
|
+
"**/conftest.py"
|
60
|
+
]
|
61
|
+
|
62
|
+
[tool.setuptools.package-data]
|
63
|
+
"ffmpeg" = ["py.typed"]
|
64
|
+
"ffmpeg.common" = ["*"]
|
65
|
+
"ffmpeg.common.cache" = ["*"]
|
66
|
+
"ffmpeg.common.cache.list" = ["*"]
|
67
|
+
"ffmpeg.common.cache.FFMpegFilterManuallyDefined" = ["*"]
|
68
|
+
"ffmpeg.utils" = ["*"]
|
69
|
+
"ffmpeg.utils.lazy_eval" = ["*"]
|
70
|
+
exclude = [
|
71
|
+
"**/tests/**",
|
72
|
+
"**/scripts/**",
|
73
|
+
"**/__snapshots__/**",
|
74
|
+
"**/test_*",
|
75
|
+
"**/*_test.py",
|
76
|
+
"**/*.test.py",
|
77
|
+
"**/conftest.py"
|
78
|
+
]
|
79
|
+
|
80
|
+
[tool.setuptools_scm]
|
81
|
+
version_scheme = "post-release"
|
82
|
+
local_scheme = "node-and-timestamp"
|
83
|
+
write_to = "src/typed_ffmpeg/_version.py"
|
84
|
+
|
85
|
+
[tool.mypy]
|
86
|
+
exclude = "^(migrations|commands|sandbox|samples|sdk)/"
|
87
|
+
show_error_codes = true
|
88
|
+
implicit_optional = true
|
89
|
+
follow_imports = "silent"
|
90
|
+
warn_redundant_casts = true
|
91
|
+
warn_unused_ignores = true
|
92
|
+
disallow_any_generics = true
|
93
|
+
check_untyped_defs = true
|
94
|
+
no_implicit_reexport = true
|
95
|
+
disallow_untyped_defs = true
|
96
|
+
|
97
|
+
[tool.ruff]
|
98
|
+
line-length = 88
|
99
|
+
exclude = ["**/cassettes/", "**/__snapshots__/"]
|
100
|
+
src = ["src"]
|
101
|
+
|
102
|
+
[tool.ruff.lint]
|
103
|
+
select = [
|
104
|
+
"E", # pycodestyle errors
|
105
|
+
"W", # pycodestyle warnings
|
106
|
+
"F", # pyflakes
|
107
|
+
"I", # isort
|
108
|
+
"B006", # flake8-bugbear: Do not use mutable data structures for argument defaults
|
109
|
+
"C4", # flake8-comprehensions
|
110
|
+
"UP", # pyupgrade
|
111
|
+
]
|
112
|
+
ignore = [
|
113
|
+
"E741", # Ambiguous variable name: `I`
|
114
|
+
"E501", # Line too long
|
115
|
+
"E402", # Module level import not at top of file
|
116
|
+
"E712", # not work for pandas
|
117
|
+
"F811", # FIXME: we relay on it to share fixture across app
|
118
|
+
]
|
119
|
+
|
120
|
+
[tool.ruff.format]
|
121
|
+
quote-style = "double"
|
122
|
+
docstring-code-format = true
|
{typed_ffmpeg_compatible-3.0.1 → typed_ffmpeg_compatible-3.2.1}/src/typed_ffmpeg/__init__.py
RENAMED
@@ -26,8 +26,8 @@ from . import compile, dag, filters, sources
|
|
26
26
|
from .base import afilter, filter_multi_output, input, merge_outputs, output, vfilter
|
27
27
|
from .dag import Stream
|
28
28
|
from .exceptions import FFMpegExecuteError, FFMpegTypeError, FFMpegValueError
|
29
|
+
from .ffprobe.probe import probe, probe_obj
|
29
30
|
from .info import get_codecs, get_decoders, get_encoders
|
30
|
-
from .probe import probe
|
31
31
|
from .streams import AudioStream, AVStream, VideoStream
|
32
32
|
|
33
33
|
__all__ = [
|
@@ -41,6 +41,7 @@ __all__ = [
|
|
41
41
|
"FFMpegValueError",
|
42
42
|
"Stream",
|
43
43
|
"probe",
|
44
|
+
"probe_obj",
|
44
45
|
"compile",
|
45
46
|
"AudioStream",
|
46
47
|
"VideoStream",
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# file generated by setuptools-scm
|
2
|
+
# don't change, don't track in version control
|
3
|
+
|
4
|
+
__all__ = ["__version__", "__version_tuple__", "version", "version_tuple"]
|
5
|
+
|
6
|
+
TYPE_CHECKING = False
|
7
|
+
if TYPE_CHECKING:
|
8
|
+
from typing import Tuple
|
9
|
+
from typing import Union
|
10
|
+
|
11
|
+
VERSION_TUPLE = Tuple[Union[int, str], ...]
|
12
|
+
else:
|
13
|
+
VERSION_TUPLE = object
|
14
|
+
|
15
|
+
version: str
|
16
|
+
__version__: str
|
17
|
+
__version_tuple__: VERSION_TUPLE
|
18
|
+
version_tuple: VERSION_TUPLE
|
19
|
+
|
20
|
+
__version__ = version = '3.2.1'
|
21
|
+
__version_tuple__ = version_tuple = (3, 2, 1)
|