#!/usr/bin/env python # -*- coding: utf-8 -*- """ streaming_service property """ import re from rebulk import Rebulk from rebulk.rules import Rule, RemoveMatch from ...rules.common import seps, dash def streaming_service(): """Streaming service property. :return: :rtype: Rebulk """ rebulk = Rebulk().string_defaults(ignore_case=True).regex_defaults(flags=re.IGNORECASE, abbreviations=[dash]) rebulk.defaults(name='streaming_service', tags=['format-prefix']) rebulk.string('AE', 'A&E', value='A&E') rebulk.string('AMBC', value='ABC') rebulk.string('AMC', value='AMC') rebulk.string('AMZN', 'AmazonPrime', value='Amazon Prime') rebulk.regex('Amazon-Prime', value='Amazon Prime') rebulk.string('AS', 'AdultSwim', value='Adult Swim') rebulk.regex('Adult-Swim', value='Adult Swim') rebulk.string('iP', 'BBCiPlayer', value='BBC iPlayer') rebulk.regex('BBC-iPlayer', value='BBC iPlayer') rebulk.string('CBS', value='CBS') rebulk.string('CC', 'ComedyCentral', value='Comedy Central') rebulk.regex('Comedy-Central', value='Comedy Central') rebulk.string('CR', 'CrunchyRoll', value='Crunchy Roll') rebulk.regex('Crunchy-Roll', value='Crunchy Roll') rebulk.string('CW', 'TheCW', value='The CW') rebulk.regex('The-CW', value='The CW') rebulk.string('DISC', 'Discovery', value='Discovery') rebulk.string('DIY', value='DIY Network') rebulk.string('DSNY', 'Disney', value='Disney') rebulk.string('EPIX', 'ePix', value='ePix') rebulk.string('HBO', 'HBOGo', value='HBO Go') rebulk.regex('HBO-Go', value='HBO Go') rebulk.string('HIST', 'History', value='History') rebulk.string('ID', value='Investigation Discovery') rebulk.string('IFC', 'IFC', value='IFC') rebulk.string('PBS', 'PBS', value='PBS') rebulk.string('NATG', 'NationalGeographic', value='National Geographic') rebulk.regex('National-Geographic', value='National Geographic') rebulk.string('NBA', 'NBATV', value='NBA TV') rebulk.regex('NBA-TV', value='NBA TV') rebulk.string('NBC', value='NBC') rebulk.string('NFL', value='NFL') rebulk.string('NICK', 'Nickelodeon', value='Nickelodeon') rebulk.string('NF', 'Netflix', value='Netflix') rebulk.string('iTunes', value='iTunes') rebulk.string('RTE', value='RTÉ One') rebulk.string('SESO', 'SeeSo', value='SeeSo') rebulk.string('SPKE', 'SpikeTV', 'Spike TV', value='Spike TV') rebulk.string('SYFY', 'Syfy', value='Syfy') rebulk.string('TFOU', 'TFou', value='TFou') rebulk.string('TLC', value='TLC') rebulk.string('TV3', value='TV3 Ireland') rebulk.string('TV4', value='TV4 Sweeden') rebulk.string('TVL', 'TVLand', 'TV Land', value='TV Land') rebulk.string('UFC', value='UFC') rebulk.string('USAN', value='USA Network') rebulk.rules(ValidateStreamingService) return rebulk class ValidateStreamingService(Rule): """Validate streaming service matches.""" priority = 32 consequence = RemoveMatch def when(self, matches, context): """Streaming service is always before format. :param matches: :type matches: rebulk.match.Matches :param context: :type context: dict :return: """ to_remove = [] for service in matches.named('streaming_service'): next_match = matches.next(service, lambda match: 'streaming_service.suffix' in match.tags, 0) previous_match = matches.previous(service, lambda match: 'streaming_service.prefix' in match.tags, 0) has_other = service.initiator and service.initiator.children.named('other') if not has_other and \ (not next_match or matches.holes(service.end, next_match.start, predicate=lambda match: match.value.strip(seps))) and \ (not previous_match or matches.holes(previous_match.end, service.start, predicate=lambda match: match.value.strip(seps))): to_remove.append(service) continue if service.value == 'Comedy Central': # Current match is a valid streaming service, removing invalid closed caption (CC) matches to_remove.extend(matches.named('other', predicate=lambda match: match.value == 'CC')) return to_remove