jellyfin-kodi/resources/lib/ga_client.py

133 lines
4.1 KiB
Python

import sys
import os
import traceback
import requests
import logging
import clientinfo
import md5
import xbmc
import platform
import xbmcgui
from utils import window, settings, language as lang
log = logging.getLogger("EMBY."+__name__)
# for info on the metrics that can be sent to Google Analytics
# https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#events
class GoogleAnalytics():
testing = False
def __init__(self):
client_info = clientinfo.ClientInfo()
self.version = client_info.get_version()
self.device_id = client_info.get_device_id()
self.userAgent = "Kodi (" + self.getUserAgentOS() + ")"
# Use set user name
self.user_name = settings('username') or settings('connectUsername') or 'None'
# use md5 for client and user for analytics
self.device_id = md5.new(self.device_id).hexdigest()
self.user_name = md5.new(self.user_name).hexdigest()
# resolution
self.height = xbmcgui.Window(10000).getHeight()
self.width = xbmcgui.Window(10000).getWidth()
def getUserAgentOS(self):
if xbmc.getCondVisibility('system.platform.osx'):
return "OSX"
elif xbmc.getCondVisibility('system.platform.ios'):
return "iOS"
elif xbmc.getCondVisibility('system.platform.windows'):
return "Windows"
elif xbmc.getCondVisibility('system.platform.android'):
return "Android"
elif xbmc.getCondVisibility('system.platform.linux.raspberrypi'):
return "Linux"
elif xbmc.getCondVisibility('system.platform.linux'):
return "Linux"
else:
return "Other"
def formatException(self):
exc_type, exc_obj, exc_tb = sys.exc_info()
stackFrames = traceback.extract_tb(exc_tb)
if(len(stackFrames) > 0):
stackFrames = traceback.extract_tb(exc_tb)[-1]
else:
stackFrames = None
log.error(str(stackFrames))
errorType = "NA"
errorFile = "NA"
if(stackFrames != None):
fileName = os.path.split(stackFrames[0])[1]
errorFile = "%s:%s(%s)(%s)" % (fileName, stackFrames[1], exc_obj.message, stackFrames[3].strip())
errorFile = errorFile[0:499]
errorType = "%s" % (exc_type.__name__)
del(exc_type, exc_obj, exc_tb)
log.error(errorType + " - " + errorFile)
return errorType, errorFile
def sendEventData(self, eventCategory, eventAction, eventLabel=None):
# all the data we can send to Google Analytics
data = {}
data['v'] = '1'
data['tid'] = 'UA-85356267-1' # tracking id, this is the account ID
data['ds'] = 'plugin' # data source
data['an'] = 'Kodi4Emby' # App Name
data['aid'] = '1' # App ID
data['av'] = self.version # App Version
#data['aiid'] = '1.1' # App installer ID
data['cid'] = self.device_id # Client ID
#data['uid'] = self.user_name # User ID
data['ua'] = self.userAgent # user agent string
data['t'] = 'event' # action type
data['ec'] = eventCategory # Event Category
data['ea'] = eventAction # Event Action
# add width and height
data['sr'] = str(self.width) + "x" + str(self.height)
if(eventLabel != None):
data['el'] = eventLabel # Event Label
self.sendData(data)
def sendData(self, data):
log.info("GA: " + str(data))
if(settings('metricLogging') == "false"):
return
if(self.testing):
url = "https://www.google-analytics.com/debug/collect" # test URL
else:
url = "https://www.google-analytics.com/collect" # prod URL
try:
r = requests.post(url, data)
except Exception as error:
log.error(error)
if(self.testing):
log.info("GA: " + r.text.encode('utf-8'))