Sólo Kodi.
Para otras plataformas eliminar, filtrar o adaptar con 'platformtools' las líneas que se usan para 'DialogProgressBG()'
Código: Seleccionar todo
# -*- coding: utf-8 -*-
from re import sub, search, DOTALL
from urllib import urlencode
from core.httptools import downloadpage, default_headers
from core.logger import info
from core.scrapertools import find_single_match as find, \
                              find_multiple_matches as findall, \
                              get_filename_from_url as getFilename
ID = "streamplay"
DN = "streamplay.to"
HOST = "http://"+DN+"/"
USERAGENT = default_headers["User-Agent"]
def test_video_exists(page_url):
    info("["+ID+"] test_video_exists.page_url='%s'" % page_url)
    data = downloadpage(page_url).data
    if "<title>watch </title>" in data.lower():
        return False, "["+ID+"] El archivo no existe o ha sido borrado"
    return True, ""
def get_video_url(page_url, premium=False, user="", password="", video_password=""):
    info("["+ID+"] get_video_url.page_url='%s')" % page_url)
    data = downloadpage(page_url,cookies=False)
    cookie = find(data.headers['set-cookie'], '(__cfduid=[^;]+);')
    data = data.data
    file_id, aff = find(data, "'file_id', '(\d+)',[^']+'aff', '(\d+)',")
    _headers = {
        "Host": DN,
        "Content-Type": "application/x-www-form-urlencoded",
        "Cookie": cookie+";lang=4;file_id="+file_id+";aff="+aff+";"+urlencode({'ref_url':page_url}),
        "Referer": page_url,
    }
    post = urlencode(dict(findall(data, 'name="([^"]+)" value="([^"]*)"')))
    e = 10
    import xbmcgui
    p = xbmcgui.DialogProgressBG()
    p.create(ID)
    import time
    for t in range(e):
        p.update(t*100/e, ID+". Espera máxima: %s segundos." % e,"Intento %s/%s" % (t+1, e))
        time.sleep(1)
        data = downloadpage(page_url, post, headers=_headers).data
        l = findall(data, '(\w+=~\[\];.*?\)\(\)\)\(\);)')
        if len(l)>0:
            break
    if p:
        p.close()
    jj_encode = find(data, "(\w+=~\[\];.*?\)\(\)\)\(\);)")
    jj_decode = None;
    jj_patron = None;
    reverse = False;
    ## 'substring' existe en la actualidad pero no se usa
    #substring = False;
    splice = False
    if jj_encode:
        jj_decode = jjdecode(jj_encode)
    if jj_decode:
        jj_patron = find(jj_decode, "/([^/]+)/")
    if not "(" in jj_patron:
        jj_patron = "(" + jj_patron
    if not ")" in jj_patron:
        jj_patron+= ")"
    jhex_decode = jhexdecode(jj_decode)
    if "reverse" in jhex_decode:
        reverse = True
    ## 'substring' existe en la actualidad pero no se usa
    #if "substring" in jhex_decode:
    #    substring = True
    if "splice" in jhex_decode:
        splice = True
    data = find(data, "<script type=.text/javascript.>(eval\(function\(p,a,c,k,e,d.*?)</script>")
    data = unPack(data).replace("\\", "")
    data = find(data, "sources\s*=[^\[]*\[([^\]]+)\]")
    matches = findall(data.replace('"', "'"), "[src|file]:'([^']+)'")
    video_urls = []
    for video_url in matches:
        _hash = find(video_url, '\w{40,}')
        if splice:
            splice = eval(findall(jj_decode, "\((\d[^,]*),\d\);")[-1])
            if reverse:
                h = list(_hash);
                h.pop(-splice-1);
                _hash = "".join(h)
            else:
                h = list(_hash);
                h.pop(splice);
                _hash = "".join(h)
        ## 'substring' existe en la actualidad pero no se usa
        #if substring:
        #    substring = int(find(jj_decode, "_\w+.\d...(\d)...;"))
        #    if reverse:
        #        _hash = _hash[:-substring]
        #    else:
        #        _hash = _hash[substring:]
        if reverse:
            video_url = sub(r'\w{40,}', _hash[::-1], video_url)
        filename = getFilename(video_url)[-4:]
        if video_url.startswith("rtmp"):
            rtmp, playpath = video_url.split("vod/", 1)
            video_url = "%s playpath=%s swfUrl=%splayer6/jwplayer.flash.swf pageUrl=%s" % (rtmp+"vod/", playpath, HOST, page_url)
            filename = "RTMP"
        elif "m3u8" in video_url:
            video_url += "|User-Agent=" + USERAGENT
        elif video_url.endswith("/v.mp4"):
            video_url_flv = sub(r'/v.mp4$','/v.flv',video_url)
            video_urls.append([".flv ["+ID+"]", sub(r'%s' % jj_patron, r'\1', video_url_flv)])
        video_urls.append([filename+" ["+ID+"]", sub(r'%s' % jj_patron, r'\1', video_url)])
    for video_url in video_urls:
        info("["+ID+"] %s - %s" % (video_url[0], video_url[1]))
    return video_urls
def find_videos(data):
    encontrados = set()
    devuelve = []
    patronvideos  = DN+"/(?:embed-|iframe-|preview-|)([a-z0-9]+)(?:-\d+[xX]\d.html|.html|)"
    info("#"+patronvideos+"#")
    matches = findall(data, patronvideos)
    for match in matches:
        url = HOST+match
        if url not in encontrados:
            info("  url="+url)
            devuelve.append(["["+ID+"]", url, ID])
            encontrados.add(url)
        else:
            info("  url duplicada="+url)
    return devuelve
def unPack(packed):
    pattern = "}\('(.*)', *(\d+), *(\d+), *'(.*)'\.split\('([^']+)'\)"
    d = [ d for d in search(pattern, packed, DOTALL).groups() ]
    p = d[0]; a = int(d[1]); c = int(d[2]); k = d[3].split(d[4])
    if a <= 62: toString = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
    else: toString = """ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~"""
    def e(c):
        return toString[c] if c < a else toString[c // a] + toString[c % a]
    while c > 0:
        c-= 1
        if k[c]: x = e(c)
        else: x = k[c]
        y = k[c]
        p = sub(r"(\b%s\b)" % x, y, p)
    return p
def jjdecode(t):
    x = '0123456789abcdef'
    j = find(t, '^([^=]+)=')
    t = t.replace(j + '.', 'j.')
    t = sub(r'^.*?"\\""\+(.*?)\+"\\"".*?$', r'\1', t.replace('\\\\', '\\')) + '+""'
    t = sub('(\(!\[\]\+""\)\[j\._\$_\])', '"l"', t)
    t = sub(r'j\._\$\+', '"o"+', t)
    t = sub(r'j\.__\+', '"t"+', t)
    t = sub(r'j\._\+', '"u"+', t)
    p = findall(t, '(j\.[^\+]+\+)')
    for c in p:
        t = t.replace(c, c.replace('_', '0').replace('$', '1'))
    p = findall(t, 'j\.(\d{4})')
    for c in p:
        t = sub(r'j\.%s' % c, '"' + x[int(c, 2)] + '"', t)
    p = findall(t, '\\"\+j\.(001)\+j\.(\d{3})\+j\.(\d{3})\+')
    for c in p:
        t = sub(r'\\"\+j\.%s\+j\.%s\+j\.%s\+' % (c[0], c[1], c[2]), chr(int("".join(c), 2)) + '"+', t)
    p = findall(t, '\\"\+j\.(\d{3})\+j\.(\d{3})\+')
    for c in p:
        t = sub(r'\\"\+j\.%s\+j\.%s\+' % (c[0], c[1]), chr(int("".join(c),2)) + '"+', t)
    p = findall(t, 'j\.(\d{3})')
    for c in p:
        t = sub(r'j\.%s' % c, '"' + str(int(c, 2)) + '"', t)
    r = sub(r'"\+"|\\\\','',t[1:-1])
    return r
def jhexdecode(t):
    r = sub(r'_\d+x\w+x(\d+)', 'var_' + r'\1', t)
    r = sub(r'_\d+x\w+', 'var_0', r)
    def to_hx(c):
        h = int("%s" % c.groups(0),16)
        if 19 < h < 160:
            return chr(h)
        else:
            return ""
    r = sub(r'(?:\\|)x(\w{2})', to_hx, r).replace('var ','')
    f = eval(find(r, '\s*var_0\s*=\s*([^;]+);'))
    for i, v in enumerate(f):
        r = r.replace('[var_0[%s]]' % i, "." + f[i])
        if v == "": r = r.replace('var_0[%s]' % i, '""')
    return r
 
  
  






