Beispiel #1
0
 def inner(*args, **kwargs):
     with resolve(lock, args[0]):
         return func(*args, **kwargs)
    def to_dict(self, obj, info, fetch=False):
        fetch = resolve(fetch, obj, info)

        view_offset = to_integer(info.get('viewOffset'))

        result = {
            'rating_key': to_integer(info.get('ratingKey')),
            'view_offset': view_offset,
            'updated_at': datetime.utcnow()
        }

        if not fetch:
            # Return simple update
            return merge(
                result,
                {'progress': self.get_progress(obj.duration, view_offset)})

        # Retrieve session key
        session_key = to_integer(info.get('sessionKey'))

        if not session_key:
            log.info('Missing session key, unable to fetch session details')
            return result

        # Retrieve active sessions
        log.debug('Fetching details for session #%s', session_key)

        p_sessions = Plex['status'].sessions()

        if not p_sessions:
            log.info('Unable to retrieve active sessions')
            return result

        # Find session matching `session_key`
        p_item = p_sessions.get(session_key)

        if not p_item:
            log.info('Unable to find session with key %r', session_key)
            return result

        # Retrieve metadata and guid
        p_metadata, guid = self.get_metadata(p_item.rating_key)

        if not p_metadata:
            log.info('Unable to retrieve metadata for rating_key %r',
                     p_item.rating_key)
            return result

        if not guid:
            return merge(
                result, {
                    'duration': p_metadata.duration,
                    'progress': self.get_progress(p_metadata.duration,
                                                  view_offset)
                })

        try:
            # Create/Retrieve `Client` for session
            result['client'] = ClientManager.get.or_create(
                p_item.session.player,
                fetch=True,
                match=True,
                filtered_exception=True)

            # Create/Retrieve `User` for session
            result['user'] = UserManager.get.or_create(p_item.session.user,
                                                       fetch=True,
                                                       match=True,
                                                       filtered_exception=True)

            # Pick account from `client` or `user` objects
            result['account'] = self.get_account(result)
        except FilteredException:
            log.debug('Activity has been filtered')

            result['client'] = None
            result['user'] = None

            result['account'] = None

        return merge(
            result, {
                'duration': p_metadata.duration,
                'progress': self.get_progress(p_metadata.duration, view_offset)
            })
    def to_dict(self, obj, info, fetch=False):
        fetch = resolve(fetch, obj, info)

        view_offset = to_integer(info.get('viewOffset'))

        result = {
            'rating_key': to_integer(info.get('ratingKey')),
            'view_offset': view_offset,

            'updated_at': datetime.utcnow()
        }

        if not fetch:
            # Return simple update
            return merge(result, {
                'progress': self.get_progress(
                    obj.duration, view_offset,
                    obj.part, obj.part_count, obj.part_duration
                )
            })

        # Retrieve session key
        session_key = to_integer(info.get('sessionKey'))

        if not session_key:
            log.info('Missing session key, unable to fetch session details')
            return result

        # Retrieve active sessions
        log.debug('Fetching details for session #%s', session_key)

        p_sessions = Plex['status'].sessions()

        if not p_sessions:
            log.info('Unable to retrieve active sessions')
            return result

        # Find session matching `session_key`
        p_item = p_sessions.get(session_key)

        if not p_item:
            log.info('Unable to find session with key %r', session_key)
            return result

        # Retrieve metadata and guid
        p_metadata, guid = self.get_metadata(p_item.rating_key)

        if not p_metadata:
            log.info('Unable to retrieve metadata for rating_key %r', p_item.rating_key)
            return result

        if not guid or not guid.valid:
            return merge(result, {
                'duration': p_metadata.duration,
                'progress': self.get_progress(p_metadata.duration, view_offset)
            })

        # Retrieve media parts
        part, part_count, part_duration = self.match_parts(p_metadata, guid, view_offset)

        log.debug('Part: %s (part_count: %s, part_duration: %s)', part, part_count, part_duration)

        # Find matching client + user for session
        try:
            # Create/Retrieve `Client` for session
            result['client'] = ClientManager.get.or_create(
                p_item.session.player,

                fetch=True,
                match=True,
                filtered_exception=True
            )

            # Create/Retrieve `User` for session
            result['user'] = UserManager.get.or_create(
                p_item.session.user,

                fetch=True,
                match=True,
                filtered_exception=True
            )

            # Pick account from `client` or `user` objects
            result['account'] = self.get_account(result)
        except FilteredException:
            log.debug('Activity has been filtered')

            result['client'] = None
            result['user'] = None

            result['account'] = None

        return merge(result, {
            'part': part,
            'part_count': part_count,
            'part_duration': part_duration,

            'duration': p_metadata.duration,
            'progress': self.get_progress(
                p_metadata.duration, view_offset,
                part, part_count, part_duration
            )
        })