Récupérer l'état d'androidTV

Partagez ici vos astuces et idées d'utilisation d'eedomus

Récupérer l'état d'androidTV

Messagepar tchex » 15 Juin 2020 15:36

Bonjour,

Depuis que j'utilise Netflix je suis assez malheureux d'avoir perdu le lancement d'un scenario à la lecture / pause / reprise d'une vidéo (possible avec Kodi).
J'ai fouillé un peu partout pour essayer de trouver une solution, et la meilleure solution que j'ai trouvée est de récupérer le nom de l'app qui a le focus dans AndroidTV.
Ça n'est pas aussi fin qu'avec Kodi puisque je ne connais pas le statut de lecture, mais je peux quand même lancer des scénarios selon l'app en cours.

Donc voilà comment ça marche :
Je fais tourner un programme en python, qui lance des commandes ADB vers l'androidTV.

Moi j'utilise un raspberry, sur lequel j'ai installé le serveur ADB :
Code : Tout sélectionner
sudo apt-get install adb


Ensuite c'est le programme python (get_shield_app.py) qui regarde toutes les 5 secondes qui a le focus dans androidTV, et qui appelle l'API de l'eedomus pour mettre à jour un capteur :

Code : Tout sélectionner
import urllib2
import time
import logging
import logging.handlers
import os


# Envoi d'un email en cas de plantage du script
smtp_handler = logging.handlers.SMTPHandler(mailhost=("smtp.free.fr", 25),
                                            fromaddr="email@boite.mail",
                                            toaddrs="destin@tai.re",
                                            subject=u"Script get_shield_app HS ! ")


logger = logging.getLogger()
logger.addHandler(smtp_handler)


try:
        last_app = "nothing"
        print("Starting...")
        i=1

        while i<>0:
            # Commande ADB pour récupérer le nom du process qui a le focus
                app = os.popen('adb shell dumpsys window windows | grep -E \'mFocusedApp\'| cut -d / -f 1 | cut -d " " -f 7').read().strip()
                # Si pas de retour, essaie de se reconnecter
            if app == "":
                        print("Trying to reconnect...")
                        print(os.popen('adb connect 192.168.XX.XX').read().strip())
                        print("Getting connected devices:")
                        print(os.popen('adb devices -l').read().strip())
            # Si changement de focus, alors ..
                if last_app <> app:
                        print("Switched from " + last_app + " to " + app)
                        last_app = app
                        if app == "com.netflix.ninja":
                                print("Netflix has focus")
                        # Action eedomus
                                content = urllib2.urlopen('http://192.168.XX.XX/api/set?action=periph.value&periph_id=1234567&value=%s&api_user=APIUSER&api_secret=APISECRET'% (1)).read()
                                print content
                        if app== "com.google.android.tvlauncher":
                                print("AndroidTV launcher has focus")
                        # Action eedomus
                                content = urllib2.urlopen('http://192.168.XX.XX/api/set?action=periph.value&periph_id=1234567&value=%s&api_user=APIUSER&api_secret=APISECRET'% (0)).read()
                                print content
                time.sleep( 5 )

except Exception as e:
  logger.exception('Unhandled Exception')
  print ('It seems that I crashed. Check your email..')


Voilà. C'est pas hyper propre (notamment toutes les variables en dur dans le code). Mais c'est une base pour ceux qui voudraient aller plus loin. Ici on ne détecte que netflix ou le launcher, mais pour trouver les noms des autres app il suffit de faire tourner le script et de changer lancer les app sur la box android, les noms d'afficheront. Restera à ajouter vos conditions dans le code.

J'ai aussi un autre programme python (forever_get_shield_app.py), qui lance le précédent, et le relance s'il plante :

Code : Tout sélectionner
#!/usr/bin/python
from subprocess import Popen
import sys
import time

#filename = sys.argv[1]
while True:
    print("\nJe lance le script get_shield_app.py")
    p = Popen("python /home/chemin_du_script/get_shield_app.py", shell=True)
    p.wait()
    time.sleep(60)


et enfin, une tâche cron au reboot du raspberry : (crontab -e)
Code : Tout sélectionner
@reboot python /home/chemin_dus_cript/forever_get_shield_app.py


Voilà, j'espère que ça pourra aider. N'hésitez pas si vous avez d'autres idées. Et peut-être d'autres moyens de récupérer des infos d'androidTV.
tchex
 
Messages : 140
Inscription : 29 Nov 2012

Retour vers Mes usages

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 42 invité(s)