Sponsored Links:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[HELP] Code Merge
#1
Hi,

I would like some help on merging some code/forking an add-on.

I would like to add/merge this code to the USB BACKUP/RESTORE add-on to add an Update function to the add-on:

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


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='http://ENTER WED ADDRESS HERE'    #HERE YOU NEED TO INPUT YOUR WEB URL HTTP://MYWEBSPACE.NET
ADDON=xbmcaddon.Addon(id='plugin.video.toolbox')
   
   
VERSION = "1.0"
PATH = "toolbox"           

   
def CATEGORIES():
    link = OPEN_URL('http://WEB ADDRESS HERE/toolbox.xml').replace('\n','').replace('\r','')  #HERE YOU NEED TO ADDRESS FOR THE XML FILE ON YOU WEBSPACE THIS WILL BE WHERE YOU HAVE THE PATH TO YOUR ZIP FILES
    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')
       
   
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("[COLOR dodgerblue]Community[/COLOR] [COLOR lime]Toolbox[/COLOR]","Downloading ",'', 'Please Wait')
    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 Zip Please Wait")
    print '======================================='
    print addonfolder
    print '======================================='
    extract.all(lib,addonfolder,dp)
    dialog = xbmcgui.Dialog()
    dialog.ok("DOWNLOAD COMPLETE", 'Unfortunately the only way to get the new changes to stick is', 'to force close kodi. Click ok to force Kodi to close,', 'DO NOT use the quit/exit options in Kodi.')
    killxbmc()
       
     
       
def killxbmc():
    choice = xbmcgui.Dialog().yesno('Force Close Kodi', 'You are about to close Kodi', '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':
        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.system('adb shell am force-stop org.xbmc.kodi')
        except: pass
        try: os.system('adb shell am force-stop org.kodi')
        except: pass
        try: os.system('adb shell am force-stop org.xbmc.xbmc')
        except: pass
        try: os.system('adb shell am force-stop org.xbmc')
        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 XBMC/Kodi. [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
       
                     
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()
       
elif mode==1:
        wizard(name,url,description)
       

       
xbmcplugin.endOfDirectory(int(sys.argv[1]))


However I've had a go at it but the add-on just stops working, so would like some advice please on how to merge it properly.

Thanks in Advance
  Reply
Sponsored Links:
#2
Other than the obvious ENTER WEB ADDRESS HERE bit, can you upload a log of the error?
  Reply
#3
Kodi error log?
  Reply
#4
Yes just the normal kodi log mate, if you're editing code you're going to need that visible in a text editor on your screen constantly checking for errors. It won't literally be a simple copy/paste so you'll have to do some debugging and fix each error as it appears in the log.
WANT EARLY DEVELOPMENT RELEASE ACCESS?
All users who've helped out with a donation can now gain early access to the
latest test versions of add-ons, often weeks or months ahead of the public stable releases.

[Image: 11i3ihd.jpg]
  Reply
#5
(06-13-2015, 12:19 PM)whufclee link Wrote: Yes just the normal kodi log mate, if you're editing code you're going to need that visible in a text editor on your screen constantly checking for errors. It won't literally be a simple copy/paste so you'll have to do some debugging and fix each error as it appears in the log.

Ok, so do I open the log in my text editor and then find the error and try to fix it and then try the add-on again, and then reopen the new log file and see if the error has been fixed?

Or does the error log file auto update whilst i have it open?
  Reply
#6
If you use Notepad++ just open your kodi.log in that and have Kodi running, make it error then go straight back to the log in Notepad++ and there will be a popup to say the log file has changed and will ask if you want to re-load it, click yes and at the bottom you'll be able to see your error. Locate where the error is - it gives good clues to line numbers or filenames that failed - and then edit the code, save it and switch back to Kodi and try again. When you try again make sure you exit out to the previous menu before trying the function again as the window may need refreshing (depending on what the code is doing). Repeat until you have no errors Smile
WANT EARLY DEVELOPMENT RELEASE ACCESS?
All users who've helped out with a donation can now gain early access to the
latest test versions of add-ons, often weeks or months ahead of the public stable releases.

[Image: 11i3ihd.jpg]
  Reply
#7
Thanks WHUFCLEE Ive followed what you said and started to make some good progress, just one error which I can't seem to figure out is:

Code:
Python callback/script returned the following error<--
- NOTE: IGNORING THIS CAN LEAD TO MEMORY LEAKS!
Error Type: <type 'exceptions.TypeError'>
Error Contents: addDir() takes exactly 5 arguments (6 given)
Traceback (most recent call last):
File "/Users/Harvinder/Library/Application Support/Kodi/addons/plugin.program.ictwizard/default.py", line 428, in <module>
CATEGORIES()
File "/Users/Harvinder/Library/Application Support/Kodi/addons/plugin.program.ictwizard/default.py", line 185, in CATEGORIES
addDir(name,url,7,iconimage,fanart,description)
TypeError: addDir() takes exactly 5 arguments (6 given)
End of Python script error report<--

When I check the code I can see that I have 6 arguments stated e.g:

Code:
addDir(name,url,7,iconimage,fanart,description)

When I remove one of them such as "description" and then run the add-on it works fine. But I've checked many other add ons and they have 6 arguments and not 5? How would I get around this?

Thanks in Advance
  Reply
#8
addDir is a custom function, it's not a built-in one so devs will code it up for the amount of arguments they need to send. If you look at my one I think I have it setup for 7. Somewhere in that code you should be able to see:

def addDir(<arguments_in_here>):

That will determine how many arguments that function takes.
WANT EARLY DEVELOPMENT RELEASE ACCESS?
All users who've helped out with a donation can now gain early access to the
latest test versions of add-ons, often weeks or months ahead of the public stable releases.

[Image: 11i3ihd.jpg]
  Reply
#9
Found it pal, added in the extra argument and now it works fine, will update with more progress and any errors I'm not able to solve them.
  Reply
#10
UPDATE: Got most of the add-on working as I want. Just a few things I need help with please:

1. guisettings.xml downloads fine and it says that it has been extracted/installed but the GUI doesn't change?

2. Is there a way for the guisettings.xml to be applied when the update/full-build is being installed? Instead of having a two step process..

  Reply


Possibly Related Threads...
Thread Author Replies Views Last Post
  Need Help on "Clear data" / "fresh start" code samram117 28 2,484 07-24-2016, 01:58 PM
Last Post: Surfacingx
  Python Code to change to default skin. kodiuser 7 510 06-28-2016, 05:15 AM
Last Post: kodiuser
  Coding Styles - Make Sure Your Code Can Be Read By Others whufclee 0 660 04-23-2015, 11:57 AM
Last Post: whufclee

Forum Jump:


Users browsing this thread: 1 Guest(s)