From ec1350c7ee945d44082e8bd84aa58b795eff2e3c Mon Sep 17 00:00:00 2001 From: "fraggin.phun" Date: Tue, 24 Dec 2019 22:41:38 -0500 Subject: [PATCH] Pushing fraggin_phun changes to get video stream working again, changed some logging and added a logging setting. --- adobe.py | 14 +++++++------- default.py | 22 +++++++++++++--------- resources/language/English/strings.xml | 1 + resources/settings.xml | 1 + rogers.py | 5 +++-- settings.py | 14 ++++++++++---- snnow.py | 18 +++++++++--------- sportsnet.py | 7 ++++--- 8 files changed, 48 insertions(+), 34 deletions(-) diff --git a/adobe.py b/adobe.py index 3fcd06a..d01cfd4 100644 --- a/adobe.py +++ b/adobe.py @@ -1,5 +1,5 @@ import urllib, urllib2, xml.dom.minidom, uuid -from settings import Settings +from settings import Settings, log from cookies import Cookies @@ -32,7 +32,7 @@ def sessionDevice(streamProvider): try: resp = opener.open(AdobePass.SESSION_DEVICE_URI, urllib.urlencode(values)) except urllib2.URLError, e: - print e.args + log (e.args, True) return False Cookies.saveCookieJar(jar) @@ -82,7 +82,7 @@ def preAuthorize(streamProvider, channels): try: resp = opener.open(AdobePass.PREAUTHORIZE_URI, value_str) except urllib2.URLError, e: - print e.args + log (e.args, True) return None Cookies.saveCookieJar(jar) @@ -128,19 +128,19 @@ def authorizeDevice(streamProvider, mso_id, channel): try: resp = opener.open(AdobePass.AUTHORIZE_URI, urllib.urlencode(values)) except urllib2.URLError, e: - print e.args + log (e.args, True) return False Cookies.saveCookieJar(jar) resp_xml = resp.read() if resp_xml.find('notAuthorized') >= 0: - print "Unable to authorise for channel '" + channel + "'" + log ("Unable to authorise for channel '" + channel + "'") return False try: dom = xml.dom.minidom.parseString(resp_xml) except: - print "Unable to parse device authorization xml." + log ("Unable to parse device authorization xml.", True) return False result_node = dom.getElementsByTagName('result')[0] @@ -189,7 +189,7 @@ def deviceShortAuthorize(streamProvider, mso_id): try: resp = opener.open(AdobePass.DEVICE_SHORT_AUTHORIZE, urllib.urlencode(values)) except urllib2.URLError, e: - print e.args + log (e.args, True) return '' Cookies.saveCookieJar(jar) diff --git a/default.py b/default.py index 5a963db..7c290a1 100644 --- a/default.py +++ b/default.py @@ -27,6 +27,8 @@ def getAuthCredentials(): mso = __settings__.getSetting("mso") + log("Got from settings the username '" + username + "' for provider '" + mso + "'") + return { 'u' : username, 'p' : password, 'm' : mso } @@ -49,6 +51,8 @@ def createMainMenu(): values = { 'menu' : 'channel', 'name' : desc, 'id' : channel['neulion_id'], 'abbr' : channel['id'] } + log("Channel information: " + format(values)) + title = values['name'] showTitle = channel['name'] @@ -92,25 +96,25 @@ def playChannel(values): token = stream['token'] stream = stream['stream'] headers = { - ':authority': 'prod-lic2widevine.sd-ngp.net', - ':method': 'POST', - ':path': '/proxy', - ':scheme': 'https', + 'method': 'POST', 'accept': '*/*', + 'origin': 'https://now.sportsnet.ca', + 'authority': 'prod-lic2widevine.sd-ngp.net', + 'path': '/proxy', + 'scheme': 'https', 'accept-encoding': 'gzip, deflate, br', 'accept-language': 'en-CA%2Cen-GB%3Bq%3D0.9%2Cen-US%3Bq%3D0.8%2Cen%3Bq%3D0.7', 'authorization': 'bearer {}'.format(token), - 'origin': 'https://now.sportsnet.ca', 'referer': 'https://now.sportsnet.ca/', - 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36', - 'content-type': '', - 'Accept-Charset': '' + 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36' }; header_str = '&'.join(["{}={}".format(k, v) for k, v in headers.items()]) lic_srv = 'https://prod-lic2widevine.sd-ngp.net/proxy|{0}|R{{SSM}}|'.format(header_str) name = values['name'][0] + log ("Trying to play '" + values['name'][0] + "' with license server string '" + lic_srv + "'") + inputstream_helper = inputstreamhelper.Helper('mpd', drm='widevine') if inputstream_helper.check_inputstream(): li = xbmcgui.ListItem(name) @@ -146,7 +150,7 @@ def getChannelStream(channelId, channelName, msoName): stream = sn.getChannel(channelId, channelName, msoName) if not stream: # auth token may have expired - attempt re-auth first - print('Auth token may have expired. Attempting re-auth.') + log ("Auth token may have expired. Attempting re-auth.") creds = getAuthCredentials() if sn.authorize(creds['u'], creds['p'], creds['m']): return sn.getChannel(channelId, channelName, msoName) diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml index 1982bce..1becddd 100644 --- a/resources/language/English/strings.xml +++ b/resources/language/English/strings.xml @@ -15,4 +15,5 @@ Username Password Cable Provider + Turn on LOGNOTICE logging? diff --git a/resources/settings.xml b/resources/settings.xml index 1657895..986658c 100644 --- a/resources/settings.xml +++ b/resources/settings.xml @@ -3,4 +3,5 @@ + diff --git a/rogers.py b/rogers.py index e402a1b..dd51c82 100644 --- a/rogers.py +++ b/rogers.py @@ -1,5 +1,6 @@ import urllib, urllib2, re from cookies import Cookies +from settings import log class Rogers: """ @@ -33,7 +34,7 @@ def authorize(streamProvider, username, password): try: resp = opener.open(uri) except: - print "Unable get OAUTH location" + log ("Unable get OAUTH location", True) return None Cookies.saveCookieJar(jar) @@ -79,7 +80,7 @@ def getOAuthToken(username, password, viewstate, viewstategen, validation, url): try: resp = opener.open(url, urllib.urlencode(values)) except urllib2.URLError, e: - print e.args + log (e.args, True) Cookies.saveCookieJar(jar) return True \ No newline at end of file diff --git a/settings.py b/settings.py index 21b8908..b85e2b5 100644 --- a/settings.py +++ b/settings.py @@ -1,12 +1,18 @@ -import os, json +import os, json, xbmcaddon +__settings__ = xbmcaddon.Addon(id='plugin.video.snnow') +noticeloglevel = __settings__.getSetting("LOGNOTICElevel") def log(msg, error = False): + full_msg = "plugin.video.snnow: {0}".format(msg) try: import xbmc - full_msg = "plugin.video.mlslive: {0}".format(msg) xbmc.log(full_msg, level=xbmc.LOGERROR if error else xbmc.LOGINFO) - except: - print msg + if noticeloglevel == "Yes": + xbmc.log(full_msg, level=xbmc.LOGERROR if error else xbmc.LOGNOTICE) + else: + xbmc.log(full_msg, level=xbmc.LOGERROR if error else xbmc.LOGDEBUG) + except Exception as e: + xbmc.log(e, level= xbmc.LOGDEBUG) class Settings: diff --git a/snnow.py b/snnow.py index 41895a7..cadc3d7 100644 --- a/snnow.py +++ b/snnow.py @@ -79,7 +79,7 @@ def checkMSOs(self): try: resp = opener.open(self.AUTHORIZED_MSO_URI) except: - print "Unable get OAUTH location" + log("Unable get OAUTH location", True) return None Cookies.saveCookieJar(jar) @@ -113,7 +113,7 @@ def getGuideData(self): try: resp = opener.open(url) except urllib2.URLError, e: - print e.args + log(e.args, True) return None Cookies.saveCookieJar(jar) @@ -171,7 +171,7 @@ def getChannels(self): try: resp = opener.open(self.CONFIG_URI) except urllib2.URLError, e: - print e.args + log(e.args, True) return None Cookies.saveCookieJar(jar) @@ -193,12 +193,12 @@ def authorize(self, username, password, msoName='Rogers'): # Get the MSO class from the mso = MSOFactory.getMSO(msoName) if mso == None: - print "Invalid MSO" + log("Invalid MSO", True) return None # Authorize with the MSO if not mso.authorize(self, username, password): - print "Failed to authorize with MSO" + log ("Failed to authorize with MSO", True) return False channels = self.getChannels() @@ -206,12 +206,12 @@ def authorize(self, username, password, msoName='Rogers'): return True if not AdobePass.sessionDevice(self): - print "Session device failed." + log ("Session device failed.", True) return False result = AdobePass.preAuthorize(self, channels) if not result: - print "Preauthorize failed." + log ("Preauthorize failed.", True) return False return True @@ -231,7 +231,7 @@ def getChannel(self, id, name, msoName): """ mso = MSOFactory.getMSO(msoName) if mso == None: - print "Invalid MSO" + log ("Invalid MSO", True) return None mso_id = mso.getID() @@ -239,7 +239,7 @@ def getChannel(self, id, name, msoName): if mso_id != 'Sportsnet': ap = AdobePass() if not ap.authorizeDevice(self, mso_id, name): - print "Authorize device failed" + log ("Authorize device failed", True) return None token = AdobePass.deviceShortAuthorize(self, msoName) diff --git a/sportsnet.py b/sportsnet.py index 6f977ee..ab120fc 100644 --- a/sportsnet.py +++ b/sportsnet.py @@ -1,5 +1,6 @@ import urllib, urllib2, time, json, re from cookies import Cookies +from settings import log class Sportsnet: """ @@ -51,7 +52,7 @@ def mvpd(): resp = opener.open('https://now.sportsnet.ca/mvpd?', urllib.urlencode(values)) except: - print "Unable to login with mvpd" + log ("Unable to login with mvpd", True) return False res = resp.read() @@ -70,7 +71,7 @@ def signinmvpd(): resp = opener.open('https://now.sportsnet.ca/signinmvpd?', urllib.urlencode(values)) except: - print "Unable to login with signinmvpd" + log ("Unable to login with signinmvpd", True) return False res = resp.read() @@ -90,7 +91,7 @@ def callback(username, password): try: resp = opener.open('https://now.sportsnet.ca/secure/mvpd/myrogers?'+urllib.urlencode(values)) except: - print "Unable to login with signinmvpd" + log ("Unable to login with signinmvpd", True) return False res = resp.read()