################################################################################ # Copyright (C) 2015 Surfacingx # # # # This Program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2, or (at your option) # # any later version. # # # # This Program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License # # along with XBMC; see the file COPYING. If not, write to # # the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. # # http://www.gnu.org/copyleft/gpl.html # ################################################################################ import os import xbmc, xbmcgui, xbmcvfs import re import uservar import time from datetime import date, datetime, timedelta from resources.libs import wizard as wiz transPath = xbmcvfs.translatePath LOGNOTICE = xbmc.LOGINFO ADDON_ID = uservar.ADDON_ID ADDONTITLE = uservar.ADDONTITLE ADDON = wiz.addonId(ADDON_ID) DIALOG = xbmcgui.Dialog() HOME = transPath('special://home/') ADDONS = os.path.join(HOME, 'addons') USERDATA = os.path.join(HOME, 'userdata') PLUGIN = os.path.join(ADDONS, ADDON_ID) PACKAGES = os.path.join(ADDONS, 'packages') ADDONDATA = os.path.join(USERDATA, 'addon_data', ADDON_ID) ADDOND = os.path.join(USERDATA, 'addon_data') REALFOLD = os.path.join(ADDONDATA, 'debrid') ICON = os.path.join(PLUGIN, 'icon.png') TODAY = date.today() TOMORROW = TODAY + timedelta(days=1) THREEDAYS = TODAY + timedelta(days=3) KEEPTRAKT = wiz.getS('keepdebrid') REALSAVE = wiz.getS('debridlastsave') COLOR1 = uservar.COLOR1 COLOR2 = uservar.COLOR2 ORDER = ['gaia', 'gaiapm', 'premiumizer', 'serenrd', 'serenpm', 'rurlrd', 'rurlpm','shadowrd', 'myaccountsrd', 'myaccountspm', 'myaccountsad', 'urlrd', 'urlpm'] DEBRIDID = { 'gaia': { 'name' : 'Gaia RD', 'plugin' : 'plugin.video.gaia', 'saved' : 'gaiard', 'path' : os.path.join(ADDONS, 'plugin.video.gaia'), 'icon' : os.path.join(ADDONS, 'plugin.video.gaia', 'icon.png'), 'fanart' : os.path.join(ADDONS, 'plugin.video.gaia', 'fanart.jpg'), 'file' : os.path.join(REALFOLD, 'gaia_debrid'), 'settings' : os.path.join(ADDOND, 'plugin.video.gaia', 'settings.xml'), 'default' : 'accounts.debrid.realdebrid.id', 'data' : ['accounts.debrid.realdebrid.auth', 'accounts.debrid.realdebrid.enabled', 'accounts.debrid.realdebrid.id', 'accounts.debrid.realdebrid.refresh', 'accounts.debrid.realdebrid.secret', 'accounts.debrid.realdebrid.token'], 'activate' : 'RunPlugin(plugin://plugin.video.gaia/?action=realdebridAuthentication)'}, 'gaiapm': { 'name' : 'Gaia PM', 'plugin' : 'plugin.video.gaia', 'saved' : 'gaiapm', 'path' : os.path.join(ADDONS, 'plugin.video.gaia'), 'icon' : os.path.join(ADDONS, 'plugin.video.gaia', 'icon.png'), 'fanart' : os.path.join(ADDONS, 'plugin.video.gaia', 'fanart.jpg'), 'file' : os.path.join(REALFOLD, 'gaia_pm'), 'settings' : os.path.join(ADDOND, 'plugin.video.gaia', 'settings.xml'), 'default' : 'accounts.debrid.premiumize.user', 'data' : [ 'accounts.debrid.premiumize.enabled', 'accounts.debrid.premiumize.user', 'accounts.debrid.premiumize.pin'], 'activate' : 'RunPlugin(plugin://plugin.video.gaia/?action=premiumizeSettings)'}, 'serenrd': { 'name' : 'Seren RD', 'plugin' : 'plugin.video.seren', 'saved' : 'serenrd', 'path' : os.path.join(ADDONS, 'plugin.video.seren'), 'icon' : os.path.join(ADDONS, 'plugin.video.seren', 'temp-icon.png'), 'fanart' : os.path.join(ADDONS, 'plugin.video.seren', 'temp-fanart.png'), 'file' : os.path.join(REALFOLD, 'seren_rd'), 'settings' : os.path.join(ADDOND, 'plugin.video.seren', 'settings.xml'), 'default' : 'rd.username', 'data' : [ 'rd.auth', 'rd.client_id', 'rd.expiry', 'rd.refresh', 'rd.secret', 'rd.username', 'realdebrid.enabled'], 'activate' : 'RunPlugin(plugin://plugin.video.seren/?action=authRealDebrid)'}, 'serenpm': { 'name' : 'Seren PM', 'plugin' : 'plugin.video.seren', 'saved' : 'serenpm', 'path' : os.path.join(ADDONS, 'plugin.video.seren'), 'icon' : os.path.join(ADDONS, 'plugin.video.seren', 'temp-icon.png'), 'fanart' : os.path.join(ADDONS, 'plugin.video.seren', 'temp-fanart.png'), 'file' : os.path.join(REALFOLD, 'seren_pm'), 'settings' : os.path.join(ADDOND, 'plugin.video.seren', 'settings.xml'), 'default' : 'premiumize.pin', 'data' : ['premiumize.enabled', 'premiumize.pin'], 'activate' : 'RunPlugin(plugin.video.seren/?action=openSettings)'}, 'urlrd': { 'name' : 'URLResolver RD', 'plugin' : 'script.module.urlresolver', 'saved' : 'urlrd', 'path' : os.path.join(ADDONS, 'script.module.urlresolver'), 'icon' : os.path.join(ADDONS, 'script.module.urlresolver', 'icon.png'), 'fanart' : os.path.join(ADDONS, 'script.module.urlresolver', 'fanart.jpg'), 'file' : os.path.join(REALFOLD, 'url_debrid'), 'settings' : os.path.join(ADDOND, 'script.module.urlresolver', 'settings.xml'), 'default' : 'RealDebridResolver_client_id', 'data' : ['RealDebridResolver_autopick', 'RealDebridResolver_client_id', 'RealDebridResolver_client_secret', 'RealDebridResolver_enabled', 'RealDebridResolver_login', 'RealDebridResolver_priority', 'RealDebridResolver_refresh', 'RealDebridResolver_token', 'RealDebridResolver_torrents'], 'activate' : 'RunPlugin(plugin://script.module.urlresolver/?mode=auth_rd)'}, 'rurlrd': { 'name' : 'ResolveURL RD', 'plugin' : 'script.module.resolveurl', 'saved' : 'rurlrd', 'path' : os.path.join(ADDONS, 'script.module.resolveurl'), 'icon' : os.path.join(ADDONS, 'script.module.resolveurl', 'icon.png'), 'fanart' : os.path.join(ADDONS, 'script.module.resolveurl', 'fanart.jpg'), 'file' : os.path.join(REALFOLD, 'resurl_debrid'), 'settings' : os.path.join(ADDOND, 'script.module.resolveurl', 'settings.xml'), 'default' : 'RealDebridResolver_client_id', 'data' : ['RealDebridResolver_autopick', 'RealDebridResolver_client_id', 'RealDebridResolver_client_secret', 'RealDebridResolver_enabled', 'RealDebridResolver_login', 'RealDebridResolver_priority', 'RealDebridResolver_refresh', 'RealDebridResolver_token', 'RealDebridResolver_torrents', 'RealDebridResolver_cached_only'], 'activate' : 'RunPlugin(plugin://script.module.resolveurl/?mode=auth_rd)'}, 'urlpm': { 'name' : 'URLResolver PM', 'plugin' : 'script.module.urlresolver', 'saved' : 'urlpm', 'path' : os.path.join(ADDONS, 'script.module.urlresolver'), 'icon' : os.path.join(ADDONS, 'script.module.urlresolver', 'icon.png'), 'fanart' : os.path.join(ADDONS, 'script.module.urlresolver', 'fanart.jpg'), 'file' : os.path.join(REALFOLD, 'pmurl_debrid'), 'settings' : os.path.join(ADDOND, 'script.module.urlresolver', 'settings.xml'), 'default' : 'PremiumizeMeResolver_password', 'data' : ['PremiumizeMeResolver_enabled', 'PremiumizeMeResolver_login', 'PremiumizeMeResolver_password', 'PremiumizeMeResolver_priority', 'PremiumizeMeResolver_torrents'], 'activate' : ''}, 'rurlpm': { 'name' : 'ResolveURL PM', 'plugin' : 'script.module.resolveurl', 'saved' : 'rurlpm', 'path' : os.path.join(ADDONS, 'script.module.resolveurl'), 'icon' : os.path.join(ADDONS, 'script.module.resolveurl', 'icon.png'), 'fanart' : os.path.join(ADDONS, 'script.module.resolveurl', 'fanart.jpg'), 'file' : os.path.join(REALFOLD, 'pmrurl_debrid'), 'settings' : os.path.join(ADDOND, 'script.module.resolveurl', 'settings.xml'), 'default' : 'PremiumizeMeResolver_token', 'data' : ['PremiumizeMeResolver_enabled', 'PremiumizeMeResolver_priority', 'PremiumizeMeResolver_token', 'PremiumizeMeResolver_torrents', 'PremiumizeMeResolver_cached_only'], 'activate' : ''}, 'premiumizer': { 'name' : 'Premiumizer', 'plugin' : 'plugin.video.premiumizer', 'saved' : 'premiumizer', 'path' : os.path.join(ADDONS, 'plugin.video.premiumizer'), 'icon' : os.path.join(ADDONS, 'plugin.video.premiumizer', 'icon.png'), 'fanart' : os.path.join(ADDONS, 'plugin.video.premiumizer', 'fanart.jpg'), 'file' : os.path.join(REALFOLD, 'premiumizer_debrid'), 'settings' : os.path.join(ADDOND, 'plugin.video.premiumizer', 'settings.xml'), 'default' : 'premiumize.token', 'data' : ['premiumize.status', 'premiumize.token', 'premiumize.refresh'], 'activate' : 'RunPlugin(plugin://plugin.video.premiumizer/?action=authPremiumize)'}, 'shadowrd': { 'name' : 'Shadow RD', 'plugin' : 'plugin.video.shadow', 'saved' : 'shadowrd', 'path' : os.path.join(ADDONS, 'plugin.video.shadow'), 'icon' : os.path.join(ADDONS, 'plugin.video.shadow', 'icon.png'), 'fanart' : os.path.join(ADDONS, 'plugin.video.shadow', 'fanart.png'), 'file' : os.path.join(REALFOLD, 'shadow_rdebrid'), 'settings' : os.path.join(ADDOND, 'plugin.video.shadow', 'settings.xml'), 'default' : 'rd.client_id', 'data' : ['rd.auth', 'rd.refresh', 'rd.client_id', 'rd.secret'], 'activate' : 'RunPlugin(plugin://plugin.video.shadow?mode=138&url=www)'}, 'myaccountsrd': { 'name' : 'My Accounts RealDebrid', 'plugin' : 'script.module.myaccounts', 'saved' : 'myaccountsrd', 'path' : os.path.join(ADDONS, 'script.module.myaccounts'), 'icon' : os.path.join(ADDONS, 'script.module.myaccounts', 'icon.png'), 'fanart' : os.path.join(ADDONS, 'script.module.myaccounts', 'fanart.png'), 'file' : os.path.join(REALFOLD, 'myaccounts_realdebrid'), 'settings' : os.path.join(ADDOND, 'script.module.myaccounts', 'settings.xml'), 'default' : 'realdebrid.username', 'data' : ['realdebrid.username', 'realdebrid.token', 'realdebrid.refresh', 'realdebrid.client_id', 'realdebrid.secret'], 'activate' : 'RunScript(script.module.myaccounts, action=realdebridAuth)'}, 'myaccountspm': { 'name' : 'My Accounts Premiumize', 'plugin' : 'script.module.myaccounts', 'saved' : 'myaccountspm', 'path' : os.path.join(ADDONS, 'script.module.myaccounts'), 'icon' : os.path.join(ADDONS, 'script.module.myaccounts', 'icon.png'), 'fanart' : os.path.join(ADDONS, 'script.module.myaccounts', 'fanart.png'), 'file' : os.path.join(REALFOLD, 'myaccounts_premiumize'), 'settings' : os.path.join(ADDOND, 'script.module.myaccounts', 'settings.xml'), 'default' : 'premiumize.username', 'data' : ['premiumize.username', 'premiumize.token'], 'activate' : 'RunScript(script.module.myaccounts, action=premiumizeAuth)'}, 'myaccountsad': { 'name' : 'My Accounts AllDebrid', 'plugin' : 'script.module.myaccounts', 'saved' : 'myaccountsad', 'path' : os.path.join(ADDONS, 'script.module.myaccounts'), 'icon' : os.path.join(ADDONS, 'script.module.myaccounts', 'icon.png'), 'fanart' : os.path.join(ADDONS, 'script.module.myaccounts', 'fanart.png'), 'file' : os.path.join(REALFOLD, 'myaccounts_alldebrid'), 'settings' : os.path.join(ADDOND, 'script.module.myaccounts', 'settings.xml'), 'default' : 'alldebrid.username', 'data' : ['alldebrid.username', 'alldebrid.token'], 'activate' : 'RunScript(script.module.myaccounts, action=alldebridAuth)'} } def debridUser(who): user=None if DEBRIDID[who]: if os.path.exists(DEBRIDID[who]['path']): try: add = wiz.addonId(DEBRIDID[who]['plugin']) user = add.getSetting(DEBRIDID[who]['default']) except: pass return user def debridIt(do, who): if not os.path.exists(ADDONDATA): os.makedirs(ADDONDATA) if not os.path.exists(REALFOLD): os.makedirs(REALFOLD) if who == 'all': for log in ORDER: if os.path.exists(DEBRIDID[log]['path']): try: addonid = wiz.addonId(DEBRIDID[log]['plugin']) default = DEBRIDID[log]['default'] user = addonid.getSetting(default) if user == '' and do == 'update': continue updateDebrid(do, log) except: pass else: wiz.log('[Debrid Info] %s(%s) is not installed' % (DEBRIDID[log]['name'],DEBRIDID[log]['plugin']), xbmc.LOGERROR) wiz.setS('debridlastsave', str(THREEDAYS)) else: if DEBRIDID[who]: if os.path.exists(DEBRIDID[who]['path']): updateDebrid(do, who) else: wiz.log('[Debrid Info] Invalid Entry: %s' % who, xbmc.LOGERROR) def clearSaved(who, over=False): if who == 'all': for debrid in DEBRIDID: clearSaved(debrid, True) elif DEBRIDID[who]: file = DEBRIDID[who]['file'] if os.path.exists(file): xbmcvfs.delete(file) wiz.LogNotify('[COLOR %s]%s[/COLOR]' % (COLOR1, DEBRIDID[who]['name']),'[COLOR %s]Debrid Info: Removed![/COLOR]' % COLOR2, 2000, DEBRIDID[who]['icon']) wiz.setS(DEBRIDID[who]['saved'], '') if over == False: wiz.refresh() def updateDebrid(do, who): file = DEBRIDID[who]['file'] settings = DEBRIDID[who]['settings'] data = DEBRIDID[who]['data'] addonid = wiz.addonId(DEBRIDID[who]['plugin']) saved = DEBRIDID[who]['saved'] default = DEBRIDID[who]['default'] user = addonid.getSetting(default) suser = wiz.getS(saved) name = DEBRIDID[who]['name'] icon = DEBRIDID[who]['icon'] if do == 'update': if not user == '': try: with xbmcvfs.File(file, 'w') as f: for debrid in data: f.write('\n\t%s\n\t%s\n\n' % (debrid, addonid.getSetting(debrid))) f.close() user = addonid.getSetting(default) wiz.setS(saved, user) wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, name), '[COLOR %s]Debrid Info: Saved![/COLOR]' % COLOR2, 2000, icon) except Exception as e: wiz.log("[Debrid Info] Unable to Update %s (%s)" % (who, str(e)), xbmc.LOGERROR) else: wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, name), '[COLOR %s]Debrid Info: Not Registered![/COLOR]' % COLOR2, 2000, icon) elif do == 'restore': if os.path.exists(file): f = xbmcvfs.File(file); g = f.read().replace('\n','').replace('\r','').replace('\t',''); f.close(); match = re.compile('(.+?)(.+?)').findall(g) try: if len(match) > 0: for debrid, value in match: addonid.setSetting(debrid, value) user = addonid.getSetting(default) wiz.setS(saved, user) wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, name), '[COLOR %s]Debrid Info: Restored![/COLOR]' % COLOR2, 2000, icon) except Exception as e: wiz.log("[Debrid Info] Unable to Restore %s (%s)" % (who, str(e)), xbmc.LOGERROR) #else: wiz.LogNotify(name,'Real Debrid Info: [COLOR red]Not Found![/COLOR]', 2000, icon) elif do == 'clearaddon': wiz.log('%s SETTINGS: %s' % (name, settings), xbmc.LOGDEBUG) if os.path.exists(settings): try: f = open(settings, "r"); lines = f.readlines(); f.close() f = open(settings, "w") for line in lines: match = wiz.parseDOM(line, 'setting', ret='id') if len(match) == 0: f.write(line) else: if match[0] not in data: f.write(line) else: wiz.log('Removing Line: %s' % line, LOGNOTICE) f.close() wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, name),'[COLOR %s]Addon Data: Cleared![/COLOR]' % COLOR2, 2000, icon) except Exception as e: wiz.log("[Debrid Info] Unable to Clear Addon %s (%s)" % (who, str(e)), xbmc.LOGERROR) wiz.refresh() def autoUpdate(who): if who == 'all': for log in DEBRIDID: if os.path.exists(DEBRIDID[log]['path']): autoUpdate(log) elif DEBRIDID[who]: if os.path.exists(DEBRIDID[who]['path']): u = debridUser(who) su = wiz.getS(DEBRIDID[who]['saved']) n = DEBRIDID[who]['name'] if u == None or u == '': return elif su == '': debridIt('update', who) elif not u == su: if DIALOG.yesno(ADDONTITLE, "[COLOR %s]Would you like to save the [COLOR %s]Debrid Account[/COLOR] data for [COLOR %s]%s[/COLOR]?" % (COLOR2, COLOR1, COLOR1, n), "Addon: [COLOR springgreen][B]%s[/B][/COLOR]" % u, "Saved:[/COLOR] [COLOR red][B]%s[/B][/COLOR]" % su if not su == '' else 'Saved:[/COLOR] [COLOR red][B]None[/B][/COLOR]', yeslabel="[B][COLOR springgreen]Save Data[/COLOR][/B]", nolabel="[B][COLOR red]No Cancel[/COLOR][/B]"): debridIt('update', who) else: debridIt('update', who) def importlist(who): if who == 'all': for log in DEBRIDID: if os.path.exists(DEBRIDID[log]['file']): importlist(log) elif DEBRIDID[who]: if os.path.exists(DEBRIDID[who]['file']): d = DEBRIDID[who]['default'] sa = DEBRIDID[who]['saved'] su = wiz.getS(sa) n = DEBRIDID[who]['name'] f = xbmcvfs.File(DEBRIDID[who]['file']); g = f.read().replace('\n','').replace('\r','').replace('\t',''); f.close(); m = re.compile('%s(.+?)' % d).findall(g) if len(m) > 0: if not m[0] == su: if DIALOG.yesno(ADDONTITLE, "[COLOR %s]Would you like to import the [COLOR %s]Debrid Account[/COLOR] data for [COLOR %s]%s[/COLOR]?" % (COLOR2, COLOR1, COLOR1, n), "File: [COLOR springgreen][B]%s[/B][/COLOR]" % m[0], "Saved:[/COLOR] [COLOR red][B]%s[/B][/COLOR]" % su if not su == '' else 'Saved:[/COLOR] [COLOR red][B]None[/B][/COLOR]', yeslabel="[B][COLOR springgreen]Save Data[/COLOR][/B]", nolabel="[B][COLOR red]No Cancel[/COLOR][/B]"): wiz.setS(sa, m[0]) wiz.log('[Import Data] %s: %s' % (who, str(m)), LOGNOTICE) else: wiz.log('[Import Data] Declined Import(%s): %s' % (who, str(m)), LOGNOTICE) else: wiz.log('[Import Data] Duplicate Entry(%s): %s' % (who, str(m))), LOGNOTICE else: wiz.log('[Import Data] No Match(%s): %s' % (who, str(m)), LOGNOTICE) def activateDebrid(who): if DEBRIDID[who]: if os.path.exists(DEBRIDID[who]['path']): act = DEBRIDID[who]['activate'] addonid = wiz.addonId(DEBRIDID[who]['plugin']) if act == '': addonid.openSettings() else: url = xbmc.executebuiltin(DEBRIDID[who]['activate']) else: DIALOG.ok(ADDONTITLE, '%s is not currently installed.' % DEBRIDID[who]['name']) else: wiz.refresh() return check = 0 while debridUser(who) == None: if check == 30: break check += 1 time.sleep(10) wiz.refresh()