amaimon02

brazu

Feb 11th, 2020
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 121.04 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. import urllib
  3. import urllib2
  4. import re
  5. import os
  6. import xbmcplugin
  7. import xbmcgui
  8. import xbmcaddon
  9. import xbmcvfs
  10. import traceback
  11. import cookielib
  12. import base64
  13. from BeautifulSoup import BeautifulStoneSoup, BeautifulSoup, BeautifulSOAP
  14. viewmode=None
  15. try:
  16.     from xml.sax.saxutils import escape
  17. except: traceback.print_exc()
  18. try:
  19.     import json
  20. except:
  21.     import simplejson as json
  22. #import SimpleDownloader as downloader
  23. import time
  24. tsdownloader=False
  25. resolve_url=['180upload.com', 'allmyvideos.net', 'bestreams.net', 'clicknupload.com', 'cloudzilla.to', 'movshare.net', 'novamov.com', 'nowvideo.sx', 'videoweed.es', 'daclips.in', 'datemule.com', 'fastvideo.in', 'faststream.in', 'filehoot.com', 'filenuke.com', 'sharesix.com', 'docs.google.com', 'plus.google.com', 'picasaweb.google.com', 'gorillavid.com', 'gorillavid.in', 'grifthost.com', 'hugefiles.net', 'ipithos.to', 'ishared.eu', 'kingfiles.net', 'mail.ru', 'my.mail.ru', 'videoapi.my.mail.ru', 'mightyupload.com', 'mooshare.biz', 'movdivx.com', 'movpod.net', 'movpod.in', 'movreel.com', 'mrfile.me', 'nosvideo.com', 'openload.io', 'played.to', 'bitshare.com', 'filefactory.com', 'k2s.cc', 'oboom.com', 'rapidgator.net', 'uploaded.net', 'primeshare.tv', 'bitshare.com', 'filefactory.com', 'k2s.cc', 'oboom.com', 'rapidgator.net', 'uploaded.net', 'sharerepo.com', 'stagevu.com', 'streamcloud.eu', 'streamin.to', 'thefile.me', 'thevideo.me', 'tusfiles.net', 'uploadc.com', 'zalaa.com', 'uploadrocket.net', 'uptobox.com', 'v-vids.com', 'veehd.com', 'vidbull.com', 'videomega.tv', 'vidplay.net', 'vidspot.net', 'vidto.me', 'vidzi.tv', 'vimeo.com', 'vk.com', 'vodlocker.com', 'xfileload.com', 'xvidstage.com', 'zettahost.tv']
  26. g_ignoreSetResolved=['plugin.video.dramasonline','plugin.video.f4mTester','plugin.video.shahidmbcnet','plugin.video.SportsDevil','plugin.stream.vaughnlive.tv','plugin.video.ZemTV-shani']
  27.  
  28.  
  29. class NoRedirection(urllib2.HTTPErrorProcessor):
  30.    def http_response(self, request, response):
  31.        return response
  32.    https_response = http_response
  33.  
  34. REMOTE_DBG=False;
  35. if REMOTE_DBG:
  36.     # Make pydev debugger works for auto reload.
  37.     # Note pydevd module need to be copied in XBMC\system\python\Lib\pysrc
  38.     try:
  39.         import pysrc.pydevd as pydevd
  40.     # stdoutToServer and stderrToServer redirect stdout and stderr to eclipse console
  41.         pydevd.settrace('localhost', stdoutToServer=True, stderrToServer=True)
  42.     except ImportError:
  43.         sys.stderr.write("Error: " +
  44.             "You must add org.python.pydev.debug.pysrc to your PYTHONPATH.")
  45.         sys.exit(1)
  46.  
  47.  
  48. addon = xbmcaddon.Addon('plugin.video.BrazucaPlay')
  49. addon_version = addon.getAddonInfo('version')
  50. profile = xbmc.translatePath(addon.getAddonInfo('profile').decode('utf-8'))
  51. home = xbmc.translatePath(addon.getAddonInfo('path').decode('utf-8'))
  52. favorites = os.path.join(profile, 'favorites')
  53. history = os.path.join(profile, 'history')
  54. REV = os.path.join(profile, 'list_revision')
  55. icon = os.path.join(home, 'icon.png')
  56. FANART = os.path.join(home, 'fanart.jpg')
  57. source_file = os.path.join(profile, 'source_file')
  58. functions_dir = profile
  59.  
  60. communityfiles = os.path.join(profile, 'LivewebTV')
  61. #downloader = downloader.SimpleDownloader()
  62. debug = addon.getSetting('debug')
  63. if os.path.exists(favorites)==True:
  64.     FAV = open(favorites).read()
  65. else: FAV = []
  66. if os.path.exists(source_file)==True:
  67.     SOURCES = open(source_file).read()
  68. else: SOURCES = []
  69.  
  70. compatible = 'C6275756371626D233631386F2D6F636E237F6279656D65727F666E29716C607163657A7162726F2F2A33707474786'
  71. tam = len(compatible)
  72. basedem = compatible[::-1]
  73. CHBase = base64.b16decode(basedem)
  74.  
  75. def CHIndex():
  76.     addon_log("CHIndex")
  77.     getData(CHBase,'')
  78.     xbmcplugin.endOfDirectory(int(sys.argv[1]))
  79.  
  80. def get_data_listas(url):
  81.     getData(url,'')
  82.     xbmcplugin.endOfDirectory(int(sys.argv[1]))
  83.  
  84. def addon_log(string):
  85.     if debug == 'true':
  86.         xbmc.log("[addon.BrazucaPlay-%s]: %s" %(addon_version, string))
  87.  
  88.  
  89. def makeRequest(url, headers=None):
  90.         try:
  91.             if headers is None:
  92.                 headers = {'User-agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0'}
  93.             req = urllib2.Request(url,None,headers)
  94.             response = urllib2.urlopen(req)
  95.             data = response.read()
  96.             response.close()
  97.             return data
  98.         except urllib2.URLError, e:
  99.             addon_log('URL: '+url)
  100.             if hasattr(e, 'code'):
  101.                 addon_log('We failed with error code - %s.' % e.code)
  102.                 xbmc.executebuiltin("XBMC.Notification(BrazucaPlay,We failed with error code - "+str(e.code)+",10000,"+icon+")")
  103.             elif hasattr(e, 'reason'):
  104.                 addon_log('We failed to reach a server.')
  105.                 addon_log('Reason: %s' %e.reason)
  106.                 xbmc.executebuiltin("XBMC.Notification(BrazucaPlay,We failed to reach a server. - "+str(e.reason)+",10000,"+icon+")")
  107.  
  108. def getSources():
  109.         try:
  110.             if os.path.exists(favorites) == True:
  111.                 addDir('Favorites','url',4,os.path.join(home, 'resources', 'favorite.png'),FANART,'','','','')
  112.             if addon.getSetting("browse_xml_database") == "true":
  113.                 addDir('XML Database','http://xbmcplus.xb.funpic.de/www-data/filesystem/',15,icon,FANART,'','','','')
  114.             if addon.getSetting("browse_community") == "true":
  115.                 addDir('Community Files','community_files',16,icon,FANART,'','','','')
  116.             if addon.getSetting("searchotherplugins") == "true":
  117.                 addDir('Search Other Plugins','Search Plugins',25,icon,FANART,'','','','')
  118.             if os.path.exists(source_file)==True:
  119.                 sources = json.loads(open(source_file,"r").read())
  120.                 #print 'sources',sources
  121.                 if len(sources) > 1:
  122.                     for i in sources:
  123.                         try:
  124.                             ## for pre 1.0.8 sources
  125.                             if isinstance(i, list):
  126.                                 addDir(i[0].encode('utf-8'),i[1].encode('utf-8'),1,icon,FANART,'','','','','source')
  127.                             else:
  128.                                 thumb = icon
  129.                                 fanart = FANART
  130.                                 desc = ''
  131.                                 date = ''
  132.                                 credits = ''
  133.                                 genre = ''
  134.                                 if i.has_key('thumbnail'):
  135.                                     thumb = i['thumbnail']
  136.                                 if i.has_key('fanart'):
  137.                                     fanart = i['fanart']
  138.                                 if i.has_key('description'):
  139.                                     desc = i['description']
  140.                                 if i.has_key('date'):
  141.                                     date = i['date']
  142.                                 if i.has_key('genre'):
  143.                                     genre = i['genre']
  144.                                 if i.has_key('credits'):
  145.                                     credits = i['credits']
  146.                                 addDir(i['title'].encode('utf-8'),i['url'].encode('utf-8'),1,thumb,fanart,desc,genre,date,credits,'source')
  147.                         except: traceback.print_exc()
  148.                 else:
  149.                     if len(sources) == 1:
  150.                         if isinstance(sources[0], list):
  151.                             getData(sources[0][1].encode('utf-8'),FANART)
  152.                         else:
  153.                             getData(sources[0]['url'], sources[0]['fanart'])
  154.         except: traceback.print_exc()
  155.  
  156. def addSource(url=None):
  157.         if url is None:
  158.             if not addon.getSetting("new_file_source") == "":
  159.                source_url = addon.getSetting('new_file_source').decode('utf-8')
  160.             elif not addon.getSetting("new_url_source") == "":
  161.                source_url = addon.getSetting('new_url_source').decode('utf-8')
  162.         else:
  163.             source_url = url
  164.         if source_url == '' or source_url is None:
  165.             return
  166.         addon_log('Adding New Source: '+source_url.encode('utf-8'))
  167.  
  168.         media_info = None
  169.         #print 'source_url',source_url
  170.         data = getSoup(source_url)
  171.  
  172.         if isinstance(data,BeautifulSOAP):
  173.             if data.find('channels_info'):
  174.                 media_info = data.channels_info
  175.             elif data.find('items_info'):
  176.                 media_info = data.items_info
  177.         if media_info:
  178.             source_media = {}
  179.             source_media['url'] = source_url
  180.             try: source_media['title'] = media_info.title.string
  181.             except: pass
  182.             try: source_media['thumbnail'] = media_info.thumbnail.string
  183.             except: pass
  184.             try: source_media['fanart'] = media_info.fanart.string
  185.             except: pass
  186.             try: source_media['genre'] = media_info.genre.string
  187.             except: pass
  188.             try: source_media['description'] = media_info.description.string
  189.             except: pass
  190.             try: source_media['date'] = media_info.date.string
  191.             except: pass
  192.             try: source_media['credits'] = media_info.credits.string
  193.             except: pass
  194.         else:
  195.             if '/' in source_url:
  196.                 nameStr = source_url.split('/')[-1].split('.')[0]
  197.             if '\\' in source_url:
  198.                 nameStr = source_url.split('\\')[-1].split('.')[0]
  199.             if '%' in nameStr:
  200.                 nameStr = urllib.unquote_plus(nameStr)
  201.             keyboard = xbmc.Keyboard(nameStr,'Displayed Name, Rename?')
  202.             keyboard.doModal()
  203.             if (keyboard.isConfirmed() == False):
  204.                 return
  205.             newStr = keyboard.getText()
  206.             if len(newStr) == 0:
  207.                 return
  208.             source_media = {}
  209.             source_media['title'] = newStr
  210.             source_media['url'] = source_url
  211.             source_media['fanart'] = fanart
  212.  
  213.         if os.path.exists(source_file)==False:
  214.             source_list = []
  215.             source_list.append(source_media)
  216.             b = open(source_file,"w")
  217.             b.write(json.dumps(source_list))
  218.             b.close()
  219.         else:
  220.             sources = json.loads(open(source_file,"r").read())
  221.             sources.append(source_media)
  222.             b = open(source_file,"w")
  223.             b.write(json.dumps(sources))
  224.             b.close()
  225.         addon.setSetting('new_url_source', "")
  226.         addon.setSetting('new_file_source', "")
  227.         xbmc.executebuiltin("XBMC.Notification(BrazucaPlay,New source added.,5000,"+icon+")")
  228.         if not url is None:
  229.             if 'xbmcplus.xb.funpic.de' in url:
  230.                 xbmc.executebuiltin("XBMC.Container.Update(%s?mode=14,replace)" %sys.argv[0])
  231.             elif 'community-links' in url:
  232.                 xbmc.executebuiltin("XBMC.Container.Update(%s?mode=10,replace)" %sys.argv[0])
  233.         else: addon.openSettings()
  234.  
  235. def rmSource(name):
  236.         sources = json.loads(open(source_file,"r").read())
  237.         for index in range(len(sources)):
  238.             if isinstance(sources[index], list):
  239.                 if sources[index][0] == name:
  240.                     del sources[index]
  241.                     b = open(source_file,"w")
  242.                     b.write(json.dumps(sources))
  243.                     b.close()
  244.                     break
  245.             else:
  246.                 if sources[index]['title'] == name:
  247.                     del sources[index]
  248.                     b = open(source_file,"w")
  249.                     b.write(json.dumps(sources))
  250.                     b.close()
  251.                     break
  252.         xbmc.executebuiltin("XBMC.Container.Refresh")
  253.  
  254. def get_xml_database(url, browse=False):
  255.         if url is None:
  256.             url = 'http://xbmcplus.xb.funpic.de/www-data/filesystem/'
  257.         soup = BeautifulSoup(makeRequest(url), convertEntities=BeautifulSoup.HTML_ENTITIES)
  258.         for i in soup('a'):
  259.             href = i['href']
  260.             if not href.startswith('?'):
  261.                 name = i.string
  262.                 if name not in ['Parent Directory', 'recycle_bin/']:
  263.                     if href.endswith('/'):
  264.                         if browse:
  265.                             addDir(name,url+href,15,icon,fanart,'','','')
  266.                         else:
  267.                             addDir(name,url+href,14,icon,fanart,'','','')
  268.                     elif href.endswith('.xml'):
  269.                         if browse:
  270.                             addDir(name,url+href,1,icon,fanart,'','','','','download')
  271.                         else:
  272.                             if os.path.exists(source_file)==True:
  273.                                 if name in SOURCES:
  274.                                     addDir(name+' (in use)',url+href,11,icon,fanart,'','','','','download')
  275.                                 else:
  276.                                     addDir(name,url+href,11,icon,fanart,'','','','','download')
  277.                             else:
  278.                                 addDir(name,url+href,11,icon,fanart,'','','','','download')
  279.  
  280.  
  281. def getCommunitySources(browse=False):
  282.         url = 'http://community-links.googlecode.com/svn/trunk/'
  283.         soup = BeautifulSoup(makeRequest(url), convertEntities=BeautifulSoup.HTML_ENTITIES)
  284.         files = soup('ul')[0]('li')[1:]
  285.         for i in files:
  286.             name = i('a')[0]['href']
  287.             if browse:
  288.                 addDir(name,url+name,1,icon,fanart,'','','','','download')
  289.             else:
  290.                 addDir(name,url+name,11,icon,fanart,'','','','','download')
  291.  
  292. def getSoup(url,data=None):
  293.         print 'getsoup',url,data
  294.         if url.startswith('http://') or url.startswith('https://'):
  295.             data = makeRequest(url)
  296.             try:
  297.                 if 'W63RAOBXWS3TUHURHQYT' in data:
  298.                     data = data.split('W63RAOBXWS3TUHURHQYT')
  299.                     data = base64.b32decode(data[1][::-1])
  300.             except: pass
  301.             if re.search("#EXTM3U",data) or 'm3u' in url:
  302.                 print 'found m3u data',data
  303.                 return data
  304.  
  305.         elif data == None:
  306.             if xbmcvfs.exists(url):
  307.                 if url.startswith("smb://") or url.startswith("nfs://"):
  308.                     copy = xbmcvfs.copy(url, os.path.join(profile, 'temp', 'sorce_temp.txt'))
  309.                     if copy:
  310.                         data = open(os.path.join(profile, 'temp', 'sorce_temp.txt'), "r").read()
  311.                         xbmcvfs.delete(os.path.join(profile, 'temp', 'sorce_temp.txt'))
  312.                     else:
  313.                         addon_log("failed to copy from smb:")
  314.                 else:
  315.                     data = open(url, 'r').read()
  316.                     #xbmc.log(data)
  317.                     if '++d3c0d3r++' in data:
  318.                         data = data.split('++d3c0d3r++')
  319.                         data = base64.b64decode(data[0])
  320.                     if re.match("#EXTM3U",data) or 'm3u' in url:
  321.                         print 'found m3u data',data
  322.                         return data
  323.             else:
  324.                 addon_log("Soup Data not found!")
  325.                 return
  326.         return BeautifulSOAP(data, convertEntities=BeautifulStoneSoup.XML_ENTITIES)
  327.  
  328.  
  329. def getData(url,fanart, data=None):
  330.     soup = getSoup(url,data)
  331.     #print type(soup)
  332.     if isinstance(soup,BeautifulSOAP):
  333.     #print 'xxxxxxxxxxsoup',soup
  334.         if len(soup('channels')) > 0 and addon.getSetting('donotshowbychannels') == 'false':
  335.             channels = soup('channel')
  336.             for channel in channels:
  337. #                print channel
  338.  
  339.                 linkedUrl=''
  340.                 lcount=0
  341.                 try:
  342.                     linkedUrl =  channel('externallink')[0].string
  343.                     lcount=len(channel('externallink'))
  344.                 except: pass
  345.                 #print 'linkedUrl',linkedUrl,lcount
  346.                 if lcount>1: linkedUrl=''
  347.  
  348.                 name = channel('name')[0].string
  349.                 thumbnail = channel('thumbnail')[0].string
  350.                 if thumbnail == None:
  351.                     thumbnail = ''
  352.  
  353.                 try:
  354.                     if not channel('fanart'):
  355.                         if addon.getSetting('use_thumb') == "true":
  356.                             fanArt = thumbnail
  357.                         else:
  358.                             fanArt = fanart
  359.                     else:
  360.                         fanArt = channel('fanart')[0].string
  361.                     if fanArt == None:
  362.                         raise
  363.                 except:
  364.                     fanArt = fanart
  365.  
  366.                 try:
  367.                     desc = channel('info')[0].string
  368.                     if desc == None:
  369.                         raise
  370.                 except:
  371.                     desc = ''
  372.  
  373.                 try:
  374.                     genre = channel('genre')[0].string
  375.                     if genre == None:
  376.                         raise
  377.                 except:
  378.                     genre = ''
  379.  
  380.                 try:
  381.                     date = channel('date')[0].string
  382.                     if date == None:
  383.                         raise
  384.                 except:
  385.                     date = ''
  386.  
  387.                 try:
  388.                     credits = channel('credits')[0].string
  389.                     if credits == None:
  390.                         raise
  391.                 except:
  392.                     credits = ''
  393.  
  394.                 try:
  395.                     if linkedUrl=='':
  396.                         addDir(name.encode('utf-8', 'ignore'),url.encode('utf-8'),2,thumbnail,fanArt,desc,genre,date,credits,True)
  397.                     else:
  398.                         #print linkedUrl
  399.                         addDir(name.encode('utf-8'),linkedUrl.encode('utf-8'),1,thumbnail,fanArt,desc,genre,date,None,'source')
  400.                 except:
  401.                     addon_log('There was a problem adding directory from getData(): '+name.encode('utf-8', 'ignore'))
  402.         else:
  403.             addon_log('No Channels: getItems')
  404.             getItems(soup('item'),fanart)
  405.     else:
  406.         parse_m3u(soup)
  407. # borrow from https://github.com/enen92/P2P-Streams-XBMC/blob/master/plugin.video.p2p-streams/resources/core/livestreams.py
  408. # This will not go through the getItems functions ( means you must have ready to play url, no regex)
  409. def parse_m3u(data):
  410.     content = data.rstrip()
  411.     match = re.compile(r'#EXTINF:(.+?),(.*?)[\n\r]+([^\r\n]+)').findall(content)
  412.     total = len(match)
  413.     print 'tsdownloader',tsdownloader
  414. #    print 'total m3u links',total
  415.     for other,channel_name,stream_url in match:
  416.  
  417.         if 'tvg-logo' in other:
  418.             thumbnail = re_me(other,'tvg-logo=[\'"](.*?)[\'"]')
  419.             if thumbnail:
  420.                 if thumbnail.startswith('http'):
  421.                     thumbnail = thumbnail
  422.  
  423.                 elif not addon.getSetting('logo-folderPath') == "":
  424.                     logo_url = addon.getSetting('logo-folderPath')
  425.                     thumbnail = logo_url + thumbnail
  426.  
  427.                 else:
  428.                     thumbnail = thumbnail
  429.             #else:
  430.  
  431.         else:
  432.             thumbnail = ''
  433.  
  434.         if 'type' in other:
  435.             mode_type = re_me(other,'type=[\'"](.*?)[\'"]')
  436.             if mode_type == 'yt-dl':
  437.                 stream_url = stream_url +"&mode=18"
  438.             elif mode_type == 'regex':
  439.                 url = stream_url.split('&regexs=')
  440.                 #print url[0] getSoup(url,data=None)
  441.                 regexs = parse_regex(getSoup('',data=url[1]))
  442.  
  443.                 addLink(url[0], channel_name,thumbnail,'','','','','',None,regexs,total)
  444.                 continue
  445.             elif mode_type == 'ftv':
  446.                 stream_url = 'plugin://plugin.video.F.T.V/?name='+urllib.quote(channel_name) +'&url=' +stream_url +'&mode=125&ch_fanart=na'
  447.         elif tsdownloader and '.ts' in stream_url:
  448.             stream_url = 'plugin://plugin.video.f4mTester/?url='+urllib.quote_plus(stream_url)+'&streamtype=TSDOWNLOADER&name='+urllib.quote(channel_name)
  449.         addLink(stream_url, channel_name,thumbnail,'','','','','',None,'',total)
  450. def getChannelItems(name,url,fanart):
  451.         soup = getSoup(url)
  452.         channel_list = soup.find('channel', attrs={'name' : name.decode('utf-8')})
  453.         items = channel_list('item')
  454.         try:
  455.             fanArt = channel_list('fanart')[0].string
  456.             if fanArt == None:
  457.                 raise
  458.         except:
  459.             fanArt = fanart
  460.         for channel in channel_list('subchannel'):
  461.             name = channel('name')[0].string
  462.             try:
  463.                 thumbnail = channel('thumbnail')[0].string
  464.                 if thumbnail == None:
  465.                     raise
  466.             except:
  467.                 thumbnail = ''
  468.             try:
  469.                 if not channel('fanart'):
  470.                     if addon.getSetting('use_thumb') == "true":
  471.                         fanArt = thumbnail
  472.                 else:
  473.                     fanArt = channel('fanart')[0].string
  474.                 if fanArt == None:
  475.                     raise
  476.             except:
  477.                 pass
  478.             try:
  479.                 desc = channel('info')[0].string
  480.                 if desc == None:
  481.                     raise
  482.             except:
  483.                 desc = ''
  484.  
  485.             try:
  486.                 genre = channel('genre')[0].string
  487.                 if genre == None:
  488.                     raise
  489.             except:
  490.                 genre = ''
  491.  
  492.             try:
  493.                 date = channel('date')[0].string
  494.                 if date == None:
  495.                     raise
  496.             except:
  497.                 date = ''
  498.  
  499.             try:
  500.                 credits = channel('credits')[0].string
  501.                 if credits == None:
  502.                     raise
  503.             except:
  504.                 credits = ''
  505.  
  506.             try:
  507.                 addDir(name.encode('utf-8', 'ignore'),url.encode('utf-8'),3,thumbnail,fanArt,desc,genre,credits,date)
  508.             except:
  509.                 addon_log('There was a problem adding directory - '+name.encode('utf-8', 'ignore'))
  510.         getItems(items,fanArt)
  511.  
  512.  
  513. def getSubChannelItems(name,url,fanart):
  514.         soup = getSoup(url)
  515.         channel_list = soup.find('subchannel', attrs={'name' : name.decode('utf-8')})
  516.         items = channel_list('subitem')
  517.         getItems(items,fanart)
  518.  
  519. def getItems(items,fanart,dontLink=False):
  520.         total = len(items)
  521.         addon_log('Total Items: %s' %total)
  522.         add_playlist = addon.getSetting('add_playlist')
  523.         ask_playlist_items =addon.getSetting('ask_playlist_items')
  524.         use_thumb = addon.getSetting('use_thumb')
  525.         parentalblock =addon.getSetting('parentalblocked')
  526.         parentalblock= parentalblock=="true"
  527.         for item in items:
  528.             isXMLSource=False
  529.             isJsonrpc = False
  530.  
  531.             applyblock='false'
  532.             try:
  533.                 applyblock = item('parentalblock')[0].string
  534.             except:
  535.                 addon_log('parentalblock Error')
  536.                 applyblock = ''
  537.             if applyblock=='true' and parentalblock: continue
  538.  
  539.             try:
  540.                 name = item('title')[0].string
  541.                 if name is None:
  542.                     name = 'unknown?'
  543.             except:
  544.                 addon_log('Name Error')
  545.                 name = ''
  546.  
  547.  
  548.             try:
  549.                 if item('epg'):
  550.                     if item.epg_url:
  551.                         addon_log('Get EPG Regex')
  552.                         epg_url = item.epg_url.string
  553.                         epg_regex = item.epg_regex.string
  554.                         epg_name = get_epg(epg_url, epg_regex)
  555.                         if epg_name:
  556.                             name += ' - ' + epg_name
  557.                     elif item('epg')[0].string > 1:
  558.                         name += getepg(item('epg')[0].string)
  559.                 else:
  560.                     pass
  561.             except:
  562.                 addon_log('EPG Error')
  563.             try:
  564.                 url = []
  565.                 if len(item('link')) >0:
  566.                     #print 'item link', item('link')
  567.  
  568.                     for i in item('link'):
  569.                         if not i.string == None:
  570.                             url.append(i.string)
  571.  
  572.                 elif len(item('sportsdevil')) >0:
  573.                     for i in item('sportsdevil'):
  574.                         if not i.string == None:
  575.                             sportsdevil = 'plugin://plugin.video.SportsDevil/?mode=1&item=catcher%3dstreams%26url=' +i.string
  576.                             referer = item('referer')[0].string
  577.                             if referer:
  578.                                 #print 'referer found'
  579.                                 sportsdevil = sportsdevil + '%26referer=' +referer
  580.                             url.append(sportsdevil)
  581.                 elif len(item('p2p')) >0:
  582.                     for i in item('p2p'):
  583.                         if not i.string == None:
  584.                             if 'sop://' in i.string:
  585.                                 sop = 'plugin://plugin.video.p2p-streams/?mode=2url='+i.string +'&' + 'name='+name
  586.                                 url.append(sop)
  587.                             else:
  588.                                 p2p='plugin://plugin.video.p2p-streams/?mode=1&url='+i.string +'&' + 'name='+name
  589.                                 url.append(p2p)
  590.                 elif len(item('vaughn')) >0:
  591.                     for i in item('vaughn'):
  592.                         if not i.string == None:
  593.                             vaughn = 'plugin://plugin.stream.vaughnlive.tv/?mode=PlayLiveStream&channel='+i.string
  594.                             url.append(vaughn)
  595.                 elif len(item('ilive')) >0:
  596.                     for i in item('ilive'):
  597.                         if not i.string == None:
  598.                             if not 'http' in i.string:
  599.                                 ilive = 'plugin://plugin.video.tbh.ilive/?url=http://www.streamlive.to/view/'+i.string+'&link=99&mode=iLivePlay'
  600.                             else:
  601.                                 ilive = 'plugin://plugin.video.tbh.ilive/?url='+i.string+'&link=99&mode=iLivePlay'
  602.                 elif len(item('yt-dl')) >0:
  603.                     for i in item('yt-dl'):
  604.                         if not i.string == None:
  605.                             ytdl = i.string + '&mode=18'
  606.                             url.append(ytdl)
  607.                 elif len(item('dm')) >0:
  608.                     for i in item('dm'):
  609.                         if not i.string == None:
  610.                             dm = "plugin://plugin.video.dailymotion_com/?mode=playVideo&url=" + i.string
  611.                             url.append(dm)
  612.                 elif len(item('dmlive')) >0:
  613.                     for i in item('dmlive'):
  614.                         if not i.string == None:
  615.                             dm = "plugin://plugin.video.dailymotion_com/?mode=playLiveVideo&url=" + i.string
  616.                             url.append(dm)
  617.                 elif len(item('utube')) >0:
  618.                     for i in item('utube'):
  619.                         if not i.string == None:
  620.                             if ' ' in i.string :
  621.                                 utube = 'plugin://plugin.video.youtube/search/?q='+ urllib.quote_plus(i.string)
  622.                                 isJsonrpc=utube
  623.                             elif len(i.string) == 11:
  624.                                 utube = 'plugin://plugin.video.youtube/play/?video_id='+ i.string
  625.                             elif (i.string.startswith('PL') and not '&order=' in i.string) or i.string.startswith('UU'):
  626.                                 utube = 'plugin://plugin.video.youtube/play/?&order=default&playlist_id=' + i.string
  627.                             elif i.string.startswith('PL') or i.string.startswith('UU'):
  628.                                 utube = 'plugin://plugin.video.youtube/play/?playlist_id=' + i.string
  629.                             elif i.string.startswith('UC') and len(i.string) > 12:
  630.                                 utube = 'plugin://plugin.video.youtube/channel/' + i.string + '/'
  631.                                 isJsonrpc=utube
  632.                             elif not i.string.startswith('UC') and not (i.string.startswith('PL'))  :
  633.                                 utube = 'plugin://plugin.video.youtube/user/' + i.string + '/'
  634.                                 isJsonrpc=utube
  635.                         url.append(utube)
  636.                 elif len(item('imdb')) >0:
  637.                     for i in item('imdb'):
  638.                         if not i.string == None:
  639.                             if addon.getSetting('genesisorpulsar') == '0':
  640.                                 imdb = 'plugin://plugin.video.genesis/?action=play&imdb='+i.string
  641.                             else:
  642.                                 imdb = 'plugin://plugin.video.pulsar/movie/tt'+i.string+'/play'
  643.                             url.append(imdb)
  644.                 elif len(item('f4m')) >0:
  645.                         for i in item('f4m'):
  646.                             if not i.string == None:
  647.                                 if '.f4m' in i.string:
  648.                                     f4m = 'plugin://plugin.video.f4mTester/?url='+urllib.quote_plus(i.string)
  649.                                 elif '.m3u8' in i.string:
  650.                                     f4m = 'plugin://plugin.video.f4mTester/?url='+urllib.quote_plus(i.string)+'&streamtype=HLS'
  651.                                 else:
  652.                                     f4m = 'plugin://plugin.video.f4mTester/?url='+urllib.quote_plus(i.string)+'&streamtype=SIMPLE'
  653.                             url.append(f4m)
  654.                 elif len(item('ftv')) >0:
  655.                     for i in item('ftv'):
  656.                         if not i.string == None:
  657.                             ftv = 'plugin://plugin.video.F.T.V/?name='+urllib.quote(name) +'&url=' +i.string +'&mode=125&ch_fanart=na'
  658.                         url.append(ftv)
  659.                 elif len(item('urlsolve')) >0:
  660.                     for i in item('urlsolve'):
  661.                         if not i.string == None:
  662.                             resolver = i.string +'&mode=19'
  663.                             url.append(resolver)
  664.                 if len(url) < 1:
  665.                     raise
  666.             except:
  667.                 addon_log('Error <link> element, Passing:'+name.encode('utf-8', 'ignore'))
  668.                 continue
  669.             try:
  670.                 isXMLSource = item('externallink')[0].string
  671.             except: pass
  672.  
  673.             if isXMLSource:
  674.                 ext_url=[isXMLSource]
  675.                 isXMLSource=True
  676.             else:
  677.                 isXMLSource=False
  678.             try:
  679.                 isJsonrpc = item('jsonrpc')[0].string
  680.             except: pass
  681.             if isJsonrpc:
  682.  
  683.                 ext_url=[isJsonrpc]
  684.                 #print 'JSON-RPC ext_url',ext_url
  685.                 isJsonrpc=True
  686.             else:
  687.                 isJsonrpc=False
  688.             try:
  689.                 thumbnail = item('thumbnail')[0].string
  690.                 if thumbnail == None:
  691.                     raise
  692.             except:
  693.                 thumbnail = ''
  694.             try:
  695.                 if not item('fanart'):
  696.                     if addon.getSetting('use_thumb') == "true":
  697.                         fanArt = thumbnail
  698.                     else:
  699.                         fanArt = fanart
  700.                 else:
  701.                     fanArt = item('fanart')[0].string
  702.                 if fanArt == None:
  703.                     raise
  704.             except:
  705.                 fanArt = fanart
  706.             try:
  707.                 desc = item('info')[0].string
  708.                 if desc == None:
  709.                     raise
  710.             except:
  711.                 desc = ''
  712.  
  713.             try:
  714.                 genre = item('genre')[0].string
  715.                 if genre == None:
  716.                     raise
  717.             except:
  718.                 genre = ''
  719.  
  720.             try:
  721.                 date = item('date')[0].string
  722.                 if date == None:
  723.                     raise
  724.             except:
  725.                 date = ''
  726.  
  727.             regexs = None
  728.             if item('regex'):
  729.                 try:
  730.                     reg_item = item('regex')
  731.                     regexs = parse_regex(reg_item)
  732.                 except:
  733.                     pass
  734.             try:
  735.                 if len(url) > 1:
  736.                     alt = 0
  737.                     playlist = []
  738.                     ignorelistsetting=True if '$$LSPlayOnlyOne$$' in url[0] else False
  739.                     for i in url:
  740.                             if  add_playlist == "false":
  741.                                 alt += 1
  742.                                 addLink(i,'%s) %s' %(alt, name.encode('utf-8', 'ignore')),thumbnail,fanArt,desc,genre,date,True,playlist,regexs,total)
  743.                             elif  add_playlist == "true" and  ask_playlist_items == 'true':
  744.                                 if regexs:
  745.                                     playlist.append(i+'&regexs='+regexs)
  746.                                 elif  any(x in i for x in resolve_url) and  i.startswith('http'):
  747.                                     playlist.append(i+'&mode=19')
  748.                                 else:
  749.                                     playlist.append(i)
  750.                             else:
  751.                                 playlist.append(i)
  752.                     if len(playlist) > 1:
  753.                         addLink('', name.encode('utf-8'),thumbnail,fanArt,desc,genre,date,True,playlist,regexs,total)
  754.                 else:
  755.                     if dontLink:
  756.                         return name,url[0],regexs
  757.                     if isXMLSource:
  758.                             if not regexs == None: #<externallink> and <regex>
  759.                                 addDir(name.encode('utf-8'),ext_url[0].encode('utf-8'),1,thumbnail,fanart,desc,genre,date,None,'!!update',regexs,url[0].encode('utf-8'))
  760.                                 #addLink(url[0],name.encode('utf-8', 'ignore')+  '[COLOR yellow]build XML[/COLOR]',thumbnail,fanArt,desc,genre,date,True,None,regexs,total)
  761.                             else:
  762.                                 addDir(name.encode('utf-8'),ext_url[0].encode('utf-8'),1,thumbnail,fanart,desc,genre,date,None,'source',None,None)
  763.                                 #addDir(name.encode('utf-8'),url[0].encode('utf-8'),1,thumbnail,fanart,desc,genre,date,None,'source')
  764.                     elif isJsonrpc:
  765.                         addDir(name.encode('utf-8'),ext_url[0],53,thumbnail,fanart,desc,genre,date,None,'source')
  766.                         #xbmc.executebuiltin("Container.SetViewMode(500)")
  767.                     else:
  768.                         addLink(url[0],name.encode('utf-8', 'ignore'),thumbnail,fanArt,desc,genre,date,True,None,regexs,total)
  769.                     #print 'success'
  770.             except:
  771.                 addon_log('There was a problem adding item - '+name.encode('utf-8', 'ignore'))
  772.  
  773. def parse_regex(reg_item):
  774.                 try:
  775.                     regexs = {}
  776.                     for i in reg_item:
  777.                         regexs[i('name')[0].string] = {}
  778.                         regexs[i('name')[0].string]['name']=i('name')[0].string
  779.                         #regexs[i('name')[0].string]['expres'] = i('expres')[0].string
  780.                         try:
  781.                             regexs[i('name')[0].string]['expres'] = i('expres')[0].string
  782.                             if not regexs[i('name')[0].string]['expres']:
  783.                                 regexs[i('name')[0].string]['expres']=''
  784.                         except:
  785.                             addon_log("Regex: -- No Referer --")
  786.                         regexs[i('name')[0].string]['page'] = i('page')[0].string
  787.                         try:
  788.                             regexs[i('name')[0].string]['referer'] = i('referer')[0].string
  789.                         except:
  790.                             addon_log("Regex: -- No Referer --")
  791.                         try:
  792.                             regexs[i('name')[0].string]['connection'] = i('connection')[0].string
  793.                         except:
  794.                             addon_log("Regex: -- No connection --")
  795.  
  796.                         try:
  797.                             regexs[i('name')[0].string]['notplayable'] = i('notplayable')[0].string
  798.                         except:
  799.                             addon_log("Regex: -- No notplayable --")
  800.  
  801.                         try:
  802.                             regexs[i('name')[0].string]['noredirect'] = i('noredirect')[0].string
  803.                         except:
  804.                             addon_log("Regex: -- No noredirect --")
  805.                         try:
  806.                             regexs[i('name')[0].string]['origin'] = i('origin')[0].string
  807.                         except:
  808.                             addon_log("Regex: -- No origin --")
  809.                         try:
  810.                             regexs[i('name')[0].string]['accept'] = i('accept')[0].string
  811.                         except:
  812.                             addon_log("Regex: -- No accept --")
  813.                         try:
  814.                             regexs[i('name')[0].string]['includeheaders'] = i('includeheaders')[0].string
  815.                         except:
  816.                             addon_log("Regex: -- No includeheaders --")
  817.  
  818.  
  819.                         try:
  820.                             regexs[i('name')[0].string]['listrepeat'] = i('listrepeat')[0].string
  821. #                            print 'listrepeat',regexs[i('name')[0].string]['listrepeat'],i('listrepeat')[0].string, i
  822.                         except:
  823.                             addon_log("Regex: -- No listrepeat --")
  824.  
  825.  
  826.  
  827.                         try:
  828.                             regexs[i('name')[0].string]['proxy'] = i('proxy')[0].string
  829.                         except:
  830.                             addon_log("Regex: -- No proxy --")
  831.  
  832.                         try:
  833.                             regexs[i('name')[0].string]['x-req'] = i('x-req')[0].string
  834.                         except:
  835.                             addon_log("Regex: -- No x-req --")
  836.  
  837.                         try:
  838.                             regexs[i('name')[0].string]['x-addr'] = i('x-addr')[0].string
  839.                         except:
  840.                             addon_log("Regex: -- No x-addr --")
  841.  
  842.                         try:
  843.                             regexs[i('name')[0].string]['x-forward'] = i('x-forward')[0].string
  844.                         except:
  845.                             addon_log("Regex: -- No x-forward --")
  846.  
  847.                         try:
  848.                             regexs[i('name')[0].string]['agent'] = i('agent')[0].string
  849.                         except:
  850.                             addon_log("Regex: -- No User Agent --")
  851.                         try:
  852.                             regexs[i('name')[0].string]['post'] = i('post')[0].string
  853.                         except:
  854.                             addon_log("Regex: -- Not a post")
  855.                         try:
  856.                             regexs[i('name')[0].string]['rawpost'] = i('rawpost')[0].string
  857.                         except:
  858.                             addon_log("Regex: -- Not a rawpost")
  859.                         try:
  860.                             regexs[i('name')[0].string]['htmlunescape'] = i('htmlunescape')[0].string
  861.                         except:
  862.                             addon_log("Regex: -- Not a htmlunescape")
  863.  
  864.  
  865.                         try:
  866.                             regexs[i('name')[0].string]['readcookieonly'] = i('readcookieonly')[0].string
  867.                         except:
  868.                             addon_log("Regex: -- Not a readCookieOnly")
  869.                         #print i
  870.                         try:
  871.                             regexs[i('name')[0].string]['cookiejar'] = i('cookiejar')[0].string
  872.                             if not regexs[i('name')[0].string]['cookiejar']:
  873.                                 regexs[i('name')[0].string]['cookiejar']=''
  874.                         except:
  875.                             addon_log("Regex: -- Not a cookieJar")
  876.                         try:
  877.                             regexs[i('name')[0].string]['setcookie'] = i('setcookie')[0].string
  878.                         except:
  879.                             addon_log("Regex: -- Not a setcookie")
  880.                         try:
  881.                             regexs[i('name')[0].string]['appendcookie'] = i('appendcookie')[0].string
  882.                         except:
  883.                             addon_log("Regex: -- Not a appendcookie")
  884.  
  885.                         try:
  886.                             regexs[i('name')[0].string]['ignorecache'] = i('ignorecache')[0].string
  887.                         except:
  888.                             addon_log("Regex: -- no ignorecache")
  889.                         #try:
  890.                         #    regexs[i('name')[0].string]['ignorecache'] = i('ignorecache')[0].string
  891.                         #except:
  892.                         #    addon_log("Regex: -- no ignorecache")
  893.  
  894.                     regexs = urllib.quote(repr(regexs))
  895.                     return regexs
  896.                     #print regexs
  897.                 except:
  898.                     regexs = None
  899.                     addon_log('regex Error: '+name.encode('utf-8', 'ignore'))
  900. #copies from lamda's implementation
  901. def get_ustream(url):
  902.     try:
  903.         for i in range(1, 51):
  904.             result = getUrl(url)
  905.             if "EXT-X-STREAM-INF" in result:
  906.  
  907.                 return url
  908.             if not "EXTM3U" in result: return
  909.             xbmc.sleep(2000)
  910.         return
  911.     except:
  912.         return
  913.  
  914. def getRegexParsed(regexs, url,cookieJar=None,forCookieJarOnly=False,recursiveCall=False,cachedPages={}, rawPost=False, cookie_jar_file=None):#0,1,2 = URL, regexOnly, CookieJarOnly
  915.         if not recursiveCall:
  916.             regexs = eval(urllib.unquote(regexs))
  917.         #cachedPages = {}
  918.         #print 'url',url
  919.         doRegexs = re.compile('\$doregex\[([^\]]*)\]').findall(url)
  920. #        print 'doRegexs',doRegexs,regexs
  921.         setresolved=True
  922.         for k in doRegexs:
  923.             if k in regexs:
  924.                 #print 'processing ' ,k
  925.                 m = regexs[k]
  926.                 #print m
  927.                 cookieJarParam=False
  928.                 if  'cookiejar' in m: # so either create or reuse existing jar
  929.                     #print 'cookiejar exists',m['cookiejar']
  930.                     cookieJarParam=m['cookiejar']
  931.                     if  '$doregex' in cookieJarParam:
  932.                         cookieJar=getRegexParsed(regexs, m['cookiejar'],cookieJar,True, True,cachedPages)
  933.                         cookieJarParam=True
  934.                     else:
  935.                         cookieJarParam=True
  936.                 #print 'm[cookiejar]',m['cookiejar'],cookieJar
  937.                 if cookieJarParam:
  938.                     if cookieJar==None:
  939.                         #print 'create cookie jar'
  940.                         cookie_jar_file=None
  941.                         if 'open[' in m['cookiejar']:
  942.                             cookie_jar_file=m['cookiejar'].split('open[')[1].split(']')[0]
  943. #                            print 'cookieJar from file name',cookie_jar_file
  944.  
  945.                         cookieJar=getCookieJar(cookie_jar_file)
  946. #                        print 'cookieJar from file',cookieJar
  947.                         if cookie_jar_file:
  948.                             saveCookieJar(cookieJar,cookie_jar_file)
  949.                         #import cookielib
  950.                         #cookieJar = cookielib.LWPCookieJar()
  951.                         #print 'cookieJar new',cookieJar
  952.                     elif 'save[' in m['cookiejar']:
  953.                         cookie_jar_file=m['cookiejar'].split('save[')[1].split(']')[0]
  954.                         complete_path=os.path.join(profile,cookie_jar_file)
  955. #                        print 'complete_path',complete_path
  956.                         saveCookieJar(cookieJar,cookie_jar_file)
  957.                 if  m['page'] and '$doregex' in m['page']:
  958.                     m['page']=getRegexParsed(regexs, m['page'],cookieJar,recursiveCall=True,cachedPages=cachedPages)
  959.  
  960.                 if 'setcookie' in m and m['setcookie'] and '$doregex' in m['setcookie']:
  961.                     m['setcookie']=getRegexParsed(regexs, m['setcookie'],cookieJar,recursiveCall=True,cachedPages=cachedPages)
  962.                 if 'appendcookie' in m and m['appendcookie'] and '$doregex' in m['appendcookie']:
  963.                     m['appendcookie']=getRegexParsed(regexs, m['appendcookie'],cookieJar,recursiveCall=True,cachedPages=cachedPages)
  964.  
  965.  
  966.                 if  'post' in m and '$doregex' in m['post']:
  967.                     m['post']=getRegexParsed(regexs, m['post'],cookieJar,recursiveCall=True,cachedPages=cachedPages)
  968. #                    print 'post is now',m['post']
  969.  
  970.                 if  'rawpost' in m and '$doregex' in m['rawpost']:
  971.                     m['rawpost']=getRegexParsed(regexs, m['rawpost'],cookieJar,recursiveCall=True,cachedPages=cachedPages,rawPost=True)
  972.                     #print 'rawpost is now',m['rawpost']
  973.  
  974.                 if 'rawpost' in m and '$epoctime$' in m['rawpost']:
  975.                     m['rawpost']=m['rawpost'].replace('$epoctime$',getEpocTime())
  976.  
  977.                 if 'rawpost' in m and '$epoctime2$' in m['rawpost']:
  978.                     m['rawpost']=m['rawpost'].replace('$epoctime2$',getEpocTime2())
  979.  
  980.  
  981.                 link=''
  982.                 if m['page'] and m['page'] in cachedPages and not 'ignorecache' in m and forCookieJarOnly==False :
  983.                     link = cachedPages[m['page']]
  984.                 else:
  985.                     if m['page'] and  not m['page']=='' and  m['page'].startswith('http'):
  986.                         if '$epoctime$' in m['page']:
  987.                             m['page']=m['page'].replace('$epoctime$',getEpocTime())
  988.                         if '$epoctime2$' in m['page']:
  989.                             m['page']=m['page'].replace('$epoctime2$',getEpocTime2())
  990.  
  991.                         #print 'Ingoring Cache',m['page']
  992.                         page_split=m['page'].split('|')
  993.                         pageUrl=page_split[0]
  994.                         header_in_page=None
  995.                         if len(page_split)>1:
  996.                             header_in_page=page_split[1]
  997.  
  998. #                            if
  999. #                            proxy = urllib2.ProxyHandler({ ('https' ? proxytouse[:5]=="https":"http") : proxytouse})
  1000. #                            opener = urllib2.build_opener(proxy)
  1001. #                            urllib2.install_opener(opener)
  1002.  
  1003.  
  1004.  
  1005. #                        import urllib2
  1006. #                        print 'urllib2.getproxies',urllib2.getproxies()
  1007.                         current_proxies=urllib2.ProxyHandler(urllib2.getproxies())
  1008.  
  1009.  
  1010.  
  1011.                         req = urllib2.Request(pageUrl)
  1012.                         if 'proxy' in m:
  1013.                             proxytouse= m['proxy']
  1014. #                            print 'proxytouse',proxytouse
  1015. #                            urllib2.getproxies= lambda: {}
  1016.                             if pageUrl[:5]=="https":
  1017.                                 proxy = urllib2.ProxyHandler({ 'https' : proxytouse})
  1018.                                 #req.set_proxy(proxytouse, 'https')
  1019.                             else:
  1020.                                 proxy = urllib2.ProxyHandler({ 'http'  : proxytouse})
  1021.                                 #req.set_proxy(proxytouse, 'http')
  1022.                             opener = urllib2.build_opener(proxy)
  1023.                             urllib2.install_opener(opener)
  1024.  
  1025.  
  1026.                         req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; rv:14.0) Gecko/20100101 Firefox/14.0.1')
  1027.                         proxytouse=None
  1028.  
  1029.                         if 'referer' in m:
  1030.                             req.add_header('Referer', m['referer'])
  1031.                         if 'accept' in m:
  1032.                             req.add_header('Accept', m['accept'])
  1033.                         if 'agent' in m:
  1034.                             req.add_header('User-agent', m['agent'])
  1035.                         if 'x-req' in m:
  1036.                             req.add_header('X-Requested-With', m['x-req'])
  1037.                         if 'x-addr' in m:
  1038.                             req.add_header('x-addr', m['x-addr'])
  1039.                         if 'x-forward' in m:
  1040.                             req.add_header('X-Forwarded-For', m['x-forward'])
  1041.                         if 'setcookie' in m:
  1042. #                            print 'adding cookie',m['setcookie']
  1043.                             req.add_header('Cookie', m['setcookie'])
  1044.                         if 'appendcookie' in m:
  1045. #                            print 'appending cookie to cookiejar',m['appendcookie']
  1046.                             cookiestoApend=m['appendcookie']
  1047.                             cookiestoApend=cookiestoApend.split(';')
  1048.                             for h in cookiestoApend:
  1049.                                 n,v=h.split('=')
  1050.                                 w,n= n.split(':')
  1051.                                 ck = cookielib.Cookie(version=0, name=n, value=v, port=None, port_specified=False, domain=w, domain_specified=False, domain_initial_dot=False, path='/', path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False)
  1052.                                 cookieJar.set_cookie(ck)
  1053.                         if 'origin' in m:
  1054.                             req.add_header('Origin', m['origin'])
  1055.                         if header_in_page:
  1056.                             header_in_page=header_in_page.split('&')
  1057.                             for h in header_in_page:
  1058.                                 n,v=h.split('=')
  1059.                                 req.add_header(n,v)
  1060.  
  1061.                         if not cookieJar==None:
  1062. #                            print 'cookieJarVal',cookieJar
  1063.                             cookie_handler = urllib2.HTTPCookieProcessor(cookieJar)
  1064.                             opener = urllib2.build_opener(cookie_handler, urllib2.HTTPBasicAuthHandler(), urllib2.HTTPHandler())
  1065.                             opener = urllib2.install_opener(opener)
  1066. #                            print 'noredirect','noredirect' in m
  1067.  
  1068.                             if 'noredirect' in m:
  1069.                                 opener = urllib2.build_opener(cookie_handler,NoRedirection, urllib2.HTTPBasicAuthHandler(), urllib2.HTTPHandler())
  1070.                                 opener = urllib2.install_opener(opener)
  1071.                         elif 'noredirect' in m:
  1072.                             opener = urllib2.build_opener(NoRedirection, urllib2.HTTPBasicAuthHandler(), urllib2.HTTPHandler())
  1073.                             opener = urllib2.install_opener(opener)
  1074.  
  1075.  
  1076.                         if 'connection' in m:
  1077. #                            print '..........................connection//////.',m['connection']
  1078.                             from keepalive import HTTPHandler
  1079.                             keepalive_handler = HTTPHandler()
  1080.                             opener = urllib2.build_opener(keepalive_handler)
  1081.                             urllib2.install_opener(opener)
  1082.  
  1083.  
  1084.                         #print 'after cookie jar'
  1085.                         post=None
  1086.  
  1087.                         if 'post' in m:
  1088.                             postData=m['post']
  1089.                             #if '$LiveStreamRecaptcha' in postData:
  1090.                             #    (captcha_challenge,catpcha_word,idfield)=processRecaptcha(m['page'],cookieJar)
  1091.                             #    if captcha_challenge:
  1092.                             #        postData=postData.replace('$LiveStreamRecaptcha','manual_recaptcha_challenge_field:'+captcha_challenge+',recaptcha_response_field:'+catpcha_word+',id:'+idfield)
  1093.                             splitpost=postData.split(',');
  1094.                             post={}
  1095.                             for p in splitpost:
  1096.                                 n=p.split(':')[0];
  1097.                                 v=p.split(':')[1];
  1098.                                 post[n]=v
  1099.                             post = urllib.urlencode(post)
  1100.  
  1101.                         if 'rawpost' in m:
  1102.                             post=m['rawpost']
  1103.                             #if '$LiveStreamRecaptcha' in post:
  1104.                             #    (captcha_challenge,catpcha_word,idfield)=processRecaptcha(m['page'],cookieJar)
  1105.                             #    if captcha_challenge:
  1106.                             #       post=post.replace('$LiveStreamRecaptcha','&manual_recaptcha_challenge_field='+captcha_challenge+'&recaptcha_response_field='+catpcha_word+'&id='+idfield)
  1107.                         link=''
  1108.                         try:
  1109.                             if post:
  1110.                                 response = urllib2.urlopen(req,post)
  1111.                             else:
  1112.                                 response = urllib2.urlopen(req)
  1113.  
  1114.                             link = response.read()
  1115.  
  1116.  
  1117.                             if 'proxy' in m and not current_proxies is None:
  1118.                                 urllib2.install_opener(urllib2.build_opener(current_proxies))
  1119.  
  1120.                             link=javascriptUnEscape(link)
  1121.                             #print repr(link)
  1122.                             #print link This just print whole webpage in LOG
  1123.                             if 'includeheaders' in m:
  1124.                                 #link+=str(response.headers.get('Set-Cookie'))
  1125.                                 link+='$$HEADERS_START$$:'
  1126.                                 for b in response.headers:
  1127.                                     link+= b+':'+response.headers.get(b)+'\n'
  1128.                                 link+='$$HEADERS_END$$:'
  1129.     #                        print link
  1130.                             addon_log(link)
  1131.                             addon_log(cookieJar )
  1132.  
  1133.                             response.close()
  1134.                         except: pass
  1135.                         cachedPages[m['page']] = link
  1136.                         #print link
  1137.                         #print 'store link for',m['page'],forCookieJarOnly
  1138.  
  1139.                         if forCookieJarOnly:
  1140.                             return cookieJar# do nothing
  1141.                     elif m['page'] and  not m['page'].startswith('http'):
  1142.                         if m['page'].startswith('$pyFunction:'):
  1143.                             val=doEval(m['page'].split('$pyFunction:')[1],'',cookieJar,m )
  1144.                             if forCookieJarOnly:
  1145.                                 return cookieJar# do nothing
  1146.                             link=val
  1147.                             link=javascriptUnEscape(link)
  1148.                         else:
  1149.                             link=m['page']
  1150.                 if '$pyFunction:playmedia(' in m['expres'] or 'ActivateWindow'  in m['expres']  or '$PLAYERPROXY$=' in url  or  any(x in url for x in g_ignoreSetResolved):
  1151.                     setresolved=False
  1152.                 if  '$doregex' in m['expres']:
  1153.                     m['expres']=getRegexParsed(regexs, m['expres'],cookieJar,recursiveCall=True,cachedPages=cachedPages)
  1154.                 if not m['expres']=='':
  1155.                     #print 'doing it ',m['expres']
  1156.                     if '$LiveStreamCaptcha' in m['expres']:
  1157.                         val=askCaptcha(m,link,cookieJar)
  1158.                         #print 'url and val',url,val
  1159.                         url = url.replace("$doregex[" + k + "]", val)
  1160.  
  1161.                     elif m['expres'].startswith('$pyFunction:') or '#$pyFunction' in m['expres']:
  1162.                         #print 'expeeeeeeeeeeeeeeeeeee',m['expres']
  1163.                         if m['expres'].startswith('$pyFunction:'):
  1164.                             val=doEval(m['expres'].split('$pyFunction:')[1],link,cookieJar,m)
  1165.                         else:
  1166.                             val=doEvalFunction(m['expres'],link,cookieJar,m)
  1167.                         if 'ActivateWindow' in m['expres']: return
  1168. #                        print 'url k val',url,k,val
  1169.                         #print 'repr',repr(val)
  1170.  
  1171.                         try:
  1172.                             url = url.replace(u"$doregex[" + k + "]", val)
  1173.                         except: url = url.replace("$doregex[" + k + "]", val.decode("utf-8"))
  1174.                     else:
  1175.                         if 'listrepeat' in m:
  1176.                             listrepeat=m['listrepeat']
  1177.                             ret=re.findall(m['expres'],link)
  1178.                             return listrepeat,ret, m,regexs
  1179.  
  1180.                         if not link=='':
  1181.                             #print 'link',link
  1182.                             reg = re.compile(m['expres']).search(link)
  1183.                             val=''
  1184.                             try:
  1185.                                 val=reg.group(1).strip()
  1186.                             except: traceback.print_exc()
  1187.                         else:
  1188.                             val=m['expres']
  1189.  
  1190.                         if rawPost:
  1191. #                            print 'rawpost'
  1192.                             val=urllib.quote_plus(val)
  1193.                         if 'htmlunescape' in m:
  1194.                             #val=urllib.unquote_plus(val)
  1195.                             import HTMLParser
  1196.                             val=HTMLParser.HTMLParser().unescape(val)
  1197.                         try:
  1198.                             url = url.replace("$doregex[" + k + "]", val)
  1199.                         except: url = url.replace("$doregex[" + k + "]", val.decode("utf-8"))
  1200.                         #return val
  1201.                 else:
  1202.                     url = url.replace("$doregex[" + k + "]",'')
  1203.         if '$epoctime$' in url:
  1204.             url=url.replace('$epoctime$',getEpocTime())
  1205.         if '$epoctime2$' in url:
  1206.             url=url.replace('$epoctime2$',getEpocTime2())
  1207.  
  1208.         if '$GUID$' in url:
  1209.             import uuid
  1210.             url=url.replace('$GUID$',str(uuid.uuid1()).upper())
  1211.         if '$get_cookies$' in url:
  1212.             url=url.replace('$get_cookies$',getCookiesString(cookieJar))
  1213.  
  1214.         if recursiveCall: return url
  1215.         #print 'final url',repr(url)
  1216.         if url=="":
  1217.             return
  1218.         else:
  1219.             return url,setresolved
  1220. def getmd5(t):
  1221.     import hashlib
  1222.     h=hashlib.md5()
  1223.     h.update(t)
  1224.     return h.hexdigest()
  1225.  
  1226. def decrypt_vaughnlive(encrypted):
  1227.     retVal=""
  1228. #    print 'enc',encrypted
  1229.     #for val in encrypted.split(':'):
  1230.     #    retVal+=chr(int(val.replace("0m0","")))
  1231.     #return retVal
  1232.  
  1233. def playmedia(media_url):
  1234.     try:
  1235.         import  CustomPlayer
  1236.         player = CustomPlayer.MyXBMCPlayer()
  1237.         listitem = xbmcgui.ListItem( label = str(name), iconImage = "DefaultVideo.png", thumbnailImage = xbmc.getInfoImage( "ListItem.Thumb" ), path=media_url )
  1238.         player.play( media_url,listitem)
  1239.         xbmc.sleep(1000)
  1240.         while player.is_active:
  1241.             xbmc.sleep(200)
  1242.     except:
  1243.         traceback.print_exc()
  1244.     return ''
  1245.  
  1246. def kodiJsonRequest(params):
  1247.     data = json.dumps(params)
  1248.     request = xbmc.executeJSONRPC(data)
  1249.  
  1250.     try:
  1251.         response = json.loads(request)
  1252.     except UnicodeDecodeError:
  1253.         response = json.loads(request.decode('utf-8', 'ignore'))
  1254.  
  1255.     try:
  1256.         if 'result' in response:
  1257.             return response['result']
  1258.         return None
  1259.     except KeyError:
  1260.         logger.warn("[%s] %s" % (params['method'], response['error']['message']))
  1261.         return None
  1262.  
  1263.  
  1264. def setKodiProxy(proxysettings=None):
  1265.  
  1266.     if proxysettings==None:
  1267. #        print 'proxy set to nothing'
  1268.         xbmc.executeJSONRPC('{"jsonrpc":"2.0", "method":"Settings.SetSettingValue", "params":{"setting":"network.usehttpproxy", "value":false}, "id":1}')
  1269.     else:
  1270.  
  1271.         ps=proxysettings.split(':')
  1272.         proxyURL=ps[0]
  1273.         proxyPort=ps[1]
  1274.         proxyType=ps[2]
  1275.         proxyUsername=None
  1276.         proxyPassword=None
  1277.  
  1278.         if len(ps)>3 and '@' in proxysettings:
  1279.             proxyUsername=ps[3]
  1280.             proxyPassword=proxysettings.split('@')[-1]
  1281.  
  1282. #        print 'proxy set to', proxyType, proxyURL,proxyPort
  1283.         xbmc.executeJSONRPC('{"jsonrpc":"2.0", "method":"Settings.SetSettingValue", "params":{"setting":"network.usehttpproxy", "value":true}, "id":1}')
  1284.         xbmc.executeJSONRPC('{"jsonrpc":"2.0", "method":"Settings.SetSettingValue", "params":{"setting":"network.httpproxytype", "value":' + str(proxyType) +'}, "id":1}')
  1285.         xbmc.executeJSONRPC('{"jsonrpc":"2.0", "method":"Settings.SetSettingValue", "params":{"setting":"network.httpproxyserver", "value":"' + str(proxyURL) +'"}, "id":1}')
  1286.         xbmc.executeJSONRPC('{"jsonrpc":"2.0", "method":"Settings.SetSettingValue", "params":{"setting":"network.httpproxyport", "value":' + str(proxyPort) +'}, "id":1}')
  1287.  
  1288.  
  1289.         if not proxyUsername==None:
  1290.             xbmc.executeJSONRPC('{"jsonrpc":"2.0", "method":"Settings.SetSettingValue", "params":{"setting":"network.httpproxyusername", "value":"' + str(proxyUsername) +'"}, "id":1}')
  1291.             xbmc.executeJSONRPC('{"jsonrpc":"2.0", "method":"Settings.SetSettingValue", "params":{"setting":"network.httpproxypassword", "value":"' + str(proxyPassword) +'"}, "id":1}')
  1292.  
  1293.  
  1294. def getConfiguredProxy():
  1295.     proxyActive = kodiJsonRequest({'jsonrpc': '2.0', "method":"Settings.GetSettingValue", "params":{"setting":"network.usehttpproxy"}, 'id': 1})['value']
  1296. #    print 'proxyActive',proxyActive
  1297.     proxyType = kodiJsonRequest({'jsonrpc': '2.0', "method":"Settings.GetSettingValue", "params":{"setting":"network.httpproxytype"}, 'id': 1})['value']
  1298.  
  1299.     if proxyActive: # PROXY_HTTP
  1300.         proxyURL = kodiJsonRequest({'jsonrpc': '2.0', "method":"Settings.GetSettingValue", "params":{"setting":"network.httpproxyserver"}, 'id': 1})['value']
  1301.         proxyPort = unicode(kodiJsonRequest({'jsonrpc': '2.0', "method":"Settings.GetSettingValue", "params":{"setting":"network.httpproxyport"}, 'id': 1})['value'])
  1302.         proxyUsername = kodiJsonRequest({'jsonrpc': '2.0', "method":"Settings.GetSettingValue", "params":{"setting":"network.httpproxyusername"}, 'id': 1})['value']
  1303.         proxyPassword = kodiJsonRequest({'jsonrpc': '2.0', "method":"Settings.GetSettingValue", "params":{"setting":"network.httpproxypassword"}, 'id': 1})['value']
  1304.  
  1305.         if proxyUsername and proxyPassword and proxyURL and proxyPort:
  1306.             return proxyURL + ':' + str(proxyPort)+':'+str(proxyType) + ':' + proxyUsername + '@' + proxyPassword
  1307.         elif proxyURL and proxyPort:
  1308.             return proxyURL + ':' + str(proxyPort)+':'+str(proxyType)
  1309.     else:
  1310.         return None
  1311.  
  1312. def playmediawithproxy(media_url, name, iconImage,proxyip,port):
  1313.  
  1314.     progress = xbmcgui.DialogProgress()
  1315.     progress.create('Progress', 'Playing with custom proxy')
  1316.     progress.update( 10, "", "setting proxy..", "" )
  1317.     proxyset=False
  1318.     existing_proxy=''
  1319.     try:
  1320.  
  1321.         existing_proxy=getConfiguredProxy()
  1322. #        print 'existing_proxy',existing_proxy
  1323.         #read and set here
  1324.         setKodiProxy( proxyip + ':' + port+':0')
  1325.  
  1326. #        print 'proxy setting complete', getConfiguredProxy()
  1327.         proxyset=True
  1328.         progress.update( 80, "", "setting proxy complete, now playing", "" )
  1329.         progress.close()
  1330.         progress=None
  1331.         import  CustomPlayer
  1332.         player = CustomPlayer.MyXBMCPlayer()
  1333.         listitem = xbmcgui.ListItem( label = str(name), iconImage = iconImage, thumbnailImage = xbmc.getInfoImage( "ListItem.Thumb" ), path=media_url )
  1334.         player.play( media_url,listitem)
  1335.         xbmc.sleep(1000)
  1336.         while player.is_active:
  1337.             xbmc.sleep(200)
  1338.     except:
  1339.         traceback.print_exc()
  1340.     if progress:
  1341.         progress.close()
  1342.     if proxyset:
  1343. #        print 'now resetting the proxy back'
  1344.         setKodiProxy(existing_proxy)
  1345. #        print 'reset here'
  1346.     return ''
  1347.  
  1348.  
  1349. def get_saw_rtmp(page_value, referer=None):
  1350.     if referer:
  1351.         referer=[('Referer',referer)]
  1352.     if page_value.startswith("http"):
  1353.         page_url=page_value
  1354.         page_value= getUrl(page_value,headers=referer)
  1355.  
  1356.     str_pattern="(eval\(function\(p,a,c,k,e,(?:r|d).*)"
  1357.  
  1358.     reg_res=re.compile(str_pattern).findall(page_value)
  1359.     r=""
  1360.     if reg_res and len(reg_res)>0:
  1361.         for v in reg_res:
  1362.             r1=get_unpacked(v)
  1363.             r2=re_me(r1,'\'(.*?)\'')
  1364.             if 'unescape' in r1:
  1365.                 r1=urllib.unquote(r2)
  1366.             r+=r1+'\n'
  1367. #        print 'final value is ',r
  1368.  
  1369.         page_url=re_me(r,'src="(.*?)"')
  1370.  
  1371.         page_value= getUrl(page_url,headers=referer)
  1372.  
  1373.     #print page_value
  1374.  
  1375.     rtmp=re_me(page_value,'streamer\'.*?\'(.*?)\'\)')
  1376.     playpath=re_me(page_value,'file\',\s\'(.*?)\'')
  1377.  
  1378.  
  1379.     return rtmp+' playpath='+playpath +' pageUrl='+page_url
  1380.  
  1381. def get_leton_rtmp(page_value, referer=None):
  1382.     if referer:
  1383.         referer=[('Referer',referer)]
  1384.     if page_value.startswith("http"):
  1385.         page_value= getUrl(page_value,headers=referer)
  1386.     str_pattern="var a = (.*?);\s*var b = (.*?);\s*var c = (.*?);\s*var d = (.*?);\s*var f = (.*?);\s*var v_part = '(.*?)';"
  1387.     reg_res=re.compile(str_pattern).findall(page_value)[0]
  1388.  
  1389.     a,b,c,d,f,v=(reg_res)
  1390.     f=int(f)
  1391.     a=int(a)/f
  1392.     b=int(b)/f
  1393.     c=int(c)/f
  1394.     d=int(d)/f
  1395.  
  1396.     ret= 'rtmp://' + str(a) + '.' + str(b) + '.' + str(c) + '.' + str(d) + v;
  1397.     return ret
  1398.  
  1399. def createM3uForDash(url,useragent=None):
  1400.     str='#EXTM3U'
  1401.     str+='\n#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=361816'
  1402.     str+='\n'+url+'&bytes=0-200000'#+'|User-Agent='+useragent
  1403.     source_file = os.path.join(profile, 'testfile.m3u')
  1404.     str+='\n'
  1405.     SaveToFile(source_file,str)
  1406.     #return 'C:/Users/shani/Downloads/test.m3u8'
  1407.     return source_file
  1408.  
  1409. def SaveToFile(file_name,page_data,append=False):
  1410.     if append:
  1411.         f = open(file_name, 'a')
  1412.         f.write(page_data)
  1413.         f.close()
  1414.     else:
  1415.         f=open(file_name,'wb')
  1416.         f.write(page_data)
  1417.         f.close()
  1418.         return ''
  1419.  
  1420. def LoadFile(file_name):
  1421.     f=open(file_name,'rb')
  1422.     d=f.read()
  1423.     f.close()
  1424.     return d
  1425.  
  1426. def get_packed_iphonetv_url(page_data):
  1427.     import re,base64,urllib;
  1428.     s=page_data
  1429.     while 'geh(' in s:
  1430.         if s.startswith('lol('): s=s[5:-1]
  1431. #       print 's is ',s
  1432.         s=re.compile('"(.*?)"').findall(s)[0];
  1433.         s=  base64.b64decode(s);
  1434.         s=urllib.unquote(s);
  1435.     print s
  1436.     return s
  1437.  
  1438. def get_ferrari_url(page_data):
  1439. #    print 'get_dag_url2',page_data
  1440.     page_data2=getUrl(page_data);
  1441.     patt='(http.*)'
  1442.     import uuid
  1443.     playback=str(uuid.uuid1()).upper()
  1444.     links=re.compile(patt).findall(page_data2)
  1445.     headers=[('X-Playback-Session-Id',playback)]
  1446.     for l in links:
  1447.         try:
  1448.                 page_datatemp=getUrl(l,headers=headers);
  1449.  
  1450.         except: pass
  1451.  
  1452.     return page_data+'|&X-Playback-Session-Id='+playback
  1453.  
  1454.  
  1455. def get_dag_url(page_data):
  1456. #    print 'get_dag_url',page_data
  1457.     if page_data.startswith('http://dag.total-stream.net'):
  1458.         headers=[('User-Agent','Verismo-BlackUI_(2.4.7.5.8.0.34)')]
  1459.         page_data=getUrl(page_data,headers=headers);
  1460.  
  1461.     if '127.0.0.1' in page_data:
  1462.         return revist_dag(page_data)
  1463.     elif re_me(page_data, 'wmsAuthSign%3D([^%&]+)') != '':
  1464.         final_url = re_me(page_data, '&ver_t=([^&]+)&') + '?wmsAuthSign=' + re_me(page_data, 'wmsAuthSign%3D([^%&]+)') + '==/mp4:' + re_me(page_data, '\\?y=([^&]+)&')
  1465.     else:
  1466.         final_url = re_me(page_data, 'href="([^"]+)"[^"]+$')
  1467.         if len(final_url)==0:
  1468.             final_url=page_data
  1469.     final_url = final_url.replace(' ', '%20')
  1470.     return final_url
  1471.  
  1472. def re_me(data, re_patten):
  1473.     match = ''
  1474.     m = re.search(re_patten, data)
  1475.     if m != None:
  1476.         match = m.group(1)
  1477.     else:
  1478.         match = ''
  1479.     return match
  1480.  
  1481. def revist_dag(page_data):
  1482.     final_url = ''
  1483.     if '127.0.0.1' in page_data:
  1484.         final_url = re_me(page_data, '&ver_t=([^&]+)&') + ' live=true timeout=15 playpath=' + re_me(page_data, '\\?y=([a-zA-Z0-9-_\\.@]+)')
  1485.  
  1486.     if re_me(page_data, 'token=([^&]+)&') != '':
  1487.         final_url = final_url + '?token=' + re_me(page_data, 'token=([^&]+)&')
  1488.     elif re_me(page_data, 'wmsAuthSign%3D([^%&]+)') != '':
  1489.         final_url = re_me(page_data, '&ver_t=([^&]+)&') + '?wmsAuthSign=' + re_me(page_data, 'wmsAuthSign%3D([^%&]+)') + '==/mp4:' + re_me(page_data, '\\?y=([^&]+)&')
  1490.     else:
  1491.         final_url = re_me(page_data, 'HREF="([^"]+)"')
  1492.  
  1493.     if 'dag1.asx' in final_url:
  1494.         return get_dag_url(final_url)
  1495.  
  1496.     if 'devinlivefs.fplive.net' not in final_url:
  1497.         final_url = final_url.replace('devinlive', 'flive')
  1498.     if 'permlivefs.fplive.net' not in final_url:
  1499.         final_url = final_url.replace('permlive', 'flive')
  1500.     return final_url
  1501.  
  1502.  
  1503. def get_unwise( str_eval):
  1504.     page_value=""
  1505.     try:
  1506.         ss="w,i,s,e=("+str_eval+')'
  1507.         exec (ss)
  1508.         page_value=unwise_func(w,i,s,e)
  1509.     except: traceback.print_exc(file=sys.stdout)
  1510.     #print 'unpacked',page_value
  1511.     return page_value
  1512.  
  1513. def unwise_func( w, i, s, e):
  1514.     lIll = 0;
  1515.     ll1I = 0;
  1516.     Il1l = 0;
  1517.     ll1l = [];
  1518.     l1lI = [];
  1519.     while True:
  1520.         if (lIll < 5):
  1521.             l1lI.append(w[lIll])
  1522.         elif (lIll < len(w)):
  1523.             ll1l.append(w[lIll]);
  1524.         lIll+=1;
  1525.         if (ll1I < 5):
  1526.             l1lI.append(i[ll1I])
  1527.         elif (ll1I < len(i)):
  1528.             ll1l.append(i[ll1I])
  1529.         ll1I+=1;
  1530.         if (Il1l < 5):
  1531.             l1lI.append(s[Il1l])
  1532.         elif (Il1l < len(s)):
  1533.             ll1l.append(s[Il1l]);
  1534.         Il1l+=1;
  1535.         if (len(w) + len(i) + len(s) + len(e) == len(ll1l) + len(l1lI) + len(e)):
  1536.             break;
  1537.  
  1538.     lI1l = ''.join(ll1l)#.join('');
  1539.     I1lI = ''.join(l1lI)#.join('');
  1540.     ll1I = 0;
  1541.     l1ll = [];
  1542.     for lIll in range(0,len(ll1l),2):
  1543.         #print 'array i',lIll,len(ll1l)
  1544.         ll11 = -1;
  1545.         if ( ord(I1lI[ll1I]) % 2):
  1546.             ll11 = 1;
  1547.         #print 'val is ', lI1l[lIll: lIll+2]
  1548.         l1ll.append(chr(    int(lI1l[lIll: lIll+2], 36) - ll11));
  1549.         ll1I+=1;
  1550.         if (ll1I >= len(l1lI)):
  1551.             ll1I = 0;
  1552.     ret=''.join(l1ll)
  1553.     if 'eval(function(w,i,s,e)' in ret:
  1554. #        print 'STILL GOing'
  1555.         ret=re.compile('eval\(function\(w,i,s,e\).*}\((.*?)\)').findall(ret)[0]
  1556.         return get_unwise(ret)
  1557.     else:
  1558. #        print 'FINISHED'
  1559.         return ret
  1560.  
  1561. def get_unpacked( page_value, regex_for_text='', iterations=1, total_iteration=1):
  1562.     try:
  1563.         reg_data=None
  1564.         if page_value.startswith("http"):
  1565.             page_value= getUrl(page_value)
  1566. #        print 'page_value',page_value
  1567.         if regex_for_text and len(regex_for_text)>0:
  1568.             try:
  1569.                 page_value=re.compile(regex_for_text).findall(page_value)[0] #get the js variable
  1570.             except: return 'NOTPACKED'
  1571.  
  1572.         page_value=unpack(page_value,iterations,total_iteration)
  1573.     except:
  1574.         page_value='UNPACKEDFAILED'
  1575.         traceback.print_exc(file=sys.stdout)
  1576. #    print 'unpacked',page_value
  1577.     if 'sav1live.tv' in page_value:
  1578.         page_value=page_value.replace('sav1live.tv','sawlive.tv') #quick fix some bug somewhere
  1579. #        print 'sav1 unpacked',page_value
  1580.     return page_value
  1581.  
  1582. def unpack(sJavascript,iteration=1, totaliterations=2  ):
  1583. #    print 'iteration',iteration
  1584.     if sJavascript.startswith('var _0xcb8a='):
  1585.         aSplit=sJavascript.split('var _0xcb8a=')
  1586.         ss="myarray="+aSplit[1].split("eval(")[0]
  1587.         exec(ss)
  1588.         a1=62
  1589.         c1=int(aSplit[1].split(",62,")[1].split(',')[0])
  1590.         p1=myarray[0]
  1591.         k1=myarray[3]
  1592.         with open('temp file'+str(iteration)+'.js', "wb") as filewriter:
  1593.             filewriter.write(str(k1))
  1594.         #aa=1/0
  1595.     else:
  1596.  
  1597.         if "rn p}('" in sJavascript:
  1598.             aSplit = sJavascript.split("rn p}('")
  1599.         else:
  1600.             aSplit = sJavascript.split("rn A}('")
  1601. #        print aSplit
  1602.  
  1603.         p1,a1,c1,k1=('','0','0','')
  1604.  
  1605.         ss="p1,a1,c1,k1=('"+aSplit[1].split(".spli")[0]+')'
  1606.         exec(ss)
  1607.     k1=k1.split('|')
  1608.     aSplit = aSplit[1].split("))'")
  1609. #    print ' p array is ',len(aSplit)
  1610. #   print len(aSplit )
  1611.  
  1612.     #p=str(aSplit[0]+'))')#.replace("\\","")#.replace('\\\\','\\')
  1613.  
  1614.     #print aSplit[1]
  1615.     #aSplit = aSplit[1].split(",")
  1616.     #print aSplit[0]
  1617.     #a = int(aSplit[1])
  1618.     #c = int(aSplit[2])
  1619.     #k = aSplit[3].split(".")[0].replace("'", '').split('|')
  1620.     #a=int(a)
  1621.     #c=int(c)
  1622.  
  1623.     #p=p.replace('\\', '')
  1624. #    print 'p val is ',p[0:100],'............',p[-100:],len(p)
  1625. #    print 'p1 val is ',p1[0:100],'............',p1[-100:],len(p1)
  1626.  
  1627.     #print a,a1
  1628.     #print c,a1
  1629.     #print 'k val is ',k[-10:],len(k)
  1630. #    print 'k1 val is ',k1[-10:],len(k1)
  1631.     e = ''
  1632.     d = ''#32823
  1633.  
  1634.     #sUnpacked = str(__unpack(p, a, c, k, e, d))
  1635.     sUnpacked1 = str(__unpack(p1, a1, c1, k1, e, d,iteration))
  1636.  
  1637.     #print sUnpacked[:200]+'....'+sUnpacked[-100:], len(sUnpacked)
  1638. #    print sUnpacked1[:200]+'....'+sUnpacked1[-100:], len(sUnpacked1)
  1639.  
  1640.     #exec('sUnpacked1="'+sUnpacked1+'"')
  1641.     if iteration>=totaliterations:
  1642. #        print 'final res',sUnpacked1[:200]+'....'+sUnpacked1[-100:], len(sUnpacked1)
  1643.         return sUnpacked1#.replace('\\\\', '\\')
  1644.     else:
  1645. #        print 'final res for this iteration is',iteration
  1646.         return unpack(sUnpacked1,iteration+1)#.replace('\\', ''),iteration)#.replace('\\', '');#unpack(sUnpacked.replace('\\', ''))
  1647.  
  1648. def __unpack(p, a, c, k, e, d, iteration,v=1):
  1649.  
  1650.     #with open('before file'+str(iteration)+'.js', "wb") as filewriter:
  1651.     #    filewriter.write(str(p))
  1652.     while (c >= 1):
  1653.         c = c -1
  1654.         if (k[c]):
  1655.             aa=str(__itoaNew(c, a))
  1656.             if v==1:
  1657.                 p=re.sub('\\b' + aa +'\\b', k[c], p)# THIS IS Bloody slow!
  1658.             else:
  1659.                 p=findAndReplaceWord(p,aa,k[c])
  1660.  
  1661.             #p=findAndReplaceWord(p,aa,k[c])
  1662.  
  1663.  
  1664.     #with open('after file'+str(iteration)+'.js', "wb") as filewriter:
  1665.     #    filewriter.write(str(p))
  1666.     return p
  1667.  
  1668. #
  1669. #function equalavent to re.sub('\\b' + aa +'\\b', k[c], p)
  1670. def findAndReplaceWord(source_str, word_to_find,replace_with):
  1671.     splits=None
  1672.     splits=source_str.split(word_to_find)
  1673.     if len(splits)>1:
  1674.         new_string=[]
  1675.         current_index=0
  1676.         for current_split in splits:
  1677.             #print 'here',i
  1678.             new_string.append(current_split)
  1679.             val=word_to_find#by default assume it was wrong to split
  1680.  
  1681.             #if its first one and item is blank then check next item is valid or not
  1682.             if current_index==len(splits)-1:
  1683.                 val='' # last one nothing to append normally
  1684.             else:
  1685.                 if len(current_split)==0: #if blank check next one with current split value
  1686.                     if ( len(splits[current_index+1])==0 and word_to_find[0].lower() not in 'abcdefghijklmnopqrstuvwxyz1234567890_') or (len(splits[current_index+1])>0  and splits[current_index+1][0].lower() not in 'abcdefghijklmnopqrstuvwxyz1234567890_'):# first just just check next
  1687.                         val=replace_with
  1688.                 #not blank, then check current endvalue and next first value
  1689.                 else:
  1690.                     if (splits[current_index][-1].lower() not in 'abcdefghijklmnopqrstuvwxyz1234567890_') and (( len(splits[current_index+1])==0 and word_to_find[0].lower() not in 'abcdefghijklmnopqrstuvwxyz1234567890_') or (len(splits[current_index+1])>0  and splits[current_index+1][0].lower() not in 'abcdefghijklmnopqrstuvwxyz1234567890_')):# first just just check next
  1691.                         val=replace_with
  1692.  
  1693.             new_string.append(val)
  1694.             current_index+=1
  1695.         #aaaa=1/0
  1696.         source_str=''.join(new_string)
  1697.     return source_str
  1698.  
  1699. def __itoa(num, radix):
  1700. #    print 'num red',num, radix
  1701.     result = ""
  1702.     if num==0: return '0'
  1703.     while num > 0:
  1704.         result = "0123456789abcdefghijklmnopqrstuvwxyz"[num % radix] + result
  1705.         num /= radix
  1706.     return result
  1707.  
  1708. def __itoaNew(cc, a):
  1709.     aa="" if cc < a else __itoaNew(int(cc / a),a)
  1710.     cc = (cc % a)
  1711.     bb=chr(cc + 29) if cc> 35 else str(__itoa(cc,36))
  1712.     return aa+bb
  1713.  
  1714.  
  1715. def getCookiesString(cookieJar):
  1716.     try:
  1717.         cookieString=""
  1718.         for index, cookie in enumerate(cookieJar):
  1719.             cookieString+=cookie.name + "=" + cookie.value +";"
  1720.     except: pass
  1721.     #print 'cookieString',cookieString
  1722.     return cookieString
  1723.  
  1724.  
  1725. def saveCookieJar(cookieJar,COOKIEFILE):
  1726.     try:
  1727.         complete_path=os.path.join(profile,COOKIEFILE)
  1728.         cookieJar.save(complete_path,ignore_discard=True)
  1729.     except: pass
  1730.  
  1731. def getCookieJar(COOKIEFILE):
  1732.  
  1733.     cookieJar=None
  1734.     if COOKIEFILE:
  1735.         try:
  1736.             complete_path=os.path.join(profile,COOKIEFILE)
  1737.             cookieJar = cookielib.LWPCookieJar()
  1738.             cookieJar.load(complete_path,ignore_discard=True)
  1739.         except:
  1740.             cookieJar=None
  1741.  
  1742.     if not cookieJar:
  1743.         cookieJar = cookielib.LWPCookieJar()
  1744.  
  1745.     return cookieJar
  1746.  
  1747. def doEval(fun_call,page_data,Cookie_Jar,m):
  1748.     ret_val=''
  1749.     if functions_dir not in sys.path:
  1750.         sys.path.append(functions_dir)
  1751.  
  1752. #    print fun_call
  1753.     try:
  1754.         py_file='import '+fun_call.split('.')[0]
  1755. #        print py_file,sys.path
  1756.         exec( py_file)
  1757. #        print 'done'
  1758.     except:
  1759.         #print 'error in import'
  1760.         traceback.print_exc(file=sys.stdout)
  1761. #    print 'ret_val='+fun_call
  1762.     exec ('ret_val='+fun_call)
  1763. #    print ret_val
  1764.     #exec('ret_val=1+1')
  1765.     try:
  1766.         return str(ret_val)
  1767.     except: return ret_val
  1768.  
  1769. def doEvalFunction(fun_call,page_data,Cookie_Jar,m):
  1770. #    print 'doEvalFunction'
  1771.     ret_val=''
  1772.     if functions_dir not in sys.path:
  1773.         sys.path.append(functions_dir)
  1774.     f=open(functions_dir+"/LSProdynamicCode.py","w")
  1775.     f.write(fun_call);
  1776.     f.close()
  1777.     import LSProdynamicCode
  1778.     ret_val=LSProdynamicCode.GetLSProData(page_data,Cookie_Jar,m)
  1779.     try:
  1780.         return str(ret_val)
  1781.     except: return ret_val
  1782.  
  1783.  
  1784. def getGoogleRecaptchaResponse(captchakey, cj,type=1): #1 for get, 2 for post, 3 for rawpost
  1785. #    #headers=[('User-Agent','Mozilla/5.0 (Windows NT 6.1; rv:14.0) Gecko/20100101 Firefox/14.0.1')]
  1786. #    html_text=getUrl(url,noredir=True, cookieJar=cj,headers=headers)
  1787.  #   print 'html_text',html_text
  1788.     recapChallenge=""
  1789.     solution=""
  1790. #    cap_reg="recap.*?\?k=(.*?)\""
  1791. #    match =re.findall(cap_reg, html_text)
  1792.  
  1793.  
  1794. #    print 'match',match
  1795.     captcha=False
  1796.     captcha_reload_response_chall=None
  1797.     solution=None
  1798.     if len(captchakey)>0: #new shiny captcha!
  1799.         captcha_url=captchakey
  1800.         if not captcha_url.startswith('http'):
  1801.             captcha_url='http://www.google.com/recaptcha/api/challenge?k='+captcha_url+'&ajax=1'
  1802. #        print 'captcha_url',captcha_url
  1803.         captcha=True
  1804.  
  1805.         cap_chall_reg='challenge.*?\'(.*?)\''
  1806.         cap_image_reg='\'(.*?)\''
  1807.         captcha_script=getUrl(captcha_url,cookieJar=cj)
  1808.         recapChallenge=re.findall(cap_chall_reg, captcha_script)[0]
  1809.         captcha_reload='http://www.google.com/recaptcha/api/reload?c=';
  1810.         captcha_k=captcha_url.split('k=')[1]
  1811.         captcha_reload+=recapChallenge+'&k='+captcha_k+'&reason=i&type=image&lang=en'
  1812.         captcha_reload_js=getUrl(captcha_reload,cookieJar=cj)
  1813.         captcha_reload_response_chall=re.findall(cap_image_reg, captcha_reload_js)[0]
  1814.         captcha_image_url='http://www.google.com/recaptcha/api/image?c='+captcha_reload_response_chall
  1815.         if not captcha_image_url.startswith("http"):
  1816.             captcha_image_url='http://www.google.com/recaptcha/api/'+captcha_image_url
  1817.         import random
  1818.         n=random.randrange(100,1000,5)
  1819.         local_captcha = os.path.join(profile,str(n) +"captcha.img" )
  1820.         localFile = open(local_captcha, "wb")
  1821.         localFile.write(getUrl(captcha_image_url,cookieJar=cj))
  1822.         localFile.close()
  1823.         solver = InputWindow(captcha=local_captcha)
  1824.         solution = solver.get()
  1825.         os.remove(local_captcha)
  1826.  
  1827.     if captcha_reload_response_chall:
  1828.         if type==1:
  1829.             return 'recaptcha_challenge_field='+urllib.quote_plus(captcha_reload_response_chall)+'&recaptcha_response_field='+urllib.quote_plus(solution)
  1830.         elif type==2:
  1831.             return 'recaptcha_challenge_field:'+captcha_reload_response_chall+',recaptcha_response_field:'+solution
  1832.         else:
  1833.             return 'recaptcha_challenge_field='+urllib.quote_plus(captcha_reload_response_chall)+'&recaptcha_response_field='+urllib.quote_plus(solution)
  1834.     else:
  1835.         return ''
  1836.  
  1837.  
  1838. def getUrl(url, cookieJar=None,post=None, timeout=20, headers=None, noredir=False):
  1839.  
  1840.  
  1841.     cookie_handler = urllib2.HTTPCookieProcessor(cookieJar)
  1842.  
  1843.     if noredir:
  1844.         opener = urllib2.build_opener(NoRedirection,cookie_handler, urllib2.HTTPBasicAuthHandler(), urllib2.HTTPHandler())
  1845.     else:
  1846.         opener = urllib2.build_opener(cookie_handler, urllib2.HTTPBasicAuthHandler(), urllib2.HTTPHandler())
  1847.     #opener = urllib2.install_opener(opener)
  1848.     req = urllib2.Request(url)
  1849.     req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36')
  1850.     if headers:
  1851.         for h,hv in headers:
  1852.             req.add_header(h,hv)
  1853.  
  1854.     response = opener.open(req,post,timeout=timeout)
  1855.     link=response.read()
  1856.     response.close()
  1857.     return link;
  1858.  
  1859. def get_decode(str,reg=None):
  1860.     if reg:
  1861.         str=re.findall(reg, str)[0]
  1862.     s1 = urllib.unquote(str[0: len(str)-1]);
  1863.     t = '';
  1864.     for i in range( len(s1)):
  1865.         t += chr(ord(s1[i]) - s1[len(s1)-1]);
  1866.     t=urllib.unquote(t)
  1867. #    print t
  1868.     return t
  1869.  
  1870. def javascriptUnEscape(str):
  1871.     js=re.findall('unescape\(\'(.*?)\'',str)
  1872. #    print 'js',js
  1873.     if (not js==None) and len(js)>0:
  1874.         for j in js:
  1875.             #print urllib.unquote(j)
  1876.             str=str.replace(j ,urllib.unquote(j))
  1877.     return str
  1878.  
  1879. iid=0
  1880. def askCaptcha(m,html_page, cookieJar):
  1881.     global iid
  1882.     iid+=1
  1883.     expre= m['expres']
  1884.     page_url = m['page']
  1885.     captcha_regex=re.compile('\$LiveStreamCaptcha\[([^\]]*)\]').findall(expre)[0]
  1886.  
  1887.     captcha_url=re.compile(captcha_regex).findall(html_page)[0]
  1888. #    print expre,captcha_regex,captcha_url
  1889.     if not captcha_url.startswith("http"):
  1890.         page_='http://'+"".join(page_url.split('/')[2:3])
  1891.         if captcha_url.startswith("/"):
  1892.             captcha_url=page_+captcha_url
  1893.         else:
  1894.             captcha_url=page_+'/'+captcha_url
  1895.  
  1896.     local_captcha = os.path.join(profile, str(iid)+"captcha.jpg" )
  1897.     localFile = open(local_captcha, "wb")
  1898. #    print ' c capurl',captcha_url
  1899.     req = urllib2.Request(captcha_url)
  1900.     req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; rv:14.0) Gecko/20100101 Firefox/14.0.1')
  1901.     if 'referer' in m:
  1902.         req.add_header('Referer', m['referer'])
  1903.     if 'agent' in m:
  1904.         req.add_header('User-agent', m['agent'])
  1905.     if 'setcookie' in m:
  1906. #        print 'adding cookie',m['setcookie']
  1907.         req.add_header('Cookie', m['setcookie'])
  1908.  
  1909.     #cookie_handler = urllib2.HTTPCookieProcessor(cookieJar)
  1910.     #opener = urllib2.build_opener(cookie_handler, urllib2.HTTPBasicAuthHandler(), urllib2.HTTPHandler())
  1911.     #opener = urllib2.install_opener(opener)
  1912.     urllib2.urlopen(req)
  1913.     response = urllib2.urlopen(req)
  1914.  
  1915.     localFile.write(response.read())
  1916.     response.close()
  1917.     localFile.close()
  1918.     solver = InputWindow(captcha=local_captcha)
  1919.     solution = solver.get()
  1920.     return solution
  1921.  
  1922. def askCaptchaNew(imageregex,html_page,cookieJar,m):
  1923.     global iid
  1924.     iid+=1
  1925.  
  1926.  
  1927.     if not imageregex=='':
  1928.         if html_page.startswith("http"):
  1929.             page_=getUrl(html_page,cookieJar=cookieJar)
  1930.         else:
  1931.             page_=html_page
  1932.         captcha_url=re.compile(imageregex).findall(html_page)[0]
  1933.     else:
  1934.         captcha_url=html_page
  1935.         if 'oneplay.tv/embed' in html_page:
  1936.             import oneplay
  1937.             page_=getUrl(html_page,cookieJar=cookieJar)
  1938.             captcha_url=oneplay.getCaptchaUrl(page_)
  1939.  
  1940.     local_captcha = os.path.join(profile, str(iid)+"captcha.jpg" )
  1941.     localFile = open(local_captcha, "wb")
  1942. #    print ' c capurl',captcha_url
  1943.     req = urllib2.Request(captcha_url)
  1944.     req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; rv:14.0) Gecko/20100101 Firefox/14.0.1')
  1945.     if 'referer' in m:
  1946.         req.add_header('Referer', m['referer'])
  1947.     if 'agent' in m:
  1948.         req.add_header('User-agent', m['agent'])
  1949.     if 'accept' in m:
  1950.         req.add_header('Accept', m['accept'])
  1951.     if 'setcookie' in m:
  1952. #        print 'adding cookie',m['setcookie']
  1953.         req.add_header('Cookie', m['setcookie'])
  1954.  
  1955.     #cookie_handler = urllib2.HTTPCookieProcessor(cookieJar)
  1956.     #opener = urllib2.build_opener(cookie_handler, urllib2.HTTPBasicAuthHandler(), urllib2.HTTPHandler())
  1957.     #opener = urllib2.install_opener(opener)
  1958.     #urllib2.urlopen(req)
  1959.     response = urllib2.urlopen(req)
  1960.  
  1961.     localFile.write(response.read())
  1962.     response.close()
  1963.     localFile.close()
  1964.     solver = InputWindow(captcha=local_captcha)
  1965.     solution = solver.get()
  1966.     return solution
  1967.  
  1968. #########################################################
  1969. # Function  : GUIEditExportName                         #
  1970. #########################################################
  1971. # Parameter :                                           #
  1972. #                                                       #
  1973. # name        sugested name for export                  #
  1974. #                                                       #
  1975. # Returns   :                                           #
  1976. #                                                       #
  1977. # name        name of export excluding any extension    #
  1978. #                                                       #
  1979. #########################################################
  1980. def TakeInput(name, headname):
  1981.  
  1982.  
  1983.     kb = xbmc.Keyboard('default', 'heading', True)
  1984.     kb.setDefault(name)
  1985.     kb.setHeading(headname)
  1986.     kb.setHiddenInput(False)
  1987.     return kb.getText()
  1988.  
  1989.  
  1990. #########################################################
  1991.  
  1992. class InputWindow(xbmcgui.WindowDialog):
  1993.     def __init__(self, *args, **kwargs):
  1994.         self.cptloc = kwargs.get('captcha')
  1995.         self.img = xbmcgui.ControlImage(335,30,624,60,self.cptloc)
  1996.         self.addControl(self.img)
  1997.         self.kbd = xbmc.Keyboard()
  1998.  
  1999.     def get(self):
  2000.         self.show()
  2001.         time.sleep(2)
  2002.         self.kbd.doModal()
  2003.         if (self.kbd.isConfirmed()):
  2004.             text = self.kbd.getText()
  2005.             self.close()
  2006.             return text
  2007.         self.close()
  2008.         return False
  2009.  
  2010. def getEpocTime():
  2011.     import time
  2012.     return str(int(time.time()*1000))
  2013.  
  2014. def getEpocTime2():
  2015.     import time
  2016.     return str(int(time.time()))
  2017.  
  2018. def get_params():
  2019.         param=[]
  2020.         paramstring=sys.argv[2]
  2021.         if len(paramstring)>=2:
  2022.             params=sys.argv[2]
  2023.             cleanedparams=params.replace('?','')
  2024.             if (params[len(params)-1]=='/'):
  2025.                 params=params[0:len(params)-2]
  2026.             pairsofparams=cleanedparams.split('&')
  2027.             param={}
  2028.             for i in range(len(pairsofparams)):
  2029.                 splitparams={}
  2030.                 splitparams=pairsofparams[i].split('=')
  2031.                 if (len(splitparams))==2:
  2032.                     param[splitparams[0]]=splitparams[1]
  2033.         return param
  2034.  
  2035.  
  2036. def getFavorites():
  2037.         items = json.loads(open(favorites).read())
  2038.         total = len(items)
  2039.         for i in items:
  2040.             name = i[0]
  2041.             url = i[1]
  2042.             iconimage = i[2]
  2043.             try:
  2044.                 fanArt = i[3]
  2045.                 if fanArt == None:
  2046.                     raise
  2047.             except:
  2048.                 if addon.getSetting('use_thumb') == "true":
  2049.                     fanArt = iconimage
  2050.                 else:
  2051.                     fanArt = fanart
  2052.             try: playlist = i[5]
  2053.             except: playlist = None
  2054.             try: regexs = i[6]
  2055.             except: regexs = None
  2056.  
  2057.             if i[4] == 0:
  2058.                 addLink(url,name,iconimage,fanArt,'','','','fav',playlist,regexs,total)
  2059.             else:
  2060.                 addDir(name,url,i[4],iconimage,fanart,'','','','','fav')
  2061.  
  2062.  
  2063. def addFavorite(name,url,iconimage,fanart,mode,playlist=None,regexs=None):
  2064.         favList = []
  2065.         try:
  2066.             # seems that after
  2067.             name = name.encode('utf-8', 'ignore')
  2068.         except:
  2069.             pass
  2070.         if os.path.exists(favorites)==False:
  2071.             addon_log('Making Favorites File')
  2072.             favList.append((name,url,iconimage,fanart,mode,playlist,regexs))
  2073.             a = open(favorites, "w")
  2074.             a.write(json.dumps(favList))
  2075.             a.close()
  2076.         else:
  2077.             addon_log('Appending Favorites')
  2078.             a = open(favorites).read()
  2079.             data = json.loads(a)
  2080.             data.append((name,url,iconimage,fanart,mode))
  2081.             b = open(favorites, "w")
  2082.             b.write(json.dumps(data))
  2083.             b.close()
  2084.  
  2085.  
  2086. def rmFavorite(name):
  2087.         data = json.loads(open(favorites).read())
  2088.         for index in range(len(data)):
  2089.             if data[index][0]==name:
  2090.                 del data[index]
  2091.                 b = open(favorites, "w")
  2092.                 b.write(json.dumps(data))
  2093.                 b.close()
  2094.                 break
  2095.         xbmc.executebuiltin("XBMC.Container.Refresh")
  2096.  
  2097. def urlsolver(url):
  2098.     import urlresolver
  2099.     host = urlresolver.HostedMediaFile(url)
  2100.     if host:
  2101.         resolver = urlresolver.resolve(url)
  2102.         resolved = resolver
  2103.         if isinstance(resolved,list):
  2104.             for k in resolved:
  2105.                 quality = addon.getSetting('quality')
  2106.                 if k['quality'] == 'HD'  :
  2107.                     resolver = k['url']
  2108.                     break
  2109.                 elif k['quality'] == 'SD' :
  2110.                     resolver = k['url']
  2111.                 elif k['quality'] == '1080p' and addon.getSetting('1080pquality') == 'true' :
  2112.                     resolver = k['url']
  2113.                     break
  2114.         else:
  2115.             resolver = resolved
  2116.     else:
  2117.         xbmc.executebuiltin("XBMC.Notification(brstuga,Urlresolver donot support this domain. - ,5000)")
  2118.     return resolver
  2119. def play_playlist(name, mu_playlist,queueVideo=None):
  2120.         playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO)
  2121.  
  2122.         if addon.getSetting('ask_playlist_items') == 'true' and not queueVideo :
  2123.             import urlparse
  2124.             names = []
  2125.             iloop=0
  2126.             print mu_playlist
  2127.             for i in mu_playlist:
  2128.                 print i
  2129.                 if '$$lsname=' in i:
  2130.                     d_name=i.split('$$lsname=')[1].split('&regexs')[0]
  2131.                     names.append(d_name)
  2132.                     mu_playlist[iloop]=i.split('$$lsname=')[0]+('&regexs'+i.split('&regexs')[1] if '&regexs' in i else '')
  2133.                 else:
  2134.                     d_name=urlparse.urlparse(i).netloc
  2135.                     if d_name == '':
  2136.                         names.append(name)
  2137.                     else:
  2138.                         names.append(d_name)
  2139.  
  2140.                 iloop+=1
  2141.             dialog = xbmcgui.Dialog()
  2142.             index = dialog.select('ESCOLHA UMA OPÇÃO', names)
  2143.             if index >= 0:
  2144.                 playname=names[index]
  2145.                 print 'playnamexx',playname
  2146.                 if "&mode=19" in mu_playlist[index]:
  2147.                         #playsetresolved (urlsolver(mu_playlist[index].replace('&mode=19','')),name,iconimage,True)
  2148.                     liz = xbmcgui.ListItem(playname, iconImage=iconimage)
  2149.                     liz.setInfo(type='Video', infoLabels={'Title':playname})
  2150.                     liz.setProperty("IsPlayable","true")
  2151.                     urltoplay=urlsolver(mu_playlist[index].replace('&mode=19','').replace(';',''))
  2152.                     liz.setPath(urltoplay)
  2153.                     xbmc.Player().play(urltoplay,liz)
  2154.                 elif "$doregex" in mu_playlist[index] :
  2155. #                    print mu_playlist[index]
  2156.                     sepate = mu_playlist[index].split('&regexs=')
  2157. #                    print sepate
  2158.                     url,setresolved = getRegexParsed(sepate[1], sepate[0])
  2159.                     url2 = url.replace(';','')
  2160.                     liz = xbmcgui.ListItem(playname, iconImage=iconimage)
  2161.                     liz.setInfo(type='Video', infoLabels={'Title':playname})
  2162.                     liz.setProperty("IsPlayable","true")
  2163.                     liz.setPath(url2)
  2164.                     xbmc.Player().play(url2,liz)
  2165.  
  2166.                 else:
  2167.                     url = mu_playlist[index]
  2168.                     url=url.split('&regexs=')[0]
  2169.                     liz = xbmcgui.ListItem(playname, iconImage=iconimage)
  2170.                     liz.setInfo(type='Video', infoLabels={'Title':playname})
  2171.                     liz.setProperty("IsPlayable","true")
  2172.                     liz.setPath(url)
  2173.                     xbmc.Player().play(url,liz)
  2174.         elif not queueVideo:
  2175.             #playlist = xbmc.PlayList(1) # 1 means video
  2176.             playlist.clear()
  2177.             item = 0
  2178.             for i in mu_playlist:
  2179.                 item += 1
  2180.                 info = xbmcgui.ListItem('%s) %s' %(str(item),name))
  2181.                 # Don't do this as regex parsed might take longer
  2182.                 try:
  2183.                     if "$doregex" in i:
  2184.                         sepate = i.split('&regexs=')
  2185. #                        print sepate
  2186.                         url,setresolved = getRegexParsed(sepate[1], sepate[0])
  2187.                     elif "&mode=19" in i:
  2188.                         url = urlsolver(i.replace('&mode=19','').replace(';',''))
  2189.                     if url:
  2190.                         playlist.add(url, info)
  2191.                     else:
  2192.                         raise
  2193.                 except Exception:
  2194.                     playlist.add(i, info)
  2195.                     pass #xbmc.Player().play(url)
  2196.  
  2197.             xbmc.executebuiltin('playlist.playoffset(video,0)')
  2198.         else:
  2199.  
  2200.                 listitem = xbmcgui.ListItem(name)
  2201.                 playlist.add(mu_playlist, listitem)
  2202.  
  2203. '''
  2204. def download_file(name, url):
  2205.        if addon.getSetting('save_location') == "":
  2206.            xbmc.executebuiltin("XBMC.Notification('Mr-Wil-Stream','Choose a location to save files.',15000,"+icon+")")
  2207.            addon.openSettings()
  2208.        params = {'url': url, 'download_path': addon.getSetting('save_location')}
  2209.        downloader.download(name, params)
  2210.        dialog = xbmcgui.Dialog()
  2211.        ret = dialog.yesno('brstuga', 'Do you want to add this file as a source?')
  2212.        if ret:
  2213.            addSource(os.path.join(addon.getSetting('save_location'), name))
  2214. '''
  2215. def _search(url,name):#http://www.xbmc4xbox.org.uk/wiki/Window_IDs
  2216.     pluginsearchurls = ['1','2','3','4','5']
  2217.     names = ['[COLOR blue]Tv Guide[/COLOR]','Genesis','Exodus Filmes','Settings','Meus Addons']
  2218.     dialog = xbmcgui.Dialog()
  2219.     index = dialog.select('Escolha o Add-on', names)
  2220.     if index >= 0:
  2221.         urls = pluginsearchurls[index]
  2222.     for url in urls:
  2223.         if '1' in url:
  2224.             xbmc.executebuiltin('RunAddon(script.tvguide)')
  2225.         elif '2' in url:
  2226.             xbmc.executebuiltin('RunAddon(plugin.video.genesis)')
  2227.         elif '3' in url:
  2228.             xbmc.executebuiltin('ActivateWindow(10006,"plugin://plugin.video.exodus/?action=movieNavigator",return)')#metodo 2
  2229.         elif '4' in url:
  2230.             xbmc.executebuiltin("ActivateWindow(videossettings)") #Ou ("ActivateWindow(settings,add-ons)")
  2231.         elif '5' in url:
  2232.             xbmc.executebuiltin('ActivateWindow(10040,addons://repository.noobsandnerds/xbmc.addon.executable)')
  2233.         else:
  2234.             pass
  2235.  
  2236. def addDir(name,url,mode,iconimage,fanart,description,genre,date,credits,showcontext=False,regexs=None,reg_url=None,allinfo={}):
  2237.  
  2238.         u=sys.argv[0]+"?url="+urllib.quote_plus(url)+"&mode="+str(mode)+"&name="+urllib.quote_plus(name)+"&fanart="+urllib.quote_plus(fanart)
  2239.         ok=True
  2240.         if date == '':
  2241.             date = None
  2242.         else:
  2243.             description += '\n\nDate: %s' %date
  2244.         liz=xbmcgui.ListItem(name, iconImage="DefaultFolder.png", thumbnailImage=iconimage)
  2245.         if len(allinfo) <1 :
  2246.             liz.setInfo(type="Video", infoLabels={ "Title": name, "Plot": description, "Genre": genre, "dateadded": date, "credits": credits })
  2247.         else:
  2248.             liz.setInfo(type="Video", infoLabels= allinfo)
  2249.         liz.setProperty("Fanart_Image", fanart)
  2250.         if showcontext:
  2251.             contextMenu = []
  2252.             parentalblock =addon.getSetting('parentalblocked')
  2253.             parentalblock= parentalblock=="true"
  2254.             parentalblockedpin =addon.getSetting('parentalblockedpin')
  2255. #            print 'parentalblockedpin',parentalblockedpin
  2256.             if len(parentalblockedpin)>0:
  2257.                 if parentalblock:
  2258.                     contextMenu.append(('Disable Parental Block','XBMC.RunPlugin(%s?mode=55&name=%s)' %(sys.argv[0], urllib.quote_plus(name))))
  2259.                 else:
  2260.                     contextMenu.append(('Enable Parental Block','XBMC.RunPlugin(%s?mode=56&name=%s)' %(sys.argv[0], urllib.quote_plus(name))))
  2261.             elif showcontext == 'download':
  2262.                 contextMenu.append(('Download','XBMC.RunPlugin(%s?url=%s&mode=9&name=%s)'
  2263.                                     %(sys.argv[0], urllib.quote_plus(url), urllib.quote_plus(name))))
  2264.             if showcontext == '!!update':
  2265.                 fav_params2 = (
  2266.                     '%s?url=%s&mode=17&regexs=%s'
  2267.                     %(sys.argv[0], urllib.quote_plus(reg_url), regexs)
  2268.                     )
  2269.                 contextMenu.append(('[COLOR yellow]!!update[/COLOR]','XBMC.RunPlugin(%s)' %fav_params2))
  2270.         ok=xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz,isFolder=True)
  2271.         return ok
  2272. def ytdl_download(url,title,media_type='video'):
  2273.     # play in xbmc while playing go back to contextMenu(c) to "!!Download!!"
  2274.     # Trial yasceen: seperate |User-Agent=
  2275.     import youtubedl
  2276.     if not url == '':
  2277.         if media_type== 'audio':
  2278.             youtubedl.single_YD(url,download=True,audio=True)
  2279.         else:
  2280.             youtubedl.single_YD(url,download=True)
  2281.     elif xbmc.Player().isPlaying() == True :
  2282.         import YDStreamExtractor
  2283.         if YDStreamExtractor.isDownloading() == True:
  2284.  
  2285.             YDStreamExtractor.manageDownloads()
  2286.         else:
  2287.             xbmc_url = xbmc.Player().getPlayingFile()
  2288.  
  2289.             xbmc_url = xbmc_url.split('|User-Agent=')[0]
  2290.             info = {'url':xbmc_url,'title':title,'media_type':media_type}
  2291.             youtubedl.single_YD('',download=True,dl_info=info)
  2292.     else:
  2293.         xbmc.executebuiltin("XBMC.Notification(DOWNLOAD,First Play [COLOR yellow]WHILE playing download[/COLOR] ,10000)")
  2294.  
  2295. ## Lunatixz PseudoTV feature
  2296. def ascii(string):
  2297.     if isinstance(string, basestring):
  2298.         if isinstance(string, unicode):
  2299.            string = string.encode('ascii', 'ignore')
  2300.     return string
  2301. def uni(string, encoding = 'utf-8'):
  2302.     if isinstance(string, basestring):
  2303.         if not isinstance(string, unicode):
  2304.             string = unicode(string, encoding, 'ignore')
  2305.     return string
  2306. def removeNonAscii(s): return "".join(filter(lambda x: ord(x)<128, s))
  2307.  
  2308. def sendJSON( command):
  2309.     data = ''
  2310.     try:
  2311.         data = xbmc.executeJSONRPC(uni(command))
  2312.     except UnicodeEncodeError:
  2313.         data = xbmc.executeJSONRPC(ascii(command))
  2314.  
  2315.     return uni(data)
  2316.  
  2317. def pluginquerybyJSON(url,give_me_result=None,playlist=False):
  2318.     if 'audio' in url:
  2319.         json_query = uni('{"jsonrpc":"2.0","method":"Files.GetDirectory","params": {"directory":"%s","media":"video", "properties": ["title", "album", "artist", "duration","thumbnail", "year"]}, "id": 1}') %url
  2320.     else:
  2321.         json_query = uni('{"jsonrpc":"2.0","method":"Files.GetDirectory","params":{"directory":"%s","media":"video","properties":[ "plot","playcount","director", "genre","votes","duration","trailer","premiered","thumbnail","title","year","dateadded","fanart","rating","season","episode","studio","mpaa"]},"id":1}') %url
  2322.     json_folder_detail = json.loads(sendJSON(json_query))
  2323.     #print json_folder_detail
  2324.     if give_me_result:
  2325.         return json_folder_detail
  2326.     if json_folder_detail.has_key('error'):
  2327.         return
  2328.     else:
  2329.  
  2330.         for i in json_folder_detail['result']['files'] :
  2331.             meta ={}
  2332.             url = i['file']
  2333.             name = removeNonAscii(i['label'])
  2334.             thumbnail = removeNonAscii(i['thumbnail'])
  2335.             fanart = removeNonAscii(i['fanart'])
  2336.             meta = dict((k,v) for k, v in i.iteritems() if not v == '0' or not v == -1 or v == '')
  2337.             meta.pop("file", None)
  2338.             if i['filetype'] == 'file':
  2339.                 if playlist:
  2340.                     play_playlist(name,url,queueVideo='1')
  2341.                     continue
  2342.                 else:
  2343.                     addLink(url,name,thumbnail,fanart,'','','','',None,'',total=len(json_folder_detail['result']['files']),allinfo=meta)
  2344.                     #xbmc.executebuiltin("Container.SetViewMode(500)")
  2345.                     if i['type'] and i['type'] == 'tvshow' :
  2346.                         xbmcplugin.setContent(int(sys.argv[1]), 'tvshows')
  2347.                     elif i['episode'] > 0 :
  2348.                         xbmcplugin.setContent(int(sys.argv[1]), 'episodes')
  2349.  
  2350.             else:
  2351.                 addDir(name,url,53,thumbnail,fanart,'','','','',allinfo=meta)
  2352.         xbmcplugin.endOfDirectory(int(sys.argv[1]))
  2353.  
  2354. def addLink(url,name,iconimage,fanart,description,genre,date,showcontext,playlist,regexs,total,setCookie="",allinfo={}):
  2355.         #print 'url,name',url,name
  2356.         contextMenu =[]
  2357.         parentalblock =addon.getSetting('parentalblocked')
  2358.         parentalblock= parentalblock=="true"
  2359.         parentalblockedpin =addon.getSetting('parentalblockedpin')
  2360. #        print 'parentalblockedpin',parentalblockedpin
  2361.         if len(parentalblockedpin)>0:
  2362.             if parentalblock:
  2363.                 contextMenu.append(('Disable Parental Block','XBMC.RunPlugin(%s?mode=55&name=%s)' %(sys.argv[0], urllib.quote_plus(name))))
  2364.             else:
  2365.                 contextMenu.append(('Enable Parental Block','XBMC.RunPlugin(%s?mode=56&name=%s)' %(sys.argv[0], urllib.quote_plus(name))))
  2366.  
  2367.         try:
  2368.             name = name.encode('utf-8')
  2369.         except: pass
  2370.         ok = True
  2371.         isFolder=False
  2372.         if regexs:
  2373.             mode = '17'
  2374.             if 'listrepeat' in regexs:
  2375.                 isFolder=True
  2376. #                print 'setting as folder in link'
  2377.             contextMenu.append(('[COLOR white]!!Download Currently Playing!![/COLOR]','XBMC.RunPlugin(%s?url=%s&mode=21&name=%s)'
  2378.                                     %(sys.argv[0], urllib.quote_plus(url), urllib.quote_plus(name))))
  2379.         elif  (any(x in url for x in resolve_url) and  url.startswith('http')) or url.endswith('&mode=19'):
  2380.             url=url.replace('&mode=19','')
  2381.             mode = '19'
  2382.             contextMenu.append(('[COLOR white]!!Download Currently Playing!![/COLOR]','XBMC.RunPlugin(%s?url=%s&mode=21&name=%s)'
  2383.                                     %(sys.argv[0], urllib.quote_plus(url), urllib.quote_plus(name))))
  2384.         elif url.endswith('&mode=18'):
  2385.             url=url.replace('&mode=18','')
  2386.             mode = '18'
  2387.             contextMenu.append(('[COLOR white]!!Download!![/COLOR]','XBMC.RunPlugin(%s?url=%s&mode=23&name=%s)'
  2388.                                     %(sys.argv[0], urllib.quote_plus(url), urllib.quote_plus(name))))
  2389.             if addon.getSetting('dlaudioonly') == 'true':
  2390.                 contextMenu.append(('!!Download [COLOR seablue]Audio!![/COLOR]','XBMC.RunPlugin(%s?url=%s&mode=24&name=%s)'
  2391.                                         %(sys.argv[0], urllib.quote_plus(url), urllib.quote_plus(name))))
  2392.         elif url.startswith('magnet:?xt='):
  2393.             if '&' in url and not '&amp;' in url :
  2394.                 url = url.replace('&','&amp;')
  2395.             url = 'plugin://plugin.video.pulsar/play?uri=' + url
  2396.             mode = '12'
  2397.         else:
  2398.             mode = '12'
  2399.             contextMenu.append(('[COLOR white]!!Download Currently Playing!![/COLOR]','XBMC.RunPlugin(%s?url=%s&mode=21&name=%s)'
  2400.                                     %(sys.argv[0], urllib.quote_plus(url), urllib.quote_plus(name))))
  2401.         if 'plugin://plugin.video.youtube/play/?video_id=' in url:
  2402.               yt_audio_url = url.replace('plugin://plugin.video.youtube/play/?video_id=','https://www.youtube.com/watch?v=')
  2403.               contextMenu.append(('!!Download [COLOR blue]Audio!![/COLOR]','XBMC.RunPlugin(%s?url=%s&mode=24&name=%s)'
  2404.                                       %(sys.argv[0], urllib.quote_plus(yt_audio_url), urllib.quote_plus(name))))
  2405.         u=sys.argv[0]+"?"
  2406.         play_list = False
  2407.         if playlist:
  2408.             if addon.getSetting('add_playlist') == "false" and '$$LSPlayOnlyOne$$' not in playlist[0] :
  2409.                 u += "url="+urllib.quote_plus(url)+"&mode="+mode
  2410.             else:
  2411.                 u += "mode=13&name=%s&playlist=%s" %(urllib.quote_plus(name), urllib.quote_plus(str(playlist).replace(',','||')))
  2412.                 name = name + '[B][COLOR gold][B] (' + str(len(playlist)) + ' OPÇÕES )[/COLOR][/B]'
  2413.                 play_list = True
  2414.         else:
  2415.             u += "url="+urllib.quote_plus(url)+"&mode="+mode
  2416.         if regexs:
  2417.             u += "&regexs="+regexs
  2418.         if not setCookie == '':
  2419.             u += "&setCookie="+urllib.quote_plus(setCookie)
  2420.  
  2421.         if date == '':
  2422.             date = None
  2423.         else:
  2424.             description += '\n\nDate: %s' %date
  2425.         liz=xbmcgui.ListItem(name, iconImage="DefaultVideo.png", thumbnailImage=iconimage)
  2426.         if len(allinfo) <1:
  2427.             liz.setInfo(type="Video", infoLabels={ "Title": name, "Plot": description, "Genre": genre, "dateadded": date })
  2428.  
  2429.         else:
  2430.             liz.setInfo(type="Video", infoLabels=allinfo)
  2431.         liz.setProperty("Fanart_Image", fanart)
  2432.  
  2433.         if (not play_list) and not any(x in url for x in g_ignoreSetResolved) and not '$PLAYERPROXY$=' in url:#  (not url.startswith('plugin://plugin.video.f4mTester')):
  2434.             if regexs:
  2435.                 #print urllib.unquote_plus(regexs)
  2436.                 if '$pyFunction:playmedia(' not in urllib.unquote_plus(regexs) and 'notplayable' not in urllib.unquote_plus(regexs) and 'listrepeat' not in  urllib.unquote_plus(regexs) :
  2437.                     #print 'setting isplayable',url, urllib.unquote_plus(regexs),url
  2438.                     liz.setProperty('IsPlayable', 'true')
  2439.             else:
  2440.                 liz.setProperty('IsPlayable', 'true')
  2441.         else:
  2442.             addon_log( 'NOT setting isplayable'+url)
  2443.         if showcontext:
  2444.             #contextMenu = []
  2445.                 fav_params = (
  2446.                     '%s?mode=5&name=%s&url=%s&iconimage=%s&fanart=%s&fav_mode=0'
  2447.                     %(sys.argv[0], urllib.quote_plus(name), urllib.quote_plus(url), urllib.quote_plus(iconimage), urllib.quote_plus(fanart))
  2448.                     )
  2449.                 if playlist:
  2450.                     fav_params += 'playlist='+urllib.quote_plus(str(playlist).replace(',','||'))
  2451.                 if regexs:
  2452.                     fav_params += "&regexs="+regexs
  2453.         if not playlist is None:
  2454.             if addon.getSetting('add_playlist') == "false":
  2455.                 playlist_name = name.split(') ')[1]
  2456.                 contextMenu_ = [
  2457.                     ('Play '+playlist_name+' PlayList','XBMC.RunPlugin(%s?mode=13&name=%s&playlist=%s)'
  2458.                      %(sys.argv[0], urllib.quote_plus(playlist_name), urllib.quote_plus(str(playlist).replace(',','||'))))
  2459.                      ]
  2460.                 liz.addContextMenuItems(contextMenu_)
  2461.         #print 'adding',name
  2462.         ok=xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz,totalItems=total,isFolder=isFolder)
  2463.         #print 'added',name
  2464.         return ok
  2465. def playsetresolved(url,name,iconimage,setresolved=True):
  2466.     if setresolved:
  2467.         setres=True
  2468.         if '$$LSDirect$$' in url:
  2469.             url=url.replace('$$LSDirect$$','')
  2470.             setres=False
  2471.  
  2472.         liz = xbmcgui.ListItem(name, iconImage=iconimage)
  2473.         liz.setInfo(type='Video', infoLabels={'Title':name})
  2474.         liz.setProperty("IsPlayable","true")
  2475.         liz.setPath(url)
  2476.         if not setres:
  2477.             xbmc.Player().play(url)
  2478.         else:
  2479.             xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, liz)
  2480.  
  2481.     else:
  2482.         xbmc.executebuiltin('XBMC.RunPlugin('+url+')')
  2483.  
  2484.  
  2485. ## Thanks to daschacka, an epg scraper for http://i.teleboy.ch/programm/station_select.php
  2486. ##  http://forum.xbmc.org/post.php?p=936228&postcount=1076
  2487. def getepg(link):
  2488.         url=urllib.urlopen(link)
  2489.         source=url.read()
  2490.         url.close()
  2491.         source2 = source.split("Jetzt")
  2492.         source3 = source2[1].split('programm/detail.php?const_id=')
  2493.         sourceuhrzeit = source3[1].split('<br /><a href="/')
  2494.         nowtime = sourceuhrzeit[0][40:len(sourceuhrzeit[0])]
  2495.         sourcetitle = source3[2].split("</a></p></div>")
  2496.         nowtitle = sourcetitle[0][17:len(sourcetitle[0])]
  2497.         nowtitle = nowtitle.encode('utf-8')
  2498.         return "  - "+nowtitle+" - "+nowtime
  2499.  
  2500.  
  2501. def get_epg(url, regex):
  2502.         data = makeRequest(url)
  2503.         try:
  2504.             item = re.findall(regex, data)[0]
  2505.             return item
  2506.         except:
  2507.             addon_log('regex failed')
  2508.             addon_log(regex)
  2509.             return
  2510.  
  2511.  
  2512. ##not a generic implemenation as it needs to convert
  2513. def d2x(d, root="root",nested=0):
  2514.  
  2515.     op = lambda tag: '<' + tag + '>'
  2516.     cl = lambda tag: '</' + tag + '>\n'
  2517.  
  2518.     ml = lambda v,xml: xml + op(key) + str(v) + cl(key)
  2519.     xml = op(root) + '\n' if root else ""
  2520.  
  2521.     for key,vl in d.iteritems():
  2522.         vtype = type(vl)
  2523.         if nested==0: key='regex' #enforcing all top level tags to be named as regex
  2524.         if vtype is list:
  2525.             for v in vl:
  2526.                 v=escape(v)
  2527.                 xml = ml(v,xml)
  2528.  
  2529.         if vtype is dict:
  2530.             xml = ml('\n' + d2x(vl,None,nested+1),xml)
  2531.         if vtype is not list and vtype is not dict:
  2532.             if not vl is None: vl=escape(vl)
  2533.             #print repr(vl)
  2534.             if vl is None:
  2535.                 xml = ml(vl,xml)
  2536.             else:
  2537.                 #xml = ml(escape(vl.encode("utf-8")),xml)
  2538.                 xml = ml(vl.encode("utf-8"),xml)
  2539.  
  2540.     xml += cl(root) if root else ""
  2541.  
  2542.     return xml
  2543. xbmcplugin.setContent(int(sys.argv[1]), 'movies')
  2544.  
  2545. try:
  2546.     xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_UNSORTED)
  2547. except:
  2548.     pass
  2549. try:
  2550.     xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_LABEL)
  2551. except:
  2552.     pass
  2553. try:
  2554.     xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_DATE)
  2555. except:
  2556.     pass
  2557. try:
  2558.     xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_GENRE)
  2559. except:
  2560.     pass
  2561.  
  2562. params=get_params()
  2563.  
  2564. url=None
  2565. name=None
  2566. mode=None
  2567. playlist=None
  2568. iconimage=None
  2569. fanart=FANART
  2570. playlist=None
  2571. fav_mode=None
  2572. regexs=None
  2573.  
  2574. try:
  2575.     url=urllib.unquote_plus(params["url"]).decode('utf-8')
  2576. except:
  2577.     pass
  2578. try:
  2579.     name=urllib.unquote_plus(params["name"])
  2580. except:
  2581.     pass
  2582. try:
  2583.     iconimage=urllib.unquote_plus(params["iconimage"])
  2584. except:
  2585.     pass
  2586. try:
  2587.     fanart=urllib.unquote_plus(params["fanart"])
  2588. except:
  2589.     pass
  2590. try:
  2591.     mode=int(params["mode"])
  2592. except:
  2593.     pass
  2594. try:
  2595.     playlist=eval(urllib.unquote_plus(params["playlist"]).replace('||',','))
  2596. except:
  2597.     pass
  2598. try:
  2599.     fav_mode=int(params["fav_mode"])
  2600. except:
  2601.     pass
  2602. try:
  2603.     regexs=params["regexs"]
  2604. except:
  2605.     pass
  2606. playitem=''
  2607. try:
  2608.     playitem=urllib.unquote_plus(params["playitem"])
  2609. except:
  2610.     pass
  2611.  
  2612. addon_log("Mode: "+str(mode))
  2613.  
  2614.  
  2615. if not url is None:
  2616.     addon_log("URL: "+str(url.encode('utf-8')))
  2617. addon_log("Name: "+str(name))
  2618.  
  2619. if not playitem =='':
  2620.     s=getSoup('',data=playitem)
  2621.     name,url,regexs=getItems(s,None,dontLink=True)
  2622.     mode=117
  2623. '''
  2624. if mode==None:
  2625.    addon_log("getSources")
  2626.    getSources()
  2627.    xbmcplugin.endOfDirectory(int(sys.argv[1]))
  2628. '''
  2629. if mode==None:
  2630.     addon_log("Index")
  2631.     CHIndex()
  2632.  
  2633. elif mode==1:
  2634.     addon_log("getData")
  2635.     data=None
  2636.     if regexs:
  2637.         data=getRegexParsed(regexs, url)
  2638.         url=''
  2639.         #create xml here
  2640.     getData(url,fanart,data)
  2641.     xbmcplugin.endOfDirectory(int(sys.argv[1]))
  2642.  
  2643. elif mode==2:
  2644.     addon_log("getChannelItems")
  2645.     getChannelItems(name,url,fanart)
  2646.     xbmcplugin.endOfDirectory(int(sys.argv[1]))
  2647.  
  2648. elif mode==3:
  2649.     addon_log("getSubChannelItems")
  2650.     getSubChannelItems(name,url,fanart)
  2651.     xbmcplugin.endOfDirectory(int(sys.argv[1]))
  2652.  
  2653. elif mode==4:
  2654.     addon_log("getFavorites")
  2655.     getFavorites()
  2656.     xbmcplugin.endOfDirectory(int(sys.argv[1]))
  2657.  
  2658. elif mode==5:
  2659.     addon_log("addFavorite")
  2660.     try:
  2661.         name = name.split('\\ ')[1]
  2662.     except:
  2663.         pass
  2664.     try:
  2665.         name = name.split('  - ')[0]
  2666.     except:
  2667.         pass
  2668.     addFavorite(name,url,iconimage,fanart,fav_mode)
  2669.  
  2670. elif mode==6:
  2671.     addon_log("rmFavorite")
  2672.     try:
  2673.         name = name.split('\\ ')[1]
  2674.     except:
  2675.         pass
  2676.     try:
  2677.         name = name.split('  - ')[0]
  2678.     except:
  2679.         pass
  2680.     rmFavorite(name)
  2681.  
  2682. elif mode==7:
  2683.     addon_log("addSource")
  2684.     addSource(url)
  2685.  
  2686. elif mode==8:
  2687.     addon_log("rmSource")
  2688.     rmSource(name)
  2689.  
  2690. elif mode==9:
  2691.     addon_log("download_file")
  2692.     download_file(name, url)
  2693.  
  2694. elif mode==10:
  2695.     addon_log("getCommunitySources")
  2696.     getCommunitySources()
  2697.  
  2698. elif mode==11:
  2699.     addon_log("addSource")
  2700.     addSource(url)
  2701.  
  2702. elif mode==12:
  2703.     addon_log("setResolvedUrl")
  2704.     if not url.startswith("plugin://plugin") or not any(x in url for x in g_ignoreSetResolved):#not url.startswith("plugin://plugin.video.f4mTester") :
  2705.         setres=True
  2706.         if '$$LSDirect$$' in url:
  2707.             url=url.replace('$$LSDirect$$','')
  2708.             setres=False
  2709.         item = xbmcgui.ListItem(path=url)
  2710.         if not setres:
  2711.             xbmc.Player().play(url)
  2712.         else:
  2713.             xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, item)
  2714.     else:
  2715. #        print 'Not setting setResolvedUrl'
  2716.         xbmc.executebuiltin('XBMC.RunPlugin('+url+')')
  2717.  
  2718.  
  2719. elif mode==13:
  2720.     addon_log("play_playlist")
  2721.     play_playlist(name, playlist)
  2722.  
  2723. elif mode==14:
  2724.     addon_log("get_xml_database")
  2725.     get_xml_database(url)
  2726.     xbmcplugin.endOfDirectory(int(sys.argv[1]))
  2727.  
  2728. elif mode==15:
  2729.     addon_log("browse_xml_database")
  2730.     get_xml_database(url, True)
  2731.     xbmcplugin.endOfDirectory(int(sys.argv[1]))
  2732.  
  2733. elif mode==16:
  2734.     addon_log("browse_community")
  2735.     getCommunitySources(url,browse=True)
  2736.     xbmcplugin.endOfDirectory(int(sys.argv[1]))
  2737.  
  2738. elif mode==17 or mode==117:
  2739.     addon_log("getRegexParsed")
  2740.  
  2741.     data=None
  2742.     if regexs and 'listrepeat' in urllib.unquote_plus(regexs):
  2743.         listrepeat,ret,m,regexs =getRegexParsed(regexs, url)
  2744.         #print listrepeat,ret,m,regexs
  2745.         d=''
  2746. #        print 'm is' , m
  2747. #        print 'regexs',regexs
  2748.         regexname=m['name']
  2749.         existing_list=regexs.pop(regexname)
  2750.  #       print 'final regexs',regexs,regexname
  2751.         url=''
  2752.         import copy
  2753.         ln=''
  2754.         rnumber=0
  2755.         for obj in ret:
  2756.             try:
  2757.                 rnumber+=1
  2758.                 newcopy=copy.deepcopy(regexs)
  2759.     #            print 'newcopy',newcopy, len(newcopy)
  2760.                 listrepeatT=listrepeat
  2761.                 i=0
  2762.                 for i in range(len(obj)):
  2763.     #                print 'i is ',i, len(obj), len(newcopy)
  2764.                     if len(newcopy)>0:
  2765.                         for the_keyO, the_valueO in newcopy.iteritems():
  2766.                             if the_valueO is not None:
  2767.                                 for the_key, the_value in the_valueO.iteritems():
  2768.                                     if the_value is not None:
  2769.         #                                print  'key and val',the_key, the_value
  2770.         #                                print 'aa'
  2771.         #                                print '[' + regexname+'.param'+str(i+1) + ']'
  2772.         #                                print repr(obj[i])
  2773.                                         if type(the_value) is dict:
  2774.                                             for the_keyl, the_valuel in the_value.iteritems():
  2775.                                                 if the_valuel is not None:
  2776.                                                     if isinstance(obj,tuple):
  2777.                                                         try:
  2778.                                                             the_value[the_keyl]=the_valuel.replace('[' + regexname+'.param'+str(i+1) + ']', obj[i].decode('utf-8') )
  2779.                                                         except:
  2780.                                                             the_value[the_keyl]=the_valuel.replace('[' + regexname+'.param'+str(i+1) + ']', obj[i] )
  2781.                                                     else:
  2782.                                                         try:
  2783.                                                             the_value[the_keyl]=the_valuel.replace('[' + regexname+'.param'+str(i+1) + ']', obj.decode('utf-8') )
  2784.                                                         except:
  2785.                                                             the_value[the_keyl]=the_valuel.replace('[' + regexname+'.param'+str(i+1) + ']', obj)
  2786.                                         else:
  2787.                                             if isinstance(obj,tuple):
  2788.                                                 try:
  2789.                                                      the_valueO[the_key]=the_value.replace('[' + regexname+'.param'+str(i+1) + ']', obj[i].decode('utf-8') )
  2790.                                                 except:
  2791.                                                     the_valueO[the_key]=the_value.replace('[' + regexname+'.param'+str(i+1) + ']', obj[i] )
  2792.                                             else:
  2793.                                                 try:
  2794.                                                     the_valueO[the_key]=the_value.replace('[' + regexname+'.param'+str(i+1) + ']', obj.decode('utf-8') )
  2795.                                                 except:
  2796.                                                     the_valueO[the_key]=the_value.replace('[' + regexname+'.param'+str(i+1) + ']', obj)
  2797.                     if isinstance(obj,tuple):
  2798.                         try:
  2799.                             listrepeatT=listrepeatT.replace('[' + regexname+'.param'+str(i+1) + ']',obj[i].decode('utf-8'))
  2800.                         except:
  2801.                             listrepeatT=listrepeatT.replace('[' + regexname+'.param'+str(i+1) + ']',obj[i])
  2802.                     else:
  2803.                         try:
  2804.                             listrepeatT=listrepeatT.replace('[' + regexname+'.param'+str(i+1) + ']',obj.decode('utf-8'))
  2805.                         except:
  2806.                             listrepeatT=listrepeatT.replace('[' + regexname+'.param'+str(i+1) + ']',obj)
  2807. #                    print listrepeatT
  2808.                 listrepeatT=listrepeatT.replace('[' + regexname+'.param'+str(0) + ']',str(rnumber))
  2809.  
  2810.                 #newcopy = urllib.quote(repr(newcopy))
  2811.     #            print 'new regex list', repr(newcopy), repr(listrepeatT)
  2812.     #            addLink(listlinkT,listtitleT.encode('utf-8', 'ignore'),listthumbnailT,'','','','',True,None,newcopy, len(ret))
  2813.                 regex_xml=''
  2814.                 if len(newcopy)>0:
  2815.                     regex_xml=d2x(newcopy,'lsproroot')
  2816.                     regex_xml=regex_xml.split('<lsproroot>')[1].split('</lsproroot')[0]
  2817.  
  2818.                 #ln+='\n<item>%s\n%s</item>'%(listrepeatT.encode("utf-8"),regex_xml)
  2819.                 try:
  2820.                     ln+='\n<item>%s\n%s</item>'%(listrepeatT,regex_xml)
  2821.                 except: ln+='\n<item>%s\n%s</item>'%(listrepeatT.encode("utf-8"),regex_xml)
  2822.             except: traceback.print_exc(file=sys.stdout)
  2823. #            print repr(ln)
  2824. #            print newcopy
  2825.  
  2826. #            ln+='</item>'
  2827.         #print 'ln',repr(ln)
  2828.         addon_log(repr(ln))
  2829.         getData('','',ln)
  2830.         xbmcplugin.endOfDirectory(int(sys.argv[1]))
  2831.     else:
  2832.         url,setresolved = getRegexParsed(regexs, url)
  2833.         #print repr(url),setresolved,'imhere'
  2834.         if url:
  2835.             if '$PLAYERPROXY$=' in url:
  2836.                 url,proxy=url.split('$PLAYERPROXY$=')
  2837. #                print 'proxy',proxy
  2838.                 proxyip,port=proxy.split(':')
  2839.                 playmediawithproxy(url,name,iconimage,proxyip,port )
  2840.             else:
  2841.                 playsetresolved(url,name,iconimage,setresolved)
  2842.         else:
  2843.             xbmc.executebuiltin("XBMC.Notification(BrazucaPlay,Failed to extract regex. - "+"this"+",4000,"+icon+")")
  2844. elif mode==18:
  2845.     addon_log("youtubedl")
  2846.     try:
  2847.         import youtubedl
  2848.     except Exception:
  2849.         xbmc.executebuiltin("XBMC.Notification(BrazucaPlay,Please [COLOR yellow]install Youtube-dl[/COLOR] module ,10000,"")")
  2850.     stream_url=youtubedl.single_YD(url)
  2851.     playsetresolved(stream_url,name,iconimage)
  2852. elif mode==19:
  2853.     addon_log("Genesiscommonresolvers")
  2854.     playsetresolved (urlsolver(url),name,iconimage,True)
  2855.  
  2856. elif mode==21:
  2857.     addon_log("download current file using youtube-dl service")
  2858.     ytdl_download('',name,'video')
  2859. elif mode==23:
  2860.     addon_log("get info then download")
  2861.     ytdl_download(url,name,'video')
  2862. elif mode==24:
  2863.     addon_log("Audio only youtube download")
  2864.     ytdl_download(url,name,'audio')
  2865. elif mode==25:
  2866.     addon_log("Searchin Other plugins")
  2867.     _search(url,name)
  2868.     xbmcplugin.endOfDirectory(int(sys.argv[1]))
  2869. elif mode==55:
  2870.     addon_log("enabled lock")
  2871.     parentalblockedpin =addon.getSetting('parentalblockedpin')
  2872.     keyboard = xbmc.Keyboard('','Enter Pin')
  2873.     keyboard.doModal()
  2874.     if not (keyboard.isConfirmed() == False):
  2875.         newStr = keyboard.getText()
  2876.         if newStr==parentalblockedpin:
  2877.             addon.setSetting('parentalblocked', "false")
  2878.             xbmc.executebuiltin("XBMC.Notification(BrazucaPlay,Parental Block Disabled,5000,"+icon+")")
  2879.         else:
  2880.             xbmc.executebuiltin("XBMC.Notification(BrazucaPlay,Wrong Pin??,5000,"+icon+")")
  2881.     xbmcplugin.endOfDirectory(int(sys.argv[1]))
  2882. elif mode==56:
  2883.     addon_log("disable lock")
  2884.     addon.setSetting('parentalblocked', "true")
  2885.     xbmc.executebuiltin("XBMC.Notification(BrazucaPlay,Parental block enabled,5000,"+icon+")")
  2886.     xbmcplugin.endOfDirectory(int(sys.argv[1]))
  2887.  
  2888. elif mode==53:
  2889.     addon_log("Requesting JSON-RPC Items")
  2890.     pluginquerybyJSON(url)(
  2891.     #xbmcplugin.endOfDirectory(int(sys.argv[1]))
  2892.  
  2893.  
  2894. elif mode==54:
  2895.     print""
  2896.     get_data_listas(url)
  2897.  
  2898. if not viewmode==None:
  2899.    print 'setting view mode'
  2900.    xbmc.executebuiltin("Container.SetViewMode(%s)"%viewmode)
Add Comment
Please, Sign In to add comment