예제 #1
0
class Kodi():

    VARIABLES = {
        '@name_serie': {},
        '@name_film': {},
        '@name_music': {},
        '@name_playlist': {},
        '@episode': 'Int',
        '@saison': 'Int',
        '@episod_id': 'Int',
        '@film_id': 'Int'
    }

    ORDRES = {
        "liste_film": {
            "action": ["display", "show"],
            "message_fr": ["liste film"],
            "input": ["récent", "ordre alpha", "note", "date ajout"]
        },
        "liste_serie": {
            "action": ["display", "show"],
            "message_fr": ["liste série"],
            "input": ["récent", "ordre alpha", "note", "date ajout"]
        },
        "liste_music": {
            "action": ["display", "show"],
            "message_fr": ["liste musique"],
            "input": ["récent", "ordre alpha", "note", "date ajout"]
        },
        "lance_episode": {
            "action": ["launch", "put"],
            "message_fr": ["épisode"],
            "input": [
                "suivant de @name_serie",
                "@episode de la saison @saison de @name_serie",
                "de @name_serie saison @saison épisode @episode",
                "de @name_serie numéro @episod_id",
                "numéro @episod_id de @name_serie"
            ]
        },
        "lance_episode_2": {
            "action": ["resume"],
            "message_fr":
            ["la série", "épisode", "la suite", "la suite de la série"],
            "input": ["de @name_serie"]
        },
        "lance_film": {
            "action": ["launch", "put"],
            "message_fr": ["film"],
            "input": ["@name_film"]
        },
        "resume_film": {
            "action": ["resume"],
            "message_fr": ["film"],
            "input": ["@name_film"],
        },
        "lance_music": {
            "action": ["launch", "put"],
            "message_fr": ["musique"],
            "input": ["@name_music", "@name_playlist", "suivante"],
        },
        "lecture": {
            "action": ["put"],
            "message_fr": ["lecture"],
        },
        "pause": {
            "action": ["put"],
            "message_fr": ["pause"],
        },
        "stop": {
            "action": ["stop"],
            "message_fr":
            ["musique", "vidéo", "épisode", "film", "stop", "arrête"],
        },
        "baisser_son": {
            "action": ["put_down"],
            "message_fr": ["le son", "le volume"],
            "repete": ["encore", "plus"],
        },
        "monter_son": {
            "action": ["turn_up"],
            "message_fr": ["le son", "le volume"],
            "repete": ["encore", "plus"],
        },
        "mute": {
            "action": ["cut", "stop"],
            "message_fr": ["le son", "le volume"],
        },
        "scan": {
            "action": ["put", "launch"],
            "message_fr": ["scan"],
        }
    }

    devices = []
    emplacements = []
    satelitesConnected = {}

    listeMotsSerie = []
    listeMotsNumero = []

    def __init__(self, devicesService=None):
        self.bus = Bus()
        self.kodiDao = KodiDAO()
        self.convert = Convert()
        #   self.playerMusic = playerMusic()
        self.tools = Tools()
        self.bus.subscribe('vocalOrdre', self.lanceVocalOrdre)
        self.bus.subscribe('loadSeriesDao', self.loadSeriesCallBack)
        self.bus.subscribe('loadSeriesEnCoursDao',
                           self.loadSeriesEnCoursCallBack)
        self.bus.subscribe('loadFilmsDao', self.loadFilmsCallBack)
        self.bus.subscribe('loadMusiquesDao', self.loadMusiquesCallBack)
        self.bus.subscribe('deviceService', self.deviceChange)
        self.bus.subscribe('emplacementService', self.emplacementChange)

        current_dir = os.path.dirname(__file__)
        #  jsonfile = '../../resources/fr/serieMapping.json'
        #  mappingfile = os.path.join(current_dir, jsonfile)
        #  with open(mappingfile) as data_file:
        #      serieMapping = json.load(data_file)

        #  self.listeMotsSerie = self.mappingToWords(serieMapping)

        numeroMapping_path = '../../resources/fr/numeroMapping.json'
        numeroMapping_file = os.path.join(current_dir, numeroMapping_path)
        with open(numeroMapping_file) as data_file:
            numeroMapping = json.load(data_file)

        self.listeMotsNumero = self.mappingToWords(numeroMapping)

        for var in self.VARIABLES:
            v = self.VARIABLES[var]
            if v == "Int":
                self.VARIABLES[var] = numeroMapping

    #     if var == "@name_serie" :
    #         self.VARIABLES[var] = serieMapping

    def mappingToWords(self, mapping):
        listOfWord = []
        for item in mapping:
            l_m = mapping[item]
            for m in l_m:
                m_clean = self.tools.cleanString(m)
                l_w = m_clean.split(" ")
                for w in l_w:
                    if w not in listOfWord:
                        listOfWord.append(w)
        return listOfWord

    def listToWords(self, list_):
        listOfWord = []
        for item in list_:
            m_clean = self.tools.cleanString(item)
            l_w = m_clean.split(" ")
            for w in l_w:
                if w not in listOfWord:
                    listOfWord.append(w)
        return listOfWord

    def synchronize(self, data):
        self.bus.publish('kodiService', data)

    def lanceVocalOrdre(self, bus, key, obj):
        groupe = obj['groupe']
        if groupe != 'kodi':
            return

        ordre_name = obj['ordre']
        origineIp = obj["origine"]
        #recognised = obj["recognised"]
        input_ = obj["input"]

        #ordre = self.ORDRES[ordre_name]
        #        function = ordre["function"]

        try:
            getattr(self, ordre_name)(input_, origineIp)
        except Exception as e:
            print("Kodi => lanceVocalOrdre : " + e.__str__())

    def findKodiBySecteur(self, origineIp):
        for secteur in self.emplacements:
            for device in secteur.devices:
                if str(device.ip) == origineIp:
                    self.secteurTouche = secteur

        if hasattr(self, 'secteurTouche'):
            for device in self.secteurTouche.devices:
                if device.hasKodi == True:
                    self.kodiDao.currentKodiIp = device.ip
            del self.secteurTouche

    def liste_film(self, input_, ipDestination):
        self.loadFilms()

    def liste_serie(self, input_, ipDestination):
        self.loadSeries()

    def liste_music(self, input_, ipDestination):
        self.loadMusiques()

    def lance_episode_2(self, input_, ipDestination):
        self.lance_episode(input_, ipDestination, True)

    def lance_episode(self, input_, ipDestination, suite=False):
        """
        1/ Liste des séries   : self.kodiDao.listSeriesEnCours
        2/ Input              : input_   
        """

        self.findKodiBySecteur(ipDestination)

        name_var = None
        episode_num = 0
        saison_num = 0

        for i in input_:
            print(i)
            if "suivant" in i:
                suite = True
            if "@name_serie" in i:
                if len(input_[i]) > 1:
                    name_var = input_[i][1]
                if len(input_[i]) == 1:
                    name_var = input_[i][0]
            if "@umeric" in i:
                if "épisode" in i:
                    if len(input_[i]) > 1:
                        episode_num = input_[i][1]
                    if len(input_[i]) == 1:
                        episode_num = input_[i][0]
                if "saison" in i:
                    if len(input_[i]) > 1:
                        saison_num = input_[i][1]
                    if len(input_[i]) == 1:
                        saison_num = input_[i][0]
            if "premier" in i:
                saison_num = 1
                episode_num = 1
            if "dernier" in i:
                saison_num = "last"
                episode_num = "last"

        numeros = []
        if name_var:
            if suite:
                for serieEnCours in self.kodiDao.listSeriesEnCours:
                    if serieEnCours.serieTitle == name_var.key_ordre:
                        numeros.append(serieEnCours.nextEpisodeid)
            else:
                saison = 0
                episode = None
                serie = None
                if name_var.key_ordre in self.kodiDao.listSeries:
                    serie = self.kodiDao.listSeries[name_var.key_ordre]
                if serie:
                    if saison_num == "last":
                        saison = serie[-1]
                    elif saison_num > 0:
                        saison = serie[saison_num]
                    else:
                        saison = serie[1]

                    if saison > 0:
                        if episode_num == "last":
                            episode = saison[-1]
                        elif episode_num > 0:
                            episode = saison[episode_num]
                        else:
                            episode = saison[1]
                    if episode:
                        numeros.append(episode.id)

        if len(numeros) > 0:
            counter = collections.Counter(numeros)
            listePossible = counter.most_common()
            if len(listePossible) > 0:
                episod_id, nombre = listePossible[0]
                if episod_id > -1:
                    self.openSerie(episod_id)

    def lance_film(self, input_, ipDestination):

        print(input_)
        self.findKodiBySecteur(ipDestination)

        name_var = None

        for i in input_:
            print(i)
            if "@name_film" in i:
                if len(input_[i]) > 1:
                    name_var = input_[i][1]
                if len(input_[i]) == 1:
                    name_var = input_[i][0]

        numeros = []
        if name_var:
            for film in self.kodiDao.listFilms:
                if film.title == name_var.key_ordre:
                    numeros.append(film.id)

        if len(numeros) > 0:
            counter = collections.Counter(numeros)
            listePossible = counter.most_common()
            if len(listePossible) > 0:
                movieid, nombre = listePossible[0]
                if movieid > -1:
                    self.openFilm(movieid)

        #movieid = -1
        #movieid = self.convert.convert(arguments[0])


#        numeros = self.convert.convertListChaine(input_, self.kodiDao.listFilms)
#      print 'lance_film : ' + str(movieid)
#       print ('numeros : ' + str(numeros))
#        counter = collections.Counter(numeros)
#        print ('numeros : ' + str(counter.most_common(4)))
#       listePossible = counter.most_common(4)
#       movieid, nombre = listePossible[0]

#def lance_episode(self, input_, ipDestination):
#episod_id = -1
#    print(input_)
#    numeros = self.convert.convertListChaine(input_, self.kodiDao.listSeries, self.kodiDao.listSeriesEnCours)
#            print 'lance_episode : ' + str(episod_id)
#    print ('numeros : ' + str(numeros))
#    counter = collections.Counter(numeros)
#    print ('numeros : ' + str(counter.most_common(4)))
#    listePossible = counter.most_common(4)
#    episod_id, nombre = listePossible[0]
#    if episod_id > -1 :
#        self.openSerie(episod_id)

#def launchMusic(self, input_, ipDestination):
#    self.playerMusic.manageMusic(ipDestination, "lance_music" , "bureau")

    def pause(self, input_, ipDestination):
        #pass
        self.playPause(False)
        #self.playerMusic.manageMusic(ipDestination, "pause")

    def lecture(self, input_, ipDestination):
        #pass
        self.playPause(True)
        #self.playerMusic.manageMusic(ipDestination, "lecture")

    def stop(self, input_, ipDestination):
        #pass
        self.stopFilm()
        #self.playerMusic.manageMusic(ipDestination, "stop")

    def launchMute(self, input_, ipDestination):
        self.xbmc.Application.SetMute({"mute": True})

    def baisser_son(self, input_, ipDestination):
        self.xbmc = self.kodiDao.connectFirstKodi()
        volume = self.xbmc.Application.GetProperties(
            {"properties": ["volume"]})
        n_v = volume["result"]["volume"] - 2
        volume = self.xbmc.Application.SetVolume({"volume": n_v})

    def scan(self, input_, ipDestination):
        self.scanMoviesDatabase()

    def deviceChange(self, bus, key, obj):
        self.devices = obj["devices"]
        self.detectKodi()
        if len(self.kodiDao.listKodis) > 0 and not hasattr(self, 'WSthread'):
            self.WSthread = []
            for kodi in self.kodiDao.listKodis:
                t = WSThread(self, kodi.ip)
                self.WSthread.append(t)
                t.start()
            self.loadMusiques()
            self.loadFilms()
            self.loadSeries()

    def emplacementChange(self, bus, key, obj):
        if hash(frozenset(self.emplacements)) != hash(
                frozenset(obj["emplacements"])):
            self.emplacements = obj["emplacements"]
            emplacement_name = []
            emplacement_mapping = {}
            for e in self.emplacements:
                name_clean = self.tools.cleanString(e.name)
                emplacement_name.append(name_clean)
                if e.name not in emplacement_mapping:
                    emplacement_mapping[e.name] = []
                if name_clean not in emplacement_mapping[e.name]:
                    emplacement_mapping[e.name].append(name_clean)

            self.VARIABLES["@name_playlist"] = emplacement_mapping
            self.bus.publish(
                'loadVocalVariable', {
                    'module': 'kodi',
                    'key': '@name_playlist',
                    'values': emplacement_name
                })

    def detectKodi(self, args=None):
        listKodis = []
        if len(self.devices) > 0:
            for device in self.devices:
                if self.deviceDetectKodi(device.ip):
                    device.setHasKodi(True)
                    listKodis.append(device)
                    print('Kodi detect  : ' + device.ip)
            obj = {'key': "kodiDetected", 'devices': listKodis}
            self.synchronize(obj)

            self.kodiDao.listKodis = listKodis
        return self.kodiDao.listKodis

    def deviceDetectKodi(self, ip):
        params = {}
        params['jsonrpc'] = '2.0'
        params['id'] = 0
        params['method'] = 'JSONRPC.Ping'
        params['params'] = ''
        data = json.dumps(params).encode('utf-8')
        header = {
            'Content-Type': 'application/json',
            'User-Agent': 'python-xbmc'
        }
        url = "http://" + ip + ":" + str(conf.PORT_HTTP_KODI) + "/jsonrpc"
        isKodi = True
        try:
            req = urllib2.Request(url, data, header)
            urllib2.urlopen(req, timeout=0.3)
            # xbmc = xbmcjson.XBMC(url)
            # xbmc.JSONRPC.Ping()
        except:
            isKodi = False
        return isKodi

    def scanMoviesDatabase(self, args=None):
        self.xbmc = self.kodiDao.connectFirstKodi()
        self.xbmc.VideoLibrary.Scan()

    def scanMusiquesDatabase(self, args=None):
        self.xbmc = self.kodiDao.connectFirstKodi()
        self.xbmc.AudioLibrary.Scan()

    def showNotification(self, args):
        self.xbmc = self.kodiDao.connectFirstKodi()
        self.xbmc.GUI.ShowNotification({
            "title":
            "Topi de amor",
            "message":
            "Bonjour je m'appelle Noni y te quiero"
        })

    def loadFilms(self, forcage=False):
        if len(self.kodiDao.listFilms) == 0 or forcage:
            self.kodiDao.loadFilms()
        obj = {'key': "loadFilms", 'films': self.kodiDao.listFilms}
        self.synchronize(obj)
        return self.kodiDao.listFilms

    def loadFilmsCallBack(self, bus, key, films):
        obj = {'key': "loadFilms", 'films': films}
        self.synchronize(obj)
        films_name = []
        for f in films:
            films_name.append(f.title)
        self.bus.publish('loadVocalVariable', {
            'module': 'kodi',
            'key': '@name_film',
            'values': films_name
        })

    def loadMusiques(self, forcage=False):
        self.kodiDao.loadMusiques()
        obj = {'key': "loadMusiques", 'musiques': self.kodiDao.listMusiques}
        self.synchronize(obj)
        return self.kodiDao.listMusiques

    def loadMusiquesCallBack(self, bus, key, musiques):
        obj = {'key': "loadMusiques", 'musiques': self.kodiDao.listMusiques}
        self.synchronize(obj)
        listArtiste = ["pink floyd"]
        self.bus.publish('loadVocalVariable', {
            'module': 'kodi',
            'key': '@name_music',
            'values': listArtiste
        })

    def loadSeries(self, forcage=False):
        if len(self.kodiDao.listSeries) == 0 or forcage:
            self.kodiDao.loadSeries()
        self.synchronize({
            'key': "loadSeries",
            'series': self.kodiDao.listSeries
        })
        self.synchronize({
            'key': "loadSeriesEnCours",
            'series': self.kodiDao.listSeriesEnCours
        })
        return self.kodiDao.listSeries

    def loadSeriesTab(self, forcage=False):
        if len(self.kodiDao.listSeries) == 0 or forcage:
            self.kodiDao.loadSeries()
        listSeriesTab = []
        for serie in self.kodiDao.listSeries:
            listSeriesTab.append(Serie(serie))
        return listSeriesTab

    def loadSeriesCallBack(self, bus, key, series):
        self.kodiDao.listSeries = series
        self.synchronize({'key': "loadSeries", 'series': series})

        #serieMapping = self.VARIABLES["@name_serie"]
        #for s in self.kodiDao.listSeries:
        #    s_clean = self.tools.cleanString(s)
        #    if s not in serieMapping :
        #        serieMapping[s] = []
        #    if s_clean not in serieMapping[s] :
        #        serieMapping[s].append(s_clean)

        ##self.listeMotsSerie = self.mappingToWords(serieMapping)
        #self.VARIABLES["@name_serie"] = serieMapping

        #vocal_serie = []
        #for item in serieMapping :
        #    l = serieMapping[item]
        #    for m in l :
        #        if m not in vocal_serie :
        #            vocal_serie.append(m)

        #self.bus.publish('loadVocalVariable' , {'module': 'kodi', 'key':'@name_serie' , 'values' : vocal_serie})

    def loadSeriesEnCoursCallBack(self, bus, key, seriesEnCours):
        self.kodiDao.listSeriesEnCours = seriesEnCours
        self.synchronize({
            'key': "loadSeriesEnCours",
            'series': self.kodiDao.listSeriesEnCours
        })

    def kodiCommand(self, kodiArgs):

        command = kodiArgs[0].ordre
        if hasattr(kodiArgs[0], 'arguments'):
            args = kodiArgs[0].arguments

        self.xbmc = self.kodiDao.connectFirstKodi()

        player = {}

        activePlayer = self.xbmc.Player.GetActivePlayers()
        print('Active player : ' + str(activePlayer))
        if command == 'PlayPause':
            player = self.playPause(args)

        if command == 'openFilm':
            player = self.openFilm(args)

        if command == 'openSerie':
            player = self.openSerie(args)

        if command == 'Stop':
            player = self.stopFilm()

        if command == 'activeItem':
            try:
                player = self.activeItem()
            except:
                pass
        return player

    def openFilm(self, args):
        self.xbmc = self.kodiDao.connectFirstKodi()
        self.xbmc.Player.Open({"item": {"movieid": int(args)}})

    def openSerie(self, episod_id):
        self.xbmc = self.kodiDao.connectFirstKodi()
        #   print episod_id
        result = self.xbmc.Player.Open({
            "item": {
                "episodeid": int(episod_id)
            },
            "options": {
                "resume": True
            }
        })
        print(result)

    def playPause(self, args):
        self.xbmc = self.kodiDao.connectFirstKodi()
        return self.xbmc.Player.PlayPause([PLAYER_VIDEO])

    def stopFilm(self):
        self.xbmc = self.kodiDao.connectFirstKodi()
        return self.xbmc.Player.Stop([PLAYER_VIDEO])

    def activeItem(self):
        self.kodiDao.connectFirstKodi()
        activeItem = {}
        activeKodi = self.xbmc.Player.GetItem([PLAYER_VIDEO])
        if not activeKodi:
            return
        listActiveItem = activeKodi.get('result', {}).get('item', [])
        #        print str(listActiveItem)
        if len(listActiveItem) > 0:
            type = listActiveItem['type']

        if type != 'unknown':
            title = listActiveItem['label']
            id = listActiveItem['id']
            speedJson = self.xbmc.Player.GetProperties({
                "properties": ["speed"],
                "playerid": PLAYER_VIDEO
            })
            speed = speedJson.get('result', {}).get('speed')
            print('onPlay' if speed > 0 else 'onPause')
            if type == 'movie':
                activeItem = self.kodiDao.loadFilmDetails(id)
            else:
                activeItem = self.kodiDao.loadEpisodeDetails(id)
            print(title)
            obj = {
                'key': "activeItem",
                'items': {
                    'item': activeItem,
                    'speed': speed
                }
            }
            self.synchronize(obj)
        else:
            print("nada en curso")

        return activeItem

    def test(self):
        #        self.xbmc.GUI.ActivateWindow({"window":"mediasource"})

        sources = self.xbmc.Files.GetSources(media="video")
        print(sources)
        directoryFilms = self.xbmc.Files.GetDirectory({
            "directory": '/media/HP Desktop Drive/Film/',
            "sort": {
                "order": "ascending",
                "method": "label"
            }
        })
        filmsTitle = []
        for film in directoryFilms.get('result', {}).get('files', []):
            item = film['label']
            if item not in filmsTitle:
                filmsTitle.append(item)

        print(filmsTitle)

        directorySeries = self.xbmc.Files.GetDirectory({
            "directory": '/media/Seagate Expansion Dr/série/',
            "sort": {
                "order": "ascending",
                "method": "label"
            }
        })
        seriesTitle = []
        for serie in directorySeries.get('result', {}).get('files', []):
            item = serie['label']
            if item not in seriesTitle:
                seriesTitle.append(item)
        print(seriesTitle)
        print(len(seriesTitle))

    def test1(self):
        xbmc = XBMC("http://192.168.1.100:8080/jsonrpc")
        audio = xbmc.AudioLibrary.GetSongs()
        print(audio)
예제 #2
0
class KodiDAO():
    listKodis = []
    listFilms = []
    listSeries = []
    listSeriesEnCours = []
    listMusiques = []
    ListWordsToRecognize = []
    ListTitlesToRecognize = []
    
    def __init__(self):
        self.bus= Bus()
        self.ft = LoadFilms(self)
        self.fs = LoadSeries(self)
        self.fm = LoadMusiques(self)
        
    def connectFirstKodi(self):
        if not hasattr(self, 'currentKodiIp') and len(self.listKodis) > 0 :
            self.currentKodiIp = self.listKodis[0].ip
        
        result = None    
        if hasattr(self, 'currentKodiIp') :
            result = self.connectKodi(self.currentKodiIp)    
        return  result
    
    def connectKodi(self, kodiIp):
        return XBMC("http://" + kodiIp + ":" + str(conf.PORT_HTTP_KODI) + "/jsonrpc")  
        
    def loadFilms(self):
        if not self.ft.isAlive():
            self.xbmc = self.connectFirstKodi()
            self.ft = LoadFilms(self)
            self.ft.start()
        return self.listFilms
    
    def loadFilmsCallback(self):
        self.bus.publish('loadFilmsDao', self.listFilms)

    def loadSeries(self):
        if not self.fs.isAlive():
            self.xbmc = self.connectFirstKodi()
            self.fs = LoadSeries(self)
            self.fs.start()
        return self.listSeries
    
    def loadSeriesCallback(self):
        self.bus.publish('loadSeriesDao', self.listSeries)
        self.bus.publish('loadSeriesEnCoursDao', self.listSeriesEnCours)
    
    def loadSeriesEnCours(self):
        if not self.fs.isAlive():
            self.xbmc = self.connectFirstKodi()
            self.fs = LoadSeries(self)
            self.fs.start()
        return self.listSeriesEnCours

    def loadMusiques(self):
        if not self.fm.isAlive():
            self.fm = LoadMusiques(self)
            self.fm.start()
        return self.listMusiques
    
    def loadMusiquesCallback(self):
        self.bus.publish('loadMusiquesDao', self.listMusiques)

    def loadEpisodeDetails(self, episodeid):
        if len(self.listSeries) > 0 :
            return 
         
        episode = None
        properties = ["title", "plot", "votes", "rating", "writer", "firstaired", "playcount", "runtime", 
                      "director", "productioncode", "season", "episode", "originaltitle", "showtitle", "cast", 
                      "streamdetails", "lastplayed", "fanart", "thumbnail", "file", "resume", "tvshowid", 
                      "dateadded", "uniqueid", "art"]

        for item in self.listSeries:
            if episodeid == item.id :
                episode = item
                detailsJson = self.xbmc.VideoLibrary.GetEpisodeDetails(episodeid=episodeid, properties=properties)
                details = detailsJson.get('result', {}).get('episodedetails', {})
                episode['art'] = details.get('art', {})
#                logger.debug(details)   
         
        return episode       
    
    
    def loadFilmDetails(self, movieid):
        if len(self.loadFilms()) > 0 :
            return 
        ### Media properties ###
        movie_properties = ['title', 'genre', 'year', 'rating', 'director', 'trailer', 'tagline', 'plot',  
                            'plotoutline', 'originaltitle', 'lastplayed', 'playcount', 'writer', 'studio', 
                            'mpaa', 'cast', 'country', 'imdbnumber', 'runtime', 'set', 'showlink', 'streamdetails',
                            'top250', 'votes', 'fanart', 'thumbnail', 'file', 'sorttitle' , 'resume', 'setid', 
                            'dateadded', 'tag', 'art' ]
        film = None
        for item in self.listFilms:
            if movieid == item.id :
                film = item
                detailsJson = self.xbmc.VideoLibrary.GetMovieDetails(movieid=movieid, properties=movie_properties)
                details = detailsJson.get('result', {}).get('moviedetails', {})
                film['art'] = details.get('art', {})
        return film