Files
DevOps/Kodi/Lenovo/addons/script.embuary.info/resources/lib/helper.py

310 lines
7.3 KiB
Python

#!/usr/bin/python
# coding: utf-8
########################
import xbmc
import xbmcaddon
import xbmcgui
import xbmcplugin
import json
import time
import datetime
import os
import operator
import arrow
import sys
import simplecache
import hashlib
########################
ADDON = xbmcaddon.Addon()
ADDON_ID = ADDON.getAddonInfo('id')
ADDON_VERSION = ADDON.getAddonInfo('version')
ADDON_PATH = ADDON.getAddonInfo('path')
INFO = xbmc.LOGINFO
WARNING = xbmc.LOGWARNING
DEBUG = xbmc.LOGDEBUG
ERROR = xbmc.LOGERROR
DIALOG = xbmcgui.Dialog()
COUNTRY_CODE = ADDON.getSettingString('country_code')
DEFAULT_LANGUAGE = ADDON.getSettingString('language_code')
FALLBACK_LANGUAGE = 'en'
CACHE = simplecache.SimpleCache()
CACHE.enable_mem_cache = False
CACHE.data_is_json = True
CACHE_ENABLED = ADDON.getSettingBool('cache_enabled')
CACHE_PREFIX = ADDON_ID + '_' + ADDON_VERSION + '_' + DEFAULT_LANGUAGE + COUNTRY_CODE + '_'
#TIMEZONE = 'US/Alaska'
TIMEZONE = 'local'
########################
def log(txt,loglevel=DEBUG,json=False,force=False):
if force:
loglevel = INFO
if json:
txt = json_prettyprint(txt)
message = u'[ %s ] %s' % (ADDON_ID,txt)
xbmc.log(msg=message, level=loglevel)
def get_cache(key):
if CACHE_ENABLED:
return CACHE.get(CACHE_PREFIX + key)
def write_cache(key,data,cache_time=336):
if data:
CACHE.set(CACHE_PREFIX + key, data, expiration=datetime.timedelta(hours=cache_time))
def format_currency(integer):
try:
integer = int(integer)
if integer < 1:
raise Exception
return '{:,.0f}'.format(integer)
except Exception:
return ''
def sort_dict(items,key,reverse=False):
''' Dummy date to always add planned or rumored items at the end of the list
if no release date is available yet.
'''
for item in items:
if not item.get(key):
if not reverse:
item[key] = '2999-01-01'
else:
item[key] = '1900-01-01'
return sorted(items, key=operator.itemgetter(key),reverse=reverse)
def remove_quotes(label):
if not label:
return ''
if label.startswith("'") and label.endswith("'") and len(label) > 2:
label = label[1:-1]
if label.startswith('"') and label.endswith('"') and len(label) > 2:
label = label[1:-1]
return label
def get_date(date_time):
date_time_obj = datetime.datetime.strptime(date_time, '%Y-%m-%d %H:%M:%S')
date_obj = date_time_obj.date()
return date_obj
def execute(cmd):
xbmc.executebuiltin(cmd)
def condition(condition):
return xbmc.getCondVisibility(condition)
def busydialog(close=False):
if not close and not condition('Window.IsVisible(busydialognocancel)'):
execute('ActivateWindow(busydialognocancel)')
elif close:
execute('Dialog.Close(busydialognocancel)')
def textviewer(params):
DIALOG.textviewer(remove_quotes(params.get('header', '')), remove_quotes(params.get('message', '')))
def winprop(key,value=None,clear=False,window_id=10000):
window = xbmcgui.Window(window_id)
if clear:
window.clearProperty(key.replace('.json', '').replace('.bool', ''))
elif value is not None:
if key.endswith('.json'):
key = key.replace('.json', '')
value = json.dumps(value)
elif key.endswith('.bool'):
key = key.replace('.bool', '')
value = 'true' if value else 'false'
window.setProperty(key, value)
else:
result = window.getProperty(key.replace('.json', '').replace('.bool', ''))
if result:
if key.endswith('.json'):
result = json.loads(result)
elif key.endswith('.bool'):
result = result in ('true', '1')
return result
def date_year(value):
if not value:
return value
try:
year = str(arrow.get(value).year)
except Exception:
pass
return year
def date_format(value,date='short'):
if not value:
return value
try:
date_time = arrow.get(value)
value = date_time.strftime(xbmc.getRegion('date%s' % date))
except Exception:
pass
return value
def date_delta(date):
date = arrow.get(date, 'YYYY-MM-DD').date()
return date - datetime.date.today()
def date_weekday(date=None):
if not date:
utc = arrow.utcnow()
date = utc.to(TIMEZONE).date()
try:
weekdays = (xbmc.getLocalizedString(11), xbmc.getLocalizedString(12), xbmc.getLocalizedString(13), xbmc.getLocalizedString(14), xbmc.getLocalizedString(15), xbmc.getLocalizedString(16), xbmc.getLocalizedString(17))
date = arrow.get(date).date()
weekday = date.weekday()
return weekdays[weekday], weekday
except Exception:
return '', ''
def utc_to_local(value):
conv_date = arrow.get(value).to(TIMEZONE)
conv_date_str = conv_date.strftime('%Y-%m-%d')
if xbmc.getRegion('time').startswith('%I'):
conv_time_str = conv_date.strftime('%I:%M %p')
else:
conv_time_str = conv_date.strftime('%H:%M')
return conv_date_str, conv_time_str
def get_bool(value,string='true'):
try:
if value.lower() == string:
return True
raise Exception
except Exception:
return False
def get_joined_items(item):
if len(item) > 0:
item = ' / '.join(item)
else:
item = ''
return item
def get_first_item(item):
if len(item) > 0:
item = item[0]
else:
item = ''
return item
def json_call(method,properties=None,sort=None,query_filter=None,limit=None,params=None,item=None,options=None,limits=None):
json_string = {'jsonrpc': '2.0', 'id': 1, 'method': method, 'params': {}}
if properties is not None:
json_string['params']['properties'] = properties
if limit is not None:
json_string['params']['limits'] = {'start': 0, 'end': int(limit)}
if sort is not None:
json_string['params']['sort'] = sort
if query_filter is not None:
json_string['params']['filter'] = query_filter
if options is not None:
json_string['params']['options'] = options
if limits is not None:
json_string['params']['limits'] = limits
if item is not None:
json_string['params']['item'] = item
if params is not None:
json_string['params'].update(params)
json_string = json.dumps(json_string)
result = xbmc.executeJSONRPC(json_string)
''' Python 2 compatibility
'''
try:
result = unicode(result, 'utf-8', errors='ignore')
except NameError:
pass
return json.loads(result)
def set_plugincontent(content=None,category=None):
if category:
xbmcplugin.setPluginCategory(int(sys.argv[1]), category)
if content:
xbmcplugin.setContent(int(sys.argv[1]), content)
def json_prettyprint(string):
return json.dumps(string, sort_keys=True, indent=4, separators=(',', ': '))
def urljoin(*args):
''' Joins given arguments into an url. Trailing but not leading slashes are
stripped for each argument.
'''
arglist = [arg for arg in args if arg is not None]
return '/'.join(map(lambda x: str(x).rstrip('/'), arglist))
def md5hash(value):
value = str(value).encode()
return hashlib.md5(value).hexdigest()