diff options
Diffstat (limited to 'plugin.video.mediathekview/resources/lib/kodi')
-rw-r--r-- | plugin.video.mediathekview/resources/lib/kodi/KodiAddon.py | 52 | ||||
-rw-r--r-- | plugin.video.mediathekview/resources/lib/kodi/KodiUI.py | 40 |
2 files changed, 73 insertions, 19 deletions
diff --git a/plugin.video.mediathekview/resources/lib/kodi/KodiAddon.py b/plugin.video.mediathekview/resources/lib/kodi/KodiAddon.py index f9c0cd7..4081044 100644 --- a/plugin.video.mediathekview/resources/lib/kodi/KodiAddon.py +++ b/plugin.video.mediathekview/resources/lib/kodi/KodiAddon.py @@ -3,14 +3,19 @@ # # -- Imports ------------------------------------------------ -import sys, urllib -import xbmc, xbmcgui, xbmcaddon, xbmcplugin +import os +import sys +import urllib + +import xbmc +import xbmcgui +import xbmcaddon +import xbmcplugin from resources.lib.kodi.KodiLogger import KodiLogger # -- Classes ------------------------------------------------ class KodiAddon( KodiLogger ): - def __init__( self ): self.addon = xbmcaddon.Addon() self.addon_id = self.addon.getAddonInfo( 'id' ) @@ -29,6 +34,7 @@ class KodiAddon( KodiLogger ): return self.addon.setSetting( setting_id, value ) def doAction( self, action ): + self.debug( 'Triggered action {}', action ) xbmc.executebuiltin( 'Action({})'.format( action ) ) class KodiService( KodiAddon ): @@ -66,3 +72,43 @@ class KodiPlugin( KodiAddon ): def endOfDirectory( self, succeeded = True, updateListing = False, cacheToDisc = True ): xbmcplugin.endOfDirectory( self.addon_handle, succeeded, updateListing, cacheToDisc ) + + +class KodiInterlockedMonitor( xbmc.Monitor ): + def __init__( self, service, setting_id ): + super( KodiInterlockedMonitor, self ).__init__() + self.instance_id = ''.join( format( x, '02x' ) for x in bytearray( os.urandom( 16 ) ) ) + self.setting_id = setting_id + self.service = service + + def RegisterInstance( self, waittime = 1 ): + if self.BadInstance(): + self.service.info( 'Found other instance with id {}', self.instance_id ) + self.service.info( 'Startup delayed by {} second(s) waiting the other instance to shut down', waittime ) + self.service.setSetting( self.setting_id, self.instance_id ) + xbmc.Monitor.waitForAbort( self, waittime ) + else: + self.service.setSetting( self.setting_id, self.instance_id ) + + def UnregisterInstance( self ): + self.service.setSetting( self.setting_id, '' ) + + def BadInstance( self ): + instance_id = self.service.getSetting( self.setting_id ) + return len( instance_id ) > 0 and self.instance_id != instance_id + + def abortRequested( self ): + return self.BadInstance() or xbmc.Monitor.abortRequested( self ) + + def waitForAbort( self, timeout = None ): + if timeout is None: + # infinite wait + while not self.abortRequested(): + if xbmc.Monitor.waitForAbort( self, 1 ): + return True + return True + else: + for _ in range( timeout ): + if self.BadInstance() or xbmc.Monitor.waitForAbort( self, 1 ): + return True + return self.BadInstance() diff --git a/plugin.video.mediathekview/resources/lib/kodi/KodiUI.py b/plugin.video.mediathekview/resources/lib/kodi/KodiUI.py index dee8dbb..138af50 100644 --- a/plugin.video.mediathekview/resources/lib/kodi/KodiUI.py +++ b/plugin.video.mediathekview/resources/lib/kodi/KodiUI.py @@ -3,15 +3,21 @@ # # -- Imports ------------------------------------------------ -import xbmc, xbmcgui +import xbmc +import xbmcgui +import xbmcaddon # -- Classes ------------------------------------------------ class KodiUI( object ): def __init__( self ): - self.bgdialog = None + self.addon = xbmcaddon.Addon() + self.language = self.addon.getLocalizedString + self.bgdialog = KodiBGDialog() - def GetEnteredText( self, deftext = '', heading = '', hidden = False ): + def GetEnteredText( self, deftext = None, heading = None, hidden = False ): + heading = self.language( heading ) if isinstance( heading, int ) else heading if heading is not None else '' + deftext = self.language( deftext ) if isinstance( deftext, int ) else deftext if deftext is not None else '' keyboard = xbmc.Keyboard( deftext, heading, 1 if hidden else 0 ) keyboard.doModal() if keyboard.isConfirmed(): @@ -19,39 +25,39 @@ class KodiUI( object ): return deftext def ShowNotification( self, heading, message, icon = xbmcgui.NOTIFICATION_INFO, time = 5000, sound = True ): + heading = self.language( heading ) if isinstance( heading, int ) else heading + message = self.language( message ) if isinstance( message, int ) else message xbmcgui.Dialog().notification( heading, message, icon, time, sound ) def ShowWarning( self, heading, message, time = 5000, sound = True ): - xbmcgui.Dialog().notification( heading, message, xbmcgui.NOTIFICATION_WARNING, time, sound ) + self.ShowNotification( heading, message, xbmcgui.NOTIFICATION_WARNING, time, sound ) def ShowError( self, heading, message, time = 5000, sound = True ): - xbmcgui.Dialog().notification( heading, message, xbmcgui.NOTIFICATION_ERROR, time, sound ) + self.ShowNotification( heading, message, xbmcgui.NOTIFICATION_ERROR, time, sound ) def ShowBGDialog( self, heading = None, message = None ): - if self.bgdialog is None: - self.bgdialog = xbmcgui.DialogProgressBG() - self.bgdialog.create( heading, message ) - else: - self.bgdialog.update( 0, heading, message ) + self.bgdialog.Create( heading, message ) def UpdateBGDialog( self, percent, heading = None, message = None ): - if self.bgdialog is not None: - self.bgdialog.update( percent, heading, message ) + self.bgdialog.Update( percent, heading, message ) + + def HookBGDialog( self, blockcount, blocksize, totalsize ): + self.bgdialog.UrlRetrieveHook( blockcount, blocksize, totalsize ) def CloseBGDialog( self ): - if self.bgdialog is not None: - self.bgdialog.close() - del self.bgdialog - self.bgdialog = None + self.bgdialog.Close() class KodiBGDialog( object ): def __init__( self ): + self.language = xbmcaddon.Addon().getLocalizedString self.bgdialog= None def __del__( self ): self.Close() def Create( self, heading = None, message = None ): + heading = self.language( heading ) if isinstance( heading, int ) else heading + message = self.language( message ) if isinstance( message, int ) else message if self.bgdialog is None: self.bgdialog = xbmcgui.DialogProgressBG() self.bgdialog.create( heading, message ) @@ -60,6 +66,8 @@ class KodiBGDialog( object ): def Update( self, percent, heading = None, message = None ): if self.bgdialog is not None: + heading = self.language( heading ) if isinstance( heading, int ) else heading + message = self.language( message ) if isinstance( message, int ) else message self.bgdialog.update( percent, heading, message ) def UrlRetrieveHook( self, blockcount, blocksize, totalsize ): |