def streaming_service(config): """Streaming service property. :param config: rule configuration :type config: dict :return: :rtype: Rebulk """ rebulk = Rebulk( disabled=lambda context: is_disabled(context, 'streaming_service')) rebulk = rebulk.string_defaults(ignore_case=True).regex_defaults( flags=re.IGNORECASE, abbreviations=[dash]) rebulk.defaults(name='streaming_service', tags=['source-prefix']) for value, items in config.items(): patterns = items if isinstance(items, list) else [items] for pattern in patterns: if pattern.startswith('re:'): rebulk.regex(pattern, value=value) else: rebulk.string(pattern, value=value) rebulk.rules(ValidateStreamingService) return rebulk
def streaming_service(config): # pylint: disable=too-many-statements,unused-argument """Streaming service property. :param config: rule configuration :type config: dict :return: :rtype: Rebulk """ rebulk = Rebulk( disabled=lambda context: is_disabled(context, 'streaming_service')) rebulk = rebulk.string_defaults(ignore_case=True).regex_defaults( flags=re.IGNORECASE, abbreviations=[dash]) rebulk.defaults(name='streaming_service', tags=['source-prefix']) regex_prefix = 're:' for value, items in config.items(): patterns = items if isinstance(items, list) else [items] for pattern in patterns: if isinstance(pattern, dict): kwargs = pattern pattern = pattern['pattern'] else: kwargs = {} regex = kwargs.pop('regex', False) if regex or pattern.startswith(regex_prefix): rebulk.regex(pattern[len(regex_prefix):], value=value, **kwargs) else: rebulk.string(pattern, value=value, **kwargs) rebulk.rules(ValidateStreamingService) return rebulk
def screen_size(config): """ Builder for rebulk object. :param config: rule configuration :type config: dict :return: Created Rebulk object :rtype: Rebulk """ interlaced = frozenset(config['interlaced']) progressive = frozenset(config['progressive']) frame_rates = frozenset(config['frame_rates']) min_ar = config['min_ar'] max_ar = config['max_ar'] rebulk = Rebulk() rebulk = rebulk.string_defaults(ignore_case=True).regex_defaults( flags=re.IGNORECASE) rebulk.defaults( name='screen_size', validator=seps_surround, abbreviations=[dash], disabled=lambda context: is_disabled(context, 'screen_size')) frame_rate_pattern = build_or_pattern(frame_rates, name='frame_rate') interlaced_pattern = build_or_pattern(interlaced, name='height') progressive_pattern = build_or_pattern(progressive, name='height') res_pattern = r'(?:(?P<width>\d{3,4})(?:x|\*))?' rebulk.regex(res_pattern + interlaced_pattern + r'(?P<scan_type>i)' + frame_rate_pattern + '?') rebulk.regex(res_pattern + progressive_pattern + r'(?P<scan_type>p)' + frame_rate_pattern + '?') rebulk.regex(res_pattern + progressive_pattern + r'(?P<scan_type>p)?(?:hd)') rebulk.regex(res_pattern + progressive_pattern + r'(?P<scan_type>p)?x?') rebulk.string('4k', value='2160p', conflict_solver=lambda match, other: '__default__' if other.name == 'screen_size' else match) rebulk.regex(r'(?P<width>\d{3,4})-?(?:x|\*)-?(?P<height>\d{3,4})', conflict_solver=lambda match, other: '__default__' if other.name == 'screen_size' else other) rebulk.regex(frame_rate_pattern + '-?(?:p|fps)', name='frame_rate', formatter=FrameRate.fromstring, disabled=lambda context: is_disabled(context, 'frame_rate')) rebulk.rules(PostProcessScreenSize(progressive, min_ar, max_ar), ScreenSizeOnlyOne, ResolveScreenSizeConflicts) return rebulk
def streaming_service(config): # pylint: disable=too-many-statements,unused-argument """Streaming service property. :param config: rule configuration :type config: dict :return: :rtype: Rebulk """ rebulk = Rebulk( disabled=lambda context: is_disabled(context, 'streaming_service')) rebulk = rebulk.string_defaults(ignore_case=True).regex_defaults( flags=re.IGNORECASE, abbreviations=[dash]) rebulk.defaults(name='streaming_service', tags=['source-prefix']) load_config_patterns(rebulk, config) rebulk.rules(ValidateStreamingService) return rebulk
def screen_size(config): """ Builder for rebulk object. :param config: rule configuration :type config: dict :return: Created Rebulk object :rtype: Rebulk """ interlaced = frozenset({res for res in config['interlaced']}) progressive = frozenset({res for res in config['progressive']}) frame_rates = [re.escape(rate) for rate in config['frame_rates']] min_ar = config['min_ar'] max_ar = config['max_ar'] rebulk = Rebulk() rebulk = rebulk.string_defaults(ignore_case=True).regex_defaults(flags=re.IGNORECASE) rebulk.defaults(name='screen_size', validator=seps_surround, abbreviations=[dash], disabled=lambda context: is_disabled(context, 'screen_size')) frame_rate_pattern = build_or_pattern(frame_rates, name='frame_rate') interlaced_pattern = build_or_pattern(interlaced, name='height') progressive_pattern = build_or_pattern(progressive, name='height') res_pattern = r'(?:(?P<width>\d{3,4})(?:x|\*))?' rebulk.regex(res_pattern + interlaced_pattern + r'(?P<scan_type>i)' + frame_rate_pattern + '?') rebulk.regex(res_pattern + progressive_pattern + r'(?P<scan_type>p)' + frame_rate_pattern + '?') rebulk.regex(res_pattern + progressive_pattern + r'(?P<scan_type>p)?(?:hd)') rebulk.regex(res_pattern + progressive_pattern + r'(?P<scan_type>p)?x?') rebulk.string('4k', value='2160p') rebulk.regex(r'(?P<width>\d{3,4})-?(?:x|\*)-?(?P<height>\d{3,4})', conflict_solver=lambda match, other: '__default__' if other.name == 'screen_size' else other) rebulk.regex(frame_rate_pattern + '(p|fps)', name='frame_rate', formatter=FrameRate.fromstring, disabled=lambda context: is_disabled(context, 'frame_rate')) rebulk.rules(PostProcessScreenSize(progressive, min_ar, max_ar), ScreenSizeOnlyOne, ResolveScreenSizeConflicts) return rebulk
def streaming_service(config): # pylint: disable=too-many-statements,unused-argument """Streaming service property. :param config: rule configuration :type config: dict :return: :rtype: Rebulk """ rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'streaming_service')) rebulk = rebulk.string_defaults(ignore_case=True).regex_defaults(flags=re.IGNORECASE, abbreviations=[dash]) rebulk.defaults(name='streaming_service', tags=['source-prefix']) for value, items in config.items(): patterns = items if isinstance(items, list) else [items] for pattern in patterns: if pattern.startswith('re:'): rebulk.regex(pattern, value=value) else: rebulk.string(pattern, value=value) rebulk.rules(ValidateStreamingService) return rebulk
def streaming_service(config): # pylint: disable=too-many-statements,unused-argument """Streaming service property. :param config: rule configuration :type config: dict :return: :rtype: Rebulk """ rebulk = Rebulk( disabled=lambda context: is_disabled(context, 'streaming_service')) rebulk = rebulk.string_defaults(ignore_case=True).regex_defaults( flags=re.IGNORECASE, abbreviations=[dash]) rebulk.defaults(name='streaming_service', tags=['source-prefix']) rebulk.string('AE', 'A&E', value='A&E') rebulk.string('AMBC', value='ABC') rebulk.string('AUBC', value='ABC Australia') rebulk.string('AJAZ', value='Al Jazeera English') rebulk.string('AMC', value='AMC') rebulk.string('AMZN', 'Amazon', value='Amazon Prime') rebulk.regex('Amazon-?Prime', value='Amazon Prime') rebulk.string('AS', value='Adult Swim') rebulk.regex('Adult-?Swim', value='Adult Swim') rebulk.string('ATK', value="America's Test Kitchen") rebulk.string('ANPL', value='Animal Planet') rebulk.string('ANLB', value='AnimeLab') rebulk.string('AOL', value='AOL') rebulk.string('ARD', value='ARD') rebulk.string('iP', value='BBC iPlayer') rebulk.regex('BBC-?iPlayer', value='BBC iPlayer') rebulk.string('BRAV', value='BravoTV') rebulk.string('CNLP', value='Canal+') rebulk.string('CN', value='Cartoon Network') rebulk.string('CBC', value='CBC') rebulk.string('CBS', value='CBS') rebulk.string('CNBC', value='CNBC') rebulk.string('CC', value='Comedy Central') rebulk.string('4OD', value='Channel 4') rebulk.string('CHGD', value='CHRGD') rebulk.string('CMAX', value='Cinemax') rebulk.string('CMT', value='Country Music Television') rebulk.regex('Comedy-?Central', value='Comedy Central') rebulk.string('CCGC', value='Comedians in Cars Getting Coffee') rebulk.string('CR', value='Crunchy Roll') rebulk.string('CRKL', value='Crackle') rebulk.regex('Crunchy-?Roll', value='Crunchy Roll') rebulk.string('CSPN', value='CSpan') rebulk.string('CTV', value='CTV') rebulk.string('CUR', value='CuriosityStream') rebulk.string('CWS', value='CWSeed') rebulk.string('DSKI', value='Daisuki') rebulk.string('DHF', value='Deadhouse Films') rebulk.string('DDY', value='Digiturk Diledigin Yerde') rebulk.string('DISC', 'Discovery', value='Discovery') rebulk.string('DSNY', 'Disney', value='Disney') rebulk.string('DIY', value='DIY Network') rebulk.string('DOCC', value='Doc Club') rebulk.string('DPLY', value='DPlay') rebulk.string('ETV', value='E!') rebulk.string('EPIX', value='ePix') rebulk.string('ETTV', value='El Trece') rebulk.string('ESPN', value='ESPN') rebulk.string('ESQ', value='Esquire') rebulk.string('FAM', value='Family') rebulk.string('FJR', value='Family Jr') rebulk.string('FOOD', value='Food Network') rebulk.string('FOX', value='Fox') rebulk.string('FREE', value='Freeform') rebulk.string('FYI', value='FYI Network') rebulk.string('GLBL', value='Global') rebulk.string('GLOB', value='GloboSat Play') rebulk.string('HLMK', value='Hallmark') rebulk.string('HBO', value='HBO Go') rebulk.regex('HBO-?Go', value='HBO Go') rebulk.string('HGTV', value='HGTV') rebulk.string('HIST', 'History', value='History') rebulk.string('HULU', value='Hulu') rebulk.string('ID', value='Investigation Discovery') rebulk.string('IFC', value='IFC') rebulk.string('iTunes', 'iT', value='iTunes') rebulk.string('ITV', value='ITV') rebulk.string('KNOW', value='Knowledge Network') rebulk.string('LIFE', value='Lifetime') rebulk.string('MTOD', value='Motor Trend OnDemand') rebulk.string('MNBC', value='MSNBC') rebulk.string('MTV', value='MTV') rebulk.string('NATG', value='National Geographic') rebulk.regex('National-?Geographic', value='National Geographic') rebulk.string('NBA', value='NBA TV') rebulk.regex('NBA-?TV', value='NBA TV') rebulk.string('NBC', value='NBC') rebulk.string('NF', 'Netflix', value='Netflix') rebulk.string('NFL', value='NFL') rebulk.string('NFLN', value='NFL Now') rebulk.string('GC', value='NHL GameCenter') rebulk.string('NICK', 'Nickelodeon', value='Nickelodeon') rebulk.string('NRK', value='Norsk Rikskringkasting') rebulk.string('PBS', value='PBS') rebulk.string('PBSK', value='PBS Kids') rebulk.string('PSN', value='Playstation Network') rebulk.string('PLUZ', value='Pluzz') rebulk.string('RTE', value='RTE One') rebulk.string('SBS', value='SBS (AU)') rebulk.string('SESO', 'SeeSo', value='SeeSo') rebulk.string('SHMI', value='Shomi') rebulk.string('SPIK', value='Spike') rebulk.string('SPKE', value='Spike TV') rebulk.regex('Spike-?TV', value='Spike TV') rebulk.string('SNET', value='Sportsnet') rebulk.string('SPRT', value='Sprout') rebulk.string('STAN', value='Stan') rebulk.string('STZ', value='Starz') rebulk.string('SVT', value='Sveriges Television') rebulk.string('SWER', value='SwearNet') rebulk.string('SYFY', value='Syfy') rebulk.string('TBS', value='TBS') rebulk.string('TFOU', value='TFou') rebulk.string('CW', value='The CW') rebulk.regex('The-?CW', value='The CW') rebulk.string('TLC', value='TLC') rebulk.string('TUBI', value='TubiTV') rebulk.string('TV3', value='TV3 Ireland') rebulk.string('TV4', value='TV4 Sweeden') rebulk.string('TVL', value='TV Land') rebulk.regex('TV-?Land', value='TV Land') rebulk.string('UFC', value='UFC') rebulk.string('UKTV', value='UKTV') rebulk.string('UNIV', value='Univision') rebulk.string('USAN', value='USA Network') rebulk.string('VLCT', value='Velocity') rebulk.string('VH1', value='VH1') rebulk.string('VICE', value='Viceland') rebulk.string('VMEO', value='Vimeo') rebulk.string('VRV', value='VRV') rebulk.string('WNET', value='W Network') rebulk.string('WME', value='WatchMe') rebulk.string('WWEN', value='WWE Network') rebulk.string('XBOX', value='Xbox Video') rebulk.string('YHOO', value='Yahoo') rebulk.string('RED', value='YouTube Red') rebulk.string('ZDF', value='ZDF') rebulk.rules(ValidateStreamingService) return rebulk
def streaming_service(config): # pylint: disable=too-many-statements,unused-argument """Streaming service property. :param config: rule configuration :type config: dict :return: :rtype: Rebulk """ rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'streaming_service')) rebulk = rebulk.string_defaults(ignore_case=True).regex_defaults(flags=re.IGNORECASE, abbreviations=[dash]) rebulk.defaults(name='streaming_service', tags=['source-prefix']) rebulk.string('AE', 'A&E', value='A&E') rebulk.string('AMBC', value='ABC') rebulk.string('AUBC', value='ABC Australia') rebulk.string('AJAZ', value='Al Jazeera English') rebulk.string('AMC', value='AMC') rebulk.string('AMZN', 'Amazon', value='Amazon Prime') rebulk.regex('Amazon-?Prime', value='Amazon Prime') rebulk.string('AS', value='Adult Swim') rebulk.regex('Adult-?Swim', value='Adult Swim') rebulk.string('ATK', value="America's Test Kitchen") rebulk.string('ANPL', value='Animal Planet') rebulk.string('ANLB', value='AnimeLab') rebulk.string('AOL', value='AOL') rebulk.string('ARD', value='ARD') rebulk.string('iP', value='BBC iPlayer') rebulk.regex('BBC-?iPlayer', value='BBC iPlayer') rebulk.string('BRAV', value='BravoTV') rebulk.string('CNLP', value='Canal+') rebulk.string('CN', value='Cartoon Network') rebulk.string('CBC', value='CBC') rebulk.string('CBS', value='CBS') rebulk.string('CNBC', value='CNBC') rebulk.string('CC', value='Comedy Central') rebulk.string('4OD', value='Channel 4') rebulk.string('CHGD', value='CHRGD') rebulk.string('CMAX', value='Cinemax') rebulk.string('CMT', value='Country Music Television') rebulk.regex('Comedy-?Central', value='Comedy Central') rebulk.string('CCGC', value='Comedians in Cars Getting Coffee') rebulk.string('CR', value='Crunchy Roll') rebulk.string('CRKL', value='Crackle') rebulk.regex('Crunchy-?Roll', value='Crunchy Roll') rebulk.string('CSPN', value='CSpan') rebulk.string('CTV', value='CTV') rebulk.string('CUR', value='CuriosityStream') rebulk.string('CWS', value='CWSeed') rebulk.string('DSKI', value='Daisuki') rebulk.string('DHF', value='Deadhouse Films') rebulk.string('DDY', value='Digiturk Diledigin Yerde') rebulk.string('DISC', 'Discovery', value='Discovery') rebulk.string('DSNY', 'Disney', value='Disney') rebulk.string('DIY', value='DIY Network') rebulk.string('DOCC', value='Doc Club') rebulk.string('DPLY', value='DPlay') rebulk.string('ETV', value='E!') rebulk.string('EPIX', value='ePix') rebulk.string('ETTV', value='El Trece') rebulk.string('ESPN', value='ESPN') rebulk.string('ESQ', value='Esquire') rebulk.string('FAM', value='Family') rebulk.string('FJR', value='Family Jr') rebulk.string('FOOD', value='Food Network') rebulk.string('FOX', value='Fox') rebulk.string('FREE', value='Freeform') rebulk.string('FYI', value='FYI Network') rebulk.string('GLBL', value='Global') rebulk.string('GLOB', value='GloboSat Play') rebulk.string('HLMK', value='Hallmark') rebulk.string('HBO', value='HBO Go') rebulk.regex('HBO-?Go', value='HBO Go') rebulk.string('HGTV', value='HGTV') rebulk.string('HIST', 'History', value='History') rebulk.string('HULU', value='Hulu') rebulk.string('ID', value='Investigation Discovery') rebulk.string('IFC', value='IFC') rebulk.string('iTunes', 'iT', value='iTunes') rebulk.string('ITV', value='ITV') rebulk.string('KNOW', value='Knowledge Network') rebulk.string('LIFE', value='Lifetime') rebulk.string('MTOD', value='Motor Trend OnDemand') rebulk.string('MNBC', value='MSNBC') rebulk.string('MTV', value='MTV') rebulk.string('NATG', value='National Geographic') rebulk.regex('National-?Geographic', value='National Geographic') rebulk.string('NBA', value='NBA TV') rebulk.regex('NBA-?TV', value='NBA TV') rebulk.string('NBC', value='NBC') rebulk.string('NF', 'Netflix', value='Netflix') rebulk.string('NFL', value='NFL') rebulk.string('NFLN', value='NFL Now') rebulk.string('GC', value='NHL GameCenter') rebulk.string('NICK', 'Nickelodeon', value='Nickelodeon') rebulk.string('NRK', value='Norsk Rikskringkasting') rebulk.string('PBS', value='PBS') rebulk.string('PBSK', value='PBS Kids') rebulk.string('PSN', value='Playstation Network') rebulk.string('PLUZ', value='Pluzz') rebulk.string('RTE', value='RTE One') rebulk.string('SBS', value='SBS (AU)') rebulk.string('SESO', 'SeeSo', value='SeeSo') rebulk.string('SHMI', value='Shomi') rebulk.string('SPIK', value='Spike') rebulk.string('SPKE', value='Spike TV') rebulk.regex('Spike-?TV', value='Spike TV') rebulk.string('SNET', value='Sportsnet') rebulk.string('SPRT', value='Sprout') rebulk.string('STAN', value='Stan') rebulk.string('STZ', value='Starz') rebulk.string('SVT', value='Sveriges Television') rebulk.string('SWER', value='SwearNet') rebulk.string('SYFY', value='Syfy') rebulk.string('TBS', value='TBS') rebulk.string('TFOU', value='TFou') rebulk.string('CW', value='The CW') rebulk.regex('The-?CW', value='The CW') rebulk.string('TLC', value='TLC') rebulk.string('TUBI', value='TubiTV') rebulk.string('TV3', value='TV3 Ireland') rebulk.string('TV4', value='TV4 Sweeden') rebulk.string('TVL', value='TV Land') rebulk.regex('TV-?Land', value='TV Land') rebulk.string('UFC', value='UFC') rebulk.string('UKTV', value='UKTV') rebulk.string('UNIV', value='Univision') rebulk.string('USAN', value='USA Network') rebulk.string('VLCT', value='Velocity') rebulk.string('VH1', value='VH1') rebulk.string('VICE', value='Viceland') rebulk.string('VMEO', value='Vimeo') rebulk.string('VRV', value='VRV') rebulk.string('WNET', value='W Network') rebulk.string('WME', value='WatchMe') rebulk.string('WWEN', value='WWE Network') rebulk.string('XBOX', value='Xbox Video') rebulk.string('YHOO', value='Yahoo') rebulk.string('RED', value='YouTube Red') rebulk.string('ZDF', value='ZDF') rebulk.rules(ValidateStreamingService) return rebulk