├── .all-contributorsrc
├── .gitchangelog.rc
├── .gitchangelog.tpl
├── .github
├── ISSUE_TEMPLATE
│ ├── bug_report.md
│ ├── config.yml
│ ├── feature_request.md
│ └── question.md
└── workflows
│ └── python-package.yml
├── .gitignore
├── CHANGELOG.md
├── LICENSE
├── README.md
├── docs
├── ffmpeg_progress_yield.html
├── ffmpeg_progress_yield
│ ├── __main__.html
│ └── ffmpeg_progress_yield.html
├── index.html
└── search.js
├── ffmpeg-progress-yield.gif
├── ffmpeg_progress_yield
├── __init__.py
├── __main__.py
├── ffmpeg_progress_yield.py
└── py.typed
├── pytest.ini
├── requirements.dev.txt
├── requirements.txt
├── setup.cfg
├── setup.py
└── test
├── test.mp4
└── test.py
/.all-contributorsrc:
--------------------------------------------------------------------------------
1 | {
2 | "projectName": "ffmpeg-progress-yield",
3 | "projectOwner": "slhck",
4 | "repoType": "github",
5 | "repoHost": "https://github.com",
6 | "files": [
7 | "README.md"
8 | ],
9 | "imageSize": 100,
10 | "commit": true,
11 | "commitConvention": "angular",
12 | "contributors": [
13 | {
14 | "login": "slhck",
15 | "name": "Werner Robitza",
16 | "avatar_url": "https://avatars.githubusercontent.com/u/582444?v=4",
17 | "profile": "http://slhck.info/",
18 | "contributions": [
19 | "code"
20 | ]
21 | },
22 | {
23 | "login": "WyattBlue",
24 | "name": "WyattBlue",
25 | "avatar_url": "https://avatars.githubusercontent.com/u/57511737?v=4",
26 | "profile": "https://github.com/WyattBlue",
27 | "contributions": [
28 | "code"
29 | ]
30 | },
31 | {
32 | "login": "kskadart",
33 | "name": "Kirill Konovalov",
34 | "avatar_url": "https://avatars.githubusercontent.com/u/120260513?v=4",
35 | "profile": "https://github.com/kskadart",
36 | "contributions": [
37 | "code"
38 | ]
39 | },
40 | {
41 | "login": "ammgws",
42 | "name": "Jason Nader",
43 | "avatar_url": "https://avatars.githubusercontent.com/u/20397027?v=4",
44 | "profile": "https://github.com/ammgws",
45 | "contributions": [
46 | "bug"
47 | ]
48 | },
49 | {
50 | "login": "LaunchLee",
51 | "name": "Launch Lee",
52 | "avatar_url": "https://avatars.githubusercontent.com/u/80872691?v=4",
53 | "profile": "https://github.com/LaunchLee",
54 | "contributions": [
55 | "code"
56 | ]
57 | },
58 | {
59 | "login": "scufre",
60 | "name": "scufre",
61 | "avatar_url": "https://avatars.githubusercontent.com/u/21089866?v=4",
62 | "profile": "https://github.com/scufre",
63 | "contributions": [
64 | "code"
65 | ]
66 | }
67 | ],
68 | "contributorsPerLine": 7,
69 | "linkToUsage": true
70 | }
71 |
--------------------------------------------------------------------------------
/.gitchangelog.rc:
--------------------------------------------------------------------------------
1 | output_engine = mustache(".gitchangelog.tpl")
2 |
3 | section_regexps = [
4 | ('', None)
5 | ]
6 |
7 | subject_process = (strip | ucfirst | final_dot)
8 |
9 | tag_filter_regexp = r'^v[0-9]+\.[0-9]+(\.[0-9]+)?$'
10 |
11 | ignore_regexps = [
12 | r'^Bump version to'
13 | ]
14 |
--------------------------------------------------------------------------------
/.gitchangelog.tpl:
--------------------------------------------------------------------------------
1 | {{#general_title}}
2 | # {{{title}}}
3 |
4 | {{/general_title}}
5 |
6 | {{#versions}}
7 | ## {{{label}}}
8 |
9 | {{#sections}}
10 | {{#commits}}
11 | * {{{subject}}}
12 | {{#body}}
13 |
14 | {{{body_indented}}}
15 | {{/body}}
16 |
17 | {{/commits}}
18 | {{/sections}}
19 |
20 | {{/versions}}
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug report
3 | about: I ran across an error or bug in the program
4 |
5 | ---
6 |
7 | **:warning: Please read this carefully and edit the example responses! If you do not fill out this information, your bug report may be closed without comment.**
8 |
9 | **Checklist** (please tick all boxes)
10 | - [ ] I am using the latest version of `ffmpeg-progress-yield` (run `pip3 install --upgrade ffmpeg-progress-yield`)
11 | - [ ] I am using the latest stable version of `ffmpeg` or a recent build from Git master
12 |
13 | **Expected behavior**
14 | A clear and concise description of what you expected to happen.
15 |
16 | **Actual behavior**
17 | What happened?
18 |
19 | **Command**
20 | The exact command you were trying to run:
21 |
22 | ```
23 |
24 | ```
25 |
26 | Any output you get:
27 |
28 | ```
29 |
30 | ```
31 |
32 | **Environment (please complete the following information):**
33 | - [ ] Your operating system
34 | - [ ] Your Python version / distribution (`python3 --version` or `python --version`)
35 | - [ ] Your ffmpeg version (`ffmpeg -version`)
36 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/config.yml:
--------------------------------------------------------------------------------
1 | blank_issues_enabled: false
2 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature_request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Feature request
3 | about: I want to suggest an idea for this project
4 |
5 | ---
6 |
7 | **:warning: Please read this carefully and edit the example responses! If you do not fill out this information, your feature request may be closed without comment.**
8 |
9 | **Is your feature request related to a problem? Please describe.**
10 | A clear and concise description of what the problem is. E.g. “I'm always frustrated when [...]”
11 |
12 | **Describe the solution you'd like**
13 | A clear and concise description of what you want to happen.
14 |
15 | **Describe alternatives you've considered**
16 | A clear and concise description of any alternative solutions or features you've considered.
17 |
18 | **Additional context**
19 | Add any other context or screenshots about the feature request here.
20 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/question.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Question/Support
3 | about: I am stuck with something and need help (not a bug or error)
4 |
5 | ---
6 |
--------------------------------------------------------------------------------
/.github/workflows/python-package.yml:
--------------------------------------------------------------------------------
1 | name: Test Package
2 |
3 | on:
4 | push:
5 | branches: [ master ]
6 | pull_request:
7 | branches: [ master ]
8 |
9 | jobs:
10 | build:
11 | runs-on: ubuntu-latest
12 | strategy:
13 | matrix:
14 | python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
15 |
16 | steps:
17 | - uses: actions/checkout@v3
18 | - name: Set up Python ${{ matrix.python-version }}
19 | uses: actions/setup-python@v4
20 | with:
21 | python-version: ${{ matrix.python-version }}
22 | - name: Install ffmpeg
23 | run: |
24 | sudo apt update
25 | sudo apt install ffmpeg
26 | - name: Install dependencies
27 | run: |
28 | python -m pip install --upgrade pip
29 | pip install flake8 mypy types-tqdm
30 | pip install -r requirements.txt
31 | pip install -r requirements.dev.txt
32 | - name: Lint with flake8
33 | run: |
34 | # stop the build if there are Python syntax errors or undefined names
35 | flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
36 | # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
37 | flake8 . --count --exit-zero --max-line-length=127 --ignore=W503,W504,C901
38 | - name: Type check with mypy
39 | run: |
40 | mypy ffmpeg_progress_yield
41 | - name: Test with pytest
42 | run: |
43 | pytest test/test.py
44 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.py[cod]
2 |
3 | # C extensions
4 | *.so
5 |
6 | # Backup files
7 | *~
8 |
9 | # Packages
10 | *.egg
11 | *.egg-info
12 | dist
13 | build
14 | eggs
15 | parts
16 | bin
17 | var
18 | sdist
19 | develop-eggs
20 | .installed.cfg
21 | lib
22 | lib64
23 |
24 | # Installer logs
25 | pip-log.txt
26 |
27 | # Unit test / coverage reports
28 | .coverage
29 | .tox
30 | nosetests.xml
31 | htmlcov
32 |
33 | # Translations
34 | *.mo
35 |
36 | # Mr Developer
37 | .mr.developer.cfg
38 | .project
39 | .pydevproject
40 |
41 | # IntelliJ
42 | *.iml
43 | .idea
44 |
45 | # Complexity
46 | output/*.html
47 | output/*/index.html
48 |
49 | # Sphinx
50 | docs/_build
51 |
52 | .vscode
53 | .python-version
54 |
55 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Changelog
2 |
3 |
4 | ## v0.12.0 (2025-03-28)
5 |
6 | * Docs: add @scufre as a contributor.
7 |
8 | * Update readme.
9 |
10 | * Add support to send ffmpeg log (not progress) to a different file.
11 |
12 | * Disallow blank issues.
13 |
14 |
15 | ## v0.11.3 (2024-12-11)
16 |
17 | * Fix: Clear and print progress when tqdm is not available.
18 |
19 | This relates two printing sequence:
20 |
21 | (1) Print one decimal place after printing two decimal places
22 |
23 | 0.74/100 -> 0.8/100 (1 less character)
24 |
25 | (2) Print 100/100 after printing decimal progress
26 |
27 | 99.74/100 -> 100/100 (2 less characters)
28 |
29 | 99.8/100 -> 100/100 (1 less character)
30 |
31 | So clear the line first, and print progress, showing for a moment, and then repeat, finally a newline. :)
32 |
33 |
34 | ## v0.11.2 (2024-12-10)
35 |
36 | * Chore: One-liner progress when tqdm is not available.
37 |
38 |
39 | ## v0.11.1 (2024-11-22)
40 |
41 | * Make setup name PEP 625 compliant.
42 |
43 |
44 | ## v0.11.0 (2024-11-22)
45 |
46 | * Remove python 3.8, add 3.12, 3.13.
47 |
48 |
49 | ## v0.10.0 (2024-11-18)
50 |
51 | * Fix: ensure percentage is always in float.
52 |
53 |
54 | ## v0.9.1 (2024-09-16)
55 |
56 | * Fix: the logic of the option --progress-only.
57 |
58 |
59 | ## v0.9.0 (2024-09-16)
60 |
61 | * Docs: add @LaunchLee as a contributor.
62 |
63 | * Chore: Add an option to print progress only in cli usage.
64 |
65 | This option makes the output cleaner when doing batch conversions.
66 |
67 | * Code cleanup, refactoring.
68 |
69 | To avoid having to juggle around variables
70 |
71 |
72 | ## v0.8.1 (2024-09-09)
73 |
74 | * Fix type-checks.
75 |
76 |
77 | ## v0.8.0 (2024-09-09)
78 |
79 | * Add async support.
80 |
81 |
82 | ## v0.7.9 (2024-08-14)
83 |
84 | * Docs: add @ammgws as a contributor.
85 |
86 | * Fix typing error.
87 |
88 | * Chore: remove unused dependency.
89 |
90 | * Fix badge link.
91 |
92 |
93 | ## v0.7.8 (2023-06-01)
94 |
95 | * Image handling.
96 |
97 | Check if image2 inputs use looping or not, and set duration to infinity if needed
98 |
99 |
100 | ## v0.7.6 (2023-05-30)
101 |
102 | * Always use duration_override if present.
103 |
104 |
105 | ## v0.7.5 (2023-05-30)
106 |
107 | * Fix duration for multiple inputs, fixes #13.
108 |
109 | * Fix 'Test' string in tqdm.
110 |
111 |
112 | ## v0.7.4 (2023-05-06)
113 |
114 | * Fix: round percentage numbers.
115 |
116 |
117 | ## v0.7.3 (2023-05-05)
118 |
119 | * Update readme.
120 |
121 | * Add progress as percent, fixes #12.
122 |
123 |
124 | ## v0.7.2 (2023-03-04)
125 |
126 | * Do not print input information when probing, addresses #10.
127 |
128 |
129 | ## v0.7.1 (2023-02-24)
130 |
131 | * Fix types in CI.
132 |
133 | * Remove unneeded import.
134 |
135 | * Typo.
136 |
137 | * Docs: add @kskadart as a contributor.
138 |
139 | * Fix formatting.
140 |
141 | * Fix types.
142 |
143 | * Feat(ffprobe): FEAT-0001 try to get duration by ffprobe in case if loglevel=error.
144 |
145 | * Fix CI file.
146 |
147 |
148 | ## v0.7.0 (2023-01-24)
149 |
150 | * Add duration override to API.
151 |
152 | * Remove manifest.in.
153 |
154 | * Add mypy settings.
155 |
156 |
157 | ## v0.6.1 (2022-12-18)
158 |
159 | * Add py.typed.
160 |
161 | * Move API docs to existing section.
162 |
163 |
164 | ## v0.6.0 (2022-12-17)
165 |
166 | * Link to API docs.
167 |
168 | * Add API docs.
169 |
170 | * Add export.
171 |
172 | * Bump requirements to python 3.8 or higher.
173 |
174 | * Document methods.
175 |
176 | * Remove unused import.
177 |
178 | * Docs: add @WyattBlue as a contributor.
179 |
180 | * Docs: add @slhck as a contributor.
181 |
182 | * Unhide to_ms.
183 |
184 | * Add type hints + simplify.
185 |
186 | * Add python CI badge.
187 |
188 | * Fix quit tests.
189 |
190 | * Add all-contributors.
191 |
192 | * Add pytest to dev requirements.
193 |
194 | * Add github workflows.
195 |
196 | * Formatting.
197 |
198 | * Fix a few type and formatting errors.
199 |
200 |
201 | ## v0.5.0 (2022-12-12)
202 |
203 | * Add stderr callback method.
204 |
205 | * Update README.
206 |
207 | * Add graceful quit method.
208 |
209 | * Add a GIF in the readme.
210 |
211 |
212 | ## v0.4.0 (2022-12-11)
213 |
214 | * Add a quit method, fixes #4.
215 |
216 |
217 | ## v0.3.0 (2022-08-02)
218 |
219 | * Update python requirements.
220 |
221 |
222 | ## v0.2.0 (2021-11-21)
223 |
224 | * Add a usage option.
225 |
226 |
227 | ## v0.1.2 (2021-08-14)
228 |
229 | * Remove universal_newlines for Windows compat.
230 |
231 |
232 | ## v0.1.1 (2021-07-01)
233 |
234 | * Remove stats_period option for backwards compatibility, fixes #2.
235 |
236 |
237 | ## v0.1.0 (2021-06-30)
238 |
239 | * Format code with black.
240 |
241 | * Yield 0 in progress and improve logic.
242 |
243 | * Set universal_newlines to true and add kwargs support.
244 |
245 | * Increase stats period.
246 |
247 | * Document method.
248 |
249 | * Add typing.
250 |
251 | * Also check for 0 in output.
252 |
253 | * Update gitignore.
254 |
255 | * Drop python 3.5 support.
256 |
257 | * Update badge link.
258 |
259 |
260 | ## v0.0.4 (2021-03-10)
261 |
262 | * Add python_requires to setup.py.
263 |
264 |
265 | ## v0.0.3 (2021-03-06)
266 |
267 | * Remove release script.
268 |
269 |
270 | ## v0.0.2 (2021-03-06)
271 |
272 | * Fix release script.
273 |
274 | * Remove support for older versions.
275 |
276 | * Format setup.py.
277 |
278 | * Remove requirement for command to start with ffmpeg.
279 |
280 | * Add link to similar project.
281 |
282 | * Add changelog.
283 |
284 | * Rename project.
285 |
286 | * Initial commit.
287 |
288 |
289 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2021-2023 Werner Robitza
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # ffmpeg-progress-yield
2 |
3 | [](#contributors-)
4 |
5 |
6 | [](https://pypi.org/project/ffmpeg-progress-yield) [](https://github.com/slhck/ffmpeg-progress-yield/actions/workflows/python-package.yml)
7 |
8 | Run an ffmpeg command with its progress yielded.
9 |
10 | 
11 |
12 | Contents:
13 |
14 | - [Requirements](#requirements)
15 | - [Installation](#installation)
16 | - [Usage](#usage)
17 | - [As a library](#as-a-library)
18 | - [On the command line](#on-the-command-line)
19 | - [Caveats](#caveats)
20 | - [Contributors](#contributors)
21 | - [License](#license)
22 |
23 | -------------
24 |
25 | ## Requirements
26 |
27 | - Python 3.9 or higher
28 | - ffmpeg v3.1 or above from installed in your \$PATH
29 |
30 | ## Installation
31 |
32 | pip3 install ffmpeg-progress-yield
33 |
34 | Or download this repository, then run `pip install .`.
35 |
36 | ## Usage
37 |
38 | ### As a library
39 |
40 | In your Python project, import the helper class and run `run_command_with_progress`.
41 |
42 | For more information see the [API documentation](https://htmlpreview.github.io/?https://github.com/slhck/ffmpeg-progress-yield/blob/master/docs/ffmpeg_progress_yield.html).
43 |
44 | Example:
45 |
46 | ```python
47 | from ffmpeg_progress_yield import FfmpegProgress
48 |
49 | cmd = [
50 | "ffmpeg", "-i", "test/test.mp4", "-c:v", "libx264", "-vf", "scale=1920x1080", "-preset", "fast", "-f", "null", "/dev/null",
51 | ]
52 |
53 | ff = FfmpegProgress(cmd)
54 | for progress in ff.run_command_with_progress():
55 | print(f"{progress}/100")
56 | ```
57 |
58 | The command will yield the current progress in percent as a float number.
59 |
60 | `run_command_with_progress` takes a `duration_override` argument where you can manually override the duration of the command in seconds. This is useful if your input doesn't have an implicit duration (e.g. if you use `testsrc`).
61 |
62 | If you have `tqdm` installed, you can create a fancy progress bar:
63 |
64 | ```python
65 | from tqdm import tqdm
66 | from ffmpeg_progress_yield import FfmpegProgress
67 |
68 | cmd = [
69 | "ffmpeg", "-i", "test/test.mp4", "-c:v", "libx264", "-vf", "scale=1920x1080", "-preset", "fast", "-f", "null", "/dev/null",
70 | ]
71 |
72 | ff = FfmpegProgress(cmd)
73 | with tqdm(total=100, position=1, desc="Test") as pbar:
74 | for progress in ff.run_command_with_progress():
75 | pbar.update(progress - pbar.n)
76 |
77 | # get the output
78 | print(ff.stderr)
79 | ```
80 |
81 | You can also quit the command by calling `.quit()`:
82 |
83 | ```python
84 | ff = FfmpegProgress(cmd)
85 | for progress in ff.run_command_with_progress():
86 | if progress > 50:
87 | ff.quit()
88 | break
89 | ```
90 |
91 | This will send a hard quit to the ffmpeg process, and may not wait for it to finish. To quit gracefully, use `.quit_gracefully()` instead, which sends 'q' to the ffmpeg process, and waits for it to finish.
92 |
93 | This is probably most useful in asynchronous environments, where you can run the command in a separate thread, and quit it from the main thread (e.g. using a [Condition Variable](https://docs.python.org/3/library/threading.html#threading.Condition)).
94 |
95 | ### On the command line
96 |
97 | Simply prefix your ffmpeg command with `ffmpeg-progress-yield`:
98 |
99 | ```bash
100 | ffmpeg-progress-yield ffmpeg -i input.mp4 output.mp4
101 | ```
102 |
103 | It will show a progress bar, and once the command is done, show the ffmpeg stderr output.
104 |
105 | If you want to manually override the duration to, say, 12.5 seconds (e.g. because your input doesn't have an implicit one):
106 |
107 | ```bash
108 | ffmpeg-progress-yield --duration 12.5 ffmpeg -f lavfi -i testsrc -t 12.5 output.mp4
109 | ```
110 |
111 | You can also redirect the output to a log file:
112 |
113 | ```bash
114 | ffmpeg-progress-yield --exclude-progress --log-file log.txt ffmpeg -i input.mp4 output.mp4
115 | ```
116 |
117 | This will exclude the progress bar from the output, and redirect it to a log file.
118 |
119 | ## Caveats
120 |
121 | Currently, we do not differentiate between `stderr` and `stdout`. This means progress will be mixed with the ffmpeg log, unless you use `--exclude-progress` (or `exclude_progress` in the Python API).
122 |
123 | You can also check out [`ffmpeg-progress`](https://github.com/Tatsh/ffmpeg-progress) for a similar project with a different feature set.
124 |
125 | ## Contributors
126 |
127 |
128 |
129 |
130 |
151 |
152 |
153 |
154 |
155 |
156 |
157 | ## License
158 |
159 | The MIT License (MIT)
160 |
161 | Copyright (c) 2021-2023 Werner Robitza
162 |
163 | Permission is hereby granted, free of charge, to any person obtaining a copy
164 | of this software and associated documentation files (the "Software"), to deal
165 | in the Software without restriction, including without limitation the rights
166 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
167 | copies of the Software, and to permit persons to whom the Software is
168 | furnished to do so, subject to the following conditions:
169 |
170 | The above copyright notice and this permission notice shall be included in all
171 | copies or substantial portions of the Software.
172 |
173 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
174 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
175 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
176 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
177 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
178 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
179 | SOFTWARE.
180 |
--------------------------------------------------------------------------------
/docs/ffmpeg_progress_yield/__main__.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | ffmpeg_progress_yield.__main__ API documentation
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
46 |
47 |
48 |
95 |
136 |
137 |
315 |
--------------------------------------------------------------------------------
/docs/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/docs/search.js:
--------------------------------------------------------------------------------
1 | window.pdocSearch = (function(){
2 | /** elasticlunr - http://weixsong.github.io * Copyright (C) 2017 Oliver Nightingale * Copyright (C) 2017 Wei Song * MIT Licensed */!function(){function e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),t.utils.toString=function(e){return void 0===e||null===e?"":e.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop(),n=e;if("function"!=typeof t)throw new TypeError("last argument must be a function");n.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},t.EventEmitter.prototype.removeListener=function(e,t){if(this.hasHandler(e)){var n=this.events[e].indexOf(t);-1!==n&&(this.events[e].splice(n,1),0==this.events[e].length&&delete this.events[e])}},t.EventEmitter.prototype.emit=function(e){if(this.hasHandler(e)){var t=Array.prototype.slice.call(arguments,1);this.events[e].forEach(function(e){e.apply(void 0,t)},this)}},t.EventEmitter.prototype.hasHandler=function(e){return e in this.events},t.tokenizer=function(e){if(!arguments.length||null===e||void 0===e)return[];if(Array.isArray(e)){var n=e.filter(function(e){return null===e||void 0===e?!1:!0});n=n.map(function(e){return t.utils.toString(e).toLowerCase()});var i=[];return n.forEach(function(e){var n=e.split(t.tokenizer.seperator);i=i.concat(n)},this),i}return e.toString().trim().toLowerCase().split(t.tokenizer.seperator)},t.tokenizer.defaultSeperator=/[\s\-]+/,t.tokenizer.seperator=t.tokenizer.defaultSeperator,t.tokenizer.setSeperator=function(e){null!==e&&void 0!==e&&"object"==typeof e&&(t.tokenizer.seperator=e)},t.tokenizer.resetSeperator=function(){t.tokenizer.seperator=t.tokenizer.defaultSeperator},t.tokenizer.getSeperator=function(){return t.tokenizer.seperator},t.Pipeline=function(){this._queue=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in t.Pipeline.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[n]=e},t.Pipeline.getRegisteredFunction=function(e){return e in t.Pipeline.registeredFunctions!=!0?null:t.Pipeline.registeredFunctions[e]},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.getRegisteredFunction(e);if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i+1,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i,0,n)},t.Pipeline.prototype.remove=function(e){var t=this._queue.indexOf(e);-1!==t&&this._queue.splice(t,1)},t.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,i=this._queue.length,o=0;n>o;o++){for(var r=e[o],s=0;i>s&&(r=this._queue[s](r,o,e),void 0!==r&&null!==r);s++);void 0!==r&&null!==r&&t.push(r)}return t},t.Pipeline.prototype.reset=function(){this._queue=[]},t.Pipeline.prototype.get=function(){return this._queue},t.Pipeline.prototype.toJSON=function(){return this._queue.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.DocumentStore,this.index={},this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var e=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,e)},t.Index.prototype.off=function(e,t){return this.eventEmitter.removeListener(e,t)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;n._fields=e.fields,n._ref=e.ref,n.documentStore=t.DocumentStore.load(e.documentStore),n.pipeline=t.Pipeline.load(e.pipeline),n.index={};for(var i in e.index)n.index[i]=t.InvertedIndex.load(e.index[i]);return n},t.Index.prototype.addField=function(e){return this._fields.push(e),this.index[e]=new t.InvertedIndex,this},t.Index.prototype.setRef=function(e){return this._ref=e,this},t.Index.prototype.saveDocument=function(e){return this.documentStore=new t.DocumentStore(e),this},t.Index.prototype.addDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.addDoc(i,e),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));this.documentStore.addFieldLength(i,n,o.length);var r={};o.forEach(function(e){e in r?r[e]+=1:r[e]=1},this);for(var s in r){var u=r[s];u=Math.sqrt(u),this.index[n].addToken(s,{ref:i,tf:u})}},this),n&&this.eventEmitter.emit("add",e,this)}},t.Index.prototype.removeDocByRef=function(e){if(e&&this.documentStore.isDocStored()!==!1&&this.documentStore.hasDoc(e)){var t=this.documentStore.getDoc(e);this.removeDoc(t,!1)}},t.Index.prototype.removeDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.hasDoc(i)&&(this.documentStore.removeDoc(i),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));o.forEach(function(e){this.index[n].removeToken(e,i)},this)},this),n&&this.eventEmitter.emit("remove",e,this))}},t.Index.prototype.updateDoc=function(e,t){var t=void 0===t?!0:t;this.removeDocByRef(e[this._ref],!1),this.addDoc(e,!1),t&&this.eventEmitter.emit("update",e,this)},t.Index.prototype.idf=function(e,t){var n="@"+t+"/"+e;if(Object.prototype.hasOwnProperty.call(this._idfCache,n))return this._idfCache[n];var i=this.index[t].getDocFreq(e),o=1+Math.log(this.documentStore.length/(i+1));return this._idfCache[n]=o,o},t.Index.prototype.getFields=function(){return this._fields.slice()},t.Index.prototype.search=function(e,n){if(!e)return[];e="string"==typeof e?{any:e}:JSON.parse(JSON.stringify(e));var i=null;null!=n&&(i=JSON.stringify(n));for(var o=new t.Configuration(i,this.getFields()).get(),r={},s=Object.keys(e),u=0;u0&&t.push(e);for(var i in n)"docs"!==i&&"df"!==i&&this.expandToken(e+i,t,n[i]);return t},t.InvertedIndex.prototype.toJSON=function(){return{root:this.root}},t.Configuration=function(e,n){var e=e||"";if(void 0==n||null==n)throw new Error("fields should not be null");this.config={};var i;try{i=JSON.parse(e),this.buildUserConfig(i,n)}catch(o){t.utils.warn("user configuration parse failed, will use default configuration"),this.buildDefaultConfig(n)}},t.Configuration.prototype.buildDefaultConfig=function(e){this.reset(),e.forEach(function(e){this.config[e]={boost:1,bool:"OR",expand:!1}},this)},t.Configuration.prototype.buildUserConfig=function(e,n){var i="OR",o=!1;if(this.reset(),"bool"in e&&(i=e.bool||i),"expand"in e&&(o=e.expand||o),"fields"in e)for(var r in e.fields)if(n.indexOf(r)>-1){var s=e.fields[r],u=o;void 0!=s.expand&&(u=s.expand),this.config[r]={boost:s.boost||0===s.boost?s.boost:1,bool:s.bool||i,expand:u}}else t.utils.warn("field name in user configuration not found in index instance fields");else this.addAllFields2UserConfig(i,o,n)},t.Configuration.prototype.addAllFields2UserConfig=function(e,t,n){n.forEach(function(n){this.config[n]={boost:1,bool:e,expand:t}},this)},t.Configuration.prototype.get=function(){return this.config},t.Configuration.prototype.reset=function(){this.config={}},lunr.SortedSet=function(){this.length=0,this.elements=[]},lunr.SortedSet.load=function(e){var t=new this;return t.elements=e,t.length=e.length,t},lunr.SortedSet.prototype.add=function(){var e,t;for(e=0;e1;){if(r===e)return o;e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o]}return r===e?o:-1},lunr.SortedSet.prototype.locationFor=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;)e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o];return r>e?o:e>r?o+1:void 0},lunr.SortedSet.prototype.intersect=function(e){for(var t=new lunr.SortedSet,n=0,i=0,o=this.length,r=e.length,s=this.elements,u=e.elements;;){if(n>o-1||i>r-1)break;s[n]!==u[i]?s[n]u[i]&&i++:(t.add(s[n]),n++,i++)}return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){var t,n,i;this.length>=e.length?(t=this,n=e):(t=e,n=this),i=t.clone();for(var o=0,r=n.toArray();o
\n"}, "ffmpeg_progress_yield.FfmpegProgress": {"fullname": "ffmpeg_progress_yield.FfmpegProgress", "modulename": "ffmpeg_progress_yield", "qualname": "FfmpegProgress", "kind": "class", "doc": "
\n"}, "ffmpeg_progress_yield.FfmpegProgress.__init__": {"fullname": "ffmpeg_progress_yield.FfmpegProgress.__init__", "modulename": "ffmpeg_progress_yield", "qualname": "FfmpegProgress.__init__", "kind": "function", "doc": "Initialize the FfmpegProgress class.
\n\nArguments: \n\n\ncmd (List[str]): A list of command line elements, e.g. [\"ffmpeg\", \"-i\", ...] \ndry_run (bool, optional): Only show what would be done. Defaults to False. \n \n", "signature": "(\tcmd : List [ str ] , \tdry_run : bool = False , \texclude_progress : bool = False ) "}, "ffmpeg_progress_yield.FfmpegProgress.DUR_REGEX": {"fullname": "ffmpeg_progress_yield.FfmpegProgress.DUR_REGEX", "modulename": "ffmpeg_progress_yield", "qualname": "FfmpegProgress.DUR_REGEX", "kind": "variable", "doc": "
\n", "default_value": "re.compile('Duration: (?P<hour>\\\\d{2}):(?P<min>\\\\d{2}):(?P<sec>\\\\d{2})\\\\.(?P<ms>\\\\d{2})')"}, "ffmpeg_progress_yield.FfmpegProgress.TIME_REGEX": {"fullname": "ffmpeg_progress_yield.FfmpegProgress.TIME_REGEX", "modulename": "ffmpeg_progress_yield", "qualname": "FfmpegProgress.TIME_REGEX", "kind": "variable", "doc": "
\n", "default_value": "re.compile('out_time=(?P<hour>\\\\d{2}):(?P<min>\\\\d{2}):(?P<sec>\\\\d{2})\\\\.(?P<ms>\\\\d{2})')"}, "ffmpeg_progress_yield.FfmpegProgress.PROGRESS_REGEX": {"fullname": "ffmpeg_progress_yield.FfmpegProgress.PROGRESS_REGEX", "modulename": "ffmpeg_progress_yield", "qualname": "FfmpegProgress.PROGRESS_REGEX", "kind": "variable", "doc": "
\n", "default_value": "re.compile('[a-z0-9_]+=.+')"}, "ffmpeg_progress_yield.FfmpegProgress.cmd": {"fullname": "ffmpeg_progress_yield.FfmpegProgress.cmd", "modulename": "ffmpeg_progress_yield", "qualname": "FfmpegProgress.cmd", "kind": "variable", "doc": "
\n"}, "ffmpeg_progress_yield.FfmpegProgress.stderr": {"fullname": "ffmpeg_progress_yield.FfmpegProgress.stderr", "modulename": "ffmpeg_progress_yield", "qualname": "FfmpegProgress.stderr", "kind": "variable", "doc": "
\n", "annotation": ": Optional[str]"}, "ffmpeg_progress_yield.FfmpegProgress.dry_run": {"fullname": "ffmpeg_progress_yield.FfmpegProgress.dry_run", "modulename": "ffmpeg_progress_yield", "qualname": "FfmpegProgress.dry_run", "kind": "variable", "doc": "
\n"}, "ffmpeg_progress_yield.FfmpegProgress.exclude_progress": {"fullname": "ffmpeg_progress_yield.FfmpegProgress.exclude_progress", "modulename": "ffmpeg_progress_yield", "qualname": "FfmpegProgress.exclude_progress", "kind": "variable", "doc": "
\n"}, "ffmpeg_progress_yield.FfmpegProgress.process": {"fullname": "ffmpeg_progress_yield.FfmpegProgress.process", "modulename": "ffmpeg_progress_yield", "qualname": "FfmpegProgress.process", "kind": "variable", "doc": "
\n", "annotation": ": Any"}, "ffmpeg_progress_yield.FfmpegProgress.stderr_callback": {"fullname": "ffmpeg_progress_yield.FfmpegProgress.stderr_callback", "modulename": "ffmpeg_progress_yield", "qualname": "FfmpegProgress.stderr_callback", "kind": "variable", "doc": "
\n", "annotation": ": Optional[Callable[[str], NoneType]]"}, "ffmpeg_progress_yield.FfmpegProgress.base_popen_kwargs": {"fullname": "ffmpeg_progress_yield.FfmpegProgress.base_popen_kwargs", "modulename": "ffmpeg_progress_yield", "qualname": "FfmpegProgress.base_popen_kwargs", "kind": "variable", "doc": "
\n"}, "ffmpeg_progress_yield.FfmpegProgress.cmd_with_progress": {"fullname": "ffmpeg_progress_yield.FfmpegProgress.cmd_with_progress", "modulename": "ffmpeg_progress_yield", "qualname": "FfmpegProgress.cmd_with_progress", "kind": "variable", "doc": "
\n"}, "ffmpeg_progress_yield.FfmpegProgress.inputs_with_options": {"fullname": "ffmpeg_progress_yield.FfmpegProgress.inputs_with_options", "modulename": "ffmpeg_progress_yield", "qualname": "FfmpegProgress.inputs_with_options", "kind": "variable", "doc": "
\n"}, "ffmpeg_progress_yield.FfmpegProgress.current_input_idx": {"fullname": "ffmpeg_progress_yield.FfmpegProgress.current_input_idx", "modulename": "ffmpeg_progress_yield", "qualname": "FfmpegProgress.current_input_idx", "kind": "variable", "doc": "
\n", "annotation": ": int"}, "ffmpeg_progress_yield.FfmpegProgress.total_dur": {"fullname": "ffmpeg_progress_yield.FfmpegProgress.total_dur", "modulename": "ffmpeg_progress_yield", "qualname": "FfmpegProgress.total_dur", "kind": "variable", "doc": "
\n", "annotation": ": Optional[int]"}, "ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"fullname": "ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress", "modulename": "ffmpeg_progress_yield", "qualname": "FfmpegProgress.run_command_with_progress", "kind": "function", "doc": "Run an ffmpeg command, trying to capture the process output and calculate\nthe duration / progress.\nYields the progress in percent.
\n\nArguments: \n\n\npopen_kwargs (dict, optional): A dict to specify extra arguments to the popen call, e.g. { creationflags: CREATE_NO_WINDOW } \nduration_override (float, optional): The duration in seconds. If not specified, it will be calculated from the ffmpeg output. \n \n\nRaises: \n\n\nRuntimeError: If the command fails, an exception is raised. \n \n\nYields: \n\n\n Iterator[float]: A generator that yields the progress in percent.
\n \n", "signature": "(\tself , \tpopen_kwargs = None , \tduration_override : Optional [ float ] = None ) -> Iterator [ float ] : ", "funcdef": "def"}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"fullname": "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress", "modulename": "ffmpeg_progress_yield", "qualname": "FfmpegProgress.async_run_command_with_progress", "kind": "function", "doc": "Asynchronously run an ffmpeg command, trying to capture the process output and calculate\nthe duration / progress.\nYields the progress in percent.
\n\nArguments: \n\n\npopen_kwargs (dict, optional): A dict to specify extra arguments to the popen call, e.g. { creationflags: CREATE_NO_WINDOW } \nduration_override (float, optional): The duration in seconds. If not specified, it will be calculated from the ffmpeg output. \n \n\nRaises: \n\n\nRuntimeError: If the command fails, an exception is raised. \n \n", "signature": "(\tself , \tpopen_kwargs = None , \tduration_override : Optional [ float ] = None ) -> AsyncIterator [ float ] : ", "funcdef": "async def"}, "ffmpeg_progress_yield.FfmpegProgress.quit_gracefully": {"fullname": "ffmpeg_progress_yield.FfmpegProgress.quit_gracefully", "modulename": "ffmpeg_progress_yield", "qualname": "FfmpegProgress.quit_gracefully", "kind": "function", "doc": "Quit the ffmpeg process by sending 'q'
\n\nRaises: \n\n\nRuntimeError: If no process is found. \n \n", "signature": "(self ) -> None : ", "funcdef": "def"}, "ffmpeg_progress_yield.FfmpegProgress.quit": {"fullname": "ffmpeg_progress_yield.FfmpegProgress.quit", "modulename": "ffmpeg_progress_yield", "qualname": "FfmpegProgress.quit", "kind": "function", "doc": "Quit the ffmpeg process by sending SIGKILL.
\n\nRaises: \n\n\nRuntimeError: If no process is found. \n \n", "signature": "(self ) -> None : ", "funcdef": "def"}, "ffmpeg_progress_yield.FfmpegProgress.async_quit_gracefully": {"fullname": "ffmpeg_progress_yield.FfmpegProgress.async_quit_gracefully", "modulename": "ffmpeg_progress_yield", "qualname": "FfmpegProgress.async_quit_gracefully", "kind": "function", "doc": "Quit the ffmpeg process by sending 'q' asynchronously
\n\nRaises: \n\n\nRuntimeError: If no process is found. \n \n", "signature": "(self ) -> None : ", "funcdef": "async def"}, "ffmpeg_progress_yield.FfmpegProgress.async_quit": {"fullname": "ffmpeg_progress_yield.FfmpegProgress.async_quit", "modulename": "ffmpeg_progress_yield", "qualname": "FfmpegProgress.async_quit", "kind": "function", "doc": "Quit the ffmpeg process by sending SIGKILL asynchronously.
\n\nRaises: \n\n\nRuntimeError: If no process is found. \n \n", "signature": "(self ) -> None : ", "funcdef": "async def"}, "ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"fullname": "ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback", "modulename": "ffmpeg_progress_yield", "qualname": "FfmpegProgress.set_stderr_callback", "kind": "function", "doc": "Set a callback function to be called on stderr output.\nThe callback function must accept a single string argument.\nNote that this is called on every line of stderr output, so it can be called a lot.\nAlso note that stdout/stderr are joined into one stream, so you might get stdout output in the callback.
\n\nArguments: \n\n\ncallback (Callable[[str], None]): A callback function that accepts a single string argument. \n \n", "signature": "(self , callback : Callable [[ str ], NoneType ] ) -> None : ", "funcdef": "def"}}, "docInfo": {"ffmpeg_progress_yield": {"qualname": 0, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_progress_yield.FfmpegProgress": {"qualname": 1, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_progress_yield.FfmpegProgress.__init__": {"qualname": 3, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 59, "bases": 0, "doc": 52}, "ffmpeg_progress_yield.FfmpegProgress.DUR_REGEX": {"qualname": 3, "fullname": 6, "annotation": 0, "default_value": 29, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_progress_yield.FfmpegProgress.TIME_REGEX": {"qualname": 3, "fullname": 6, "annotation": 0, "default_value": 30, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_progress_yield.FfmpegProgress.PROGRESS_REGEX": {"qualname": 3, "fullname": 6, "annotation": 0, "default_value": 10, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_progress_yield.FfmpegProgress.cmd": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_progress_yield.FfmpegProgress.stderr": {"qualname": 2, "fullname": 5, "annotation": 2, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_progress_yield.FfmpegProgress.dry_run": {"qualname": 3, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_progress_yield.FfmpegProgress.exclude_progress": {"qualname": 3, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_progress_yield.FfmpegProgress.process": {"qualname": 2, "fullname": 5, "annotation": 2, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_progress_yield.FfmpegProgress.stderr_callback": {"qualname": 3, "fullname": 6, "annotation": 3, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_progress_yield.FfmpegProgress.base_popen_kwargs": {"qualname": 4, "fullname": 7, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_progress_yield.FfmpegProgress.cmd_with_progress": {"qualname": 4, "fullname": 7, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_progress_yield.FfmpegProgress.inputs_with_options": {"qualname": 4, "fullname": 7, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_progress_yield.FfmpegProgress.current_input_idx": {"qualname": 4, "fullname": 7, "annotation": 2, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_progress_yield.FfmpegProgress.total_dur": {"qualname": 3, "fullname": 6, "annotation": 2, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"qualname": 5, "fullname": 8, "annotation": 0, "default_value": 0, "signature": 58, "bases": 0, "doc": 123}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"qualname": 6, "fullname": 9, "annotation": 0, "default_value": 0, "signature": 58, "bases": 0, "doc": 105}, "ffmpeg_progress_yield.FfmpegProgress.quit_gracefully": {"qualname": 3, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 14, "bases": 0, "doc": 28}, "ffmpeg_progress_yield.FfmpegProgress.quit": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 14, "bases": 0, "doc": 28}, "ffmpeg_progress_yield.FfmpegProgress.async_quit_gracefully": {"qualname": 4, "fullname": 7, "annotation": 0, "default_value": 0, "signature": 14, "bases": 0, "doc": 28}, "ffmpeg_progress_yield.FfmpegProgress.async_quit": {"qualname": 3, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 14, "bases": 0, "doc": 29}, "ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"qualname": 4, "fullname": 7, "annotation": 0, "default_value": 0, "signature": 36, "bases": 0, "doc": 83}}, "length": 24, "save": true}, "index": {"qualname": {"root": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}}, "df": 1, "f": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_progress_yield.FfmpegProgress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.DUR_REGEX": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.TIME_REGEX": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.PROGRESS_REGEX": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.cmd": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.stderr": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.dry_run": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.exclude_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.process": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.stderr_callback": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.base_popen_kwargs": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.cmd_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.inputs_with_options": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.current_input_idx": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.total_dur": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.quit": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 23}}}}}}}}}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}}, "df": 1}}, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.current_input_idx": {"tf": 1}}, "df": 1, "s": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.inputs_with_options": {"tf": 1}}, "df": 1}}}}}, "d": {"docs": {}, "df": 0, "x": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.current_input_idx": {"tf": 1}}, "df": 1}}}, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.DUR_REGEX": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.total_dur": {"tf": 1}}, "df": 2}}, "r": {"docs": {}, "df": 0, "y": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.dry_run": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "x": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.DUR_REGEX": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.TIME_REGEX": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.PROGRESS_REGEX": {"tf": 1}}, "df": 3}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.dry_run": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 3}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.TIME_REGEX": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.total_dur": {"tf": 1}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.PROGRESS_REGEX": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.exclude_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.cmd_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 5}}}}}, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.process": {"tf": 1}}, "df": 1}}}}}}, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.base_popen_kwargs": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.cmd": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.cmd_with_progress": {"tf": 1}}, "df": 2}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.stderr_callback": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 2}}}}}}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.current_input_idx": {"tf": 1}}, "df": 1}}}}}}, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 2}}}}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.stderr": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.stderr_callback": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 3}}}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.exclude_progress": {"tf": 1}}, "df": 1}}}}}}}, "b": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.base_popen_kwargs": {"tf": 1}}, "df": 1}}}}, "k": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.base_popen_kwargs": {"tf": 1}}, "df": 1}}}}}}, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.cmd_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.inputs_with_options": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 4}}}}, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.inputs_with_options": {"tf": 1}}, "df": 1}}}}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit": {"tf": 1}}, "df": 3}}}}}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.quit": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit": {"tf": 1}}, "df": 4}}}}, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit_gracefully": {"tf": 1}}, "df": 2}}}}}}}}}}}}, "fullname": {"root": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}}, "df": 1, "f": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {"ffmpeg_progress_yield": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.DUR_REGEX": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.TIME_REGEX": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.PROGRESS_REGEX": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.cmd": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.stderr": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.dry_run": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.exclude_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.process": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.stderr_callback": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.base_popen_kwargs": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.cmd_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.inputs_with_options": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.current_input_idx": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.total_dur": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.quit": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 24, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_progress_yield.FfmpegProgress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.DUR_REGEX": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.TIME_REGEX": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.PROGRESS_REGEX": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.cmd": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.stderr": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.dry_run": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.exclude_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.process": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.stderr_callback": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.base_popen_kwargs": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.cmd_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.inputs_with_options": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.current_input_idx": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.total_dur": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.quit": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 23}}}}}}}}}}}}}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_progress_yield": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.DUR_REGEX": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.TIME_REGEX": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.PROGRESS_REGEX": {"tf": 1.4142135623730951}, "ffmpeg_progress_yield.FfmpegProgress.cmd": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.stderr": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.dry_run": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.exclude_progress": {"tf": 1.4142135623730951}, "ffmpeg_progress_yield.FfmpegProgress.process": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.stderr_callback": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.base_popen_kwargs": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.cmd_with_progress": {"tf": 1.4142135623730951}, "ffmpeg_progress_yield.FfmpegProgress.inputs_with_options": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.current_input_idx": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.total_dur": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1.4142135623730951}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1.4142135623730951}, "ffmpeg_progress_yield.FfmpegProgress.quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.quit": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 24}}}}}, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.process": {"tf": 1}}, "df": 1}}}}}}, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.base_popen_kwargs": {"tf": 1}}, "df": 1}}}}}, "y": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_progress_yield": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.DUR_REGEX": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.TIME_REGEX": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.PROGRESS_REGEX": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.cmd": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.stderr": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.dry_run": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.exclude_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.process": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.stderr_callback": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.base_popen_kwargs": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.cmd_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.inputs_with_options": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.current_input_idx": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.total_dur": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.quit": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 24}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}}, "df": 1}}, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.current_input_idx": {"tf": 1}}, "df": 1, "s": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.inputs_with_options": {"tf": 1}}, "df": 1}}}}}, "d": {"docs": {}, "df": 0, "x": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.current_input_idx": {"tf": 1}}, "df": 1}}}, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.DUR_REGEX": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.total_dur": {"tf": 1}}, "df": 2}}, "r": {"docs": {}, "df": 0, "y": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.dry_run": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "x": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.DUR_REGEX": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.TIME_REGEX": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.PROGRESS_REGEX": {"tf": 1}}, "df": 3}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.dry_run": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 3}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.TIME_REGEX": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.total_dur": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.cmd": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.cmd_with_progress": {"tf": 1}}, "df": 2}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.stderr_callback": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 2}}}}}}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.current_input_idx": {"tf": 1}}, "df": 1}}}}}}, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 2}}}}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.stderr": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.stderr_callback": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 3}}}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.exclude_progress": {"tf": 1}}, "df": 1}}}}}}}, "b": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.base_popen_kwargs": {"tf": 1}}, "df": 1}}}}, "k": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.base_popen_kwargs": {"tf": 1}}, "df": 1}}}}}}, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.cmd_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.inputs_with_options": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 4}}}}, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.inputs_with_options": {"tf": 1}}, "df": 1}}}}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit": {"tf": 1}}, "df": 3}}}}}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.quit": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit": {"tf": 1}}, "df": 4}}}}, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit_gracefully": {"tf": 1}}, "df": 2}}}}}}}}}}}}, "annotation": {"root": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.stderr": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.process": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.stderr_callback": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.current_input_idx": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.total_dur": {"tf": 1}}, "df": 5, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "[": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.stderr": {"tf": 1}}, "df": 1}}}, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "[": {"docs": {}, "df": 0, "[": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.stderr_callback": {"tf": 1}}, "df": 1}}}}}}}}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.total_dur": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "y": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.process": {"tf": 1}}, "df": 1}}}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.stderr_callback": {"tf": 1}}, "df": 1}}}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.current_input_idx": {"tf": 1}}, "df": 1}}}}}, "default_value": {"root": {"9": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.PROGRESS_REGEX": {"tf": 1}}, "df": 1}, "docs": {"ffmpeg_progress_yield.FfmpegProgress.DUR_REGEX": {"tf": 2}, "ffmpeg_progress_yield.FfmpegProgress.TIME_REGEX": {"tf": 2}, "ffmpeg_progress_yield.FfmpegProgress.PROGRESS_REGEX": {"tf": 1.7320508075688772}}, "df": 3, "r": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.DUR_REGEX": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.TIME_REGEX": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.PROGRESS_REGEX": {"tf": 1}}, "df": 3}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.DUR_REGEX": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.TIME_REGEX": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.PROGRESS_REGEX": {"tf": 1}}, "df": 3}}}}}}}, "x": {"2": {"7": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.DUR_REGEX": {"tf": 1.4142135623730951}, "ffmpeg_progress_yield.FfmpegProgress.TIME_REGEX": {"tf": 1.4142135623730951}, "ffmpeg_progress_yield.FfmpegProgress.PROGRESS_REGEX": {"tf": 1.4142135623730951}}, "df": 3}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.DUR_REGEX": {"tf": 1}}, "df": 1}}}}}}}, "{": {"2": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.DUR_REGEX": {"tf": 2}, "ffmpeg_progress_yield.FfmpegProgress.TIME_REGEX": {"tf": 2}}, "df": 2}, "docs": {}, "df": 0}}, "p": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.DUR_REGEX": {"tf": 2}, "ffmpeg_progress_yield.FfmpegProgress.TIME_REGEX": {"tf": 2}}, "df": 2}, "l": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.DUR_REGEX": {"tf": 2}, "ffmpeg_progress_yield.FfmpegProgress.TIME_REGEX": {"tf": 2}}, "df": 2}}, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.DUR_REGEX": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.TIME_REGEX": {"tf": 1}}, "df": 2}}}}, "g": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.DUR_REGEX": {"tf": 2}, "ffmpeg_progress_yield.FfmpegProgress.TIME_REGEX": {"tf": 2}}, "df": 2}}, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.DUR_REGEX": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.TIME_REGEX": {"tf": 1}}, "df": 2}}, "s": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.DUR_REGEX": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.TIME_REGEX": {"tf": 1}}, "df": 2}}, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.DUR_REGEX": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.TIME_REGEX": {"tf": 1}}, "df": 2}}}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.TIME_REGEX": {"tf": 1}}, "df": 1}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.TIME_REGEX": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.PROGRESS_REGEX": {"tf": 1}}, "df": 1}, "z": {"0": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.PROGRESS_REGEX": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}}}, "signature": {"root": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 6.928203230275509}, "ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 6.855654600401044}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 6.855654600401044}, "ffmpeg_progress_yield.FfmpegProgress.quit_gracefully": {"tf": 3.4641016151377544}, "ffmpeg_progress_yield.FfmpegProgress.quit": {"tf": 3.4641016151377544}, "ffmpeg_progress_yield.FfmpegProgress.async_quit_gracefully": {"tf": 3.4641016151377544}, "ffmpeg_progress_yield.FfmpegProgress.async_quit": {"tf": 3.4641016151377544}, "ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 5.477225575051661}}, "df": 8, "c": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}}, "df": 1}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 1}}}}}}}}, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 2}}, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "f": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.quit": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 7}}}}, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}}, "df": 1}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 2}}}}}}}}, "r": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}}, "df": 1}}}, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}}, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1.4142135623730951}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1.4142135623730951}}, "df": 2}}}}}, "e": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}}, "df": 1}}}}}}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 2}}}}}, "k": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 2}}}}}}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1.4142135623730951}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1.4142135623730951}, "ffmpeg_progress_yield.FfmpegProgress.quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.quit": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 7, "t": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 1}}}}}}}}, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 2}}}}}}}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 2}}}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}}, "df": 1}}}}}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}, "bases": {"root": {"docs": {}, "df": 0}}, "doc": {"root": {"docs": {"ffmpeg_progress_yield": {"tf": 1.7320508075688772}, "ffmpeg_progress_yield.FfmpegProgress": {"tf": 1.7320508075688772}, "ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 4.69041575982343}, "ffmpeg_progress_yield.FfmpegProgress.DUR_REGEX": {"tf": 1.7320508075688772}, "ffmpeg_progress_yield.FfmpegProgress.TIME_REGEX": {"tf": 1.7320508075688772}, "ffmpeg_progress_yield.FfmpegProgress.PROGRESS_REGEX": {"tf": 1.7320508075688772}, "ffmpeg_progress_yield.FfmpegProgress.cmd": {"tf": 1.7320508075688772}, "ffmpeg_progress_yield.FfmpegProgress.stderr": {"tf": 1.7320508075688772}, "ffmpeg_progress_yield.FfmpegProgress.dry_run": {"tf": 1.7320508075688772}, "ffmpeg_progress_yield.FfmpegProgress.exclude_progress": {"tf": 1.7320508075688772}, "ffmpeg_progress_yield.FfmpegProgress.process": {"tf": 1.7320508075688772}, "ffmpeg_progress_yield.FfmpegProgress.stderr_callback": {"tf": 1.7320508075688772}, "ffmpeg_progress_yield.FfmpegProgress.base_popen_kwargs": {"tf": 1.7320508075688772}, "ffmpeg_progress_yield.FfmpegProgress.cmd_with_progress": {"tf": 1.7320508075688772}, "ffmpeg_progress_yield.FfmpegProgress.inputs_with_options": {"tf": 1.7320508075688772}, "ffmpeg_progress_yield.FfmpegProgress.current_input_idx": {"tf": 1.7320508075688772}, "ffmpeg_progress_yield.FfmpegProgress.total_dur": {"tf": 1.7320508075688772}, "ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 6.557438524302}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 5.830951894845301}, "ffmpeg_progress_yield.FfmpegProgress.quit_gracefully": {"tf": 3.7416573867739413}, "ffmpeg_progress_yield.FfmpegProgress.quit": {"tf": 3.7416573867739413}, "ffmpeg_progress_yield.FfmpegProgress.async_quit_gracefully": {"tf": 3.605551275463989}, "ffmpeg_progress_yield.FfmpegProgress.async_quit": {"tf": 3.7416573867739413}, "ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 3.872983346207417}}, "df": 24, "i": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}}, "df": 1, "n": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1.7320508075688772}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1.4142135623730951}, "ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 3, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}}, "df": 1}}}}}}}}, "t": {"docs": {}, "df": 0, "o": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 1}}}, "f": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1.4142135623730951}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1.4142135623730951}, "ffmpeg_progress_yield.FfmpegProgress.quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.quit": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit": {"tf": 1}}, "df": 6}, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 3, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "[": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}}, "df": 1}}}}}}}}}}}}}, "s": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.quit": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 7}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 2.8284271247461903}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 2.6457513110645907}, "ffmpeg_progress_yield.FfmpegProgress.quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.quit": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1.4142135623730951}}, "df": 8}, "a": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1.7320508075688772}}, "df": 2}}, "i": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 1}}}, "o": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1.7320508075688772}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1.7320508075688772}, "ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 4}, "r": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 2}}}}}}, "f": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1.4142135623730951}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1.4142135623730951}, "ffmpeg_progress_yield.FfmpegProgress.quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.quit": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit": {"tf": 1}}, "df": 7, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}}, "df": 1}}}}}}}}}}}}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 2}}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 2}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 2}}}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.quit": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit": {"tf": 1}}, "df": 4}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1.7320508075688772}}, "df": 1}}}}}}}}, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}}, "df": 1}}}}, "m": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}}, "df": 1}}, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1.4142135623730951}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1.4142135623730951}}, "df": 3}}}}}}, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 2}}}}}, "l": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 2, "d": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 2}}}}}}}, "l": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 2, "b": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 2.23606797749979}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1.7320508075688772}}, "df": 1}}, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "[": {"docs": {}, "df": 0, "[": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 1}}}}}}}}}}}, "n": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 1}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 2}}}}}}}}, "e": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 2}}}}}}, "a": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1.4142135623730951}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 2.23606797749979}}, "df": 4, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1.4142135623730951}}, "df": 1, "s": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1.4142135623730951}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1.4142135623730951}, "ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 4}}}}}}}, "e": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 1}}, "n": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1.4142135623730951}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1.4142135623730951}}, "df": 2, "d": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 2}}, "s": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit": {"tf": 1}}, "df": 3}}}}}}}}}}}}}, "c": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 1, "s": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}}, "df": 1, "[": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}}, "df": 1}}}}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 2}}}, "o": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "f": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 2}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1.4142135623730951}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1.4142135623730951}}, "df": 3}}}}}}}, "n": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1.4142135623730951}}, "df": 1, "l": {"docs": {}, "df": 0, "y": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}}, "df": 1}}, "e": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 1}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1.4142135623730951}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1.4142135623730951}, "ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1.7320508075688772}}, "df": 3}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 2}}}}}}}}, "e": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 3, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}}, "df": 1}}}}}}}, "x": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 2}}}, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 2}}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 1}}}}}, "g": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 3, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}}, "df": 1}}}}}}}, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 1}}}, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}}, "df": 1}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}}, "df": 1}}}}}}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1.7320508075688772}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1.7320508075688772}}, "df": 2}}}}}}}, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1.4142135623730951}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1.4142135623730951}}, "df": 2}}}}, "r": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 3, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.quit": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit": {"tf": 1}}, "df": 6}}}}}}}}}}}, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.quit": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit": {"tf": 1}}, "df": 6}, "d": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 2}}}}}}, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}}, "df": 1}}}, "e": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1.4142135623730951}}, "df": 4}, "y": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.quit": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit": {"tf": 1}}, "df": 4}}, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}}, "df": 1}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "y": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 2}, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 2}}}}}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 2}}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.quit": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit": {"tf": 1}}, "df": 4}}}}}, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.quit": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit": {"tf": 1}}, "df": 2}}}}}, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "t": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1.4142135623730951}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 1, "/": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 1}}}}}}}}}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1.4142135623730951}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1.4142135623730951}}, "df": 1}}, "w": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 2}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 2}}}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.quit_gracefully": {"tf": 1.4142135623730951}, "ffmpeg_progress_yield.FfmpegProgress.quit": {"tf": 1.4142135623730951}, "ffmpeg_progress_yield.FfmpegProgress.async_quit_gracefully": {"tf": 1.4142135623730951}, "ffmpeg_progress_yield.FfmpegProgress.async_quit": {"tf": 1.4142135623730951}}, "df": 6}}}}, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1.7320508075688772}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1.4142135623730951}}, "df": 2}}}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1.4142135623730951}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 2}}}}}}, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1.4142135623730951}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1.4142135623730951}}, "df": 2}}}}}, "y": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1.7320508075688772}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 2}}}}}, "o": {"docs": {}, "df": 0, "u": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 1}}}, "k": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 2}}}}}}, "n": {"docs": {}, "df": 0, "o": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.quit": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit": {"tf": 1}}, "df": 6, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.run_command_with_progress": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_run_command_with_progress": {"tf": 1}}, "df": 2, "e": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1.4142135623730951}}, "df": 1}}, "n": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 1}}}}, "q": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit_gracefully": {"tf": 1}}, "df": 2, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.quit": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit_gracefully": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.async_quit": {"tf": 1}}, "df": 4}}}}, "m": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 1}}}}}, "j": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.set_stderr_callback": {"tf": 1}}, "df": 1}}}}}}}}}, "pipeline": ["trimmer"], "_isPrebuiltIndex": true};
4 |
5 | // mirrored in build-search-index.js (part 1)
6 | // Also split on html tags. this is a cheap heuristic, but good enough.
7 | elasticlunr.tokenizer.setSeperator(/[\s\-.;&_'"=,()]+|<[^>]*>/);
8 |
9 | let searchIndex;
10 | if (docs._isPrebuiltIndex) {
11 | console.info("using precompiled search index");
12 | searchIndex = elasticlunr.Index.load(docs);
13 | } else {
14 | console.time("building search index");
15 | // mirrored in build-search-index.js (part 2)
16 | searchIndex = elasticlunr(function () {
17 | this.pipeline.remove(elasticlunr.stemmer);
18 | this.pipeline.remove(elasticlunr.stopWordFilter);
19 | this.addField("qualname");
20 | this.addField("fullname");
21 | this.addField("annotation");
22 | this.addField("default_value");
23 | this.addField("signature");
24 | this.addField("bases");
25 | this.addField("doc");
26 | this.setRef("fullname");
27 | });
28 | for (let doc of docs) {
29 | searchIndex.addDoc(doc);
30 | }
31 | console.timeEnd("building search index");
32 | }
33 |
34 | return (term) => searchIndex.search(term, {
35 | fields: {
36 | qualname: {boost: 4},
37 | fullname: {boost: 2},
38 | annotation: {boost: 2},
39 | default_value: {boost: 2},
40 | signature: {boost: 2},
41 | bases: {boost: 2},
42 | doc: {boost: 1},
43 | },
44 | expand: true
45 | });
46 | })();
--------------------------------------------------------------------------------
/ffmpeg-progress-yield.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/slhck/ffmpeg-progress-yield/e52f51dcb60708241da44286ce1bd32d643b9b97/ffmpeg-progress-yield.gif
--------------------------------------------------------------------------------
/ffmpeg_progress_yield/__init__.py:
--------------------------------------------------------------------------------
1 | from .ffmpeg_progress_yield import FfmpegProgress
2 |
3 | __version__ = "0.12.0"
4 |
5 | __all__ = ["FfmpegProgress"]
6 |
--------------------------------------------------------------------------------
/ffmpeg_progress_yield/__main__.py:
--------------------------------------------------------------------------------
1 | import argparse
2 | import platform
3 |
4 | from . import __version__ as version
5 | from .ffmpeg_progress_yield import FfmpegProgress
6 |
7 |
8 | def main() -> None:
9 | parser = argparse.ArgumentParser(
10 | description=f"ffmpeg-progress-yield v{version}",
11 | formatter_class=argparse.ArgumentDefaultsHelpFormatter,
12 | )
13 | parser.add_argument(
14 | "-d",
15 | "--duration",
16 | type=float,
17 | help="Duration of the video in seconds (override).",
18 | )
19 | parser.add_argument(
20 | "-n", "--dry-run", action="store_true", help="Print ffmpeg command and exit."
21 | )
22 | parser.add_argument(
23 | "-p",
24 | "--progress-only",
25 | action="store_true",
26 | help="Print progress only and do not print stderr at exit.",
27 | )
28 | parser.add_argument(
29 | "-x",
30 | "--exclude-progress",
31 | action="store_true",
32 | help="Exclude progress lines from ffmpeg log.",
33 | )
34 | parser.add_argument(
35 | "-l",
36 | "--log-file",
37 | type=str,
38 | help="Send ffmpeg log output to specified file.",
39 | )
40 | parser.add_argument(
41 | "ffmpeg_command",
42 | type=str,
43 | nargs=argparse.REMAINDER,
44 | help="Any ffmpeg command. Do not quote this argument.",
45 | )
46 | args = parser.parse_args()
47 |
48 | ff = FfmpegProgress(args.ffmpeg_command, dry_run=args.dry_run, exclude_progress=args.exclude_progress)
49 |
50 | try:
51 | from tqdm import tqdm
52 |
53 | with tqdm(
54 | total=100,
55 | position=1,
56 | desc="Progress",
57 | bar_format="{desc}: {percentage:3.2f}% |{bar}{r_bar}",
58 | ) as pbar:
59 | for progress in ff.run_command_with_progress(
60 | duration_override=args.duration
61 | ):
62 | pbar.update(progress - pbar.n)
63 | except ImportError:
64 | for progress in ff.run_command_with_progress():
65 | print(f"\x1b[K{progress}/100", end="\r")
66 | print()
67 |
68 | if platform.system() == "Windows":
69 | print("\x1b[K", end="")
70 |
71 | if not args.progress_only:
72 | log_file = args.log_file
73 | if log_file in ("1", "2"):
74 | log_file = int(log_file)
75 | elif log_file is None:
76 | log_file = 2
77 | with open(log_file, "w") as f:
78 | print(ff.stderr, file=f)
79 |
80 |
81 | if __name__ == "__main__":
82 | main()
83 |
--------------------------------------------------------------------------------
/ffmpeg_progress_yield/ffmpeg_progress_yield.py:
--------------------------------------------------------------------------------
1 | import asyncio
2 | import os
3 | import re
4 | import subprocess
5 | from typing import Any, AsyncIterator, Callable, Iterator, List, Optional, Union
6 |
7 |
8 | def to_ms(**kwargs: Union[float, int, str]) -> int:
9 | hour = int(kwargs.get("hour", 0))
10 | minute = int(kwargs.get("min", 0))
11 | sec = int(kwargs.get("sec", 0))
12 | ms = int(kwargs.get("ms", 0))
13 |
14 | return (hour * 60 * 60 * 1000) + (minute * 60 * 1000) + (sec * 1000) + ms
15 |
16 |
17 | class FfmpegProgress:
18 | DUR_REGEX = re.compile(
19 | r"Duration: (?P\d{2}):(?P\d{2}):(?P\d{2})\.(?P\d{2})"
20 | )
21 | TIME_REGEX = re.compile(
22 | r"out_time=(?P\d{2}):(?P\d{2}):(?P\d{2})\.(?P\d{2})"
23 | )
24 | PROGRESS_REGEX = re.compile(
25 | r"[a-z0-9_]+=.+"
26 | )
27 |
28 | def __init__(self, cmd: List[str], dry_run: bool = False, exclude_progress: bool = False) -> None:
29 | """Initialize the FfmpegProgress class.
30 |
31 | Args:
32 | cmd (List[str]): A list of command line elements, e.g. ["ffmpeg", "-i", ...]
33 | dry_run (bool, optional): Only show what would be done. Defaults to False.
34 | """
35 | self.cmd = cmd
36 | self.stderr: Union[str, None] = None
37 | self.dry_run = dry_run
38 | self.exclude_progress = exclude_progress
39 | self.process: Any = None
40 | self.stderr_callback: Union[Callable[[str], None], None] = None
41 | self.base_popen_kwargs = {
42 | "stdin": subprocess.PIPE, # Apply stdin isolation by creating separate pipe.
43 | "stdout": subprocess.PIPE,
44 | "stderr": subprocess.STDOUT,
45 | "universal_newlines": False,
46 | }
47 |
48 | self.cmd_with_progress = (
49 | [self.cmd[0]] + ["-progress", "-", "-nostats"] + self.cmd[1:]
50 | )
51 | self.inputs_with_options = FfmpegProgress._get_inputs_with_options(self.cmd)
52 |
53 | self.current_input_idx: int = 0
54 | self.total_dur: Union[None, int] = None
55 | if FfmpegProgress._uses_error_loglevel(self.cmd):
56 | self.total_dur = FfmpegProgress._probe_duration(self.cmd)
57 |
58 | def _process_output(
59 | self,
60 | stderr_line: str,
61 | stderr: List[str],
62 | duration_override: Union[float, None],
63 | ) -> Union[float, None]:
64 | """
65 | Process the output of the ffmpeg command.
66 |
67 | Args:
68 | stderr_line (str): The line of stderr output.
69 | stderr (List[str]): The list of stderr output.
70 | duration_override (Union[float, None]): The duration of the video in seconds.
71 |
72 | Returns:
73 | Union[float, None]: The progress in percent.
74 | """
75 |
76 | if self.stderr_callback:
77 | self.stderr_callback(stderr_line)
78 |
79 | stderr.append(stderr_line.strip())
80 | self.stderr = "\n".join(
81 | filter(
82 | lambda line: not (self.exclude_progress and self.PROGRESS_REGEX.match(line)),
83 | stderr
84 | )
85 | )
86 |
87 | progress: Union[float, None] = None
88 | # assign the total duration if it was found. this can happen multiple times for multiple inputs,
89 | # in which case we have to determine the overall duration by taking the min/max (dependent on -shortest being present)
90 | if (
91 | current_dur_match := self.DUR_REGEX.search(stderr_line)
92 | ) and duration_override is None:
93 | input_options = self.inputs_with_options[self.current_input_idx]
94 | current_dur_ms: int = to_ms(**current_dur_match.groupdict())
95 | # if the previous line had "image2", it's a single image and we assume a really short intrinsic duration (4ms),
96 | # but if it's a loop, we assume infinity
97 | if "image2" in stderr[-2] and "-loop 1" in " ".join(input_options):
98 | current_dur_ms = 2**64
99 | if "-shortest" in self.cmd:
100 | self.total_dur = (
101 | min(self.total_dur, current_dur_ms)
102 | if self.total_dur is not None
103 | else current_dur_ms
104 | )
105 | else:
106 | self.total_dur = (
107 | max(self.total_dur, current_dur_ms)
108 | if self.total_dur is not None
109 | else current_dur_ms
110 | )
111 | self.current_input_idx += 1
112 |
113 | if (
114 | progress_time := self.TIME_REGEX.search(stderr_line)
115 | ) and self.total_dur is not None:
116 | elapsed_time = to_ms(**progress_time.groupdict())
117 | progress = min(max(round(elapsed_time / self.total_dur * 100, 2), 0), 100)
118 |
119 | return progress
120 |
121 | @staticmethod
122 | def _probe_duration(cmd: List[str]) -> Optional[int]:
123 | """
124 | Get the duration via ffprobe from input media file
125 | in case ffmpeg was run with loglevel=error.
126 |
127 | Args:
128 | cmd (List[str]): A list of command line elements, e.g. ["ffmpeg", "-i", ...]
129 |
130 | Returns:
131 | Optional[int]: The duration in milliseconds.
132 | """
133 | file_names = []
134 | for i, arg in enumerate(cmd):
135 | if arg == "-i":
136 | file_name = cmd[i + 1]
137 |
138 | # filter for filenames that we can probe, i.e. regular files
139 | if os.path.isfile(file_name):
140 | file_names.append(file_name)
141 |
142 | if len(file_names) == 0:
143 | return None
144 |
145 | durations = []
146 |
147 | for file_name in file_names:
148 | try:
149 | output = subprocess.check_output(
150 | [
151 | "ffprobe",
152 | "-loglevel",
153 | "error",
154 | "-hide_banner",
155 | "-show_entries",
156 | "format=duration",
157 | "-of",
158 | "default=noprint_wrappers=1:nokey=1",
159 | file_name,
160 | ],
161 | universal_newlines=True,
162 | )
163 | durations.append(int(float(output.strip()) * 1000))
164 | except Exception:
165 | # TODO: add logging
166 | return None
167 |
168 | return max(durations) if "-shortest" not in cmd else min(durations)
169 |
170 | @staticmethod
171 | def _uses_error_loglevel(cmd: List[str]) -> bool:
172 | try:
173 | idx = cmd.index("-loglevel")
174 | if cmd[idx + 1] == "error":
175 | return True
176 | else:
177 | return False
178 | except ValueError:
179 | return False
180 |
181 | @staticmethod
182 | def _get_inputs_with_options(cmd: List[str]) -> List[List[str]]:
183 | """
184 | Collect all inputs with their options.
185 | For example, input is:
186 |
187 | ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 -filter_complex ...
188 |
189 | Output is:
190 |
191 | [
192 | ["-i", "input1.mp4"],
193 | ["-i", "input2.mp4"],
194 | ["-i", "input3.mp4"],
195 | ]
196 |
197 | Another example:
198 |
199 | ffmpeg -f lavfi -i color=c=black:s=1920x1080 -loop 1 -i image.png -filter_complex ...
200 |
201 | Output is:
202 |
203 | [
204 | ["-f", "lavfi", "-i", "color=c=black:s=1920x1080"],
205 | ["-loop", "1", "-i", "image.png"],
206 | ]
207 | """
208 | inputs = []
209 | prev_index = 0
210 | for i, arg in enumerate(cmd):
211 | if arg == "-i":
212 | inputs.append(cmd[prev_index : i + 2])
213 | prev_index = i + 2
214 |
215 | return inputs
216 |
217 | def run_command_with_progress(
218 | self, popen_kwargs=None, duration_override: Union[float, None] = None
219 | ) -> Iterator[float]:
220 | """
221 | Run an ffmpeg command, trying to capture the process output and calculate
222 | the duration / progress.
223 | Yields the progress in percent.
224 |
225 | Args:
226 | popen_kwargs (dict, optional): A dict to specify extra arguments to the popen call, e.g. { creationflags: CREATE_NO_WINDOW }
227 | duration_override (float, optional): The duration in seconds. If not specified, it will be calculated from the ffmpeg output.
228 |
229 | Raises:
230 | RuntimeError: If the command fails, an exception is raised.
231 |
232 | Yields:
233 | Iterator[float]: A generator that yields the progress in percent.
234 | """
235 | if self.dry_run:
236 | yield from [0, 100]
237 | return
238 |
239 | if duration_override:
240 | self.total_dur = int(duration_override * 1000)
241 |
242 | base_popen_kwargs = self.base_popen_kwargs.copy()
243 | if popen_kwargs is not None:
244 | base_popen_kwargs.update(popen_kwargs)
245 |
246 | self.process = subprocess.Popen(self.cmd_with_progress, **base_popen_kwargs) # type: ignore
247 |
248 | yield 0
249 |
250 | stderr: List[str] = []
251 | while True:
252 | if self.process.stdout is None:
253 | continue
254 |
255 | stderr_line: str = (
256 | self.process.stdout.readline().decode("utf-8", errors="replace").strip()
257 | )
258 |
259 | if stderr_line == "" and self.process.poll() is not None:
260 | break
261 |
262 | progress = self._process_output(stderr_line, stderr, duration_override)
263 | if progress is not None:
264 | yield progress
265 |
266 | if self.process.returncode != 0:
267 | raise RuntimeError(f"Error running command {self.cmd}: {self.stderr}")
268 |
269 | yield 100
270 | self.process = None
271 |
272 | async def async_run_command_with_progress(
273 | self, popen_kwargs=None, duration_override: Union[float, None] = None
274 | ) -> AsyncIterator[float]:
275 | """
276 | Asynchronously run an ffmpeg command, trying to capture the process output and calculate
277 | the duration / progress.
278 | Yields the progress in percent.
279 |
280 | Args:
281 | popen_kwargs (dict, optional): A dict to specify extra arguments to the popen call, e.g. { creationflags: CREATE_NO_WINDOW }
282 | duration_override (float, optional): The duration in seconds. If not specified, it will be calculated from the ffmpeg output.
283 |
284 | Raises:
285 | RuntimeError: If the command fails, an exception is raised.
286 | """
287 | if self.dry_run:
288 | yield 0
289 | yield 100
290 | return
291 |
292 | if duration_override:
293 | self.total_dur = int(duration_override * 1000)
294 |
295 | base_popen_kwargs = self.base_popen_kwargs.copy()
296 | if popen_kwargs is not None:
297 | base_popen_kwargs.update(popen_kwargs)
298 |
299 | # Remove stdout and stderr from base_popen_kwargs as we're setting them explicitly
300 | base_popen_kwargs.pop("stdout", None)
301 | base_popen_kwargs.pop("stderr", None)
302 |
303 | self.process = await asyncio.create_subprocess_exec(
304 | *self.cmd_with_progress,
305 | stdout=asyncio.subprocess.PIPE,
306 | stderr=asyncio.subprocess.STDOUT,
307 | **base_popen_kwargs, # type: ignore
308 | )
309 |
310 | yield 0
311 |
312 | stderr: List[str] = []
313 | while True:
314 | if self.process.stdout is None:
315 | continue
316 |
317 | stderr_line: Union[bytes, None] = await self.process.stdout.readline()
318 | if not stderr_line:
319 | # Process has finished, check the return code
320 | await self.process.wait()
321 | if self.process.returncode != 0:
322 | raise RuntimeError(
323 | f"Error running command {self.cmd}: {self.stderr}"
324 | )
325 | break
326 | stderr_line_str = stderr_line.decode("utf-8", errors="replace").strip()
327 |
328 | progress = self._process_output(stderr_line_str, stderr, duration_override)
329 | if progress is not None:
330 | yield progress
331 |
332 | yield 100
333 | self.process = None
334 |
335 | def quit_gracefully(self) -> None:
336 | """
337 | Quit the ffmpeg process by sending 'q'
338 |
339 | Raises:
340 | RuntimeError: If no process is found.
341 | """
342 | if self.process is None:
343 | raise RuntimeError("No process found. Did you run the command?")
344 |
345 | self.process.communicate(input=b"q")
346 | self.process.kill()
347 | self.process = None
348 |
349 | def quit(self) -> None:
350 | """
351 | Quit the ffmpeg process by sending SIGKILL.
352 |
353 | Raises:
354 | RuntimeError: If no process is found.
355 | """
356 | if self.process is None:
357 | raise RuntimeError("No process found. Did you run the command?")
358 |
359 | self.process.kill()
360 | self.process = None
361 |
362 | async def async_quit_gracefully(self) -> None:
363 | """
364 | Quit the ffmpeg process by sending 'q' asynchronously
365 |
366 | Raises:
367 | RuntimeError: If no process is found.
368 | """
369 | if self.process is None:
370 | raise RuntimeError("No process found. Did you run the command?")
371 |
372 | self.process.stdin.write(b"q")
373 | await self.process.stdin.drain()
374 | await self.process.wait()
375 | self.process = None
376 |
377 | async def async_quit(self) -> None:
378 | """
379 | Quit the ffmpeg process by sending SIGKILL asynchronously.
380 |
381 | Raises:
382 | RuntimeError: If no process is found.
383 | """
384 | if self.process is None:
385 | raise RuntimeError("No process found. Did you run the command?")
386 |
387 | self.process.kill()
388 | await self.process.wait()
389 | self.process = None
390 |
391 | def set_stderr_callback(self, callback: Callable[[str], None]) -> None:
392 | """
393 | Set a callback function to be called on stderr output.
394 | The callback function must accept a single string argument.
395 | Note that this is called on every line of stderr output, so it can be called a lot.
396 | Also note that stdout/stderr are joined into one stream, so you might get stdout output in the callback.
397 |
398 | Args:
399 | callback (Callable[[str], None]): A callback function that accepts a single string argument.
400 | """
401 | if not callable(callback) or len(callback.__code__.co_varnames) != 1:
402 | raise ValueError(
403 | "Callback must be a function that accepts only one argument"
404 | )
405 |
406 | self.stderr_callback = callback
407 |
--------------------------------------------------------------------------------
/ffmpeg_progress_yield/py.typed:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/slhck/ffmpeg-progress-yield/e52f51dcb60708241da44286ce1bd32d643b9b97/ffmpeg_progress_yield/py.typed
--------------------------------------------------------------------------------
/pytest.ini:
--------------------------------------------------------------------------------
1 | [pytest]
2 | asyncio_mode = auto
3 | asyncio_default_fixture_loop_scope = "function"
4 |
--------------------------------------------------------------------------------
/requirements.dev.txt:
--------------------------------------------------------------------------------
1 | pytest>=8.3.2
2 | pytest-asyncio>=0.24.0
3 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | tqdm>=4.38.0
2 |
--------------------------------------------------------------------------------
/setup.cfg:
--------------------------------------------------------------------------------
1 | [mypy]
2 | namespace_packages = False
3 | mypy_path = ffmpeg_progress_yield
4 | exclude = build
5 |
6 | [wheel]
7 | universal = 1
8 |
9 | [flake8]
10 | ignore = E226,E302,E41
11 | max-line-length = 160
12 | max-complexity = 10
13 |
14 | [pep8]
15 | ignore = E226,E302,E41,E402
16 | max-line-length = 160
17 |
18 |
--------------------------------------------------------------------------------
/setup.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 |
3 | from os import path
4 |
5 | from setuptools import setup
6 |
7 | here = path.abspath(path.dirname(__file__))
8 |
9 | # read version string
10 | with open(path.join(here, "ffmpeg_progress_yield", "__init__.py")) as version_file:
11 | version = eval(version_file.read().split("\n")[2].split("=")[1].strip())
12 |
13 | # Get the long description from the README file
14 | with open(path.join(here, "README.md")) as f:
15 | long_description = f.read()
16 |
17 | # Get the history from the CHANGELOG file
18 | with open(path.join(here, "CHANGELOG.md")) as f:
19 | history = f.read()
20 |
21 | setup(
22 | name="ffmpeg_progress_yield",
23 | version=version,
24 | description="Run an ffmpeg command with progress",
25 | long_description=long_description + "\n\n" + history,
26 | long_description_content_type="text/markdown",
27 | author="Werner Robitza",
28 | author_email="werner.robitza@gmail.com",
29 | url="https://github.com/slhck/ffmpeg-progress-yield",
30 | packages=["ffmpeg_progress_yield"],
31 | include_package_data=True,
32 | package_data={
33 | "ffmpeg_progress_yield": ["py.typed"],
34 | },
35 | install_requires=[],
36 | license="MIT",
37 | zip_safe=False,
38 | keywords="ffmpeg",
39 | classifiers=[
40 | "Development Status :: 4 - Beta",
41 | "Intended Audience :: Developers",
42 | "License :: OSI Approved :: MIT License",
43 | "Natural Language :: English",
44 | "Programming Language :: Python :: 3",
45 | "Programming Language :: Python :: 3.9",
46 | "Programming Language :: Python :: 3.10",
47 | "Programming Language :: Python :: 3.11",
48 | "Programming Language :: Python :: 3.12",
49 | "Programming Language :: Python :: 3.13",
50 | ],
51 | python_requires=">=3.9",
52 | entry_points={
53 | "console_scripts": [
54 | "ffmpeg-progress-yield = ffmpeg_progress_yield.__main__:main"
55 | ]
56 | },
57 | )
58 |
--------------------------------------------------------------------------------
/test/test.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/slhck/ffmpeg-progress-yield/e52f51dcb60708241da44286ce1bd32d643b9b97/test/test.mp4
--------------------------------------------------------------------------------
/test/test.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env pytest
2 | import os
3 | import subprocess
4 | import sys
5 |
6 | import pytest
7 |
8 | sys.path.insert(0, os.path.join(os.path.dirname(__file__), "../"))
9 |
10 | from ffmpeg_progress_yield import FfmpegProgress # noqa: E402
11 |
12 | _TEST_ASSET = os.path.join(os.path.dirname(__file__), "test.mp4")
13 |
14 |
15 | class TestLibrary:
16 | cmd = [
17 | "ffmpeg",
18 | "-i",
19 | _TEST_ASSET,
20 | "-c:v",
21 | "libx264",
22 | "-vf",
23 | "scale=1920x1080",
24 | "-preset",
25 | "fast",
26 | "-f",
27 | "null",
28 | "/dev/null",
29 | ]
30 |
31 | unknown_dur_cmd = [
32 | "ffmpeg",
33 | "-re",
34 | "-f",
35 | "lavfi",
36 | "-i",
37 | "testsrc=d=10",
38 | "-t",
39 | "5",
40 | "-f",
41 | "null",
42 | "/dev/null",
43 | ]
44 |
45 | def test_library(self):
46 | ff = FfmpegProgress(TestLibrary.cmd)
47 | elapsed = 0
48 | for progress in ff.run_command_with_progress():
49 | print(f"{progress}/100")
50 | assert progress >= elapsed
51 | elapsed = progress
52 | # assert that we get 100% progress
53 | assert elapsed == 100
54 |
55 | def test_unknown_dur(self):
56 | ff = FfmpegProgress(TestLibrary.unknown_dur_cmd)
57 | progresses = set([0.0])
58 | for progress in ff.run_command_with_progress():
59 | progresses.add(progress)
60 | # assert that we get only 0 and 100% progress since we have no implicit duration
61 | assert list(progresses) == [0, 100]
62 |
63 | def test_manual_dur(self):
64 | ff = FfmpegProgress(TestLibrary.unknown_dur_cmd)
65 | progresses = set([0.0])
66 | for progress in ff.run_command_with_progress(duration_override=5):
67 | progresses.add(progress)
68 | # assert that we get more than just 0 and 100
69 | assert len(progresses) > 2
70 |
71 | def test_getting_stderr(self):
72 | ff = FfmpegProgress(TestLibrary.cmd)
73 | for progress in ff.run_command_with_progress():
74 | print(f"{progress}/100")
75 | if progress > 0 and ff.stderr is not None:
76 | assert len(ff.stderr) > 0
77 | break
78 |
79 | def test_quit(self):
80 | ff = FfmpegProgress(TestLibrary.cmd)
81 | proc = None
82 | for progress in ff.run_command_with_progress():
83 | print(f"{progress}/100")
84 | if progress > 0:
85 | proc = ff.process
86 | ff.quit()
87 | break
88 | # expect that no ffmpeg process is running after this test after sleeping for 1 second
89 | assert proc is not None
90 | proc.wait()
91 | assert proc.returncode == -9
92 |
93 | def test_quit_gracefully(self):
94 | ff = FfmpegProgress(TestLibrary.cmd)
95 | proc = None
96 | for progress in ff.run_command_with_progress():
97 | print(f"{progress}/100")
98 | if progress > 0 and ff.process is not None:
99 | proc = ff.process
100 | ff.quit_gracefully()
101 | break
102 | # expect that no ffmpeg process is running after this test after sleeping for 1 second
103 | assert proc is not None
104 | assert proc.returncode == 0
105 |
106 | def test_stderr_callback(self):
107 | def stderr_callback(line):
108 | print(line)
109 |
110 | ff = FfmpegProgress(TestLibrary.cmd)
111 | ff.set_stderr_callback(stderr_callback)
112 | for progress in ff.run_command_with_progress():
113 | print(f"{progress}/100")
114 | if progress > 0:
115 | break
116 |
117 | def test_progress_with_loglevel_error(self):
118 | cmd = TestLibrary.cmd + ["-loglevel", "error"]
119 | ff = FfmpegProgress(cmd)
120 | for progress in ff.run_command_with_progress():
121 | print(f"{progress}/100")
122 | if progress > 0:
123 | assert 0 < progress < 100
124 | break
125 |
126 | def test_stderr_without_progress(self):
127 | ff = FfmpegProgress(TestLibrary.cmd, exclude_progress=True)
128 | for progress in ff.run_command_with_progress():
129 | print(f"{progress}/100")
130 | if progress > 0 and ff.stderr is not None:
131 | assert len(ff.stderr) > 0
132 | break
133 | assert "out_time=" not in ff.stderr
134 |
135 | def test_stderr_with_progress(self):
136 | ff = FfmpegProgress(TestLibrary.cmd, exclude_progress=False)
137 | for progress in ff.run_command_with_progress():
138 | print(f"{progress}/100")
139 | if progress > 0 and ff.stderr is not None:
140 | assert len(ff.stderr) > 0
141 | break
142 | assert "out_time=" in ff.stderr
143 |
144 | class TestProgress:
145 | def test_progress(self):
146 | cmd = [
147 | "python3",
148 | "-m",
149 | "ffmpeg_progress_yield",
150 | "ffmpeg",
151 | "-i",
152 | _TEST_ASSET,
153 | "-c:v",
154 | "libx264",
155 | "-preset",
156 | "fast",
157 | "-f",
158 | "null",
159 | "/dev/null",
160 | ]
161 | ret = subprocess.run(cmd, capture_output=True, universal_newlines=True)
162 | assert "0/100" in ret.stderr
163 | assert "100.0/100" in ret.stderr or "100/100" in ret.stderr
164 |
165 |
166 | class TestAsyncLibrary:
167 | cmd = TestLibrary.cmd
168 |
169 | @pytest.mark.asyncio
170 | async def test_async_library(self):
171 | ff = FfmpegProgress(TestAsyncLibrary.cmd)
172 | elapsed = 0
173 | async for progress in ff.async_run_command_with_progress():
174 | print(f"{progress}/100")
175 | assert progress >= elapsed
176 | elapsed = progress
177 | # assert that we get 100% progress
178 | assert elapsed == 100
179 |
180 | @pytest.mark.asyncio
181 | async def test_async_quit(self):
182 | ff = FfmpegProgress(TestAsyncLibrary.cmd)
183 | proc = None
184 | async for progress in ff.async_run_command_with_progress():
185 | print(f"{progress}/100")
186 | if progress > 0:
187 | proc = ff.process
188 | await ff.async_quit()
189 | break
190 | assert proc is not None
191 | await proc.wait()
192 | assert proc.returncode != 0
193 |
194 | @pytest.mark.asyncio
195 | async def test_async_quit_gracefully(self):
196 | ff = FfmpegProgress(TestAsyncLibrary.cmd)
197 | proc = None
198 | async for progress in ff.async_run_command_with_progress():
199 | print(f"{progress}/100")
200 | if progress > 0 and ff.process is not None:
201 | proc = ff.process
202 | await ff.async_quit_gracefully()
203 | break
204 | assert proc is not None
205 | assert proc.returncode == 0
206 |
--------------------------------------------------------------------------------