From ed231bb6acab60abfd1340a78c02621996b590d6 Mon Sep 17 00:00:00 2001 From: Werner Robitza Date: Fri, 22 Nov 2024 19:50:30 +0100 Subject: [PATCH] Bump version to 1.30.0 --- CHANGELOG.md | 23 + docs/ffmpeg_normalize.html | 3628 +++++++++++++++++----------------- docs/search.js | 2 +- ffmpeg_normalize/_version.py | 2 +- 4 files changed, 1849 insertions(+), 1806 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bc4a7fd..0cb755b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,29 @@ # Changelog +## v1.30.0 (2024-11-22) + +* Change lower-only message to warning. + +* Make setup name PEP 625 compliant. + +* Docs: add @ahmetsait as a contributor. + +* Implement `--lower-only` + +* Fix: `--print-stats` only outputs the last stream. + +* More robust `loudnorm` output parsing. + +* Remove unnecessary conversions. + +* Update .editorconfig. + +* Remove python 3.8, add python 3.12, 3.13. + +* Add README on file size. + + ## v1.29.2 (2024-11-18) * Fix: show percentage with two decimal digits in progress. diff --git a/docs/ffmpeg_normalize.html b/docs/ffmpeg_normalize.html index c973d71..81d8e87 100644 --- a/docs/ffmpeg_normalize.html +++ b/docs/ffmpeg_normalize.html @@ -56,6 +56,9 @@

API Documentation

  • offset
  • +
  • + lower_only +
  • dual_mono
  • @@ -170,6 +173,9 @@

    API Documentation

  • run_normalization
  • +
  • + get_stats +
  • @@ -314,217 +320,221 @@

    -
     49class FFmpegNormalize:
    - 50    """
    - 51    ffmpeg-normalize class.
    - 52
    - 53    Args:
    - 54        normalization_type (str, optional): Normalization type. Defaults to "ebu".
    - 55        target_level (float, optional): Target level. Defaults to -23.0.
    - 56        print_stats (bool, optional): Print loudnorm stats. Defaults to False.
    - 57        loudness_range_target (float, optional): Loudness range target. Defaults to 7.0.
    - 58        keep_loudness_range_target (bool, optional): Keep loudness range target. Defaults to False.
    - 59        keep_lra_above_loudness_range_target (bool, optional): Keep input loudness range above loudness range target. Defaults to False.
    - 60        true_peak (float, optional): True peak. Defaults to -2.0.
    - 61        offset (float, optional): Offset. Defaults to 0.0.
    - 62        dual_mono (bool, optional): Dual mono. Defaults to False.
    - 63        dynamic (bool, optional): Dynamic. Defaults to False.
    - 64        audio_codec (str, optional): Audio codec. Defaults to "pcm_s16le".
    - 65        audio_bitrate (float, optional): Audio bitrate. Defaults to None.
    - 66        sample_rate (int, optional): Sample rate. Defaults to None.
    - 67        audio_channels (int | None, optional): Audio channels. Defaults to None.
    - 68        keep_original_audio (bool, optional): Keep original audio. Defaults to False.
    - 69        pre_filter (str, optional): Pre filter. Defaults to None.
    - 70        post_filter (str, optional): Post filter. Defaults to None.
    - 71        video_codec (str, optional): Video codec. Defaults to "copy".
    - 72        video_disable (bool, optional): Disable video. Defaults to False.
    - 73        subtitle_disable (bool, optional): Disable subtitles. Defaults to False.
    - 74        metadata_disable (bool, optional): Disable metadata. Defaults to False.
    - 75        chapters_disable (bool, optional): Disable chapters. Defaults to False.
    - 76        extra_input_options (list, optional): Extra input options. Defaults to None.
    - 77        extra_output_options (list, optional): Extra output options. Defaults to None.
    - 78        output_format (str, optional): Output format. Defaults to None.
    - 79        dry_run (bool, optional): Dry run. Defaults to False.
    - 80        debug (bool, optional): Debug. Defaults to False.
    - 81        progress (bool, optional): Progress. Defaults to False.
    - 82
    - 83    Raises:
    - 84        FFmpegNormalizeError: If the ffmpeg executable is not found or does not support the loudnorm filter.
    - 85    """
    - 86
    - 87    def __init__(
    - 88        self,
    - 89        normalization_type: Literal["ebu", "rms", "peak"] = "ebu",
    - 90        target_level: float = -23.0,
    - 91        print_stats: bool = False,
    - 92        # threshold=0.5,
    - 93        loudness_range_target: float = 7.0,
    - 94        keep_loudness_range_target: bool = False,
    - 95        keep_lra_above_loudness_range_target: bool = False,
    - 96        true_peak: float = -2.0,
    - 97        offset: float = 0.0,
    - 98        dual_mono: bool = False,
    - 99        dynamic: bool = False,
    -100        audio_codec: str = "pcm_s16le",
    -101        audio_bitrate: float | None = None,
    -102        sample_rate: float | int | None = None,
    -103        audio_channels: int | None = None,
    -104        keep_original_audio: bool = False,
    -105        pre_filter: str | None = None,
    -106        post_filter: str | None = None,
    -107        video_codec: str = "copy",
    -108        video_disable: bool = False,
    -109        subtitle_disable: bool = False,
    -110        metadata_disable: bool = False,
    -111        chapters_disable: bool = False,
    -112        extra_input_options: list[str] | None = None,
    -113        extra_output_options: list[str] | None = None,
    -114        output_format: str | None = None,
    -115        dry_run: bool = False,
    -116        debug: bool = False,
    -117        progress: bool = False,
    -118    ):
    -119        self.ffmpeg_exe = get_ffmpeg_exe()
    -120        self.has_loudnorm_capabilities = ffmpeg_has_loudnorm()
    -121
    -122        if normalization_type not in NORMALIZATION_TYPES:
    -123            raise FFmpegNormalizeError(
    -124                "Normalization type must be: 'ebu', 'rms', or 'peak'"
    -125            )
    -126        self.normalization_type = normalization_type
    -127
    -128        if not self.has_loudnorm_capabilities and self.normalization_type == "ebu":
    -129            raise FFmpegNormalizeError(
    -130                "Your ffmpeg does not support the 'loudnorm' EBU R128 filter. "
    -131                "Please install ffmpeg v4.2 or above, or choose another normalization type."
    -132            )
    -133
    -134        if self.normalization_type == "ebu":
    -135            self.target_level = check_range(target_level, -70, -5, name="target_level")
    -136        else:
    -137            self.target_level = check_range(target_level, -99, 0, name="target_level")
    -138
    -139        self.print_stats = print_stats
    -140
    -141        # self.threshold = float(threshold)
    +            
     51class FFmpegNormalize:
    + 52    """
    + 53    ffmpeg-normalize class.
    + 54
    + 55    Args:
    + 56        normalization_type (str, optional): Normalization type. Defaults to "ebu".
    + 57        target_level (float, optional): Target level. Defaults to -23.0.
    + 58        print_stats (bool, optional): Print loudnorm stats. Defaults to False.
    + 59        loudness_range_target (float, optional): Loudness range target. Defaults to 7.0.
    + 60        keep_loudness_range_target (bool, optional): Keep loudness range target. Defaults to False.
    + 61        keep_lra_above_loudness_range_target (bool, optional): Keep input loudness range above loudness range target. Defaults to False.
    + 62        true_peak (float, optional): True peak. Defaults to -2.0.
    + 63        offset (float, optional): Offset. Defaults to 0.0.
    + 64        lower_only (bool, optional): Whether the audio should not increase in loudness. Defaults to False.
    + 65        dual_mono (bool, optional): Dual mono. Defaults to False.
    + 66        dynamic (bool, optional): Dynamic. Defaults to False.
    + 67        audio_codec (str, optional): Audio codec. Defaults to "pcm_s16le".
    + 68        audio_bitrate (float, optional): Audio bitrate. Defaults to None.
    + 69        sample_rate (int, optional): Sample rate. Defaults to None.
    + 70        audio_channels (int | None, optional): Audio channels. Defaults to None.
    + 71        keep_original_audio (bool, optional): Keep original audio. Defaults to False.
    + 72        pre_filter (str, optional): Pre filter. Defaults to None.
    + 73        post_filter (str, optional): Post filter. Defaults to None.
    + 74        video_codec (str, optional): Video codec. Defaults to "copy".
    + 75        video_disable (bool, optional): Disable video. Defaults to False.
    + 76        subtitle_disable (bool, optional): Disable subtitles. Defaults to False.
    + 77        metadata_disable (bool, optional): Disable metadata. Defaults to False.
    + 78        chapters_disable (bool, optional): Disable chapters. Defaults to False.
    + 79        extra_input_options (list, optional): Extra input options. Defaults to None.
    + 80        extra_output_options (list, optional): Extra output options. Defaults to None.
    + 81        output_format (str, optional): Output format. Defaults to None.
    + 82        dry_run (bool, optional): Dry run. Defaults to False.
    + 83        debug (bool, optional): Debug. Defaults to False.
    + 84        progress (bool, optional): Progress. Defaults to False.
    + 85
    + 86    Raises:
    + 87        FFmpegNormalizeError: If the ffmpeg executable is not found or does not support the loudnorm filter.
    + 88    """
    + 89
    + 90    def __init__(
    + 91        self,
    + 92        normalization_type: Literal["ebu", "rms", "peak"] = "ebu",
    + 93        target_level: float = -23.0,
    + 94        print_stats: bool = False,
    + 95        # threshold=0.5,
    + 96        loudness_range_target: float = 7.0,
    + 97        keep_loudness_range_target: bool = False,
    + 98        keep_lra_above_loudness_range_target: bool = False,
    + 99        true_peak: float = -2.0,
    +100        offset: float = 0.0,
    +101        lower_only: bool = False,
    +102        dual_mono: bool = False,
    +103        dynamic: bool = False,
    +104        audio_codec: str = "pcm_s16le",
    +105        audio_bitrate: float | None = None,
    +106        sample_rate: float | int | None = None,
    +107        audio_channels: int | None = None,
    +108        keep_original_audio: bool = False,
    +109        pre_filter: str | None = None,
    +110        post_filter: str | None = None,
    +111        video_codec: str = "copy",
    +112        video_disable: bool = False,
    +113        subtitle_disable: bool = False,
    +114        metadata_disable: bool = False,
    +115        chapters_disable: bool = False,
    +116        extra_input_options: list[str] | None = None,
    +117        extra_output_options: list[str] | None = None,
    +118        output_format: str | None = None,
    +119        dry_run: bool = False,
    +120        debug: bool = False,
    +121        progress: bool = False,
    +122    ):
    +123        self.ffmpeg_exe = get_ffmpeg_exe()
    +124        self.has_loudnorm_capabilities = ffmpeg_has_loudnorm()
    +125
    +126        if normalization_type not in NORMALIZATION_TYPES:
    +127            raise FFmpegNormalizeError(
    +128                "Normalization type must be: 'ebu', 'rms', or 'peak'"
    +129            )
    +130        self.normalization_type = normalization_type
    +131
    +132        if not self.has_loudnorm_capabilities and self.normalization_type == "ebu":
    +133            raise FFmpegNormalizeError(
    +134                "Your ffmpeg does not support the 'loudnorm' EBU R128 filter. "
    +135                "Please install ffmpeg v4.2 or above, or choose another normalization type."
    +136            )
    +137
    +138        if self.normalization_type == "ebu":
    +139            self.target_level = check_range(target_level, -70, -5, name="target_level")
    +140        else:
    +141            self.target_level = check_range(target_level, -99, 0, name="target_level")
     142
    -143        self.loudness_range_target = check_range(
    -144            loudness_range_target, 1, 50, name="loudness_range_target"
    -145        )
    +143        self.print_stats = print_stats
    +144
    +145        # self.threshold = float(threshold)
     146
    -147        self.keep_loudness_range_target = keep_loudness_range_target
    -148
    -149        if self.keep_loudness_range_target and loudness_range_target != 7.0:
    -150            _logger.warning(
    -151                "Setting --keep-loudness-range-target will override your set loudness range target value! "
    -152                "Remove --keep-loudness-range-target or remove the --lrt/--loudness-range-target option."
    -153            )
    -154
    -155        self.keep_lra_above_loudness_range_target = keep_lra_above_loudness_range_target
    -156
    -157        if (
    -158            self.keep_loudness_range_target
    -159            and self.keep_lra_above_loudness_range_target
    -160        ):
    -161            raise FFmpegNormalizeError(
    -162                "Options --keep-loudness-range-target and --keep-lra-above-loudness-range-target are mutually exclusive! "
    -163                "Please choose just one of the two options."
    -164            )
    -165
    -166        self.true_peak = check_range(true_peak, -9, 0, name="true_peak")
    -167        self.offset = check_range(offset, -99, 99, name="offset")
    -168
    -169        # Ensure library user is passing correct types
    -170        assert isinstance(dual_mono, bool), "dual_mono must be bool"
    -171        assert isinstance(dynamic, bool), "dynamic must be bool"
    -172
    -173        self.dual_mono = dual_mono
    -174        self.dynamic = dynamic
    -175        self.sample_rate = None if sample_rate is None else int(sample_rate)
    -176        self.audio_channels = None if audio_channels is None else int(audio_channels)
    +147        self.loudness_range_target = check_range(
    +148            loudness_range_target, 1, 50, name="loudness_range_target"
    +149        )
    +150
    +151        self.keep_loudness_range_target = keep_loudness_range_target
    +152
    +153        if self.keep_loudness_range_target and loudness_range_target != 7.0:
    +154            _logger.warning(
    +155                "Setting --keep-loudness-range-target will override your set loudness range target value! "
    +156                "Remove --keep-loudness-range-target or remove the --lrt/--loudness-range-target option."
    +157            )
    +158
    +159        self.keep_lra_above_loudness_range_target = keep_lra_above_loudness_range_target
    +160
    +161        if (
    +162            self.keep_loudness_range_target
    +163            and self.keep_lra_above_loudness_range_target
    +164        ):
    +165            raise FFmpegNormalizeError(
    +166                "Options --keep-loudness-range-target and --keep-lra-above-loudness-range-target are mutually exclusive! "
    +167                "Please choose just one of the two options."
    +168            )
    +169
    +170        self.true_peak = check_range(true_peak, -9, 0, name="true_peak")
    +171        self.offset = check_range(offset, -99, 99, name="offset")
    +172        self.lower_only = lower_only
    +173
    +174        # Ensure library user is passing correct types
    +175        assert isinstance(dual_mono, bool), "dual_mono must be bool"
    +176        assert isinstance(dynamic, bool), "dynamic must be bool"
     177
    -178        self.audio_codec = audio_codec
    -179        self.audio_bitrate = audio_bitrate
    -180        self.keep_original_audio = keep_original_audio
    -181        self.video_codec = video_codec
    -182        self.video_disable = video_disable
    -183        self.subtitle_disable = subtitle_disable
    -184        self.metadata_disable = metadata_disable
    -185        self.chapters_disable = chapters_disable
    -186
    -187        self.extra_input_options = extra_input_options
    -188        self.extra_output_options = extra_output_options
    -189        self.pre_filter = pre_filter
    -190        self.post_filter = post_filter
    +178        self.dual_mono = dual_mono
    +179        self.dynamic = dynamic
    +180        self.sample_rate = None if sample_rate is None else int(sample_rate)
    +181        self.audio_channels = None if audio_channels is None else int(audio_channels)
    +182
    +183        self.audio_codec = audio_codec
    +184        self.audio_bitrate = audio_bitrate
    +185        self.keep_original_audio = keep_original_audio
    +186        self.video_codec = video_codec
    +187        self.video_disable = video_disable
    +188        self.subtitle_disable = subtitle_disable
    +189        self.metadata_disable = metadata_disable
    +190        self.chapters_disable = chapters_disable
     191
    -192        self.output_format = output_format
    -193        self.dry_run = dry_run
    -194        self.debug = debug
    -195        self.progress = progress
    +192        self.extra_input_options = extra_input_options
    +193        self.extra_output_options = extra_output_options
    +194        self.pre_filter = pre_filter
    +195        self.post_filter = post_filter
     196
    -197        if (
    -198            self.audio_codec is None or "pcm" in self.audio_codec
    -199        ) and self.output_format in PCM_INCOMPATIBLE_FORMATS:
    -200            raise FFmpegNormalizeError(
    -201                f"Output format {self.output_format} does not support PCM audio. "
    -202                "Please choose a suitable audio codec with the -c:a option."
    -203            )
    -204
    -205        self.stats: list[LoudnessStatisticsWithMetadata] = []
    -206        self.media_files: list[MediaFile] = []
    -207        self.file_count = 0
    -208
    -209    def add_media_file(self, input_file: str, output_file: str) -> None:
    -210        """
    -211        Add a media file to normalize
    -212
    -213        Args:
    -214            input_file (str): Path to input file
    -215            output_file (str): Path to output file
    -216        """
    -217        if not os.path.exists(input_file):
    -218            raise FFmpegNormalizeError(f"file {input_file} does not exist")
    -219
    -220        ext = os.path.splitext(output_file)[1][1:]
    -221        if (
    -222            self.audio_codec is None or "pcm" in self.audio_codec
    -223        ) and ext in PCM_INCOMPATIBLE_EXTS:
    -224            raise FFmpegNormalizeError(
    -225                f"Output extension {ext} does not support PCM audio. "
    -226                "Please choose a suitable audio codec with the -c:a option."
    -227            )
    -228
    -229        self.media_files.append(MediaFile(self, input_file, output_file))
    -230        self.file_count += 1
    -231
    -232    def run_normalization(self) -> None:
    -233        """
    -234        Run the normalization procedures
    -235        """
    -236        for index, media_file in enumerate(
    -237            tqdm(self.media_files, desc="File", disable=not self.progress, position=0)
    -238        ):
    -239            _logger.info(
    -240                f"Normalizing file {media_file} ({index + 1} of {self.file_count})"
    -241            )
    -242
    -243            try:
    -244                media_file.run_normalization()
    -245            except Exception as e:
    -246                if len(self.media_files) > 1:
    -247                    # simply warn and do not die
    -248                    _logger.error(
    -249                        f"Error processing input file {media_file}, will "
    -250                        f"continue batch-processing. Error was: {e}"
    -251                    )
    -252                else:
    -253                    # raise the error so the program will exit
    -254                    raise e
    -255
    -256            _logger.info(f"Normalized file written to {media_file.output_file}")
    -257
    -258        if self.print_stats and self.stats:
    -259            print(json.dumps(self.stats, indent=4))
    +197        self.output_format = output_format
    +198        self.dry_run = dry_run
    +199        self.debug = debug
    +200        self.progress = progress
    +201
    +202        if (
    +203            self.audio_codec is None or "pcm" in self.audio_codec
    +204        ) and self.output_format in PCM_INCOMPATIBLE_FORMATS:
    +205            raise FFmpegNormalizeError(
    +206                f"Output format {self.output_format} does not support PCM audio. "
    +207                "Please choose a suitable audio codec with the -c:a option."
    +208            )
    +209
    +210        self.stats: list[LoudnessStatisticsWithMetadata] = []
    +211        self.media_files: list[MediaFile] = []
    +212        self.file_count = 0
    +213
    +214    def add_media_file(self, input_file: str, output_file: str) -> None:
    +215        """
    +216        Add a media file to normalize
    +217
    +218        Args:
    +219            input_file (str): Path to input file
    +220            output_file (str): Path to output file
    +221        """
    +222        if not os.path.exists(input_file):
    +223            raise FFmpegNormalizeError(f"file {input_file} does not exist")
    +224
    +225        ext = os.path.splitext(output_file)[1][1:]
    +226        if (
    +227            self.audio_codec is None or "pcm" in self.audio_codec
    +228        ) and ext in PCM_INCOMPATIBLE_EXTS:
    +229            raise FFmpegNormalizeError(
    +230                f"Output extension {ext} does not support PCM audio. "
    +231                "Please choose a suitable audio codec with the -c:a option."
    +232            )
    +233
    +234        self.media_files.append(MediaFile(self, input_file, output_file))
    +235        self.file_count += 1
    +236
    +237    def run_normalization(self) -> None:
    +238        """
    +239        Run the normalization procedures
    +240        """
    +241        for index, media_file in enumerate(
    +242            tqdm(self.media_files, desc="File", disable=not self.progress, position=0)
    +243        ):
    +244            _logger.info(
    +245                f"Normalizing file {media_file} ({index + 1} of {self.file_count})"
    +246            )
    +247
    +248            try:
    +249                media_file.run_normalization()
    +250            except Exception as e:
    +251                if len(self.media_files) > 1:
    +252                    # simply warn and do not die
    +253                    _logger.error(
    +254                        f"Error processing input file {media_file}, will "
    +255                        f"continue batch-processing. Error was: {e}"
    +256                    )
    +257                else:
    +258                    # raise the error so the program will exit
    +259                    raise e
    +260
    +261            _logger.info(f"Normalized file written to {media_file.output_file}")
    +262
    +263        if self.print_stats:
    +264            json.dump(list(chain.from_iterable(media_file.get_stats() for media_file in self.media_files)), sys.stdout, indent=4)
    +265            print()
     
    @@ -541,6 +551,7 @@
    Arguments:
  • keep_lra_above_loudness_range_target (bool, optional): Keep input loudness range above loudness range target. Defaults to False.
  • true_peak (float, optional): True peak. Defaults to -2.0.
  • offset (float, optional): Offset. Defaults to 0.0.
  • +
  • lower_only (bool, optional): Whether the audio should not increase in loudness. Defaults to False.
  • dual_mono (bool, optional): Dual mono. Defaults to False.
  • dynamic (bool, optional): Dynamic. Defaults to False.
  • audio_codec (str, optional): Audio codec. Defaults to "pcm_s16le".
  • @@ -575,133 +586,135 @@
    Raises:
    - FFmpegNormalize( normalization_type: Literal['ebu', 'rms', 'peak'] = 'ebu', target_level: float = -23.0, print_stats: bool = False, loudness_range_target: float = 7.0, keep_loudness_range_target: bool = False, keep_lra_above_loudness_range_target: bool = False, true_peak: float = -2.0, offset: float = 0.0, dual_mono: bool = False, dynamic: bool = False, audio_codec: str = 'pcm_s16le', audio_bitrate: float | None = None, sample_rate: float | int | None = None, audio_channels: int | None = None, keep_original_audio: bool = False, pre_filter: str | None = None, post_filter: str | None = None, video_codec: str = 'copy', video_disable: bool = False, subtitle_disable: bool = False, metadata_disable: bool = False, chapters_disable: bool = False, extra_input_options: list[str] | None = None, extra_output_options: list[str] | None = None, output_format: str | None = None, dry_run: bool = False, debug: bool = False, progress: bool = False) + FFmpegNormalize( normalization_type: Literal['ebu', 'rms', 'peak'] = 'ebu', target_level: float = -23.0, print_stats: bool = False, loudness_range_target: float = 7.0, keep_loudness_range_target: bool = False, keep_lra_above_loudness_range_target: bool = False, true_peak: float = -2.0, offset: float = 0.0, lower_only: bool = False, dual_mono: bool = False, dynamic: bool = False, audio_codec: str = 'pcm_s16le', audio_bitrate: float | None = None, sample_rate: float | int | None = None, audio_channels: int | None = None, keep_original_audio: bool = False, pre_filter: str | None = None, post_filter: str | None = None, video_codec: str = 'copy', video_disable: bool = False, subtitle_disable: bool = False, metadata_disable: bool = False, chapters_disable: bool = False, extra_input_options: list[str] | None = None, extra_output_options: list[str] | None = None, output_format: str | None = None, dry_run: bool = False, debug: bool = False, progress: bool = False)
    -
     87    def __init__(
    - 88        self,
    - 89        normalization_type: Literal["ebu", "rms", "peak"] = "ebu",
    - 90        target_level: float = -23.0,
    - 91        print_stats: bool = False,
    - 92        # threshold=0.5,
    - 93        loudness_range_target: float = 7.0,
    - 94        keep_loudness_range_target: bool = False,
    - 95        keep_lra_above_loudness_range_target: bool = False,
    - 96        true_peak: float = -2.0,
    - 97        offset: float = 0.0,
    - 98        dual_mono: bool = False,
    - 99        dynamic: bool = False,
    -100        audio_codec: str = "pcm_s16le",
    -101        audio_bitrate: float | None = None,
    -102        sample_rate: float | int | None = None,
    -103        audio_channels: int | None = None,
    -104        keep_original_audio: bool = False,
    -105        pre_filter: str | None = None,
    -106        post_filter: str | None = None,
    -107        video_codec: str = "copy",
    -108        video_disable: bool = False,
    -109        subtitle_disable: bool = False,
    -110        metadata_disable: bool = False,
    -111        chapters_disable: bool = False,
    -112        extra_input_options: list[str] | None = None,
    -113        extra_output_options: list[str] | None = None,
    -114        output_format: str | None = None,
    -115        dry_run: bool = False,
    -116        debug: bool = False,
    -117        progress: bool = False,
    -118    ):
    -119        self.ffmpeg_exe = get_ffmpeg_exe()
    -120        self.has_loudnorm_capabilities = ffmpeg_has_loudnorm()
    -121
    -122        if normalization_type not in NORMALIZATION_TYPES:
    -123            raise FFmpegNormalizeError(
    -124                "Normalization type must be: 'ebu', 'rms', or 'peak'"
    -125            )
    -126        self.normalization_type = normalization_type
    -127
    -128        if not self.has_loudnorm_capabilities and self.normalization_type == "ebu":
    -129            raise FFmpegNormalizeError(
    -130                "Your ffmpeg does not support the 'loudnorm' EBU R128 filter. "
    -131                "Please install ffmpeg v4.2 or above, or choose another normalization type."
    -132            )
    -133
    -134        if self.normalization_type == "ebu":
    -135            self.target_level = check_range(target_level, -70, -5, name="target_level")
    -136        else:
    -137            self.target_level = check_range(target_level, -99, 0, name="target_level")
    -138
    -139        self.print_stats = print_stats
    -140
    -141        # self.threshold = float(threshold)
    +            
     90    def __init__(
    + 91        self,
    + 92        normalization_type: Literal["ebu", "rms", "peak"] = "ebu",
    + 93        target_level: float = -23.0,
    + 94        print_stats: bool = False,
    + 95        # threshold=0.5,
    + 96        loudness_range_target: float = 7.0,
    + 97        keep_loudness_range_target: bool = False,
    + 98        keep_lra_above_loudness_range_target: bool = False,
    + 99        true_peak: float = -2.0,
    +100        offset: float = 0.0,
    +101        lower_only: bool = False,
    +102        dual_mono: bool = False,
    +103        dynamic: bool = False,
    +104        audio_codec: str = "pcm_s16le",
    +105        audio_bitrate: float | None = None,
    +106        sample_rate: float | int | None = None,
    +107        audio_channels: int | None = None,
    +108        keep_original_audio: bool = False,
    +109        pre_filter: str | None = None,
    +110        post_filter: str | None = None,
    +111        video_codec: str = "copy",
    +112        video_disable: bool = False,
    +113        subtitle_disable: bool = False,
    +114        metadata_disable: bool = False,
    +115        chapters_disable: bool = False,
    +116        extra_input_options: list[str] | None = None,
    +117        extra_output_options: list[str] | None = None,
    +118        output_format: str | None = None,
    +119        dry_run: bool = False,
    +120        debug: bool = False,
    +121        progress: bool = False,
    +122    ):
    +123        self.ffmpeg_exe = get_ffmpeg_exe()
    +124        self.has_loudnorm_capabilities = ffmpeg_has_loudnorm()
    +125
    +126        if normalization_type not in NORMALIZATION_TYPES:
    +127            raise FFmpegNormalizeError(
    +128                "Normalization type must be: 'ebu', 'rms', or 'peak'"
    +129            )
    +130        self.normalization_type = normalization_type
    +131
    +132        if not self.has_loudnorm_capabilities and self.normalization_type == "ebu":
    +133            raise FFmpegNormalizeError(
    +134                "Your ffmpeg does not support the 'loudnorm' EBU R128 filter. "
    +135                "Please install ffmpeg v4.2 or above, or choose another normalization type."
    +136            )
    +137
    +138        if self.normalization_type == "ebu":
    +139            self.target_level = check_range(target_level, -70, -5, name="target_level")
    +140        else:
    +141            self.target_level = check_range(target_level, -99, 0, name="target_level")
     142
    -143        self.loudness_range_target = check_range(
    -144            loudness_range_target, 1, 50, name="loudness_range_target"
    -145        )
    +143        self.print_stats = print_stats
    +144
    +145        # self.threshold = float(threshold)
     146
    -147        self.keep_loudness_range_target = keep_loudness_range_target
    -148
    -149        if self.keep_loudness_range_target and loudness_range_target != 7.0:
    -150            _logger.warning(
    -151                "Setting --keep-loudness-range-target will override your set loudness range target value! "
    -152                "Remove --keep-loudness-range-target or remove the --lrt/--loudness-range-target option."
    -153            )
    -154
    -155        self.keep_lra_above_loudness_range_target = keep_lra_above_loudness_range_target
    -156
    -157        if (
    -158            self.keep_loudness_range_target
    -159            and self.keep_lra_above_loudness_range_target
    -160        ):
    -161            raise FFmpegNormalizeError(
    -162                "Options --keep-loudness-range-target and --keep-lra-above-loudness-range-target are mutually exclusive! "
    -163                "Please choose just one of the two options."
    -164            )
    -165
    -166        self.true_peak = check_range(true_peak, -9, 0, name="true_peak")
    -167        self.offset = check_range(offset, -99, 99, name="offset")
    -168
    -169        # Ensure library user is passing correct types
    -170        assert isinstance(dual_mono, bool), "dual_mono must be bool"
    -171        assert isinstance(dynamic, bool), "dynamic must be bool"
    -172
    -173        self.dual_mono = dual_mono
    -174        self.dynamic = dynamic
    -175        self.sample_rate = None if sample_rate is None else int(sample_rate)
    -176        self.audio_channels = None if audio_channels is None else int(audio_channels)
    +147        self.loudness_range_target = check_range(
    +148            loudness_range_target, 1, 50, name="loudness_range_target"
    +149        )
    +150
    +151        self.keep_loudness_range_target = keep_loudness_range_target
    +152
    +153        if self.keep_loudness_range_target and loudness_range_target != 7.0:
    +154            _logger.warning(
    +155                "Setting --keep-loudness-range-target will override your set loudness range target value! "
    +156                "Remove --keep-loudness-range-target or remove the --lrt/--loudness-range-target option."
    +157            )
    +158
    +159        self.keep_lra_above_loudness_range_target = keep_lra_above_loudness_range_target
    +160
    +161        if (
    +162            self.keep_loudness_range_target
    +163            and self.keep_lra_above_loudness_range_target
    +164        ):
    +165            raise FFmpegNormalizeError(
    +166                "Options --keep-loudness-range-target and --keep-lra-above-loudness-range-target are mutually exclusive! "
    +167                "Please choose just one of the two options."
    +168            )
    +169
    +170        self.true_peak = check_range(true_peak, -9, 0, name="true_peak")
    +171        self.offset = check_range(offset, -99, 99, name="offset")
    +172        self.lower_only = lower_only
    +173
    +174        # Ensure library user is passing correct types
    +175        assert isinstance(dual_mono, bool), "dual_mono must be bool"
    +176        assert isinstance(dynamic, bool), "dynamic must be bool"
     177
    -178        self.audio_codec = audio_codec
    -179        self.audio_bitrate = audio_bitrate
    -180        self.keep_original_audio = keep_original_audio
    -181        self.video_codec = video_codec
    -182        self.video_disable = video_disable
    -183        self.subtitle_disable = subtitle_disable
    -184        self.metadata_disable = metadata_disable
    -185        self.chapters_disable = chapters_disable
    -186
    -187        self.extra_input_options = extra_input_options
    -188        self.extra_output_options = extra_output_options
    -189        self.pre_filter = pre_filter
    -190        self.post_filter = post_filter
    +178        self.dual_mono = dual_mono
    +179        self.dynamic = dynamic
    +180        self.sample_rate = None if sample_rate is None else int(sample_rate)
    +181        self.audio_channels = None if audio_channels is None else int(audio_channels)
    +182
    +183        self.audio_codec = audio_codec
    +184        self.audio_bitrate = audio_bitrate
    +185        self.keep_original_audio = keep_original_audio
    +186        self.video_codec = video_codec
    +187        self.video_disable = video_disable
    +188        self.subtitle_disable = subtitle_disable
    +189        self.metadata_disable = metadata_disable
    +190        self.chapters_disable = chapters_disable
     191
    -192        self.output_format = output_format
    -193        self.dry_run = dry_run
    -194        self.debug = debug
    -195        self.progress = progress
    +192        self.extra_input_options = extra_input_options
    +193        self.extra_output_options = extra_output_options
    +194        self.pre_filter = pre_filter
    +195        self.post_filter = post_filter
     196
    -197        if (
    -198            self.audio_codec is None or "pcm" in self.audio_codec
    -199        ) and self.output_format in PCM_INCOMPATIBLE_FORMATS:
    -200            raise FFmpegNormalizeError(
    -201                f"Output format {self.output_format} does not support PCM audio. "
    -202                "Please choose a suitable audio codec with the -c:a option."
    -203            )
    -204
    -205        self.stats: list[LoudnessStatisticsWithMetadata] = []
    -206        self.media_files: list[MediaFile] = []
    -207        self.file_count = 0
    +197        self.output_format = output_format
    +198        self.dry_run = dry_run
    +199        self.debug = debug
    +200        self.progress = progress
    +201
    +202        if (
    +203            self.audio_codec is None or "pcm" in self.audio_codec
    +204        ) and self.output_format in PCM_INCOMPATIBLE_FORMATS:
    +205            raise FFmpegNormalizeError(
    +206                f"Output format {self.output_format} does not support PCM audio. "
    +207                "Please choose a suitable audio codec with the -c:a option."
    +208            )
    +209
    +210        self.stats: list[LoudnessStatisticsWithMetadata] = []
    +211        self.media_files: list[MediaFile] = []
    +212        self.file_count = 0
     
    @@ -806,6 +819,17 @@
    Raises:
    +
    +
    +
    + lower_only + + +
    + + + +
    @@ -1071,28 +1095,28 @@
    Raises:
    -
    209    def add_media_file(self, input_file: str, output_file: str) -> None:
    -210        """
    -211        Add a media file to normalize
    -212
    -213        Args:
    -214            input_file (str): Path to input file
    -215            output_file (str): Path to output file
    -216        """
    -217        if not os.path.exists(input_file):
    -218            raise FFmpegNormalizeError(f"file {input_file} does not exist")
    -219
    -220        ext = os.path.splitext(output_file)[1][1:]
    -221        if (
    -222            self.audio_codec is None or "pcm" in self.audio_codec
    -223        ) and ext in PCM_INCOMPATIBLE_EXTS:
    -224            raise FFmpegNormalizeError(
    -225                f"Output extension {ext} does not support PCM audio. "
    -226                "Please choose a suitable audio codec with the -c:a option."
    -227            )
    -228
    -229        self.media_files.append(MediaFile(self, input_file, output_file))
    -230        self.file_count += 1
    +            
    214    def add_media_file(self, input_file: str, output_file: str) -> None:
    +215        """
    +216        Add a media file to normalize
    +217
    +218        Args:
    +219            input_file (str): Path to input file
    +220            output_file (str): Path to output file
    +221        """
    +222        if not os.path.exists(input_file):
    +223            raise FFmpegNormalizeError(f"file {input_file} does not exist")
    +224
    +225        ext = os.path.splitext(output_file)[1][1:]
    +226        if (
    +227            self.audio_codec is None or "pcm" in self.audio_codec
    +228        ) and ext in PCM_INCOMPATIBLE_EXTS:
    +229            raise FFmpegNormalizeError(
    +230                f"Output extension {ext} does not support PCM audio. "
    +231                "Please choose a suitable audio codec with the -c:a option."
    +232            )
    +233
    +234        self.media_files.append(MediaFile(self, input_file, output_file))
    +235        self.file_count += 1
     
    @@ -1119,34 +1143,35 @@
    Arguments:
    -
    232    def run_normalization(self) -> None:
    -233        """
    -234        Run the normalization procedures
    -235        """
    -236        for index, media_file in enumerate(
    -237            tqdm(self.media_files, desc="File", disable=not self.progress, position=0)
    -238        ):
    -239            _logger.info(
    -240                f"Normalizing file {media_file} ({index + 1} of {self.file_count})"
    -241            )
    -242
    -243            try:
    -244                media_file.run_normalization()
    -245            except Exception as e:
    -246                if len(self.media_files) > 1:
    -247                    # simply warn and do not die
    -248                    _logger.error(
    -249                        f"Error processing input file {media_file}, will "
    -250                        f"continue batch-processing. Error was: {e}"
    -251                    )
    -252                else:
    -253                    # raise the error so the program will exit
    -254                    raise e
    -255
    -256            _logger.info(f"Normalized file written to {media_file.output_file}")
    -257
    -258        if self.print_stats and self.stats:
    -259            print(json.dumps(self.stats, indent=4))
    +            
    237    def run_normalization(self) -> None:
    +238        """
    +239        Run the normalization procedures
    +240        """
    +241        for index, media_file in enumerate(
    +242            tqdm(self.media_files, desc="File", disable=not self.progress, position=0)
    +243        ):
    +244            _logger.info(
    +245                f"Normalizing file {media_file} ({index + 1} of {self.file_count})"
    +246            )
    +247
    +248            try:
    +249                media_file.run_normalization()
    +250            except Exception as e:
    +251                if len(self.media_files) > 1:
    +252                    # simply warn and do not die
    +253                    _logger.error(
    +254                        f"Error processing input file {media_file}, will "
    +255                        f"continue batch-processing. Error was: {e}"
    +256                    )
    +257                else:
    +258                    # raise the error so the program will exit
    +259                    raise e
    +260
    +261            _logger.info(f"Normalized file written to {media_file.output_file}")
    +262
    +263        if self.print_stats:
    +264            json.dump(list(chain.from_iterable(media_file.get_stats() for media_file in self.media_files)), sys.stdout, indent=4)
    +265            print()
     
    @@ -1203,208 +1228,203 @@
    Inherited Members
    -
     46class MediaFile:
    - 47    """
    - 48    Class that holds a file, its streams and adjustments
    - 49    """
    - 50
    - 51    def __init__(
    - 52        self, ffmpeg_normalize: FFmpegNormalize, input_file: str, output_file: str
    - 53    ):
    - 54        """
    - 55        Initialize a media file for later normalization by parsing the streams.
    - 56
    - 57        Args:
    - 58            ffmpeg_normalize (FFmpegNormalize): reference to overall settings
    - 59            input_file (str): Path to input file
    - 60            output_file (str): Path to output file
    - 61        """
    - 62        self.ffmpeg_normalize = ffmpeg_normalize
    - 63        self.skip = False
    - 64        self.input_file = input_file
    - 65        self.output_file = output_file
    - 66        self.output_ext = os.path.splitext(output_file)[1][1:]
    - 67        self.streams: StreamDict = {"audio": {}, "video": {}, "subtitle": {}}
    - 68
    - 69        self.parse_streams()
    - 70
    - 71    def _stream_ids(self) -> list[int]:
    - 72        """
    - 73        Get all stream IDs of this file.
    - 74
    - 75        Returns:
    - 76            list: List of stream IDs
    - 77        """
    - 78        return (
    - 79            list(self.streams["audio"].keys())
    - 80            + list(self.streams["video"].keys())
    - 81            + list(self.streams["subtitle"].keys())
    - 82        )
    - 83
    - 84    def __repr__(self) -> str:
    - 85        return os.path.basename(self.input_file)
    - 86
    - 87    def parse_streams(self) -> None:
    - 88        """
    - 89        Try to parse all input streams from file and set them in self.streams.
    - 90
    - 91        Raises:
    - 92            FFmpegNormalizeError: If no audio streams are found
    - 93        """
    - 94        _logger.debug(f"Parsing streams of {self.input_file}")
    +            
     51class MediaFile:
    + 52    """
    + 53    Class that holds a file, its streams and adjustments
    + 54    """
    + 55
    + 56    def __init__(
    + 57        self, ffmpeg_normalize: FFmpegNormalize, input_file: str, output_file: str
    + 58    ):
    + 59        """
    + 60        Initialize a media file for later normalization by parsing the streams.
    + 61
    + 62        Args:
    + 63            ffmpeg_normalize (FFmpegNormalize): reference to overall settings
    + 64            input_file (str): Path to input file
    + 65            output_file (str): Path to output file
    + 66        """
    + 67        self.ffmpeg_normalize = ffmpeg_normalize
    + 68        self.skip = False
    + 69        self.input_file = input_file
    + 70        self.output_file = output_file
    + 71        self.output_ext = os.path.splitext(output_file)[1][1:]
    + 72        self.streams: StreamDict = {"audio": {}, "video": {}, "subtitle": {}}
    + 73
    + 74        self.parse_streams()
    + 75
    + 76    def _stream_ids(self) -> list[int]:
    + 77        """
    + 78        Get all stream IDs of this file.
    + 79
    + 80        Returns:
    + 81            list: List of stream IDs
    + 82        """
    + 83        return (
    + 84            list(self.streams["audio"].keys())
    + 85            + list(self.streams["video"].keys())
    + 86            + list(self.streams["subtitle"].keys())
    + 87        )
    + 88
    + 89    def __repr__(self) -> str:
    + 90        return os.path.basename(self.input_file)
    + 91
    + 92    def parse_streams(self) -> None:
    + 93        """
    + 94        Try to parse all input streams from file and set them in self.streams.
      95
    - 96        cmd = [
    - 97            self.ffmpeg_normalize.ffmpeg_exe,
    - 98            "-i",
    - 99            self.input_file,
    -100            "-c",
    -101            "copy",
    -102            "-t",
    -103            "0",
    -104            "-map",
    -105            "0",
    -106            "-f",
    -107            "null",
    -108            NUL,
    -109        ]
    -110
    -111        output = CommandRunner().run_command(cmd).get_output()
    -112
    -113        _logger.debug("Stream parsing command output:")
    -114        _logger.debug(output)
    + 96        Raises:
    + 97            FFmpegNormalizeError: If no audio streams are found
    + 98        """
    + 99        _logger.debug(f"Parsing streams of {self.input_file}")
    +100
    +101        cmd = [
    +102            self.ffmpeg_normalize.ffmpeg_exe,
    +103            "-i",
    +104            self.input_file,
    +105            "-c",
    +106            "copy",
    +107            "-t",
    +108            "0",
    +109            "-map",
    +110            "0",
    +111            "-f",
    +112            "null",
    +113            NUL,
    +114        ]
     115
    -116        output_lines = [line.strip() for line in output.split("\n")]
    +116        output = CommandRunner().run_command(cmd).get_output()
     117
    -118        duration = None
    -119        for line in output_lines:
    -120            if "Duration" in line:
    -121                if duration_search := DUR_REGEX.search(line):
    -122                    duration = _to_ms(**duration_search.groupdict()) / 1000
    -123                    _logger.debug(f"Found duration: {duration} s")
    -124                else:
    -125                    _logger.warning("Could not extract duration from input file!")
    -126
    -127            if not line.startswith("Stream"):
    -128                continue
    -129
    -130            if stream_id_match := re.search(r"#0:([\d]+)", line):
    -131                stream_id = int(stream_id_match.group(1))
    -132                if stream_id in self._stream_ids():
    -133                    continue
    -134            else:
    -135                continue
    -136
    -137            if "Audio" in line:
    -138                _logger.debug(f"Found audio stream at index {stream_id}")
    -139                sample_rate_match = re.search(r"(\d+) Hz", line)
    -140                sample_rate = (
    -141                    int(sample_rate_match.group(1)) if sample_rate_match else None
    -142                )
    -143                bit_depth_match = re.search(r"[sfu](\d+)(p|le|be)?", line)
    -144                bit_depth = int(bit_depth_match.group(1)) if bit_depth_match else None
    -145                self.streams["audio"][stream_id] = AudioStream(
    -146                    self.ffmpeg_normalize,
    -147                    self,
    -148                    stream_id,
    -149                    sample_rate,
    -150                    bit_depth,
    -151                    duration,
    -152                )
    -153
    -154            elif "Video" in line:
    -155                _logger.debug(f"Found video stream at index {stream_id}")
    -156                self.streams["video"][stream_id] = VideoStream(
    -157                    self.ffmpeg_normalize, self, stream_id
    -158                )
    -159
    -160            elif "Subtitle" in line:
    -161                _logger.debug(f"Found subtitle stream at index {stream_id}")
    -162                self.streams["subtitle"][stream_id] = SubtitleStream(
    -163                    self.ffmpeg_normalize, self, stream_id
    -164                )
    -165
    -166        if not self.streams["audio"]:
    -167            raise FFmpegNormalizeError(
    -168                f"Input file {self.input_file} does not contain any audio streams"
    -169            )
    +118        _logger.debug("Stream parsing command output:")
    +119        _logger.debug(output)
    +120
    +121        output_lines = [line.strip() for line in output.split("\n")]
    +122
    +123        duration = None
    +124        for line in output_lines:
    +125            if "Duration" in line:
    +126                if duration_search := DUR_REGEX.search(line):
    +127                    duration = _to_ms(**duration_search.groupdict()) / 1000
    +128                    _logger.debug(f"Found duration: {duration} s")
    +129                else:
    +130                    _logger.warning("Could not extract duration from input file!")
    +131
    +132            if not line.startswith("Stream"):
    +133                continue
    +134
    +135            if stream_id_match := re.search(r"#0:([\d]+)", line):
    +136                stream_id = int(stream_id_match.group(1))
    +137                if stream_id in self._stream_ids():
    +138                    continue
    +139            else:
    +140                continue
    +141
    +142            if "Audio" in line:
    +143                _logger.debug(f"Found audio stream at index {stream_id}")
    +144                sample_rate_match = re.search(r"(\d+) Hz", line)
    +145                sample_rate = (
    +146                    int(sample_rate_match.group(1)) if sample_rate_match else None
    +147                )
    +148                bit_depth_match = re.search(r"[sfu](\d+)(p|le|be)?", line)
    +149                bit_depth = int(bit_depth_match.group(1)) if bit_depth_match else None
    +150                self.streams["audio"][stream_id] = AudioStream(
    +151                    self.ffmpeg_normalize,
    +152                    self,
    +153                    stream_id,
    +154                    sample_rate,
    +155                    bit_depth,
    +156                    duration,
    +157                )
    +158
    +159            elif "Video" in line:
    +160                _logger.debug(f"Found video stream at index {stream_id}")
    +161                self.streams["video"][stream_id] = VideoStream(
    +162                    self.ffmpeg_normalize, self, stream_id
    +163                )
    +164
    +165            elif "Subtitle" in line:
    +166                _logger.debug(f"Found subtitle stream at index {stream_id}")
    +167                self.streams["subtitle"][stream_id] = SubtitleStream(
    +168                    self.ffmpeg_normalize, self, stream_id
    +169                )
     170
    -171        if (
    -172            self.output_ext.lower() in ONE_STREAM
    -173            and len(self.streams["audio"].values()) > 1
    -174        ):
    -175            _logger.warning(
    -176                "Output file only supports one stream. "
    -177                "Keeping only first audio stream."
    -178            )
    -179            first_stream = list(self.streams["audio"].values())[0]
    -180            self.streams["audio"] = {first_stream.stream_id: first_stream}
    -181            self.streams["video"] = {}
    -182            self.streams["subtitle"] = {}
    -183
    -184    def run_normalization(self) -> None:
    -185        """
    -186        Run the normalization process for this file.
    -187        """
    -188        _logger.debug(f"Running normalization for {self.input_file}")
    -189
    -190        # run the first pass to get loudness stats
    -191        self._first_pass()
    -192
    -193        # run the second pass as a whole
    -194        if self.ffmpeg_normalize.progress:
    -195            with tqdm(
    -196                total=100,
    -197                position=1,
    -198                desc="Second Pass",
    -199                bar_format=TQDM_BAR_FORMAT,
    -200            ) as pbar:
    -201                for progress in self._second_pass():
    -202                    pbar.update(progress - pbar.n)
    -203        else:
    -204            for _ in self._second_pass():
    -205                pass
    -206
    -207    def _can_write_output_video(self) -> bool:
    -208        """
    -209        Determine whether the output file can contain video at all.
    -210
    -211        Returns:
    -212            bool: True if the output file can contain video, False otherwise
    -213        """
    -214        if self.output_ext.lower() in AUDIO_ONLY_FORMATS:
    -215            return False
    -216
    -217        return not self.ffmpeg_normalize.video_disable
    -218
    -219    def _first_pass(self) -> None:
    -220        """
    -221        Run the first pass of the normalization process.
    -222        """
    -223        _logger.debug(f"Parsing normalization info for {self.input_file}")
    -224
    -225        for index, audio_stream in enumerate(self.streams["audio"].values()):
    -226            if self.ffmpeg_normalize.normalization_type == "ebu":
    -227                fun = getattr(audio_stream, "parse_loudnorm_stats")
    -228            else:
    -229                fun = getattr(audio_stream, "parse_astats")
    -230
    -231            if self.ffmpeg_normalize.progress:
    -232                with tqdm(
    -233                    total=100,
    -234                    position=1,
    -235                    desc=f"Stream {index + 1}/{len(self.streams['audio'].values())}",
    -236                    bar_format=TQDM_BAR_FORMAT,
    -237                ) as pbar:
    -238                    for progress in fun():
    -239                        pbar.update(progress - pbar.n)
    -240            else:
    -241                for _ in fun():
    -242                    pass
    -243
    -244        # set initial stats (for dry-runs, this is the only thing we need to do)
    -245        self.ffmpeg_normalize.stats = [
    -246            audio_stream.get_stats() for audio_stream in self.streams["audio"].values()
    -247        ]
    +171        if not self.streams["audio"]:
    +172            raise FFmpegNormalizeError(
    +173                f"Input file {self.input_file} does not contain any audio streams"
    +174            )
    +175
    +176        if (
    +177            self.output_ext.lower() in ONE_STREAM
    +178            and len(self.streams["audio"].values()) > 1
    +179        ):
    +180            _logger.warning(
    +181                "Output file only supports one stream. "
    +182                "Keeping only first audio stream."
    +183            )
    +184            first_stream = list(self.streams["audio"].values())[0]
    +185            self.streams["audio"] = {first_stream.stream_id: first_stream}
    +186            self.streams["video"] = {}
    +187            self.streams["subtitle"] = {}
    +188
    +189    def run_normalization(self) -> None:
    +190        """
    +191        Run the normalization process for this file.
    +192        """
    +193        _logger.debug(f"Running normalization for {self.input_file}")
    +194
    +195        # run the first pass to get loudness stats
    +196        self._first_pass()
    +197
    +198        # run the second pass as a whole
    +199        if self.ffmpeg_normalize.progress:
    +200            with tqdm(
    +201                total=100,
    +202                position=1,
    +203                desc="Second Pass",
    +204                bar_format=TQDM_BAR_FORMAT,
    +205            ) as pbar:
    +206                for progress in self._second_pass():
    +207                    pbar.update(progress - pbar.n)
    +208        else:
    +209            for _ in self._second_pass():
    +210                pass
    +211
    +212    def _can_write_output_video(self) -> bool:
    +213        """
    +214        Determine whether the output file can contain video at all.
    +215
    +216        Returns:
    +217            bool: True if the output file can contain video, False otherwise
    +218        """
    +219        if self.output_ext.lower() in AUDIO_ONLY_FORMATS:
    +220            return False
    +221
    +222        return not self.ffmpeg_normalize.video_disable
    +223
    +224    def _first_pass(self) -> None:
    +225        """
    +226        Run the first pass of the normalization process.
    +227        """
    +228        _logger.debug(f"Parsing normalization info for {self.input_file}")
    +229
    +230        for index, audio_stream in enumerate(self.streams["audio"].values()):
    +231            if self.ffmpeg_normalize.normalization_type == "ebu":
    +232                fun = getattr(audio_stream, "parse_loudnorm_stats")
    +233            else:
    +234                fun = getattr(audio_stream, "parse_astats")
    +235
    +236            if self.ffmpeg_normalize.progress:
    +237                with tqdm(
    +238                    total=100,
    +239                    position=1,
    +240                    desc=f"Stream {index + 1}/{len(self.streams['audio'].values())}",
    +241                    bar_format=TQDM_BAR_FORMAT,
    +242                ) as pbar:
    +243                    for progress in fun():
    +244                        pbar.update(progress - pbar.n)
    +245            else:
    +246                for _ in fun():
    +247                    pass
     248
     249    def _get_audio_filter_cmd(self) -> tuple[str, list[str]]:
     250        """
    @@ -1417,196 +1437,225 @@ 
    Inherited Members
    257 output_labels = [] 258 259 for audio_stream in self.streams["audio"].values(): -260 if self.ffmpeg_normalize.normalization_type == "ebu": -261 normalization_filter = audio_stream.get_second_pass_opts_ebu() -262 else: -263 normalization_filter = audio_stream.get_second_pass_opts_peakrms() -264 -265 input_label = f"[0:{audio_stream.stream_id}]" -266 output_label = f"[norm{audio_stream.stream_id}]" -267 output_labels.append(output_label) -268 -269 filter_chain = [] -270 -271 if self.ffmpeg_normalize.pre_filter: -272 filter_chain.append(self.ffmpeg_normalize.pre_filter) -273 -274 filter_chain.append(normalization_filter) -275 -276 if self.ffmpeg_normalize.post_filter: -277 filter_chain.append(self.ffmpeg_normalize.post_filter) -278 -279 filter_chains.append(input_label + ",".join(filter_chain) + output_label) -280 -281 filter_complex_cmd = ";".join(filter_chains) -282 -283 return filter_complex_cmd, output_labels -284 -285 def _second_pass(self) -> Iterator[float]: -286 """ -287 Construct the second pass command and run it. -288 -289 FIXME: make this method simpler -290 """ -291 _logger.info(f"Running second pass for {self.input_file}") -292 -293 # get the target output stream types depending on the options -294 output_stream_types: list[Literal["audio", "video", "subtitle"]] = ["audio"] -295 if self._can_write_output_video(): -296 output_stream_types.append("video") -297 if not self.ffmpeg_normalize.subtitle_disable: -298 output_stream_types.append("subtitle") -299 -300 # base command, here we will add all other options -301 cmd = [self.ffmpeg_normalize.ffmpeg_exe, "-hide_banner", "-y"] -302 -303 # extra options (if any) -304 if self.ffmpeg_normalize.extra_input_options: -305 cmd.extend(self.ffmpeg_normalize.extra_input_options) -306 -307 # get complex filter command -308 audio_filter_cmd, output_labels = self._get_audio_filter_cmd() -309 -310 # add input file and basic filter -311 cmd.extend(["-i", self.input_file, "-filter_complex", audio_filter_cmd]) +260 skip_normalization = False +261 if self.ffmpeg_normalize.lower_only: +262 if self.ffmpeg_normalize.normalization_type == "ebu": +263 if ( +264 audio_stream.loudness_statistics["ebu_pass1"] is not None +265 and audio_stream.loudness_statistics["ebu_pass1"]["input_i"] +266 < self.ffmpeg_normalize.target_level +267 ): +268 skip_normalization = True +269 elif self.ffmpeg_normalize.normalization_type == "peak": +270 if ( +271 audio_stream.loudness_statistics["max"] is not None +272 and audio_stream.loudness_statistics["max"] +273 < self.ffmpeg_normalize.target_level +274 ): +275 skip_normalization = True +276 elif self.ffmpeg_normalize.normalization_type == "rms": +277 if ( +278 audio_stream.loudness_statistics["mean"] is not None +279 and audio_stream.loudness_statistics["mean"] +280 < self.ffmpeg_normalize.target_level +281 ): +282 skip_normalization = True +283 +284 if skip_normalization: +285 _logger.warn( +286 f"Stream {audio_stream.stream_id} had measured input loudness lower than target, skipping normalization." +287 ) +288 normalization_filter = "acopy" +289 else: +290 if self.ffmpeg_normalize.normalization_type == "ebu": +291 normalization_filter = audio_stream.get_second_pass_opts_ebu() +292 else: +293 normalization_filter = audio_stream.get_second_pass_opts_peakrms() +294 +295 input_label = f"[0:{audio_stream.stream_id}]" +296 output_label = f"[norm{audio_stream.stream_id}]" +297 output_labels.append(output_label) +298 +299 filter_chain = [] +300 +301 if self.ffmpeg_normalize.pre_filter: +302 filter_chain.append(self.ffmpeg_normalize.pre_filter) +303 +304 filter_chain.append(normalization_filter) +305 +306 if self.ffmpeg_normalize.post_filter: +307 filter_chain.append(self.ffmpeg_normalize.post_filter) +308 +309 filter_chains.append(input_label + ",".join(filter_chain) + output_label) +310 +311 filter_complex_cmd = ";".join(filter_chains) 312 -313 # map metadata, only if needed -314 if self.ffmpeg_normalize.metadata_disable: -315 cmd.extend(["-map_metadata", "-1"]) -316 else: -317 # map global metadata -318 cmd.extend(["-map_metadata", "0"]) -319 # map per-stream metadata (e.g. language tags) -320 for stream_type in output_stream_types: -321 stream_key = stream_type[0] -322 if stream_type not in self.streams: -323 continue -324 for idx, _ in enumerate(self.streams[stream_type].items()): -325 cmd.extend( -326 [ -327 f"-map_metadata:s:{stream_key}:{idx}", -328 f"0:s:{stream_key}:{idx}", -329 ] -330 ) -331 -332 # map chapters if needed -333 if self.ffmpeg_normalize.chapters_disable: -334 cmd.extend(["-map_chapters", "-1"]) -335 else: -336 cmd.extend(["-map_chapters", "0"]) -337 -338 # collect all '-map' and codecs needed for output video based on input video -339 if self.streams["video"]: -340 if self._can_write_output_video(): -341 for s in self.streams["video"].keys(): -342 cmd.extend(["-map", f"0:{s}"]) -343 # set codec (copy by default) -344 cmd.extend(["-c:v", self.ffmpeg_normalize.video_codec]) -345 else: -346 if not self.ffmpeg_normalize.video_disable: -347 _logger.warning( -348 f"The chosen output extension {self.output_ext} does not support video/cover art. It will be disabled." -349 ) -350 -351 # ... and map the output of the normalization filters -352 for ol in output_labels: -353 cmd.extend(["-map", ol]) -354 -355 # set audio codec (never copy) -356 if self.ffmpeg_normalize.audio_codec: -357 cmd.extend(["-c:a", self.ffmpeg_normalize.audio_codec]) -358 else: -359 for index, (_, audio_stream) in enumerate(self.streams["audio"].items()): -360 cmd.extend([f"-c:a:{index}", audio_stream.get_pcm_codec()]) +313 return filter_complex_cmd, output_labels +314 +315 def _second_pass(self) -> Iterator[float]: +316 """ +317 Construct the second pass command and run it. +318 +319 FIXME: make this method simpler +320 """ +321 _logger.info(f"Running second pass for {self.input_file}") +322 +323 # get the target output stream types depending on the options +324 output_stream_types: list[Literal["audio", "video", "subtitle"]] = ["audio"] +325 if self._can_write_output_video(): +326 output_stream_types.append("video") +327 if not self.ffmpeg_normalize.subtitle_disable: +328 output_stream_types.append("subtitle") +329 +330 # base command, here we will add all other options +331 cmd = [self.ffmpeg_normalize.ffmpeg_exe, "-hide_banner", "-y"] +332 +333 # extra options (if any) +334 if self.ffmpeg_normalize.extra_input_options: +335 cmd.extend(self.ffmpeg_normalize.extra_input_options) +336 +337 # get complex filter command +338 audio_filter_cmd, output_labels = self._get_audio_filter_cmd() +339 +340 # add input file and basic filter +341 cmd.extend(["-i", self.input_file, "-filter_complex", audio_filter_cmd]) +342 +343 # map metadata, only if needed +344 if self.ffmpeg_normalize.metadata_disable: +345 cmd.extend(["-map_metadata", "-1"]) +346 else: +347 # map global metadata +348 cmd.extend(["-map_metadata", "0"]) +349 # map per-stream metadata (e.g. language tags) +350 for stream_type in output_stream_types: +351 stream_key = stream_type[0] +352 if stream_type not in self.streams: +353 continue +354 for idx, _ in enumerate(self.streams[stream_type].items()): +355 cmd.extend( +356 [ +357 f"-map_metadata:s:{stream_key}:{idx}", +358 f"0:s:{stream_key}:{idx}", +359 ] +360 ) 361 -362 # other audio options (if any) -363 if self.ffmpeg_normalize.audio_bitrate: -364 cmd.extend(["-b:a", str(self.ffmpeg_normalize.audio_bitrate)]) -365 if self.ffmpeg_normalize.sample_rate: -366 cmd.extend(["-ar", str(self.ffmpeg_normalize.sample_rate)]) -367 if self.ffmpeg_normalize.audio_channels: -368 cmd.extend(["-ac", str(self.ffmpeg_normalize.audio_channels)]) -369 -370 # ... and subtitles -371 if not self.ffmpeg_normalize.subtitle_disable: -372 for s in self.streams["subtitle"].keys(): -373 cmd.extend(["-map", f"0:{s}"]) -374 # copy subtitles -375 cmd.extend(["-c:s", "copy"]) -376 -377 if self.ffmpeg_normalize.keep_original_audio: -378 highest_index = len(self.streams["audio"]) -379 for index, _ in enumerate(self.streams["audio"].items()): -380 cmd.extend(["-map", f"0:a:{index}"]) -381 cmd.extend([f"-c:a:{highest_index + index}", "copy"]) -382 -383 # extra options (if any) -384 if self.ffmpeg_normalize.extra_output_options: -385 cmd.extend(self.ffmpeg_normalize.extra_output_options) -386 -387 # output format (if any) -388 if self.ffmpeg_normalize.output_format: -389 cmd.extend(["-f", self.ffmpeg_normalize.output_format]) -390 -391 # if dry run, only show sample command -392 if self.ffmpeg_normalize.dry_run: -393 cmd.append(self.output_file) -394 CommandRunner(dry=True).run_command(cmd) -395 yield 100 -396 return -397 -398 temp_dir = mkdtemp() -399 temp_file = os.path.join(temp_dir, f"out.{self.output_ext}") -400 cmd.append(temp_file) -401 -402 cmd_runner = CommandRunner() -403 try: -404 try: -405 yield from cmd_runner.run_ffmpeg_command(cmd) -406 except Exception as e: -407 _logger.error( -408 f"Error while running command {shlex.join(cmd)}! Error: {e}" -409 ) -410 raise e -411 else: -412 _logger.debug( -413 f"Moving temporary file from {temp_file} to {self.output_file}" -414 ) -415 move(temp_file, self.output_file) -416 rmtree(temp_dir, ignore_errors=True) -417 except Exception as e: -418 rmtree(temp_dir, ignore_errors=True) -419 raise e +362 # map chapters if needed +363 if self.ffmpeg_normalize.chapters_disable: +364 cmd.extend(["-map_chapters", "-1"]) +365 else: +366 cmd.extend(["-map_chapters", "0"]) +367 +368 # collect all '-map' and codecs needed for output video based on input video +369 if self.streams["video"]: +370 if self._can_write_output_video(): +371 for s in self.streams["video"].keys(): +372 cmd.extend(["-map", f"0:{s}"]) +373 # set codec (copy by default) +374 cmd.extend(["-c:v", self.ffmpeg_normalize.video_codec]) +375 else: +376 if not self.ffmpeg_normalize.video_disable: +377 _logger.warning( +378 f"The chosen output extension {self.output_ext} does not support video/cover art. It will be disabled." +379 ) +380 +381 # ... and map the output of the normalization filters +382 for ol in output_labels: +383 cmd.extend(["-map", ol]) +384 +385 # set audio codec (never copy) +386 if self.ffmpeg_normalize.audio_codec: +387 cmd.extend(["-c:a", self.ffmpeg_normalize.audio_codec]) +388 else: +389 for index, (_, audio_stream) in enumerate(self.streams["audio"].items()): +390 cmd.extend([f"-c:a:{index}", audio_stream.get_pcm_codec()]) +391 +392 # other audio options (if any) +393 if self.ffmpeg_normalize.audio_bitrate: +394 cmd.extend(["-b:a", str(self.ffmpeg_normalize.audio_bitrate)]) +395 if self.ffmpeg_normalize.sample_rate: +396 cmd.extend(["-ar", str(self.ffmpeg_normalize.sample_rate)]) +397 if self.ffmpeg_normalize.audio_channels: +398 cmd.extend(["-ac", str(self.ffmpeg_normalize.audio_channels)]) +399 +400 # ... and subtitles +401 if not self.ffmpeg_normalize.subtitle_disable: +402 for s in self.streams["subtitle"].keys(): +403 cmd.extend(["-map", f"0:{s}"]) +404 # copy subtitles +405 cmd.extend(["-c:s", "copy"]) +406 +407 if self.ffmpeg_normalize.keep_original_audio: +408 highest_index = len(self.streams["audio"]) +409 for index, _ in enumerate(self.streams["audio"].items()): +410 cmd.extend(["-map", f"0:a:{index}"]) +411 cmd.extend([f"-c:a:{highest_index + index}", "copy"]) +412 +413 # extra options (if any) +414 if self.ffmpeg_normalize.extra_output_options: +415 cmd.extend(self.ffmpeg_normalize.extra_output_options) +416 +417 # output format (if any) +418 if self.ffmpeg_normalize.output_format: +419 cmd.extend(["-f", self.ffmpeg_normalize.output_format]) 420 -421 output = cmd_runner.get_output() -422 # in the second pass, we do not normalize stream-by-stream, so we set the stats based on the -423 # overall output (which includes multiple loudnorm stats) -424 if self.ffmpeg_normalize.normalization_type == "ebu": -425 all_stats = AudioStream.prune_and_parse_loudnorm_output( -426 output, num_stats=len(self.streams["audio"]) -427 ) -428 for idx, audio_stream in enumerate(self.streams["audio"].values()): -429 audio_stream.set_second_pass_stats(all_stats[idx]) -430 -431 # collect all stats for the final report, again (overwrite the input) -432 self.ffmpeg_normalize.stats = [ -433 audio_stream.get_stats() for audio_stream in self.streams["audio"].values() -434 ] -435 -436 # warn if self.media_file.ffmpeg_normalize.dynamic == False and any of the second pass stats contain "normalization_type" == "dynamic" -437 if self.ffmpeg_normalize.dynamic is False: -438 for audio_stream in self.streams["audio"].values(): -439 pass2_stats = audio_stream.get_stats()["ebu_pass2"] -440 if pass2_stats is None: -441 continue -442 if pass2_stats["normalization_type"] == "dynamic": -443 _logger.warning( -444 "You specified linear normalization, but the loudnorm filter reverted to dynamic normalization. " -445 "This may lead to unexpected results." -446 "Consider your input settings, e.g. choose a lower target level or higher target loudness range." -447 ) -448 -449 _logger.debug("Normalization finished") +421 # if dry run, only show sample command +422 if self.ffmpeg_normalize.dry_run: +423 cmd.append(self.output_file) +424 CommandRunner(dry=True).run_command(cmd) +425 yield 100 +426 return +427 +428 temp_dir = mkdtemp() +429 temp_file = os.path.join(temp_dir, f"out.{self.output_ext}") +430 cmd.append(temp_file) +431 +432 cmd_runner = CommandRunner() +433 try: +434 try: +435 yield from cmd_runner.run_ffmpeg_command(cmd) +436 except Exception as e: +437 _logger.error( +438 f"Error while running command {shlex.join(cmd)}! Error: {e}" +439 ) +440 raise e +441 else: +442 _logger.debug( +443 f"Moving temporary file from {temp_file} to {self.output_file}" +444 ) +445 move(temp_file, self.output_file) +446 rmtree(temp_dir, ignore_errors=True) +447 except Exception as e: +448 rmtree(temp_dir, ignore_errors=True) +449 raise e +450 +451 output = cmd_runner.get_output() +452 # in the second pass, we do not normalize stream-by-stream, so we set the stats based on the +453 # overall output (which includes multiple loudnorm stats) +454 if self.ffmpeg_normalize.normalization_type == "ebu": +455 all_stats = AudioStream.prune_and_parse_loudnorm_output(output) +456 for stream_id, audio_stream in self.streams["audio"].items(): +457 if stream_id in all_stats: +458 audio_stream.set_second_pass_stats(all_stats[stream_id]) +459 +460 # warn if self.media_file.ffmpeg_normalize.dynamic == False and any of the second pass stats contain "normalization_type" == "dynamic" +461 if self.ffmpeg_normalize.dynamic is False: +462 for audio_stream in self.streams["audio"].values(): +463 pass2_stats = audio_stream.get_stats()["ebu_pass2"] +464 if pass2_stats is None: +465 continue +466 if pass2_stats["normalization_type"] == "dynamic": +467 _logger.warning( +468 "You specified linear normalization, but the loudnorm filter reverted to dynamic normalization. " +469 "This may lead to unexpected results." +470 "Consider your input settings, e.g. choose a lower target level or higher target loudness range." +471 ) +472 +473 _logger.debug("Normalization finished") +474 +475 def get_stats(self) -> Iterable[LoudnessStatisticsWithMetadata]: +476 return ( +477 audio_stream.get_stats() for audio_stream in self.streams["audio"].values() +478 )
    @@ -1624,25 +1673,25 @@
    Inherited Members
    -
    51    def __init__(
    -52        self, ffmpeg_normalize: FFmpegNormalize, input_file: str, output_file: str
    -53    ):
    -54        """
    -55        Initialize a media file for later normalization by parsing the streams.
    -56
    -57        Args:
    -58            ffmpeg_normalize (FFmpegNormalize): reference to overall settings
    -59            input_file (str): Path to input file
    -60            output_file (str): Path to output file
    -61        """
    -62        self.ffmpeg_normalize = ffmpeg_normalize
    -63        self.skip = False
    -64        self.input_file = input_file
    -65        self.output_file = output_file
    -66        self.output_ext = os.path.splitext(output_file)[1][1:]
    -67        self.streams: StreamDict = {"audio": {}, "video": {}, "subtitle": {}}
    -68
    -69        self.parse_streams()
    +            
    56    def __init__(
    +57        self, ffmpeg_normalize: FFmpegNormalize, input_file: str, output_file: str
    +58    ):
    +59        """
    +60        Initialize a media file for later normalization by parsing the streams.
    +61
    +62        Args:
    +63            ffmpeg_normalize (FFmpegNormalize): reference to overall settings
    +64            input_file (str): Path to input file
    +65            output_file (str): Path to output file
    +66        """
    +67        self.ffmpeg_normalize = ffmpeg_normalize
    +68        self.skip = False
    +69        self.input_file = input_file
    +70        self.output_file = output_file
    +71        self.output_ext = os.path.splitext(output_file)[1][1:]
    +72        self.streams: StreamDict = {"audio": {}, "video": {}, "subtitle": {}}
    +73
    +74        self.parse_streams()
     
    @@ -1736,102 +1785,102 @@
    Arguments:
    -
     87    def parse_streams(self) -> None:
    - 88        """
    - 89        Try to parse all input streams from file and set them in self.streams.
    - 90
    - 91        Raises:
    - 92            FFmpegNormalizeError: If no audio streams are found
    - 93        """
    - 94        _logger.debug(f"Parsing streams of {self.input_file}")
    +            
     92    def parse_streams(self) -> None:
    + 93        """
    + 94        Try to parse all input streams from file and set them in self.streams.
      95
    - 96        cmd = [
    - 97            self.ffmpeg_normalize.ffmpeg_exe,
    - 98            "-i",
    - 99            self.input_file,
    -100            "-c",
    -101            "copy",
    -102            "-t",
    -103            "0",
    -104            "-map",
    -105            "0",
    -106            "-f",
    -107            "null",
    -108            NUL,
    -109        ]
    -110
    -111        output = CommandRunner().run_command(cmd).get_output()
    -112
    -113        _logger.debug("Stream parsing command output:")
    -114        _logger.debug(output)
    + 96        Raises:
    + 97            FFmpegNormalizeError: If no audio streams are found
    + 98        """
    + 99        _logger.debug(f"Parsing streams of {self.input_file}")
    +100
    +101        cmd = [
    +102            self.ffmpeg_normalize.ffmpeg_exe,
    +103            "-i",
    +104            self.input_file,
    +105            "-c",
    +106            "copy",
    +107            "-t",
    +108            "0",
    +109            "-map",
    +110            "0",
    +111            "-f",
    +112            "null",
    +113            NUL,
    +114        ]
     115
    -116        output_lines = [line.strip() for line in output.split("\n")]
    +116        output = CommandRunner().run_command(cmd).get_output()
     117
    -118        duration = None
    -119        for line in output_lines:
    -120            if "Duration" in line:
    -121                if duration_search := DUR_REGEX.search(line):
    -122                    duration = _to_ms(**duration_search.groupdict()) / 1000
    -123                    _logger.debug(f"Found duration: {duration} s")
    -124                else:
    -125                    _logger.warning("Could not extract duration from input file!")
    -126
    -127            if not line.startswith("Stream"):
    -128                continue
    -129
    -130            if stream_id_match := re.search(r"#0:([\d]+)", line):
    -131                stream_id = int(stream_id_match.group(1))
    -132                if stream_id in self._stream_ids():
    -133                    continue
    -134            else:
    -135                continue
    -136
    -137            if "Audio" in line:
    -138                _logger.debug(f"Found audio stream at index {stream_id}")
    -139                sample_rate_match = re.search(r"(\d+) Hz", line)
    -140                sample_rate = (
    -141                    int(sample_rate_match.group(1)) if sample_rate_match else None
    -142                )
    -143                bit_depth_match = re.search(r"[sfu](\d+)(p|le|be)?", line)
    -144                bit_depth = int(bit_depth_match.group(1)) if bit_depth_match else None
    -145                self.streams["audio"][stream_id] = AudioStream(
    -146                    self.ffmpeg_normalize,
    -147                    self,
    -148                    stream_id,
    -149                    sample_rate,
    -150                    bit_depth,
    -151                    duration,
    -152                )
    -153
    -154            elif "Video" in line:
    -155                _logger.debug(f"Found video stream at index {stream_id}")
    -156                self.streams["video"][stream_id] = VideoStream(
    -157                    self.ffmpeg_normalize, self, stream_id
    -158                )
    -159
    -160            elif "Subtitle" in line:
    -161                _logger.debug(f"Found subtitle stream at index {stream_id}")
    -162                self.streams["subtitle"][stream_id] = SubtitleStream(
    -163                    self.ffmpeg_normalize, self, stream_id
    -164                )
    -165
    -166        if not self.streams["audio"]:
    -167            raise FFmpegNormalizeError(
    -168                f"Input file {self.input_file} does not contain any audio streams"
    -169            )
    +118        _logger.debug("Stream parsing command output:")
    +119        _logger.debug(output)
    +120
    +121        output_lines = [line.strip() for line in output.split("\n")]
    +122
    +123        duration = None
    +124        for line in output_lines:
    +125            if "Duration" in line:
    +126                if duration_search := DUR_REGEX.search(line):
    +127                    duration = _to_ms(**duration_search.groupdict()) / 1000
    +128                    _logger.debug(f"Found duration: {duration} s")
    +129                else:
    +130                    _logger.warning("Could not extract duration from input file!")
    +131
    +132            if not line.startswith("Stream"):
    +133                continue
    +134
    +135            if stream_id_match := re.search(r"#0:([\d]+)", line):
    +136                stream_id = int(stream_id_match.group(1))
    +137                if stream_id in self._stream_ids():
    +138                    continue
    +139            else:
    +140                continue
    +141
    +142            if "Audio" in line:
    +143                _logger.debug(f"Found audio stream at index {stream_id}")
    +144                sample_rate_match = re.search(r"(\d+) Hz", line)
    +145                sample_rate = (
    +146                    int(sample_rate_match.group(1)) if sample_rate_match else None
    +147                )
    +148                bit_depth_match = re.search(r"[sfu](\d+)(p|le|be)?", line)
    +149                bit_depth = int(bit_depth_match.group(1)) if bit_depth_match else None
    +150                self.streams["audio"][stream_id] = AudioStream(
    +151                    self.ffmpeg_normalize,
    +152                    self,
    +153                    stream_id,
    +154                    sample_rate,
    +155                    bit_depth,
    +156                    duration,
    +157                )
    +158
    +159            elif "Video" in line:
    +160                _logger.debug(f"Found video stream at index {stream_id}")
    +161                self.streams["video"][stream_id] = VideoStream(
    +162                    self.ffmpeg_normalize, self, stream_id
    +163                )
    +164
    +165            elif "Subtitle" in line:
    +166                _logger.debug(f"Found subtitle stream at index {stream_id}")
    +167                self.streams["subtitle"][stream_id] = SubtitleStream(
    +168                    self.ffmpeg_normalize, self, stream_id
    +169                )
     170
    -171        if (
    -172            self.output_ext.lower() in ONE_STREAM
    -173            and len(self.streams["audio"].values()) > 1
    -174        ):
    -175            _logger.warning(
    -176                "Output file only supports one stream. "
    -177                "Keeping only first audio stream."
    -178            )
    -179            first_stream = list(self.streams["audio"].values())[0]
    -180            self.streams["audio"] = {first_stream.stream_id: first_stream}
    -181            self.streams["video"] = {}
    -182            self.streams["subtitle"] = {}
    +171        if not self.streams["audio"]:
    +172            raise FFmpegNormalizeError(
    +173                f"Input file {self.input_file} does not contain any audio streams"
    +174            )
    +175
    +176        if (
    +177            self.output_ext.lower() in ONE_STREAM
    +178            and len(self.streams["audio"].values()) > 1
    +179        ):
    +180            _logger.warning(
    +181                "Output file only supports one stream. "
    +182                "Keeping only first audio stream."
    +183            )
    +184            first_stream = list(self.streams["audio"].values())[0]
    +185            self.streams["audio"] = {first_stream.stream_id: first_stream}
    +186            self.streams["video"] = {}
    +187            self.streams["subtitle"] = {}
     
    @@ -1857,28 +1906,28 @@
    Raises:
    -
    184    def run_normalization(self) -> None:
    -185        """
    -186        Run the normalization process for this file.
    -187        """
    -188        _logger.debug(f"Running normalization for {self.input_file}")
    -189
    -190        # run the first pass to get loudness stats
    -191        self._first_pass()
    -192
    -193        # run the second pass as a whole
    -194        if self.ffmpeg_normalize.progress:
    -195            with tqdm(
    -196                total=100,
    -197                position=1,
    -198                desc="Second Pass",
    -199                bar_format=TQDM_BAR_FORMAT,
    -200            ) as pbar:
    -201                for progress in self._second_pass():
    -202                    pbar.update(progress - pbar.n)
    -203        else:
    -204            for _ in self._second_pass():
    -205                pass
    +            
    189    def run_normalization(self) -> None:
    +190        """
    +191        Run the normalization process for this file.
    +192        """
    +193        _logger.debug(f"Running normalization for {self.input_file}")
    +194
    +195        # run the first pass to get loudness stats
    +196        self._first_pass()
    +197
    +198        # run the second pass as a whole
    +199        if self.ffmpeg_normalize.progress:
    +200            with tqdm(
    +201                total=100,
    +202                position=1,
    +203                desc="Second Pass",
    +204                bar_format=TQDM_BAR_FORMAT,
    +205            ) as pbar:
    +206                for progress in self._second_pass():
    +207                    pbar.update(progress - pbar.n)
    +208        else:
    +209            for _ in self._second_pass():
    +210                pass
     
    @@ -1886,6 +1935,27 @@
    Raises:
    +
    +
    + +
    + + def + get_stats( self) -> Iterable[ffmpeg_normalize._streams.LoudnessStatisticsWithMetadata]: + + + +
    + +
    475    def get_stats(self) -> Iterable[LoudnessStatisticsWithMetadata]:
    +476        return (
    +477            audio_stream.get_stats() for audio_stream in self.streams["audio"].values()
    +478        )
    +
    + + + +
    @@ -1899,496 +1969,468 @@
    Raises:
    -
     89class AudioStream(MediaStream):
    - 90    def __init__(
    - 91        self,
    - 92        ffmpeg_normalize: FFmpegNormalize,
    - 93        media_file: MediaFile,
    - 94        stream_id: int,
    - 95        sample_rate: int | None,
    - 96        bit_depth: int | None,
    - 97        duration: float | None,
    - 98    ):
    - 99        """
    -100        Create an AudioStream object.
    -101
    -102        Args:
    -103            ffmpeg_normalize (FFmpegNormalize): The FFmpegNormalize object.
    -104            media_file (MediaFile): The MediaFile object.
    -105            stream_id (int): The stream ID.
    -106            sample_rate (int): sample rate in Hz
    -107            bit_depth (int): bit depth in bits
    -108            duration (float): duration in seconds
    -109        """
    -110        super().__init__(ffmpeg_normalize, media_file, "audio", stream_id)
    -111
    -112        self.loudness_statistics: LoudnessStatistics = {
    -113            "ebu_pass1": None,
    -114            "ebu_pass2": None,
    -115            "mean": None,
    -116            "max": None,
    -117        }
    -118
    -119        self.sample_rate = sample_rate
    -120        self.bit_depth = bit_depth
    -121
    -122        self.duration = duration
    -123
    -124    @staticmethod
    -125    def _constrain(
    -126        number: float, min_range: float, max_range: float, name: str | None = None
    -127    ) -> float:
    -128        """
    -129        Constrain a number between two values.
    -130
    -131        Args:
    -132            number (float): The number to constrain.
    -133            min_range (float): The minimum value.
    -134            max_range (float): The maximum value.
    -135            name (str): The name of the number (for logging).
    -136
    -137        Returns:
    -138            float: The constrained number.
    -139
    -140        Raises:
    -141            ValueError: If min_range is greater than max_range.
    -142        """
    -143        if min_range > max_range:
    -144            raise ValueError("min must be smaller than max")
    -145        result = max(min(number, max_range), min_range)
    -146        if result != number and name is not None:
    -147            _logger.warning(
    -148                f"Constraining {name} to range of [{min_range}, {max_range}]: {number} -> {result}"
    -149            )
    -150        return result
    -151
    -152    def get_stats(self) -> LoudnessStatisticsWithMetadata:
    -153        """
    -154        Return loudness statistics for the stream.
    -155
    -156        Returns:
    -157            dict: A dictionary containing the loudness statistics.
    -158        """
    -159        stats: LoudnessStatisticsWithMetadata = {
    -160            "input_file": self.media_file.input_file,
    -161            "output_file": self.media_file.output_file,
    -162            "stream_id": self.stream_id,
    -163            "ebu_pass1": self.loudness_statistics["ebu_pass1"],
    -164            "ebu_pass2": self.loudness_statistics["ebu_pass2"],
    -165            "mean": self.loudness_statistics["mean"],
    -166            "max": self.loudness_statistics["max"],
    -167        }
    -168        return stats
    -169
    -170    def set_second_pass_stats(self, stats: EbuLoudnessStatistics):
    -171        """
    -172        Set the EBU loudness statistics for the second pass.
    -173
    -174        Args:
    -175            stats (dict): The EBU loudness statistics.
    -176        """
    -177        self.loudness_statistics["ebu_pass2"] = stats
    -178
    -179    def get_pcm_codec(self) -> str:
    -180        """
    -181        Get the PCM codec string for the stream.
    -182
    -183        Returns:
    -184            str: The PCM codec string.
    -185        """
    -186        if not self.bit_depth:
    -187            return "pcm_s16le"
    -188        elif self.bit_depth <= 8:
    -189            return "pcm_s8"
    -190        elif self.bit_depth in [16, 24, 32, 64]:
    -191            return f"pcm_s{self.bit_depth}le"
    -192        else:
    -193            _logger.warning(
    -194                f"Unsupported bit depth {self.bit_depth}, falling back to pcm_s16le"
    -195            )
    -196            return "pcm_s16le"
    -197
    -198    def _get_filter_str_with_pre_filter(self, current_filter: str) -> str:
    -199        """
    -200        Get a filter string for current_filter, with the pre-filter
    -201        added before. Applies the input label before.
    -202
    -203        Args:
    -204            current_filter (str): The current filter.
    -205
    -206        Returns:
    -207            str: The filter string.
    -208        """
    -209        input_label = f"[0:{self.stream_id}]"
    -210        filter_chain = []
    -211        if self.media_file.ffmpeg_normalize.pre_filter:
    -212            filter_chain.append(self.media_file.ffmpeg_normalize.pre_filter)
    -213        filter_chain.append(current_filter)
    -214        filter_str = input_label + ",".join(filter_chain)
    -215        return filter_str
    -216
    -217    def parse_astats(self) -> Iterator[float]:
    -218        """
    -219        Use ffmpeg with astats filter to get the mean (RMS) and max (peak) volume of the input file.
    -220
    -221        Yields:
    -222            float: The progress of the command.
    -223        """
    -224        _logger.info(f"Running first pass astats filter for stream {self.stream_id}")
    -225
    -226        filter_str = self._get_filter_str_with_pre_filter(
    -227            "astats=measure_overall=Peak_level+RMS_level:measure_perchannel=0"
    -228        )
    -229
    -230        cmd = [
    -231            self.media_file.ffmpeg_normalize.ffmpeg_exe,
    -232            "-hide_banner",
    -233            "-y",
    -234            "-i",
    -235            self.media_file.input_file,
    -236            "-filter_complex",
    -237            filter_str,
    -238            "-vn",
    -239            "-sn",
    -240            "-f",
    -241            "null",
    -242            NUL,
    -243        ]
    -244
    -245        cmd_runner = CommandRunner()
    -246        yield from cmd_runner.run_ffmpeg_command(cmd)
    -247        output = cmd_runner.get_output()
    -248
    -249        _logger.debug(
    -250            f"astats command output: {CommandRunner.prune_ffmpeg_progress_from_output(output)}"
    -251        )
    -252
    -253        mean_volume_matches = re.findall(r"RMS level dB: ([\-\d\.]+)", output)
    -254        if mean_volume_matches:
    -255            if mean_volume_matches[0] == "-":
    -256                self.loudness_statistics["mean"] = float("-inf")
    -257            else:
    -258                self.loudness_statistics["mean"] = float(mean_volume_matches[0])
    -259        else:
    -260            raise FFmpegNormalizeError(
    -261                f"Could not get mean volume for {self.media_file.input_file}"
    -262            )
    -263
    -264        max_volume_matches = re.findall(r"Peak level dB: ([\-\d\.]+)", output)
    -265        if max_volume_matches:
    -266            if max_volume_matches[0] == "-":
    -267                self.loudness_statistics["max"] = float("-inf")
    -268            else:
    -269                self.loudness_statistics["max"] = float(max_volume_matches[0])
    -270        else:
    -271            raise FFmpegNormalizeError(
    -272                f"Could not get max volume for {self.media_file.input_file}"
    -273            )
    -274
    -275    def parse_loudnorm_stats(self) -> Iterator[float]:
    -276        """
    -277        Run a first pass loudnorm filter to get measured data.
    -278
    -279        Yields:
    -280            float: The progress of the command.
    -281        """
    -282        _logger.info(f"Running first pass loudnorm filter for stream {self.stream_id}")
    -283
    -284        opts = {
    -285            "i": self.media_file.ffmpeg_normalize.target_level,
    -286            "lra": self.media_file.ffmpeg_normalize.loudness_range_target,
    -287            "tp": self.media_file.ffmpeg_normalize.true_peak,
    -288            "offset": self.media_file.ffmpeg_normalize.offset,
    -289            "print_format": "json",
    -290        }
    -291
    -292        if self.media_file.ffmpeg_normalize.dual_mono:
    -293            opts["dual_mono"] = "true"
    -294
    -295        filter_str = self._get_filter_str_with_pre_filter(
    -296            "loudnorm=" + dict_to_filter_opts(opts)
    -297        )
    -298
    -299        cmd = [
    -300            self.media_file.ffmpeg_normalize.ffmpeg_exe,
    -301            "-hide_banner",
    -302            "-y",
    -303            "-i",
    -304            self.media_file.input_file,
    -305            "-map",
    -306            f"0:{self.stream_id}",
    -307            "-filter_complex",
    -308            filter_str,
    -309            "-vn",
    -310            "-sn",
    -311            "-f",
    -312            "null",
    -313            NUL,
    -314        ]
    -315
    -316        cmd_runner = CommandRunner()
    -317        yield from cmd_runner.run_ffmpeg_command(cmd)
    -318        output = cmd_runner.get_output()
    -319
    -320        _logger.debug(
    -321            f"Loudnorm first pass command output: {CommandRunner.prune_ffmpeg_progress_from_output(output)}"
    -322        )
    -323
    -324        self.loudness_statistics["ebu_pass1"] = (
    -325            AudioStream.prune_and_parse_loudnorm_output(
    -326                output, num_stats=1
    -327            )[0]  # only one stream
    -328        )
    -329
    -330    @staticmethod
    -331    def prune_and_parse_loudnorm_output(
    -332        output: str, num_stats: int = 1
    -333    ) -> List[EbuLoudnessStatistics]:
    -334        """
    -335        Prune ffmpeg progress lines from output and parse the loudnorm filter output.
    -336        There may be multiple outputs if multiple streams were processed.
    -337
    -338        Args:
    -339            output (str): The output from ffmpeg.
    -340            num_stats (int): The number of loudnorm statistics to parse.
    -341
    -342        Returns:
    -343            list: The EBU loudness statistics.
    -344        """
    -345        pruned_output = CommandRunner.prune_ffmpeg_progress_from_output(output)
    -346        output_lines = [line.strip() for line in pruned_output.split("\n")]
    -347
    -348        ret = []
    -349        idx = 0
    -350        while True:
    -351            _logger.debug(f"Parsing loudnorm stats for stream {idx}")
    -352            loudnorm_stats = AudioStream._parse_loudnorm_output(
    -353                output_lines, stream_index=idx
    -354            )
    -355            idx += 1
    -356
    -357            if loudnorm_stats is None:
    -358                continue
    -359            ret.append(loudnorm_stats)
    -360
    -361            if len(ret) >= num_stats:
    -362                break
    -363
    -364        return ret
    -365
    -366    @staticmethod
    -367    def _parse_loudnorm_output(
    -368        output_lines: list[str], stream_index: Optional[int] = None
    -369    ) -> Optional[EbuLoudnessStatistics]:
    -370        """
    -371        Parse the output of a loudnorm filter to get the EBU loudness statistics.
    -372
    -373        Args:
    -374            output_lines (list[str]): The output lines of the loudnorm filter.
    -375            stream_index (int): The stream index, optional to filter out the correct stream. If unset, the first stream is used.
    -376
    -377        Raises:
    -378            FFmpegNormalizeError: When the output could not be parsed.
    -379
    -380        Returns:
    -381            EbuLoudnessStatistics: The EBU loudness statistics, if found.
    -382        """
    -383        loudnorm_start = 0
    -384        loudnorm_end = 0
    -385        for index, line in enumerate(output_lines):
    -386            if line.startswith(f"[Parsed_loudnorm_{stream_index}"):
    -387                loudnorm_start = index + 1
    -388                continue
    -389            if loudnorm_start and line.startswith("}"):
    -390                loudnorm_end = index + 1
    -391                break
    -392
    -393        if not (loudnorm_start and loudnorm_end):
    -394            if stream_index is not None:
    -395                # not an error
    -396                return None
    -397
    -398            raise FFmpegNormalizeError(
    -399                "Could not parse loudnorm stats; no loudnorm-related output found"
    -400            )
    -401
    -402        try:
    -403            loudnorm_stats = json.loads(
    -404                "\n".join(output_lines[loudnorm_start:loudnorm_end])
    -405            )
    +            
     90class AudioStream(MediaStream):
    + 91    def __init__(
    + 92        self,
    + 93        ffmpeg_normalize: FFmpegNormalize,
    + 94        media_file: MediaFile,
    + 95        stream_id: int,
    + 96        sample_rate: int | None,
    + 97        bit_depth: int | None,
    + 98        duration: float | None,
    + 99    ):
    +100        """
    +101        Create an AudioStream object.
    +102
    +103        Args:
    +104            ffmpeg_normalize (FFmpegNormalize): The FFmpegNormalize object.
    +105            media_file (MediaFile): The MediaFile object.
    +106            stream_id (int): The stream ID.
    +107            sample_rate (int): sample rate in Hz
    +108            bit_depth (int): bit depth in bits
    +109            duration (float): duration in seconds
    +110        """
    +111        super().__init__(ffmpeg_normalize, media_file, "audio", stream_id)
    +112
    +113        self.loudness_statistics: LoudnessStatistics = {
    +114            "ebu_pass1": None,
    +115            "ebu_pass2": None,
    +116            "mean": None,
    +117            "max": None,
    +118        }
    +119
    +120        self.sample_rate = sample_rate
    +121        self.bit_depth = bit_depth
    +122
    +123        self.duration = duration
    +124
    +125    @staticmethod
    +126    def _constrain(
    +127        number: float, min_range: float, max_range: float, name: str | None = None
    +128    ) -> float:
    +129        """
    +130        Constrain a number between two values.
    +131
    +132        Args:
    +133            number (float): The number to constrain.
    +134            min_range (float): The minimum value.
    +135            max_range (float): The maximum value.
    +136            name (str): The name of the number (for logging).
    +137
    +138        Returns:
    +139            float: The constrained number.
    +140
    +141        Raises:
    +142            ValueError: If min_range is greater than max_range.
    +143        """
    +144        if min_range > max_range:
    +145            raise ValueError("min must be smaller than max")
    +146        result = max(min(number, max_range), min_range)
    +147        if result != number and name is not None:
    +148            _logger.warning(
    +149                f"Constraining {name} to range of [{min_range}, {max_range}]: {number} -> {result}"
    +150            )
    +151        return result
    +152
    +153    def get_stats(self) -> LoudnessStatisticsWithMetadata:
    +154        """
    +155        Return loudness statistics for the stream.
    +156
    +157        Returns:
    +158            dict: A dictionary containing the loudness statistics.
    +159        """
    +160        stats: LoudnessStatisticsWithMetadata = {
    +161            "input_file": self.media_file.input_file,
    +162            "output_file": self.media_file.output_file,
    +163            "stream_id": self.stream_id,
    +164            "ebu_pass1": self.loudness_statistics["ebu_pass1"],
    +165            "ebu_pass2": self.loudness_statistics["ebu_pass2"],
    +166            "mean": self.loudness_statistics["mean"],
    +167            "max": self.loudness_statistics["max"],
    +168        }
    +169        return stats
    +170
    +171    def set_second_pass_stats(self, stats: EbuLoudnessStatistics):
    +172        """
    +173        Set the EBU loudness statistics for the second pass.
    +174
    +175        Args:
    +176            stats (dict): The EBU loudness statistics.
    +177        """
    +178        self.loudness_statistics["ebu_pass2"] = stats
    +179
    +180    def get_pcm_codec(self) -> str:
    +181        """
    +182        Get the PCM codec string for the stream.
    +183
    +184        Returns:
    +185            str: The PCM codec string.
    +186        """
    +187        if not self.bit_depth:
    +188            return "pcm_s16le"
    +189        elif self.bit_depth <= 8:
    +190            return "pcm_s8"
    +191        elif self.bit_depth in [16, 24, 32, 64]:
    +192            return f"pcm_s{self.bit_depth}le"
    +193        else:
    +194            _logger.warning(
    +195                f"Unsupported bit depth {self.bit_depth}, falling back to pcm_s16le"
    +196            )
    +197            return "pcm_s16le"
    +198
    +199    def _get_filter_str_with_pre_filter(self, current_filter: str) -> str:
    +200        """
    +201        Get a filter string for current_filter, with the pre-filter
    +202        added before. Applies the input label before.
    +203
    +204        Args:
    +205            current_filter (str): The current filter.
    +206
    +207        Returns:
    +208            str: The filter string.
    +209        """
    +210        input_label = f"[0:{self.stream_id}]"
    +211        filter_chain = []
    +212        if self.media_file.ffmpeg_normalize.pre_filter:
    +213            filter_chain.append(self.media_file.ffmpeg_normalize.pre_filter)
    +214        filter_chain.append(current_filter)
    +215        filter_str = input_label + ",".join(filter_chain)
    +216        return filter_str
    +217
    +218    def parse_astats(self) -> Iterator[float]:
    +219        """
    +220        Use ffmpeg with astats filter to get the mean (RMS) and max (peak) volume of the input file.
    +221
    +222        Yields:
    +223            float: The progress of the command.
    +224        """
    +225        _logger.info(f"Running first pass astats filter for stream {self.stream_id}")
    +226
    +227        filter_str = self._get_filter_str_with_pre_filter(
    +228            "astats=measure_overall=Peak_level+RMS_level:measure_perchannel=0"
    +229        )
    +230
    +231        cmd = [
    +232            self.media_file.ffmpeg_normalize.ffmpeg_exe,
    +233            "-hide_banner",
    +234            "-y",
    +235            "-i",
    +236            self.media_file.input_file,
    +237            "-filter_complex",
    +238            filter_str,
    +239            "-vn",
    +240            "-sn",
    +241            "-f",
    +242            "null",
    +243            NUL,
    +244        ]
    +245
    +246        cmd_runner = CommandRunner()
    +247        yield from cmd_runner.run_ffmpeg_command(cmd)
    +248        output = cmd_runner.get_output()
    +249
    +250        _logger.debug(
    +251            f"astats command output: {CommandRunner.prune_ffmpeg_progress_from_output(output)}"
    +252        )
    +253
    +254        mean_volume_matches = re.findall(r"RMS level dB: ([\-\d\.]+)", output)
    +255        if mean_volume_matches:
    +256            if mean_volume_matches[0] == "-":
    +257                self.loudness_statistics["mean"] = float("-inf")
    +258            else:
    +259                self.loudness_statistics["mean"] = float(mean_volume_matches[0])
    +260        else:
    +261            raise FFmpegNormalizeError(
    +262                f"Could not get mean volume for {self.media_file.input_file}"
    +263            )
    +264
    +265        max_volume_matches = re.findall(r"Peak level dB: ([\-\d\.]+)", output)
    +266        if max_volume_matches:
    +267            if max_volume_matches[0] == "-":
    +268                self.loudness_statistics["max"] = float("-inf")
    +269            else:
    +270                self.loudness_statistics["max"] = float(max_volume_matches[0])
    +271        else:
    +272            raise FFmpegNormalizeError(
    +273                f"Could not get max volume for {self.media_file.input_file}"
    +274            )
    +275
    +276    def parse_loudnorm_stats(self) -> Iterator[float]:
    +277        """
    +278        Run a first pass loudnorm filter to get measured data.
    +279
    +280        Yields:
    +281            float: The progress of the command.
    +282        """
    +283        _logger.info(f"Running first pass loudnorm filter for stream {self.stream_id}")
    +284
    +285        opts = {
    +286            "i": self.media_file.ffmpeg_normalize.target_level,
    +287            "lra": self.media_file.ffmpeg_normalize.loudness_range_target,
    +288            "tp": self.media_file.ffmpeg_normalize.true_peak,
    +289            "offset": self.media_file.ffmpeg_normalize.offset,
    +290            "print_format": "json",
    +291        }
    +292
    +293        if self.media_file.ffmpeg_normalize.dual_mono:
    +294            opts["dual_mono"] = "true"
    +295
    +296        filter_str = self._get_filter_str_with_pre_filter(
    +297            "loudnorm=" + dict_to_filter_opts(opts)
    +298        )
    +299
    +300        cmd = [
    +301            self.media_file.ffmpeg_normalize.ffmpeg_exe,
    +302            "-hide_banner",
    +303            "-y",
    +304            "-i",
    +305            self.media_file.input_file,
    +306            "-map",
    +307            f"0:{self.stream_id}",
    +308            "-filter_complex",
    +309            filter_str,
    +310            "-vn",
    +311            "-sn",
    +312            "-f",
    +313            "null",
    +314            NUL,
    +315        ]
    +316
    +317        cmd_runner = CommandRunner()
    +318        yield from cmd_runner.run_ffmpeg_command(cmd)
    +319        output = cmd_runner.get_output()
    +320
    +321        _logger.debug(
    +322            f"Loudnorm first pass command output: {CommandRunner.prune_ffmpeg_progress_from_output(output)}"
    +323        )
    +324
    +325        # only one stream
    +326        self.loudness_statistics["ebu_pass1"] = next(iter(AudioStream.prune_and_parse_loudnorm_output(output).values()))
    +327
    +328    @staticmethod
    +329    def prune_and_parse_loudnorm_output(
    +330        output: str
    +331    ) -> dict[int, EbuLoudnessStatistics]:
    +332        """
    +333        Prune ffmpeg progress lines from output and parse the loudnorm filter output.
    +334        There may be multiple outputs if multiple streams were processed.
    +335
    +336        Args:
    +337            output (str): The output from ffmpeg.
    +338
    +339        Returns:
    +340            list: The EBU loudness statistics.
    +341        """
    +342        pruned_output = CommandRunner.prune_ffmpeg_progress_from_output(output)
    +343        output_lines = [line.strip() for line in pruned_output.split("\n")]
    +344        return AudioStream._parse_loudnorm_output(output_lines)
    +345
    +346    @staticmethod
    +347    def _parse_loudnorm_output(
    +348        output_lines: list[str]
    +349    ) -> dict[int, EbuLoudnessStatistics]:
    +350        """
    +351        Parse the output of a loudnorm filter to get the EBU loudness statistics.
    +352
    +353        Args:
    +354            output_lines (list[str]): The output lines of the loudnorm filter.
    +355
    +356        Raises:
    +357            FFmpegNormalizeError: When the output could not be parsed.
    +358
    +359        Returns:
    +360            EbuLoudnessStatistics: The EBU loudness statistics, if found.
    +361        """
    +362        result = dict[int, EbuLoudnessStatistics]()
    +363        stream_index = -1
    +364        loudnorm_start = 0
    +365        for index, line in enumerate(output_lines):
    +366            if stream_index < 0:
    +367                if m := _loudnorm_pattern.match(line):
    +368                    loudnorm_start = index + 1
    +369                    stream_index = int(m.group(1))
    +370            else:
    +371                if line.startswith("}"):
    +372                    loudnorm_end = index + 1
    +373                    loudnorm_data = "\n".join(output_lines[loudnorm_start:loudnorm_end])
    +374
    +375                    try:
    +376                        loudnorm_stats = json.loads(loudnorm_data)
    +377
    +378                        _logger.debug(
    +379                            f"Loudnorm stats for stream {stream_index} parsed: {loudnorm_data}"
    +380                        )
    +381
    +382                        for key in [
    +383                            "input_i",
    +384                            "input_tp",
    +385                            "input_lra",
    +386                            "input_thresh",
    +387                            "output_i",
    +388                            "output_tp",
    +389                            "output_lra",
    +390                            "output_thresh",
    +391                            "target_offset",
    +392                            "normalization_type",
    +393                        ]:
    +394                            if key not in loudnorm_stats:
    +395                                continue
    +396                            if key == "normalization_type":
    +397                                loudnorm_stats[key] = loudnorm_stats[key].lower()
    +398                            # handle infinite values
    +399                            elif float(loudnorm_stats[key]) == -float("inf"):
    +400                                loudnorm_stats[key] = -99
    +401                            elif float(loudnorm_stats[key]) == float("inf"):
    +402                                loudnorm_stats[key] = 0
    +403                            else:
    +404                                # convert to floats
    +405                                loudnorm_stats[key] = float(loudnorm_stats[key])
     406
    -407            _logger.debug(
    -408                f"Loudnorm stats for stream {stream_index} parsed: {json.dumps(loudnorm_stats)}"
    -409            )
    -410
    -411            for key in [
    -412                "input_i",
    -413                "input_tp",
    -414                "input_lra",
    -415                "input_thresh",
    -416                "output_i",
    -417                "output_tp",
    -418                "output_lra",
    -419                "output_thresh",
    -420                "target_offset",
    -421                "normalization_type",
    -422            ]:
    -423                if key not in loudnorm_stats:
    -424                    continue
    -425                if key == "normalization_type":
    -426                    loudnorm_stats[key] = loudnorm_stats[key].lower()
    -427                # handle infinite values
    -428                elif float(loudnorm_stats[key]) == -float("inf"):
    -429                    loudnorm_stats[key] = -99
    -430                elif float(loudnorm_stats[key]) == float("inf"):
    -431                    loudnorm_stats[key] = 0
    -432                else:
    -433                    # convert to floats
    -434                    loudnorm_stats[key] = float(loudnorm_stats[key])
    -435
    -436            return cast(EbuLoudnessStatistics, loudnorm_stats)
    -437        except Exception as e:
    -438            raise FFmpegNormalizeError(
    -439                f"Could not parse loudnorm stats; wrong JSON format in string: {e}"
    -440            )
    -441
    -442    def get_second_pass_opts_ebu(self) -> str:
    -443        """
    -444        Return second pass loudnorm filter options string for ffmpeg
    -445        """
    -446
    -447        if not self.loudness_statistics["ebu_pass1"]:
    -448            raise FFmpegNormalizeError(
    -449                "First pass not run, you must call parse_loudnorm_stats first"
    -450            )
    -451
    -452        if float(self.loudness_statistics["ebu_pass1"]["input_i"]) > 0:
    -453            _logger.warning(
    -454                "Input file had measured input loudness greater than zero "
    -455                f"({self.loudness_statistics['ebu_pass1']['input_i']}), capping at 0"
    -456            )
    -457            self.loudness_statistics["ebu_pass1"]["input_i"] = 0
    -458
    -459        will_use_dynamic_mode = self.media_file.ffmpeg_normalize.dynamic
    -460
    -461        if self.media_file.ffmpeg_normalize.keep_loudness_range_target:
    -462            _logger.debug(
    -463                "Keeping target loudness range in second pass loudnorm filter"
    -464            )
    -465            input_lra = self.loudness_statistics["ebu_pass1"]["input_lra"]
    -466            if input_lra < 1 or input_lra > 50:
    -467                _logger.warning(
    -468                    "Input file had measured loudness range outside of [1,50] "
    -469                    f"({input_lra}), capping to allowed range"
    -470                )
    -471
    -472            self.media_file.ffmpeg_normalize.loudness_range_target = self._constrain(
    -473                self.loudness_statistics["ebu_pass1"]["input_lra"], 1, 50
    -474            )
    -475
    -476        if self.media_file.ffmpeg_normalize.keep_lra_above_loudness_range_target:
    -477            if (
    -478                self.loudness_statistics["ebu_pass1"]["input_lra"]
    -479                <= self.media_file.ffmpeg_normalize.loudness_range_target
    -480            ):
    -481                _logger.debug(
    -482                    "Setting loudness range target in second pass loudnorm filter"
    -483                )
    -484            else:
    -485                self.media_file.ffmpeg_normalize.loudness_range_target = (
    -486                    self.loudness_statistics["ebu_pass1"]["input_lra"]
    -487                )
    -488                _logger.debug(
    -489                    "Keeping target loudness range in second pass loudnorm filter"
    -490                )
    -491
    -492        if (
    -493            self.media_file.ffmpeg_normalize.loudness_range_target
    -494            < self.loudness_statistics["ebu_pass1"]["input_lra"]
    -495            and not will_use_dynamic_mode
    -496        ):
    -497            _logger.warning(
    -498                f"Input file had loudness range of {self.loudness_statistics['ebu_pass1']['input_lra']}. "
    -499                f"This is larger than the loudness range target ({self.media_file.ffmpeg_normalize.loudness_range_target}). "
    -500                "Normalization will revert to dynamic mode. Choose a higher target loudness range if you want linear normalization. "
    -501                "Alternatively, use the --keep-loudness-range-target or --keep-lra-above-loudness-range-target option to keep the target loudness range from "
    -502                "the input."
    -503            )
    -504            will_use_dynamic_mode = True
    -505
    -506        if will_use_dynamic_mode and not self.ffmpeg_normalize.sample_rate:
    -507            _logger.warning(
    -508                "In dynamic mode, the sample rate will automatically be set to 192 kHz by the loudnorm filter. "
    -509                "Specify -ar/--sample-rate to override it."
    -510            )
    -511
    -512        stats = self.loudness_statistics["ebu_pass1"]
    -513
    -514        opts = {
    -515            "i": self.media_file.ffmpeg_normalize.target_level,
    -516            "lra": self.media_file.ffmpeg_normalize.loudness_range_target,
    -517            "tp": self.media_file.ffmpeg_normalize.true_peak,
    -518            "offset": self._constrain(
    -519                float(stats["target_offset"]), -99, 99, name="target_offset"
    -520            ),
    -521            "measured_i": self._constrain(
    -522                float(stats["input_i"]), -99, 0, name="input_i"
    -523            ),
    -524            "measured_lra": self._constrain(
    -525                float(stats["input_lra"]), 0, 99, name="input_lra"
    -526            ),
    -527            "measured_tp": self._constrain(
    -528                float(stats["input_tp"]), -99, 99, name="input_tp"
    -529            ),
    -530            "measured_thresh": self._constrain(
    -531                float(stats["input_thresh"]), -99, 0, name="input_thresh"
    -532            ),
    -533            "linear": "false" if self.media_file.ffmpeg_normalize.dynamic else "true",
    -534            "print_format": "json",
    -535        }
    -536
    -537        if self.media_file.ffmpeg_normalize.dual_mono:
    -538            opts["dual_mono"] = "true"
    -539
    -540        return "loudnorm=" + dict_to_filter_opts(opts)
    -541
    -542    def get_second_pass_opts_peakrms(self) -> str:
    -543        """
    -544        Set the adjustment gain based on chosen option and mean/max volume,
    -545        return the matching ffmpeg volume filter.
    +407                        result[stream_index] = cast(EbuLoudnessStatistics, loudnorm_stats)
    +408                        stream_index = -1
    +409                    except Exception as e:
    +410                        raise FFmpegNormalizeError(
    +411                            f"Could not parse loudnorm stats; wrong JSON format in string: {e}"
    +412                        )
    +413        return result
    +414
    +415    def get_second_pass_opts_ebu(self) -> str:
    +416        """
    +417        Return second pass loudnorm filter options string for ffmpeg
    +418        """
    +419
    +420        if not self.loudness_statistics["ebu_pass1"]:
    +421            raise FFmpegNormalizeError(
    +422                "First pass not run, you must call parse_loudnorm_stats first"
    +423            )
    +424
    +425        if float(self.loudness_statistics["ebu_pass1"]["input_i"]) > 0:
    +426            _logger.warning(
    +427                "Input file had measured input loudness greater than zero "
    +428                f"({self.loudness_statistics['ebu_pass1']['input_i']}), capping at 0"
    +429            )
    +430            self.loudness_statistics["ebu_pass1"]["input_i"] = 0
    +431
    +432        will_use_dynamic_mode = self.media_file.ffmpeg_normalize.dynamic
    +433
    +434        if self.media_file.ffmpeg_normalize.keep_loudness_range_target:
    +435            _logger.debug(
    +436                "Keeping target loudness range in second pass loudnorm filter"
    +437            )
    +438            input_lra = self.loudness_statistics["ebu_pass1"]["input_lra"]
    +439            if input_lra < 1 or input_lra > 50:
    +440                _logger.warning(
    +441                    "Input file had measured loudness range outside of [1,50] "
    +442                    f"({input_lra}), capping to allowed range"
    +443                )
    +444
    +445            self.media_file.ffmpeg_normalize.loudness_range_target = self._constrain(
    +446                self.loudness_statistics["ebu_pass1"]["input_lra"], 1, 50
    +447            )
    +448
    +449        if self.media_file.ffmpeg_normalize.keep_lra_above_loudness_range_target:
    +450            if (
    +451                self.loudness_statistics["ebu_pass1"]["input_lra"]
    +452                <= self.media_file.ffmpeg_normalize.loudness_range_target
    +453            ):
    +454                _logger.debug(
    +455                    "Setting loudness range target in second pass loudnorm filter"
    +456                )
    +457            else:
    +458                self.media_file.ffmpeg_normalize.loudness_range_target = (
    +459                    self.loudness_statistics["ebu_pass1"]["input_lra"]
    +460                )
    +461                _logger.debug(
    +462                    "Keeping target loudness range in second pass loudnorm filter"
    +463                )
    +464
    +465        if (
    +466            self.media_file.ffmpeg_normalize.loudness_range_target
    +467            < self.loudness_statistics["ebu_pass1"]["input_lra"]
    +468            and not will_use_dynamic_mode
    +469        ):
    +470            _logger.warning(
    +471                f"Input file had loudness range of {self.loudness_statistics['ebu_pass1']['input_lra']}. "
    +472                f"This is larger than the loudness range target ({self.media_file.ffmpeg_normalize.loudness_range_target}). "
    +473                "Normalization will revert to dynamic mode. Choose a higher target loudness range if you want linear normalization. "
    +474                "Alternatively, use the --keep-loudness-range-target or --keep-lra-above-loudness-range-target option to keep the target loudness range from "
    +475                "the input."
    +476            )
    +477            will_use_dynamic_mode = True
    +478
    +479        if will_use_dynamic_mode and not self.ffmpeg_normalize.sample_rate:
    +480            _logger.warning(
    +481                "In dynamic mode, the sample rate will automatically be set to 192 kHz by the loudnorm filter. "
    +482                "Specify -ar/--sample-rate to override it."
    +483            )
    +484
    +485        stats = self.loudness_statistics["ebu_pass1"]
    +486
    +487        opts = {
    +488            "i": self.media_file.ffmpeg_normalize.target_level,
    +489            "lra": self.media_file.ffmpeg_normalize.loudness_range_target,
    +490            "tp": self.media_file.ffmpeg_normalize.true_peak,
    +491            "offset": self._constrain(
    +492                stats["target_offset"], -99, 99, name="target_offset"
    +493            ),
    +494            "measured_i": self._constrain(
    +495                stats["input_i"], -99, 0, name="input_i"
    +496            ),
    +497            "measured_lra": self._constrain(
    +498                stats["input_lra"], 0, 99, name="input_lra"
    +499            ),
    +500            "measured_tp": self._constrain(
    +501                stats["input_tp"], -99, 99, name="input_tp"
    +502            ),
    +503            "measured_thresh": self._constrain(
    +504                stats["input_thresh"], -99, 0, name="input_thresh"
    +505            ),
    +506            "linear": "false" if self.media_file.ffmpeg_normalize.dynamic else "true",
    +507            "print_format": "json",
    +508        }
    +509
    +510        if self.media_file.ffmpeg_normalize.dual_mono:
    +511            opts["dual_mono"] = "true"
    +512
    +513        return "loudnorm=" + dict_to_filter_opts(opts)
    +514
    +515    def get_second_pass_opts_peakrms(self) -> str:
    +516        """
    +517        Set the adjustment gain based on chosen option and mean/max volume,
    +518        return the matching ffmpeg volume filter.
    +519
    +520        Returns:
    +521            str: ffmpeg volume filter string
    +522        """
    +523        if (
    +524            self.loudness_statistics["max"] is None
    +525            or self.loudness_statistics["mean"] is None
    +526        ):
    +527            raise FFmpegNormalizeError(
    +528                "First pass not run, no mean/max volume to normalize to"
    +529            )
    +530
    +531        normalization_type = self.media_file.ffmpeg_normalize.normalization_type
    +532        target_level = self.media_file.ffmpeg_normalize.target_level
    +533
    +534        if normalization_type == "peak":
    +535            adjustment = 0 + target_level - self.loudness_statistics["max"]
    +536        elif normalization_type == "rms":
    +537            adjustment = target_level - self.loudness_statistics["mean"]
    +538        else:
    +539            raise FFmpegNormalizeError(
    +540                "Can only set adjustment for peak and RMS normalization"
    +541            )
    +542
    +543        _logger.info(
    +544            f"Adjusting stream {self.stream_id} by {adjustment} dB to reach {target_level}"
    +545        )
     546
    -547        Returns:
    -548            str: ffmpeg volume filter string
    -549        """
    -550        if (
    -551            self.loudness_statistics["max"] is None
    -552            or self.loudness_statistics["mean"] is None
    -553        ):
    -554            raise FFmpegNormalizeError(
    -555                "First pass not run, no mean/max volume to normalize to"
    -556            )
    -557
    -558        normalization_type = self.media_file.ffmpeg_normalize.normalization_type
    -559        target_level = self.media_file.ffmpeg_normalize.target_level
    -560
    -561        if normalization_type == "peak":
    -562            adjustment = 0 + target_level - self.loudness_statistics["max"]
    -563        elif normalization_type == "rms":
    -564            adjustment = target_level - self.loudness_statistics["mean"]
    -565        else:
    -566            raise FFmpegNormalizeError(
    -567                "Can only set adjustment for peak and RMS normalization"
    -568            )
    -569
    -570        _logger.info(
    -571            f"Adjusting stream {self.stream_id} by {adjustment} dB to reach {target_level}"
    -572        )
    -573
    -574        clip_amount = self.loudness_statistics["max"] + adjustment
    -575        if clip_amount > 0:
    -576            _logger.warning(f"Adjusting will lead to clipping of {clip_amount} dB")
    -577
    -578        return f"volume={adjustment}dB"
    +547        clip_amount = self.loudness_statistics["max"] + adjustment
    +548        if clip_amount > 0:
    +549            _logger.warning(f"Adjusting will lead to clipping of {clip_amount} dB")
    +550
    +551        return f"volume={adjustment}dB"
     
    @@ -2404,39 +2446,39 @@
    Raises:
    -
     90    def __init__(
    - 91        self,
    - 92        ffmpeg_normalize: FFmpegNormalize,
    - 93        media_file: MediaFile,
    - 94        stream_id: int,
    - 95        sample_rate: int | None,
    - 96        bit_depth: int | None,
    - 97        duration: float | None,
    - 98    ):
    - 99        """
    -100        Create an AudioStream object.
    -101
    -102        Args:
    -103            ffmpeg_normalize (FFmpegNormalize): The FFmpegNormalize object.
    -104            media_file (MediaFile): The MediaFile object.
    -105            stream_id (int): The stream ID.
    -106            sample_rate (int): sample rate in Hz
    -107            bit_depth (int): bit depth in bits
    -108            duration (float): duration in seconds
    -109        """
    -110        super().__init__(ffmpeg_normalize, media_file, "audio", stream_id)
    -111
    -112        self.loudness_statistics: LoudnessStatistics = {
    -113            "ebu_pass1": None,
    -114            "ebu_pass2": None,
    -115            "mean": None,
    -116            "max": None,
    -117        }
    -118
    -119        self.sample_rate = sample_rate
    -120        self.bit_depth = bit_depth
    -121
    -122        self.duration = duration
    +            
     91    def __init__(
    + 92        self,
    + 93        ffmpeg_normalize: FFmpegNormalize,
    + 94        media_file: MediaFile,
    + 95        stream_id: int,
    + 96        sample_rate: int | None,
    + 97        bit_depth: int | None,
    + 98        duration: float | None,
    + 99    ):
    +100        """
    +101        Create an AudioStream object.
    +102
    +103        Args:
    +104            ffmpeg_normalize (FFmpegNormalize): The FFmpegNormalize object.
    +105            media_file (MediaFile): The MediaFile object.
    +106            stream_id (int): The stream ID.
    +107            sample_rate (int): sample rate in Hz
    +108            bit_depth (int): bit depth in bits
    +109            duration (float): duration in seconds
    +110        """
    +111        super().__init__(ffmpeg_normalize, media_file, "audio", stream_id)
    +112
    +113        self.loudness_statistics: LoudnessStatistics = {
    +114            "ebu_pass1": None,
    +115            "ebu_pass2": None,
    +116            "mean": None,
    +117            "max": None,
    +118        }
    +119
    +120        self.sample_rate = sample_rate
    +121        self.bit_depth = bit_depth
    +122
    +123        self.duration = duration
     
    @@ -2511,23 +2553,23 @@
    Arguments:
    -
    152    def get_stats(self) -> LoudnessStatisticsWithMetadata:
    -153        """
    -154        Return loudness statistics for the stream.
    -155
    -156        Returns:
    -157            dict: A dictionary containing the loudness statistics.
    -158        """
    -159        stats: LoudnessStatisticsWithMetadata = {
    -160            "input_file": self.media_file.input_file,
    -161            "output_file": self.media_file.output_file,
    -162            "stream_id": self.stream_id,
    -163            "ebu_pass1": self.loudness_statistics["ebu_pass1"],
    -164            "ebu_pass2": self.loudness_statistics["ebu_pass2"],
    -165            "mean": self.loudness_statistics["mean"],
    -166            "max": self.loudness_statistics["max"],
    -167        }
    -168        return stats
    +            
    153    def get_stats(self) -> LoudnessStatisticsWithMetadata:
    +154        """
    +155        Return loudness statistics for the stream.
    +156
    +157        Returns:
    +158            dict: A dictionary containing the loudness statistics.
    +159        """
    +160        stats: LoudnessStatisticsWithMetadata = {
    +161            "input_file": self.media_file.input_file,
    +162            "output_file": self.media_file.output_file,
    +163            "stream_id": self.stream_id,
    +164            "ebu_pass1": self.loudness_statistics["ebu_pass1"],
    +165            "ebu_pass2": self.loudness_statistics["ebu_pass2"],
    +166            "mean": self.loudness_statistics["mean"],
    +167            "max": self.loudness_statistics["max"],
    +168        }
    +169        return stats
     
    @@ -2553,14 +2595,14 @@
    Returns:
    -
    170    def set_second_pass_stats(self, stats: EbuLoudnessStatistics):
    -171        """
    -172        Set the EBU loudness statistics for the second pass.
    -173
    -174        Args:
    -175            stats (dict): The EBU loudness statistics.
    -176        """
    -177        self.loudness_statistics["ebu_pass2"] = stats
    +            
    171    def set_second_pass_stats(self, stats: EbuLoudnessStatistics):
    +172        """
    +173        Set the EBU loudness statistics for the second pass.
    +174
    +175        Args:
    +176            stats (dict): The EBU loudness statistics.
    +177        """
    +178        self.loudness_statistics["ebu_pass2"] = stats
     
    @@ -2586,24 +2628,24 @@
    Arguments:
    -
    179    def get_pcm_codec(self) -> str:
    -180        """
    -181        Get the PCM codec string for the stream.
    -182
    -183        Returns:
    -184            str: The PCM codec string.
    -185        """
    -186        if not self.bit_depth:
    -187            return "pcm_s16le"
    -188        elif self.bit_depth <= 8:
    -189            return "pcm_s8"
    -190        elif self.bit_depth in [16, 24, 32, 64]:
    -191            return f"pcm_s{self.bit_depth}le"
    -192        else:
    -193            _logger.warning(
    -194                f"Unsupported bit depth {self.bit_depth}, falling back to pcm_s16le"
    -195            )
    -196            return "pcm_s16le"
    +            
    180    def get_pcm_codec(self) -> str:
    +181        """
    +182        Get the PCM codec string for the stream.
    +183
    +184        Returns:
    +185            str: The PCM codec string.
    +186        """
    +187        if not self.bit_depth:
    +188            return "pcm_s16le"
    +189        elif self.bit_depth <= 8:
    +190            return "pcm_s8"
    +191        elif self.bit_depth in [16, 24, 32, 64]:
    +192            return f"pcm_s{self.bit_depth}le"
    +193        else:
    +194            _logger.warning(
    +195                f"Unsupported bit depth {self.bit_depth}, falling back to pcm_s16le"
    +196            )
    +197            return "pcm_s16le"
     
    @@ -2629,63 +2671,63 @@
    Returns:
    -
    217    def parse_astats(self) -> Iterator[float]:
    -218        """
    -219        Use ffmpeg with astats filter to get the mean (RMS) and max (peak) volume of the input file.
    -220
    -221        Yields:
    -222            float: The progress of the command.
    -223        """
    -224        _logger.info(f"Running first pass astats filter for stream {self.stream_id}")
    -225
    -226        filter_str = self._get_filter_str_with_pre_filter(
    -227            "astats=measure_overall=Peak_level+RMS_level:measure_perchannel=0"
    -228        )
    -229
    -230        cmd = [
    -231            self.media_file.ffmpeg_normalize.ffmpeg_exe,
    -232            "-hide_banner",
    -233            "-y",
    -234            "-i",
    -235            self.media_file.input_file,
    -236            "-filter_complex",
    -237            filter_str,
    -238            "-vn",
    -239            "-sn",
    -240            "-f",
    -241            "null",
    -242            NUL,
    -243        ]
    -244
    -245        cmd_runner = CommandRunner()
    -246        yield from cmd_runner.run_ffmpeg_command(cmd)
    -247        output = cmd_runner.get_output()
    -248
    -249        _logger.debug(
    -250            f"astats command output: {CommandRunner.prune_ffmpeg_progress_from_output(output)}"
    -251        )
    -252
    -253        mean_volume_matches = re.findall(r"RMS level dB: ([\-\d\.]+)", output)
    -254        if mean_volume_matches:
    -255            if mean_volume_matches[0] == "-":
    -256                self.loudness_statistics["mean"] = float("-inf")
    -257            else:
    -258                self.loudness_statistics["mean"] = float(mean_volume_matches[0])
    -259        else:
    -260            raise FFmpegNormalizeError(
    -261                f"Could not get mean volume for {self.media_file.input_file}"
    -262            )
    -263
    -264        max_volume_matches = re.findall(r"Peak level dB: ([\-\d\.]+)", output)
    -265        if max_volume_matches:
    -266            if max_volume_matches[0] == "-":
    -267                self.loudness_statistics["max"] = float("-inf")
    -268            else:
    -269                self.loudness_statistics["max"] = float(max_volume_matches[0])
    -270        else:
    -271            raise FFmpegNormalizeError(
    -272                f"Could not get max volume for {self.media_file.input_file}"
    -273            )
    +            
    218    def parse_astats(self) -> Iterator[float]:
    +219        """
    +220        Use ffmpeg with astats filter to get the mean (RMS) and max (peak) volume of the input file.
    +221
    +222        Yields:
    +223            float: The progress of the command.
    +224        """
    +225        _logger.info(f"Running first pass astats filter for stream {self.stream_id}")
    +226
    +227        filter_str = self._get_filter_str_with_pre_filter(
    +228            "astats=measure_overall=Peak_level+RMS_level:measure_perchannel=0"
    +229        )
    +230
    +231        cmd = [
    +232            self.media_file.ffmpeg_normalize.ffmpeg_exe,
    +233            "-hide_banner",
    +234            "-y",
    +235            "-i",
    +236            self.media_file.input_file,
    +237            "-filter_complex",
    +238            filter_str,
    +239            "-vn",
    +240            "-sn",
    +241            "-f",
    +242            "null",
    +243            NUL,
    +244        ]
    +245
    +246        cmd_runner = CommandRunner()
    +247        yield from cmd_runner.run_ffmpeg_command(cmd)
    +248        output = cmd_runner.get_output()
    +249
    +250        _logger.debug(
    +251            f"astats command output: {CommandRunner.prune_ffmpeg_progress_from_output(output)}"
    +252        )
    +253
    +254        mean_volume_matches = re.findall(r"RMS level dB: ([\-\d\.]+)", output)
    +255        if mean_volume_matches:
    +256            if mean_volume_matches[0] == "-":
    +257                self.loudness_statistics["mean"] = float("-inf")
    +258            else:
    +259                self.loudness_statistics["mean"] = float(mean_volume_matches[0])
    +260        else:
    +261            raise FFmpegNormalizeError(
    +262                f"Could not get mean volume for {self.media_file.input_file}"
    +263            )
    +264
    +265        max_volume_matches = re.findall(r"Peak level dB: ([\-\d\.]+)", output)
    +266        if max_volume_matches:
    +267            if max_volume_matches[0] == "-":
    +268                self.loudness_statistics["max"] = float("-inf")
    +269            else:
    +270                self.loudness_statistics["max"] = float(max_volume_matches[0])
    +271        else:
    +272            raise FFmpegNormalizeError(
    +273                f"Could not get max volume for {self.media_file.input_file}"
    +274            )
     
    @@ -2711,60 +2753,57 @@
    Yields:
    -
    275    def parse_loudnorm_stats(self) -> Iterator[float]:
    -276        """
    -277        Run a first pass loudnorm filter to get measured data.
    -278
    -279        Yields:
    -280            float: The progress of the command.
    -281        """
    -282        _logger.info(f"Running first pass loudnorm filter for stream {self.stream_id}")
    -283
    -284        opts = {
    -285            "i": self.media_file.ffmpeg_normalize.target_level,
    -286            "lra": self.media_file.ffmpeg_normalize.loudness_range_target,
    -287            "tp": self.media_file.ffmpeg_normalize.true_peak,
    -288            "offset": self.media_file.ffmpeg_normalize.offset,
    -289            "print_format": "json",
    -290        }
    -291
    -292        if self.media_file.ffmpeg_normalize.dual_mono:
    -293            opts["dual_mono"] = "true"
    -294
    -295        filter_str = self._get_filter_str_with_pre_filter(
    -296            "loudnorm=" + dict_to_filter_opts(opts)
    -297        )
    -298
    -299        cmd = [
    -300            self.media_file.ffmpeg_normalize.ffmpeg_exe,
    -301            "-hide_banner",
    -302            "-y",
    -303            "-i",
    -304            self.media_file.input_file,
    -305            "-map",
    -306            f"0:{self.stream_id}",
    -307            "-filter_complex",
    -308            filter_str,
    -309            "-vn",
    -310            "-sn",
    -311            "-f",
    -312            "null",
    -313            NUL,
    -314        ]
    -315
    -316        cmd_runner = CommandRunner()
    -317        yield from cmd_runner.run_ffmpeg_command(cmd)
    -318        output = cmd_runner.get_output()
    -319
    -320        _logger.debug(
    -321            f"Loudnorm first pass command output: {CommandRunner.prune_ffmpeg_progress_from_output(output)}"
    -322        )
    -323
    -324        self.loudness_statistics["ebu_pass1"] = (
    -325            AudioStream.prune_and_parse_loudnorm_output(
    -326                output, num_stats=1
    -327            )[0]  # only one stream
    -328        )
    +            
    276    def parse_loudnorm_stats(self) -> Iterator[float]:
    +277        """
    +278        Run a first pass loudnorm filter to get measured data.
    +279
    +280        Yields:
    +281            float: The progress of the command.
    +282        """
    +283        _logger.info(f"Running first pass loudnorm filter for stream {self.stream_id}")
    +284
    +285        opts = {
    +286            "i": self.media_file.ffmpeg_normalize.target_level,
    +287            "lra": self.media_file.ffmpeg_normalize.loudness_range_target,
    +288            "tp": self.media_file.ffmpeg_normalize.true_peak,
    +289            "offset": self.media_file.ffmpeg_normalize.offset,
    +290            "print_format": "json",
    +291        }
    +292
    +293        if self.media_file.ffmpeg_normalize.dual_mono:
    +294            opts["dual_mono"] = "true"
    +295
    +296        filter_str = self._get_filter_str_with_pre_filter(
    +297            "loudnorm=" + dict_to_filter_opts(opts)
    +298        )
    +299
    +300        cmd = [
    +301            self.media_file.ffmpeg_normalize.ffmpeg_exe,
    +302            "-hide_banner",
    +303            "-y",
    +304            "-i",
    +305            self.media_file.input_file,
    +306            "-map",
    +307            f"0:{self.stream_id}",
    +308            "-filter_complex",
    +309            filter_str,
    +310            "-vn",
    +311            "-sn",
    +312            "-f",
    +313            "null",
    +314            NUL,
    +315        ]
    +316
    +317        cmd_runner = CommandRunner()
    +318        yield from cmd_runner.run_ffmpeg_command(cmd)
    +319        output = cmd_runner.get_output()
    +320
    +321        _logger.debug(
    +322            f"Loudnorm first pass command output: {CommandRunner.prune_ffmpeg_progress_from_output(output)}"
    +323        )
    +324
    +325        # only one stream
    +326        self.loudness_statistics["ebu_pass1"] = next(iter(AudioStream.prune_and_parse_loudnorm_output(output).values()))
     
    @@ -2785,47 +2824,29 @@
    Yields:
    @staticmethod
    def - prune_and_parse_loudnorm_output( output: str, num_stats: int = 1) -> List[ffmpeg_normalize._streams.EbuLoudnessStatistics]: + prune_and_parse_loudnorm_output( output: str) -> dict[int, ffmpeg_normalize._streams.EbuLoudnessStatistics]:
    -
    330    @staticmethod
    -331    def prune_and_parse_loudnorm_output(
    -332        output: str, num_stats: int = 1
    -333    ) -> List[EbuLoudnessStatistics]:
    -334        """
    -335        Prune ffmpeg progress lines from output and parse the loudnorm filter output.
    -336        There may be multiple outputs if multiple streams were processed.
    -337
    -338        Args:
    -339            output (str): The output from ffmpeg.
    -340            num_stats (int): The number of loudnorm statistics to parse.
    -341
    -342        Returns:
    -343            list: The EBU loudness statistics.
    -344        """
    -345        pruned_output = CommandRunner.prune_ffmpeg_progress_from_output(output)
    -346        output_lines = [line.strip() for line in pruned_output.split("\n")]
    -347
    -348        ret = []
    -349        idx = 0
    -350        while True:
    -351            _logger.debug(f"Parsing loudnorm stats for stream {idx}")
    -352            loudnorm_stats = AudioStream._parse_loudnorm_output(
    -353                output_lines, stream_index=idx
    -354            )
    -355            idx += 1
    -356
    -357            if loudnorm_stats is None:
    -358                continue
    -359            ret.append(loudnorm_stats)
    -360
    -361            if len(ret) >= num_stats:
    -362                break
    -363
    -364        return ret
    +            
    328    @staticmethod
    +329    def prune_and_parse_loudnorm_output(
    +330        output: str
    +331    ) -> dict[int, EbuLoudnessStatistics]:
    +332        """
    +333        Prune ffmpeg progress lines from output and parse the loudnorm filter output.
    +334        There may be multiple outputs if multiple streams were processed.
    +335
    +336        Args:
    +337            output (str): The output from ffmpeg.
    +338
    +339        Returns:
    +340            list: The EBU loudness statistics.
    +341        """
    +342        pruned_output = CommandRunner.prune_ffmpeg_progress_from_output(output)
    +343        output_lines = [line.strip() for line in pruned_output.split("\n")]
    +344        return AudioStream._parse_loudnorm_output(output_lines)
     
    @@ -2836,7 +2857,6 @@
    Arguments:
    • output (str): The output from ffmpeg.
    • -
    • num_stats (int): The number of loudnorm statistics to parse.
    Returns:
    @@ -2859,105 +2879,105 @@
    Returns:
    -
    442    def get_second_pass_opts_ebu(self) -> str:
    -443        """
    -444        Return second pass loudnorm filter options string for ffmpeg
    -445        """
    -446
    -447        if not self.loudness_statistics["ebu_pass1"]:
    -448            raise FFmpegNormalizeError(
    -449                "First pass not run, you must call parse_loudnorm_stats first"
    -450            )
    -451
    -452        if float(self.loudness_statistics["ebu_pass1"]["input_i"]) > 0:
    -453            _logger.warning(
    -454                "Input file had measured input loudness greater than zero "
    -455                f"({self.loudness_statistics['ebu_pass1']['input_i']}), capping at 0"
    -456            )
    -457            self.loudness_statistics["ebu_pass1"]["input_i"] = 0
    -458
    -459        will_use_dynamic_mode = self.media_file.ffmpeg_normalize.dynamic
    -460
    -461        if self.media_file.ffmpeg_normalize.keep_loudness_range_target:
    -462            _logger.debug(
    -463                "Keeping target loudness range in second pass loudnorm filter"
    -464            )
    -465            input_lra = self.loudness_statistics["ebu_pass1"]["input_lra"]
    -466            if input_lra < 1 or input_lra > 50:
    -467                _logger.warning(
    -468                    "Input file had measured loudness range outside of [1,50] "
    -469                    f"({input_lra}), capping to allowed range"
    -470                )
    -471
    -472            self.media_file.ffmpeg_normalize.loudness_range_target = self._constrain(
    -473                self.loudness_statistics["ebu_pass1"]["input_lra"], 1, 50
    -474            )
    -475
    -476        if self.media_file.ffmpeg_normalize.keep_lra_above_loudness_range_target:
    -477            if (
    -478                self.loudness_statistics["ebu_pass1"]["input_lra"]
    -479                <= self.media_file.ffmpeg_normalize.loudness_range_target
    -480            ):
    -481                _logger.debug(
    -482                    "Setting loudness range target in second pass loudnorm filter"
    -483                )
    -484            else:
    -485                self.media_file.ffmpeg_normalize.loudness_range_target = (
    -486                    self.loudness_statistics["ebu_pass1"]["input_lra"]
    -487                )
    -488                _logger.debug(
    -489                    "Keeping target loudness range in second pass loudnorm filter"
    -490                )
    -491
    -492        if (
    -493            self.media_file.ffmpeg_normalize.loudness_range_target
    -494            < self.loudness_statistics["ebu_pass1"]["input_lra"]
    -495            and not will_use_dynamic_mode
    -496        ):
    -497            _logger.warning(
    -498                f"Input file had loudness range of {self.loudness_statistics['ebu_pass1']['input_lra']}. "
    -499                f"This is larger than the loudness range target ({self.media_file.ffmpeg_normalize.loudness_range_target}). "
    -500                "Normalization will revert to dynamic mode. Choose a higher target loudness range if you want linear normalization. "
    -501                "Alternatively, use the --keep-loudness-range-target or --keep-lra-above-loudness-range-target option to keep the target loudness range from "
    -502                "the input."
    -503            )
    -504            will_use_dynamic_mode = True
    -505
    -506        if will_use_dynamic_mode and not self.ffmpeg_normalize.sample_rate:
    -507            _logger.warning(
    -508                "In dynamic mode, the sample rate will automatically be set to 192 kHz by the loudnorm filter. "
    -509                "Specify -ar/--sample-rate to override it."
    -510            )
    -511
    -512        stats = self.loudness_statistics["ebu_pass1"]
    -513
    -514        opts = {
    -515            "i": self.media_file.ffmpeg_normalize.target_level,
    -516            "lra": self.media_file.ffmpeg_normalize.loudness_range_target,
    -517            "tp": self.media_file.ffmpeg_normalize.true_peak,
    -518            "offset": self._constrain(
    -519                float(stats["target_offset"]), -99, 99, name="target_offset"
    -520            ),
    -521            "measured_i": self._constrain(
    -522                float(stats["input_i"]), -99, 0, name="input_i"
    -523            ),
    -524            "measured_lra": self._constrain(
    -525                float(stats["input_lra"]), 0, 99, name="input_lra"
    -526            ),
    -527            "measured_tp": self._constrain(
    -528                float(stats["input_tp"]), -99, 99, name="input_tp"
    -529            ),
    -530            "measured_thresh": self._constrain(
    -531                float(stats["input_thresh"]), -99, 0, name="input_thresh"
    -532            ),
    -533            "linear": "false" if self.media_file.ffmpeg_normalize.dynamic else "true",
    -534            "print_format": "json",
    -535        }
    -536
    -537        if self.media_file.ffmpeg_normalize.dual_mono:
    -538            opts["dual_mono"] = "true"
    -539
    -540        return "loudnorm=" + dict_to_filter_opts(opts)
    +            
    415    def get_second_pass_opts_ebu(self) -> str:
    +416        """
    +417        Return second pass loudnorm filter options string for ffmpeg
    +418        """
    +419
    +420        if not self.loudness_statistics["ebu_pass1"]:
    +421            raise FFmpegNormalizeError(
    +422                "First pass not run, you must call parse_loudnorm_stats first"
    +423            )
    +424
    +425        if float(self.loudness_statistics["ebu_pass1"]["input_i"]) > 0:
    +426            _logger.warning(
    +427                "Input file had measured input loudness greater than zero "
    +428                f"({self.loudness_statistics['ebu_pass1']['input_i']}), capping at 0"
    +429            )
    +430            self.loudness_statistics["ebu_pass1"]["input_i"] = 0
    +431
    +432        will_use_dynamic_mode = self.media_file.ffmpeg_normalize.dynamic
    +433
    +434        if self.media_file.ffmpeg_normalize.keep_loudness_range_target:
    +435            _logger.debug(
    +436                "Keeping target loudness range in second pass loudnorm filter"
    +437            )
    +438            input_lra = self.loudness_statistics["ebu_pass1"]["input_lra"]
    +439            if input_lra < 1 or input_lra > 50:
    +440                _logger.warning(
    +441                    "Input file had measured loudness range outside of [1,50] "
    +442                    f"({input_lra}), capping to allowed range"
    +443                )
    +444
    +445            self.media_file.ffmpeg_normalize.loudness_range_target = self._constrain(
    +446                self.loudness_statistics["ebu_pass1"]["input_lra"], 1, 50
    +447            )
    +448
    +449        if self.media_file.ffmpeg_normalize.keep_lra_above_loudness_range_target:
    +450            if (
    +451                self.loudness_statistics["ebu_pass1"]["input_lra"]
    +452                <= self.media_file.ffmpeg_normalize.loudness_range_target
    +453            ):
    +454                _logger.debug(
    +455                    "Setting loudness range target in second pass loudnorm filter"
    +456                )
    +457            else:
    +458                self.media_file.ffmpeg_normalize.loudness_range_target = (
    +459                    self.loudness_statistics["ebu_pass1"]["input_lra"]
    +460                )
    +461                _logger.debug(
    +462                    "Keeping target loudness range in second pass loudnorm filter"
    +463                )
    +464
    +465        if (
    +466            self.media_file.ffmpeg_normalize.loudness_range_target
    +467            < self.loudness_statistics["ebu_pass1"]["input_lra"]
    +468            and not will_use_dynamic_mode
    +469        ):
    +470            _logger.warning(
    +471                f"Input file had loudness range of {self.loudness_statistics['ebu_pass1']['input_lra']}. "
    +472                f"This is larger than the loudness range target ({self.media_file.ffmpeg_normalize.loudness_range_target}). "
    +473                "Normalization will revert to dynamic mode. Choose a higher target loudness range if you want linear normalization. "
    +474                "Alternatively, use the --keep-loudness-range-target or --keep-lra-above-loudness-range-target option to keep the target loudness range from "
    +475                "the input."
    +476            )
    +477            will_use_dynamic_mode = True
    +478
    +479        if will_use_dynamic_mode and not self.ffmpeg_normalize.sample_rate:
    +480            _logger.warning(
    +481                "In dynamic mode, the sample rate will automatically be set to 192 kHz by the loudnorm filter. "
    +482                "Specify -ar/--sample-rate to override it."
    +483            )
    +484
    +485        stats = self.loudness_statistics["ebu_pass1"]
    +486
    +487        opts = {
    +488            "i": self.media_file.ffmpeg_normalize.target_level,
    +489            "lra": self.media_file.ffmpeg_normalize.loudness_range_target,
    +490            "tp": self.media_file.ffmpeg_normalize.true_peak,
    +491            "offset": self._constrain(
    +492                stats["target_offset"], -99, 99, name="target_offset"
    +493            ),
    +494            "measured_i": self._constrain(
    +495                stats["input_i"], -99, 0, name="input_i"
    +496            ),
    +497            "measured_lra": self._constrain(
    +498                stats["input_lra"], 0, 99, name="input_lra"
    +499            ),
    +500            "measured_tp": self._constrain(
    +501                stats["input_tp"], -99, 99, name="input_tp"
    +502            ),
    +503            "measured_thresh": self._constrain(
    +504                stats["input_thresh"], -99, 0, name="input_thresh"
    +505            ),
    +506            "linear": "false" if self.media_file.ffmpeg_normalize.dynamic else "true",
    +507            "print_format": "json",
    +508        }
    +509
    +510        if self.media_file.ffmpeg_normalize.dual_mono:
    +511            opts["dual_mono"] = "true"
    +512
    +513        return "loudnorm=" + dict_to_filter_opts(opts)
     
    @@ -2977,43 +2997,43 @@
    Returns:
    -
    542    def get_second_pass_opts_peakrms(self) -> str:
    -543        """
    -544        Set the adjustment gain based on chosen option and mean/max volume,
    -545        return the matching ffmpeg volume filter.
    +            
    515    def get_second_pass_opts_peakrms(self) -> str:
    +516        """
    +517        Set the adjustment gain based on chosen option and mean/max volume,
    +518        return the matching ffmpeg volume filter.
    +519
    +520        Returns:
    +521            str: ffmpeg volume filter string
    +522        """
    +523        if (
    +524            self.loudness_statistics["max"] is None
    +525            or self.loudness_statistics["mean"] is None
    +526        ):
    +527            raise FFmpegNormalizeError(
    +528                "First pass not run, no mean/max volume to normalize to"
    +529            )
    +530
    +531        normalization_type = self.media_file.ffmpeg_normalize.normalization_type
    +532        target_level = self.media_file.ffmpeg_normalize.target_level
    +533
    +534        if normalization_type == "peak":
    +535            adjustment = 0 + target_level - self.loudness_statistics["max"]
    +536        elif normalization_type == "rms":
    +537            adjustment = target_level - self.loudness_statistics["mean"]
    +538        else:
    +539            raise FFmpegNormalizeError(
    +540                "Can only set adjustment for peak and RMS normalization"
    +541            )
    +542
    +543        _logger.info(
    +544            f"Adjusting stream {self.stream_id} by {adjustment} dB to reach {target_level}"
    +545        )
     546
    -547        Returns:
    -548            str: ffmpeg volume filter string
    -549        """
    -550        if (
    -551            self.loudness_statistics["max"] is None
    -552            or self.loudness_statistics["mean"] is None
    -553        ):
    -554            raise FFmpegNormalizeError(
    -555                "First pass not run, no mean/max volume to normalize to"
    -556            )
    -557
    -558        normalization_type = self.media_file.ffmpeg_normalize.normalization_type
    -559        target_level = self.media_file.ffmpeg_normalize.target_level
    -560
    -561        if normalization_type == "peak":
    -562            adjustment = 0 + target_level - self.loudness_statistics["max"]
    -563        elif normalization_type == "rms":
    -564            adjustment = target_level - self.loudness_statistics["mean"]
    -565        else:
    -566            raise FFmpegNormalizeError(
    -567                "Can only set adjustment for peak and RMS normalization"
    -568            )
    -569
    -570        _logger.info(
    -571            f"Adjusting stream {self.stream_id} by {adjustment} dB to reach {target_level}"
    -572        )
    -573
    -574        clip_amount = self.loudness_statistics["max"] + adjustment
    -575        if clip_amount > 0:
    -576            _logger.warning(f"Adjusting will lead to clipping of {clip_amount} dB")
    -577
    -578        return f"volume={adjustment}dB"
    +547        clip_amount = self.loudness_statistics["max"] + adjustment
    +548        if clip_amount > 0:
    +549            _logger.warning(f"Adjusting will lead to clipping of {clip_amount} dB")
    +550
    +551        return f"volume={adjustment}dB"
     
    @@ -3053,11 +3073,11 @@
    Inherited Members
    -
    75class VideoStream(MediaStream):
    -76    def __init__(
    -77        self, ffmpeg_normalize: FFmpegNormalize, media_file: MediaFile, stream_id: int
    -78    ):
    -79        super().__init__(ffmpeg_normalize, media_file, "video", stream_id)
    +            
    76class VideoStream(MediaStream):
    +77    def __init__(
    +78        self, ffmpeg_normalize: FFmpegNormalize, media_file: MediaFile, stream_id: int
    +79    ):
    +80        super().__init__(ffmpeg_normalize, media_file, "video", stream_id)
     
    @@ -3073,10 +3093,10 @@
    Inherited Members
    -
    76    def __init__(
    -77        self, ffmpeg_normalize: FFmpegNormalize, media_file: MediaFile, stream_id: int
    -78    ):
    -79        super().__init__(ffmpeg_normalize, media_file, "video", stream_id)
    +            
    77    def __init__(
    +78        self, ffmpeg_normalize: FFmpegNormalize, media_file: MediaFile, stream_id: int
    +79    ):
    +80        super().__init__(ffmpeg_normalize, media_file, "video", stream_id)
     
    @@ -3118,11 +3138,11 @@
    Inherited Members
    -
    82class SubtitleStream(MediaStream):
    -83    def __init__(
    -84        self, ffmpeg_normalize: FFmpegNormalize, media_file: MediaFile, stream_id: int
    -85    ):
    -86        super().__init__(ffmpeg_normalize, media_file, "subtitle", stream_id)
    +            
    83class SubtitleStream(MediaStream):
    +84    def __init__(
    +85        self, ffmpeg_normalize: FFmpegNormalize, media_file: MediaFile, stream_id: int
    +86    ):
    +87        super().__init__(ffmpeg_normalize, media_file, "subtitle", stream_id)
     
    @@ -3138,10 +3158,10 @@
    Inherited Members
    -
    83    def __init__(
    -84        self, ffmpeg_normalize: FFmpegNormalize, media_file: MediaFile, stream_id: int
    -85    ):
    -86        super().__init__(ffmpeg_normalize, media_file, "subtitle", stream_id)
    +            
    84    def __init__(
    +85        self, ffmpeg_normalize: FFmpegNormalize, media_file: MediaFile, stream_id: int
    +86    ):
    +87        super().__init__(ffmpeg_normalize, media_file, "subtitle", stream_id)
     
    @@ -3183,33 +3203,33 @@
    Inherited Members
    -
    46class MediaStream:
    -47    def __init__(
    -48        self,
    -49        ffmpeg_normalize: FFmpegNormalize,
    -50        media_file: MediaFile,
    -51        stream_type: Literal["audio", "video", "subtitle"],
    -52        stream_id: int,
    -53    ):
    -54        """
    -55        Create a MediaStream object.
    -56
    -57        Args:
    -58            ffmpeg_normalize (FFmpegNormalize): The FFmpegNormalize object.
    -59            media_file (MediaFile): The MediaFile object.
    -60            stream_type (Literal["audio", "video", "subtitle"]): The type of the stream.
    -61            stream_id (int): The stream ID.
    -62        """
    -63        self.ffmpeg_normalize = ffmpeg_normalize
    -64        self.media_file = media_file
    -65        self.stream_type = stream_type
    -66        self.stream_id = stream_id
    -67
    -68    def __repr__(self) -> str:
    -69        return (
    -70            f"<{os.path.basename(self.media_file.input_file)}, "
    -71            f"{self.stream_type} stream {self.stream_id}>"
    -72        )
    +            
    47class MediaStream:
    +48    def __init__(
    +49        self,
    +50        ffmpeg_normalize: FFmpegNormalize,
    +51        media_file: MediaFile,
    +52        stream_type: Literal["audio", "video", "subtitle"],
    +53        stream_id: int,
    +54    ):
    +55        """
    +56        Create a MediaStream object.
    +57
    +58        Args:
    +59            ffmpeg_normalize (FFmpegNormalize): The FFmpegNormalize object.
    +60            media_file (MediaFile): The MediaFile object.
    +61            stream_type (Literal["audio", "video", "subtitle"]): The type of the stream.
    +62            stream_id (int): The stream ID.
    +63        """
    +64        self.ffmpeg_normalize = ffmpeg_normalize
    +65        self.media_file = media_file
    +66        self.stream_type = stream_type
    +67        self.stream_id = stream_id
    +68
    +69    def __repr__(self) -> str:
    +70        return (
    +71            f"<{os.path.basename(self.media_file.input_file)}, "
    +72            f"{self.stream_type} stream {self.stream_id}>"
    +73        )
     
    @@ -3225,26 +3245,26 @@
    Inherited Members
    -
    47    def __init__(
    -48        self,
    -49        ffmpeg_normalize: FFmpegNormalize,
    -50        media_file: MediaFile,
    -51        stream_type: Literal["audio", "video", "subtitle"],
    -52        stream_id: int,
    -53    ):
    -54        """
    -55        Create a MediaStream object.
    -56
    -57        Args:
    -58            ffmpeg_normalize (FFmpegNormalize): The FFmpegNormalize object.
    -59            media_file (MediaFile): The MediaFile object.
    -60            stream_type (Literal["audio", "video", "subtitle"]): The type of the stream.
    -61            stream_id (int): The stream ID.
    -62        """
    -63        self.ffmpeg_normalize = ffmpeg_normalize
    -64        self.media_file = media_file
    -65        self.stream_type = stream_type
    -66        self.stream_id = stream_id
    +            
    48    def __init__(
    +49        self,
    +50        ffmpeg_normalize: FFmpegNormalize,
    +51        media_file: MediaFile,
    +52        stream_type: Literal["audio", "video", "subtitle"],
    +53        stream_id: int,
    +54    ):
    +55        """
    +56        Create a MediaStream object.
    +57
    +58        Args:
    +59            ffmpeg_normalize (FFmpegNormalize): The FFmpegNormalize object.
    +60            media_file (MediaFile): The MediaFile object.
    +61            stream_type (Literal["audio", "video", "subtitle"]): The type of the stream.
    +62            stream_id (int): The stream ID.
    +63        """
    +64        self.ffmpeg_normalize = ffmpeg_normalize
    +65        self.media_file = media_file
    +66        self.stream_type = stream_type
    +67        self.stream_id = stream_id
     
    @@ -3310,7 +3330,7 @@
    Arguments:
    __version__ = -'1.29.2' +'1.30.0'
    diff --git a/docs/search.js b/docs/search.js index 89616d6..147f18b 100644 --- a/docs/search.js +++ b/docs/search.js @@ -1,6 +1,6 @@ window.pdocSearch = (function(){ /** 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_normalize.FFmpegNormalize": {"fullname": "ffmpeg_normalize.FFmpegNormalize", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize", "kind": "class", "doc": "

    ffmpeg-normalize class.

    \n\n
    Arguments:
    \n\n
      \n
    • normalization_type (str, optional): Normalization type. Defaults to \"ebu\".
    • \n
    • target_level (float, optional): Target level. Defaults to -23.0.
    • \n
    • print_stats (bool, optional): Print loudnorm stats. Defaults to False.
    • \n
    • loudness_range_target (float, optional): Loudness range target. Defaults to 7.0.
    • \n
    • keep_loudness_range_target (bool, optional): Keep loudness range target. Defaults to False.
    • \n
    • keep_lra_above_loudness_range_target (bool, optional): Keep input loudness range above loudness range target. Defaults to False.
    • \n
    • true_peak (float, optional): True peak. Defaults to -2.0.
    • \n
    • offset (float, optional): Offset. Defaults to 0.0.
    • \n
    • dual_mono (bool, optional): Dual mono. Defaults to False.
    • \n
    • dynamic (bool, optional): Dynamic. Defaults to False.
    • \n
    • audio_codec (str, optional): Audio codec. Defaults to \"pcm_s16le\".
    • \n
    • audio_bitrate (float, optional): Audio bitrate. Defaults to None.
    • \n
    • sample_rate (int, optional): Sample rate. Defaults to None.
    • \n
    • audio_channels (int | None, optional): Audio channels. Defaults to None.
    • \n
    • keep_original_audio (bool, optional): Keep original audio. Defaults to False.
    • \n
    • pre_filter (str, optional): Pre filter. Defaults to None.
    • \n
    • post_filter (str, optional): Post filter. Defaults to None.
    • \n
    • video_codec (str, optional): Video codec. Defaults to \"copy\".
    • \n
    • video_disable (bool, optional): Disable video. Defaults to False.
    • \n
    • subtitle_disable (bool, optional): Disable subtitles. Defaults to False.
    • \n
    • metadata_disable (bool, optional): Disable metadata. Defaults to False.
    • \n
    • chapters_disable (bool, optional): Disable chapters. Defaults to False.
    • \n
    • extra_input_options (list, optional): Extra input options. Defaults to None.
    • \n
    • extra_output_options (list, optional): Extra output options. Defaults to None.
    • \n
    • output_format (str, optional): Output format. Defaults to None.
    • \n
    • dry_run (bool, optional): Dry run. Defaults to False.
    • \n
    • debug (bool, optional): Debug. Defaults to False.
    • \n
    • progress (bool, optional): Progress. Defaults to False.
    • \n
    \n\n
    Raises:
    \n\n
      \n
    • FFmpegNormalizeError: If the ffmpeg executable is not found or does not support the loudnorm filter.
    • \n
    \n"}, "ffmpeg_normalize.FFmpegNormalize.__init__": {"fullname": "ffmpeg_normalize.FFmpegNormalize.__init__", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.__init__", "kind": "function", "doc": "

    \n", "signature": "(\tnormalization_type: Literal['ebu', 'rms', 'peak'] = 'ebu',\ttarget_level: float = -23.0,\tprint_stats: bool = False,\tloudness_range_target: float = 7.0,\tkeep_loudness_range_target: bool = False,\tkeep_lra_above_loudness_range_target: bool = False,\ttrue_peak: float = -2.0,\toffset: float = 0.0,\tdual_mono: bool = False,\tdynamic: bool = False,\taudio_codec: str = 'pcm_s16le',\taudio_bitrate: float | None = None,\tsample_rate: float | int | None = None,\taudio_channels: int | None = None,\tkeep_original_audio: bool = False,\tpre_filter: str | None = None,\tpost_filter: str | None = None,\tvideo_codec: str = 'copy',\tvideo_disable: bool = False,\tsubtitle_disable: bool = False,\tmetadata_disable: bool = False,\tchapters_disable: bool = False,\textra_input_options: list[str] | None = None,\textra_output_options: list[str] | None = None,\toutput_format: str | None = None,\tdry_run: bool = False,\tdebug: bool = False,\tprogress: bool = False)"}, "ffmpeg_normalize.FFmpegNormalize.ffmpeg_exe": {"fullname": "ffmpeg_normalize.FFmpegNormalize.ffmpeg_exe", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.ffmpeg_exe", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.has_loudnorm_capabilities": {"fullname": "ffmpeg_normalize.FFmpegNormalize.has_loudnorm_capabilities", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.has_loudnorm_capabilities", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.normalization_type": {"fullname": "ffmpeg_normalize.FFmpegNormalize.normalization_type", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.normalization_type", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.print_stats": {"fullname": "ffmpeg_normalize.FFmpegNormalize.print_stats", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.print_stats", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.loudness_range_target": {"fullname": "ffmpeg_normalize.FFmpegNormalize.loudness_range_target", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.loudness_range_target", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.keep_loudness_range_target": {"fullname": "ffmpeg_normalize.FFmpegNormalize.keep_loudness_range_target", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.keep_loudness_range_target", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"fullname": "ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.keep_lra_above_loudness_range_target", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.true_peak": {"fullname": "ffmpeg_normalize.FFmpegNormalize.true_peak", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.true_peak", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.offset": {"fullname": "ffmpeg_normalize.FFmpegNormalize.offset", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.offset", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.dual_mono": {"fullname": "ffmpeg_normalize.FFmpegNormalize.dual_mono", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.dual_mono", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.dynamic": {"fullname": "ffmpeg_normalize.FFmpegNormalize.dynamic", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.dynamic", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.sample_rate": {"fullname": "ffmpeg_normalize.FFmpegNormalize.sample_rate", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.sample_rate", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.audio_channels": {"fullname": "ffmpeg_normalize.FFmpegNormalize.audio_channels", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.audio_channels", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.audio_codec": {"fullname": "ffmpeg_normalize.FFmpegNormalize.audio_codec", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.audio_codec", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.audio_bitrate": {"fullname": "ffmpeg_normalize.FFmpegNormalize.audio_bitrate", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.audio_bitrate", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.keep_original_audio": {"fullname": "ffmpeg_normalize.FFmpegNormalize.keep_original_audio", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.keep_original_audio", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.video_codec": {"fullname": "ffmpeg_normalize.FFmpegNormalize.video_codec", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.video_codec", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.video_disable": {"fullname": "ffmpeg_normalize.FFmpegNormalize.video_disable", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.video_disable", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.subtitle_disable": {"fullname": "ffmpeg_normalize.FFmpegNormalize.subtitle_disable", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.subtitle_disable", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.metadata_disable": {"fullname": "ffmpeg_normalize.FFmpegNormalize.metadata_disable", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.metadata_disable", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.chapters_disable": {"fullname": "ffmpeg_normalize.FFmpegNormalize.chapters_disable", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.chapters_disable", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.extra_input_options": {"fullname": "ffmpeg_normalize.FFmpegNormalize.extra_input_options", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.extra_input_options", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.extra_output_options": {"fullname": "ffmpeg_normalize.FFmpegNormalize.extra_output_options", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.extra_output_options", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.pre_filter": {"fullname": "ffmpeg_normalize.FFmpegNormalize.pre_filter", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.pre_filter", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.post_filter": {"fullname": "ffmpeg_normalize.FFmpegNormalize.post_filter", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.post_filter", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.output_format": {"fullname": "ffmpeg_normalize.FFmpegNormalize.output_format", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.output_format", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.dry_run": {"fullname": "ffmpeg_normalize.FFmpegNormalize.dry_run", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.dry_run", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.debug": {"fullname": "ffmpeg_normalize.FFmpegNormalize.debug", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.debug", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.progress": {"fullname": "ffmpeg_normalize.FFmpegNormalize.progress", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.progress", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.stats": {"fullname": "ffmpeg_normalize.FFmpegNormalize.stats", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.stats", "kind": "variable", "doc": "

    \n", "annotation": ": list[ffmpeg_normalize._streams.LoudnessStatisticsWithMetadata]"}, "ffmpeg_normalize.FFmpegNormalize.media_files": {"fullname": "ffmpeg_normalize.FFmpegNormalize.media_files", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.media_files", "kind": "variable", "doc": "

    \n", "annotation": ": list[ffmpeg_normalize._media_file.MediaFile]"}, "ffmpeg_normalize.FFmpegNormalize.file_count": {"fullname": "ffmpeg_normalize.FFmpegNormalize.file_count", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.file_count", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"fullname": "ffmpeg_normalize.FFmpegNormalize.add_media_file", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.add_media_file", "kind": "function", "doc": "

    Add a media file to normalize

    \n\n
    Arguments:
    \n\n
      \n
    • input_file (str): Path to input file
    • \n
    • output_file (str): Path to output file
    • \n
    \n", "signature": "(self, input_file: str, output_file: str) -> None:", "funcdef": "def"}, "ffmpeg_normalize.FFmpegNormalize.run_normalization": {"fullname": "ffmpeg_normalize.FFmpegNormalize.run_normalization", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.run_normalization", "kind": "function", "doc": "

    Run the normalization procedures

    \n", "signature": "(self) -> None:", "funcdef": "def"}, "ffmpeg_normalize.FFmpegNormalizeError": {"fullname": "ffmpeg_normalize.FFmpegNormalizeError", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalizeError", "kind": "class", "doc": "

    Common base class for all non-exit exceptions.

    \n", "bases": "builtins.Exception"}, "ffmpeg_normalize.MediaFile": {"fullname": "ffmpeg_normalize.MediaFile", "modulename": "ffmpeg_normalize", "qualname": "MediaFile", "kind": "class", "doc": "

    Class that holds a file, its streams and adjustments

    \n"}, "ffmpeg_normalize.MediaFile.__init__": {"fullname": "ffmpeg_normalize.MediaFile.__init__", "modulename": "ffmpeg_normalize", "qualname": "MediaFile.__init__", "kind": "function", "doc": "

    Initialize a media file for later normalization by parsing the streams.

    \n\n
    Arguments:
    \n\n
      \n
    • ffmpeg_normalize (FFmpegNormalize): reference to overall settings
    • \n
    • input_file (str): Path to input file
    • \n
    • output_file (str): Path to output file
    • \n
    \n", "signature": "(\tffmpeg_normalize: ffmpeg_normalize._ffmpeg_normalize.FFmpegNormalize,\tinput_file: str,\toutput_file: str)"}, "ffmpeg_normalize.MediaFile.ffmpeg_normalize": {"fullname": "ffmpeg_normalize.MediaFile.ffmpeg_normalize", "modulename": "ffmpeg_normalize", "qualname": "MediaFile.ffmpeg_normalize", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.MediaFile.skip": {"fullname": "ffmpeg_normalize.MediaFile.skip", "modulename": "ffmpeg_normalize", "qualname": "MediaFile.skip", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.MediaFile.input_file": {"fullname": "ffmpeg_normalize.MediaFile.input_file", "modulename": "ffmpeg_normalize", "qualname": "MediaFile.input_file", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.MediaFile.output_file": {"fullname": "ffmpeg_normalize.MediaFile.output_file", "modulename": "ffmpeg_normalize", "qualname": "MediaFile.output_file", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.MediaFile.output_ext": {"fullname": "ffmpeg_normalize.MediaFile.output_ext", "modulename": "ffmpeg_normalize", "qualname": "MediaFile.output_ext", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.MediaFile.streams": {"fullname": "ffmpeg_normalize.MediaFile.streams", "modulename": "ffmpeg_normalize", "qualname": "MediaFile.streams", "kind": "variable", "doc": "

    \n", "annotation": ": ffmpeg_normalize._media_file.StreamDict"}, "ffmpeg_normalize.MediaFile.parse_streams": {"fullname": "ffmpeg_normalize.MediaFile.parse_streams", "modulename": "ffmpeg_normalize", "qualname": "MediaFile.parse_streams", "kind": "function", "doc": "

    Try to parse all input streams from file and set them in self.streams.

    \n\n
    Raises:
    \n\n
      \n
    • FFmpegNormalizeError: If no audio streams are found
    • \n
    \n", "signature": "(self) -> None:", "funcdef": "def"}, "ffmpeg_normalize.MediaFile.run_normalization": {"fullname": "ffmpeg_normalize.MediaFile.run_normalization", "modulename": "ffmpeg_normalize", "qualname": "MediaFile.run_normalization", "kind": "function", "doc": "

    Run the normalization process for this file.

    \n", "signature": "(self) -> None:", "funcdef": "def"}, "ffmpeg_normalize.AudioStream": {"fullname": "ffmpeg_normalize.AudioStream", "modulename": "ffmpeg_normalize", "qualname": "AudioStream", "kind": "class", "doc": "

    \n", "bases": "ffmpeg_normalize._streams.MediaStream"}, "ffmpeg_normalize.AudioStream.__init__": {"fullname": "ffmpeg_normalize.AudioStream.__init__", "modulename": "ffmpeg_normalize", "qualname": "AudioStream.__init__", "kind": "function", "doc": "

    Create an AudioStream object.

    \n\n
    Arguments:
    \n\n
      \n
    • ffmpeg_normalize (FFmpegNormalize): The FFmpegNormalize object.
    • \n
    • media_file (MediaFile): The MediaFile object.
    • \n
    • stream_id (int): The stream ID.
    • \n
    • sample_rate (int): sample rate in Hz
    • \n
    • bit_depth (int): bit depth in bits
    • \n
    • duration (float): duration in seconds
    • \n
    \n", "signature": "(\tffmpeg_normalize: ffmpeg_normalize._ffmpeg_normalize.FFmpegNormalize,\tmedia_file: ffmpeg_normalize._media_file.MediaFile,\tstream_id: int,\tsample_rate: int | None,\tbit_depth: int | None,\tduration: float | None)"}, "ffmpeg_normalize.AudioStream.loudness_statistics": {"fullname": "ffmpeg_normalize.AudioStream.loudness_statistics", "modulename": "ffmpeg_normalize", "qualname": "AudioStream.loudness_statistics", "kind": "variable", "doc": "

    \n", "annotation": ": ffmpeg_normalize._streams.LoudnessStatistics"}, "ffmpeg_normalize.AudioStream.sample_rate": {"fullname": "ffmpeg_normalize.AudioStream.sample_rate", "modulename": "ffmpeg_normalize", "qualname": "AudioStream.sample_rate", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.AudioStream.bit_depth": {"fullname": "ffmpeg_normalize.AudioStream.bit_depth", "modulename": "ffmpeg_normalize", "qualname": "AudioStream.bit_depth", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.AudioStream.duration": {"fullname": "ffmpeg_normalize.AudioStream.duration", "modulename": "ffmpeg_normalize", "qualname": "AudioStream.duration", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.AudioStream.get_stats": {"fullname": "ffmpeg_normalize.AudioStream.get_stats", "modulename": "ffmpeg_normalize", "qualname": "AudioStream.get_stats", "kind": "function", "doc": "

    Return loudness statistics for the stream.

    \n\n
    Returns:
    \n\n
    \n

    dict: A dictionary containing the loudness statistics.

    \n
    \n", "signature": "(self) -> ffmpeg_normalize._streams.LoudnessStatisticsWithMetadata:", "funcdef": "def"}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"fullname": "ffmpeg_normalize.AudioStream.set_second_pass_stats", "modulename": "ffmpeg_normalize", "qualname": "AudioStream.set_second_pass_stats", "kind": "function", "doc": "

    Set the EBU loudness statistics for the second pass.

    \n\n
    Arguments:
    \n\n
      \n
    • stats (dict): The EBU loudness statistics.
    • \n
    \n", "signature": "(self, stats: ffmpeg_normalize._streams.EbuLoudnessStatistics):", "funcdef": "def"}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"fullname": "ffmpeg_normalize.AudioStream.get_pcm_codec", "modulename": "ffmpeg_normalize", "qualname": "AudioStream.get_pcm_codec", "kind": "function", "doc": "

    Get the PCM codec string for the stream.

    \n\n
    Returns:
    \n\n
    \n

    str: The PCM codec string.

    \n
    \n", "signature": "(self) -> str:", "funcdef": "def"}, "ffmpeg_normalize.AudioStream.parse_astats": {"fullname": "ffmpeg_normalize.AudioStream.parse_astats", "modulename": "ffmpeg_normalize", "qualname": "AudioStream.parse_astats", "kind": "function", "doc": "

    Use ffmpeg with astats filter to get the mean (RMS) and max (peak) volume of the input file.

    \n\n
    Yields:
    \n\n
    \n

    float: The progress of the command.

    \n
    \n", "signature": "(self) -> Iterator[float]:", "funcdef": "def"}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"fullname": "ffmpeg_normalize.AudioStream.parse_loudnorm_stats", "modulename": "ffmpeg_normalize", "qualname": "AudioStream.parse_loudnorm_stats", "kind": "function", "doc": "

    Run a first pass loudnorm filter to get measured data.

    \n\n
    Yields:
    \n\n
    \n

    float: The progress of the command.

    \n
    \n", "signature": "(self) -> Iterator[float]:", "funcdef": "def"}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"fullname": "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output", "modulename": "ffmpeg_normalize", "qualname": "AudioStream.prune_and_parse_loudnorm_output", "kind": "function", "doc": "

    Prune ffmpeg progress lines from output and parse the loudnorm filter output.\nThere may be multiple outputs if multiple streams were processed.

    \n\n
    Arguments:
    \n\n
      \n
    • output (str): The output from ffmpeg.
    • \n
    • num_stats (int): The number of loudnorm statistics to parse.
    • \n
    \n\n
    Returns:
    \n\n
    \n

    list: The EBU loudness statistics.

    \n
    \n", "signature": "(\toutput: str,\tnum_stats: int = 1) -> List[ffmpeg_normalize._streams.EbuLoudnessStatistics]:", "funcdef": "def"}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"fullname": "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu", "modulename": "ffmpeg_normalize", "qualname": "AudioStream.get_second_pass_opts_ebu", "kind": "function", "doc": "

    Return second pass loudnorm filter options string for ffmpeg

    \n", "signature": "(self) -> str:", "funcdef": "def"}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"fullname": "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms", "modulename": "ffmpeg_normalize", "qualname": "AudioStream.get_second_pass_opts_peakrms", "kind": "function", "doc": "

    Set the adjustment gain based on chosen option and mean/max volume,\nreturn the matching ffmpeg volume filter.

    \n\n
    Returns:
    \n\n
    \n

    str: ffmpeg volume filter string

    \n
    \n", "signature": "(self) -> str:", "funcdef": "def"}, "ffmpeg_normalize.VideoStream": {"fullname": "ffmpeg_normalize.VideoStream", "modulename": "ffmpeg_normalize", "qualname": "VideoStream", "kind": "class", "doc": "

    \n", "bases": "ffmpeg_normalize._streams.MediaStream"}, "ffmpeg_normalize.VideoStream.__init__": {"fullname": "ffmpeg_normalize.VideoStream.__init__", "modulename": "ffmpeg_normalize", "qualname": "VideoStream.__init__", "kind": "function", "doc": "

    Create a MediaStream object.

    \n\n
    Arguments:
    \n\n
      \n
    • ffmpeg_normalize (FFmpegNormalize): The FFmpegNormalize object.
    • \n
    • media_file (MediaFile): The MediaFile object.
    • \n
    • stream_type (Literal[\"audio\", \"video\", \"subtitle\"]): The type of the stream.
    • \n
    • stream_id (int): The stream ID.
    • \n
    \n", "signature": "(\tffmpeg_normalize: ffmpeg_normalize._ffmpeg_normalize.FFmpegNormalize,\tmedia_file: ffmpeg_normalize._media_file.MediaFile,\tstream_id: int)"}, "ffmpeg_normalize.SubtitleStream": {"fullname": "ffmpeg_normalize.SubtitleStream", "modulename": "ffmpeg_normalize", "qualname": "SubtitleStream", "kind": "class", "doc": "

    \n", "bases": "ffmpeg_normalize._streams.MediaStream"}, "ffmpeg_normalize.SubtitleStream.__init__": {"fullname": "ffmpeg_normalize.SubtitleStream.__init__", "modulename": "ffmpeg_normalize", "qualname": "SubtitleStream.__init__", "kind": "function", "doc": "

    Create a MediaStream object.

    \n\n
    Arguments:
    \n\n
      \n
    • ffmpeg_normalize (FFmpegNormalize): The FFmpegNormalize object.
    • \n
    • media_file (MediaFile): The MediaFile object.
    • \n
    • stream_type (Literal[\"audio\", \"video\", \"subtitle\"]): The type of the stream.
    • \n
    • stream_id (int): The stream ID.
    • \n
    \n", "signature": "(\tffmpeg_normalize: ffmpeg_normalize._ffmpeg_normalize.FFmpegNormalize,\tmedia_file: ffmpeg_normalize._media_file.MediaFile,\tstream_id: int)"}, "ffmpeg_normalize.MediaStream": {"fullname": "ffmpeg_normalize.MediaStream", "modulename": "ffmpeg_normalize", "qualname": "MediaStream", "kind": "class", "doc": "

    \n"}, "ffmpeg_normalize.MediaStream.__init__": {"fullname": "ffmpeg_normalize.MediaStream.__init__", "modulename": "ffmpeg_normalize", "qualname": "MediaStream.__init__", "kind": "function", "doc": "

    Create a MediaStream object.

    \n\n
    Arguments:
    \n\n
      \n
    • ffmpeg_normalize (FFmpegNormalize): The FFmpegNormalize object.
    • \n
    • media_file (MediaFile): The MediaFile object.
    • \n
    • stream_type (Literal[\"audio\", \"video\", \"subtitle\"]): The type of the stream.
    • \n
    • stream_id (int): The stream ID.
    • \n
    \n", "signature": "(\tffmpeg_normalize: ffmpeg_normalize._ffmpeg_normalize.FFmpegNormalize,\tmedia_file: ffmpeg_normalize._media_file.MediaFile,\tstream_type: Literal['audio', 'video', 'subtitle'],\tstream_id: int)"}, "ffmpeg_normalize.MediaStream.ffmpeg_normalize": {"fullname": "ffmpeg_normalize.MediaStream.ffmpeg_normalize", "modulename": "ffmpeg_normalize", "qualname": "MediaStream.ffmpeg_normalize", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.MediaStream.media_file": {"fullname": "ffmpeg_normalize.MediaStream.media_file", "modulename": "ffmpeg_normalize", "qualname": "MediaStream.media_file", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.MediaStream.stream_type": {"fullname": "ffmpeg_normalize.MediaStream.stream_type", "modulename": "ffmpeg_normalize", "qualname": "MediaStream.stream_type", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.MediaStream.stream_id": {"fullname": "ffmpeg_normalize.MediaStream.stream_id", "modulename": "ffmpeg_normalize", "qualname": "MediaStream.stream_id", "kind": "variable", "doc": "

    \n"}}, "docInfo": {"ffmpeg_normalize": {"qualname": 0, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 482}, "ffmpeg_normalize.FFmpegNormalize.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 661, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.ffmpeg_exe": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.has_loudnorm_capabilities": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.normalization_type": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.print_stats": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.loudness_range_target": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.keep_loudness_range_target": {"qualname": 5, "fullname": 7, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"qualname": 7, "fullname": 9, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.true_peak": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.offset": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.dual_mono": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.dynamic": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.sample_rate": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.audio_channels": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.audio_codec": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.audio_bitrate": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.keep_original_audio": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.video_codec": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.video_disable": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.subtitle_disable": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.metadata_disable": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.chapters_disable": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.extra_input_options": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.extra_output_options": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.pre_filter": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.post_filter": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.output_format": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.dry_run": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.debug": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.progress": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.stats": {"qualname": 2, "fullname": 4, "annotation": 5, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.media_files": {"qualname": 3, "fullname": 5, "annotation": 6, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.file_count": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 36, "bases": 0, "doc": 39}, "ffmpeg_normalize.FFmpegNormalize.run_normalization": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 14, "bases": 0, "doc": 6}, "ffmpeg_normalize.FFmpegNormalizeError": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 2, "doc": 11}, "ffmpeg_normalize.MediaFile": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 11}, "ffmpeg_normalize.MediaFile.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 53, "bases": 0, "doc": 57}, "ffmpeg_normalize.MediaFile.ffmpeg_normalize": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.MediaFile.skip": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.MediaFile.input_file": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.MediaFile.output_file": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.MediaFile.output_ext": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.MediaFile.streams": {"qualname": 2, "fullname": 4, "annotation": 6, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.MediaFile.parse_streams": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 14, "bases": 0, "doc": 35}, "ffmpeg_normalize.MediaFile.run_normalization": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 14, "bases": 0, "doc": 10}, "ffmpeg_normalize.AudioStream": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 4, "doc": 3}, "ffmpeg_normalize.AudioStream.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 119, "bases": 0, "doc": 84}, "ffmpeg_normalize.AudioStream.loudness_statistics": {"qualname": 3, "fullname": 5, "annotation": 5, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.AudioStream.sample_rate": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.AudioStream.bit_depth": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.AudioStream.duration": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.AudioStream.get_stats": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 26, "bases": 0, "doc": 26}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"qualname": 5, "fullname": 7, "annotation": 0, "default_value": 0, "signature": 33, "bases": 0, "doc": 31}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 14, "bases": 0, "doc": 26}, "ffmpeg_normalize.AudioStream.parse_astats": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 20, "bases": 0, "doc": 37}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 20, "bases": 0, "doc": 29}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"qualname": 6, "fullname": 8, "annotation": 0, "default_value": 0, "signature": 57, "bases": 0, "doc": 75}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"qualname": 6, "fullname": 8, "annotation": 0, "default_value": 0, "signature": 14, "bases": 0, "doc": 11}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"qualname": 6, "fullname": 8, "annotation": 0, "default_value": 0, "signature": 14, "bases": 0, "doc": 34}, "ffmpeg_normalize.VideoStream": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 4, "doc": 3}, "ffmpeg_normalize.VideoStream.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 66, "bases": 0, "doc": 68}, "ffmpeg_normalize.SubtitleStream": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 4, "doc": 3}, "ffmpeg_normalize.SubtitleStream.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 66, "bases": 0, "doc": 68}, "ffmpeg_normalize.MediaStream": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.MediaStream.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 108, "bases": 0, "doc": 68}, "ffmpeg_normalize.MediaStream.ffmpeg_normalize": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.MediaStream.media_file": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.MediaStream.stream_type": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.MediaStream.stream_id": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}}, "length": 72, "save": true}, "index": {"qualname": {"root": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 6, "f": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {"ffmpeg_normalize.FFmpegNormalize.ffmpeg_exe": {"tf": 1}, "ffmpeg_normalize.MediaFile.ffmpeg_normalize": {"tf": 1}, "ffmpeg_normalize.MediaStream.ffmpeg_normalize": {"tf": 1}}, "df": 3, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.ffmpeg_exe": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.has_loudnorm_capabilities": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.normalization_type": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.print_stats": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.true_peak": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.offset": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.dual_mono": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.dynamic": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.sample_rate": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.audio_channels": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.audio_codec": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.audio_bitrate": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_original_audio": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.video_codec": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.video_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.subtitle_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.metadata_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.chapters_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.extra_input_options": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.extra_output_options": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.pre_filter": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.post_filter": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.output_format": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.dry_run": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.debug": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.progress": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.stats": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.media_files": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.file_count": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.run_normalization": {"tf": 1}}, "df": 36, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_normalize.FFmpegNormalizeError": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_normalize.FFmpegNormalize.pre_filter": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.post_filter": {"tf": 1}}, "df": 2}}}, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.file_count": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.input_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.output_file": {"tf": 1}, "ffmpeg_normalize.MediaStream.media_file": {"tf": 1}}, "df": 5, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.media_files": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.output_format": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 6}}, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.extra_input_options": {"tf": 1}, "ffmpeg_normalize.MediaFile.input_file": {"tf": 1}}, "df": 2}}}}, "d": {"docs": {"ffmpeg_normalize.MediaStream.stream_id": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.ffmpeg_exe": {"tf": 1}}, "df": 1}, "t": {"docs": {"ffmpeg_normalize.MediaFile.output_ext": {"tf": 1}}, "df": 1, "r": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize.extra_input_options": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.extra_output_options": {"tf": 1}}, "df": 2}}}}, "b": {"docs": {}, "df": 0, "u": {"docs": {"ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}}, "df": 1}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.has_loudnorm_capabilities": {"tf": 1}}, "df": 1}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.FFmpegNormalize.has_loudnorm_capabilities": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 3}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.AudioStream.loudness_statistics": {"tf": 1}}, "df": 4}}}}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"tf": 1}}, "df": 1}}}, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.has_loudnorm_capabilities": {"tf": 1}}, "df": 1}}}}}}}}}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.audio_channels": {"tf": 1}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.chapters_disable": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {"ffmpeg_normalize.FFmpegNormalize.audio_codec": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.video_codec": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1}}, "df": 3}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.file_count": {"tf": 1}}, "df": 1}}}}}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.FFmpegNormalize.normalization_type": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.run_normalization": {"tf": 1}, "ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1}}, "df": 3}}}}}, "e": {"docs": {"ffmpeg_normalize.MediaFile.ffmpeg_normalize": {"tf": 1}, "ffmpeg_normalize.MediaStream.ffmpeg_normalize": {"tf": 1}}, "df": 2}}}}}}}}}, "t": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.normalization_type": {"tf": 1}, "ffmpeg_normalize.MediaStream.stream_type": {"tf": 1}}, "df": 2}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"tf": 1}}, "df": 3}}}}}, "r": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.true_peak": {"tf": 1}}, "df": 1}}}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.print_stats": {"tf": 1}}, "df": 1}}}, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.pre_filter": {"tf": 1}}, "df": 1}, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.progress": {"tf": 1}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "k": {"docs": {"ffmpeg_normalize.FFmpegNormalize.true_peak": {"tf": 1}}, "df": 1, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 1}}}}}}, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.post_filter": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 4}}}, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 3}}}, "c": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1}}, "df": 1}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.print_stats": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}}, "df": 5}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.AudioStream.loudness_statistics": {"tf": 1}}, "df": 1}}}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.MediaStream.stream_type": {"tf": 1}, "ffmpeg_normalize.MediaStream.stream_id": {"tf": 1}}, "df": 2, "s": {"docs": {"ffmpeg_normalize.MediaFile.streams": {"tf": 1}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}}, "df": 2}}}}}}, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.sample_rate": {"tf": 1}, "ffmpeg_normalize.AudioStream.sample_rate": {"tf": 1}}, "df": 2}}}}}, "u": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.subtitle_disable": {"tf": 1}}, "df": 1, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.SubtitleStream": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}}, "df": 2}}}}}}}}}}}}}, "k": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {"ffmpeg_normalize.MediaFile.skip": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}}, "df": 1}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 3}}}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"tf": 1}}, "df": 3}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.sample_rate": {"tf": 1}, "ffmpeg_normalize.AudioStream.sample_rate": {"tf": 1}}, "df": 2}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.FFmpegNormalize.dry_run": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.run_normalization": {"tf": 1}, "ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1}}, "df": 3}}}, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {"ffmpeg_normalize.FFmpegNormalize.keep_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_original_audio": {"tf": 1}}, "df": 3}}}}, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {"ffmpeg_normalize.FFmpegNormalize.audio_channels": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.audio_codec": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.audio_bitrate": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_original_audio": {"tf": 1}}, "df": 4, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.AudioStream": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.loudness_statistics": {"tf": 1}, "ffmpeg_normalize.AudioStream.sample_rate": {"tf": 1}, "ffmpeg_normalize.AudioStream.bit_depth": {"tf": 1}, "ffmpeg_normalize.AudioStream.duration": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 14}}}}}}}}}}, "d": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}}, "df": 1}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}}, "df": 1}}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.offset": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_normalize.FFmpegNormalize.keep_original_audio": {"tf": 1}}, "df": 1}}}}}}}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.extra_input_options": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.extra_output_options": {"tf": 1}}, "df": 2}}}}, "s": {"docs": {"ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 2}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.extra_output_options": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.output_format": {"tf": 1}, "ffmpeg_normalize.MediaFile.output_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.output_ext": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 5}}}}}}, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_normalize.FFmpegNormalize.dual_mono": {"tf": 1}}, "df": 1}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.AudioStream.duration": {"tf": 1}}, "df": 1}}}}}}}, "y": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {"ffmpeg_normalize.FFmpegNormalize.dynamic": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.video_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.subtitle_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.metadata_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.chapters_disable": {"tf": 1}}, "df": 4}}}}}}, "r": {"docs": {}, "df": 0, "y": {"docs": {"ffmpeg_normalize.FFmpegNormalize.dry_run": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "g": {"docs": {"ffmpeg_normalize.FFmpegNormalize.debug": {"tf": 1}}, "df": 1}}}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"ffmpeg_normalize.AudioStream.bit_depth": {"tf": 1}}, "df": 1}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {"ffmpeg_normalize.FFmpegNormalize.dual_mono": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize.metadata_disable": {"tf": 1}}, "df": 1}}}}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize.media_files": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}, "ffmpeg_normalize.MediaStream.media_file": {"tf": 1}}, "df": 3, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.MediaFile": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.MediaFile.ffmpeg_normalize": {"tf": 1}, "ffmpeg_normalize.MediaFile.skip": {"tf": 1}, "ffmpeg_normalize.MediaFile.input_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.output_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.output_ext": {"tf": 1}, "ffmpeg_normalize.MediaFile.streams": {"tf": 1}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1}}, "df": 10}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.MediaStream": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.ffmpeg_normalize": {"tf": 1}, "ffmpeg_normalize.MediaStream.media_file": {"tf": 1}, "ffmpeg_normalize.MediaStream.stream_type": {"tf": 1}, "ffmpeg_normalize.MediaStream.stream_id": {"tf": 1}}, "df": 6}}}}}}}}}}}, "b": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.AudioStream.bit_depth": {"tf": 1}}, "df": 1, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.audio_bitrate": {"tf": 1}}, "df": 1}}}}}}}, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "o": {"docs": {"ffmpeg_normalize.FFmpegNormalize.video_codec": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.video_disable": {"tf": 1}}, "df": 2, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.VideoStream": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}}, "df": 2}}}}}}}}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 4}}}}}, "fullname": {"root": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 6, "f": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {"ffmpeg_normalize": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.ffmpeg_exe": {"tf": 1.4142135623730951}, "ffmpeg_normalize.FFmpegNormalize.has_loudnorm_capabilities": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.normalization_type": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.print_stats": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.true_peak": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.offset": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.dual_mono": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.dynamic": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.sample_rate": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.audio_channels": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.audio_codec": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.audio_bitrate": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_original_audio": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.video_codec": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.video_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.subtitle_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.metadata_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.chapters_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.extra_input_options": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.extra_output_options": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.pre_filter": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.post_filter": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.output_format": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.dry_run": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.debug": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.progress": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.stats": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.media_files": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.file_count": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.run_normalization": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalizeError": {"tf": 1}, "ffmpeg_normalize.MediaFile": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.MediaFile.ffmpeg_normalize": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaFile.skip": {"tf": 1}, "ffmpeg_normalize.MediaFile.input_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.output_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.output_ext": {"tf": 1}, "ffmpeg_normalize.MediaFile.streams": {"tf": 1}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1}, "ffmpeg_normalize.AudioStream": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.loudness_statistics": {"tf": 1}, "ffmpeg_normalize.AudioStream.sample_rate": {"tf": 1}, "ffmpeg_normalize.AudioStream.bit_depth": {"tf": 1}, "ffmpeg_normalize.AudioStream.duration": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}, "ffmpeg_normalize.VideoStream": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.ffmpeg_normalize": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaStream.media_file": {"tf": 1}, "ffmpeg_normalize.MediaStream.stream_type": {"tf": 1}, "ffmpeg_normalize.MediaStream.stream_id": {"tf": 1}}, "df": 72, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.ffmpeg_exe": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.has_loudnorm_capabilities": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.normalization_type": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.print_stats": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.true_peak": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.offset": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.dual_mono": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.dynamic": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.sample_rate": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.audio_channels": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.audio_codec": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.audio_bitrate": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_original_audio": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.video_codec": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.video_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.subtitle_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.metadata_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.chapters_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.extra_input_options": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.extra_output_options": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.pre_filter": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.post_filter": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.output_format": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.dry_run": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.debug": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.progress": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.stats": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.media_files": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.file_count": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.run_normalization": {"tf": 1}}, "df": 36, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_normalize.FFmpegNormalizeError": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_normalize.FFmpegNormalize.pre_filter": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.post_filter": {"tf": 1}}, "df": 2}}}, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.file_count": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.input_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.output_file": {"tf": 1}, "ffmpeg_normalize.MediaStream.media_file": {"tf": 1}}, "df": 5, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.media_files": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.output_format": {"tf": 1}}, "df": 1}}}}}}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.ffmpeg_exe": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.has_loudnorm_capabilities": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.normalization_type": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.print_stats": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.true_peak": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.offset": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.dual_mono": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.dynamic": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.sample_rate": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.audio_channels": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.audio_codec": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.audio_bitrate": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_original_audio": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.video_codec": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.video_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.subtitle_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.metadata_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.chapters_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.extra_input_options": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.extra_output_options": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.pre_filter": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.post_filter": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.output_format": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.dry_run": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.debug": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.progress": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.stats": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.media_files": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.file_count": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.run_normalization": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalizeError": {"tf": 1}, "ffmpeg_normalize.MediaFile": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.MediaFile.ffmpeg_normalize": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaFile.skip": {"tf": 1}, "ffmpeg_normalize.MediaFile.input_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.output_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.output_ext": {"tf": 1}, "ffmpeg_normalize.MediaFile.streams": {"tf": 1}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1}, "ffmpeg_normalize.AudioStream": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.loudness_statistics": {"tf": 1}, "ffmpeg_normalize.AudioStream.sample_rate": {"tf": 1}, "ffmpeg_normalize.AudioStream.bit_depth": {"tf": 1}, "ffmpeg_normalize.AudioStream.duration": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}, "ffmpeg_normalize.VideoStream": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.ffmpeg_normalize": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaStream.media_file": {"tf": 1}, "ffmpeg_normalize.MediaStream.stream_type": {"tf": 1}, "ffmpeg_normalize.MediaStream.stream_id": {"tf": 1}}, "df": 72}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.FFmpegNormalize.normalization_type": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.run_normalization": {"tf": 1}, "ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1}}, "df": 3}}}}}}}}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 6}}, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.extra_input_options": {"tf": 1}, "ffmpeg_normalize.MediaFile.input_file": {"tf": 1}}, "df": 2}}}}, "d": {"docs": {"ffmpeg_normalize.MediaStream.stream_id": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.ffmpeg_exe": {"tf": 1}}, "df": 1}, "t": {"docs": {"ffmpeg_normalize.MediaFile.output_ext": {"tf": 1}}, "df": 1, "r": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize.extra_input_options": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.extra_output_options": {"tf": 1}}, "df": 2}}}}, "b": {"docs": {}, "df": 0, "u": {"docs": {"ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}}, "df": 1}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.has_loudnorm_capabilities": {"tf": 1}}, "df": 1}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.FFmpegNormalize.has_loudnorm_capabilities": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 3}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.AudioStream.loudness_statistics": {"tf": 1}}, "df": 4}}}}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"tf": 1}}, "df": 1}}}, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.has_loudnorm_capabilities": {"tf": 1}}, "df": 1}}}}}}}}}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.audio_channels": {"tf": 1}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.chapters_disable": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {"ffmpeg_normalize.FFmpegNormalize.audio_codec": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.video_codec": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1}}, "df": 3}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.file_count": {"tf": 1}}, "df": 1}}}}}, "t": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.normalization_type": {"tf": 1}, "ffmpeg_normalize.MediaStream.stream_type": {"tf": 1}}, "df": 2}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"tf": 1}}, "df": 3}}}}}, "r": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.true_peak": {"tf": 1}}, "df": 1}}}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.print_stats": {"tf": 1}}, "df": 1}}}, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.pre_filter": {"tf": 1}}, "df": 1}, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.progress": {"tf": 1}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "k": {"docs": {"ffmpeg_normalize.FFmpegNormalize.true_peak": {"tf": 1}}, "df": 1, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 1}}}}}}, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.post_filter": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 4}}}, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 3}}}, "c": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1}}, "df": 1}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.print_stats": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}}, "df": 5}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.AudioStream.loudness_statistics": {"tf": 1}}, "df": 1}}}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.MediaStream.stream_type": {"tf": 1}, "ffmpeg_normalize.MediaStream.stream_id": {"tf": 1}}, "df": 2, "s": {"docs": {"ffmpeg_normalize.MediaFile.streams": {"tf": 1}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}}, "df": 2}}}}}}, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.sample_rate": {"tf": 1}, "ffmpeg_normalize.AudioStream.sample_rate": {"tf": 1}}, "df": 2}}}}}, "u": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.subtitle_disable": {"tf": 1}}, "df": 1, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.SubtitleStream": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}}, "df": 2}}}}}}}}}}}}}, "k": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {"ffmpeg_normalize.MediaFile.skip": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}}, "df": 1}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 3}}}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"tf": 1}}, "df": 3}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.sample_rate": {"tf": 1}, "ffmpeg_normalize.AudioStream.sample_rate": {"tf": 1}}, "df": 2}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.FFmpegNormalize.dry_run": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.run_normalization": {"tf": 1}, "ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1}}, "df": 3}}}, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {"ffmpeg_normalize.FFmpegNormalize.keep_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_original_audio": {"tf": 1}}, "df": 3}}}}, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {"ffmpeg_normalize.FFmpegNormalize.audio_channels": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.audio_codec": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.audio_bitrate": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_original_audio": {"tf": 1}}, "df": 4, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.AudioStream": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.loudness_statistics": {"tf": 1}, "ffmpeg_normalize.AudioStream.sample_rate": {"tf": 1}, "ffmpeg_normalize.AudioStream.bit_depth": {"tf": 1}, "ffmpeg_normalize.AudioStream.duration": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 14}}}}}}}}}}, "d": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}}, "df": 1}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}}, "df": 1}}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.offset": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_normalize.FFmpegNormalize.keep_original_audio": {"tf": 1}}, "df": 1}}}}}}}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.extra_input_options": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.extra_output_options": {"tf": 1}}, "df": 2}}}}, "s": {"docs": {"ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 2}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.extra_output_options": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.output_format": {"tf": 1}, "ffmpeg_normalize.MediaFile.output_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.output_ext": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 5}}}}}}, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_normalize.FFmpegNormalize.dual_mono": {"tf": 1}}, "df": 1}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.AudioStream.duration": {"tf": 1}}, "df": 1}}}}}}}, "y": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {"ffmpeg_normalize.FFmpegNormalize.dynamic": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.video_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.subtitle_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.metadata_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.chapters_disable": {"tf": 1}}, "df": 4}}}}}}, "r": {"docs": {}, "df": 0, "y": {"docs": {"ffmpeg_normalize.FFmpegNormalize.dry_run": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "g": {"docs": {"ffmpeg_normalize.FFmpegNormalize.debug": {"tf": 1}}, "df": 1}}}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"ffmpeg_normalize.AudioStream.bit_depth": {"tf": 1}}, "df": 1}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {"ffmpeg_normalize.FFmpegNormalize.dual_mono": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize.metadata_disable": {"tf": 1}}, "df": 1}}}}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize.media_files": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}, "ffmpeg_normalize.MediaStream.media_file": {"tf": 1}}, "df": 3, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.MediaFile": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.MediaFile.ffmpeg_normalize": {"tf": 1}, "ffmpeg_normalize.MediaFile.skip": {"tf": 1}, "ffmpeg_normalize.MediaFile.input_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.output_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.output_ext": {"tf": 1}, "ffmpeg_normalize.MediaFile.streams": {"tf": 1}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1}}, "df": 10}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.MediaStream": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.ffmpeg_normalize": {"tf": 1}, "ffmpeg_normalize.MediaStream.media_file": {"tf": 1}, "ffmpeg_normalize.MediaStream.stream_type": {"tf": 1}, "ffmpeg_normalize.MediaStream.stream_id": {"tf": 1}}, "df": 6}}}}}}}}}}}, "b": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.AudioStream.bit_depth": {"tf": 1}}, "df": 1, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.audio_bitrate": {"tf": 1}}, "df": 1}}}}}}}, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "o": {"docs": {"ffmpeg_normalize.FFmpegNormalize.video_codec": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.video_disable": {"tf": 1}}, "df": 2, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.VideoStream": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}}, "df": 2}}}}}}}}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 4}}}}}, "annotation": {"root": {"docs": {"ffmpeg_normalize.FFmpegNormalize.stats": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.media_files": {"tf": 1}, "ffmpeg_normalize.MediaFile.streams": {"tf": 1}, "ffmpeg_normalize.AudioStream.loudness_statistics": {"tf": 1}}, "df": 4, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "[": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {"ffmpeg_normalize.FFmpegNormalize.stats": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.media_files": {"tf": 1}}, "df": 2}}}}}}}}}}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.AudioStream.loudness_statistics": {"tf": 1}}, "df": 1, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize.stats": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.stats": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.media_files": {"tf": 1}, "ffmpeg_normalize.MediaFile.streams": {"tf": 1}, "ffmpeg_normalize.AudioStream.loudness_statistics": {"tf": 1}}, "df": 4}}}}}}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.loudness_statistics": {"tf": 1}}, "df": 2}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.MediaFile.streams": {"tf": 1}}, "df": 1}}}}}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize.media_files": {"tf": 1}, "ffmpeg_normalize.MediaFile.streams": {"tf": 1}}, "df": 2, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.media_files": {"tf": 1}}, "df": 1}}}}}}}}}, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.media_files": {"tf": 1}, "ffmpeg_normalize.MediaFile.streams": {"tf": 1}}, "df": 2}}}, "f": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {"ffmpeg_normalize.MediaFile.streams": {"tf": 1}, "ffmpeg_normalize.AudioStream.loudness_statistics": {"tf": 1}}, "df": 2}}}}}}}}, "default_value": {"root": {"docs": {}, "df": 0}}, "signature": {"root": {"0": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 2.23606797749979}}, "df": 1}, "1": {"docs": {"ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 1}, "2": {"3": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}, "docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}, "3": {"9": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 3.4641016151377544}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 2.449489742783178}}, "df": 2}, "docs": {}, "df": 0}, "7": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}, "docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 22.627416997969522}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 5.291502622129181}, "ffmpeg_normalize.FFmpegNormalize.run_normalization": {"tf": 3.4641016151377544}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 6.324555320336759}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 3.4641016151377544}, "ffmpeg_normalize.MediaFile.run_normalization": {"tf": 3.4641016151377544}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 9.539392014169456}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 4.58257569495584}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 5.196152422706632}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 3.4641016151377544}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 4.123105625617661}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 4.123105625617661}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 6.782329983125268}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 3.4641016151377544}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 3.4641016151377544}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 7}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 7}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 8.888194417315589}}, "df": 18, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {"ffmpeg_normalize.MediaFile.__init__": {"tf": 1.7320508075688772}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 2}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 2}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 2}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 2}}, "df": 8}}}}}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 4}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.run_normalization": {"tf": 1}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1.7320508075688772}}, "df": 6}}}, "u": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 1}}}, "t": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 2}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 2}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 2}}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 2}}}, "e": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1.7320508075688772}}, "df": 1, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "u": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1.4142135623730951}}, "df": 1, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 2}}}}}}}}}}}}}}}}}}}}, "x": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1.7320508075688772}}, "df": 1}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}}, "df": 2}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "k": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}}}}}, "c": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}}, "f": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 2.449489742783178}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}}, "df": 4}}}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 3.605551275463989}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1.4142135623730951}}, "df": 6}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}}}, "f": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {"ffmpeg_normalize.MediaFile.__init__": {"tf": 1.7320508075688772}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 2}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 2}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 2}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 2}}, "df": 8, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 5}}}}}}}}}}}}}}}, "s": {"1": {"6": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}, "docs": {}, "df": 0}, "docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 3}}}, "r": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 2.6457513110645907}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 7, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1.4142135623730951}}, "df": 4, "s": {"docs": {"ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 3}}}}}}, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}}, "df": 2}}}}}, "u": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 2}}}}}}}, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "f": {"docs": {"ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.run_normalization": {"tf": 1}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 11}}}}, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 3.605551275463989}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1}}, "df": 1, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}}}}}, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1.7320508075688772}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 2}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 2}}}}}, "o": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}}}}}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 4}}}}}}, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1}}, "df": 1}}}}}}}, "y": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 2}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "y": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "g": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1}}, "df": 1}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1.4142135623730951}}, "df": 4, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 4}}}}}}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}, "p": {"docs": {}, "df": 0, "y": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1.7320508075688772}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 6}, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}}, "df": 3}}}}, "d": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 4}, "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_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}}, "df": 2}}}}}}}}, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "o": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 2}}}}}}}, "bases": {"root": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalizeError": {"tf": 1}}, "df": 1}}}}}}}}, "e": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "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_normalize.FFmpegNormalizeError": {"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_normalize.AudioStream": {"tf": 1}, "ffmpeg_normalize.VideoStream": {"tf": 1}, "ffmpeg_normalize.SubtitleStream": {"tf": 1}}, "df": 3}}}}}}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.AudioStream": {"tf": 1}, "ffmpeg_normalize.VideoStream": {"tf": 1}, "ffmpeg_normalize.SubtitleStream": {"tf": 1}}, "df": 3}}}}}}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.AudioStream": {"tf": 1}, "ffmpeg_normalize.VideoStream": {"tf": 1}, "ffmpeg_normalize.SubtitleStream": {"tf": 1}}, "df": 3}}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.AudioStream": {"tf": 1}, "ffmpeg_normalize.VideoStream": {"tf": 1}, "ffmpeg_normalize.SubtitleStream": {"tf": 1}}, "df": 3}}}}}}}}}}}}}, "doc": {"root": {"0": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 2.23606797749979}}, "df": 1}, "2": {"3": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}}, "df": 1}, "docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}}, "df": 1}, "7": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}}, "df": 1}, "docs": {"ffmpeg_normalize": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize": {"tf": 13.74772708486752}, "ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.ffmpeg_exe": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.has_loudnorm_capabilities": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.normalization_type": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.print_stats": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.loudness_range_target": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.keep_loudness_range_target": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.true_peak": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.offset": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.dual_mono": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.dynamic": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.sample_rate": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.audio_channels": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.audio_codec": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.audio_bitrate": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.keep_original_audio": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.video_codec": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.video_disable": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.subtitle_disable": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.metadata_disable": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.chapters_disable": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.extra_input_options": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.extra_output_options": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.pre_filter": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.post_filter": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.output_format": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.dry_run": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.debug": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.progress": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.stats": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.media_files": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.file_count": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 4.242640687119285}, "ffmpeg_normalize.FFmpegNormalize.run_normalization": {"tf": 1.4142135623730951}, "ffmpeg_normalize.FFmpegNormalizeError": {"tf": 1.7320508075688772}, "ffmpeg_normalize.MediaFile": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 4.898979485566356}, "ffmpeg_normalize.MediaFile.ffmpeg_normalize": {"tf": 1.7320508075688772}, "ffmpeg_normalize.MediaFile.skip": {"tf": 1.7320508075688772}, "ffmpeg_normalize.MediaFile.input_file": {"tf": 1.7320508075688772}, "ffmpeg_normalize.MediaFile.output_file": {"tf": 1.7320508075688772}, "ffmpeg_normalize.MediaFile.output_ext": {"tf": 1.7320508075688772}, "ffmpeg_normalize.MediaFile.streams": {"tf": 1.7320508075688772}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 3.605551275463989}, "ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1.7320508075688772}, "ffmpeg_normalize.AudioStream": {"tf": 1.7320508075688772}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 6.48074069840786}, "ffmpeg_normalize.AudioStream.loudness_statistics": {"tf": 1.7320508075688772}, "ffmpeg_normalize.AudioStream.sample_rate": {"tf": 1.7320508075688772}, "ffmpeg_normalize.AudioStream.bit_depth": {"tf": 1.7320508075688772}, "ffmpeg_normalize.AudioStream.duration": {"tf": 1.7320508075688772}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 3.4641016151377544}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 3.872983346207417}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 3.4641016151377544}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 3.4641016151377544}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 3.4641016151377544}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 5.477225575051661}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 3.3166247903554}, "ffmpeg_normalize.VideoStream": {"tf": 1.7320508075688772}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 5.830951894845301}, "ffmpeg_normalize.SubtitleStream": {"tf": 1.7320508075688772}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 5.830951894845301}, "ffmpeg_normalize.MediaStream": {"tf": 1.7320508075688772}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 5.830951894845301}, "ffmpeg_normalize.MediaStream.ffmpeg_normalize": {"tf": 1.7320508075688772}, "ffmpeg_normalize.MediaStream.media_file": {"tf": 1.7320508075688772}, "ffmpeg_normalize.MediaStream.stream_type": {"tf": 1.7320508075688772}, "ffmpeg_normalize.MediaStream.stream_id": {"tf": 1.7320508075688772}}, "df": 72, "f": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1.4142135623730951}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 10, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1.4142135623730951}}, "df": 5, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}}, "df": 2}}}}}}}}}}}}}}}}}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 2.23606797749979}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}}, "df": 4}}}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 3.605551275463989}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 2.23606797749979}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1.4142135623730951}}, "df": 6}}}, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 2.23606797749979}, "ffmpeg_normalize.MediaFile": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 2.23606797749979}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 10}}, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_normalize.FFmpegNormalizeError": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}}, "df": 7, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}}, "df": 2}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1.4142135623730951}}, "df": 2}}}}, "n": {"docs": {}, "df": 0, "o": {"docs": {"ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}}, "df": 1, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 7}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}, "ffmpeg_normalize.FFmpegNormalize.run_normalization": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1}}, "df": 4}}}}}}}}}}}, "n": {"docs": {"ffmpeg_normalize.FFmpegNormalizeError": {"tf": 1}}, "df": 1, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 3}}, "df": 1}}, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}, "u": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 1, "b": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 1}}}}}}, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalizeError": {"tf": 1}, "ffmpeg_normalize.MediaFile": {"tf": 1}}, "df": 3}}}}, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 2}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1.4142135623730951}}, "df": 2}}}, "p": {"docs": {}, "df": 0, "y": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}}, "df": 1}}, "m": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.FFmpegNormalizeError": {"tf": 1}}, "df": 1}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}}, "df": 2}}}}}, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}}, "df": 1}}}}}}}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 4}}}}}}, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}, "ffmpeg_normalize.MediaFile": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 8, "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": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 9}}}}}}}, "e": {"docs": {"ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}}, "df": 1}}, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 2.8284271247461903}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 5, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1}}, "df": 1}}}}}}}}}}, "d": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}}, "df": 1}, "j": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 1, "s": {"docs": {"ffmpeg_normalize.MediaFile": {"tf": 1}}, "df": 1}}}}}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_normalize.FFmpegNormalizeError": {"tf": 1}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}}, "df": 2}}, "n": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1}}, "df": 1, "d": {"docs": {"ffmpeg_normalize.MediaFile": {"tf": 1}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 5}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1.4142135623730951}}, "df": 4}}}, "o": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 5.291502622129181}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1.7320508075688772}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1.7320508075688772}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 7}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 2.8284271247461903}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}, "y": {"docs": {"ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}}, "df": 1}}, "h": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}, "ffmpeg_normalize.FFmpegNormalize.run_normalization": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1.7320508075688772}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1.7320508075688772}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1.7320508075688772}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 2}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 2}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1.4142135623730951}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 2.23606797749979}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 2.23606797749979}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 2.23606797749979}}, "df": 15, "m": {"docs": {"ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}}, "df": 1}, "r": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.MediaFile": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1}}, "df": 1}}}}, "s": {"1": {"6": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}}, "df": 1}}}, "docs": {}, "df": 0}, "docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 2.449489742783178}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 6, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 2}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 2}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 2}}, "df": 6, "s": {"docs": {"ffmpeg_normalize.MediaFile": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1.7320508075688772}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 4}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 3}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 3}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.AudioStream.get_stats": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1.4142135623730951}}, "df": 3}}}}}}}}}, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1.4142135623730951}}, "df": 2}}}}}, "u": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 4, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}}, "df": 1}}}}}}}, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 3, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.MediaFile.__init__": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {}, "df": 0, "f": {"docs": {"ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}}, "df": 2, "s": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 1, "a": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 5.291502622129181}}, "df": 1}}, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 2}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}}, "df": 2}}}}}}, "f": {"docs": {"ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 6, "f": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "r": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}}, "df": 1, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 2}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 2}}, "df": 4, "s": {"docs": {"ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 1}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_normalize.MediaFile.__init__": {"tf": 1}}, "df": 1}}}}}}, "b": {"docs": {}, "df": 0, "j": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1.7320508075688772}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1.7320508075688772}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1.7320508075688772}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1.7320508075688772}}, "df": 4}}}}}, "n": {"docs": {"ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 1}}, "d": {"docs": {}, "df": 0, "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_normalize.FFmpegNormalize": {"tf": 5.291502622129181}}, "df": 1}}}}}}, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "g": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}, "y": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 2.8284271247461903}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}}, "df": 1}}}}}}}}}, "r": {"docs": {}, "df": 0, "y": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}, "o": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "u": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 3}}, "x": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 2}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}}, "df": 1}}}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalizeError": {"tf": 1}}, "df": 1}}, "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": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalizeError": {"tf": 1}}, "df": 1}}}}}}}}}}, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}}, "df": 4}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 2.6457513110645907}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 4}}}}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 2}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 1}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 3}}}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_normalize.MediaFile.__init__": {"tf": 1}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}}, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 4}}}}}, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.run_normalization": {"tf": 1}}, "df": 1}}}}}, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 1}}}}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "k": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}}, "df": 2}}}, "c": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1.4142135623730951}}, "df": 2}}, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1.4142135623730951}}, "df": 2}}, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"ffmpeg_normalize.MediaFile.__init__": {"tf": 1}}, "df": 1}}}, "e": {"docs": {"ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1.4142135623730951}}, "df": 2}}}, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}}, "df": 3}}}}, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 3.605551275463989}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1.4142135623730951}}, "df": 1, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}}}, "s": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalizeError": {"tf": 1}}, "df": 1, "d": {"docs": {"ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 1}}}}, "y": {"docs": {"ffmpeg_normalize.MediaFile.__init__": {"tf": 1}}, "df": 1}, "e": {"docs": {"ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 1}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 2.6457513110645907}}, "df": 1}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1.4142135623730951}}, "df": 2}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}}, "df": 2}}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}, "ffmpeg_normalize.FFmpegNormalize.run_normalization": {"tf": 1}, "ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}}, "df": 4}}, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.MediaFile.__init__": {"tf": 1}}, "df": 1}}}}}}}, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 3, "s": {"docs": {"ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 4}}}}}}, "m": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}}, "df": 1}}}, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 2.449489742783178}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1.7320508075688772}}, "df": 2, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}}, "df": 5}}}, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1.7320508075688772}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 6}, "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_normalize.MediaFile.__init__": {"tf": 1}}, "df": 1}}}}}}}}}, "f": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 3}, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}}, "df": 1}, "t": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.MediaFile": {"tf": 1}}, "df": 1}}, "d": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1.4142135623730951}}, "df": 4}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 6, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1.4142135623730951}}, "df": 4}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 3}}}}}}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}}, "df": 1, "/": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "x": {"docs": {"ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 1}}}}}, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}}, "df": 1}}}}}}}, "a": {"docs": {}, "df": 0, "x": {"docs": {"ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}}, "df": 1}, "y": {"docs": {"ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 1}, "t": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 1}}}}}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "o": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 2}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 4}}}}, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1.7320508075688772}}, "df": 2}}}}}}, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.MediaFile": {"tf": 1}}, "df": 1}}}}, "z": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1}}, "df": 1}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}}, "df": 3}}, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}}, "df": 1}}}, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 1}}}}, "y": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}}, "df": 2}}}}}}}}}, "pipeline": ["trimmer"], "_isPrebuiltIndex": true}; + /** pdoc search index */const docs = {"version": "0.9.5", "fields": ["qualname", "fullname", "annotation", "default_value", "signature", "bases", "doc"], "ref": "fullname", "documentStore": {"docs": {"ffmpeg_normalize": {"fullname": "ffmpeg_normalize", "modulename": "ffmpeg_normalize", "kind": "module", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize": {"fullname": "ffmpeg_normalize.FFmpegNormalize", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize", "kind": "class", "doc": "

    ffmpeg-normalize class.

    \n\n
    Arguments:
    \n\n
      \n
    • normalization_type (str, optional): Normalization type. Defaults to \"ebu\".
    • \n
    • target_level (float, optional): Target level. Defaults to -23.0.
    • \n
    • print_stats (bool, optional): Print loudnorm stats. Defaults to False.
    • \n
    • loudness_range_target (float, optional): Loudness range target. Defaults to 7.0.
    • \n
    • keep_loudness_range_target (bool, optional): Keep loudness range target. Defaults to False.
    • \n
    • keep_lra_above_loudness_range_target (bool, optional): Keep input loudness range above loudness range target. Defaults to False.
    • \n
    • true_peak (float, optional): True peak. Defaults to -2.0.
    • \n
    • offset (float, optional): Offset. Defaults to 0.0.
    • \n
    • lower_only (bool, optional): Whether the audio should not increase in loudness. Defaults to False.
    • \n
    • dual_mono (bool, optional): Dual mono. Defaults to False.
    • \n
    • dynamic (bool, optional): Dynamic. Defaults to False.
    • \n
    • audio_codec (str, optional): Audio codec. Defaults to \"pcm_s16le\".
    • \n
    • audio_bitrate (float, optional): Audio bitrate. Defaults to None.
    • \n
    • sample_rate (int, optional): Sample rate. Defaults to None.
    • \n
    • audio_channels (int | None, optional): Audio channels. Defaults to None.
    • \n
    • keep_original_audio (bool, optional): Keep original audio. Defaults to False.
    • \n
    • pre_filter (str, optional): Pre filter. Defaults to None.
    • \n
    • post_filter (str, optional): Post filter. Defaults to None.
    • \n
    • video_codec (str, optional): Video codec. Defaults to \"copy\".
    • \n
    • video_disable (bool, optional): Disable video. Defaults to False.
    • \n
    • subtitle_disable (bool, optional): Disable subtitles. Defaults to False.
    • \n
    • metadata_disable (bool, optional): Disable metadata. Defaults to False.
    • \n
    • chapters_disable (bool, optional): Disable chapters. Defaults to False.
    • \n
    • extra_input_options (list, optional): Extra input options. Defaults to None.
    • \n
    • extra_output_options (list, optional): Extra output options. Defaults to None.
    • \n
    • output_format (str, optional): Output format. Defaults to None.
    • \n
    • dry_run (bool, optional): Dry run. Defaults to False.
    • \n
    • debug (bool, optional): Debug. Defaults to False.
    • \n
    • progress (bool, optional): Progress. Defaults to False.
    • \n
    \n\n
    Raises:
    \n\n
      \n
    • FFmpegNormalizeError: If the ffmpeg executable is not found or does not support the loudnorm filter.
    • \n
    \n"}, "ffmpeg_normalize.FFmpegNormalize.__init__": {"fullname": "ffmpeg_normalize.FFmpegNormalize.__init__", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.__init__", "kind": "function", "doc": "

    \n", "signature": "(\tnormalization_type: Literal['ebu', 'rms', 'peak'] = 'ebu',\ttarget_level: float = -23.0,\tprint_stats: bool = False,\tloudness_range_target: float = 7.0,\tkeep_loudness_range_target: bool = False,\tkeep_lra_above_loudness_range_target: bool = False,\ttrue_peak: float = -2.0,\toffset: float = 0.0,\tlower_only: bool = False,\tdual_mono: bool = False,\tdynamic: bool = False,\taudio_codec: str = 'pcm_s16le',\taudio_bitrate: float | None = None,\tsample_rate: float | int | None = None,\taudio_channels: int | None = None,\tkeep_original_audio: bool = False,\tpre_filter: str | None = None,\tpost_filter: str | None = None,\tvideo_codec: str = 'copy',\tvideo_disable: bool = False,\tsubtitle_disable: bool = False,\tmetadata_disable: bool = False,\tchapters_disable: bool = False,\textra_input_options: list[str] | None = None,\textra_output_options: list[str] | None = None,\toutput_format: str | None = None,\tdry_run: bool = False,\tdebug: bool = False,\tprogress: bool = False)"}, "ffmpeg_normalize.FFmpegNormalize.ffmpeg_exe": {"fullname": "ffmpeg_normalize.FFmpegNormalize.ffmpeg_exe", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.ffmpeg_exe", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.has_loudnorm_capabilities": {"fullname": "ffmpeg_normalize.FFmpegNormalize.has_loudnorm_capabilities", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.has_loudnorm_capabilities", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.normalization_type": {"fullname": "ffmpeg_normalize.FFmpegNormalize.normalization_type", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.normalization_type", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.print_stats": {"fullname": "ffmpeg_normalize.FFmpegNormalize.print_stats", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.print_stats", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.loudness_range_target": {"fullname": "ffmpeg_normalize.FFmpegNormalize.loudness_range_target", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.loudness_range_target", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.keep_loudness_range_target": {"fullname": "ffmpeg_normalize.FFmpegNormalize.keep_loudness_range_target", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.keep_loudness_range_target", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"fullname": "ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.keep_lra_above_loudness_range_target", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.true_peak": {"fullname": "ffmpeg_normalize.FFmpegNormalize.true_peak", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.true_peak", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.offset": {"fullname": "ffmpeg_normalize.FFmpegNormalize.offset", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.offset", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.lower_only": {"fullname": "ffmpeg_normalize.FFmpegNormalize.lower_only", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.lower_only", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.dual_mono": {"fullname": "ffmpeg_normalize.FFmpegNormalize.dual_mono", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.dual_mono", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.dynamic": {"fullname": "ffmpeg_normalize.FFmpegNormalize.dynamic", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.dynamic", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.sample_rate": {"fullname": "ffmpeg_normalize.FFmpegNormalize.sample_rate", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.sample_rate", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.audio_channels": {"fullname": "ffmpeg_normalize.FFmpegNormalize.audio_channels", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.audio_channels", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.audio_codec": {"fullname": "ffmpeg_normalize.FFmpegNormalize.audio_codec", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.audio_codec", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.audio_bitrate": {"fullname": "ffmpeg_normalize.FFmpegNormalize.audio_bitrate", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.audio_bitrate", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.keep_original_audio": {"fullname": "ffmpeg_normalize.FFmpegNormalize.keep_original_audio", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.keep_original_audio", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.video_codec": {"fullname": "ffmpeg_normalize.FFmpegNormalize.video_codec", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.video_codec", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.video_disable": {"fullname": "ffmpeg_normalize.FFmpegNormalize.video_disable", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.video_disable", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.subtitle_disable": {"fullname": "ffmpeg_normalize.FFmpegNormalize.subtitle_disable", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.subtitle_disable", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.metadata_disable": {"fullname": "ffmpeg_normalize.FFmpegNormalize.metadata_disable", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.metadata_disable", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.chapters_disable": {"fullname": "ffmpeg_normalize.FFmpegNormalize.chapters_disable", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.chapters_disable", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.extra_input_options": {"fullname": "ffmpeg_normalize.FFmpegNormalize.extra_input_options", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.extra_input_options", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.extra_output_options": {"fullname": "ffmpeg_normalize.FFmpegNormalize.extra_output_options", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.extra_output_options", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.pre_filter": {"fullname": "ffmpeg_normalize.FFmpegNormalize.pre_filter", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.pre_filter", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.post_filter": {"fullname": "ffmpeg_normalize.FFmpegNormalize.post_filter", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.post_filter", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.output_format": {"fullname": "ffmpeg_normalize.FFmpegNormalize.output_format", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.output_format", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.dry_run": {"fullname": "ffmpeg_normalize.FFmpegNormalize.dry_run", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.dry_run", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.debug": {"fullname": "ffmpeg_normalize.FFmpegNormalize.debug", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.debug", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.progress": {"fullname": "ffmpeg_normalize.FFmpegNormalize.progress", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.progress", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.stats": {"fullname": "ffmpeg_normalize.FFmpegNormalize.stats", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.stats", "kind": "variable", "doc": "

    \n", "annotation": ": list[ffmpeg_normalize._streams.LoudnessStatisticsWithMetadata]"}, "ffmpeg_normalize.FFmpegNormalize.media_files": {"fullname": "ffmpeg_normalize.FFmpegNormalize.media_files", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.media_files", "kind": "variable", "doc": "

    \n", "annotation": ": list[ffmpeg_normalize._media_file.MediaFile]"}, "ffmpeg_normalize.FFmpegNormalize.file_count": {"fullname": "ffmpeg_normalize.FFmpegNormalize.file_count", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.file_count", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"fullname": "ffmpeg_normalize.FFmpegNormalize.add_media_file", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.add_media_file", "kind": "function", "doc": "

    Add a media file to normalize

    \n\n
    Arguments:
    \n\n
      \n
    • input_file (str): Path to input file
    • \n
    • output_file (str): Path to output file
    • \n
    \n", "signature": "(self, input_file: str, output_file: str) -> None:", "funcdef": "def"}, "ffmpeg_normalize.FFmpegNormalize.run_normalization": {"fullname": "ffmpeg_normalize.FFmpegNormalize.run_normalization", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalize.run_normalization", "kind": "function", "doc": "

    Run the normalization procedures

    \n", "signature": "(self) -> None:", "funcdef": "def"}, "ffmpeg_normalize.FFmpegNormalizeError": {"fullname": "ffmpeg_normalize.FFmpegNormalizeError", "modulename": "ffmpeg_normalize", "qualname": "FFmpegNormalizeError", "kind": "class", "doc": "

    Common base class for all non-exit exceptions.

    \n", "bases": "builtins.Exception"}, "ffmpeg_normalize.MediaFile": {"fullname": "ffmpeg_normalize.MediaFile", "modulename": "ffmpeg_normalize", "qualname": "MediaFile", "kind": "class", "doc": "

    Class that holds a file, its streams and adjustments

    \n"}, "ffmpeg_normalize.MediaFile.__init__": {"fullname": "ffmpeg_normalize.MediaFile.__init__", "modulename": "ffmpeg_normalize", "qualname": "MediaFile.__init__", "kind": "function", "doc": "

    Initialize a media file for later normalization by parsing the streams.

    \n\n
    Arguments:
    \n\n
      \n
    • ffmpeg_normalize (FFmpegNormalize): reference to overall settings
    • \n
    • input_file (str): Path to input file
    • \n
    • output_file (str): Path to output file
    • \n
    \n", "signature": "(\tffmpeg_normalize: ffmpeg_normalize._ffmpeg_normalize.FFmpegNormalize,\tinput_file: str,\toutput_file: str)"}, "ffmpeg_normalize.MediaFile.ffmpeg_normalize": {"fullname": "ffmpeg_normalize.MediaFile.ffmpeg_normalize", "modulename": "ffmpeg_normalize", "qualname": "MediaFile.ffmpeg_normalize", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.MediaFile.skip": {"fullname": "ffmpeg_normalize.MediaFile.skip", "modulename": "ffmpeg_normalize", "qualname": "MediaFile.skip", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.MediaFile.input_file": {"fullname": "ffmpeg_normalize.MediaFile.input_file", "modulename": "ffmpeg_normalize", "qualname": "MediaFile.input_file", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.MediaFile.output_file": {"fullname": "ffmpeg_normalize.MediaFile.output_file", "modulename": "ffmpeg_normalize", "qualname": "MediaFile.output_file", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.MediaFile.output_ext": {"fullname": "ffmpeg_normalize.MediaFile.output_ext", "modulename": "ffmpeg_normalize", "qualname": "MediaFile.output_ext", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.MediaFile.streams": {"fullname": "ffmpeg_normalize.MediaFile.streams", "modulename": "ffmpeg_normalize", "qualname": "MediaFile.streams", "kind": "variable", "doc": "

    \n", "annotation": ": ffmpeg_normalize._media_file.StreamDict"}, "ffmpeg_normalize.MediaFile.parse_streams": {"fullname": "ffmpeg_normalize.MediaFile.parse_streams", "modulename": "ffmpeg_normalize", "qualname": "MediaFile.parse_streams", "kind": "function", "doc": "

    Try to parse all input streams from file and set them in self.streams.

    \n\n
    Raises:
    \n\n
      \n
    • FFmpegNormalizeError: If no audio streams are found
    • \n
    \n", "signature": "(self) -> None:", "funcdef": "def"}, "ffmpeg_normalize.MediaFile.run_normalization": {"fullname": "ffmpeg_normalize.MediaFile.run_normalization", "modulename": "ffmpeg_normalize", "qualname": "MediaFile.run_normalization", "kind": "function", "doc": "

    Run the normalization process for this file.

    \n", "signature": "(self) -> None:", "funcdef": "def"}, "ffmpeg_normalize.MediaFile.get_stats": {"fullname": "ffmpeg_normalize.MediaFile.get_stats", "modulename": "ffmpeg_normalize", "qualname": "MediaFile.get_stats", "kind": "function", "doc": "

    \n", "signature": "(\tself) -> Iterable[ffmpeg_normalize._streams.LoudnessStatisticsWithMetadata]:", "funcdef": "def"}, "ffmpeg_normalize.AudioStream": {"fullname": "ffmpeg_normalize.AudioStream", "modulename": "ffmpeg_normalize", "qualname": "AudioStream", "kind": "class", "doc": "

    \n", "bases": "ffmpeg_normalize._streams.MediaStream"}, "ffmpeg_normalize.AudioStream.__init__": {"fullname": "ffmpeg_normalize.AudioStream.__init__", "modulename": "ffmpeg_normalize", "qualname": "AudioStream.__init__", "kind": "function", "doc": "

    Create an AudioStream object.

    \n\n
    Arguments:
    \n\n
      \n
    • ffmpeg_normalize (FFmpegNormalize): The FFmpegNormalize object.
    • \n
    • media_file (MediaFile): The MediaFile object.
    • \n
    • stream_id (int): The stream ID.
    • \n
    • sample_rate (int): sample rate in Hz
    • \n
    • bit_depth (int): bit depth in bits
    • \n
    • duration (float): duration in seconds
    • \n
    \n", "signature": "(\tffmpeg_normalize: ffmpeg_normalize._ffmpeg_normalize.FFmpegNormalize,\tmedia_file: ffmpeg_normalize._media_file.MediaFile,\tstream_id: int,\tsample_rate: int | None,\tbit_depth: int | None,\tduration: float | None)"}, "ffmpeg_normalize.AudioStream.loudness_statistics": {"fullname": "ffmpeg_normalize.AudioStream.loudness_statistics", "modulename": "ffmpeg_normalize", "qualname": "AudioStream.loudness_statistics", "kind": "variable", "doc": "

    \n", "annotation": ": ffmpeg_normalize._streams.LoudnessStatistics"}, "ffmpeg_normalize.AudioStream.sample_rate": {"fullname": "ffmpeg_normalize.AudioStream.sample_rate", "modulename": "ffmpeg_normalize", "qualname": "AudioStream.sample_rate", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.AudioStream.bit_depth": {"fullname": "ffmpeg_normalize.AudioStream.bit_depth", "modulename": "ffmpeg_normalize", "qualname": "AudioStream.bit_depth", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.AudioStream.duration": {"fullname": "ffmpeg_normalize.AudioStream.duration", "modulename": "ffmpeg_normalize", "qualname": "AudioStream.duration", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.AudioStream.get_stats": {"fullname": "ffmpeg_normalize.AudioStream.get_stats", "modulename": "ffmpeg_normalize", "qualname": "AudioStream.get_stats", "kind": "function", "doc": "

    Return loudness statistics for the stream.

    \n\n
    Returns:
    \n\n
    \n

    dict: A dictionary containing the loudness statistics.

    \n
    \n", "signature": "(self) -> ffmpeg_normalize._streams.LoudnessStatisticsWithMetadata:", "funcdef": "def"}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"fullname": "ffmpeg_normalize.AudioStream.set_second_pass_stats", "modulename": "ffmpeg_normalize", "qualname": "AudioStream.set_second_pass_stats", "kind": "function", "doc": "

    Set the EBU loudness statistics for the second pass.

    \n\n
    Arguments:
    \n\n
      \n
    • stats (dict): The EBU loudness statistics.
    • \n
    \n", "signature": "(self, stats: ffmpeg_normalize._streams.EbuLoudnessStatistics):", "funcdef": "def"}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"fullname": "ffmpeg_normalize.AudioStream.get_pcm_codec", "modulename": "ffmpeg_normalize", "qualname": "AudioStream.get_pcm_codec", "kind": "function", "doc": "

    Get the PCM codec string for the stream.

    \n\n
    Returns:
    \n\n
    \n

    str: The PCM codec string.

    \n
    \n", "signature": "(self) -> str:", "funcdef": "def"}, "ffmpeg_normalize.AudioStream.parse_astats": {"fullname": "ffmpeg_normalize.AudioStream.parse_astats", "modulename": "ffmpeg_normalize", "qualname": "AudioStream.parse_astats", "kind": "function", "doc": "

    Use ffmpeg with astats filter to get the mean (RMS) and max (peak) volume of the input file.

    \n\n
    Yields:
    \n\n
    \n

    float: The progress of the command.

    \n
    \n", "signature": "(self) -> Iterator[float]:", "funcdef": "def"}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"fullname": "ffmpeg_normalize.AudioStream.parse_loudnorm_stats", "modulename": "ffmpeg_normalize", "qualname": "AudioStream.parse_loudnorm_stats", "kind": "function", "doc": "

    Run a first pass loudnorm filter to get measured data.

    \n\n
    Yields:
    \n\n
    \n

    float: The progress of the command.

    \n
    \n", "signature": "(self) -> Iterator[float]:", "funcdef": "def"}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"fullname": "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output", "modulename": "ffmpeg_normalize", "qualname": "AudioStream.prune_and_parse_loudnorm_output", "kind": "function", "doc": "

    Prune ffmpeg progress lines from output and parse the loudnorm filter output.\nThere may be multiple outputs if multiple streams were processed.

    \n\n
    Arguments:
    \n\n
      \n
    • output (str): The output from ffmpeg.
    • \n
    \n\n
    Returns:
    \n\n
    \n

    list: The EBU loudness statistics.

    \n
    \n", "signature": "(\toutput: str) -> dict[int, ffmpeg_normalize._streams.EbuLoudnessStatistics]:", "funcdef": "def"}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"fullname": "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu", "modulename": "ffmpeg_normalize", "qualname": "AudioStream.get_second_pass_opts_ebu", "kind": "function", "doc": "

    Return second pass loudnorm filter options string for ffmpeg

    \n", "signature": "(self) -> str:", "funcdef": "def"}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"fullname": "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms", "modulename": "ffmpeg_normalize", "qualname": "AudioStream.get_second_pass_opts_peakrms", "kind": "function", "doc": "

    Set the adjustment gain based on chosen option and mean/max volume,\nreturn the matching ffmpeg volume filter.

    \n\n
    Returns:
    \n\n
    \n

    str: ffmpeg volume filter string

    \n
    \n", "signature": "(self) -> str:", "funcdef": "def"}, "ffmpeg_normalize.VideoStream": {"fullname": "ffmpeg_normalize.VideoStream", "modulename": "ffmpeg_normalize", "qualname": "VideoStream", "kind": "class", "doc": "

    \n", "bases": "ffmpeg_normalize._streams.MediaStream"}, "ffmpeg_normalize.VideoStream.__init__": {"fullname": "ffmpeg_normalize.VideoStream.__init__", "modulename": "ffmpeg_normalize", "qualname": "VideoStream.__init__", "kind": "function", "doc": "

    Create a MediaStream object.

    \n\n
    Arguments:
    \n\n
      \n
    • ffmpeg_normalize (FFmpegNormalize): The FFmpegNormalize object.
    • \n
    • media_file (MediaFile): The MediaFile object.
    • \n
    • stream_type (Literal[\"audio\", \"video\", \"subtitle\"]): The type of the stream.
    • \n
    • stream_id (int): The stream ID.
    • \n
    \n", "signature": "(\tffmpeg_normalize: ffmpeg_normalize._ffmpeg_normalize.FFmpegNormalize,\tmedia_file: ffmpeg_normalize._media_file.MediaFile,\tstream_id: int)"}, "ffmpeg_normalize.SubtitleStream": {"fullname": "ffmpeg_normalize.SubtitleStream", "modulename": "ffmpeg_normalize", "qualname": "SubtitleStream", "kind": "class", "doc": "

    \n", "bases": "ffmpeg_normalize._streams.MediaStream"}, "ffmpeg_normalize.SubtitleStream.__init__": {"fullname": "ffmpeg_normalize.SubtitleStream.__init__", "modulename": "ffmpeg_normalize", "qualname": "SubtitleStream.__init__", "kind": "function", "doc": "

    Create a MediaStream object.

    \n\n
    Arguments:
    \n\n
      \n
    • ffmpeg_normalize (FFmpegNormalize): The FFmpegNormalize object.
    • \n
    • media_file (MediaFile): The MediaFile object.
    • \n
    • stream_type (Literal[\"audio\", \"video\", \"subtitle\"]): The type of the stream.
    • \n
    • stream_id (int): The stream ID.
    • \n
    \n", "signature": "(\tffmpeg_normalize: ffmpeg_normalize._ffmpeg_normalize.FFmpegNormalize,\tmedia_file: ffmpeg_normalize._media_file.MediaFile,\tstream_id: int)"}, "ffmpeg_normalize.MediaStream": {"fullname": "ffmpeg_normalize.MediaStream", "modulename": "ffmpeg_normalize", "qualname": "MediaStream", "kind": "class", "doc": "

    \n"}, "ffmpeg_normalize.MediaStream.__init__": {"fullname": "ffmpeg_normalize.MediaStream.__init__", "modulename": "ffmpeg_normalize", "qualname": "MediaStream.__init__", "kind": "function", "doc": "

    Create a MediaStream object.

    \n\n
    Arguments:
    \n\n
      \n
    • ffmpeg_normalize (FFmpegNormalize): The FFmpegNormalize object.
    • \n
    • media_file (MediaFile): The MediaFile object.
    • \n
    • stream_type (Literal[\"audio\", \"video\", \"subtitle\"]): The type of the stream.
    • \n
    • stream_id (int): The stream ID.
    • \n
    \n", "signature": "(\tffmpeg_normalize: ffmpeg_normalize._ffmpeg_normalize.FFmpegNormalize,\tmedia_file: ffmpeg_normalize._media_file.MediaFile,\tstream_type: Literal['audio', 'video', 'subtitle'],\tstream_id: int)"}, "ffmpeg_normalize.MediaStream.ffmpeg_normalize": {"fullname": "ffmpeg_normalize.MediaStream.ffmpeg_normalize", "modulename": "ffmpeg_normalize", "qualname": "MediaStream.ffmpeg_normalize", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.MediaStream.media_file": {"fullname": "ffmpeg_normalize.MediaStream.media_file", "modulename": "ffmpeg_normalize", "qualname": "MediaStream.media_file", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.MediaStream.stream_type": {"fullname": "ffmpeg_normalize.MediaStream.stream_type", "modulename": "ffmpeg_normalize", "qualname": "MediaStream.stream_type", "kind": "variable", "doc": "

    \n"}, "ffmpeg_normalize.MediaStream.stream_id": {"fullname": "ffmpeg_normalize.MediaStream.stream_id", "modulename": "ffmpeg_normalize", "qualname": "MediaStream.stream_id", "kind": "variable", "doc": "

    \n"}}, "docInfo": {"ffmpeg_normalize": {"qualname": 0, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 503}, "ffmpeg_normalize.FFmpegNormalize.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 680, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.ffmpeg_exe": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.has_loudnorm_capabilities": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.normalization_type": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.print_stats": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.loudness_range_target": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.keep_loudness_range_target": {"qualname": 5, "fullname": 7, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"qualname": 7, "fullname": 9, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.true_peak": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.offset": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.lower_only": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.dual_mono": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.dynamic": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.sample_rate": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.audio_channels": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.audio_codec": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.audio_bitrate": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.keep_original_audio": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.video_codec": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.video_disable": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.subtitle_disable": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.metadata_disable": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.chapters_disable": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.extra_input_options": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.extra_output_options": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.pre_filter": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.post_filter": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.output_format": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.dry_run": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.debug": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.progress": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.stats": {"qualname": 2, "fullname": 4, "annotation": 5, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.media_files": {"qualname": 3, "fullname": 5, "annotation": 6, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.file_count": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 36, "bases": 0, "doc": 39}, "ffmpeg_normalize.FFmpegNormalize.run_normalization": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 14, "bases": 0, "doc": 6}, "ffmpeg_normalize.FFmpegNormalizeError": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 2, "doc": 11}, "ffmpeg_normalize.MediaFile": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 11}, "ffmpeg_normalize.MediaFile.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 53, "bases": 0, "doc": 57}, "ffmpeg_normalize.MediaFile.ffmpeg_normalize": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.MediaFile.skip": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.MediaFile.input_file": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.MediaFile.output_file": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.MediaFile.output_ext": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.MediaFile.streams": {"qualname": 2, "fullname": 4, "annotation": 6, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.MediaFile.parse_streams": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 14, "bases": 0, "doc": 35}, "ffmpeg_normalize.MediaFile.run_normalization": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 14, "bases": 0, "doc": 10}, "ffmpeg_normalize.MediaFile.get_stats": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 33, "bases": 0, "doc": 3}, "ffmpeg_normalize.AudioStream": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 4, "doc": 3}, "ffmpeg_normalize.AudioStream.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 119, "bases": 0, "doc": 84}, "ffmpeg_normalize.AudioStream.loudness_statistics": {"qualname": 3, "fullname": 5, "annotation": 5, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.AudioStream.sample_rate": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.AudioStream.bit_depth": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.AudioStream.duration": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.AudioStream.get_stats": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 26, "bases": 0, "doc": 26}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"qualname": 5, "fullname": 7, "annotation": 0, "default_value": 0, "signature": 33, "bases": 0, "doc": 31}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 14, "bases": 0, "doc": 26}, "ffmpeg_normalize.AudioStream.parse_astats": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 20, "bases": 0, "doc": 37}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 20, "bases": 0, "doc": 29}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"qualname": 6, "fullname": 8, "annotation": 0, "default_value": 0, "signature": 44, "bases": 0, "doc": 59}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"qualname": 6, "fullname": 8, "annotation": 0, "default_value": 0, "signature": 14, "bases": 0, "doc": 11}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"qualname": 6, "fullname": 8, "annotation": 0, "default_value": 0, "signature": 14, "bases": 0, "doc": 34}, "ffmpeg_normalize.VideoStream": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 4, "doc": 3}, "ffmpeg_normalize.VideoStream.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 66, "bases": 0, "doc": 68}, "ffmpeg_normalize.SubtitleStream": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 4, "doc": 3}, "ffmpeg_normalize.SubtitleStream.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 66, "bases": 0, "doc": 68}, "ffmpeg_normalize.MediaStream": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.MediaStream.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 108, "bases": 0, "doc": 68}, "ffmpeg_normalize.MediaStream.ffmpeg_normalize": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.MediaStream.media_file": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.MediaStream.stream_type": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "ffmpeg_normalize.MediaStream.stream_id": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}}, "length": 74, "save": true}, "index": {"qualname": {"root": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 6, "f": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {"ffmpeg_normalize.FFmpegNormalize.ffmpeg_exe": {"tf": 1}, "ffmpeg_normalize.MediaFile.ffmpeg_normalize": {"tf": 1}, "ffmpeg_normalize.MediaStream.ffmpeg_normalize": {"tf": 1}}, "df": 3, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.ffmpeg_exe": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.has_loudnorm_capabilities": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.normalization_type": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.print_stats": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.true_peak": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.offset": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.lower_only": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.dual_mono": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.dynamic": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.sample_rate": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.audio_channels": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.audio_codec": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.audio_bitrate": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_original_audio": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.video_codec": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.video_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.subtitle_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.metadata_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.chapters_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.extra_input_options": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.extra_output_options": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.pre_filter": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.post_filter": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.output_format": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.dry_run": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.debug": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.progress": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.stats": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.media_files": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.file_count": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.run_normalization": {"tf": 1}}, "df": 37, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_normalize.FFmpegNormalizeError": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_normalize.FFmpegNormalize.pre_filter": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.post_filter": {"tf": 1}}, "df": 2}}}, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.file_count": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.input_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.output_file": {"tf": 1}, "ffmpeg_normalize.MediaStream.media_file": {"tf": 1}}, "df": 5, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.media_files": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.output_format": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 6}}, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.extra_input_options": {"tf": 1}, "ffmpeg_normalize.MediaFile.input_file": {"tf": 1}}, "df": 2}}}}, "d": {"docs": {"ffmpeg_normalize.MediaStream.stream_id": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.ffmpeg_exe": {"tf": 1}}, "df": 1}, "t": {"docs": {"ffmpeg_normalize.MediaFile.output_ext": {"tf": 1}}, "df": 1, "r": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize.extra_input_options": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.extra_output_options": {"tf": 1}}, "df": 2}}}}, "b": {"docs": {}, "df": 0, "u": {"docs": {"ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}}, "df": 1}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.has_loudnorm_capabilities": {"tf": 1}}, "df": 1}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.FFmpegNormalize.has_loudnorm_capabilities": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 3}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.AudioStream.loudness_statistics": {"tf": 1}}, "df": 4}}}}}}, "w": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_normalize.FFmpegNormalize.lower_only": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"tf": 1}}, "df": 1}}}, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.has_loudnorm_capabilities": {"tf": 1}}, "df": 1}}}}}}}}}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.audio_channels": {"tf": 1}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.chapters_disable": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {"ffmpeg_normalize.FFmpegNormalize.audio_codec": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.video_codec": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1}}, "df": 3}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.file_count": {"tf": 1}}, "df": 1}}}}}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.FFmpegNormalize.normalization_type": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.run_normalization": {"tf": 1}, "ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1}}, "df": 3}}}}}, "e": {"docs": {"ffmpeg_normalize.MediaFile.ffmpeg_normalize": {"tf": 1}, "ffmpeg_normalize.MediaStream.ffmpeg_normalize": {"tf": 1}}, "df": 2}}}}}}}}}, "t": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.normalization_type": {"tf": 1}, "ffmpeg_normalize.MediaStream.stream_type": {"tf": 1}}, "df": 2}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"tf": 1}}, "df": 3}}}}}, "r": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.true_peak": {"tf": 1}}, "df": 1}}}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.print_stats": {"tf": 1}}, "df": 1}}}, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.pre_filter": {"tf": 1}}, "df": 1}, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.progress": {"tf": 1}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "k": {"docs": {"ffmpeg_normalize.FFmpegNormalize.true_peak": {"tf": 1}}, "df": 1, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 1}}}}}}, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.post_filter": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 4}}}, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 3}}}, "c": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1}}, "df": 1}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.print_stats": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.stats": {"tf": 1}, "ffmpeg_normalize.MediaFile.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}}, "df": 6}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.AudioStream.loudness_statistics": {"tf": 1}}, "df": 1}}}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.MediaStream.stream_type": {"tf": 1}, "ffmpeg_normalize.MediaStream.stream_id": {"tf": 1}}, "df": 2, "s": {"docs": {"ffmpeg_normalize.MediaFile.streams": {"tf": 1}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}}, "df": 2}}}}}}, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.sample_rate": {"tf": 1}, "ffmpeg_normalize.AudioStream.sample_rate": {"tf": 1}}, "df": 2}}}}}, "u": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.subtitle_disable": {"tf": 1}}, "df": 1, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.SubtitleStream": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}}, "df": 2}}}}}}}}}}}}}, "k": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {"ffmpeg_normalize.MediaFile.skip": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}}, "df": 1}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 3}}}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"tf": 1}}, "df": 3}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.sample_rate": {"tf": 1}, "ffmpeg_normalize.AudioStream.sample_rate": {"tf": 1}}, "df": 2}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.FFmpegNormalize.dry_run": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.run_normalization": {"tf": 1}, "ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1}}, "df": 3}}}, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {"ffmpeg_normalize.FFmpegNormalize.keep_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_original_audio": {"tf": 1}}, "df": 3}}}}, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {"ffmpeg_normalize.FFmpegNormalize.audio_channels": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.audio_codec": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.audio_bitrate": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_original_audio": {"tf": 1}}, "df": 4, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.AudioStream": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.loudness_statistics": {"tf": 1}, "ffmpeg_normalize.AudioStream.sample_rate": {"tf": 1}, "ffmpeg_normalize.AudioStream.bit_depth": {"tf": 1}, "ffmpeg_normalize.AudioStream.duration": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 14}}}}}}}}}}, "d": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}}, "df": 1}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}}, "df": 1}}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.offset": {"tf": 1}}, "df": 1}}}}}, "n": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"ffmpeg_normalize.FFmpegNormalize.lower_only": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_normalize.FFmpegNormalize.keep_original_audio": {"tf": 1}}, "df": 1}}}}}}}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.extra_input_options": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.extra_output_options": {"tf": 1}}, "df": 2}}}}, "s": {"docs": {"ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 2}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.extra_output_options": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.output_format": {"tf": 1}, "ffmpeg_normalize.MediaFile.output_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.output_ext": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 5}}}}}}, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_normalize.FFmpegNormalize.dual_mono": {"tf": 1}}, "df": 1}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.AudioStream.duration": {"tf": 1}}, "df": 1}}}}}}}, "y": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {"ffmpeg_normalize.FFmpegNormalize.dynamic": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.video_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.subtitle_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.metadata_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.chapters_disable": {"tf": 1}}, "df": 4}}}}}}, "r": {"docs": {}, "df": 0, "y": {"docs": {"ffmpeg_normalize.FFmpegNormalize.dry_run": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "g": {"docs": {"ffmpeg_normalize.FFmpegNormalize.debug": {"tf": 1}}, "df": 1}}}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"ffmpeg_normalize.AudioStream.bit_depth": {"tf": 1}}, "df": 1}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {"ffmpeg_normalize.FFmpegNormalize.dual_mono": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize.metadata_disable": {"tf": 1}}, "df": 1}}}}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize.media_files": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}, "ffmpeg_normalize.MediaStream.media_file": {"tf": 1}}, "df": 3, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.MediaFile": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.MediaFile.ffmpeg_normalize": {"tf": 1}, "ffmpeg_normalize.MediaFile.skip": {"tf": 1}, "ffmpeg_normalize.MediaFile.input_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.output_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.output_ext": {"tf": 1}, "ffmpeg_normalize.MediaFile.streams": {"tf": 1}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1}, "ffmpeg_normalize.MediaFile.get_stats": {"tf": 1}}, "df": 11}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.MediaStream": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.ffmpeg_normalize": {"tf": 1}, "ffmpeg_normalize.MediaStream.media_file": {"tf": 1}, "ffmpeg_normalize.MediaStream.stream_type": {"tf": 1}, "ffmpeg_normalize.MediaStream.stream_id": {"tf": 1}}, "df": 6}}}}}}}}}}}, "b": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.AudioStream.bit_depth": {"tf": 1}}, "df": 1, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.audio_bitrate": {"tf": 1}}, "df": 1}}}}}}}, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "o": {"docs": {"ffmpeg_normalize.FFmpegNormalize.video_codec": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.video_disable": {"tf": 1}}, "df": 2, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.VideoStream": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}}, "df": 2}}}}}}}}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.MediaFile.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 5}}}}}, "fullname": {"root": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 6, "f": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {"ffmpeg_normalize": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.ffmpeg_exe": {"tf": 1.4142135623730951}, "ffmpeg_normalize.FFmpegNormalize.has_loudnorm_capabilities": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.normalization_type": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.print_stats": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.true_peak": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.offset": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.lower_only": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.dual_mono": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.dynamic": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.sample_rate": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.audio_channels": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.audio_codec": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.audio_bitrate": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_original_audio": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.video_codec": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.video_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.subtitle_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.metadata_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.chapters_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.extra_input_options": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.extra_output_options": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.pre_filter": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.post_filter": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.output_format": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.dry_run": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.debug": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.progress": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.stats": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.media_files": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.file_count": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.run_normalization": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalizeError": {"tf": 1}, "ffmpeg_normalize.MediaFile": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.MediaFile.ffmpeg_normalize": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaFile.skip": {"tf": 1}, "ffmpeg_normalize.MediaFile.input_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.output_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.output_ext": {"tf": 1}, "ffmpeg_normalize.MediaFile.streams": {"tf": 1}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1}, "ffmpeg_normalize.MediaFile.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.loudness_statistics": {"tf": 1}, "ffmpeg_normalize.AudioStream.sample_rate": {"tf": 1}, "ffmpeg_normalize.AudioStream.bit_depth": {"tf": 1}, "ffmpeg_normalize.AudioStream.duration": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}, "ffmpeg_normalize.VideoStream": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.ffmpeg_normalize": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaStream.media_file": {"tf": 1}, "ffmpeg_normalize.MediaStream.stream_type": {"tf": 1}, "ffmpeg_normalize.MediaStream.stream_id": {"tf": 1}}, "df": 74, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.ffmpeg_exe": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.has_loudnorm_capabilities": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.normalization_type": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.print_stats": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.true_peak": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.offset": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.lower_only": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.dual_mono": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.dynamic": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.sample_rate": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.audio_channels": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.audio_codec": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.audio_bitrate": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_original_audio": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.video_codec": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.video_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.subtitle_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.metadata_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.chapters_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.extra_input_options": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.extra_output_options": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.pre_filter": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.post_filter": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.output_format": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.dry_run": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.debug": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.progress": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.stats": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.media_files": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.file_count": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.run_normalization": {"tf": 1}}, "df": 37, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_normalize.FFmpegNormalizeError": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_normalize.FFmpegNormalize.pre_filter": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.post_filter": {"tf": 1}}, "df": 2}}}, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.file_count": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.input_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.output_file": {"tf": 1}, "ffmpeg_normalize.MediaStream.media_file": {"tf": 1}}, "df": 5, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.media_files": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.output_format": {"tf": 1}}, "df": 1}}}}}}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.ffmpeg_exe": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.has_loudnorm_capabilities": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.normalization_type": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.print_stats": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.true_peak": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.offset": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.lower_only": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.dual_mono": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.dynamic": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.sample_rate": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.audio_channels": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.audio_codec": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.audio_bitrate": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_original_audio": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.video_codec": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.video_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.subtitle_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.metadata_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.chapters_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.extra_input_options": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.extra_output_options": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.pre_filter": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.post_filter": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.output_format": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.dry_run": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.debug": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.progress": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.stats": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.media_files": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.file_count": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.run_normalization": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalizeError": {"tf": 1}, "ffmpeg_normalize.MediaFile": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.MediaFile.ffmpeg_normalize": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaFile.skip": {"tf": 1}, "ffmpeg_normalize.MediaFile.input_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.output_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.output_ext": {"tf": 1}, "ffmpeg_normalize.MediaFile.streams": {"tf": 1}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1}, "ffmpeg_normalize.MediaFile.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.loudness_statistics": {"tf": 1}, "ffmpeg_normalize.AudioStream.sample_rate": {"tf": 1}, "ffmpeg_normalize.AudioStream.bit_depth": {"tf": 1}, "ffmpeg_normalize.AudioStream.duration": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}, "ffmpeg_normalize.VideoStream": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.ffmpeg_normalize": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaStream.media_file": {"tf": 1}, "ffmpeg_normalize.MediaStream.stream_type": {"tf": 1}, "ffmpeg_normalize.MediaStream.stream_id": {"tf": 1}}, "df": 74}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.FFmpegNormalize.normalization_type": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.run_normalization": {"tf": 1}, "ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1}}, "df": 3}}}}}}}}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 6}}, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.extra_input_options": {"tf": 1}, "ffmpeg_normalize.MediaFile.input_file": {"tf": 1}}, "df": 2}}}}, "d": {"docs": {"ffmpeg_normalize.MediaStream.stream_id": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.ffmpeg_exe": {"tf": 1}}, "df": 1}, "t": {"docs": {"ffmpeg_normalize.MediaFile.output_ext": {"tf": 1}}, "df": 1, "r": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize.extra_input_options": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.extra_output_options": {"tf": 1}}, "df": 2}}}}, "b": {"docs": {}, "df": 0, "u": {"docs": {"ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}}, "df": 1}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.has_loudnorm_capabilities": {"tf": 1}}, "df": 1}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.FFmpegNormalize.has_loudnorm_capabilities": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 3}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.AudioStream.loudness_statistics": {"tf": 1}}, "df": 4}}}}}}, "w": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_normalize.FFmpegNormalize.lower_only": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"tf": 1}}, "df": 1}}}, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.has_loudnorm_capabilities": {"tf": 1}}, "df": 1}}}}}}}}}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.audio_channels": {"tf": 1}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.chapters_disable": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {"ffmpeg_normalize.FFmpegNormalize.audio_codec": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.video_codec": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1}}, "df": 3}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.file_count": {"tf": 1}}, "df": 1}}}}}, "t": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.normalization_type": {"tf": 1}, "ffmpeg_normalize.MediaStream.stream_type": {"tf": 1}}, "df": 2}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"tf": 1}}, "df": 3}}}}}, "r": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.true_peak": {"tf": 1}}, "df": 1}}}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.print_stats": {"tf": 1}}, "df": 1}}}, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.pre_filter": {"tf": 1}}, "df": 1}, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.progress": {"tf": 1}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "k": {"docs": {"ffmpeg_normalize.FFmpegNormalize.true_peak": {"tf": 1}}, "df": 1, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 1}}}}}}, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.post_filter": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 4}}}, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 3}}}, "c": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1}}, "df": 1}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.print_stats": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.stats": {"tf": 1}, "ffmpeg_normalize.MediaFile.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}}, "df": 6}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.AudioStream.loudness_statistics": {"tf": 1}}, "df": 1}}}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.MediaStream.stream_type": {"tf": 1}, "ffmpeg_normalize.MediaStream.stream_id": {"tf": 1}}, "df": 2, "s": {"docs": {"ffmpeg_normalize.MediaFile.streams": {"tf": 1}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}}, "df": 2}}}}}}, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.sample_rate": {"tf": 1}, "ffmpeg_normalize.AudioStream.sample_rate": {"tf": 1}}, "df": 2}}}}}, "u": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.subtitle_disable": {"tf": 1}}, "df": 1, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.SubtitleStream": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}}, "df": 2}}}}}}}}}}}}}, "k": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {"ffmpeg_normalize.MediaFile.skip": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}}, "df": 1}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 3}}}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"tf": 1}}, "df": 3}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.sample_rate": {"tf": 1}, "ffmpeg_normalize.AudioStream.sample_rate": {"tf": 1}}, "df": 2}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.FFmpegNormalize.dry_run": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.run_normalization": {"tf": 1}, "ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1}}, "df": 3}}}, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {"ffmpeg_normalize.FFmpegNormalize.keep_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_original_audio": {"tf": 1}}, "df": 3}}}}, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {"ffmpeg_normalize.FFmpegNormalize.audio_channels": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.audio_codec": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.audio_bitrate": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.keep_original_audio": {"tf": 1}}, "df": 4, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.AudioStream": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.loudness_statistics": {"tf": 1}, "ffmpeg_normalize.AudioStream.sample_rate": {"tf": 1}, "ffmpeg_normalize.AudioStream.bit_depth": {"tf": 1}, "ffmpeg_normalize.AudioStream.duration": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 14}}}}}}}}}}, "d": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}}, "df": 1}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}}, "df": 1}}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.offset": {"tf": 1}}, "df": 1}}}}}, "n": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"ffmpeg_normalize.FFmpegNormalize.lower_only": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_normalize.FFmpegNormalize.keep_original_audio": {"tf": 1}}, "df": 1}}}}}}}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.extra_input_options": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.extra_output_options": {"tf": 1}}, "df": 2}}}}, "s": {"docs": {"ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 2}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.extra_output_options": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.output_format": {"tf": 1}, "ffmpeg_normalize.MediaFile.output_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.output_ext": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 5}}}}}}, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_normalize.FFmpegNormalize.dual_mono": {"tf": 1}}, "df": 1}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.AudioStream.duration": {"tf": 1}}, "df": 1}}}}}}}, "y": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {"ffmpeg_normalize.FFmpegNormalize.dynamic": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.video_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.subtitle_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.metadata_disable": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.chapters_disable": {"tf": 1}}, "df": 4}}}}}}, "r": {"docs": {}, "df": 0, "y": {"docs": {"ffmpeg_normalize.FFmpegNormalize.dry_run": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "g": {"docs": {"ffmpeg_normalize.FFmpegNormalize.debug": {"tf": 1}}, "df": 1}}}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"ffmpeg_normalize.AudioStream.bit_depth": {"tf": 1}}, "df": 1}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {"ffmpeg_normalize.FFmpegNormalize.dual_mono": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize.metadata_disable": {"tf": 1}}, "df": 1}}}}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize.media_files": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}, "ffmpeg_normalize.MediaStream.media_file": {"tf": 1}}, "df": 3, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.MediaFile": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.MediaFile.ffmpeg_normalize": {"tf": 1}, "ffmpeg_normalize.MediaFile.skip": {"tf": 1}, "ffmpeg_normalize.MediaFile.input_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.output_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.output_ext": {"tf": 1}, "ffmpeg_normalize.MediaFile.streams": {"tf": 1}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1}, "ffmpeg_normalize.MediaFile.get_stats": {"tf": 1}}, "df": 11}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.MediaStream": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.ffmpeg_normalize": {"tf": 1}, "ffmpeg_normalize.MediaStream.media_file": {"tf": 1}, "ffmpeg_normalize.MediaStream.stream_type": {"tf": 1}, "ffmpeg_normalize.MediaStream.stream_id": {"tf": 1}}, "df": 6}}}}}}}}}}}, "b": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.AudioStream.bit_depth": {"tf": 1}}, "df": 1, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.audio_bitrate": {"tf": 1}}, "df": 1}}}}}}}, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "o": {"docs": {"ffmpeg_normalize.FFmpegNormalize.video_codec": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.video_disable": {"tf": 1}}, "df": 2, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.VideoStream": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}}, "df": 2}}}}}}}}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.MediaFile.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 5}}}}}, "annotation": {"root": {"docs": {"ffmpeg_normalize.FFmpegNormalize.stats": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.media_files": {"tf": 1}, "ffmpeg_normalize.MediaFile.streams": {"tf": 1}, "ffmpeg_normalize.AudioStream.loudness_statistics": {"tf": 1}}, "df": 4, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "[": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {"ffmpeg_normalize.FFmpegNormalize.stats": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.media_files": {"tf": 1}}, "df": 2}}}}}}}}}}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.AudioStream.loudness_statistics": {"tf": 1}}, "df": 1, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize.stats": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.stats": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.media_files": {"tf": 1}, "ffmpeg_normalize.MediaFile.streams": {"tf": 1}, "ffmpeg_normalize.AudioStream.loudness_statistics": {"tf": 1}}, "df": 4}}}}}}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.loudness_statistics": {"tf": 1}}, "df": 2}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.MediaFile.streams": {"tf": 1}}, "df": 1}}}}}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize.media_files": {"tf": 1}, "ffmpeg_normalize.MediaFile.streams": {"tf": 1}}, "df": 2, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.media_files": {"tf": 1}}, "df": 1}}}}}}}}}, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.media_files": {"tf": 1}, "ffmpeg_normalize.MediaFile.streams": {"tf": 1}}, "df": 2}}}, "f": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {"ffmpeg_normalize.MediaFile.streams": {"tf": 1}, "ffmpeg_normalize.AudioStream.loudness_statistics": {"tf": 1}}, "df": 2}}}}}}}}, "default_value": {"root": {"docs": {}, "df": 0}}, "signature": {"root": {"0": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 2.23606797749979}}, "df": 1}, "2": {"3": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}, "docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}, "3": {"9": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 3.4641016151377544}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 2.449489742783178}}, "df": 2}, "docs": {}, "df": 0}, "7": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}, "docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 22.956480566497994}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 5.291502622129181}, "ffmpeg_normalize.FFmpegNormalize.run_normalization": {"tf": 3.4641016151377544}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 6.324555320336759}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 3.4641016151377544}, "ffmpeg_normalize.MediaFile.run_normalization": {"tf": 3.4641016151377544}, "ffmpeg_normalize.MediaFile.get_stats": {"tf": 5.196152422706632}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 9.539392014169456}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 4.58257569495584}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 5.196152422706632}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 3.4641016151377544}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 4.123105625617661}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 4.123105625617661}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 6}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 3.4641016151377544}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 3.4641016151377544}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 7}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 7}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 8.888194417315589}}, "df": 19, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {"ffmpeg_normalize.MediaFile.__init__": {"tf": 1.7320508075688772}, "ffmpeg_normalize.MediaFile.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 2}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 2}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 2}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 2}}, "df": 9}}}}}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 4}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.run_normalization": {"tf": 1}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1.7320508075688772}}, "df": 6}}}}, "t": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 2}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 2}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 2}}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1.7320508075688772}}, "df": 1, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.MediaFile.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}}, "df": 2}}}}}}}}}}}}}}}}}}}}}}}}}}}}, "w": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "u": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1.4142135623730951}}, "df": 1, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 2}}}}}}}}}}}}}}}}}}}}, "x": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1.7320508075688772}}, "df": 1}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}}, "df": 2}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "k": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}}}}}, "c": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}}, "f": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 2.449489742783178}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}}, "df": 4}}}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 3.7416573867739413}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1.4142135623730951}}, "df": 6}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}}}, "f": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {"ffmpeg_normalize.MediaFile.__init__": {"tf": 1.7320508075688772}, "ffmpeg_normalize.MediaFile.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 2}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 2}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 2}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 2}}, "df": 9, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 5}}}}}}}}}}}}}}}, "s": {"1": {"6": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}, "docs": {}, "df": 0}, "docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}}, "df": 2}}}, "r": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 2.6457513110645907}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 7, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1.4142135623730951}}, "df": 4, "s": {"docs": {"ffmpeg_normalize.MediaFile.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 4}}}}}}, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}}, "df": 2}}}}}, "u": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 2}}}}}}}, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "f": {"docs": {"ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.run_normalization": {"tf": 1}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1}, "ffmpeg_normalize.MediaFile.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 12}}}}, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 3.7416573867739413}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1}}, "df": 1, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}}}}}, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1.7320508075688772}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 2}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 2}}}}}, "o": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}}}, "n": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}}}}}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 4}}}}}}, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1}}, "df": 1}}}}}}}, "y": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 2}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "y": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "g": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1}}, "df": 1}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1.4142135623730951}}, "df": 4, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 4}}}}}}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}, "p": {"docs": {}, "df": 0, "y": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}}, "df": 1}}}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1.7320508075688772}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 6}, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}}, "df": 3}}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.MediaFile.get_stats": {"tf": 1}}, "df": 1}}}, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}}, "df": 2}}}}}}}, "d": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 4}}, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "o": {"docs": {"ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 2}}}}}}}, "bases": {"root": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalizeError": {"tf": 1}}, "df": 1}}}}}}}}, "e": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "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_normalize.FFmpegNormalizeError": {"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_normalize.AudioStream": {"tf": 1}, "ffmpeg_normalize.VideoStream": {"tf": 1}, "ffmpeg_normalize.SubtitleStream": {"tf": 1}}, "df": 3}}}}}}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.AudioStream": {"tf": 1}, "ffmpeg_normalize.VideoStream": {"tf": 1}, "ffmpeg_normalize.SubtitleStream": {"tf": 1}}, "df": 3}}}}}}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.AudioStream": {"tf": 1}, "ffmpeg_normalize.VideoStream": {"tf": 1}, "ffmpeg_normalize.SubtitleStream": {"tf": 1}}, "df": 3}}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.AudioStream": {"tf": 1}, "ffmpeg_normalize.VideoStream": {"tf": 1}, "ffmpeg_normalize.SubtitleStream": {"tf": 1}}, "df": 3}}}}}}}}}}}}}, "doc": {"root": {"0": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 2.23606797749979}}, "df": 1}, "2": {"3": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}}, "df": 1}, "docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}}, "df": 1}, "7": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}}, "df": 1}, "docs": {"ffmpeg_normalize": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize": {"tf": 13.96424004376894}, "ffmpeg_normalize.FFmpegNormalize.__init__": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.ffmpeg_exe": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.has_loudnorm_capabilities": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.normalization_type": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.print_stats": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.loudness_range_target": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.keep_loudness_range_target": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.keep_lra_above_loudness_range_target": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.true_peak": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.offset": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.lower_only": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.dual_mono": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.dynamic": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.sample_rate": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.audio_channels": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.audio_codec": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.audio_bitrate": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.keep_original_audio": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.video_codec": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.video_disable": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.subtitle_disable": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.metadata_disable": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.chapters_disable": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.extra_input_options": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.extra_output_options": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.pre_filter": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.post_filter": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.output_format": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.dry_run": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.debug": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.progress": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.stats": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.media_files": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.file_count": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 4.242640687119285}, "ffmpeg_normalize.FFmpegNormalize.run_normalization": {"tf": 1.4142135623730951}, "ffmpeg_normalize.FFmpegNormalizeError": {"tf": 1.7320508075688772}, "ffmpeg_normalize.MediaFile": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 4.898979485566356}, "ffmpeg_normalize.MediaFile.ffmpeg_normalize": {"tf": 1.7320508075688772}, "ffmpeg_normalize.MediaFile.skip": {"tf": 1.7320508075688772}, "ffmpeg_normalize.MediaFile.input_file": {"tf": 1.7320508075688772}, "ffmpeg_normalize.MediaFile.output_file": {"tf": 1.7320508075688772}, "ffmpeg_normalize.MediaFile.output_ext": {"tf": 1.7320508075688772}, "ffmpeg_normalize.MediaFile.streams": {"tf": 1.7320508075688772}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 3.605551275463989}, "ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1.7320508075688772}, "ffmpeg_normalize.MediaFile.get_stats": {"tf": 1.7320508075688772}, "ffmpeg_normalize.AudioStream": {"tf": 1.7320508075688772}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 6.48074069840786}, "ffmpeg_normalize.AudioStream.loudness_statistics": {"tf": 1.7320508075688772}, "ffmpeg_normalize.AudioStream.sample_rate": {"tf": 1.7320508075688772}, "ffmpeg_normalize.AudioStream.bit_depth": {"tf": 1.7320508075688772}, "ffmpeg_normalize.AudioStream.duration": {"tf": 1.7320508075688772}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 3.4641016151377544}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 3.872983346207417}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 3.4641016151377544}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 3.4641016151377544}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 3.4641016151377544}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 4.898979485566356}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 3.3166247903554}, "ffmpeg_normalize.VideoStream": {"tf": 1.7320508075688772}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 5.830951894845301}, "ffmpeg_normalize.SubtitleStream": {"tf": 1.7320508075688772}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 5.830951894845301}, "ffmpeg_normalize.MediaStream": {"tf": 1.7320508075688772}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 5.830951894845301}, "ffmpeg_normalize.MediaStream.ffmpeg_normalize": {"tf": 1.7320508075688772}, "ffmpeg_normalize.MediaStream.media_file": {"tf": 1.7320508075688772}, "ffmpeg_normalize.MediaStream.stream_type": {"tf": 1.7320508075688772}, "ffmpeg_normalize.MediaStream.stream_id": {"tf": 1.7320508075688772}}, "df": 74, "f": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1.4142135623730951}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 10, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1.4142135623730951}}, "df": 5, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}}, "df": 2}}}}}}}}}}}}}}}}}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 2.23606797749979}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}}, "df": 4}}}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 3.7416573867739413}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 2.23606797749979}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1.4142135623730951}}, "df": 6}}}, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 2.23606797749979}, "ffmpeg_normalize.MediaFile": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 2.23606797749979}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 10}}, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_normalize.FFmpegNormalizeError": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}}, "df": 7, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}}, "df": 2}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1.4142135623730951}}, "df": 2}}}}, "n": {"docs": {}, "df": 0, "o": {"docs": {"ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}}, "df": 1, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 7}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}, "ffmpeg_normalize.FFmpegNormalize.run_normalization": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1}}, "df": 4}}}}}}}}}}}, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.7320508075688772}}, "df": 1}, "n": {"docs": {"ffmpeg_normalize.FFmpegNormalizeError": {"tf": 1}}, "df": 1, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 3}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalizeError": {"tf": 1}, "ffmpeg_normalize.MediaFile": {"tf": 1}}, "df": 3}}}}, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 2}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1.4142135623730951}}, "df": 2}}}, "p": {"docs": {}, "df": 0, "y": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}}, "df": 1}}, "m": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.FFmpegNormalizeError": {"tf": 1}}, "df": 1}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}}, "df": 2}}}}}, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}}, "df": 1}}}}}}}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 4}}}}}}, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}, "ffmpeg_normalize.MediaFile": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 8, "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": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 9}}}}}}}, "e": {"docs": {"ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}}, "df": 1}}, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 3}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 5, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1}}, "df": 1}}}}}}}}}}, "d": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}}, "df": 1}, "j": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 1, "s": {"docs": {"ffmpeg_normalize.MediaFile": {"tf": 1}}, "df": 1}}}}}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_normalize.FFmpegNormalizeError": {"tf": 1}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}}, "df": 2}}, "n": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1}}, "df": 1, "d": {"docs": {"ffmpeg_normalize.MediaFile": {"tf": 1}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 5}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1.4142135623730951}}, "df": 4}}}, "o": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 5.385164807134504}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1.7320508075688772}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1.7320508075688772}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}}, "df": 6}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 2.8284271247461903}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}, "y": {"docs": {"ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}}, "df": 1}}, "h": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.run_normalization": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1.7320508075688772}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1.7320508075688772}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1.7320508075688772}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 2}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1.7320508075688772}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1.4142135623730951}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 2.23606797749979}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 2.23606797749979}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 2.23606797749979}}, "df": 15, "m": {"docs": {"ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}}, "df": 1}, "r": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.MediaFile": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1}}, "df": 1}}}}, "s": {"1": {"6": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}}, "df": 1}}}, "docs": {}, "df": 0}, "docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 2.449489742783178}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 6, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 2}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 2}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 2}}, "df": 6, "s": {"docs": {"ffmpeg_normalize.MediaFile": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1.7320508075688772}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 4}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 3}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}}, "df": 2}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.AudioStream.get_stats": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 3}}}}}}}}}, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1.4142135623730951}}, "df": 2}}}}}, "u": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 4, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}}, "df": 1}}}}}}}, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 3, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.MediaFile.__init__": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {}, "df": 0, "f": {"docs": {"ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}}, "df": 2, "s": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 1, "a": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 5.385164807134504}}, "df": 1}}, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 2}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}}, "df": 2}}}}}}, "f": {"docs": {"ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 5, "f": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "n": {"docs": {"ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 1, "l": {"docs": {}, "df": 0, "y": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}}, "df": 1}}}, "r": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}}, "df": 1, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 2}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 2}}, "df": 4, "s": {"docs": {"ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 1}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_normalize.MediaFile.__init__": {"tf": 1}}, "df": 1}}}}}}, "b": {"docs": {}, "df": 0, "j": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1.7320508075688772}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1.7320508075688772}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1.7320508075688772}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1.7320508075688772}}, "df": 4}}}}}}, "d": {"docs": {}, "df": 0, "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_normalize.FFmpegNormalize": {"tf": 5.385164807134504}}, "df": 1}}}}}}, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "g": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}, "y": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 2.8284271247461903}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}}, "df": 1}}}}}}}}}, "r": {"docs": {}, "df": 0, "y": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}, "o": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "u": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 3}}, "x": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 2}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}}, "df": 1}}}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalizeError": {"tf": 1}}, "df": 1}}, "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": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalizeError": {"tf": 1}}, "df": 1}}}}}}}}}}, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}}, "df": 4}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 2.8284271247461903}, "ffmpeg_normalize.AudioStream.get_stats": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 4}}}}}}, "w": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 2}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 1}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 3}}}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_normalize.MediaFile.__init__": {"tf": 1}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}}, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 4}}}}}, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize.run_normalization": {"tf": 1}}, "df": 1}}}}}, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 1}}}}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "k": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}}, "df": 2}}}, "c": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1.4142135623730951}}, "df": 2}}, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1.4142135623730951}}, "df": 2}}, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"ffmpeg_normalize.MediaFile.__init__": {"tf": 1}}, "df": 1}}}, "e": {"docs": {"ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 2}}}, "s": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.AudioStream.set_second_pass_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}}, "df": 3}}}}, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 3.7416573867739413}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1.4142135623730951}}, "df": 1, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}}}, "s": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalizeError": {"tf": 1}}, "df": 1, "d": {"docs": {"ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 1}}}}, "y": {"docs": {"ffmpeg_normalize.MediaFile.__init__": {"tf": 1}}, "df": 1}, "e": {"docs": {"ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 1}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 2.6457513110645907}}, "df": 1}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1.4142135623730951}}, "df": 2}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}}, "df": 2}}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}, "ffmpeg_normalize.FFmpegNormalize.run_normalization": {"tf": 1}, "ffmpeg_normalize.MediaFile.run_normalization": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}}, "df": 4}}, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.MediaFile.__init__": {"tf": 1}}, "df": 1}}}}}}}, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_ebu": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 3, "s": {"docs": {"ffmpeg_normalize.AudioStream.get_stats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 4}}}}}}, "m": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}}, "df": 1}}}, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 2.449489742783178}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1.7320508075688772}}, "df": 3, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.7320508075688772}, "ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}}, "df": 5}}}, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1.7320508075688772}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 5}, "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_normalize.MediaFile.__init__": {"tf": 1}}, "df": 1}}}}}}}}}, "f": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}, "ffmpeg_normalize.MediaFile.parse_streams": {"tf": 1}, "ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 3}, "s": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}}, "df": 1}, "t": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.MediaFile": {"tf": 1}}, "df": 1}}, "d": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1.4142135623730951}}, "df": 4}}, "w": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 1}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {"ffmpeg_normalize.FFmpegNormalize.add_media_file": {"tf": 1}, "ffmpeg_normalize.MediaFile.__init__": {"tf": 1}, "ffmpeg_normalize.AudioStream.__init__": {"tf": 1}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 6, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1.4142135623730951}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1.4142135623730951}}, "df": 4}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 3}}}}}}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}}, "df": 1, "/": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "x": {"docs": {"ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 1}}}}}, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}}, "df": 1}}}}}}}, "a": {"docs": {}, "df": 0, "x": {"docs": {"ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}}, "df": 1}, "y": {"docs": {"ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1}}, "df": 1}, "t": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 1}}}}}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.AudioStream.prune_and_parse_loudnorm_output": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "o": {"docs": {"ffmpeg_normalize.FFmpegNormalize": {"tf": 2}, "ffmpeg_normalize.VideoStream.__init__": {"tf": 1}, "ffmpeg_normalize.SubtitleStream.__init__": {"tf": 1}, "ffmpeg_normalize.MediaStream.__init__": {"tf": 1}}, "df": 4}}}}, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1.7320508075688772}}, "df": 2}}}}}}, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.MediaFile": {"tf": 1}}, "df": 1}}}}, "z": {"docs": {"ffmpeg_normalize.AudioStream.__init__": {"tf": 1}}, "df": 1}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"ffmpeg_normalize.AudioStream.get_pcm_codec": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}}, "df": 3}}, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"ffmpeg_normalize.AudioStream.get_second_pass_opts_peakrms": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}}, "df": 1}}}, "y": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "s": {"docs": {"ffmpeg_normalize.AudioStream.parse_astats": {"tf": 1}, "ffmpeg_normalize.AudioStream.parse_loudnorm_stats": {"tf": 1}}, "df": 2}}}}}}}}}, "pipeline": ["trimmer"], "_isPrebuiltIndex": true}; // mirrored in build-search-index.js (part 1) // Also split on html tags. this is a cheap heuristic, but good enough. diff --git a/ffmpeg_normalize/_version.py b/ffmpeg_normalize/_version.py index a1fbe6d..da2178f 100644 --- a/ffmpeg_normalize/_version.py +++ b/ffmpeg_normalize/_version.py @@ -1 +1 @@ -__version__ = "1.29.2" +__version__ = "1.30.0"