Exemplo n.º 1
0
    def __init__(self):

        global log
        log = Logging(self.__class__.__name__).log

        self.addonId = clientinfo.ClientInfo().getAddonId()
        self.doUtils = downloadutils.DownloadUtils().downloadUrl
        self.userClient = userclient.UserClient()
Exemplo n.º 2
0
    def __init__(self):

        self.addon = xbmcaddon.Addon()
        self.__language__ = self.addon.getLocalizedString

        self.clientInfo = clientinfo.ClientInfo()
        self.addonName = self.clientInfo.getAddonName()
        self.addonId = self.clientInfo.getAddonId()
        self.doUtils = downloadutils.DownloadUtils()
        self.userClient = userclient.UserClient()
Exemplo n.º 3
0
    def __init__(self):

        self.__dict__ = self._shared_state
        self.monitor = xbmc.Monitor()

        self.clientInfo = clientinfo.ClientInfo()
        self.doUtils = downloadutils.DownloadUtils().downloadUrl
        self.user = userclient.UserClient()
        self.emby = embyserver.Read_EmbyServer()

        self.kodi_version = int(xbmc.getInfoLabel('System.BuildVersion')[:2])

        threading.Thread.__init__(self)
Exemplo n.º 4
0
    def on_message(self, ws, message):

        result = json.loads(message)
        message_type = result['MessageType']

        if message_type not in ('NotificationAdded', 'SessionEnded', 'RestartRequired',
                                'PackageInstalling'):
            # Mute certain events
            log.info("Message: %s", message)

        if message_type == 'Play':
            # A remote control play command has been sent from the server.
            data = result['Data']
            self._play(data)

        elif message_type == 'Playstate':
            # A remote control update playstate command has been sent from the server.
            data = result['Data']
            self._playstate(data)

        elif message_type == "UserDataChanged":
            # A user changed their personal rating for an item, or their playstate was updated
            data = result['Data']
            userdata_list = data['UserDataList']
            self.library_sync.triage_items("userdata", userdata_list)

        elif message_type == "LibraryChanged":
            data = result['Data']
            self._library_changed(data)

        elif message_type == "GeneralCommand":
            data = result['Data']
            self._general_commands(data)

        elif message_type == "ServerRestarting":
            self._server_restarting()

        elif message_type == "UserConfigurationUpdated":
            # Update user data set in userclient
            data = result['Data']
            userclient.UserClient().get_user(data)
            self.library_sync.refresh_views = True

        elif message_type == "ServerShuttingDown":
            # Server went offline
            window('emby_online', value="false")
Exemplo n.º 5
0
    def __init__(self):
        log.debug('Entering initialsetup class')
        self.clientInfo = clientinfo.ClientInfo()
        self.addonId = self.clientInfo.getAddonId()
        self.doUtils = downloadutils.DownloadUtils().downloadUrl
        self.userClient = userclient.UserClient()
        self.plx = PlexAPI.PlexAPI()
        self.dialog = xbmcgui.Dialog()

        self.server = self.userClient.getServer()
        self.serverid = settings('plex_machineIdentifier')
        # Get Plex credentials from settings file, if they exist
        plexdict = self.plx.GetPlexLoginFromSettings()
        self.myplexlogin = plexdict['myplexlogin'] == 'true'
        self.plexLogin = plexdict['plexLogin']
        self.plexToken = plexdict['plexToken']
        self.plexid = plexdict['plexid']
        if self.plexToken:
            log.debug('Found a plex.tv token in the settings')
Exemplo n.º 6
0
    def __init__(self):

        log = self.logMsg
        window = utils.window

        self.clientInfo = clientinfo.ClientInfo()
        self.addonName = self.clientInfo.getAddonName()
        logLevel = userclient.UserClient().getLogLevel()
        self.monitor = xbmc.Monitor()

        window('emby_logLevel', value=str(logLevel))
        window('emby_kodiProfile',
               value=xbmc.translatePath("special://profile"))
        window('emby_pluginpath', value=utils.settings('useDirectPaths'))

        # Initial logging
        log("======== START %s ========" % self.addonName, 0)
        log("Platform: %s" % (self.clientInfo.getPlatform()), 0)
        log("KODI Version: %s" % xbmc.getInfoLabel('System.BuildVersion'), 0)
        log("%s Version: %s" % (self.addonName, self.clientInfo.getVersion()),
            0)
        log(
            "Using plugin paths: %s" %
            (utils.settings('useDirectPaths') != "true"), 0)
        log("Log Level: %s" % logLevel, 0)

        # Reset window props for profile switch
        properties = [
            "emby_online", "emby_serverStatus", "emby_onWake",
            "emby_syncRunning", "emby_dbCheck", "emby_kodiScan",
            "emby_shouldStop", "emby_currUser", "emby_dbScan",
            "emby_sessionId", "emby_initialScan", "emby_customplaylist",
            "emby_playbackProps"
        ]
        for prop in properties:
            window(prop, clear=True)

        # Clear video nodes properties
        videonodes.VideoNodes().clearProperties()

        # Set the minimum database version
        window('emby_minDBVersion', value="1.1.63")
Exemplo n.º 7
0
    def ServiceEntryPoint(self):

        log = self.logMsg
        window = utils.window
        lang = utils.language

        # Important: Threads depending on abortRequest will not trigger
        # if profile switch happens more than once.
        monitor = self.monitor
        kodiProfile = xbmc.translatePath("special://profile")

        # Server auto-detect
        initialsetup.InitialSetup().setup()

        # Initialize important threads
        user = userclient.UserClient()
        ws = wsc.WebSocket_Client()
        library = librarysync.LibrarySync()
        kplayer = player.Player()
        # Sync and progress report
        lastProgressUpdate = datetime.today()

        while not monitor.abortRequested():

            if window('emby_kodiProfile') != kodiProfile:
                # Profile change happened, terminate this thread and others
                log(
                    "Kodi profile was: %s and changed to: %s. Terminating old Emby thread."
                    % (kodiProfile, utils.window('emby_kodiProfile')), 1)

                break

            # Before proceeding, need to make sure:
            # 1. Server is online
            # 2. User is set
            # 3. User has access to the server

            if window('emby_online') == "true":

                # Emby server is online
                # Verify if user is set and has access to the server
                if (user.currUser is not None) and user.HasAccess:

                    # If an item is playing
                    if xbmc.Player().isPlaying():
                        try:
                            # Update and report progress
                            playtime = xbmc.Player().getTime()
                            totalTime = xbmc.Player().getTotalTime()
                            currentFile = kplayer.currentFile

                            # Update positionticks
                            if kplayer.played_info.get(
                                    currentFile) is not None:
                                kplayer.played_info[currentFile][
                                    'currentPosition'] = playtime

                            td = datetime.today() - lastProgressUpdate
                            secDiff = td.seconds

                            # Report progress to Emby server
                            if (secDiff > 3):
                                kplayer.reportPlayback()
                                lastProgressUpdate = datetime.today()

                            elif window('emby_command') == "true":
                                # Received a remote control command that
                                # requires updating immediately
                                window('emby_command', clear=True)
                                kplayer.reportPlayback()
                                lastProgressUpdate = datetime.today()

                        except Exception as e:
                            log(
                                "Exception in Playback Monitor Service: %s" %
                                e, 1)
                            pass
                    else:
                        # Start up events
                        self.warn_auth = True
                        if utils.settings(
                                'connectMsg') == "true" and self.welcome_msg:
                            # Reset authentication warnings
                            self.welcome_msg = False
                            # Get additional users
                            additionalUsers = user.AdditionalUser
                            if additionalUsers:
                                add = ", %s" % ", ".join(additionalUsers)
                            else:
                                add = ""
                            xbmcgui.Dialog().notification(
                                heading="Emby for Kodi",
                                message=("%s %s%s!" %
                                         (lang(33000),
                                          user.currUser.decode('utf-8'),
                                          add.decode('utf-8'))),
                                icon=
                                "special://home/addons/plugin.video.emby/icon.png",
                                time=2000,
                                sound=False)

                        # Start monitoring kodi events
                        if not self.kodimonitor_running:
                            self.kodimonitor_running = kodimonitor.KodiMonitor(
                            )

                        # Start the Websocket Client
                        if not self.websocket_running:
                            self.websocket_running = True
                            ws.start()
                        # Start the syncing thread
                        if not self.library_running:
                            self.library_running = True
                            library.start()
                else:

                    if (user.currUser is None) and self.warn_auth:
                        # Alert user is not authenticated and suppress future warning
                        self.warn_auth = False
                        log("Not authenticated yet.", 1)

                    # User access is restricted.
                    # Keep verifying until access is granted
                    # unless server goes offline or Kodi is shut down.
                    while user.HasAccess == False:
                        # Verify access with an API call
                        user.hasAccess()

                        if window('emby_online') != "true":
                            # Server went offline
                            break

                        if monitor.waitForAbort(5):
                            # Abort was requested while waiting. We should exit
                            break
            else:
                # Wait until Emby server is online
                # or Kodi is shut down.
                while not monitor.abortRequested():

                    if user.getServer() == False:
                        # No server info set in add-on settings
                        pass

                    elif user.getPublicUsers() == False:
                        # Server is offline.
                        # Alert the user and suppress future warning
                        if self.server_online:
                            log("Server is offline.", 1)
                            window('emby_online', value="false")

                            xbmcgui.Dialog().notification(
                                heading=lang(33001),
                                message="%s %s" %
                                (self.addonName, lang(33002)),
                                icon=
                                "special://home/addons/plugin.video.emby/icon.png",
                                sound=False)

                        self.server_online = False

                    else:
                        # Server is online
                        if not self.server_online:
                            # Server was offline when Kodi started.
                            # Wait for server to be fully established.
                            if monitor.waitForAbort(5):
                                # Abort was requested while waiting.
                                break
                            # Alert the user that server is online.
                            xbmcgui.Dialog().notification(
                                heading="Emby for Kodi",
                                message=lang(33003),
                                icon=
                                "special://home/addons/plugin.video.emby/icon.png",
                                time=2000,
                                sound=False)

                        self.server_online = True
                        log("Server is online and ready.", 1)
                        window('emby_online', value="true")

                        # Start the userclient thread
                        if not self.userclient_running:
                            self.userclient_running = True
                            user.start()

                        break

                    if monitor.waitForAbort(1):
                        # Abort was requested while waiting.
                        break

            if monitor.waitForAbort(1):
                # Abort was requested while waiting. We should exit
                break

        ##### Emby thread is terminating. #####

        if self.userclient_running:
            user.stopClient()

        if self.library_running:
            library.stopThread()

        if self.websocket_running:
            ws.stopClient()

        log("======== STOP %s ========" % self.addonName, 0)
Exemplo n.º 8
0
    def ServiceEntryPoint(self):
        # Important: Threads depending on abortRequest will not trigger
        # if profile switch happens more than once.
        monitor = self.monitor
        kodiProfile = xbmc.translatePath("special://profile")

        # Server auto-detect
        initialsetup.InitialSetup().setup()

        # Queue for background sync
        queue = Queue.Queue()

        connectMsg = True if settings('connectMsg') == 'true' else False

        # Initialize important threads
        user = userclient.UserClient()
        ws = wsc.WebSocket(queue)
        library = librarysync.LibrarySync(queue)
        plx = PlexAPI.PlexAPI()

        counter = 0
        while not monitor.abortRequested():

            if window('plex_kodiProfile') != kodiProfile:
                # Profile change happened, terminate this thread and others
                log.warn("Kodi profile was: %s and changed to: %s. "
                         "Terminating old PlexKodiConnect thread." %
                         (kodiProfile, window('plex_kodiProfile')))
                break

            # Before proceeding, need to make sure:
            # 1. Server is online
            # 2. User is set
            # 3. User has access to the server

            if window('plex_online') == "true":
                # Plex server is online
                # Verify if user is set and has access to the server
                if (user.currUser is not None) and user.HasAccess:
                    if not self.kodimonitor_running:
                        # Start up events
                        self.warn_auth = True
                        if connectMsg and self.welcome_msg:
                            # Reset authentication warnings
                            self.welcome_msg = False
                            xbmcgui.Dialog().notification(
                                heading=addonName,
                                message="%s %s" % (lang(33000), user.currUser),
                                icon=
                                "special://home/addons/plugin.video.plexkodiconnect/icon.png",
                                time=2000,
                                sound=False)
                        # Start monitoring kodi events
                        self.kodimonitor_running = kodimonitor.KodiMonitor()

                        # Start the Websocket Client
                        if not self.websocket_running:
                            self.websocket_running = True
                            ws.start()
                        # Start the syncing thread
                        if not self.library_running:
                            self.library_running = True
                            library.start()
                        # Start the Plex Companion thread
                        if not self.plexCompanion_running:
                            self.plexCompanion_running = True
                            plexCompanion = PlexCompanion.PlexCompanion()
                            plexCompanion.start()
                else:
                    if (user.currUser is None) and self.warn_auth:
                        # Alert user is not authenticated and suppress future warning
                        self.warn_auth = False
                        log.warn("Not authenticated yet.")

                    # User access is restricted.
                    # Keep verifying until access is granted
                    # unless server goes offline or Kodi is shut down.
                    while user.HasAccess == False:
                        # Verify access with an API call
                        user.hasAccess()

                        if window('plex_online') != "true":
                            # Server went offline
                            break

                        if monitor.waitForAbort(5):
                            # Abort was requested while waiting. We should exit
                            break
                        xbmc.sleep(50)
            else:
                # Wait until Plex server is online
                # or Kodi is shut down.
                while not monitor.abortRequested():
                    server = user.getServer()
                    if server is False:
                        # No server info set in add-on settings
                        pass
                    elif plx.CheckConnection(server, verifySSL=True) is False:
                        # Server is offline or cannot be reached
                        # Alert the user and suppress future warning
                        if self.server_online:
                            log.error("Server is offline.")
                            window('plex_online', value="false")
                            # Suspend threads
                            window('suspend_LibraryThread', value='true')
                            xbmcgui.Dialog().notification(
                                heading=lang(33001),
                                message="%s %s" % (addonName, lang(33002)),
                                icon="special://home/addons/plugin.video."
                                "plexkodiconnect/icon.png",
                                sound=False)
                        self.server_online = False
                        counter += 1
                        # Periodically check if the IP changed, e.g. per minute
                        if counter > 30:
                            counter = 0
                            setup = initialsetup.InitialSetup()
                            tmp = setup.PickPMS()
                            if tmp is not None:
                                setup.WritePMStoSettings(tmp)
                    else:
                        # Server is online
                        counter = 0
                        if not self.server_online:
                            # Server was offline when Kodi started.
                            # Wait for server to be fully established.
                            if monitor.waitForAbort(5):
                                # Abort was requested while waiting.
                                break
                            # Alert the user that server is online.
                            xbmcgui.Dialog().notification(
                                heading=addonName,
                                message=lang(33003),
                                icon="special://home/addons/plugin.video."
                                "plexkodiconnect/icon.png",
                                time=5000,
                                sound=False)
                        self.server_online = True
                        log.warn("Server %s is online and ready." % server)
                        window('plex_online', value="true")
                        if window('plex_authenticated') == 'true':
                            # Server got offline when we were authenticated.
                            # Hence resume threads
                            window('suspend_LibraryThread', clear=True)

                        # Start the userclient thread
                        if not self.userclient_running:
                            self.userclient_running = True
                            user.start()

                        break

                    if monitor.waitForAbort(2):
                        # Abort was requested while waiting.
                        break

            if monitor.waitForAbort(0.05):
                # Abort was requested while waiting. We should exit
                break

        # Terminating PlexKodiConnect

        # Tell all threads to terminate (e.g. several lib sync threads)
        window('plex_terminateNow', value='true')

        try:
            plexCompanion.stopThread()
        except:
            log.warn('plexCompanion already shut down')

        try:
            library.stopThread()
        except:
            log.warn('Library sync already shut down')

        try:
            ws.stopThread()
        except:
            log.warn('Websocket client already shut down')

        try:
            user.stopThread()
        except:
            log.warn('User client already shut down')

        try:
            downloadutils.DownloadUtils().stopSession()
        except:
            pass

        log.warn("======== STOP %s ========" % addonName)
Exemplo n.º 9
0
    def __init__(self):

        self.addon_id = clientinfo.ClientInfo().get_addon_id()
        self.user_client = userclient.UserClient()
        self.connectmanager = connectmanager.ConnectManager()
Exemplo n.º 10
0
    def service_entry_point(self):
        # Important: Threads depending on abortRequest will not trigger
        # if profile switch happens more than once.
        self.monitor = kodimonitor.KodiMonitor()
        self.kodi_player = player.Player()
        kodi_profile = xbmc.translatePath('special://profile')

        # Server auto-detect
        initialsetup.InitialSetup().setup()

        # Initialize important threads
        self.userclient_thread = userclient.UserClient()
        user_client = self.userclient_thread
        self.websocket_thread = wsc.WebSocketClient()
        self.library_thread = librarysync.LibrarySync()

        while not self.monitor.abortRequested():

            if window('emby_kodiProfile') != kodi_profile:
                # Profile change happened, terminate this thread and others
                log.info(
                    "Kodi profile was: %s and changed to: %s. Terminating old Emby thread.",
                    kodi_profile, window('emby_kodiProfile'))
                exc = Exception("Kodi profile changed detected")
                exc.quiet = True
                raise exc

            # Before proceeding, need to make sure:
            # 1. Server is online
            # 2. User is set
            # 3. User has access to the server

            if window('emby_online') == "true":

                # Emby server is online
                # Verify if user is set and has access to the server
                if user_client.get_user(
                ) is not None and user_client.get_access():

                    # If an item is playing
                    if self.kodi_player.isPlaying():
                        # ping metrics server to keep sessions alive while playing
                        # ping every 5 min
                        timeSinceLastPing = time.time() - self.lastMetricPing
                        if (timeSinceLastPing > 300):
                            self.lastMetricPing = time.time()
                            ga = GoogleAnalytics()
                            ga.sendEventData("PlayAction", "PlayPing")

                        self._report_progress()

                    elif not self.startup:
                        self.startup = self._startup()

                    if not self.websocket_running:
                        # Start the Websocket Client
                        self.websocket_running = True
                        self.websocket_thread.start()
                    if not self.library_running:
                        # Start the syncing thread
                        self.library_running = True
                        self.library_thread.start()
                else:

                    if (user_client.get_user() is None) and self.warn_auth:
                        # Alert user is not authenticated and suppress future warning
                        self.warn_auth = False
                        log.info("Not authenticated yet.")

                    # User access is restricted.
                    # Keep verifying until access is granted
                    # unless server goes offline or Kodi is shut down.
                    self._access_check()
            else:
                # Wait until Emby server is online
                # or Kodi is shut down.
                self._server_online_check()

            if self.monitor.waitForAbort(1):
                # Abort was requested while waiting. We should exit
                break

        ##### Emby thread is terminating. #####
        self.shutdown()
Exemplo n.º 11
0
    def on_message(self, ws, message):

        log = self.logMsg
        window = utils.window
        lang = utils.language

        result = json.loads(message)
        messageType = result['MessageType']
        data = result['Data']

        if messageType not in ('SessionEnded'):
            # Mute certain events
            log("Message: %s" % message, 1)

        if messageType == "Play":
            # A remote control play command has been sent from the server.
            itemIds = data['ItemIds']
            command = data['PlayCommand']

            pl = playlist.Playlist()
            dialog = xbmcgui.Dialog()

            if command == "PlayNow":
                dialog.notification(
                    heading="Emby for Kodi",
                    message="%s %s" % (len(itemIds), lang(33004)),
                    icon="special://home/addons/plugin.video.emby/icon.png",
                    sound=False)
                startat = data.get('StartPositionTicks', 0)
                pl.playAll(itemIds, startat)

            elif command == "PlayNext":
                dialog.notification(
                    heading="Emby for Kodi",
                    message="%s %s" % (len(itemIds), lang(33005)),
                    icon="special://home/addons/plugin.video.emby/icon.png",
                    sound=False)
                newplaylist = pl.modifyPlaylist(itemIds)
                player = xbmc.Player()
                if not player.isPlaying():
                    # Only start the playlist if nothing is playing
                    player.play(newplaylist)

        elif messageType == "Playstate":
            # A remote control update playstate command has been sent from the server.
            command = data['Command']
            player = xbmc.Player()

            actions = {
                'Stop': player.stop,
                'Unpause': player.pause,
                'Pause': player.pause,
                'NextTrack': player.playnext,
                'PreviousTrack': player.playprevious,
                'Seek': player.seekTime
            }
            action = actions[command]
            if command == "Seek":
                seekto = data['SeekPositionTicks']
                seektime = seekto / 10000000.0
                action(seektime)
                log("Seek to %s." % seektime, 1)
            else:
                action()
                log("Command: %s completed." % command, 1)

            window('emby_command', value="true")

        elif messageType == "UserDataChanged":
            # A user changed their personal rating for an item, or their playstate was updated
            userdata_list = data['UserDataList']
            self.librarySync.triage_items("userdata", userdata_list)

        elif messageType == "LibraryChanged":

            librarySync = self.librarySync
            processlist = {
                'added': data['ItemsAdded'],
                'update': data['ItemsUpdated'],
                'remove': data['ItemsRemoved']
            }
            for action in processlist:
                librarySync.triage_items(action, processlist[action])

        elif messageType == "GeneralCommand":

            command = data['Name']
            arguments = data['Arguments']

            if command in ('Mute', 'Unmute', 'SetVolume',
                           'SetSubtitleStreamIndex', 'SetAudioStreamIndex'):

                player = xbmc.Player()
                # These commands need to be reported back
                if command == "Mute":
                    xbmc.executebuiltin('Mute')
                elif command == "Unmute":
                    xbmc.executebuiltin('Mute')
                elif command == "SetVolume":
                    volume = arguments['Volume']
                    xbmc.executebuiltin('SetVolume(%s[,showvolumebar])' %
                                        volume)
                elif command == "SetAudioStreamIndex":
                    index = int(arguments['Index'])
                    player.setAudioStream(index - 1)
                elif command == "SetSubtitleStreamIndex":
                    embyindex = int(arguments['Index'])
                    currentFile = player.getPlayingFile()

                    mapping = window('emby_%s.indexMapping' % currentFile)
                    if mapping:
                        externalIndex = json.loads(mapping)
                        # If there's external subtitles added via playbackutils
                        for index in externalIndex:
                            if externalIndex[index] == embyindex:
                                player.setSubtitleStream(int(index))
                                break
                        else:
                            # User selected internal subtitles
                            external = len(externalIndex)
                            audioTracks = len(
                                player.getAvailableAudioStreams())
                            player.setSubtitleStream(external + embyindex -
                                                     audioTracks - 1)
                    else:
                        # Emby merges audio and subtitle index together
                        audioTracks = len(player.getAvailableAudioStreams())
                        player.setSubtitleStream(index - audioTracks - 1)

                # Let service know
                window('emby_command', value="true")

            elif command == "DisplayMessage":

                header = arguments['Header']
                text = arguments['Text']
                xbmcgui.Dialog().notification(
                    heading=header,
                    message=text,
                    icon="special://home/addons/plugin.video.emby/icon.png",
                    time=4000)

            elif command == "SendString":

                string = arguments['String']
                text = {
                    'jsonrpc': "2.0",
                    'id': 0,
                    'method': "Input.SendText",
                    'params': {
                        'text': "%s" % string,
                        'done': False
                    }
                }
                result = xbmc.executeJSONRPC(json.dumps(text))

            else:
                builtin = {
                    'ToggleFullscreen': 'Action(FullScreen)',
                    'ToggleOsdMenu': 'Action(OSD)',
                    'ToggleContextMenu': 'Action(ContextMenu)',
                    'MoveUp': 'Action(Up)',
                    'MoveDown': 'Action(Down)',
                    'MoveLeft': 'Action(Left)',
                    'MoveRight': 'Action(Right)',
                    'Select': 'Action(Select)',
                    'Back': 'Action(back)',
                    'GoHome': 'ActivateWindow(Home)',
                    'PageUp': 'Action(PageUp)',
                    'NextLetter': 'Action(NextLetter)',
                    'GoToSearch': 'VideoLibrary.Search',
                    'GoToSettings': 'ActivateWindow(Settings)',
                    'PageDown': 'Action(PageDown)',
                    'PreviousLetter': 'Action(PrevLetter)',
                    'TakeScreenshot': 'TakeScreenshot',
                    'ToggleMute': 'Mute',
                    'VolumeUp': 'Action(VolumeUp)',
                    'VolumeDown': 'Action(VolumeDown)',
                }
                action = builtin.get(command)
                if action:
                    xbmc.executebuiltin(action)

        elif messageType == "ServerRestarting":
            if utils.settings('supressRestartMsg') == "true":
                xbmcgui.Dialog().notification(
                    heading="Emby for Kodi",
                    message=lang(33006),
                    icon="special://home/addons/plugin.video.emby/icon.png")

        elif messageType == "UserConfigurationUpdated":
            # Update user data set in userclient
            userclient.UserClient().userSettings = data
            self.librarySync.refresh_views = True
Exemplo n.º 12
0
    def ServiceEntryPoint(self):

        log = self.logMsg
        window = utils.window
        lang = utils.language

        # Important: Threads depending on abortRequest will not trigger
        # if profile switch happens more than once.
        monitor = self.monitor
        kodiProfile = xbmc.translatePath("special://profile")

        # Server auto-detect
        initialsetup.InitialSetup().setup()

        # Queue for background sync
        queue = Queue.Queue(maxsize=200)

        connectMsg = True if utils.settings('connectMsg') == 'true' else False

        # Initialize important threads
        user = userclient.UserClient()
        ws = wsc.WebSocket(queue)
        library = librarysync.LibrarySync(queue)
        kplayer = player.Player()
        xplayer = xbmc.Player()
        plx = PlexAPI.PlexAPI()

        # Sync and progress report
        lastProgressUpdate = datetime.today()

        while not monitor.abortRequested():

            if window('emby_kodiProfile') != kodiProfile:
                # Profile change happened, terminate this thread and others
                log(
                    "Kodi profile was: %s and changed to: %s. Terminating old Emby thread."
                    % (kodiProfile, utils.window('emby_kodiProfile')), 1)

                break

            # Before proceeding, need to make sure:
            # 1. Server is online
            # 2. User is set
            # 3. User has access to the server

            if window('emby_online') == "true":
                # Emby server is online
                # Verify if user is set and has access to the server
                if (user.currUser is not None) and user.HasAccess:
                    # If an item is playing
                    if xplayer.isPlaying():
                        try:
                            # Update and report progress
                            playtime = xplayer.getTime()
                            totalTime = xplayer.getTotalTime()
                            currentFile = kplayer.currentFile

                            # Update positionticks
                            if kplayer.played_info.get(
                                    currentFile) is not None:
                                kplayer.played_info[currentFile][
                                    'currentPosition'] = playtime

                            td = datetime.today() - lastProgressUpdate
                            secDiff = td.seconds

                            # Report progress to Emby server
                            if (secDiff > 3):
                                kplayer.reportPlayback()
                                lastProgressUpdate = datetime.today()

                            elif window('emby_command') == "true":
                                # Received a remote control command that
                                # requires updating immediately
                                window('emby_command', clear=True)
                                kplayer.reportPlayback()
                                lastProgressUpdate = datetime.today()
                        except Exception as e:
                            log(
                                "Exception in Playback Monitor Service: %s" %
                                e, 1)
                            pass
                    else:
                        # Start up events
                        self.warn_auth = True
                        if connectMsg and self.welcome_msg:
                            # Reset authentication warnings
                            self.welcome_msg = False
                            xbmcgui.Dialog().notification(
                                heading=self.addonName,
                                message="%s %s" % (lang(33000), user.currUser),
                                icon=
                                "special://home/addons/plugin.video.plexkodiconnect/icon.png",
                                time=2000,
                                sound=False)
                        # Start monitoring kodi events
                        if not self.kodimonitor_running:
                            self.kodimonitor_running = kodimonitor.KodiMonitor(
                            )

                        # Start the Websocket Client
                        if not self.websocket_running:
                            self.websocket_running = True
                            ws.start()
                        # Start the syncing thread
                        if not self.library_running:
                            self.library_running = True
                            library.start()
                        # Start the Plex Companion thread
                        if not self.plexCompanion_running and \
                                self.runPlexCompanion == "true":
                            self.plexCompanion_running = True
                            plexCompanion = PlexCompanion.PlexCompanion()
                            plexCompanion.start()
                else:
                    if (user.currUser is None) and self.warn_auth:
                        # Alert user is not authenticated and suppress future warning
                        self.warn_auth = False
                        log("Not authenticated yet.", 1)

                    # User access is restricted.
                    # Keep verifying until access is granted
                    # unless server goes offline or Kodi is shut down.
                    while user.HasAccess == False:
                        # Verify access with an API call
                        user.hasAccess()

                        if window('emby_online') != "true":
                            # Server went offline
                            break

                        if monitor.waitForAbort(5):
                            # Abort was requested while waiting. We should exit
                            break
                        xbmc.sleep(50)
            else:
                # Wait until Emby server is online
                # or Kodi is shut down.
                while not monitor.abortRequested():
                    server = user.getServer()
                    if server is False:
                        # No server info set in add-on settings
                        pass
                    elif plx.CheckConnection(server, verifySSL=True) is False:
                        # Server is offline or cannot be reached
                        # Alert the user and suppress future warning
                        if self.server_online:
                            log("Server is offline.", 1)
                            window('emby_online', value="false")
                            # Suspend threads
                            window('suspend_LibraryThread', value='true')

                            xbmcgui.Dialog().notification(
                                heading=lang(33001),
                                message="%s %s" %
                                (self.addonName, lang(33002)),
                                icon="special://home/addons/plugin.video."
                                "plexkodiconnect/icon.png",
                                sound=False)
                        self.server_online = False
                    else:
                        # Server is online
                        if not self.server_online:
                            # Server was offline when Kodi started.
                            # Wait for server to be fully established.
                            if monitor.waitForAbort(5):
                                # Abort was requested while waiting.
                                break
                            # Alert the user that server is online.
                            xbmcgui.Dialog().notification(
                                heading=self.addonName,
                                message=lang(33003),
                                icon="special://home/addons/plugin.video."
                                "plexkodiconnect/icon.png",
                                time=2000,
                                sound=False)
                        self.server_online = True
                        log("Server %s is online and ready." % server, 1)
                        window('emby_online', value="true")
                        if window('plex_authenticated') == 'true':
                            # Server got offline when we were authenticated.
                            # Hence resume threads
                            window('suspend_LibraryThread', clear=True)

                        # Start the userclient thread
                        if not self.userclient_running:
                            self.userclient_running = True
                            user.start()

                        break

                    if monitor.waitForAbort(1):
                        # Abort was requested while waiting.
                        break
                    xbmc.sleep(50)

            if monitor.waitForAbort(1):
                # Abort was requested while waiting. We should exit
                break

        # Terminating PlexKodiConnect

        # Tell all threads to terminate (e.g. several lib sync threads)
        utils.window('plex_terminateNow', value='true')

        try:
            plexCompanion.stopThread()
        except:
            xbmc.log('plexCompanion already shut down')

        try:
            library.stopThread()
        except:
            xbmc.log('Library sync already shut down')

        try:
            ws.stopThread()
        except:
            xbmc.log('Websocket client already shut down')

        try:
            user.stopThread()
        except:
            xbmc.log('User client already shut down')

        try:
            downloadutils.DownloadUtils().stopSession()
        except:
            pass

        log("======== STOP %s ========" % self.addonName, 0)
Exemplo n.º 13
0
 def __init__(self):
     self.clientInfo = clientinfo.ClientInfo()
     self.addonId = self.clientInfo.getAddonId()
     self.doUtils = downloadutils.DownloadUtils().downloadUrl
     self.userClient = userclient.UserClient()
     self.plx = PlexAPI.PlexAPI()