def create_session(self, session_key, state):
        """
        :type session_key: str
        :type state: str

        :rtype: WatchSession or None
        """

        log.debug('Creating a WatchSession for the current media')

        skip = False

        info = PlexMediaServer.get_session(session_key)
        if not info:
            return None

        # Client
        player_section = info.findall('Player')
        if len(player_section):
            player_section = player_section[0]

        client = PlexMediaServer.get_client(player_section.get('machineIdentifier'))

        # Metadata
        metadata = None

        try:
            metadata = PlexMetadata.get(info.get('ratingKey'))

            if metadata:
                metadata = metadata.to_dict()
        except NotImplementedError, e:
            # metadata not supported (music, etc..)
            log.debug('%s, ignoring session' % e.message)
            skip = True
Beispiel #2
0
    def fetch(cls, types=None, keys=None, titles=None, cache_id=None):
        if types and isinstance(types, basestring):
            types = [types]

        # Get all sections or filter based on 'types' and 'sections'
        sections = [(type, key)
                    for (type, key, _) in PlexMediaServer.get_sections(
                        types, keys, titles, cache_id=cache_id)]

        movies = {}
        shows = {}

        for type, key in sections:
            container = PlexMediaServer.get_section(key, cache_id=cache_id)
            if container is None:
                continue

            for media in container:
                if type == 'movie':
                    cls.map_item(movies, container, media)

                if type == 'show':
                    cls.map_item(shows, container, media)

        if len(types) == 1:
            if types[0] == 'movie':
                return movies

            if types[0] == 'show':
                return shows

        return movies, shows
    def fetch(cls, types=None, keys=None, titles=None, cache_id=None):
        if types and isinstance(types, basestring):
            types = [types]

        # Get all sections or filter based on 'types' and 'sections'
        sections = [(type, key) for (type, key, _) in PlexMediaServer.get_sections(
            types, keys, titles,
            cache_id=cache_id
        )]

        movies = {}
        shows = {}

        for type, key in sections:
            container = PlexMediaServer.get_section(key, cache_id=cache_id)
            if container is None:
                continue

            for media in container:
                if type == 'movie':
                    cls.map_item(movies, container, media)

                if type == 'show':
                    cls.map_item(shows, container, media)

        if len(types) == 1:
            if types[0] == 'movie':
                return movies

            if types[0] == 'show':
                return shows

        return movies, shows
Beispiel #4
0
    def watch(self, p_items, t_item):
        if type(p_items) is not list:
            p_items = [p_items]

        if not t_item.is_watched:
            return True

        for p_item in p_items:
            # Ignore already seen movies
            if p_item.seen:
                continue

            PlexMediaServer.scrobble(p_item.rating_key)

        return True
Beispiel #5
0
    def watch(self, p_items, t_item):
        if type(p_items) is not list:
            p_items = [p_items]

        if not t_item.is_watched:
            return True

        for p_item in p_items:
            # Ignore already seen movies
            if p_item.seen:
                continue

            PlexMediaServer.scrobble(p_item.rating_key)

        return True
    def create_session(self, info):
        if not info.get('ratingKey'):
            log.warn('Invalid ratingKey provided from activity info')
            return None

        skip = False

        # Client
        client = None
        if info.get('machineIdentifier'):
            client = PlexMediaServer.get_client(info['machineIdentifier'])
        else:
            log.info(
                'No machineIdentifier available, client filtering not available'
            )

        # Metadata
        metadata = None

        try:
            metadata = PlexMetadata.get(info['ratingKey'])

            if metadata:
                metadata = metadata.to_dict()
        except NotImplementedError, e:
            # metadata not supported (music, etc..)
            log.debug('%s, ignoring session' % e.message)
            skip = True
    def test(cls):
        if PlexMediaServer.get_sessions() is None:
            log.info("Error while retrieving sessions, assuming WebSocket method isn't available")
            return False

        server_info = PlexMediaServer.get_info()
        if server_info is None:
            log.info('Error while retrieving server info for testing')
            return False

        multi_user = bool(server_info.get('multiuser', 0))
        if not multi_user:
            log.info("Server info indicates multi-user support isn't available, WebSocket method not available")
            return False

        return True
    def create_session(self, info):
        if not info.get('ratingKey'):
            log.warn('Invalid ratingKey provided from activity info')
            return None

        skip = False

        # Client
        client = None
        if info.get('machineIdentifier'):
            client = PlexMediaServer.get_client(info['machineIdentifier'])
        else:
            log.info('No machineIdentifier available, client filtering not available')

        # Metadata
        metadata = None

        try:
            metadata = PlexMetadata.get(info['ratingKey'])

            if metadata:
                metadata = metadata.to_dict()
        except NotImplementedError, e:
            # metadata not supported (music, etc..)
            log.debug('%s, ignoring session' % e.message)
            skip = True
Beispiel #9
0
    def rate(self, p_items, t_item):
        if type(p_items) is not list:
            p_items = [p_items]

        if t_item.rating is None:
            return True

        t_rating = t_item.rating.advanced

        for p_item in p_items:
            # Ignore already rated episodes
            if p_item.user_rating == t_rating:
                continue

            if p_item.user_rating is None or self.rate_conflict(p_item, t_item):
                PlexMediaServer.rate(p_item.rating_key, t_rating)

        return True
Beispiel #10
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 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()
        )
Beispiel #12
0
    def rate(self, p_items, t_item):
        if type(p_items) is not list:
            p_items = [p_items]

        if t_item.rating_advanced is None:
            return True

        t_rating = t_item.rating_advanced

        for p_item in p_items:
            # Ignore already rated episodes
            if p_item.user_rating == t_rating:
                continue

            if p_item.user_rating is None or self.rate_conflict(
                    p_item, t_item):
                PlexMediaServer.rate(p_item.rating_key, t_rating)

        return True
Beispiel #13
0
    def test(cls):
        if PlexMediaServer.get_sessions() is None:
            log.info(
                "Error while retrieving sessions, assuming WebSocket method isn't available"
            )
            return False

        server_info = PlexMediaServer.get_info()
        if server_info is None:
            log.info('Error while retrieving server info for testing')
            return False

        multi_user = bool(server_info.get('multiuser', 0))
        if not multi_user:
            log.info(
                "Server info indicates multi-user support isn't available, WebSocket method not available"
            )
            return False

        return True
    def try_read_line(cls, start_interval=1, interval_step=1.6, max_interval=5, max_tries=4, timeout=30):
        line = None

        try_count = 0
        retry_interval = float(start_interval)

        while not line and try_count <= max_tries:
            try_count += 1

            line = cls.read_line(timeout)
            if line:
                break

            if cls.log_file.get_path() != cls.log_path:
                log.debug("Log file moved (probably rotated), closing")
                cls.close()

            # If we are below max_interval, keep increasing the interval
            if retry_interval < max_interval:
                retry_interval = retry_interval * interval_step

                # Ensure the new retry_interval is below max_interval
                if retry_interval > max_interval:
                    retry_interval = max_interval

            # Sleep if we should still retry
            if try_count <= max_tries:
                if try_count > 1:
                    log.debug('Log file read returned nothing, waiting %.02f seconds and then trying again' % retry_interval)
                    time.sleep(retry_interval)

                # Ping server to see if server is still active
                PlexMediaServer.get_info(quiet=True)

        if line and try_count > 2:
            log.debug('Successfully read the log file after retrying')
        elif not line:
            log.warn('Finished retrying, still no success')

        return line
    def try_read_line(cls, start_interval=1, interval_step=1.6, max_interval=5, max_tries=4, timeout=30):
        line = None

        try_count = 0
        retry_interval = float(start_interval)

        while not line and try_count <= max_tries:
            try_count += 1

            line = cls.read_line(timeout)
            if line:
                break

            if cls.log_file.get_path() != cls.log_path:
                log.debug("Log file moved (probably rotated), closing")
                cls.close()

            # If we are below max_interval, keep increasing the interval
            if retry_interval < max_interval:
                retry_interval = retry_interval * interval_step

                # Ensure the new retry_interval is below max_interval
                if retry_interval > max_interval:
                    retry_interval = max_interval

            # Sleep if we should still retry
            if try_count <= max_tries:
                if try_count > 1:
                    log.debug('Log file read returned nothing, waiting %.02f seconds and then trying again' % retry_interval)
                    time.sleep(retry_interval)

                # Ping server to see if server is still active
                PlexMediaServer.get_info(quiet=True)

        if line and try_count > 2:
            log.debug('Successfully read the log file after retrying')
        elif not line:
            log.warn('Finished retrying, still no success')

        return line
Beispiel #16
0
    def create_session(self, session_key, state):
        """
        :type session_key: str
        :type state: str

        :rtype: WatchSession or None
        """

        log.debug('Creating a WatchSession for the current media')

        skip = False

        info = PlexMediaServer.get_session(session_key)
        if not info:
            return None

        # Client
        player_section = info.findall('Player')
        if len(player_section):
            player_section = player_section[0]

        client = PlexMediaServer.get_client(
            player_section.get('machineIdentifier'))

        # Metadata
        metadata = None

        try:
            metadata = PlexMetadata.get(info.get('ratingKey'))

            if metadata:
                metadata = metadata.to_dict()
        except NotImplementedError, e:
            # metadata not supported (music, etc..)
            log.debug('%s, ignoring session' % e.message)
            skip = True
    def update_session(self, session, view_offset):
        log.debug('Trying to update the current WatchSession (session key: %s)' % session.key)

        video_section = PlexMediaServer.get_session(session.key)
        if not video_section:
            log.warn('Session was not found on media server')
            return False

        log.debug('last item key: %s, current item key: %s' % (session.item_key, video_section.get('ratingKey')))

        if session.item_key != video_section.get('ratingKey'):
            log.debug('Invalid Session: Media changed')
            return False

        session.last_view_offset = view_offset
        session.update_required = False

        return True
Beispiel #18
0
    def start(self):
        # Get current server version and save it to dict.
        server_version = PlexMediaServer.get_version()
        if server_version:
            Log('Server Version is %s' % server_version)
            Dict['server_version'] = server_version

        # Validate username/password
        spawn(self.validate_auth)

        # Check for updates
        self.update_checker.run_once(async=True)

        self.session_manager.start()

        # Start modules
        for module in self.modules:
            if hasattr(module, 'start'):
                log.debug("Starting module %s", module)
                module.start()
    def init_trakt():
        def get_credentials():
            password_hash = hashlib.sha1(Prefs['password'])

            return (
                Prefs['username'],
                password_hash.hexdigest()
            )

        Trakt.configure(
            # Application
            api_key='ba5aa61249c02dc5406232da20f6e768f3c82b28',

            # Version
            plugin_version=PLUGIN_VERSION,
            media_center_version=PlexMediaServer.get_version(),

            # Account
            credentials=get_credentials
        )
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 = PlexMediaServer.get_sections(['show', 'movie'], titles=f_allow)

    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
Beispiel #21
0
    def update_session(self, session, view_offset):
        log.debug(
            'Trying to update the current WatchSession (session key: %s)' %
            session.key)

        video_section = PlexMediaServer.get_session(session.key)
        if not video_section:
            log.warn('Session was not found on media server')
            return False

        log.debug('last item key: %s, current item key: %s' %
                  (session.item_key, video_section.get('ratingKey')))

        if session.item_key != video_section.get('ratingKey'):
            log.debug('Invalid Session: Media changed')
            return False

        session.last_view_offset = view_offset
        session.update_required = False

        return True
Beispiel #22
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