This commit is contained in:
Pavel Suha
2025-04-25 16:31:48 +02:00
commit 7b54ba45a1
132 changed files with 6984 additions and 0 deletions

220
lib/server/hqqresolver.py Normal file
View File

@@ -0,0 +1,220 @@
# -*- coding: UTF-8 -*-
# * GNU General Public License for more details.
# *
# *
# * You should have received a copy of the GNU General Public License
# * along with this program; see the file COPYING. If not, write to
# * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
# * http://www.gnu.org/copyleft/gpl.html
# *
# *
# * original based on https://gitorious.org/iptv-pl-dla-openpli/ urlresolver
# * update based on https://github.com/LordVenom/
# */
from io import StringIO
import json
import util
import re
import base64
import urllib.request, urllib.parse, urllib.error
__name__ = 'hqq'
def supports(url):
return _regex(url) is not None
def _decode(data):
def O1l(string):
ret = ""
i = len(string) - 1
while i >= 0:
ret += string[i]
i -= 1
return ret
def l0I(string):
enc = ""
dec = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
i = 0
while True:
h1 = dec.find(string[i])
i += 1
h2 = dec.find(string[i])
i += 1
h3 = dec.find(string[i])
i += 1
h4 = dec.find(string[i])
i += 1
bits = h1 << 18 | h2 << 12 | h3 << 6 | h4
o1 = bits >> 16 & 0xff
o2 = bits >> 8 & 0xff
o3 = bits & 0xff
if h3 == 64:
enc += chr(o1)
else:
if h4 == 64:
enc += chr(o1) + chr(o2)
else:
enc += chr(o1) + chr(o2) + chr(o3)
if i >= len(string):
break
return enc
escape = re.search("var _escape=\'([^\']+)", l0I(O1l(data))).group(1)
return escape.replace('%', '\\').decode('unicode-escape')
def _decode2(file_url):
def K12K(a, typ='b'):
codec_a = ["G", "L", "M", "N", "Z", "o", "I", "t", "V", "y", "x", "p", "R", "m", "z", "u",
"D", "7", "W", "v", "Q", "n", "e", "0", "b", "="]
codec_b = ["2", "6", "i", "k", "8", "X", "J", "B", "a", "s", "d", "H", "w", "f", "T", "3",
"l", "c", "5", "Y", "g", "1", "4", "9", "U", "A"]
if 'd' == typ:
tmp = codec_a
codec_a = codec_b
codec_b = tmp
idx = 0
while idx < len(codec_a):
a = a.replace(codec_a[idx], "___")
a = a.replace(codec_b[idx], codec_a[idx])
a = a.replace("___", codec_b[idx])
idx += 1
return a
def _xc13(_arg1):
_lg27 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
_local2 = ""
_local3 = [0, 0, 0, 0]
_local4 = [0, 0, 0]
_local5 = 0
while _local5 < len(_arg1):
_local6 = 0
while _local6 < 4 and (_local5 + _local6) < len(_arg1):
_local3[_local6] = _lg27.find(_arg1[_local5 + _local6])
_local6 += 1
_local4[0] = ((_local3[0] << 2) + ((_local3[1] & 48) >> 4))
_local4[1] = (((_local3[1] & 15) << 4) + ((_local3[2] & 60) >> 2))
_local4[2] = (((_local3[2] & 3) << 6) + _local3[3])
_local7 = 0
while _local7 < len(_local4):
if _local3[_local7 + 1] == 64:
break
_local2 += chr(_local4[_local7])
_local7 += 1
_local5 += 4
return _local2
return _xc13(K12K(file_url, 'e'))
def _decode3(w, i, s, e):
var1 = 0
var2 = 0
var3 = 0
var4 = []
var5 = []
while (True):
if (var1 < 5):
var5.append(w[var1])
elif (var1 < len(w)):
var4.append(w[var1])
var1 += 1
if (var2 < 5):
var5.append(i[var2])
elif (var2 < len(i)):
var4.append(i[var2])
var2 += 1
if (var3 < 5):
var5.append(s[var3])
elif (var3 < len(s)):
var4.append(s[var3])
var3 += 1
if (len(w) + len(i) + len(s) + len(e) == len(var4) + len(var5) + len(e)):
break
var6 = ''.join(var4)
var7 = ''.join(var5)
var2 = 0
result = []
for var1 in range(0, len(var4), 2):
ll11 = -1
if (ord(var7[var2]) % 2):
ll11 = 1
result.append(chr(int(var6[var1:var1 + 2], 36) - ll11))
var2 += 1
if (var2 >= len(var5)):
var2 = 0
return ''.join(result)
def _decode_data(data):
valuesPattern = r";}\('(\w+)','(\w*)','(\w*)','(\w*)'\)\)"
values = re.search(valuesPattern, data, re.DOTALL)
return _decode3(values.group(1), values.group(2), values.group(3), values.group(4))
def resolve(url):
m = _regex(url)
if m:
vid = m.group('vid')
headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Content-Type': 'text/html; charset=utf-8'}
player_url = "http://hqq.tv/player/embed_player.php?vid=%s&autoplay=no" % vid
data = util.request(player_url, headers)
data = _decode_data(data)
data = _decode_data(data)
blocs = data.split(';; ')
data = _decode_data(blocs[1])
jsonInfo = util.request("http://hqq.tv/player/ip.php?type=json", headers)
jsonIp = json.loads(jsonInfo)['ip']
at = re.search(r'at = "(\w+)";', data, re.DOTALL)
if jsonIp and at:
get_data = {'iss': jsonIp, 'vid': vid, 'at': at.group(1), 'autoplayed': 'yes', 'referer': 'on',
'http_referer': '', 'pass': '', 'embed_from' : '', 'need_captcha' : '0' }
data = urllib.parse.unquote(util.request("http://hqq.tv/sec/player/embed_player.php?" +
urllib.parse.urlencode(get_data), headers))
l = re.search(r'link_1: ([a-zA-Z]+), server_1: ([a-zA-Z]+)', data)
vid_server = re.search(r'var ' + l.group(2) + ' = "([^"]+)"', data).group(1)
vid_link = re.search(r'var ' + l.group(1) + ' = "([^"]+)"', data).group(1)
if vid_server and vid_link:
get_data = {'server_1': vid_server, 'link_1': vid_link, 'at': at.group(1), 'adb': '0/',
'b': '1', 'vid': vid }
headers['x-requested-with'] = 'XMLHttpRequest'
data = util.request("http://hqq.tv/player/get_md5.php?" + urllib.parse.urlencode(get_data), headers)
jsonData = json.loads(data)
encodedm3u = jsonData['file']
decodedm3u = _decode2(encodedm3u.replace('\\', ''))
agent = 'User-Agent=Mozilla/5.0 (iPhone; CPU iPhone OS 5_0_1 like Mac OS X)'
return [{'url': decodedm3u + '|' + agent, 'quality': '360p'}]
return None
def _regex(url):
match = re.search("(hqq|netu)\.tv/watch_video\.php\?v=(?P<vid>[0-9A-Za-z]+)", url)
if match:
return match
match = re.search(r'(hqq|netu)\.tv/player/embed_player\.php\?vid=(?P<vid>[0-9A-Za-z]+)', url)
if match:
return match
match = re.search(r'(hqq|netu)\.tv/player/hash\.php\?hash=\d+', url)
if match:
match = re.search(r'var\s+vid\s*=\s*\'(?P<vid>[^\']+)\'', urllib.parse.unquote(util.request(url)))
if match:
return match
b64enc = re.search(r'data:text/javascript\;charset\=utf\-8\;base64([^\"]+)', url)
b64dec = b64enc and base64.decodestring(b64enc.group(1))
enc = b64dec and re.search(r"\'([^']+)\'", b64dec).group(1)
if enc:
decoded = _decode(enc)
match = re.search(r'<input name="vid"[^>]+? value="(?P<vid>[^"]+?)">', decoded)
if re.search(r'<form(.+?)action="[^"]*(hqq|netu)\.tv/player/embed_player\.php"[^>]*>',
decoded) and match:
return match
return None