@tobstar89: falls du noch nach einer Lösung für das Problem suchst, schau einfach hier Magenta TV addon.
Beiträge von eddeh
-
-
Hallo Zusammen!
Ich habe mir mal auf einem Fire TV Stick das neue "Master" Kodi V20 installiert. Bis jetzt handelt es sich noch um Alpha-Versionen, die aber soweit gut laufen.
Was dort moch nicht funktioniert, ist das Magenta Script. Interessant ist, dass die TV Programme von Magenta TV dennoch funktionieren!Python
Alles anzeigen2022-02-18 09:34:20.033 T:13174 ERROR <general>: EXCEPTION Thrown (PythonToCppException) : -->Python callback/script returned the following error<-- - NOTE: IGNORING THIS CAN LEAD TO MEMORY LEAKS! Error Type: <class 'AttributeError'> Error Contents: module 'xbmc' has no attribute 'translatePath' Traceback (most recent call last): File "/storage/emulated/0/Android/data/org.xbmc.kodi/files/.kodi/addons/script.service.magentatv/service.py", line 1, in <module> from resources.lib import connect File "/storage/emulated/0/Android/data/org.xbmc.kodi/files/.kodi/addons/script.service.magentatv/resources/lib/connect.py", line 9, in <module> data_dir = xbmc.translatePath(__addon__.getAddonInfo('profile')) AttributeError: module 'xbmc' has no attribute 'translatePath' -->End of Python script error report<--
Ich will nur informieren darüber, da ja etwas weitsicht nicht schadet
Mehr nicht!Das lässt sich mit zwei kleinen Änderungen beheben. An das Ende der Zeile 1 in connect.py fügst du ", xbmcvfs" (ohne die "") an und machst in Zeile 8 aus "xbmc.translatePath" einfach "xbmcvfs.translatePath" (auch hier wieder ohne die ""). Funktioniert auch unter Kodi 19, dort wird übrigens per Warnmeldung im Log darauf hingewiesen, dass xbmc.translatePath veraltet ist und statt dessen xbmcvfs.translatePath genutzt werden soll. In Kodi 20 wurde xbmc.translatePath offenbar endgültig entfernt.
Die Änderungen kannst du problemlos bereits in der connect.py im .zip des Service Addons durchführen, dann klappts auch auf dem Fire TV Stick.
-
Nochmal danke für eure Rückmeldung, hier die Lösung des Ganzen.
In meiner Device List enthält das erste Device kein Property mit dem Namen "deviceName". Da das Skript versucht, darauf zuzugreifen, knallt es natürlich. Ein simpler, zusätzlicher Check hat das Problem unter Windows gelöst. Nun ist mein Raspi 4 teilweise sehr langsam (ein zweiter Raspi 4 ist deutlich fixer, dürfte an der Micro SD liegen), sodass die vier Durchläufe der Schleife nicht ausreichen. Manchmal reichen sogar 100 nicht, um die gewünschte Rückmeldung von der Telekom zu erhalten. Dann fehlt in der Antwort nicht nur "deviceName" sondern auch komplett "deviceList". Da knallt es dann natürlich auch nochmal.
Wir machen also aus:
Pythonfor i in device_data["deviceList"]: if i["deviceName"] == "WebTV": uu_id = i["physicalDeviceId"] break
Das hier:Pythonif "deviceList" in device_data: for i in device_data["deviceList"]: if "deviceName" in i and i["deviceName"] == "WebTV": uu_id = i["physicalDeviceId"] break
Dann gibt es hier zumindest keine Probleme mehr beim Zugriff auf Keys, die nicht vorhanden sind.
Die weiteren Aufrufe im Service Addon benötigen auf meinem Pi auch ähnliche Checks, aber das ist ein Sonderfall. Mit der Änderung oben sollte es auf jedem ausreichend schnellen System problemlos laufen.
-
Mit absichtlich falscher Email-Adresse oder Passwort tritt schon ein Fehler beim Abruf des Codes auf. Der Login müsste also stimmen. Ich könnte es mal mi der Kundennummer an Stelle der Email-Adresse versuchen.
-
Alles klar, macht Sinn. Wenn die Response kein Objekt "deviceList" enthält, führt das so allerdings zu einem Fehler und bricht die Schleife natürlich ab.
Mit einer physicalDeviceId aus dem Browser komme ich zumindest wieder bis zur Senderliste, da geht es dann aber auch nicht mehr weiter.Es bleibt mir ein Rätsel, warum der Request auf DTAuthenticate bei mir fehlschlägt, ist aber offenbar ein Einzelschicksal.
Wenn du mir beim weiteren Debugging helfen möchtest, wäre ich dankbar. Ich möchte aber auch nicht deine Zeit verschwenden.
-
Gut, ein paar Webdevices habe ich schon mal.
Bei mir verhält sich der Code so: wenn ich in Zeile 99 folgendes einfüge "[definition=9,0][definition=9,1]xbmc.[definition='1','0']log[/definition][/definition][/definition]("Run " + str(x) + ": " + user_data["retmsg"], xbmc.LOGERROR)" steht im Log nachher nur einmal "Run 0: authenticate fail ." gefolgt vom Fehler "Error Type: <class 'KeyError'>, Error Contents: 'deviceName'". Ist klar, da die Response ja nicht das Erwartete enthält. Wenn ich den Schritt 8 so abändere, läuft die Schleife wie gewünscht:
Python
Alles anzeigen# STEP 8: GET DEVICE ID TO ACCESS WIDEVINE DRM STREAMS x = 0 while True: # 8.1: AUTHENTICATE url = "https://api.prod.sngtv.magentatv.de/EPG/JSON/DTAuthenticate" data = '{"areaid":"1","cnonce":"aa29eb89d78894464ab9ad3e4797eff6","mac":"' + uu_id + '","preSharedKeyID":"NGTV000001","subnetId":"4901","templatename":"NGTV","terminalid":"' + uu_id + '","terminaltype":"WEB-MTV","terminalvendor":"WebTV","timezone":"Europe/Berlin","usergroup":"OTT_NONDTISP_DT","userType":"1","utcEnable":1,"accessToken":"' + f'{bearer["access_token"]}' + '","caDeviceInfo":[{"caDeviceId":"' + uu_id + '","caDeviceType":8}],"connectType":1,"osversion":"Windows 10","softwareVersion":"1.45.1","terminalDetail":[{"key":"GUID","value":"' + uu_id + '"},{"key":"HardwareSupplier","value":"WEB-MTV"},{"key":"DeviceClass","value":"TV"},{"key":"DeviceStorage","value":0},{"key":"DeviceStorageSize","value":0}]}' req = requests.post(url, data=data, headers=header, cookies=epg_cookies) user_data = req.json() xbmc.[definition='1','0']log[/definition]("Run " + str(x) + ": " + user_data["retmsg"], xbmc.LOGERROR) if "success" in user_data["retmsg"]: break x = x + 1 if x > 3: raise Exception("Error: Authentication failure") # 8.2: RETRIEVE AVAILABLE WEBTV DEVICE url = "https://api.prod.sngtv.magentatv.de/EPG/JSON/GetDeviceList" data = '{"deviceType":"2;0;5;17","userid":"' + user_data["userID"] + '"}' req = requests.post(url, data=data, headers=header, cookies=epg_cookies) device_data = req.json() for i in device_data["deviceList"]: if i["deviceName"] == "WebTV": uu_id = i["physicalDeviceId"] break
In der Version auf GitHub ist 8.2 genau so weit eingerückt wie 8.1, daher gehts nach dem 'if "success"...' direkt dort weiter und nicht am Anfang der Schleife. So weit mein Verständnis bis hierhin. Ich bin bisher geschweifte Klammern gewohnt, um Blöcke zu beginnen und zu beenden.
Allerdings bleibt es dabei, 8.1 liefert auch bei 100+ Durchläufen nur "authenticate fail ." und ich habe keine Ahnung, warum das so ist.
-
Danke für die schnellen Antworten.
Ich logge mich in zwei Schritten ein, erst Benutzername (Email), dann Passwort, mehr nicht. Das passt also schon mal. In meiner Geräteliste ist 1 von 5 Geräten registriert, das sollte also auch in Ordnung sein.
Die while-Schleife hätte mir auch auffallen können, aber hey, habe bisher nicht in Python programmiert. Allerdings stimmt in der Version des Addons, die ich nutze da wohl etwas nicht. Zumindest sind 8.1 und 8.2 beide Teil der while-Schleife, sodass 8.2 immer ausgeführt wird. Egal, was 8.1 in retcode findet.
Das habe ich angepasst, allerdings bleibt es beim retcode "authenticate fail ." - egal, wie oft die Schleife läuft.
Da es bei euch aber noch funktioniert, muss das Problem auf meiner Seite liegen. Fragt sich nur wo. Zum Thema Webdevice: reicht es, wenn einmal von mindestens einem Gerät VoD oder Live TV gestartet wurde?
-
Erstmal vielen Dank für das Addon. Es hat einmal auf meinem Raspi 4 funktioniert, nach der Installation des Service Addons für die Playlists leider nicht mehr.
Daran liegt es aber nicht - hätte mich auch gewundert - in einer weiteren Kodi-Installation auf Windows habe ich das gleiche Problem.In der connect.py läuft alles wunderbar bis zu Schritt 8.1, dort ist die Response dann leider:
{'retcode': '33619984', 'retmsg': 'authenticate fail .', 'usergroup': 'OTT_NONDTISP_DT', 'transportprotocol': '0', 'isTriplePlay': '0', 'STBRCUsubscribed': '0', 'bandwidth': '0', 'isFirstLogin': '0', 'lockedNum': '0', 'waitUnLockTime': '0', 'remainLockedNum': '0', 'userID': '<fuer_den_post_entfernt_passt_aber>', 'paymentType': '0', 'needSignEULA': '0', 'pwdResetTime': '00000000000000', 'provisioningType': 'OTT_NONDTISP_DT', 'availableHLSOTTNum': '0', 'opt': '0', 'antiTamperURI': [{'key': 'Authorization', 'value': 'contentid;retcode'}, {'key': 'Play', 'value': 'contentid;retcode,url'}, {'key': 'AllChannel', 'value': ';channellist.channel.id,channellist.channel.issubscribed,channellist.channel.cpvrsubscribed,channellist.channel.pltvsubscribed,channellist.channel.localtimeshiftsubscribed,channellist.channel.tvodsubscribed,channellist.channel.npvrsubscribed'}, {'key': 'Subscribe', 'value': 'productid;retcode'}, {'key': 'SubscribeAndPlay', 'value': 'productId;retcode,playUrl'}, {'key': 'ChannelList', 'value': ';channellist.channel.id,channellist.channel.issubscribed,channellist.channel.cpvrsubscribed,channellist.channel.pltvsubscribed,channellist.channel.localtimeshiftsubscribed,channellist.channel.tvodsubscribed,channellist.channel.npvrsubscribed'}, {'key': 'AuthorizeAndPlay', 'value': 'contentId;retcode,playUrl'}], 'isKidsModEnable': '0', 'EPGGroupName': 'OTT Center', 'S2ACode': 'A014'}
"authenticate fail ." würde auf falsche Login-Daten hinweisen. Wäre das der Fall, würde es aber schon nach Schritt 3 ein Problem geben. Davon abgesehen funktionieren die gleichen Logindaten wunderbar auf der Magenta TV Webseite.
Ich kann auch ehrlich gesagt keinen Unterschied in den Requests, die das Addon abschickt und denen, die der Browser beim Login abschickt erkennen. Nur, dass der Request aus Schritt 8.1 im Browser erfolgreich ist.
Funktioniert das Addon bei denen, die es erfolgreich im Einsatz haben noch? Ich habe keine Idee mehr, woran es liegen könnte, dass es bei mir nicht mehr funktioniert.