I am trying to implement a login function to my Kodi Wizard, but when I open the addon, it only shows blank directory, not the contents of my wizard.
What I am trying to do is, I will enter username and password via the kodi addon settings. Here is the settings xml that stores the username and password info (this is stored in the plugins resource folder named settings.xml
After entering username and password via Kodi in the addon settings menu, I open the wizard addon and directory is blank.
Can someone advise where in my code is causing it to behave this way please? Here is the Default.py code:
import xbmc, xbmcaddon, xbmcgui, xbmcplugin,os,sys
import shutil
import urllib2,urllib
import re
import extract
import time
import downloader
import plugintools
import zipfile
import ntpath
import base64
import os
import re
import urllib,urllib2
import cookielib
import weblogin
USER_AGENT = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3'
base='HotBoxz Media Center Wizard'
ADDON=xbmcaddon.Addon(id='plugin.program.test')
VERSION = "1.0.1"
PATH = "Example Wizard"
dp = xbmcgui.DialogProgress()
dialog = xbmcgui.Dialog()
EXCLUDES = ['plugin.program.test']
HOME = xbmc.translatePath('special://home/')
logged_in_string = 'Welcome to'
def LOGIN(username,password):
uc = username[0].upper() + username[1:]
lc = username.lower()
logged_in = weblogin.doLogin(__datapath__,username,password)
if logged_in == True:
link = OPEN_URL('http://example.com').replace('\n','').replace('\r','')
match = re.compile('name="(.+?)".+?rl="(.+?)".+?mg="(.+?)".+?anart="(.+?)".+?escription="(.+?)"').findall(link)
for name,url,iconimage,fanart,description in match:
addDir(name,url,1,iconimage,fanart,description)
setView('movies', 'MAIN')
addDir('FRESH START','url',6,'','','')
def check_login(source,username):
#the string you will use to check if the login is successful.
logged_in_string = 'Welcome to'
#search for the string in the html, without caring about upper or lower case
if re.search(logged_in_string,source,re.IGNORECASE):
return True
else:
return False
def doLogin(username, password):
if username and password:
login_url = 'http://p.xxe.press/login.php'
header_string = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3'
login_data = urllib.urlencode({'username':username, 'password':password})
req = urllib2.Request(login_url, login_data)
req.add_header('User-Agent',header_string)
response = opener.open(req)
source = response.read()
response.close()
login = check_login(source,username)
return login
else:
return False
def CATEGORIES(LOGIN):
usrsettings = xbmcaddon.Addon(id='plugin.program.test')
use_account = usrsettings.getSetting('use-account')
if use_account == 'true':
#get username and password and do login with them
#also get whether to hid successful login notification
username = usrsettings.getSetting('username')
password = usrsettings.getSetting('password')
if logged_in_string == True:
link = OPEN_URL('http://example.com').replace('\n','').replace('\r','')
match = re.compile('name="(.+?)".+?rl="(.+?)".+?mg="(.+?)".+?anart="(.+?)".+?escription="(.+?)"').findall(link)
for name,url,iconimage,fanart,description in match:
addDir(name,url,1,iconimage,fanart,description)
setView('movies', 'MAIN')
addDir('FRESH START','url',6,'','','')
def OPEN_URL(url):
req = urllib2.Request(url)
req.add_header('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3')
response = urllib2.urlopen(req)
link=response.read()
response.close()
return link
def wizard(name,url,description):
path = xbmc.translatePath(os.path.join('special://home/addons','packages'))
dp = xbmcgui.DialogProgress()
dp.create("Wizard","Wizard is Whizzing down your Wires ",'', 'Put the kettle on')
lib=os.path.join(path, name+'.zip')
try:
os.remove(lib)
except:
pass
downloader.download(url, lib, dp)
addonfolder = xbmc.translatePath(os.path.join('special://','home'))
time.sleep(2)
dp.update(0,"", "Extracting now, Please Wait")
print '======================================='
print addonfolder
print '======================================='
extract.all(lib,addonfolder,dp)
dialog = xbmcgui.Dialog()
dialog.ok("DOWNLOAD COMPLETE! ", 'To ensure all changes are saved, this app must close', 'Press OK to continue.')
killxbmc()
def killxbmc():
choice = xbmcgui.Dialog().yesno('Force Close', 'You are about to close', 'Would you like to continue?', nolabel='No, Cancel',yeslabel='Yes, Close')
if choice == 0:
return
elif choice == 1:
pass
myplatform = platform()
print "Platform: " + str(myplatform)
if myplatform == 'osx': # OSX
print "############ try osx force close #################"
try: os.system('killall -9 XBMC')
except: pass
try: os.system('killall -9 Kodi')
except: pass
dialog.ok("[COLOR=red][B]WARNING !!![/COLOR][/B]", "If you\'re seeing this message it means the force close", "was unsuccessful. Please force close XBMC/Kodi [COLOR=lime]DO NOT[/COLOR] exit cleanly via the menu.",'')
elif myplatform == 'linux': #Linux
print "############ try linux force close #################"
try: os.system('killall XBMC')
except: pass
try: os.system('killall Kodi')
except: pass
try: os.system('killall -9 xbmc.bin')
except: pass
try: os.system('killall -9 kodi.bin')
except: pass
dialog.ok("[COLOR=red][B]WARNING !!![/COLOR][/B]", "If you\'re seeing this message it means the force close", "was unsuccessful. Please force close XBMC/Kodi [COLOR=lime]DO NOT[/COLOR] exit cleanly via the menu.",'')
elif myplatform == 'android': # Android
print "############ try android force close #################"
try: os._exit(1)
except: pass
try: os._exit(1)
except: pass
try: os._exit(1)
except: pass
try: os._exit(1)
except: pass
dialog.ok("[COLOR=red][B]WARNING !!![/COLOR][/B]", "Your system has been detected as Android, you ", "[COLOR=yellow][B]MUST[/COLOR][/B] force close. [COLOR=lime]DO NOT[/COLOR] exit cleanly via the menu.","Pulling the power cable is the simplest method to force close.")
elif myplatform == 'windows': # Windows
print "############ try windows force close #################"
try:
os.system('@ECHO off')
os.system('tskill XBMC.exe')
except: pass
try:
os.system('@ECHO off')
os.system('tskill Kodi.exe')
except: pass
try:
os.system('@ECHO off')
os.system('TASKKILL /im Kodi.exe /f')
except: pass
try:
os.system('@ECHO off')
os.system('TASKKILL /im XBMC.exe /f')
except: pass
dialog.ok("[COLOR=red][B]WARNING !!![/COLOR][/B]", "If you\'re seeing this message it means the force close", "was unsuccessful. Please force close XBMC/Kodi [COLOR=lime]DO NOT[/COLOR] exit cleanly via the menu.","Use task manager and NOT ALT F4")
else: #ATV
print "############ try atv force close #################"
try: os.system('killall AppleTV')
except: pass
print "############ try raspbmc force close #################" #OSMC / Raspbmc
try: os.system('sudo initctl stop kodi')
except: pass
try: os.system('sudo initctl stop xbmc')
except: pass
dialog.ok("[COLOR=red][B]WARNING !!![/COLOR][/B]", "If you\'re seeing this message it means the force close", "was unsuccessful. Please force close XBMC/Kodi [COLOR=lime]DO NOT[/COLOR] exit via the menu.","Your platform could not be detected so just pull the power cable.")
def platform():
if xbmc.getCondVisibility('system.platform.android'):
return 'android'
elif xbmc.getCondVisibility('system.platform.linux'):
return 'linux'
elif xbmc.getCondVisibility('system.platform.windows'):
return 'windows'
elif xbmc.getCondVisibility('system.platform.osx'):
return 'osx'
elif xbmc.getCondVisibility('system.platform.atv2'):
return 'atv2'
elif xbmc.getCondVisibility('system.platform.ios'):
return 'ios'
def addDir(name,url,mode,iconimage,fanart,description):
u=sys.argv[0]+"?url="+urllib.quote_plus(url)+"&mode="+str(mode)+"&name="+urllib.quote_plus(name)+"&iconimage="+urllib.quote_plus(iconimage)+"&fanart="+urllib.quote_plus(fanart)+"&description="+urllib.quote_plus(description)
ok=True
liz=xbmcgui.ListItem(name, iconImage="DefaultFolder.png", thumbnailImage=iconimage)
liz.setInfo( type="Video", infoLabels={ "Title": name, "Plot": description } )
liz.setProperty( "Fanart_Image", fanart )
ok=xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz,isFolder=False)
return ok
def get_params():
param=[]
paramstring=sys.argv[2]
if len(paramstring)>=2:
params=sys.argv[2]
cleanedparams=params.replace('?','')
if (params[len(params)-1]=='/'):
params=params[0:len(params)-2]
pairsofparams=cleanedparams.split('&')
param={}
for i in range(len(pairsofparams)):
splitparams={}
splitparams=pairsofparams[i].split('=')
if (len(splitparams))==2:
param[splitparams[0]]=splitparams[1]
return param
def killxbmc():
choice = xbmcgui.Dialog().yesno('Force Close', 'We will now attempt to force close, Would you like to continue?', nolabel='No, Cancel',yeslabel='Yes, Close')
if choice == 0:
INDEX()
elif choice == 1:
pass
myplatform = platform()
print "Platform: " + str(myplatform)
if myplatform == 'osx': # OSX
print "############ try osx force close #################"
try: os.system('killall -9 XBMC')
except: pass
try: os.system('killall -9 Kodi')
except: pass
dialog.ok("[COLOR=red][B]WARNING !!![/COLOR][/B]", "If you\'re seeing this message it means the force close", "was unsuccessful. Please force close XBMC/Kodi [COLOR=lime]DO NOT[/COLOR] exit cleanly via the menu.",'')
elif myplatform == 'linux': #Linux
print "############ try linux force close #################"
try: os.system('killall XBMC')
except: pass
try: os.system('killall Kodi')
except: pass
try: os.system('killall -9 xbmc.bin')
except: pass
try: os.system('killall -9 kodi.bin')
except: pass
dialog.ok("[COLOR=red][B]WARNING !!![/COLOR][/B]", "If you\'re seeing this message it means the force close", "was unsuccessful. Please force close XBMC/Kodi [COLOR=lime]DO NOT[/COLOR] exit cleanly via the menu.",'')
elif myplatform == 'android': # Android
print "############ try android force close #################"
try: os._exit(1)
except: pass
try: os._exit(1)
except: pass
try: os._exit(1)
except: pass
try: os._exit(1)
except: pass
dialog.ok("[COLOR=red][B]WARNING !!![/COLOR][/B]", "Be prepared to unplug your device, you ", "[COLOR=yellow][B]MUST[/COLOR][/B] press OK then unplug power from device and restart for changes to take effect. [COLOR=lime]DO NOT[/COLOR] exit cleanly via the menu.","Pulling the power cable is the simplest method to force close.")
elif myplatform == 'windows': # Windows
print "############ try windows force close #################"
try:
os.system('@ECHO off')
os.system('tskill XBMC.exe')
except: pass
try:
os.system('@ECHO off')
os.system('tskill Kodi.exe')
except: pass
try:
os.system('@ECHO off')
os.system('TASKKILL /im Kodi.exe /f')
except: pass
try:
os.system('@ECHO off')
os.system('TASKKILL /im XBMC.exe /f')
except: pass
dialog.ok("[COLOR=red][B]WARNING !!![/COLOR][/B]", "If you\'re seeing this message it means the force close", "was unsuccessful. Please force close XBMC/Kodi [COLOR=lime]DO NOT[/COLOR] exit cleanly via the menu.","Use task manager and NOT ALT F4")
else: #ATV
print "############ try atv force close #################"
try: os.system('killall AppleTV')
except: pass
print "############ try raspbmc force close #################" #OSMC / Raspbmc
try: os.system('sudo initctl stop kodi')
except: pass
try: os.system('sudo initctl stop xbmc')
except: pass
dialog.ok("[COLOR=red][B]WARNING !!![/COLOR][/B]", "If you\'re seeing this message it means the force close", "was unsuccessful. Please force close XBMC/Kodi [COLOR=lime]DO NOT[/COLOR] exit via the menu.","Your platform could not be detected so just pull the power cable.")
def FRESHSTART(params):
choice2 = xbmcgui.Dialog().yesno("Are you sure?", 'Are you sure you want to wipe this install?', '', 'All addons EXCLUDING this Media Center Wizard will be completely wiped!', yeslabel='Yes',nolabel='No')
if choice2 == 0:
return
elif choice2 == 1:
dp.create("Please Wait","FRESHSTART IN PROGRESS",'', 'Please Wait, Wizard will close when complete')
try:
for root, dirs, files in os.walk(HOME,topdown=True):
dirs[:] = [d for d in dirs if d not in EXCLUDES]
for name in files:
try:
os.remove(os.path.join(root,name))
os.rmdir(os.path.join(root,name))
except: pass
for name in dirs:
try: os.rmdir(os.path.join(root,name)); os.rmdir(root)
except: pass
except: pass
dialog.ok('Completed','FreshStart Successful, Press ok to close, you will need to reopen the App for changes to take effect...','','')
xbmc.executebuiltin('XBMC.Reset')
params=get_params()
url=None
name=None
mode=None
iconimage=None
fanart=None
description=None
try:
url=urllib.unquote_plus(params["url"])
except:
pass
try:
name=urllib.unquote_plus(params["name"])
except:
pass
try:
iconimage=urllib.unquote_plus(params["iconimage"])
except:
pass
try:
mode=int(params["mode"])
except:
pass
try:
fanart=urllib.unquote_plus(params["fanart"])
except:
pass
try:
description=urllib.unquote_plus(params["description"])
except:
pass
print str(PATH)+': '+str(VERSION)
print "Mode: "+str(mode)
print "URL: "+str(url)
print "Name: "+str(name)
print "IconImage: "+str(iconimage)
def setView(content, viewType):
# set content type so library shows more views and info
if content:
xbmcplugin.setContent(int(sys.argv[1]), content)
if ADDON.getSetting('auto-view')=='true':
xbmc.executebuiltin("Container.SetViewMode(%s)" % ADDON.getSetting(viewType) )
if mode==None or url==None or len(url)<1:
CATEGORIES(LOGIN)
elif mode==1:
wizard(name,url,description)
elif mode==6:
FRESHSTART(params)
xbmcplugin.endOfDirectory(int(sys.argv[1]))
I have also used import weblogin, here is the weblogin.py:
-- coding: UTF-8 --
""" weblogin by Anarchintosh @ xbmcforums Copyleft (GNU GPL v3) 2011 onwards
this example is configured for Fantasti.cc login See for the full guide please visit: http://forum.xbmc.org/showthread.php?p=772597#post772597
USAGE: in your default.py put:
import weblogin logged_in = weblogin.doLogin('a-path-to-save-the-cookie-to','the-username','the-password')
logged_in will then be either True or False depending on whether the login was successful. """
import os
import re
import urllib,urllib2
import cookielib
### TESTING SETTINGS (will only be used when running this file independent of your addon)
# Remember to clear these after you are finished testing,
# so that your sensitive details are not in your source code.
# These are only used in the: if __name__ == "__main__" thing at the bottom of this script.
myusername = ''
mypassword = ''
#note, the cookie will be saved to the same directory as weblogin.py when testing
def check_login(source,username):
#the string you will use to check if the login is successful.
#you may want to set it to: username (no quotes)
logged_in_string = 'Welcome to'
#search for the string in the html, without caring about upper or lower case
if re.search(logged_in_string,source,re.IGNORECASE):
return True
else:
return False
def doLogin(cookiepath, username, password):
#check if user has supplied only a folder path, or a full path
if not os.path.isfile(cookiepath):
#if the user supplied only a folder path, append on to the end of the path a filename.
cookiepath = os.path.join(cookiepath,'cookies.lwp')
#delete any old version of the cookie file
try:
os.remove(cookiepath)
except:
pass
if username and password:
#the url you will request to.
login_url = 'http://p.xxe.press/login.php'
#the header used to pretend you are a browser
header_string = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3'
#build the form data necessary for the login
login_data = urllib.urlencode({'username':username, 'password':password})
#build the request we will make
req = urllib2.Request(login_url, login_data)
req.add_header('User-Agent',header_string)
#initiate the cookielib class
cj = cookielib.LWPCookieJar()
#install cookielib into the url opener, so that cookies are handled
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
#do the login and get the response
response = opener.open(req)
source = response.read()
response.close()
#check the received html for a string that will tell us if the user is logged in
#pass the username, which can be used to do this.
login = check_login(source,username)
#if login suceeded, save the cookiejar to disk
if login == True:
cj.save(cookiepath)
#return whether we are logged in or not
return login
else:
return False
#code to enable running the .py independent of addon for testing
if __name__ == "__main__":
if myusername is '' or mypassword is '':
print 'YOU HAVE NOT SET THE USERNAME OR PASSWORD!'
else:
logged_in = doLogin(os.getcwd(),myusername,mypassword)
print 'LOGGED IN:',logged_in
First of all for your login you need your username and password! if mode == None do CATEGORIES(LOGIN) then you go on CATEGORIES(LOGIN) and you have that step: if logged_in_string == True: but what is logged_in_string ? so i think you have to add something on CATEGORIES function yours:
mine: