#script.voxtools
#version="0.1.3" 

import xbmc,  xbmcgui, sys, re
import socket

class Main:
   def __init__(self):
        self._init_vars()
        self.WINDOW.clearProperty('VoxTools')
        self._parse_argv()
        xbmc.log(msg="voxtools open") 
        xbmc.sleep(2000)
        self.WINDOW.setProperty('VoxTools', 'True')
        self.keepRunning()
   def _parse_argv( self ):
       try:
          cmdtype = sys.argv[1].split("=", 1)[1].lower()
          cmdparm1 = sys.argv[2].split("=", 1)[1]
       except:
          cmdtype = ""
          cmdparm1 = ""
       #xbmcgui.Dialog().ok("a"+"B",cmdtype+"  :  "+cmdparm1), keep for reference
       if cmdtype == "youtube.search":
          xbmc.executebuiltin("XBMC.ActivateWindow(10025,plugin://plugin.video.youtube/?path=/root/search&feed=search&search="+cmdparm1+"&)")
       elif cmdtype == "execbuiltin":
          xbmc.executebuiltin(cmdparm1)
       elif cmdtype == "setvol":    
          mysetvol(cmdparm1)
       elif cmdtype == "smartpl":    
          smart_playlist_full(cmdparm1)
   
   def _init_vars( self ):
        self.WINDOW = xbmcgui.Window( 10000 )          
        self.Player = MyPlayer()
                    
   def getcurrentvolas_string():
       volume_query = '{"jsonrpc": "2.0", "method": "Application.GetProperties", "params": { "properties": [ "volume" ] }, "id": 1}'
       result = xbmc.executeJSONRPC( volume_query )
       match = re.search( '"volume": ?([0-9]{1,3})', result )
       return match.group(1)
    
   def getcurrentvolas_int():
       volume_query = '{"jsonrpc": "2.0", "method": "Application.GetProperties", "params": { "properties": [ "volume" ] }, "id": 1}'
       result = xbmc.executeJSONRPC( volume_query )
       match = re.search( '"volume": ?([0-9]{1,3})', result )
       intvol = int(match.group(1))
       return intvol

   def mysetvol(strvol):
       targetvol = int(strvol)
       myvol = getcurrentvolas_int()   
       delta=4
       if (myvol<targetvol):
           while (myvol < targetvol-delta):
               myvol = myvol + delta
               tmpvol = str(myvol)
               xbmc.executebuiltin("SetVolume("+tmpvol+")")
               #time.sleep(0.05)
               xbmc.sleep(50)
       else:
           while (myvol > targetvol+delta):
               myvol = myvol - delta
               tmpvol = str(myvol)
               xbmc.executebuiltin("SetVolume("+tmpvol+")")
               #time.sleep(0.05)
               xbmc.sleep(50)
       xbmc.executebuiltin("SetVolume("+strvol+")")


   def smart_playlist_full(fulltext):    
       myFileName = xbmc.translatePath("special://profile/playlists/mixed/voxsmart.xsp")
       vcFile = open(myFileName, "w")
       vcFile.write(fulltext)
       vcFile.close()
       #xbmc.executebuiltin("XBMC.ActivateWindow(music,special://temp/voxsmart.xsp)")
       
   #keep the VoxTools running until a new instance its called or the xbmc close.
   def keepRunning(self):
        xbmc.log(msg=self.WINDOW.getProperty('VoxTools'))
        if (not xbmc.abortRequested):
            xbmc.log(msg="voxtools test running")
        while (not xbmc.abortRequested) and self.WINDOW.getProperty('VoxTools') == 'True':
            xbmc.sleep(500)
            xbmc.log(msg="voxtools running")
        xbmc.log(msg="voxtools not running")    
            
class MyPlayer(xbmc.Player):
    def __init__(self):
        xbmc.Player.__init__(self)
        self.substrings = [ '-trailer', 'http://' ]
        self.type = ""
        xbmc.log(msg="player")

    def onPlayBackStarted(self):
        xbmc.sleep(1000)
        if (self.isPlayingAudio()):
            self.album = xbmc.getInfoLabel('MusicPlayer.Album')
            xbmc.log(msg="playing audio")
            self.type = "music"
            self.sendToVox("event&&AlbumStart")
        else:
            if xbmc.getCondVisibility('VideoPlayer.Content(movies)'):
                filename = ''
                isMovie = True
                xbmc.log(msg="playing video")
                try:                    
                    filename = self.getPlayingFile()
                except:
                    pass
                if filename != '':
                    for string in self.substrings:
                        if string in filename:
                            isMovie = False
                            self.type = "trailer"
                            self.sendToVox("event&&TrailerStart")
                            break
                if isMovie:
                    self.type = "movie"
                    self.title = xbmc.getInfoLabel('VideoPlayer.Title')
                    self.sendToVox("event&&MovieStart")
            elif xbmc.getCondVisibility('VideoPlayer.Content(episodes)'):
                if xbmc.getInfoLabel('VideoPlayer.Season') != "" and xbmc.getInfoLabel('VideoPlayer.TVShowTitle') != "":
                    xbmc.log(msg="playing tvshow")
                    self.type = "episode"
                    self.tvshow = xbmc.getInfoLabel('VideoPlayer.TVShowTitle')
                    self.sendToVox("event&&EpisodeStart")

    def onPlayBackEnded(self):
        if self.type=="music":
           self.sendToVox("event&&AlbumEnd")
        if self.type=="movie":
           self.sendToVox("event&&MovieEnd")
        if self.type=="trailer":
           self.sendToVox("event&&TrailerEnd")
        if self.type=="episode":
           self.sendToVox("event&&EpisodeEnd")
        self.type = ""

    def onPlayBackStopped(self):
        if self.type=="music":
           self.sendToVox("event&&AlbumStop")
        if self.type=="movie":
           self.sendToVox("event&&MovieStop")
        if self.type=="trailer":
           self.sendToVox("event&&TrailerStop")
        if self.type=="episode":
           self.sendToVox("event&&EpisodeStop")
        self.type = ""
        
    def sendToVox(self,data):
        xbmc.log(msg="send to vox ")
        IPADDR = '255.255.255.255'
        PORTNUM = 33000
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
        s.connect((IPADDR, PORTNUM))
        s.send(data)
        s.close()                
                       
if (__name__ == "__main__"):
    Main()
    
