You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
2.8 KiB
75 lines
2.8 KiB
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
video_bit_rate and audio_bit_rate properties
|
|
"""
|
|
import re
|
|
|
|
from rebulk import Rebulk
|
|
from rebulk.rules import Rule, RemoveMatch, RenameMatch
|
|
|
|
from ..common import dash, seps
|
|
from ..common.pattern import is_disabled
|
|
from ..common.quantity import BitRate
|
|
from ..common.validators import seps_surround
|
|
|
|
|
|
def bit_rate(config): # pylint:disable=unused-argument
|
|
"""
|
|
Builder for rebulk object.
|
|
|
|
:param config: rule configuration
|
|
:type config: dict
|
|
:return: Created Rebulk object
|
|
:rtype: Rebulk
|
|
"""
|
|
rebulk = Rebulk(disabled=lambda context: (is_disabled(context, 'audio_bit_rate')
|
|
and is_disabled(context, 'video_bit_rate')))
|
|
rebulk = rebulk.regex_defaults(flags=re.IGNORECASE, abbreviations=[dash])
|
|
rebulk.defaults(name='audio_bit_rate', validator=seps_surround)
|
|
rebulk.regex(r'\d+-?[kmg]b(ps|its?)', r'\d+\.\d+-?[kmg]b(ps|its?)',
|
|
conflict_solver=(
|
|
lambda match, other: match
|
|
if other.name == 'audio_channels' and 'weak-audio_channels' not in other.tags
|
|
else other
|
|
),
|
|
formatter=BitRate.fromstring, tags=['release-group-prefix'])
|
|
|
|
rebulk.rules(BitRateTypeRule)
|
|
|
|
return rebulk
|
|
|
|
|
|
class BitRateTypeRule(Rule):
|
|
"""
|
|
Convert audio bit rate guess into video bit rate.
|
|
"""
|
|
consequence = [RenameMatch('video_bit_rate'), RemoveMatch]
|
|
|
|
def when(self, matches, context):
|
|
to_rename = []
|
|
to_remove = []
|
|
|
|
if is_disabled(context, 'audio_bit_rate'):
|
|
to_remove.extend(matches.named('audio_bit_rate'))
|
|
else:
|
|
video_bit_rate_disabled = is_disabled(context, 'video_bit_rate')
|
|
for match in matches.named('audio_bit_rate'):
|
|
previous = matches.previous(match, index=0,
|
|
predicate=lambda m: m.name in ('source', 'screen_size', 'video_codec'))
|
|
if previous and not matches.holes(previous.end, match.start, predicate=lambda m: m.value.strip(seps)):
|
|
after = matches.next(match, index=0, predicate=lambda m: m.name == 'audio_codec')
|
|
if after and not matches.holes(match.end, after.start, predicate=lambda m: m.value.strip(seps)):
|
|
bitrate = match.value
|
|
if bitrate.units == 'Kbps' or (bitrate.units == 'Mbps' and bitrate.magnitude < 10):
|
|
continue
|
|
|
|
if video_bit_rate_disabled:
|
|
to_remove.append(match)
|
|
else:
|
|
to_rename.append(match)
|
|
|
|
if to_rename or to_remove:
|
|
return to_rename, to_remove
|
|
return False
|