├── .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 | [![All Contributors](https://img.shields.io/badge/all_contributors-6-orange.svg?style=flat-square)](#contributors-) 4 | 5 | 6 | [![PyPI version](https://img.shields.io/pypi/v/ffmpeg-progress-yield.svg)](https://pypi.org/project/ffmpeg-progress-yield) [![Python package](https://github.com/slhck/ffmpeg-progress-yield/actions/workflows/python-package.yml/badge.svg)](https://github.com/slhck/ffmpeg-progress-yield/actions/workflows/python-package.yml) 7 | 8 | Run an ffmpeg command with its progress yielded. 9 | 10 | ![](ffmpeg-progress-yield.gif) 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 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 148 | 149 | 150 |
Werner Robitza
Werner Robitza

💻
WyattBlue
WyattBlue

💻
Kirill Konovalov
Kirill Konovalov

💻
Jason Nader
Jason Nader

🐛
Launch Lee
Launch Lee

💻
scufre
scufre

💻
144 | 145 | Add your contributions 146 | 147 |
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 | 47 |
48 |
49 |

50 | ffmpeg_progress_yield.__main__

51 | 52 | 53 | 54 | 55 | 56 | 57 |
 1import sys
 58 |  2
 59 |  3from . import __version__ as version
 60 |  4from .ffmpeg_progress_yield import FfmpegProgress
 61 |  5
 62 |  6
 63 |  7def main() -> None:
 64 |  8    if len(sys.argv) <= 1 or sys.argv[1] in ("-h", "-help"):
 65 |  9        print(
 66 | 10            f"ffmpeg-progress-yield v{version}\n\n"
 67 | 11            "Usage: ffmpeg-progress-yield [-h] ffmpeg-command\n\n"
 68 | 12            "Arguments:\n"
 69 | 13            " ffmpeg-command:     Any ffmpeg command. Do not quote this argument.\n\n"
 70 | 14            "Options:\n -h/--help:          Show this help and exit."
 71 | 15        )
 72 | 16        sys.exit(1)
 73 | 17
 74 | 18    ff = FfmpegProgress(sys.argv[1:])
 75 | 19
 76 | 20    try:
 77 | 21        from tqdm import tqdm
 78 | 22
 79 | 23        with tqdm(total=100, position=1, desc="Test") as pbar:
 80 | 24            for progress in ff.run_command_with_progress():
 81 | 25                pbar.update(progress - pbar.n)
 82 | 26    except ImportError:
 83 | 27        for progress in ff.run_command_with_progress():
 84 | 28            print(f"{progress}/100")
 85 | 29
 86 | 30    print(ff.stderr)
 87 | 31
 88 | 32
 89 | 33if __name__ == "__main__":
 90 | 34    main()
 91 | 
92 | 93 | 94 |
95 |
96 | 97 |
98 | 99 | def 100 | main() -> None: 101 | 102 | 103 | 104 |
105 | 106 |
 8def main() -> None:
107 |  9    if len(sys.argv) <= 1 or sys.argv[1] in ("-h", "-help"):
108 | 10        print(
109 | 11            f"ffmpeg-progress-yield v{version}\n\n"
110 | 12            "Usage: ffmpeg-progress-yield [-h] ffmpeg-command\n\n"
111 | 13            "Arguments:\n"
112 | 14            " ffmpeg-command:     Any ffmpeg command. Do not quote this argument.\n\n"
113 | 15            "Options:\n -h/--help:          Show this help and exit."
114 | 16        )
115 | 17        sys.exit(1)
116 | 18
117 | 19    ff = FfmpegProgress(sys.argv[1:])
118 | 20
119 | 21    try:
120 | 22        from tqdm import tqdm
121 | 23
122 | 24        with tqdm(total=100, position=1, desc="Test") as pbar:
123 | 25            for progress in ff.run_command_with_progress():
124 | 26                pbar.update(progress - pbar.n)
125 | 27    except ImportError:
126 | 28        for progress in ff.run_command_with_progress():
127 | 29            print(f"{progress}/100")
128 | 30
129 | 31    print(ff.stderr)
130 | 
131 | 132 | 133 | 134 | 135 |
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\n
Arguments:
\n\n
    \n
  • cmd (List[str]): A list of command line elements, e.g. [\"ffmpeg\", \"-i\", ...]
  • \n
  • dry_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\n
Arguments:
\n\n
    \n
  • popen_kwargs (dict, optional): A dict to specify extra arguments to the popen call, e.g. { creationflags: CREATE_NO_WINDOW }
  • \n
  • duration_override (float, optional): The duration in seconds. If not specified, it will be calculated from the ffmpeg output.
  • \n
\n\n
Raises:
\n\n
    \n
  • RuntimeError: If the command fails, an exception is raised.
  • \n
\n\n
Yields:
\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\n
Arguments:
\n\n
    \n
  • popen_kwargs (dict, optional): A dict to specify extra arguments to the popen call, e.g. { creationflags: CREATE_NO_WINDOW }
  • \n
  • duration_override (float, optional): The duration in seconds. If not specified, it will be calculated from the ffmpeg output.
  • \n
\n\n
Raises:
\n\n
    \n
  • RuntimeError: 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\n
Raises:
\n\n
    \n
  • RuntimeError: 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\n
Raises:
\n\n
    \n
  • RuntimeError: 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\n
Raises:
\n\n
    \n
  • RuntimeError: 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\n
Raises:
\n\n
    \n
  • RuntimeError: 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\n
Arguments:
\n\n
    \n
  • callback (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 | --------------------------------------------------------------------------------