Example #1
0
    def __call__(self, data_in, accumulator):
        """
        Executes the flag

        Args:
            data_in: The input to the flag. Typically from the last step of the workflow or the input to a trigger
            accumulator (dict): A record of executed steps and their results. Of form {step_name: result}
        Returns:
            (bool): Is the flag true for the given data and accumulator
        """
        original_data_in = deepcopy(data_in)
        try:
            data_in = validate_parameter(data_in, self.data_in_api,
                                         'Filter {0}'.format(self.action))
            args = dereference_step_routing(self.args, accumulator,
                                            'In Filter {0}'.format(self.name))
            args.update({self.data_in_api['name']: data_in})
            result = get_filter(self.action)(**args)
            callbacks.FilterSuccess.send(self)
            return result
        except InvalidInput as e:
            callbacks.FilterError.send(self)
            logger.error('Filter {0} has invalid input {1}. Error: {2}. '
                         'Returning unmodified data'.format(
                             self.action, original_data_in, str(e)))
        except Exception as e:
            callbacks.FilterError.send(self)
            logger.error(
                'Filter {0} encountered an error: {1}. Returning unmodified data'
                .format(self.action, str(e)))
        return original_data_in
Example #2
0
    def valid_section(session):
        title = session.metadata.get('section_title')
        if not title:
            return True

        # Fetch filter
        filter = get_filter('filter_sections')
        if filter is None:
            return True

        # Normalize title
        title = title.strip().lower()

        log.trace('validate section - title: "%s", filter: %s', title, filter)

        # Check section title against filter
        if title not in filter:
            log.info('Ignoring item [%s](%s) played from filtered section "%s"' % (
                session.item_key,
                session.get_title(),
                session.metadata.get('section_title')
            ))
            return False

        return True
Example #3
0
    def library(cls, types=None, keys=None, titles=None):
        # Default to 'titles' filter preference
        if titles is None:
            titles = get_filter('filter_sections')

        return PlexLibrary.fetch(types,
                                 keys,
                                 titles,
                                 cache_id=cls.get_cache_id())
Example #4
0
    def sections(cls, types=None, keys=None, titles=None):
        # Default to 'titles' filter preference
        if titles is None:
            titles = get_filter('filter_sections')

        return PlexMediaServer.get_sections(types,
                                            keys,
                                            titles,
                                            cache_id=cls.get_cache_id())
    def library(cls, types=None, keys=None, titles=None):
        # Default to 'titles' filter preference
        if titles is None:
            titles, _ = get_filter('filter_sections')

        return PlexLibrary.fetch(
            types, keys, titles,
            cache_id=cls.get_cache_id()
        )
    def sections(cls, types=None, keys=None, titles=None):
        # Default to 'titles' filter preference
        if titles is None:
            titles, _ = get_filter('filter_sections')

        return PlexMediaServer.get_sections(
            types, keys, titles,
            cache_id=cls.get_cache_id()
        )
    def sections(cls, types=None, keys=None, titles=None):
        # Default to 'titles' filter preference
        if titles is None:
            titles, _ = get_filter('filter_sections')

        # Retrieve all sections
        sections = Plex['library'].sections()

        # Filter sections based on criteria
        return sections.filter(types, keys, titles)
    def from_event(cls, info):
        account_key = try_convert(info.get('account_key'), int)
        rating_key = info.get('rating_key')

        if account_key is None or rating_key is None:
            log.warn('Invalid action format: %s', info)
            return None

        if account_key != 1:
            log.debug('Ignoring action from shared account')
            return None

        if WatchSession.is_active(rating_key, lambda ws: not ws.update_required):
            log.debug('Ignoring action, item is currently being watched')
            return False

        metadata = Metadata.get(rating_key)

        if not metadata:
            log.debug('Ignoring action, unable to retrieve metadata')
            return False

        section = metadata.section.title.lower()

        f_allow, _ = get_filter('filter_sections')

        if f_allow is not None and section not in f_allow:
            log.debug('Ignoring action, section has been filtered')
            return False

        guid = Guid.parse(metadata.guid)

        request = {}

        if type(metadata) is Movie:
            request = cls.from_movie(metadata, guid)
        elif type(metadata) is Season:
            request = cls.from_season(metadata, guid)
        elif type(metadata) is Episode:
            request = cls.from_episode(metadata, guid)
        else:
            log.warn('Unsupported metadata type: %r', metadata)
            return None

        log.debug('request: %r', request)

        return request
def SyncMenu(refresh=None):
    oc = ObjectContainer(title2=L('sync_menu:title'), no_history=True, no_cache=True)
    all_keys = []

    create_active_item(oc)

    oc.add(DirectoryObject(
        key=Callback(Synchronize),
        title=pad_title('Synchronize'),
        summary=get_task_status('synchronize'),
        thumb=R("icon-sync.png")
    ))

    f_allow, f_deny = get_filter('filter_sections')
    sections = Plex['library'].sections()

    for section in sections.filter(['show', 'movie'], titles=f_allow):
        oc.add(DirectoryObject(
            key=Callback(Push, section=section.key),
            title=pad_title('Push "%s" to trakt' % section.title),
            summary=get_task_status('push', section.key),
            thumb=R("icon-sync_up.png")
        ))
        all_keys.append(section.key)

    if len(all_keys) > 1:
        oc.add(DirectoryObject(
            key=Callback(Push),
            title=pad_title('Push all to trakt'),
            summary=get_task_status('push'),
            thumb=R("icon-sync_up.png")
        ))

    oc.add(DirectoryObject(
        key=Callback(Pull),
        title=pad_title('Pull from trakt'),
        summary=get_task_status('pull'),
        thumb=R("icon-sync_down.png")
    ))

    return oc
def SyncMenu(refresh=None):
    oc = ObjectContainer(title2=L("Sync"), no_history=True, no_cache=True)
    all_keys = []

    create_active_item(oc)

    oc.add(DirectoryObject(
        key=Callback(Synchronize),
        title=pad_title('Synchronize'),
        summary=get_task_status('synchronize'),
        thumb=R("icon-sync.png")
    ))

    sections = PlexMediaServer.get_sections(['show', 'movie'], titles=get_filter('filter_sections'))

    for _, key, title in sections:
        oc.add(DirectoryObject(
            key=Callback(Push, section=key),
            title=pad_title('Push "' + title + '" to trakt'),
            summary=get_task_status('push', key),
            thumb=R("icon-sync_up.png")
        ))
        all_keys.append(key)

    if len(all_keys) > 1:
        oc.add(DirectoryObject(
            key=Callback(Push),
            title=pad_title('Push all to trakt'),
            summary=get_task_status('push'),
            thumb=R("icon-sync_up.png")
        ))

    oc.add(DirectoryObject(
        key=Callback(Pull),
        title=pad_title('Pull from trakt'),
        summary=get_task_status('pull'),
        thumb=R("icon-sync_down.png")
    ))

    return oc
    def match(session, key, f_current, f_validate, f_check=None, f_transform=None, normalize_values=True):
        if Prefs[key] is None:
            return True

        if f_check and f_check():
            return True

        value = f_current()

        # Normalize value
        if normalize_values:
            if value:
                value = value.strip()

            value = flatten(value)

        # Fetch filter
        f_allow, f_deny = get_filter(key, normalize_values=normalize_values)

        # Wildcard
        if f_allow is None and f_deny is None:
            return True

        if f_transform:
            # Transform filter values
            f_allow = [f_transform(x) for x in f_allow]
            f_deny = [f_transform(x) for x in f_deny]

        log.trace('validate "%s" - value: %s, allow: %s, deny: %s', key, repr(value), f_allow, f_deny)

        if f_validate(value, f_allow, f_deny):
            log.info('Ignoring item [%s](%s) played by filtered "%s": %s' % (
                session.rating_key,
                session.title,
                key, repr(f_current())
            ))
            return False

        return True
Example #12
0
    def valid_client(session):
        if Prefs['scrobble_clients'] is None:
            return True

        # Normalize client name
        client_name = session.client.name.lower() if session.client else None

        # Fetch filter
        filter = get_filter('scrobble_clients')
        if filter is None:
            return True

        log.trace('validate client - client_name: "%s", filter: %s', client_name, filter)

        if not session.client or client_name not in filter:
            log.info('Ignoring item [%s](%s) played by filtered client: %s' % (
                session.item_key,
                session.get_title(),
                client_name
            ))
            return False

        return True
Example #13
0
    def valid_user(session):
        if Prefs['scrobble_names'] is None:
            return True

        # Normalize username
        username = session.user.title.lower() if session.user else None

        # Fetch filter
        filter = get_filter('scrobble_names')
        if filter is None:
            return True

        log.trace('validate user - username: "******", filter: %s', username, filter)

        if not session.user or username not in filter:
            log.info('Ignoring item [%s](%s) played by filtered user: %s' % (
                session.item_key,
                session.get_title(),
                session.user.title if session.user else None
            ))
            return False

        return True
Example #14
0
def SyncMenu(refresh=None):
    oc = ObjectContainer(title2=L("Sync"), no_history=True, no_cache=True)
    all_keys = []

    create_active_item(oc)

    oc.add(
        DirectoryObject(key=Callback(Synchronize),
                        title=pad_title('Synchronize'),
                        summary=get_task_status('synchronize'),
                        thumb=R("icon-sync.png")))

    sections = PlexMediaServer.get_sections(
        ['show', 'movie'], titles=get_filter('filter_sections'))

    for _, key, title in sections:
        oc.add(
            DirectoryObject(key=Callback(Push, section=key),
                            title=pad_title('Push "' + title + '" to trakt'),
                            summary=get_task_status('push', key),
                            thumb=R("icon-sync_up.png")))
        all_keys.append(key)

    if len(all_keys) > 1:
        oc.add(
            DirectoryObject(key=Callback(Push),
                            title=pad_title('Push all to trakt'),
                            summary=get_task_status('push'),
                            thumb=R("icon-sync_up.png")))

    oc.add(
        DirectoryObject(key=Callback(Pull),
                        title=pad_title('Pull from trakt'),
                        summary=get_task_status('pull'),
                        thumb=R("icon-sync_down.png")))

    return oc
    def library(cls, types=None, keys=None, titles=None):
        # Default to 'titles' filter preference
        if titles is None:
            titles, _ = get_filter('filter_sections')

        return Library.all(types, keys, titles)