├── ffmpeg_progress_yield ├── py.typed ├── __init__.py ├── __main__.py └── ffmpeg_progress_yield.py ├── requirements.txt ├── requirements.dev.txt ├── test ├── test.mp4 └── test.py ├── pytest.ini ├── ffmpeg-progress-yield.gif ├── .github ├── ISSUE_TEMPLATE │ ├── question.md │ ├── feature_request.md │ └── bug_report.md └── workflows │ └── python-package.yml ├── docs ├── index.html ├── ffmpeg_progress_yield │ └── __main__.html └── search.js ├── .gitchangelog.rc ├── .gitchangelog.tpl ├── setup.cfg ├── .gitignore ├── LICENSE ├── .all-contributorsrc ├── setup.py ├── CHANGELOG.md └── README.md /ffmpeg_progress_yield/py.typed: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | tqdm>=4.38.0 2 | -------------------------------------------------------------------------------- /requirements.dev.txt: -------------------------------------------------------------------------------- 1 | pytest>=8.3.2 2 | pytest-asyncio>=0.24.0 3 | -------------------------------------------------------------------------------- /test/test.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/grangier/ffmpeg-progress-yield/HEAD/test/test.mp4 -------------------------------------------------------------------------------- /pytest.ini: -------------------------------------------------------------------------------- 1 | [pytest] 2 | asyncio_mode = auto 3 | asyncio_default_fixture_loop_scope = "function" 4 | -------------------------------------------------------------------------------- /ffmpeg-progress-yield.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/grangier/ffmpeg-progress-yield/HEAD/ffmpeg-progress-yield.gif -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /ffmpeg_progress_yield/__init__.py: -------------------------------------------------------------------------------- 1 | from .ffmpeg_progress_yield import FfmpegProgress 2 | 3 | __version__ = "0.11.3" 4 | 5 | __all__ = ["FfmpegProgress"] 6 | -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.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}} -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /.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/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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /.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 | "contributorsPerLine": 7, 60 | "linkToUsage": true 61 | } 62 | -------------------------------------------------------------------------------- /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 | "ffmpeg_command", 30 | type=str, 31 | nargs=argparse.REMAINDER, 32 | help="Any ffmpeg command. Do not quote this argument.", 33 | ) 34 | args = parser.parse_args() 35 | 36 | ff = FfmpegProgress(args.ffmpeg_command, dry_run=args.dry_run) 37 | 38 | try: 39 | from tqdm import tqdm 40 | 41 | with tqdm( 42 | total=100, 43 | position=1, 44 | desc="Progress", 45 | bar_format="{desc}: {percentage:3.2f}% |{bar}{r_bar}", 46 | ) as pbar: 47 | for progress in ff.run_command_with_progress( 48 | duration_override=args.duration 49 | ): 50 | pbar.update(progress - pbar.n) 51 | except ImportError: 52 | for progress in ff.run_command_with_progress(): 53 | print(f"\x1b[K{progress}/100", end="\r") 54 | print() 55 | 56 | if platform.system() == "Windows": 57 | print("\x1b[K", end="") 58 | if not args.progress_only: 59 | print(ff.stderr) 60 | 61 | 62 | if __name__ == "__main__": 63 | main() 64 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | 4 | ## v0.11.3 (2024-12-11) 5 | 6 | * Fix: Clear and print progress when tqdm is not available. 7 | 8 | This relates two printing sequence: 9 | 10 | (1) Print one decimal place after printing two decimal places 11 | 12 | 0.74/100 -> 0.8/100 (1 less character) 13 | 14 | (2) Print 100/100 after printing decimal progress 15 | 16 | 99.74/100 -> 100/100 (2 less characters) 17 | 18 | 99.8/100 -> 100/100 (1 less character) 19 | 20 | So clear the line first, and print progress, showing for a moment, and then repeat, finally a newline. :) 21 | 22 | 23 | ## v0.11.2 (2024-12-10) 24 | 25 | * Chore: One-liner progress when tqdm is not available. 26 | 27 | 28 | ## v0.11.1 (2024-11-22) 29 | 30 | * Make setup name PEP 625 compliant. 31 | 32 | 33 | ## v0.11.0 (2024-11-22) 34 | 35 | * Remove python 3.8, add 3.12, 3.13. 36 | 37 | 38 | ## v0.10.0 (2024-11-18) 39 | 40 | * Fix: ensure percentage is always in float. 41 | 42 | 43 | ## v0.9.1 (2024-09-16) 44 | 45 | * Fix: the logic of the option --progress-only. 46 | 47 | 48 | ## v0.9.0 (2024-09-16) 49 | 50 | * Docs: add @LaunchLee as a contributor. 51 | 52 | * Chore: Add an option to print progress only in cli usage. 53 | 54 | This option makes the output cleaner when doing batch conversions. 55 | 56 | * Code cleanup, refactoring. 57 | 58 | To avoid having to juggle around variables 59 | 60 | 61 | ## v0.8.1 (2024-09-09) 62 | 63 | * Fix type-checks. 64 | 65 | 66 | ## v0.8.0 (2024-09-09) 67 | 68 | * Add async support. 69 | 70 | 71 | ## v0.7.9 (2024-08-14) 72 | 73 | * Docs: add @ammgws as a contributor. 74 | 75 | * Fix typing error. 76 | 77 | * Chore: remove unused dependency. 78 | 79 | * Fix badge link. 80 | 81 | 82 | ## v0.7.8 (2023-06-01) 83 | 84 | * Image handling. 85 | 86 | Check if image2 inputs use looping or not, and set duration to infinity if needed 87 | 88 | 89 | ## v0.7.6 (2023-05-30) 90 | 91 | * Always use duration_override if present. 92 | 93 | 94 | ## v0.7.5 (2023-05-30) 95 | 96 | * Fix duration for multiple inputs, fixes #13. 97 | 98 | * Fix 'Test' string in tqdm. 99 | 100 | 101 | ## v0.7.4 (2023-05-06) 102 | 103 | * Fix: round percentage numbers. 104 | 105 | 106 | ## v0.7.3 (2023-05-05) 107 | 108 | * Update readme. 109 | 110 | * Add progress as percent, fixes #12. 111 | 112 | 113 | ## v0.7.2 (2023-03-04) 114 | 115 | * Do not print input information when probing, addresses #10. 116 | 117 | 118 | ## v0.7.1 (2023-02-24) 119 | 120 | * Fix types in CI. 121 | 122 | * Remove unneeded import. 123 | 124 | * Typo. 125 | 126 | * Docs: add @kskadart as a contributor. 127 | 128 | * Fix formatting. 129 | 130 | * Fix types. 131 | 132 | * Feat(ffprobe): FEAT-0001 try to get duration by ffprobe in case if loglevel=error. 133 | 134 | * Fix CI file. 135 | 136 | 137 | ## v0.7.0 (2023-01-24) 138 | 139 | * Add duration override to API. 140 | 141 | * Remove manifest.in. 142 | 143 | * Add mypy settings. 144 | 145 | 146 | ## v0.6.1 (2022-12-18) 147 | 148 | * Add py.typed. 149 | 150 | * Move API docs to existing section. 151 | 152 | 153 | ## v0.6.0 (2022-12-17) 154 | 155 | * Link to API docs. 156 | 157 | * Add API docs. 158 | 159 | * Add export. 160 | 161 | * Bump requirements to python 3.8 or higher. 162 | 163 | * Document methods. 164 | 165 | * Remove unused import. 166 | 167 | * Docs: add @WyattBlue as a contributor. 168 | 169 | * Docs: add @slhck as a contributor. 170 | 171 | * Unhide to_ms. 172 | 173 | * Add type hints + simplify. 174 | 175 | * Add python CI badge. 176 | 177 | * Fix quit tests. 178 | 179 | * Add all-contributors. 180 | 181 | * Add pytest to dev requirements. 182 | 183 | * Add github workflows. 184 | 185 | * Formatting. 186 | 187 | * Fix a few type and formatting errors. 188 | 189 | 190 | ## v0.5.0 (2022-12-12) 191 | 192 | * Add stderr callback method. 193 | 194 | * Update README. 195 | 196 | * Add graceful quit method. 197 | 198 | * Add a GIF in the readme. 199 | 200 | 201 | ## v0.4.0 (2022-12-11) 202 | 203 | * Add a quit method, fixes #4. 204 | 205 | 206 | ## v0.3.0 (2022-08-02) 207 | 208 | * Update python requirements. 209 | 210 | 211 | ## v0.2.0 (2021-11-21) 212 | 213 | * Add a usage option. 214 | 215 | 216 | ## v0.1.2 (2021-08-14) 217 | 218 | * Remove universal_newlines for Windows compat. 219 | 220 | 221 | ## v0.1.1 (2021-07-01) 222 | 223 | * Remove stats_period option for backwards compatibility, fixes #2. 224 | 225 | 226 | ## v0.1.0 (2021-06-30) 227 | 228 | * Format code with black. 229 | 230 | * Yield 0 in progress and improve logic. 231 | 232 | * Set universal_newlines to true and add kwargs support. 233 | 234 | * Increase stats period. 235 | 236 | * Document method. 237 | 238 | * Add typing. 239 | 240 | * Also check for 0 in output. 241 | 242 | * Update gitignore. 243 | 244 | * Drop python 3.5 support. 245 | 246 | * Update badge link. 247 | 248 | 249 | ## v0.0.4 (2021-03-10) 250 | 251 | * Add python_requires to setup.py. 252 | 253 | 254 | ## v0.0.3 (2021-03-06) 255 | 256 | * Remove release script. 257 | 258 | 259 | ## v0.0.2 (2021-03-06) 260 | 261 | * Fix release script. 262 | 263 | * Remove support for older versions. 264 | 265 | * Format setup.py. 266 | 267 | * Remove requirement for command to start with ffmpeg. 268 | 269 | * Add link to similar project. 270 | 271 | * Add changelog. 272 | 273 | * Rename project. 274 | 275 | * Initial commit. 276 | 277 | 278 | -------------------------------------------------------------------------------- /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 119 | cmd.extend(["-loglevel", "error"]) 120 | ff = FfmpegProgress(cmd) 121 | for progress in ff.run_command_with_progress(): 122 | print(f"{progress}/100") 123 | if progress > 0: 124 | assert 0 < progress < 100 125 | break 126 | 127 | 128 | class TestProgress: 129 | def test_progress(self): 130 | cmd = [ 131 | "python3", 132 | "-m", 133 | "ffmpeg_progress_yield", 134 | "ffmpeg", 135 | "-i", 136 | _TEST_ASSET, 137 | "-c:v", 138 | "libx264", 139 | "-preset", 140 | "fast", 141 | "-f", 142 | "null", 143 | "/dev/null", 144 | ] 145 | ret = subprocess.run(cmd, capture_output=True, universal_newlines=True) 146 | assert "0/100" in ret.stderr 147 | assert "100.0/100" in ret.stderr or "100/100" in ret.stderr 148 | 149 | 150 | class TestAsyncLibrary: 151 | cmd = TestLibrary.cmd 152 | 153 | @pytest.mark.asyncio 154 | async def test_async_library(self): 155 | ff = FfmpegProgress(TestAsyncLibrary.cmd) 156 | elapsed = 0 157 | async for progress in ff.async_run_command_with_progress(): 158 | print(f"{progress}/100") 159 | assert progress >= elapsed 160 | elapsed = progress 161 | # assert that we get 100% progress 162 | assert elapsed == 100 163 | 164 | @pytest.mark.asyncio 165 | async def test_async_quit(self): 166 | ff = FfmpegProgress(TestAsyncLibrary.cmd) 167 | proc = None 168 | async for progress in ff.async_run_command_with_progress(): 169 | print(f"{progress}/100") 170 | if progress > 0: 171 | proc = ff.process 172 | await ff.async_quit() 173 | break 174 | assert proc is not None 175 | await proc.wait() 176 | assert proc.returncode != 0 177 | 178 | @pytest.mark.asyncio 179 | async def test_async_quit_gracefully(self): 180 | ff = FfmpegProgress(TestAsyncLibrary.cmd) 181 | proc = None 182 | async for progress in ff.async_run_command_with_progress(): 183 | print(f"{progress}/100") 184 | if progress > 0 and ff.process is not None: 185 | proc = ff.process 186 | await ff.async_quit_gracefully() 187 | break 188 | assert proc is not None 189 | assert proc.returncode == 0 190 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ffmpeg-progress-yield 2 | 3 | [![All Contributors](https://img.shields.io/badge/all_contributors-5-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 | ## Caveats 112 | 113 | Currently, we do not differentiate between `stderr` and `stdout`. This means progress will be mixed with the ffmpeg log. 114 | 115 | You can also check out [`ffmpeg-progress`](https://github.com/Tatsh/ffmpeg-progress) for a similar project with a different feature set. 116 | 117 | ## Contributors 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 139 | 140 | 141 |
Werner Robitza
Werner Robitza

💻
WyattBlue
WyattBlue

💻
Kirill Konovalov
Kirill Konovalov

💻
Jason Nader
Jason Nader

🐛
Launch Lee
Launch Lee

💻
135 | 136 | Add your contributions 137 | 138 |
142 | 143 | 144 | 145 | 146 | 147 | 148 | ## License 149 | 150 | The MIT License (MIT) 151 | 152 | Copyright (c) 2021-2023 Werner Robitza 153 | 154 | Permission is hereby granted, free of charge, to any person obtaining a copy 155 | of this software and associated documentation files (the "Software"), to deal 156 | in the Software without restriction, including without limitation the rights 157 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 158 | copies of the Software, and to permit persons to whom the Software is 159 | furnished to do so, subject to the following conditions: 160 | 161 | The above copyright notice and this permission notice shall be included in all 162 | copies or substantial portions of the Software. 163 | 164 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 165 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 166 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 167 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 168 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 169 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 170 | SOFTWARE. 171 | -------------------------------------------------------------------------------- /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 | 25 | def __init__(self, cmd: List[str], dry_run: bool = False) -> None: 26 | """Initialize the FfmpegProgress class. 27 | 28 | Args: 29 | cmd (List[str]): A list of command line elements, e.g. ["ffmpeg", "-i", ...] 30 | dry_run (bool, optional): Only show what would be done. Defaults to False. 31 | """ 32 | self.cmd = cmd 33 | self.stderr: Union[str, None] = None 34 | self.dry_run = dry_run 35 | self.process: Any = None 36 | self.stderr_callback: Union[Callable[[str], None], None] = None 37 | self.base_popen_kwargs = { 38 | "stdin": subprocess.PIPE, # Apply stdin isolation by creating separate pipe. 39 | "stdout": subprocess.PIPE, 40 | "stderr": subprocess.STDOUT, 41 | "universal_newlines": False, 42 | } 43 | 44 | self.cmd_with_progress = ( 45 | [self.cmd[0]] + ["-progress", "-", "-nostats"] + self.cmd[1:] 46 | ) 47 | self.inputs_with_options = FfmpegProgress._get_inputs_with_options(self.cmd) 48 | 49 | self.current_input_idx: int = 0 50 | self.total_dur: Union[None, int] = None 51 | if FfmpegProgress._uses_error_loglevel(self.cmd): 52 | self.total_dur = FfmpegProgress._probe_duration(self.cmd) 53 | 54 | def _process_output( 55 | self, 56 | stderr_line: str, 57 | stderr: List[str], 58 | duration_override: Union[float, None], 59 | ) -> Union[float, None]: 60 | """ 61 | Process the output of the ffmpeg command. 62 | 63 | Args: 64 | stderr_line (str): The line of stderr output. 65 | stderr (List[str]): The list of stderr output. 66 | duration_override (Union[float, None]): The duration of the video in seconds. 67 | 68 | Returns: 69 | Union[float, None]: The progress in percent. 70 | """ 71 | 72 | if self.stderr_callback: 73 | self.stderr_callback(stderr_line) 74 | 75 | stderr.append(stderr_line.strip()) 76 | self.stderr = "\n".join(stderr) 77 | 78 | progress: Union[float, None] = None 79 | # assign the total duration if it was found. this can happen multiple times for multiple inputs, 80 | # in which case we have to determine the overall duration by taking the min/max (dependent on -shortest being present) 81 | if ( 82 | current_dur_match := self.DUR_REGEX.search(stderr_line) 83 | ) and duration_override is None: 84 | input_options = self.inputs_with_options[self.current_input_idx] 85 | current_dur_ms: int = to_ms(**current_dur_match.groupdict()) 86 | # if the previous line had "image2", it's a single image and we assume a really short intrinsic duration (4ms), 87 | # but if it's a loop, we assume infinity 88 | if "image2" in stderr[-2] and "-loop 1" in " ".join(input_options): 89 | current_dur_ms = 2**64 90 | if "-shortest" in self.cmd: 91 | self.total_dur = ( 92 | min(self.total_dur, current_dur_ms) 93 | if self.total_dur is not None 94 | else current_dur_ms 95 | ) 96 | else: 97 | self.total_dur = ( 98 | max(self.total_dur, current_dur_ms) 99 | if self.total_dur is not None 100 | else current_dur_ms 101 | ) 102 | self.current_input_idx += 1 103 | 104 | if ( 105 | progress_time := self.TIME_REGEX.search(stderr_line) 106 | ) and self.total_dur is not None: 107 | elapsed_time = to_ms(**progress_time.groupdict()) 108 | progress = min(max(round(elapsed_time / self.total_dur * 100, 2), 0), 100) 109 | 110 | return progress 111 | 112 | @staticmethod 113 | def _probe_duration(cmd: List[str]) -> Optional[int]: 114 | """ 115 | Get the duration via ffprobe from input media file 116 | in case ffmpeg was run with loglevel=error. 117 | 118 | Args: 119 | cmd (List[str]): A list of command line elements, e.g. ["ffmpeg", "-i", ...] 120 | 121 | Returns: 122 | Optional[int]: The duration in milliseconds. 123 | """ 124 | file_names = [] 125 | for i, arg in enumerate(cmd): 126 | if arg == "-i": 127 | file_name = cmd[i + 1] 128 | 129 | # filter for filenames that we can probe, i.e. regular files 130 | if os.path.isfile(file_name): 131 | file_names.append(file_name) 132 | 133 | if len(file_names) == 0: 134 | return None 135 | 136 | durations = [] 137 | 138 | for file_name in file_names: 139 | try: 140 | output = subprocess.check_output( 141 | [ 142 | "ffprobe", 143 | "-loglevel", 144 | "error", 145 | "-hide_banner", 146 | "-show_entries", 147 | "format=duration", 148 | "-of", 149 | "default=noprint_wrappers=1:nokey=1", 150 | file_name, 151 | ], 152 | universal_newlines=True, 153 | ) 154 | durations.append(int(float(output.strip()) * 1000)) 155 | except Exception: 156 | # TODO: add logging 157 | return None 158 | 159 | return max(durations) if "-shortest" not in cmd else min(durations) 160 | 161 | @staticmethod 162 | def _uses_error_loglevel(cmd: List[str]) -> bool: 163 | try: 164 | idx = cmd.index("-loglevel") 165 | if cmd[idx + 1] == "error": 166 | return True 167 | else: 168 | return False 169 | except ValueError: 170 | return False 171 | 172 | @staticmethod 173 | def _get_inputs_with_options(cmd: List[str]) -> List[List[str]]: 174 | """ 175 | Collect all inputs with their options. 176 | For example, input is: 177 | 178 | ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 -filter_complex ... 179 | 180 | Output is: 181 | 182 | [ 183 | ["-i", "input1.mp4"], 184 | ["-i", "input2.mp4"], 185 | ["-i", "input3.mp4"], 186 | ] 187 | 188 | Another example: 189 | 190 | ffmpeg -f lavfi -i color=c=black:s=1920x1080 -loop 1 -i image.png -filter_complex ... 191 | 192 | Output is: 193 | 194 | [ 195 | ["-f", "lavfi", "-i", "color=c=black:s=1920x1080"], 196 | ["-loop", "1", "-i", "image.png"], 197 | ] 198 | """ 199 | inputs = [] 200 | prev_index = 0 201 | for i, arg in enumerate(cmd): 202 | if arg == "-i": 203 | inputs.append(cmd[prev_index : i + 2]) 204 | prev_index = i + 2 205 | 206 | return inputs 207 | 208 | def run_command_with_progress( 209 | self, popen_kwargs=None, duration_override: Union[float, None] = None 210 | ) -> Iterator[float]: 211 | """ 212 | Run an ffmpeg command, trying to capture the process output and calculate 213 | the duration / progress. 214 | Yields the progress in percent. 215 | 216 | Args: 217 | popen_kwargs (dict, optional): A dict to specify extra arguments to the popen call, e.g. { creationflags: CREATE_NO_WINDOW } 218 | duration_override (float, optional): The duration in seconds. If not specified, it will be calculated from the ffmpeg output. 219 | 220 | Raises: 221 | RuntimeError: If the command fails, an exception is raised. 222 | 223 | Yields: 224 | Iterator[float]: A generator that yields the progress in percent. 225 | """ 226 | if self.dry_run: 227 | yield from [0, 100] 228 | return 229 | 230 | if duration_override: 231 | self.total_dur = int(duration_override * 1000) 232 | 233 | base_popen_kwargs = self.base_popen_kwargs.copy() 234 | if popen_kwargs is not None: 235 | base_popen_kwargs.update(popen_kwargs) 236 | 237 | self.process = subprocess.Popen(self.cmd_with_progress, **base_popen_kwargs) # type: ignore 238 | 239 | yield 0 240 | 241 | stderr: List[str] = [] 242 | while True: 243 | if self.process.stdout is None: 244 | continue 245 | 246 | stderr_line: str = ( 247 | self.process.stdout.readline().decode("utf-8", errors="replace").strip() 248 | ) 249 | 250 | if stderr_line == "" and self.process.poll() is not None: 251 | break 252 | 253 | progress = self._process_output(stderr_line, stderr, duration_override) 254 | if progress is not None: 255 | yield progress 256 | 257 | if self.process.returncode != 0: 258 | raise RuntimeError(f"Error running command {self.cmd}: {self.stderr}") 259 | 260 | yield 100 261 | self.process = None 262 | 263 | async def async_run_command_with_progress( 264 | self, popen_kwargs=None, duration_override: Union[float, None] = None 265 | ) -> AsyncIterator[float]: 266 | """ 267 | Asynchronously run an ffmpeg command, trying to capture the process output and calculate 268 | the duration / progress. 269 | Yields the progress in percent. 270 | 271 | Args: 272 | popen_kwargs (dict, optional): A dict to specify extra arguments to the popen call, e.g. { creationflags: CREATE_NO_WINDOW } 273 | duration_override (float, optional): The duration in seconds. If not specified, it will be calculated from the ffmpeg output. 274 | 275 | Raises: 276 | RuntimeError: If the command fails, an exception is raised. 277 | """ 278 | if self.dry_run: 279 | yield 0 280 | yield 100 281 | return 282 | 283 | if duration_override: 284 | self.total_dur = int(duration_override * 1000) 285 | 286 | base_popen_kwargs = self.base_popen_kwargs.copy() 287 | if popen_kwargs is not None: 288 | base_popen_kwargs.update(popen_kwargs) 289 | 290 | # Remove stdout and stderr from base_popen_kwargs as we're setting them explicitly 291 | base_popen_kwargs.pop("stdout", None) 292 | base_popen_kwargs.pop("stderr", None) 293 | 294 | self.process = await asyncio.create_subprocess_exec( 295 | *self.cmd_with_progress, 296 | stdout=asyncio.subprocess.PIPE, 297 | stderr=asyncio.subprocess.STDOUT, 298 | **base_popen_kwargs, # type: ignore 299 | ) 300 | 301 | yield 0 302 | 303 | stderr: List[str] = [] 304 | while True: 305 | if self.process.stdout is None: 306 | continue 307 | 308 | stderr_line: Union[bytes, None] = await self.process.stdout.readline() 309 | if not stderr_line: 310 | # Process has finished, check the return code 311 | await self.process.wait() 312 | if self.process.returncode != 0: 313 | raise RuntimeError( 314 | f"Error running command {self.cmd}: {self.stderr}" 315 | ) 316 | break 317 | stderr_line_str = stderr_line.decode("utf-8", errors="replace").strip() 318 | 319 | progress = self._process_output(stderr_line_str, stderr, duration_override) 320 | if progress is not None: 321 | yield progress 322 | 323 | yield 100 324 | self.process = None 325 | 326 | def quit_gracefully(self) -> None: 327 | """ 328 | Quit the ffmpeg process by sending 'q' 329 | 330 | Raises: 331 | RuntimeError: If no process is found. 332 | """ 333 | if self.process is None: 334 | raise RuntimeError("No process found. Did you run the command?") 335 | 336 | self.process.communicate(input=b"q") 337 | self.process.kill() 338 | self.process = None 339 | 340 | def quit(self) -> None: 341 | """ 342 | Quit the ffmpeg process by sending SIGKILL. 343 | 344 | Raises: 345 | RuntimeError: If no process is found. 346 | """ 347 | if self.process is None: 348 | raise RuntimeError("No process found. Did you run the command?") 349 | 350 | self.process.kill() 351 | self.process = None 352 | 353 | async def async_quit_gracefully(self) -> None: 354 | """ 355 | Quit the ffmpeg process by sending 'q' asynchronously 356 | 357 | Raises: 358 | RuntimeError: If no process is found. 359 | """ 360 | if self.process is None: 361 | raise RuntimeError("No process found. Did you run the command?") 362 | 363 | self.process.stdin.write(b"q") 364 | await self.process.stdin.drain() 365 | await self.process.wait() 366 | self.process = None 367 | 368 | async def async_quit(self) -> None: 369 | """ 370 | Quit the ffmpeg process by sending SIGKILL asynchronously. 371 | 372 | Raises: 373 | RuntimeError: If no process is found. 374 | """ 375 | if self.process is None: 376 | raise RuntimeError("No process found. Did you run the command?") 377 | 378 | self.process.kill() 379 | await self.process.wait() 380 | self.process = None 381 | 382 | def set_stderr_callback(self, callback: Callable[[str], None]) -> None: 383 | """ 384 | Set a callback function to be called on stderr output. 385 | The callback function must accept a single string argument. 386 | Note that this is called on every line of stderr output, so it can be called a lot. 387 | Also note that stdout/stderr are joined into one stream, so you might get stdout output in the callback. 388 | 389 | Args: 390 | callback (Callable[[str], None]): A callback function that accepts a single string argument. 391 | """ 392 | if not callable(callback) or len(callback.__code__.co_varnames) != 1: 393 | raise ValueError( 394 | "Callback must be a function that accepts only one argument" 395 | ) 396 | 397 | self.stderr_callback = callback 398 | -------------------------------------------------------------------------------- /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/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": "(cmd: List[str], dry_run: 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.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.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": 38, "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.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.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": 22, "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.cmd": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.stderr": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.dry_run": {"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": 21}}}}}}}}}}}}}}, "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}}, "df": 2}}}}, "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}}}, "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.process": {"tf": 1}}, "df": 1}}}}, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"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": 3}}}}}}}, "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}}}}}, "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.cmd": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.stderr": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.dry_run": {"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": 22, "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.cmd": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.stderr": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.dry_run": {"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": 21}}}}}}}}}}}}}}, "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.cmd": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.stderr": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.dry_run": {"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.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": 22}}}}}, "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.cmd": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.stderr": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.dry_run": {"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": 22}}}}}, "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}}, "df": 2}}}}, "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}}}, "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": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.DUR_REGEX": {"tf": 2}, "ffmpeg_progress_yield.FfmpegProgress.TIME_REGEX": {"tf": 2}}, "df": 2, "r": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.DUR_REGEX": {"tf": 1}, "ffmpeg_progress_yield.FfmpegProgress.TIME_REGEX": {"tf": 1}}, "df": 2}}, "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}}, "df": 2}}}}}}}, "x": {"2": {"7": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.DUR_REGEX": {"tf": 1.4142135623730951}, "ffmpeg_progress_yield.FfmpegProgress.TIME_REGEX": {"tf": 1.4142135623730951}}, "df": 2}, "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}}}}}}, "signature": {"root": {"docs": {"ffmpeg_progress_yield.FfmpegProgress.__init__": {"tf": 5.5677643628300215}, "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}}, "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}}, "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}}}}}, "p": {"docs": {}, "df": 0, "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.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.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": 22, "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 | })(); --------------------------------------------------------------------------------