Kodi addon, run script on playback action
This post was automagically converted from Blogger. There may be dragons. Check any code you copy.
Addon version of a kodi-script I never published here … so yeah.
Run scripts when you start playing a video in kodi. In my case I turn off some HUE-lights on play and turn them on, in red, on pause.
2021-03-14: Made this a bit less shit, maybe. Added some debug-logging. Also in a sort of “auto-like” for youtube-videos, very hacky.
addon.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="script.playback.actions"
name="Playback Actions Service"
version="0.0.1"
provider-name="me/you/whoever">
<requires>
<import addon="xbmc.python" version="2.14.0"/>
</requires>
<!-- <extension point="xbmc.python.script" library="addon.py">
<provides>executable</provides>
</extension> -->
<extension point="xbmc.service" library="service.py" start="login" />
<extension point="xbmc.addon.metadata">
<platform>all</platform>
<summary lang="en">Does stuff on playback actions</summary>
<description lang="en">Fancy that eh?</description>
<license>GNU General Public License, v2</license>
<language></language>
</extension>
</addon>
service.py
import xbmc, xbmcgui, os
class fluffPlayer(xbmc.Player):
def __init__ (self):
xbmc.Player.__init__(self)
#
def onPlayBackStarted(self):
xbmc.sleep(2000)
global videoTotalTime
videoTotalTime = self.getTotalTime()
xbmc.log(f"[{logName}] EVENT : Playback started")
xbmc.log(f"[{logName}] VALUES: videoTotalTime: {videoTotalTime}")
if self.isPlayingVideo():
if videoTotalTime > 600:
xbmc.sleep(4000)
state = "playing"
xbmc.log(f"[{logName}] STATE : {state}")
os.system(f"echo kodi_state {state} >{udp}")
#
def onPlayBackPaused(self):
xbmc.sleep(500)
xbmc.log(f"[{logName}] EVENT : Playback paused")
xbmc.log(f"[{logName}] VALUES: videoTotalTime: {videoTotalTime}")
if self.isPlayingVideo():
if videoTotalTime > 600:
state = "paused"
xbmc.log(f"[{logName}] STATE : {state}")
os.system(f"echo kodi_state {state} >{udp}")
#
def onPlayBackResumed(self):
xbmc.sleep(500)
xbmc.log(f"[{logName}] EVENT : Playback resumed")
xbmc.log(f"[{logName}] VALUES: videoTotalTime: {videoTotalTime}")
if self.isPlayingVideo():
if videoTotalTime > 600:
state = "playing"
xbmc.log(f"[{logName}] STATE : {state}")
os.system(f"echo kodi_state {state} >{udp}")
#
def onPlayBackStopped(self):
xbmc.sleep(500)
xbmc.log(f"[{logName}] EVENT : Playback stopped")
xbmc.log(f"[{logName}] VALUES: videoTotalTime: {videoTotalTime}")
if wasVideo == 1:
if not self.isPlayingVideo():
if videoTotalTime > 600:
state = "stopped"
xbmc.log(f"[{logName}] STATE : {state}")
os.system(f"echo kodi_state {state} >{udp}")
if wasYoutube == 1:
for x in range(50):
xbmc.sleep(100)
if xbmc.getCondVisibility("Window.IsVisible(DialogSelect.xml)"):
xbmc.sleep(200)
os.system("xdotool key Return")
break
#
def onPlayBackEnded(self):
xbmc.sleep(500)
xbmc.log(f"[{logName}] EVENT : Playback ended")
xbmc.log(f"[{logName}] VALUES: videoTotalTime: {videoTotalTime}")
if wasVideo == 1:
if not self.isPlayingVideo():
if videoTotalTime > 600:
state = "stopped"
xbmc.log(f"[{logName}] STATE : {state}")
os.system(f"echo kodi_state {state} >{udp}")
if wasYoutube == 1:
for x in range(50):
xbmc.sleep(100)
if xbmc.getCondVisibility("Window.IsVisible(DialogSelect.xml)"):
xbmc.sleep(200)
os.system("xdotool key Return")
break
#
#
if __name__ == '__main__':
monitor = xbmc.Monitor()
fluff = fluffPlayer()
logName = "script.playback.actions"
udp = "/dev/udp/hostname/2222"
wasVideo = 0
wasYoutube = 0
videoTotalTime = 0
while not monitor.abortRequested():
if monitor.waitForAbort(3):
break
if fluff.isPlaying():
if fluff.isPlayingVideo():
wasVideo = 1
uri = fluff.getPlayingFile()
if "youtube" in uri:
wasYoutube = 1
else:
wasYoutube = 0
xbmc.log(f"[{logName}] PLAYING URI: {uri} (isyoutube: {wasYoutube})")
else:
wasVideo = 0
wasYoutube = 0
xbmc.sleep(500)
#
#