示例#1
0
    def ServiceEntryPoint(self):

        kodiProfile = xbmc.translatePath("special://profile")

        # Server auto-detect
        ConnectionManager().checkServer()

        # Initialize important threads
        user = UserClient()
        player = Player()
        ws = WebSocketThread()
        library = LibrarySync()
        # Sync and progress report
        lastProgressUpdate = datetime.today()

        while not self.KodiMonitor.abortRequested():

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

            if utils.window("kodiProfile_emby") != kodiProfile:
                # Profile change happened, terminate this thread
                self.logMsg("Kodi profile was: %s and changed to: %s. Terminating old Emby thread." % (kodiProfile, utils.window("kodiProfile_emby")), 1)
                break
            
            if utils.window('Server_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 = player.currentFile

                            # Update positionticks
                            if player.played_information.get(currentFile) is not None:
                                player.played_information[currentFile]['currentPosition'] = playTime
                            
                            td = datetime.today() - lastProgressUpdate
                            secDiff = td.seconds
                            
                            # Report progress to Emby server
                            if (secDiff > 3):
                                player.reportPlayback()
                                lastProgressUpdate = datetime.today()
                            
                            elif utils.window('commandUpdate') == "true":
                                # Received a remote control command that
                                # requires updating immediately
                                utils.window('commandUpdate', clear=True)
                                player.reportPlayback()
                                lastProgressUpdate = da4tetime.today()
                            
                        except Exception as e:
                            self.logMsg("Exception in Playback Monitor Service: %s" % e, 1)
                            pass
                    else:
                        # Start up events
                        self.warn_auth = True
                        if utils.settings('supressConnectMsg') == "false":
                            if 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("Emby server", "Welcome %s%s!" % (user.currUser, add), icon="special://home/addons/plugin.video.emby/icon.png", time=2000, sound=False)

                        # Start the Websocket Client
                        if (self.newWebSocketThread is None):
                            self.newWebSocketThread = "Started"
                            ws.start()
                        # Start the Library Sync Thread
                        if (self.newLibraryThread is None):
                            self.newLibraryThread = "Started"
                            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
                        self.logMsg("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 utils.window('Server_online') != "true":
                            # Server went offline
                            break

                        if self.KodiMonitor.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 self.KodiMonitor.abortRequested():
                    
                    if user.getServer() == "":
                        # 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:
                            self.logMsg("Server is offline.", 1)
                            utils.window('Server_online', value="false")
                            xbmcgui.Dialog().notification("Error connecting", "%s Server is unreachable." % self.addonName, 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 self.KodiMonitor.waitForAbort(5):
                                # Abort was requested while waiting.
                                break
                            # Alert the user that server is online.
                            xbmcgui.Dialog().notification("Emby server", "Welcome %s!" % user.currUser, icon="special://home/addons/plugin.video.emby/icon.png", time=2000, sound=False)
                        
                        self.server_online = True
                        self.logMsg("Server is online and ready.", 1)
                        utils.window('Server_online', value="true")
                        
                        # Start the User client
                        if self.newUserClient is None:
                            self.newUserClient = "Started"
                            user.start()
                        break

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

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

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

        # If music is enabled and direct stream for music is enabled
        # We use Kodi pathsubstitution to allow for music to play outside network
        # The setting needs to be set before Kodi starts.
        if utils.settings('enableMusicSync') == "true" and utils.settings('directstreammusic') == "true":
            # We need to keep track of the settings
            alternate = utils.settings('altip') == "true"
            pathsub = utils.settings('pathsub') == "true"
            
            if pathsub and not alternate:
                # Path sub in place, but primary address in use, remove it
                utils.pathsubstitution(False)
            elif not pathsub and alternate:
                # Path sub not in place, but secondary address in use, add it
                utils.pathsubstitution()
        
        if (self.newWebSocketThread is not None):
            ws.stopClient()

        if (self.newUserClient is not None):
            user.stopClient()

        self.logMsg("======== STOP %s ========" % self.addonName, 0)
示例#2
0
    newNextUpThread = NextUpUpdaterThread()
    newNextUpThread.start()
else:
    xbmc.log("XBMB3C Service NextUp Disabled")    
    
newSuggestedThread = None
if __addon__.getSetting('useSuggested') == "true":
    newSuggestedThread = SuggestedUpdaterThread()
    newSuggestedThread.start()
else:
    xbmc.log("XBMB3C Service Suggested Disabled")   

newWebSocketThread = None
if __addon__.getSetting('useWebSocketRemote') == "true":
    newWebSocketThread = WebSocketThread()
    newWebSocketThread.start()
else:
    xbmc.log("XBMB3C Service WebSocketRemote Disabled")

newMenuThread = None
if __addon__.getSetting('useMenuLoader') == "true":
    newMenuThread = LoadMenuOptionsThread()
    newMenuThread.start()
else:
    xbmc.log("XBMB3C Service MenuLoader Disabled")

artworkRotationThread = None    
if __addon__.getSetting('useBackgroundLoader') == "true":
    artworkRotationThread = ArtworkRotationThread()
    artworkRotationThread.start()
else:
    if __addon__.getSetting('useNextUp') == "true":
        newNextUpThread = NextUpUpdaterThread()
        newNextUpThread.start()
    else:
        printDebug("XBMB3C Service NextUp Disabled")

    if __addon__.getSetting('useSuggested') == "true":
        newSuggestedThread = SuggestedUpdaterThread()
        newSuggestedThread.start()
    else:
        printDebug("XBMB3C Service Suggested Disabled")

    if __addon__.getSetting('useWebSocketRemote') == "true":
        newWebSocketThread = WebSocketThread()
        newWebSocketThread.start()
    else:
        printDebug("XBMB3C Service WebSocketRemote Disabled")

    if __addon__.getSetting('useMenuLoader') == "true":
        newMenuThread = LoadMenuOptionsThread()
        newMenuThread.start()
    else:
        printDebug("XBMB3C Service MenuLoader Disabled")

    if __addon__.getSetting('useBackgroundLoader') == "true":
        artworkRotationThread = ArtworkRotationThread()
        artworkRotationThread.start()
    else:
        printDebug("XBMB3C Service BackgroundLoader Disabled")
示例#4
0
    def ServiceEntryPoint(self):
        
        WINDOW = self.WINDOW
        addon = xbmcaddon.Addon(id=self.clientInfo.getAddonId())
        WINDOW.setProperty("Server_online", "")
        self.WINDOW.setProperty("Server_status", "")
        WINDOW.setProperty("Emby_Service_Timestamp", str(int(time.time())))
        
        ConnectionManager().checkServer()
        lastProgressUpdate = datetime.today()
        startupComplete = False
        
        user = UserClient()
        player = Player()
        ws = WebSocketThread()
        
        lastFile = None
        
        while not self.KodiMonitor.abortRequested():
            #WINDOW.setProperty("Emby_Service_Timestamp", str(int(time.time())))
                     
            if self.KodiMonitor.waitForAbort(1):
                # Abort was requested while waiting. We should exit
                break

            if WINDOW.getProperty('Server_online') == "true":
                # Server is online
                if (user.currUser != None) and (user.HasAccess == True):
                    self.warn_auth = True
                    if addon.getSetting('supressConnectMsg') == "false":
                        if self.welcome_msg:
                            # Reset authentication warnings
                            self.welcome_msg = False
                            xbmcgui.Dialog().notification("Emby server", "Welcome %s!" % user.currUser, time=2000, sound=False)

                    # Correctly launch the websocket, if user manually launches the add-on
                    if (self.newWebSocketThread == None):
                        self.newWebSocketThread = "Started"
                        ws.start()

                    if xbmc.Player().isPlaying():
                        #WINDOW.setProperty("Emby_Service_Timestamp", str(int(time.time())))
                        try:
                            playTime = xbmc.Player().getTime()
                            totalTime = xbmc.Player().getTotalTime()
                            currentFile = xbmc.Player().getPlayingFile()

                            if(player.played_information.get(currentFile) != None):
                                player.played_information[currentFile]["currentPosition"] = playTime
                            
                            # send update
                            td = datetime.today() - lastProgressUpdate
                            secDiff = td.seconds
                            if(secDiff > 3):
                                try:
                                    player.reportPlayback()
                                except Exception, msg:
                                    self.logMsg("Exception reporting progress: %s" % msg)
                                    pass
                                lastProgressUpdate = datetime.today()
                            elif WINDOW.getProperty('commandUpdate') == "true":
                                try:
                                    WINDOW.clearProperty('commandUpdate')
                                    player.reportPlayback()
                                except: pass
                                lastProgressUpdate = datetime.today()
                            
                        except Exception, e:
                            self.logMsg("Exception in Playback Monitor Service: %s" % e)
                            pass

                    else:
                        #full sync
                        if (startupComplete == False):
                            self.logMsg("Doing_Db_Sync: syncDatabase (Started)")
                            libSync = librarySync.FullLibrarySync()
                            self.logMsg("Doing_Db_Sync: syncDatabase (Finished) " + str(libSync))
                            #WINDOW.setProperty("Emby_Service_Timestamp", str(int(time.time())))
                            if (libSync):
                                startupComplete = True
                        else:
                            if self.KodiMonitor.waitForAbort(1):
                                # Abort was requested while waiting. We should exit
                                break
示例#5
0
 def ServiceEntryPoint(self):
     
     ConnectionManager().checkServer()
     
     lastProgressUpdate = datetime.today()
     
     interval_FullSync = 600
     interval_IncrementalSync = 300
     
     cur_seconds_fullsync = interval_FullSync
     cur_seconds_incrsync = interval_IncrementalSync
     
     user = UserClient()
     player = Player()
     ws = WebSocketThread()
     
     while not self.KodiMonitor.abortRequested():
         
         xbmc.sleep(1000)
         
         if xbmc.Player().isPlaying():
             try:
                 playTime = xbmc.Player().getTime()
                 currentFile = xbmc.Player().getPlayingFile()
                 
                 if(player.played_information.get(currentFile) != None):
                     player.played_information[currentFile]["currentPosition"] = playTime
                 
                 # send update
                 td = datetime.today() - lastProgressUpdate
                 secDiff = td.seconds
                 if(secDiff > 10):
                     try:
                         player.reportPlayback()
                     except Exception, msg:
                         xbmc.log("MB3 Sync Service -> Exception reporting progress : " + msg)
                         pass
                     lastProgressUpdate = datetime.today()
                 
             except Exception, e:
                 xbmc.log("MB3 Sync Service -> Exception in Playback Monitor Service : " + str(e))
                 pass
         else:
             if (self.newUserClient == None):
                     self.newUserClient = "Started"
                     user.start()
             # background worker for database sync
             if (user.currUser != None):
                 
                 # Correctly launch the websocket, if user manually launches the add-on
                 if (self.newWebSocketThread == None):
                     self.newWebSocketThread = "Started"
                     ws.start()
         
                 #full sync
                 if(cur_seconds_fullsync >= interval_FullSync):
                     xbmc.log("Doing_Db_Sync: syncDatabase (Started)")
                     worked = librarySync.syncDatabase()
                     xbmc.log("Doing_Db_Sync: syncDatabase (Finished) " + str(worked))
                     if(worked):
                         cur_seconds_fullsync = 0
                     else:
                         cur_seconds_fullsync = interval_FullSync - 10
                 else:
                     cur_seconds_fullsync += 1
                 
                 #incremental sync
                 if(cur_seconds_incrsync >= interval_IncrementalSync):
                     xbmc.log("Doing_Db_Sync: updatePlayCounts (Started)")
                     worked = librarySync.updatePlayCounts()
                     xbmc.log("Doing_Db_Sync: updatePlayCounts (Finished) "  + str(worked))
                     if(worked):
                         cur_seconds_incrsync = 0
                     else:
                         cur_seconds_incrsync = interval_IncrementalSync - 10
                 else:
                     cur_seconds_incrsync += 1
           
                 
             else:
                 xbmc.log("Not authenticated yet")
示例#6
0
    def ServiceEntryPoint(self):
        
        WINDOW = self.WINDOW
        WINDOW.setProperty("Server_online", "")
        self.WINDOW.setProperty("Server_status", "")
        WINDOW.setProperty("Emby_Service_Timestamp", str(int(time.time())))
        
        ConnectionManager().checkServer()
        lastProgressUpdate = datetime.today()
        startupComplete = False
        
        user = UserClient()
        player = Player()
        ws = WebSocketThread()
        
        lastFile = None
        
        while not self.KodiMonitor.abortRequested():
            #WINDOW.setProperty("Emby_Service_Timestamp", str(int(time.time())))
                     
            if self.KodiMonitor.waitForAbort(1):
                # Abort was requested while waiting. We should exit
                break

            if WINDOW.getProperty('Server_online') == "true":
                # Server is online
                if (user.currUser != None) and (user.HasAccess == True):
                    self.warn_auth = True

                    # Correctly launch the websocket, if user manually launches the add-on
                    if (self.newWebSocketThread == None):
                        self.newWebSocketThread = "Started"
                        ws.start()

                    if xbmc.Player().isPlaying():
                        #WINDOW.setProperty("Emby_Service_Timestamp", str(int(time.time())))
                        try:
                            playTime = xbmc.Player().getTime()
                            totalTime = xbmc.Player().getTotalTime()
                            currentFile = xbmc.Player().getPlayingFile()

                            if(player.played_information.get(currentFile) != None):
                                player.played_information[currentFile]["currentPosition"] = playTime
                            
                            # send update
                            td = datetime.today() - lastProgressUpdate
                            secDiff = td.seconds
                            if(secDiff > 3):
                                try:
                                    player.reportPlayback()
                                except Exception, msg:
                                    self.logMsg("Exception reporting progress: %s" % msg)
                                    pass
                                lastProgressUpdate = datetime.today()
                            elif WINDOW.getProperty('commandUpdate') == "true":
                                try:
                                    WINDOW.clearProperty('commandUpdate')
                                    player.reportPlayback()
                                except: pass
                                lastProgressUpdate = datetime.today()
                            # only try autoplay when there's 20 seconds or less remaining and only once!
                            addonSettings = xbmcaddon.Addon(id='plugin.video.emby')
                          
                            # if its an episode see if autoplay is enabled
                            if addonSettings.getSetting("autoPlaySeason")=="true":
                                notificationtime = addonSettings.getSetting("autoPlaySeasonTime")
                                if (totalTime - playTime <= int(notificationtime) and (lastFile==None or lastFile!=currentFile)):
                                    lastFile = currentFile
                                    player.autoPlayPlayback()
                                    self.logMsg("Netflix style autoplay succeeded.", 2)
                            
                        except Exception, e:
                            self.logMsg("Exception in Playback Monitor Service: %s" % e)
                            pass

                    else:
                        #full sync
                        if (startupComplete == False):
                            self.logMsg("Doing_Db_Sync: syncDatabase (Started)")
                            libSync = librarySync.FullLibrarySync()
                            self.logMsg("Doing_Db_Sync: syncDatabase (Finished) " + str(libSync))
                            #WINDOW.setProperty("Emby_Service_Timestamp", str(int(time.time())))
                            if (libSync):
                                startupComplete = True
                        else:
                            if self.KodiMonitor.waitForAbort(1):
                                # Abort was requested while waiting. We should exit
                                break