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.