diff --git a/base/config.py b/base/config.py index bc30990..edd1eea 100644 --- a/base/config.py +++ b/base/config.py @@ -57,3 +57,4 @@ ALI_TOKEN = '' # 适用于初始配置的阿里云token ENV = '{"bili_cookie":""}' # 自定义环境变量 UPDATE_PROXY = 'https://ghproxy.net/' # 检测升级代理 Thread = True # 开启windows多线程调用 +SPECIAL = '腾云驾雾:腾讯&奇珍异兽:爱奇艺&百忙无果:芒果&优酷&哔哩影视&Alist' # 特殊优选 diff --git a/base/custom.conf b/base/custom.conf index a465d7b..a55cfcd 100644 --- a/base/custom.conf +++ b/base/custom.conf @@ -21,6 +21,7 @@ }, # 缓存js # {"key":"js_origin","name":"JS(原始)","type":3,"api":"{{host}}/txt/js/原始JS.js","searchable":1,"quickSearch":1,"filterable":1,"ext":""}, + {"key":"Live2Cms","name":"直播转点播V2","type":3,"api":"{{host}}/libs/live2cms.js","searchable":2,"quickSearch":0,"filterable":0,"ext":"{{host}}/txt/json/live2mv_data.json"}, {"key":"Live2Mv","name":"直播转点播","type":3,"api":"{{host}}/libs/live2mv.js","searchable":2,"quickSearch":0,"filterable":0,"ext":"{{host}}/txt/json/live2mv_data.json"}, {"key":"Alist","name":"Alist","type":3,"api":"{{host}}/libs/alist.min.js","searchable":2,"quickSearch":0,"filterable":0,"ext":"{{host}}/txt/json/alist.json;200;video"}, {"key":"Alist_pt","name":"Alist(pluto)","type":3,"api":"{{host}}/libs/alist.min.js","searchable":2,"quickSearch":0,"filterable":0,"ext":"{{host}}/config/2;200;video"}, diff --git a/base/rules.db b/base/rules.db index 22ca49d..b5032f1 100644 Binary files a/base/rules.db and b/base/rules.db differ diff --git a/controllers/admin.py b/controllers/admin.py index 0555eb7..59f0278 100644 --- a/controllers/admin.py +++ b/controllers/admin.py @@ -6,17 +6,17 @@ import os import ujson -from flask import Blueprint,request,render_template,render_template_string,jsonify,make_response,redirect -from controllers.service import storage_service,rules_service,parse_service +from flask import Blueprint, request, render_template, render_template_string, jsonify, make_response, redirect +from controllers.service import storage_service, rules_service, parse_service from base.R import R from base.database import db from utils.log import logger import shutil -from utils.update import getLocalVer,getOnlineVer,download_new_version,download_lives,copy_to_update +from utils.update import getLocalVer, getOnlineVer, download_new_version, download_lives, copy_to_update from utils import parser -from utils.env import get_env,update_env -from utils.web import getParmas,verfy_token -from js.rules import getRules,getCacheCount +from utils.env import get_env, update_env +from utils.web import getParmas, verfy_token +from js.rules import getRules, getCacheCount from utils.parser import runJScode from werkzeug.utils import secure_filename from utils.web import md5 @@ -24,6 +24,7 @@ from utils.common_api import js_render admin = Blueprint("admin", __name__) + # @admin.route("/",methods=['get']) # def index(): # return R.ok(msg='欢迎进入首页',data=None) @@ -46,7 +47,9 @@ def admin_index(): # 管理员界面 # print(rules) cache_count = getCacheCount() # print(cache_count) - return render_template('admin.html',js0_password=js0_password, pystate=use_py,rules=rules,cache_count=cache_count, ver=getLocalVer(), live_url=live_url) + return render_template('admin.html', js0_password=js0_password, pystate=use_py, rules=rules, + cache_count=cache_count, ver=getLocalVer(), live_url=live_url) + @admin.route('/settings') def admin_settings(): # 管理员界面 @@ -56,9 +59,10 @@ def admin_settings(): # 管理员界面 # conf_list = 'LIVE_URL|USE_PY|PLAY_URL|PLAY_DISABLE|LAZYPARSE_MODE|WALL_PAPER_ENABLE|WALL_PAPER|UNAME|PWD|LIVE_MODE|LIVE_URL|CATE_EXCLUDE|TAB_EXCLUDE'.split('|') conf_lists = lsg.getStoreConf() # print(conf_lists) - return render_template('settings.html', conf_lists=conf_lists,ver=getLocalVer()) + return render_template('settings.html', conf_lists=conf_lists, ver=getLocalVer()) -@admin.route('/save_conf',methods=['POST']) + +@admin.route('/save_conf', methods=['POST']) def admin_save_conf(): # 管理员界面 if not verfy_token(): # return render_template('login.html') @@ -67,10 +71,11 @@ def admin_save_conf(): # 管理员界面 value = getParmas('value') print(f'key:{key},value:{value}') lsg = storage_service() - res_id = lsg.setItem(key,value) + res_id = lsg.setItem(key, value) return R.success(f'修改成功,记录ID为:{res_id}') -@admin.route('/update_env',methods=['POST']) + +@admin.route('/update_env', methods=['POST']) def admin_update_env(): # 更新环境变量中的某个值 if not verfy_token(): # return render_template('login.html') @@ -78,11 +83,45 @@ def admin_update_env(): # 更新环境变量中的某个值 key = getParmas('key') value = getParmas('value') print(f'key:{key},value:{value}') - ENV = update_env(key,value) - return R.success(f'修改成功,最新的完整ENV见data',data=ENV) + ENV = update_env(key, value) + return R.success(f'修改成功,最新的完整ENV见data', data=ENV) -@admin.route("/view/",methods=['GET']) +@admin.route("/edit/", methods=['GET']) +def admin_edit_rule(name): + # print(name) + if not verfy_token(): + return render_template('login.html') + return render_template('edit_rule.html', name=name) + +@admin.route("/edit2/", methods=['GET']) +def admin_edit2_rule(name): + # print(name) + if not verfy_token(): + return render_template('login.html') + return render_template('edit_rule_mobile.html', name=name) + +@admin.route("/save_edit/", methods=['POST']) +def admin_save_edit_rule(name): + # print(name) + if not verfy_token(): + return R.error('请登录后再试') + + code = getParmas('code') + file_path = os.path.abspath(f'js/{name}') + if 'var rule' not in code and name != '模板.js': + return R.error(f'文件{name}保存失败,未检测到关键词:var rule') + if not os.path.exists(file_path): + return R.error('服务端没有此文件!' + file_path) + + logger.info(f'待保存文件路径:{file_path}') + with open(file_path, mode='w+', encoding='utf-8') as f: + f.write(code) + + return R.success(f'保存成功') + + +@admin.route("/view/", methods=['GET']) def admin_view_rule(name): return js_render(name) # if not name or not name.split('.')[-1] in ['js','txt','py','json']: @@ -117,9 +156,10 @@ def admin_view_rule(name): # except Exception as e: # return R.error(f'非法猥亵\n{e}') + @admin.route('/clear/') def admin_clear_rule(name): - if not name or not name.split('.')[-1] in ['js','txt','py','json']: + if not name or not name.split('.')[-1] in ['js', 'txt', 'py', 'json']: return R.error(f'非法猥亵,未指定文件名。必须包含js|txt|json|py') if not verfy_token(): return render_template('login.html') @@ -127,9 +167,10 @@ def admin_clear_rule(name): file_path = os.path.abspath(f'js/{name}') print(file_path) if not os.path.exists(file_path): - return R.error('服务端没有此文件!'+file_path) + return R.error('服务端没有此文件!' + file_path) os.remove(file_path) - return R.ok('成功删除文件:'+file_path) + return R.ok('成功删除文件:' + file_path) + @admin.route('/get_ver') def admin_get_ver(): @@ -138,8 +179,9 @@ def admin_get_ver(): return R.error('请登录后再试') lsg = storage_service() update_proxy = lsg.getItem('UPDATE_PROXY') - online_ver,msg = getOnlineVer(update_proxy) - return jsonify({'local_ver':getLocalVer(),'online_ver':online_ver,'msg':msg}) + online_ver, msg = getOnlineVer(update_proxy) + return jsonify({'local_ver': getLocalVer(), 'online_ver': online_ver, 'msg': msg}) + @admin.route('/update_db') def admin_update_db(): @@ -153,12 +195,13 @@ def admin_update_db(): db.session.execute('drop table if exists alembic_version') cmd = 'flask db migrate && flask db upgrade' if not os.path.exists('migrations'): - cmd = 'flask db init && '+cmd + cmd = 'flask db init && ' + cmd logger.info(f'开始执行cmd:{cmd}') result = os.system(cmd) logger.info(f'cmd执行结果:{result}') return R.success('数据库升级完毕') + @admin.route('/update_ver') def admin_update_ver(): if not verfy_token(): @@ -168,7 +211,8 @@ def admin_update_ver(): msg = download_new_version(update_proxy) return R.success(msg) -@admin.route('/rule_state/',methods=['POST']) + +@admin.route('/rule_state/', methods=['POST']) def admin_rule_state(state=0): # 管理员修改规则状态 if not verfy_token(): return R.error('请登录后再试') @@ -183,14 +227,15 @@ def admin_rule_state(state=0): # 管理员修改规则状态 success_list = [] for rule in rule_list: try: - res_id = rules.setState(rule,state) + res_id = rules.setState(rule, state) success_list.append(f'{rule}:{res_id}') except: success_list.append(rule) return R.success(f'修改成功,服务器反馈信息为:{success_list}') -@admin.route('/rule_order/',methods=['POST']) + +@admin.route('/rule_order/', methods=['POST']) def admin_rule_order(order=0): # 管理员修改规则顺序 if not verfy_token(): return R.error('请登录后再试') @@ -203,17 +248,18 @@ def admin_rule_order(order=0): # 管理员修改规则顺序 # print(rules.getState(rule_list[0])) # print(rule_list) success_list = [] - rule_list.reverse() # 倒序解决时间多重排序问题 + rule_list.reverse() # 倒序解决时间多重排序问题 for rule in rule_list: try: - res_id = rules.setOrder(rule,order) + res_id = rules.setOrder(rule, order) success_list.append(f'{rule}:{res_id}') except: success_list.append(rule) return R.success(f'修改成功,服务器反馈信息为:{success_list}') -@admin.route('/parse/save_data',methods=['POST']) + +@admin.route('/parse/save_data', methods=['POST']) def admin_parse_save_data(): # 管理员保存拖拽排序后的解析数据 if not verfy_token(): return R.error('请登录后再试') @@ -238,13 +284,13 @@ def admin_parse_save_data(): # 管理员保存拖拽排序后的解析数据 # if not d.get('url') and d.get('name') != '🌐Ⓤ': # continue obj = { - 'name':d.get('name', ''), - 'url':d.get('url', ''), - 'state':d.get('state',1), - 'type': d.get('state',0), - 'order':i+1, - 'ext':d.get('ext',''), - 'header':d.get('header',''), + 'name': d.get('name', ''), + 'url': d.get('url', ''), + 'state': d.get('state', 1), + 'type': d.get('state', 0), + 'order': i + 1, + 'ext': d.get('ext', ''), + 'header': d.get('header', ''), } # print(obj) try: @@ -258,6 +304,7 @@ def admin_parse_save_data(): # 管理员保存拖拽排序后的解析数据 # print(len(success_list)) return R.success(f'修改成功,服务器反馈信息为:{success_list}') + @admin.route('/force_update') def admin_force_update(): if not verfy_token(): @@ -270,6 +317,7 @@ def admin_force_update(): msg = '升级失败。具体原因只能去看实时日志(通过9001端口)' return R.failed(msg) + @admin.route('/update_lives') def admin_update_lives(): url = getParmas('url') @@ -284,6 +332,7 @@ def admin_update_lives(): else: return R.failed(f'直播源{live_url}同步失败') + @admin.route('/write_live_url') def admin_write_live_url(): url = getParmas('url') @@ -292,10 +341,11 @@ def admin_write_live_url(): if not verfy_token(): return R.failed('请登录后再试') lsg = storage_service() - id = lsg.setItem('LIVE_URL',url) + id = lsg.setItem('LIVE_URL', url) msg = f'已修改的配置记录id为:{id}' return R.success(msg) + @admin.route('/change_use_py') def admin_change_use_py(): if not verfy_token(): @@ -308,6 +358,7 @@ def admin_change_use_py(): msg = f'已修改的配置记录id为:{id},结果为{state}' return R.success(msg) + # @admin.route('/get_use_py') # def admin_get_use_py(): # if not verfy_token(): @@ -317,17 +368,20 @@ def admin_change_use_py(): # state = 1 if use_py else 0 # return R.success(state) -@admin.route('/upload', methods=['GET', 'POST']) +@admin.route('/upload', methods=['POST']) def upload_file(): + args = request.args + force = args.get('force') if not verfy_token(): return render_template('login.html') if request.method == 'POST': try: file = request.files['file'] filename = secure_filename(file.filename) - print(f'推荐安全文件命名:{filename}') + logger.info(f'推荐安全文件命名:{filename}') savePath = f'js/{file.filename}' - if os.path.exists(savePath): + # print(savePath) + if os.path.exists(savePath) and not force: return R.failed(f'上传失败,文件已存在,请先查看删除再试') with open('js/模板.js', encoding='utf-8') as f2: before = f2.read().split('export')[0] @@ -341,8 +395,8 @@ def upload_file(): return R.failed('文件上传失败,检测到上传的文件不是drpy框架支持的源代码') except: return R.failed('文件上传失败,检测到上传的文件不是drpy框架支持的源代码') - print(savePath) - file.seek(0) # 读取后变成空文件,重新赋能 + # print(savePath) + file.seek(0) # 读取后变成空文件,重新赋能 file.save(savePath) return R.success('文件上传成功') except Exception as e: @@ -351,12 +405,13 @@ def upload_file(): # return render_template('upload.html') return R.failed('文件上传失败') -@admin.route('/login',methods=['GET','POST']) + +@admin.route('/login', methods=['GET', 'POST']) def login_api(): username = getParmas('username') password = getParmas('password') autologin = getParmas('autologin') - if not all([username,password]): + if not all([username, password]): return R.failed('账号密码字段必填') token = md5(f'{username};{password}') check = verfy_token(token=token) @@ -368,12 +423,14 @@ def login_api(): else: return R.failed('登录失败,用户名或密码错误') + @admin.route('/logtail') def admin_logtail(): if not verfy_token(): return R.failed('请登录后再试') return render_template('logtail.html') + @admin.route('/lives') def admin_lives(): if not verfy_token(): @@ -384,6 +441,7 @@ def admin_lives(): # 不带http的前缀 host # 当前路径 path host_url = request.host_url + def get_lives(): base_path = os.path.dirname(os.path.abspath(__file__)) # 当前文件所在目录 # print(base_path) @@ -392,11 +450,12 @@ def admin_lives(): files = os.listdir(live_path) # print(files) # files = list(filter(lambda x: str(x).endswith('.txt') and str(x).find('模板') < 0, files)) - files = list(filter(lambda x: str(x).split('.')[-1] in ['txt','json','m3u'] and str(x).find('模板') < 0, files)) + files = list( + filter(lambda x: str(x).split('.')[-1] in ['txt', 'json', 'm3u'] and str(x).find('模板') < 0, files)) files = [f'{host_url}lives?path=txt/lives/{file}' for file in files] return files files = '\n'.join(get_lives()) response = make_response(files) response.headers['Content-Type'] = 'text/plain; charset=utf-8' - return response \ No newline at end of file + return response diff --git a/controllers/cms.py b/controllers/cms.py index aac5a60..ff2178b 100644 --- a/controllers/cms.py +++ b/controllers/cms.py @@ -14,105 +14,118 @@ from utils.web import * from utils.system import getHost from utils.config import playerConfig from utils.log import logger -from utils.encode import base64Encode,base64Decode,fetch,post,request,getCryptoJS,getPreJs,buildUrl,getHome,atob,btoa -from utils.encode import verifyCode,setDetail,join,urljoin2,parseText,requireCache,forceOrder,base64ToImage,encodeStr, decodeStr +from utils.encode import base64Encode, base64Decode, fetch, post, request, getCryptoJS, getPreJs, buildUrl, getHome, \ + atob, btoa +from utils.encode import verifyCode, setDetail, join, urljoin2, parseText, requireCache, forceOrder, base64ToImage, \ + encodeStr, decodeStr from utils.encode import md5 as mmd5 from utils.safePython import safePython -from utils.parser import runPy,runJScode,JsObjectWrapper,PyJsObject,PyJsString +from utils.parser import runPy, runJScode, JsObjectWrapper, PyJsObject, PyJsString from utils.htmlParser import jsoup -from urllib.parse import urljoin,quote,unquote +from urllib.parse import urljoin, quote, unquote from concurrent.futures import ThreadPoolExecutor # 引入线程池 -from flask import url_for,redirect,render_template_string +from flask import url_for, redirect, render_template_string from easydict import EasyDict as edict from controllers.service import storage_service -def setItem(key,value): - lsg = storage_service() - if isinstance(key,PyJsString): - key = parseText(str(key)) - if isinstance(value,PyJsString): - value = parseText(str(value)) - return lsg.setItem(key,value) -def getItem(key,value=''): +def setItem(key, value): lsg = storage_service() - if isinstance(key,PyJsString): + if isinstance(key, PyJsString): key = parseText(str(key)) - if isinstance(value,PyJsString): + if isinstance(value, PyJsString): value = parseText(str(value)) - return lsg.getItem(key,value) + return lsg.setItem(key, value) + + +def getItem(key, value=''): + lsg = storage_service() + if isinstance(key, PyJsString): + key = parseText(str(key)) + if isinstance(value, PyJsString): + value = parseText(str(value)) + return lsg.getItem(key, value) + def clearItem(key): lsg = storage_service() - if isinstance(key,PyJsString): + if isinstance(key, PyJsString): key = parseText(str(key)) return lsg.clearItem(key) + def encodeUrl(url): # return base64Encode(quote(url)) # return base64Encode(url) # print(type(url)) - if isinstance(url,PyJsString): + if isinstance(url, PyJsString): # obj = obj.to_dict() url = parseText(str(url)) return quote(url) + def stringify(obj): - if isinstance(obj,PyJsObject): + if isinstance(obj, PyJsObject): # obj = obj.to_dict() obj = parseText(str(obj)) return json.dumps(obj, separators=(',', ':'), ensure_ascii=False) + def requireObj(url): - if isinstance(url,PyJsString): + if isinstance(url, PyJsString): url = parseText(str(url)) return requireCache(url) + def md5(text): - if isinstance(text,PyJsString): + if isinstance(text, PyJsString): text = parseText(str(text)) return mmd5(text) + py_ctx = { -'requests':requests,'print':print,'base64Encode':base64Encode,'base64Decode':base64Decode, -'log':logger.info,'fetch':fetch,'post':post,'request':request,'getCryptoJS':getCryptoJS, -'buildUrl':buildUrl,'getHome':getHome,'setDetail':setDetail,'join':join,'urljoin2':urljoin2, -'PC_UA':PC_UA,'MOBILE_UA':MOBILE_UA,'UC_UA':UC_UA,'UA':UA,'IOS_UA':IOS_UA, -'setItem':setItem,'getItem':getItem,'clearItem':clearItem,'stringify':stringify,'encodeUrl':encodeUrl, -'requireObj':requireObj,'md5':md5,'atob': atob, 'btoa':btoa,'base64ToImage': base64ToImage, 'encodeStr': encodeStr, + 'requests': requests, 'print': print, 'base64Encode': base64Encode, 'base64Decode': base64Decode, + 'log': logger.info, 'fetch': fetch, 'post': post, 'request': request, 'getCryptoJS': getCryptoJS, + 'buildUrl': buildUrl, 'getHome': getHome, 'setDetail': setDetail, 'join': join, 'urljoin2': urljoin2, + 'PC_UA': PC_UA, 'MOBILE_UA': MOBILE_UA, 'UC_UA': UC_UA, 'UA': UA, 'IOS_UA': IOS_UA, + 'setItem': setItem, 'getItem': getItem, 'clearItem': clearItem, 'stringify': stringify, 'encodeUrl': encodeUrl, + 'requireObj': requireObj, 'md5': md5, 'atob': atob, 'btoa': btoa, 'base64ToImage': base64ToImage, + 'encodeStr': encodeStr, 'decodeStr': decodeStr } + + # print(getCryptoJS()) class CMS: - def __init__(self, rule, db=None, RuleClass=None, PlayParse=None,new_conf=None,ext=''): + def __init__(self, rule, db=None, RuleClass=None, PlayParse=None, new_conf=None, ext=''): if new_conf is None: new_conf = {} self.lsg = storage_service() self.title = rule.get('title', '') self.id = rule.get('id', self.title) - self.filter_url = rule.get('filter_url', '').replace('{{fl}}','{{fl|safe}}') # python jinjia2禁用自动编码 - cate_exclude = rule.get('cate_exclude','') - tab_exclude = rule.get('tab_exclude','') + self.filter_url = rule.get('filter_url', '').replace('{{fl}}', '{{fl|safe}}') # python jinjia2禁用自动编码 + cate_exclude = rule.get('cate_exclude', '') + tab_exclude = rule.get('tab_exclude', '') self.lazy = rule.get('lazy', False) # self.play_disable = new_conf.get('PLAY_DISABLE',False) - self.play_disable = self.lsg.getItem('PLAY_DISABLE',False) - self.retry_count = new_conf.get('RETRY_CNT',3) + self.play_disable = self.lsg.getItem('PLAY_DISABLE', False) + self.retry_count = new_conf.get('RETRY_CNT', 3) # self.lazy_mode = new_conf.get('LAZYPARSE_MODE') - self.lazy_mode = self.lsg.getItem('LAZYPARSE_MODE',2) + self.lazy_mode = self.lsg.getItem('LAZYPARSE_MODE', 2) self.ocr_api = new_conf.get('OCR_API') # self.cate_exclude = new_conf.get('CATE_EXCLUDE','') - self.cate_exclude = self.lsg.getItem('CATE_EXCLUDE','') + self.cate_exclude = self.lsg.getItem('CATE_EXCLUDE', '') # self.tab_exclude = new_conf.get('TAB_EXCLUDE','') - self.tab_exclude = self.lsg.getItem('TAB_EXCLUDE','') + self.tab_exclude = self.lsg.getItem('TAB_EXCLUDE', '') if cate_exclude: if not str(cate_exclude).startswith('|') and not str(self.cate_exclude).endswith('|'): - self.cate_exclude = self.cate_exclude+'|'+cate_exclude + self.cate_exclude = self.cate_exclude + '|' + cate_exclude else: self.cate_exclude += cate_exclude if tab_exclude: if not str(tab_exclude).startswith('|') and not str(self.tab_exclude).endswith('|'): - self.tab_exclude = self.tab_exclude+'|'+tab_exclude + self.tab_exclude = self.tab_exclude + '|' + tab_exclude else: self.tab_exclude += tab_exclude # print(self.cate_exclude) @@ -126,10 +139,10 @@ class CMS: try: play_url = getHost(self.lazy_mode) except: - play_url = getHost(1,5705) + play_url = getHost(1, 5705) # play_url = new_conf.get('PLAY_URL',getHost(2)) if not play_url.startswith('http'): - play_url = 'http://'+play_url + play_url = 'http://' + play_url # print(play_url) if self.play_parse: # self.play_url = play_url + self.vod + '?play_url=' @@ -143,20 +156,46 @@ class CMS: else: self.play_parse = False self.play_url = '' - logger.info('播放免嗅地址: '+self.play_url) + logger.info('播放免嗅地址: ' + self.play_url) self.db = db self.RuleClass = RuleClass self.PlayParse = PlayParse - host = rule.get('host','').rstrip('/') + host = rule.get('host', '').rstrip('/') host = unquote(host) - timeout = rule.get('timeout',5000) - homeUrl = rule.get('homeUrl','/') - url = rule.get('url','') - detailUrl = rule.get('detailUrl','') - searchUrl = rule.get('searchUrl','') + HOST = host + hostJs = rule.get('hostJs', '') + if hostJs: + try: + jsp = jsoup(HOST) + py_ctx.update({ + 'HOST': HOST, + 'jsp': jsp, + 'jq': jsp, + 'TYPE': 'init', + }) + ctx = py_ctx + jscode = getPreJs() + hostJs.strip().replace('js:', '', 1) + # print(jscode) + loader, _ = runJScode(jscode, ctx=ctx) + # print(loader.toString()) + HOST = loader.eval('HOST') + # print(vods) + # 一般都是正常的str + if isinstance(HOST, PyJsString): # JsObjectWrapper + HOST = parseText(str(HOST)) + host = HOST.rstrip('/') + print('host:',host) + except Exception as e: + logger.info(f'执行{hostJs}获取host发生错误:{e}') + + timeout = rule.get('timeout', 5000) + homeUrl = rule.get('homeUrl', '/') + url = rule.get('url', '') + detailUrl = rule.get('detailUrl', '') + searchUrl = rule.get('searchUrl', '') default_headers = getHeaders(host) - self_headers = rule.get('headers',{}) + self_headers = rule.get('headers', {}) default_headers.update(self_headers) headers = default_headers cookie = self.getCookie() @@ -165,10 +204,10 @@ class CMS: if cookie: headers['cookie'] = cookie self.oheaders['cookie'] = cookie - limit = rule.get('limit',6) + limit = rule.get('limit', 6) encoding = rule.get('编码', 'utf-8') search_encoding = rule.get('搜索编码', '') - self.limit = min(limit,30) + self.limit = min(limit, 30) keys = headers.keys() for k in headers.keys(): if str(k).lower() == 'user-agent': @@ -191,7 +230,7 @@ class CMS: logger.info(f'从{v}获取cookie发生错误:{e}') pass - lower_keys = list(map(lambda x:x.lower(),keys)) + lower_keys = list(map(lambda x: x.lower(), keys)) if not 'user-agent' in lower_keys: headers['User-Agent'] = UA if not 'referer' in lower_keys: @@ -199,37 +238,37 @@ class CMS: self.headers = headers # print(headers) self.host = host - self.homeUrl = urljoin(host,homeUrl) if host and homeUrl else homeUrl or host - if url.find('[') >-1 and url.find(']') > -1: + self.homeUrl = urljoin(host, homeUrl) if host and homeUrl else homeUrl or host + if url.find('[') > -1 and url.find(']') > -1: u1 = url.split('[')[0] u2 = url.split('[')[1].split(']')[0] - self.url = urljoin(host,u1)+'['+urljoin(host,u2)+']' if host and url else url + self.url = urljoin(host, u1) + '[' + urljoin(host, u2) + ']' if host and url else url else: self.url = urljoin(host, url) if host and url else url - self.detailUrl = urljoin(host,detailUrl) if host and detailUrl else detailUrl - self.searchUrl = urljoin(host,searchUrl) if host and searchUrl else searchUrl - self.class_name = rule.get('class_name','') - self.class_url = rule.get('class_url','') - self.class_parse = rule.get('class_parse','') + self.detailUrl = urljoin(host, detailUrl) if host and detailUrl else detailUrl + self.searchUrl = urljoin(host, searchUrl) if host and searchUrl else searchUrl + self.class_name = rule.get('class_name', '') + self.class_url = rule.get('class_url', '') + self.class_parse = rule.get('class_parse', '') self.filter_name = rule.get('filter_name', '') self.filter_url = rule.get('filter_url', '') self.filter_parse = rule.get('filter_parse', '') - self.double = rule.get('double',False) - self.一级 = rule.get('一级','') - self.二级 = rule.get('二级','') - self.二级访问前 = rule.get('二级访问前','') - self.搜索 = rule.get('搜索','') - self.推荐 = rule.get('推荐','') - self.图片来源 = rule.get('图片来源','') + self.double = rule.get('double', False) + self.一级 = rule.get('一级', '') + self.二级 = rule.get('二级', '') + self.二级访问前 = rule.get('二级访问前', '') + self.搜索 = rule.get('搜索', '') + self.推荐 = rule.get('推荐', '') + self.图片来源 = rule.get('图片来源', '') self.encoding = encoding self.search_encoding = search_encoding - self.timeout = round(int(timeout)/1000,2) - self.filter = rule.get('filter',[]) - self.filter_def = rule.get('filter_def',{}) + self.timeout = round(int(timeout) / 1000, 2) + self.filter = rule.get('filter', []) + self.filter_def = rule.get('filter_def', {}) self.play_json = rule['play_json'] if 'play_json' in rule else [] self.pagecount = rule['pagecount'] if 'pagecount' in rule else {} - self.extend = rule.get('extend',[]) + self.extend = rule.get('extend', []) self.d = self.getObject() def getName(self): @@ -237,25 +276,25 @@ class CMS: def getObject(self): o = edict({ - 'jsp':jsoup(self.url), - 'getParse':self.getParse, - 'saveParse':self.saveParse, - 'oheaders':self.oheaders, - 'headers':self.headers, # 通用免嗅需要 - 'encoding':self.encoding, - 'name':self.title, - 'timeout':self.timeout, + 'jsp': jsoup(self.url), + 'getParse': self.getParse, + 'saveParse': self.saveParse, + 'oheaders': self.oheaders, + 'headers': self.headers, # 通用免嗅需要 + 'encoding': self.encoding, + 'name': self.title, + 'timeout': self.timeout, }) return o - def regexp(self,prule,text,pos=None): - ret = re.search(prule,text).groups() - if pos != None and isinstance(pos,int): + def regexp(self, prule, text, pos=None): + ret = re.search(prule, text).groups() + if pos != None and isinstance(pos, int): return ret[pos] else: return ret - def test(self,text,string): + def test(self, text, string): searchObj = re.search(rf'{text}', string, re.M | re.I) # print(searchObj) # global vflag @@ -274,7 +313,7 @@ class CMS: return { "vod_id": "id", "vod_name": "片名", - "vod_pic": "",# 图片 + "vod_pic": "", # 图片 "type_name": "剧情", "vod_year": "年份", "vod_area": "地区", @@ -294,7 +333,7 @@ class CMS: pj = jsp.pj pq = jsp.pq - return pdfh,pdfa,pd,pq + return pdfh, pdfa, pd, pq def getClasses(self): if not self.db: @@ -307,11 +346,11 @@ class CMS: res = self.db.session.query(self.RuleClass).filter(self.RuleClass.name == name).first() # _logger.info('xxxxxx') if res: - if not all([res.class_name,res.class_url]): + if not all([res.class_name, res.class_url]): return [] cls = res.class_name.split('&') cls2 = res.class_url.split('&') - classes = [{'type_name':cls[i],'type_id':cls2[i]} for i in range(len(cls))] + classes = [{'type_name': cls[i], 'type_id': cls2[i]} for i in range(len(cls))] # _logger.info(classes) logger.info(f"{self.getName()}使用缓存分类:{classes}") return classes @@ -330,7 +369,7 @@ class CMS: else: return None - def saveCookie(self,cookie): + def saveCookie(self, cookie): name = self.getName() if not self.db: msg = f'{name}未提供数据库连接' @@ -379,7 +418,7 @@ class CMS: except Exception as e: return f'发生了错误:{e}' - def getParse(self,play_url): + def getParse(self, play_url): if not self.db: msg = '未提供数据库连接' print(msg) @@ -396,26 +435,26 @@ class CMS: else: return '' - def dealJson(self,html): + def dealJson(self, html): try: # res = re.search('.*?\{(.*)\}',html,re.M|re.I).groups()[0] - res = re.search('.*?\{(.*)\}',html,re.M|re.S).groups()[0] + res = re.search('.*?\{(.*)\}', html, re.M | re.S).groups()[0] html = '{' + res + '}' return html except: return html - def checkHtml(self,r): + def checkHtml(self, r): r.encoding = self.encoding html = r.text if html.find('?btwaf=') > -1: - btwaf = re.search('btwaf(.*?)"',html,re.M|re.I).groups()[0] - url = r.url.split('#')[0]+'?btwaf'+btwaf + btwaf = re.search('btwaf(.*?)"', html, re.M | re.I).groups()[0] + url = r.url.split('#')[0] + '?btwaf' + btwaf # print(f'需要过宝塔验证:{url}') cookies_dict = requests.utils.dict_from_cookiejar(r.cookies) cookie_str = ';'.join([f'{k}={cookies_dict[k]}' for k in cookies_dict]) self.headers['cookie'] = cookie_str - r = requests.get(url, headers=self.headers, timeout=self.timeout,verify=False) + r = requests.get(url, headers=self.headers, timeout=self.timeout, verify=False) r.encoding = self.encoding html = r.text if html.find('?btwaf=') < 0: @@ -424,7 +463,7 @@ class CMS: # print(html) return html - def saveParse(self, play_url,real_url): + def saveParse(self, play_url, real_url): if not self.db: msg = '未提供数据库连接' print(msg) @@ -451,8 +490,7 @@ class CMS: except Exception as e: return f'{name}发生了错误:{e}' - - def homeContent(self,fypage=1): + def homeContent(self, fypage=1): # yanaifei # https://yanetflix.com/vodtype/dianying.html t1 = time() @@ -489,7 +527,7 @@ class CMS: pass else: new_classes = [] - r = requests.get(self.homeUrl, headers=self.headers, timeout=self.timeout,verify=False) + r = requests.get(self.homeUrl, headers=self.headers, timeout=self.timeout, verify=False) html = self.checkHtml(r) # print(html) # print(self.headers) @@ -501,7 +539,7 @@ class CMS: pdfh = jsp.pdfh pdfa = jsp.pdfa pd = jsp.pd - items = pdfa(html,p[0]) + items = pdfa(html, p[0]) # print(len(items)) # print(items) for item in items: @@ -514,7 +552,7 @@ class CMS: tag = url if len(p) > 3 and p[3].strip(): try: - tag = self.regexp(p[3].strip(),url,0) + tag = self.regexp(p[3].strip(), url, 0) except: logger.info(f'分类匹配错误:{title}对应的链接{url}无法匹配{p[3]}') continue @@ -525,13 +563,15 @@ class CMS: if len(new_classes) > 0: classes.extend(new_classes) self.saveClass(classes) - video_result = self.homeVideoContent(html,fypage) + video_result = self.homeVideoContent(html, fypage) except Exception as e: logger.info(f'{self.getName()}主页发生错误:{e}') - classes = list(filter(lambda x:not self.cate_exclude or not jsoup(self.url).test(self.cate_exclude, x['type_name']),classes)) + classes = list( + filter(lambda x: not self.cate_exclude or not jsoup(self.url).test(self.cate_exclude, x['type_name']), + classes)) result['class'] = classes if self.filter: - if isinstance(self.filter,dict): + if isinstance(self.filter, dict): result['filters'] = self.filter else: result['filters'] = playerConfig['filter'] @@ -540,7 +580,7 @@ class CMS: logger.info(f'{self.getName()}获取首页总耗时(包含读取缓存):{get_interval(t1)}毫秒') return result - def homeVideoContent(self,html,fypage=1): + def homeVideoContent(self, html, fypage=1): p = self.推荐 if not p: return self.blank() @@ -555,12 +595,12 @@ class CMS: 'input': self.homeUrl, 'HOST': self.host, 'TYPE': 'home', # 海阔js环境标志 - 'oheaders':self.d.oheaders, + 'oheaders': self.d.oheaders, 'fetch_params': {'headers': self.headers, 'timeout': self.d.timeout, 'encoding': self.d.encoding}, 'd': self.d, 'getParse': self.d.getParse, 'saveParse': self.d.saveParse, - 'jsp': jsp,'jq':jsp,'setDetail': setDetail, + 'jsp': jsp, 'jq': jsp, 'setDetail': setDetail, }) ctx = py_ctx jscode = getPreJs() + p.strip().replace('js:', '', 1) @@ -586,13 +626,15 @@ class CMS: return self.blank() jsp = jsoup(self.homeUrl) pp = self.一级.split(';') - def getPP(p,pn,pp,ppn): + + def getPP(p, pn, pp, ppn): try: ps = pp[ppn] if p[pn] == '*' and len(pp) > ppn else p[pn] return ps except Exception as e: return '' - p0 = getPP(p,0,pp,0) + + p0 = getPP(p, 0, pp, 0) is_json = str(p0).startswith('json:') if is_json: html = self.dealJson(html) @@ -603,7 +645,7 @@ class CMS: # print(html) try: if self.double: - items = pdfa(html, p0.replace('json:','')) + items = pdfa(html, p0.replace('json:', '')) # print(p[0]) # print(items) # print(len(items)) @@ -614,7 +656,7 @@ class CMS: p5 = getPP(p, 5, pp, 4) p6 = getPP(p, 6, pp, 5) for item in items: - items2 = pdfa(item,p1) + items2 = pdfa(item, p1) # print(len(items2)) for item2 in items2: try: @@ -628,7 +670,8 @@ class CMS: desc = pdfh(item2, p4) except: desc = '' - links = [pd(item2, _p5) if not self.detailUrl else pdfh(item2, _p5) for _p5 in p5.split('+')] + links = [pd(item2, _p5) if not self.detailUrl else pdfh(item2, _p5) for _p5 in + p5.split('+')] vid = '$'.join(links) if len(p) > 6 and p[6]: content = pdfh(item2, p6) @@ -641,7 +684,7 @@ class CMS: "vod_name": title, "vod_pic": img, "vod_remarks": desc, - "no_use":{ + "no_use": { "vod_content": content, "type_id": 1, "type_name": "首页推荐", @@ -650,7 +693,7 @@ class CMS: except: pass else: - items = pdfa(html, p0.replace('json:','')) + items = pdfa(html, p0.replace('json:', '')) # print(items) p1 = getPP(p, 1, pp, 1) p2 = getPP(p, 2, pp, 2) @@ -698,7 +741,7 @@ class CMS: return self.blank() if self.图片来源: for video in videos: - if video.get('vod_pic','') and str(video['vod_pic']).startswith('http'): + if video.get('vod_pic', '') and str(video['vod_pic']).startswith('http'): video['vod_pic'] = f"{video['vod_pic']}{self.图片来源}" result['list'] = videos # print(videos) @@ -726,9 +769,9 @@ class CMS: if fl is None: fl = {} # print(f'fl:{fl}') - if self.filter_def and isinstance(self.filter_def,dict): + if self.filter_def and isinstance(self.filter_def, dict): try: - if self.filter_def.get(fyclass) and isinstance(self.filter_def[fyclass],dict): + if self.filter_def.get(fyclass) and isinstance(self.filter_def[fyclass], dict): self_filter_def = self.filter_def[fyclass] filter_def = ujson.loads(ujson.dumps(self_filter_def)) filter_def.update(fl) @@ -748,20 +791,20 @@ class CMS: # url = self.url + '/{0}.html'.format t1 = time() pg = str(fypage) - url = self.url.replace('fyclass',fyclass) - if fypage == 1 and self.test('[\[\]]',url): + url = self.url.replace('fyclass', fyclass) + if fypage == 1 and self.test('[\[\]]', url): url = url.split('[')[1].split(']')[0] - elif fypage > 1 and self.test('[\[\]]',url): + elif fypage > 1 and self.test('[\[\]]', url): url = url.split('[')[0] if self.filter_url: - if not 'fyfilter' in url: # 第一种情况,默认不写fyfilter关键字,视为直接拼接在链接后面当参数 + if not 'fyfilter' in url: # 第一种情况,默认不写fyfilter关键字,视为直接拼接在链接后面当参数 if not url.endswith('&') and not self.filter_url.startswith('&'): url += '&' url += self.filter_url - else: # 第二种情况直接替换关键字为待拼接的结果后面渲染,适用于 ----fypage.html的情况 + else: # 第二种情况直接替换关键字为待拼接的结果后面渲染,适用于 ----fypage.html的情况 url = url.replace('fyfilter', self.filter_url) # print(f'url渲染:{url}') - url = render_template_string(url,fl=fl) + url = render_template_string(url, fl=fl) # fl_url = render_template_string(self.filter_url,fl=fl) # if not 'fyfilter' in url: # 第一种情况,默认不写fyfilter关键字,视为直接拼接在链接后面当参数 # if not url.endswith('&') and not fl_url.startswith('&'): @@ -774,17 +817,17 @@ class CMS: # url_rep = url[url.find('('):url.find(')')+1] # cnt_page = url.split('(')[1].split(')')[0].replace('fypage',pg) # print(url_rep) - url_rep = re.search('.*?\((.*)\)',url,re.M|re.S).groups()[0] + url_rep = re.search('.*?\((.*)\)', url, re.M | re.S).groups()[0] cnt_page = url_rep.replace('fypage', pg) # print(url_rep) # print(cnt_page) cnt_ctx = {} exec(f'cnt_pg={cnt_page}', cnt_ctx) - cnt_pg = str(cnt_ctx['cnt_pg']) # 计算表达式的结果 - url = url.replace(url_rep,str(cnt_pg)).replace('(','').replace(')','') + cnt_pg = str(cnt_ctx['cnt_pg']) # 计算表达式的结果 + url = url.replace(url_rep, str(cnt_pg)).replace('(', '').replace(')', '') # print(url) else: - url = url.replace('fypage',pg) + url = url.replace('fypage', pg) # print(url) logger.info(url) @@ -800,13 +843,13 @@ class CMS: 'oheaders': self.d.oheaders, 'fetch_params': {'headers': self.headers, 'timeout': self.d.timeout, 'encoding': self.d.encoding}, 'd': self.d, - 'MY_CATE':fyclass, # 分类id - 'MY_FL':fl, # 筛选 - 'MY_PAGE':fypage, # 页数 - 'detailUrl':self.detailUrl or '', # 详情页链接 + 'MY_CATE': fyclass, # 分类id + 'MY_FL': fl, # 筛选 + 'MY_PAGE': fypage, # 页数 + 'detailUrl': self.detailUrl or '', # 详情页链接 'getParse': self.d.getParse, 'saveParse': self.d.saveParse, - 'jsp': jsp,'jq':jsp, 'setDetail': setDetail, + 'jsp': jsp, 'jq': jsp, 'setDetail': setDetail, }) ctx = py_ctx # print(ctx) @@ -836,7 +879,7 @@ class CMS: items = [] try: - r = requests.get(url, headers=self.headers, timeout=self.timeout,verify=False) + r = requests.get(url, headers=self.headers, timeout=self.timeout, verify=False) html = self.checkHtml(r) print(self.headers) # print(html) @@ -849,7 +892,7 @@ class CMS: # print(html) # with open('1.html',mode='w+',encoding='utf-8') as f: # f.write(html) - items = pdfa(html,p[0].replace('json:','',1)) + items = pdfa(html, p[0].replace('json:', '', 1)) except: pass # print(items) @@ -863,9 +906,9 @@ class CMS: link = '$'.join(links) content = '' if len(p) < 6 else pdfh(item, p[5]) # sid = self.regStr(sid, "/video/(\\S+).html") - vod_id = f'{fyclass}${link}' if self.detailUrl else link # 分类,播放链接 + vod_id = f'{fyclass}${link}' if self.detailUrl else link # 分类,播放链接 if self.二级 == '*': - vod_id = vod_id+'@@'+title+'@@'+img + vod_id = vod_id + '@@' + title + '@@' + img videos.append({ "vod_id": vod_id, @@ -880,43 +923,44 @@ class CMS: if self.图片来源: for video in videos: - if video.get('vod_pic','') and str(video['vod_pic']).startswith('http'): + if video.get('vod_pic', '') and str(video['vod_pic']).startswith('http'): video['vod_pic'] = f"{video['vod_pic']}{self.图片来源}" - print('videos:',videos) + print('videos:', videos) limit = 40 cnt = 9999 if len(videos) > 0 else 0 pagecount = 0 - if self.pagecount and isinstance(self.pagecount,dict) and fyclass in self.pagecount: + if self.pagecount and isinstance(self.pagecount, dict) and fyclass in self.pagecount: print(f'fyclass:{fyclass},self.pagecount:{self.pagecount}') pagecount = int(self.pagecount[fyclass]) result['list'] = videos result['page'] = fypage - result['pagecount'] = pagecount or max(cnt,fypage) + result['pagecount'] = pagecount or max(cnt, fypage) result['limit'] = limit result['total'] = cnt # print(result) # print(result['pagecount']) - logger.info(f'{self.getName()}获取分类{fyclass}第{fypage}页耗时:{get_interval(t1)}毫秒,共计{round(len(str(result)) / 1000, 2)} kb') + logger.info( + f'{self.getName()}获取分类{fyclass}第{fypage}页耗时:{get_interval(t1)}毫秒,共计{round(len(str(result)) / 1000, 2)} kb') nodata = { 'list': [{'vod_name': '无数据,防无限请求', 'vod_id': 'no_data', 'vod_remarks': '不要点,会崩的', - 'vod_pic': 'https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/404.jpg'}], + 'vod_pic': 'https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/404.jpg'}], 'total': 1, 'pagecount': 1, 'page': 1, 'limit': 1 } # return result return result if len(result['list']) > 0 else nodata - def 二级渲染(self,parse_str:'str|dict',**kwargs): + def 二级渲染(self, parse_str: 'str|dict', **kwargs): # *args是不定长参数 列表 # ** args是不定长参数字典 p = parse_str # 二级传递解析表达式 js的obj json对象 - detailUrl = kwargs.get('detailUrl','') # 不定长字典传递的二级详情页vod_id详情处理数据 - orId = kwargs.get('orId','') # 不定长字典传递的二级详情页vod_id原始数据 - url = kwargs.get('url','') # 不定长字典传递的二级详情页链接智能拼接数据 - vod = kwargs.get('vod',self.blank_vod()) # 最终要返回的二级详情页数据 默认空 - html = kwargs.get('html','') # 不定长字典传递的源码(如果不传才会在下面程序中去获取) - show_name = kwargs.get('show_name','') # 是否显示来源(用于drpy区分) - jsp = kwargs.get('jsp','') # jsp = jsoup(self.url) 传递的jsp解析 - fyclass = kwargs.get('fyclass','') # 二级传递的分类名称,可以得知进去的类别 + detailUrl = kwargs.get('detailUrl', '') # 不定长字典传递的二级详情页vod_id详情处理数据 + orId = kwargs.get('orId', '') # 不定长字典传递的二级详情页vod_id原始数据 + url = kwargs.get('url', '') # 不定长字典传递的二级详情页链接智能拼接数据 + vod = kwargs.get('vod', self.blank_vod()) # 最终要返回的二级详情页数据 默认空 + html = kwargs.get('html', '') # 不定长字典传递的源码(如果不传才会在下面程序中去获取) + show_name = kwargs.get('show_name', '') # 是否显示来源(用于drpy区分) + jsp = kwargs.get('jsp', '') # jsp = jsoup(self.url) 传递的jsp解析 + fyclass = kwargs.get('fyclass', '') # 二级传递的分类名称,可以得知进去的类别 play_url = self.play_url vod_name = '片名' vod_pic = '' @@ -938,7 +982,8 @@ class CMS: vod['vod_pic'] = vod_pic vod['vod_play_url'] = '嗅探播放$' + play_url + url.split('@@')[0] - elif not p or (not isinstance(p, dict) and not isinstance(p, str)) or (isinstance(p, str) and not str(p).startswith('js:')): + elif not p or (not isinstance(p, dict) and not isinstance(p, str)) or ( + isinstance(p, str) and not str(p).startswith('js:')): pass else: is_json = p.get('is_json', False) if isinstance(p, dict) else False # 二级里加is_json参数 @@ -947,8 +992,8 @@ class CMS: pd = jsp.pj if is_json else jsp.pd pq = jsp.pq vod['vod_id'] = orId - if not html: # 没传递html参数接detailUrl下来智能获取 - r = requests.get(url, headers=self.headers, timeout=self.timeout,verify=False) + if not html: # 没传递html参数接detailUrl下来智能获取 + r = requests.get(url, headers=self.headers, timeout=self.timeout, verify=False) html = self.checkHtml(r) if is_json: html = self.dealJson(html) @@ -958,7 +1003,7 @@ class CMS: if p.get('title'): p1 = p['title'].split(';') vod['vod_name'] = pdfh(html, p1[0]).replace('\n', ' ').strip() - vod['type_name'] = pdfh(html, p1[1]).replace('\n',' ').strip() if len(p1)>1 else '' + vod['type_name'] = pdfh(html, p1[1]).replace('\n', ' ').strip() if len(p1) > 1 else '' if p.get('desc'): try: p1 = p['desc'].split(';') @@ -988,7 +1033,8 @@ class CMS: vod_play_from = '$$$' playFrom = [] - init_flag = {'ctx':False} + init_flag = {'ctx': False} + def js_pre(): headers['Referer'] = getHome(url) py_ctx.update({ @@ -1001,9 +1047,10 @@ class CMS: 'd': self.d, 'getParse': self.d.getParse, 'saveParse': self.d.saveParse, - 'jsp': jsp,'jq':jsp, 'setDetail': setDetail,'play_url':play_url + 'jsp': jsp, 'jq': jsp, 'setDetail': setDetail, 'play_url': play_url }) init_flag['ctx'] = True + if p.get('重定向') and str(p['重定向']).startswith('js:'): if not init_flag['ctx']: js_pre() @@ -1047,13 +1094,13 @@ class CMS: # print(str(etree.tostring(vHeader[0], pretty_print=True), 'utf-8')) from lxml.html import tostring as html2str # print(html2str(vHeader[0].root).decode('utf-8')) - tab_text = p.get('tab_text','') or 'body&&Text' + tab_text = p.get('tab_text', '') or 'body&&Text' # print('tab_text:'+tab_text) if not is_json: for v in vHeader: # 过滤排除掉线路标题 # v_title = pq(v).text() - v_title = pdfh(v,tab_text).strip() + v_title = pdfh(v, tab_text).strip() # print(v_title) if self.tab_exclude and jsp.test(self.tab_exclude, v_title): continue @@ -1073,7 +1120,7 @@ class CMS: else: new_map[v] += 1 if new_map[v] > 1: - v = f'{v}{new_map[v]-1}' + v = f'{v}{new_map[v] - 1}' playFrom.append(v) vod_play_from = vod_play_from.join(playFrom) @@ -1084,7 +1131,7 @@ class CMS: if not init_flag['ctx']: js_pre() ctx = py_ctx - ctx['TABS'] = vodHeader # 把选集列表传过去 + ctx['TABS'] = vodHeader # 把选集列表传过去 rcode = p['lists'].replace('js:', '', 1) jscode = getPreJs() + rcode # print(jscode) @@ -1093,16 +1140,16 @@ class CMS: logger.info(f'开始执行lists代码:{rcode}') vlists = loader.eval('LISTS') if isinstance(vod, JsObjectWrapper): - vlists = vlists.to_list() # [['第1集$http://1.mp4','第2集$http://2.mp4'],['第3集$http://1.mp4','第4集$http://2.mp4']] + vlists = vlists.to_list() # [['第1集$http://1.mp4','第2集$http://2.mp4'],['第3集$http://1.mp4','第4集$http://2.mp4']] for i in range(len(vlists)): try: - vlists[i] = list(map(lambda x:'$'.join(x.split('$')[:2]),vlists[i])) + vlists[i] = list(map(lambda x: '$'.join(x.split('$')[:2]), vlists[i])) except Exception as e: logger.info(f'LISTS格式化发生错误:{e}') - vod_play_url = vod_play_url.join(list(map(lambda x:'#'.join(x),vlists))) + vod_play_url = vod_play_url.join(list(map(lambda x: '#'.join(x), vlists))) else: - list_text = p.get('list_text','') or 'body&&Text' - list_url = p.get('list_url','') or 'a&&href' + list_text = p.get('list_text', '') or 'body&&Text' + list_url = p.get('list_url', '') or 'a&&href' print('list_text:' + list_text) print('list_url:' + list_url) is_tab_js = p['tabs'].strip().startswith('js:') @@ -1118,35 +1165,38 @@ class CMS: # vodList = [pq(i).text()+'$'+pd(i,'a&&href') for i in vodList] # 拼接成 名称$链接 # pq(i).text() if self.play_parse: # 自动base64编码 - vodList = [(pdfh(html, tab_ext) if tab_ext else tab_name) + '$' + play_url + encodeUrl(i) for i + vodList = [(pdfh(html, tab_ext) if tab_ext else tab_name) + '$' + play_url + encodeUrl(i) + for i in vodList] if is_json else \ - [pdfh(i,list_text) + '$' + play_url + encodeUrl(pd(i, list_url)) for i in vodList] # 拼接成 名称$链接 + [pdfh(i, list_text) + '$' + play_url + encodeUrl(pd(i, list_url)) for i in + vodList] # 拼接成 名称$链接 else: vodList = [(pdfh(html, tab_ext) if tab_ext else tab_name) + '$' + play_url + i for i in vodList] if is_json else \ - [pdfh(i,list_text) + '$' + play_url + pd(i, list_url) for i in vodList] # 拼接成 名称$链接 + [pdfh(i, list_text) + '$' + play_url + pd(i, list_url) for i in vodList] # 拼接成 名称$链接 # print(vodList) - vodList = forceOrder(vodList,option=lambda x:x.split('$')[0]) + vodList = forceOrder(vodList, option=lambda x: x.split('$')[0]) # print(vodList) vlist = '#'.join(vodList) # 拼多个选集 # print(vlist) vod_tab_list.append(vlist) vod_play_url = vod_play_url.join(vod_tab_list) - vod_play_url_str = vod_play_url[:min(len(vod_play_url),500)] + vod_play_url_str = vod_play_url[:min(len(vod_play_url), 500)] print(vod_play_url_str) vod['vod_play_from'] = vod_play_from # print(vod_play_from) vod['vod_play_url'] = vod_play_url - logger.info(f'{self.getName()}仅二级渲染{len(vod_play_url.split("$$$")[0].split("$"))}集耗时:{get_interval(tt1)}毫秒,共计{round(len(str(vod)) / 1000, 2)} kb') + logger.info( + f'{self.getName()}仅二级渲染{len(vod_play_url.split("$$$")[0].split("$"))}集耗时:{get_interval(tt1)}毫秒,共计{round(len(str(vod)) / 1000, 2)} kb') if show_name: vod['vod_content'] = f'({self.id}){vod.get("vod_content", "")}' return vod - def detailOneVod(self,id,fyclass='',show_name=False): + def detailOneVod(self, id, fyclass='', show_name=False): vod = self.blank_vod() orId = str(id) orUrl = orId @@ -1155,10 +1205,10 @@ class CMS: detailUrl = orId.split('@@')[0] # print(detailUrl) if not detailUrl.startswith('http') and not '/' in detailUrl: - url = self.detailUrl.replace('fyid', detailUrl).replace('fyclass',fyclass) + url = self.detailUrl.replace('fyid', detailUrl).replace('fyclass', fyclass) # print(url) elif '/' in detailUrl: - url = urljoin(self.homeUrl,detailUrl) + url = urljoin(self.homeUrl, detailUrl) else: url = detailUrl if self.二级访问前: @@ -1186,7 +1236,7 @@ class CMS: try: p = self.二级 # 解析 jsp = jsoup(url) if url.startswith('http') else jsoup(self.url) - is_js = isinstance(p,str) and str(p).startswith('js:') # 是js + is_js = isinstance(p, str) and str(p).startswith('js:') # 是js if is_js: headers['Referer'] = getHome(url) play_url = self.play_url @@ -1203,34 +1253,35 @@ class CMS: 'd': self.d, 'getParse': self.d.getParse, 'saveParse': self.d.saveParse, - 'jsp':jsp,'jq':jsp,'setDetail':setDetail,'play_url':play_url + 'jsp': jsp, 'jq': jsp, 'setDetail': setDetail, 'play_url': play_url }) ctx = py_ctx # print(ctx) - jscode = getPreJs() + p.replace('js:','',1) + jscode = getPreJs() + p.replace('js:', '', 1) # print(jscode) loader, _ = runJScode(jscode, ctx=ctx) # print(loader.toString()) vod = loader.eval('VOD') - if isinstance(vod,JsObjectWrapper): + if isinstance(vod, JsObjectWrapper): vod = vod.to_dict() if show_name: vod['vod_content'] = f'({self.id}){vod.get("vod_content", "")}' else: vod = self.blank_vod() else: - vod = self.二级渲染(p,detailUrl=detailUrl,orId=orUrl,url=url,vod=vod,show_name=show_name,jsp=jsp,fyclass=fyclass) + vod = self.二级渲染(p, detailUrl=detailUrl, orId=orUrl, url=url, vod=vod, show_name=show_name, jsp=jsp, + fyclass=fyclass) except Exception as e: logger.info(f'{self.getName()}获取单个详情页{detailUrl}出错{e}') if self.图片来源: - if vod.get('vod_pic','') and str(vod['vod_pic']).startswith('http'): + if vod.get('vod_pic', '') and str(vod['vod_pic']).startswith('http'): vod['vod_pic'] = f"{vod['vod_pic']}{self.图片来源}" - if not vod.get('vod_id') or ('$' in orUrl and vod['vod_id']!=orUrl): + if not vod.get('vod_id') or ('$' in orUrl and vod['vod_id'] != orUrl): vod['vod_id'] = orUrl # print(vod) return vod - def detailContent(self, fypage, array,show_name=False): + def detailContent(self, fypage, array, show_name=False): """ cms二级数据 :param array: @@ -1238,8 +1289,9 @@ class CMS: """ # print('进入二级') t1 = time() - array = array if len(array) <= self.limit else array[(fypage-1)*self.limit:min(self.limit*fypage,len(array))] - thread_pool = ThreadPoolExecutor(min(self.limit,len(array))) # 定义线程池来启动多线程执行此任务 + array = array if len(array) <= self.limit else array[ + (fypage - 1) * self.limit:min(self.limit * fypage, len(array))] + thread_pool = ThreadPoolExecutor(min(self.limit, len(array))) # 定义线程池来启动多线程执行此任务 obj_list = [] try: for vod_url in array: @@ -1249,14 +1301,15 @@ class CMS: tmp = vod_url.split('$') vod_class = tmp[0] vod_url = tmp[1] - obj = thread_pool.submit(self.detailOneVod, vod_url,vod_class,show_name) + obj = thread_pool.submit(self.detailOneVod, vod_url, vod_class, show_name) obj_list.append(obj) thread_pool.shutdown(wait=True) # 等待所有子线程并行完毕 vod_list = [obj.result() for obj in obj_list] result = { 'list': vod_list } - logger.info(f'{self.getName()}获取详情页耗时:{get_interval(t1)}毫秒,共计{round(len(str(result)) / 1000, 2)} kb') + logger.info( + f'{self.getName()}获取详情页耗时:{get_interval(t1)}毫秒,共计{round(len(str(result)) / 1000, 2)} kb') except Exception as e: result = { 'list': [] @@ -1265,18 +1318,18 @@ class CMS: # print(result) return result - def searchContent(self, key, fypage=1,show_name=False): + def searchContent(self, key, fypage=1, show_name=False): if self.search_encoding: if str(self.search_encoding).lower() != 'utf-8': - key = encodeStr(key,self.search_encoding) + key = encodeStr(key, self.search_encoding) elif self.encoding and str(self.encoding).startswith('gb'): # key = quote(key.encode('utf-8').decode('utf-8').encode(self.encoding,'ignore')) - key = encodeStr(key,self.encoding) + key = encodeStr(key, self.encoding) # print(key) pg = str(fypage) if not self.searchUrl: return self.blank() - url = self.searchUrl.replace('**', key).replace('fypage',pg) + url = self.searchUrl.replace('**', key).replace('fypage', pg) logger.info(f'{self.getName()}搜索链接:{url}') if not self.搜索: return self.blank() @@ -1293,6 +1346,7 @@ class CMS: return ps except: return '' + if is_js: headers['Referer'] = getHome(url) py_ctx.update({ @@ -1307,7 +1361,7 @@ class CMS: # 详情页链接 'getParse': self.d.getParse, 'saveParse': self.d.saveParse, - 'jsp': jsp,'jq':jsp, 'setDetail': setDetail, + 'jsp': jsp, 'jq': jsp, 'setDetail': setDetail, }) ctx = py_ctx # print(ctx) @@ -1330,11 +1384,11 @@ class CMS: pd = jsp.pj if is_json else jsp.pd pq = jsp.pq try: - req_method = url.split(';')[1].lower() if len(url.split(';'))>1 else 'get' + req_method = url.split(';')[1].lower() if len(url.split(';')) > 1 else 'get' if req_method == 'post': rurls = url.split(';')[0].split('#') rurl = rurls[0] - params = rurls[1] if len(rurls)>1 else '' + params = rurls[1] if len(rurls) > 1 else '' # params = quote(params) print(f'rurl:{rurl},params:{params}') new_dict = {} @@ -1346,13 +1400,13 @@ class CMS: data = new_dict # print(data) logger.info(self.headers) - r = requests.post(rurl, headers=self.headers,data=data, timeout=self.timeout, verify=False) + r = requests.post(rurl, headers=self.headers, data=data, timeout=self.timeout, verify=False) elif req_method == 'postjson': rurls = url.split(';')[0].split('#') rurl = rurls[0] params = rurls[1] if len(rurls) > 1 else '{}' headers_cp = self.headers.copy() - headers_cp.update({'Content-Type':'application/json'}) + headers_cp.update({'Content-Type': 'application/json'}) try: params = ujson.dumps(ujson.loads(params)) except: @@ -1362,15 +1416,15 @@ class CMS: logger.info(params) r = requests.post(rurl, headers=headers_cp, data=params, timeout=self.timeout, verify=False) else: - r = requests.get(url, headers=self.headers,timeout=self.timeout,verify=False) + r = requests.get(url, headers=self.headers, timeout=self.timeout, verify=False) html = self.checkHtml(r) if is_json: html = self.dealJson(html) html = json.loads(html) # if not is_json and html.find('输入验证码') > -1: - if not is_json and re.search('系统安全验证|输入验证码',html,re.M|re.S): - cookie = verifyCode(url,self.headers,self.timeout,self.retry_count,self.ocr_api) + if not is_json and re.search('系统安全验证|输入验证码', html, re.M | re.S): + cookie = verifyCode(url, self.headers, self.timeout, self.retry_count, self.ocr_api) # cookie = '' if not cookie: return { @@ -1378,15 +1432,15 @@ class CMS: } self.saveCookie(cookie) self.headers['cookie'] = cookie - r = requests.get(url, headers=self.headers, timeout=self.timeout,verify=False) + r = requests.get(url, headers=self.headers, timeout=self.timeout, verify=False) r.encoding = self.encoding html = r.text if not show_name and not str(html).find(key) > -1: logger.info('搜索结果源码未包含关键字,疑似搜索失败,正为您打印结果源码') print(html) - p0 = getPP(p,0,pp,0) - items = pdfa(html,p0.replace('json:','',1)) + p0 = getPP(p, 0, pp, 0) + items = pdfa(html, p0.replace('json:', '', 1)) # print(len(items),items) videos = [] p1 = getPP(p, 1, pp, 1) @@ -1425,7 +1479,7 @@ class CMS: "vod_name": title, "vod_pic": img, "vod_remarks": desc, - "vod_content": content, # 无用参数 + "vod_content": content, # 无用参数 }) except Exception as e: print(f'搜索列表解析发生错误:{e}') @@ -1435,19 +1489,19 @@ class CMS: logger.info(f'搜索{self.getName()}发生错误:{e}') if self.图片来源: for video in videos: - if video.get('vod_pic','') and str(video['vod_pic']).startswith('http'): + if video.get('vod_pic', '') and str(video['vod_pic']).startswith('http'): video['vod_pic'] = f"{video['vod_pic']}{self.图片来源}" if show_name and len(videos) > 0: for video in videos: - video['vod_name'] = self.id + ' '+video['vod_name'] + video['vod_name'] = self.id + ' ' + video['vod_name'] video['vod_rule'] = self.id - video['vod_id'] = video['vod_id'] +'#' + self.id + video['vod_id'] = video['vod_id'] + '#' + self.id result = { 'list': videos } return result - def playContent(self, play_url,jxs=None,flag=None): + def playContent(self, play_url, jxs=None, flag=None): # flag参数只有类型为4的时候才有,可以忽略 # logger.info('播放免嗅地址: ' + self.play_url) # 注意:全局flags里的视频没法执行免嗅代码,因为会自动拦截去调用解析: url=yoursite:5705/vod?play_url=xxxx @@ -1455,9 +1509,9 @@ class CMS: jxs = [] # print(play_url) - if play_url.find('http') == -1: # 字符串看起来被编码的 + if play_url.find('http') == -1: # 字符串看起来被编码的 try: - play_url = base64Decode(play_url) # 自动base64解码 + play_url = base64Decode(play_url) # 自动base64解码 except: pass # print(unquote(play_url)) @@ -1478,13 +1532,14 @@ class CMS: pos = pycode.find('def lazyParse') if pos < 0: return play_url - pyenv = safePython(self.lazy,pycode[pos:]) - lazy_url = pyenv.action_task_exec('lazyParse',[play_url,self.d]) + pyenv = safePython(self.lazy, pycode[pos:]) + lazy_url = pyenv.action_task_exec('lazyParse', [play_url, self.d]) logger.info(f'py免嗅耗时:{get_interval(t1)}毫秒,播放地址:{lazy_url}') - if isinstance(lazy_url,str) and lazy_url.startswith('http'): + if isinstance(lazy_url, str) and lazy_url.startswith('http'): play_url = lazy_url else: - jscode = str(self.lazy).strip().replace('js:', '', 1) if str(self.lazy).startswith('js:') else js_code + jscode = str(self.lazy).strip().replace('js:', '', 1) if str(self.lazy).startswith( + 'js:') else js_code jsp = jsoup(self.url) # jscode = f'var input={play_url};{jscode}' # print(jscode) @@ -1492,29 +1547,30 @@ class CMS: py_ctx.update({ 'input': play_url, 'oheaders': self.d.oheaders, - 'fetch_params':{'headers':self.headers,'timeout':self.d.timeout,'encoding':self.d.encoding}, + 'fetch_params': {'headers': self.headers, 'timeout': self.d.timeout, + 'encoding': self.d.encoding}, 'd': self.d, - 'jxs':jxs, - 'getParse':self.d.getParse, - 'saveParse':self.d.saveParse, + 'jxs': jxs, + 'getParse': self.d.getParse, + 'saveParse': self.d.saveParse, 'jsp': jsp, 'jq': jsp, 'pdfh': self.d.jsp.pdfh, - 'pdfa': self.d.jsp.pdfa, 'pd': self.d.jsp.pd,'play_url':self.play_url + 'pdfa': self.d.jsp.pdfa, 'pd': self.d.jsp.pd, 'play_url': self.play_url }) ctx = py_ctx # print(ctx) jscode = getPreJs() + jscode # print(jscode) - loader,_ = runJScode(jscode,ctx=ctx) + loader, _ = runJScode(jscode, ctx=ctx) # print(loader.toString()) play_url = loader.eval('input') - if isinstance(play_url,JsObjectWrapper): + if isinstance(play_url, JsObjectWrapper): play_url = play_url.to_dict() # print(type(play_url)) # print(play_url) logger.info(f'js免嗅耗时:{get_interval(t1)}毫秒,播放地址:{play_url}') - if not play_url and play_url!='' and play_url!={}: + if not play_url and play_url != '' and play_url != {}: play_url = origin_play_url # if play_url == {}: # play_url = None @@ -1527,11 +1583,11 @@ class CMS: if self.play_json: # 如果传了 play_json 参数并且是个大于0的列表的话 - if isinstance(self.play_json,list) and len(self.play_json) > 0: + if isinstance(self.play_json, list) and len(self.play_json) > 0: # 获取播放链接 - web_url = play_url if isinstance(play_url,str) else play_url.get('url') + web_url = play_url if isinstance(play_url, str) else play_url.get('url') for pjson in self.play_json: - if pjson.get('re') and (pjson['re']=='*' or re.search(pjson['re'],web_url,re.S|re.M)): + if pjson.get('re') and (pjson['re'] == '*' or re.search(pjson['re'], web_url, re.S | re.M)): if pjson.get('json') and isinstance(pjson['json'], dict): if isinstance(play_url, str): base_json = pjson['json'] @@ -1544,31 +1600,33 @@ class CMS: # 不管有没有效,匹配到了就跑??? (当然不行了,要不然写来干嘛) break - else: # 没有指定列表默认表示需要解析,解析播放 (如果不要解析,我想也是没人会去写这个参数) + else: # 没有指定列表默认表示需要解析,解析播放 (如果不要解析,我想也是没人会去写这个参数) base_json = { - 'jx':1, # 解析开 - 'parse':1, # 嗅探 关 pluto这个标识有问题 只好双1了 + 'jx': 1, # 解析开 + 'parse': 1, # 嗅探 关 pluto这个标识有问题 只好双1了 } - if isinstance(play_url,str): + if isinstance(play_url, str): base_json['url'] = play_url play_url = base_json - elif isinstance(play_url,dict): + elif isinstance(play_url, dict): play_url.update(base_json) logger.info(f'最终返回play_url:{play_url}') return play_url + if __name__ == '__main__': print(urljoin('https://api.web.360kan.com/v1/f', '//0img.hitv.com/preview/sp_images/2022/01/28/202201281528074643023.jpg')) # exit() from utils import parser + # js_path = f'js/玩偶姐姐.js' # js_path = f'js/555影视.js' with open('../js/模板.js', encoding='utf-8') as f: before = f.read().split('export')[0] js_path = f'js/360影视.js' - ctx, js_code = parser.runJs(js_path,before=before) + ctx, js_code = parser.runJs(js_path, before=before) ruleDict = ctx.rule.to_dict() # lazy = ctx.eval('lazy') # print(lazy) @@ -1584,4 +1642,4 @@ if __name__ == '__main__': # cms.categoryContent('dianying',1) # print(cms.detailContent(['67391'])) # print(cms.searchContent('斗罗大陆')) - print(cms.searchContent('独行月球')) \ No newline at end of file + print(cms.searchContent('独行月球')) diff --git a/controllers/home.py b/controllers/home.py index 4727198..8d07470 100644 --- a/controllers/home.py +++ b/controllers/home.py @@ -235,6 +235,7 @@ def config_render(mode): tt = time() UA = request.headers['User-Agent'] ver = getParmas('ver') + sp = getParmas('sp') # 优选 logger.info(f'ver:{ver},UA:{UA}') if ver not in ['1','2']: ISTVB = 'okhttp/3' in UA @@ -279,8 +280,12 @@ def config_render(mode): merged_hide(merged_config) # response = make_response(html) # print(len(merged_config['sites'])) - print(merged_config['sites']) + # print(merged_config['sites']) merged_config['sites'] = sort_sites_by_order(merged_config['sites'],js_mode) + # print(merged_config['sites']) + if sp: # 执行动态优选源 + special_rule(merged_config,lsg) + # print(merged_config['parses']) parses = sort_parses_by_order(merged_config['parses'],host) # print(parses) @@ -302,6 +307,23 @@ def config_render(mode): logger.info(f'自动生成动态配置共计耗时:{get_interval(tt)}毫秒') return response +def special_rule(merged_config,lsg): + # print(merged_config['sites']) + special = lsg.getItem('SPECIAL').strip() + # print('SPECIAL:',special) + special_dict = {} + for sp in special.split('&'): + special_dict[sp.split(':')[0]] = sp.split(':')[1] if ':' in sp else '' + + special_keys = list(special_dict.keys()) + special_ft = list(filter(lambda x: x.get('key').replace('dr_', '') in special_keys, merged_config['sites'])) + for spf in special_ft: + spf['name'] = special_dict[spf['key'].replace('dr_', '')] or spf['name'] + + special_st = sorted(special_ft, key=lambda x: special_keys.index(x.get('key').replace('dr_', ''))) + merged_config['sites'] = special_st + merged_config['dr_count'] = len(special_st) + def comp(x, y): if x['order'] > y['order']: return 1 diff --git a/controllers/service.py b/controllers/service.py index 6d8fe35..d9fb182 100644 --- a/controllers/service.py +++ b/controllers/service.py @@ -10,7 +10,8 @@ from models.ruleclass import RuleClass from models.vipParse import VipParse from utils.cfg import cfg from base.database import db -from datetime import datetime,timedelta +from datetime import datetime, timedelta + class storage_service(object): @@ -21,8 +22,11 @@ class storage_service(object): return copy_utils.obj_to_list(res) def __init__(self): - conf_list = ['LIVE_URL', 'USE_PY', 'JS_MODE','JS0_DISABLE','JS0_PASSWORD','PLAY_URL', 'PLAY_DISABLE', 'LAZYPARSE_MODE', 'WALL_PAPER_ENABLE', - 'WALL_PAPER', 'UNAME', 'PWD', 'LIVE_MODE', 'CATE_EXCLUDE', 'TAB_EXCLUDE','SEARCH_TIMEOUT','SEARCH_LIMIT','MULTI_MODE','XR_MODE','JS_PROXY','UPDATE_PROXY','ENV','ALI_TOKEN','OCR_API'] + conf_list = ['LIVE_URL', 'USE_PY', 'JS_MODE', 'JS0_DISABLE', 'JS0_PASSWORD', 'PLAY_URL', 'PLAY_DISABLE', + 'LAZYPARSE_MODE', 'WALL_PAPER_ENABLE', + 'WALL_PAPER', 'UNAME', 'PWD', 'LIVE_MODE', 'CATE_EXCLUDE', 'TAB_EXCLUDE', 'SEARCH_TIMEOUT', + 'SEARCH_LIMIT', 'MULTI_MODE', 'XR_MODE', 'JS_PROXY', 'UPDATE_PROXY', 'ENV', 'ALI_TOKEN', 'OCR_API', + 'SPECIAL'] for conf in conf_list: if not self.hasItem(conf): print(f'开始初始化{conf}') @@ -31,10 +35,14 @@ class storage_service(object): @classmethod def getStoreConf(self): # MAX_CONTENT_LENGTH 最大上传和端口ip一样是顶级配置,无法外部修改的 - conf_list = ['LIVE_URL', 'LIVE_MODE','PLAY_URL', 'PID_URL','USE_PY','JS_MODE', 'JS0_DISABLE','JS0_PASSWORD','PLAY_DISABLE', 'LAZYPARSE_MODE', 'WALL_PAPER_ENABLE', - 'WALL_PAPER', 'UNAME', 'PWD', 'CATE_EXCLUDE', 'TAB_EXCLUDE','SEARCH_TIMEOUT','SEARCH_LIMIT','MULTI_MODE','XR_MODE','JS_PROXY','UPDATE_PROXY','ENV','ALI_TOKEN','OCR_API'] - conf_name_list = ['直播地址', '直播模式','远程地址', '进程管理链接','启用py源', 'js模式','禁用js0','js0密码','禁用免嗅', '免嗅模式', '启用壁纸', '壁纸链接', '管理账号', - '管理密码', '分类排除', '线路排除','聚搜超时','搜索条数','多源模式','仙人模式','源代理','升级代理','环境变量','阿里tk','OCR接口'] + conf_list = ['LIVE_URL', 'LIVE_MODE', 'PLAY_URL', 'PID_URL', 'USE_PY', 'JS_MODE', 'JS0_DISABLE', 'JS0_PASSWORD', + 'PLAY_DISABLE', 'LAZYPARSE_MODE', 'WALL_PAPER_ENABLE', + 'WALL_PAPER', 'UNAME', 'PWD', 'CATE_EXCLUDE', 'TAB_EXCLUDE', 'SEARCH_TIMEOUT', 'SEARCH_LIMIT', + 'MULTI_MODE', 'XR_MODE', 'JS_PROXY', 'UPDATE_PROXY', 'ENV', 'SPECIAL', 'ALI_TOKEN', 'OCR_API'] + conf_name_list = ['直播地址', '直播模式', '远程地址', '进程管理链接', '启用py源', 'js模式', '禁用js0', + 'js0密码', '禁用免嗅', '免嗅模式', '启用壁纸', '壁纸链接', '管理账号', + '管理密码', '分类排除', '线路排除', '聚搜超时', '搜索条数', '多源模式', '仙人模式', '源代理', + '升级代理', '环境变量', '优选源', '阿里tk', 'OCR接口'] conf_lists = [] for i in range(len(conf_list)): conf = conf_list[i] @@ -55,7 +63,7 @@ class storage_service(object): @classmethod def getItem(self, key, value=''): - res = Storage.getItem(key,value) + res = Storage.getItem(key, value) if str(res) == '0' or str(res) == 'false' or str(res) == 'False': return 0 return res @@ -65,19 +73,20 @@ class storage_service(object): return Storage.hasItem(key) @classmethod - def setItem(self,key, value): + def setItem(self, key, value): return Storage.setItem(key, value) @classmethod - def clearItem(self,key): + def clearItem(self, key): return Storage.clearItem(key) + class rules_service(object): @staticmethod def query_all(): # 查询所有 - res = RuleClass.query.order_by(RuleClass.order.asc(),RuleClass.write_date.desc()).all() + res = RuleClass.query.order_by(RuleClass.order.asc(), RuleClass.write_date.desc()).all() # print(res) # res = RuleClass.query.order_by(RuleClass.write_date.asc()).all() return copy_utils.obj_to_list(res) @@ -86,7 +95,7 @@ class rules_service(object): def hasItem(self, key): return RuleClass.hasItem(key) - def getState(self,key): + def getState(self, key): res = RuleClass.query.filter(RuleClass.name == key).first() if not res: return 1 @@ -96,8 +105,7 @@ class rules_service(object): state = 1 return state or 0 - - def setState(self,key,state=0): + def setState(self, key, state=0): res = RuleClass.query.filter(RuleClass.name == key).first() if res: res.state = state @@ -113,7 +121,7 @@ class rules_service(object): print(f'发生了错误:{e}') return None - def setOrder(self,key,order=0): + def setOrder(self, key, order=0): res = RuleClass.query.filter(RuleClass.name == key).first() if res: res.order = order @@ -138,12 +146,13 @@ class rules_service(object): res = RuleClass.query.filter(RuleClass.state == 0).all() return copy_utils.obj_to_list(res) + class parse_service(object): @staticmethod def query_all(): # 查询所有 - res = VipParse.query.order_by(VipParse.order.asc(),VipParse.write_date.desc()).all() + res = VipParse.query.order_by(VipParse.order.asc(), VipParse.write_date.desc()).all() # print(res) # res = RuleClass.query.order_by(RuleClass.write_date.asc()).all() return copy_utils.obj_to_list(res) @@ -152,7 +161,7 @@ class parse_service(object): def hasItem(self, key): return VipParse.hasItem(key) - def getState(self,key): + def getState(self, key): res = VipParse.query.filter(VipParse.url == key).first() if not res: return 1 @@ -162,8 +171,7 @@ class parse_service(object): state = 1 return state or 0 - - def setState(self,key,state=0): + def setState(self, key, state=0): res = VipParse.query.filter(VipParse.url == key).first() if res: res.state = state @@ -179,7 +187,7 @@ class parse_service(object): print(f'发生了错误:{e}') return None - def setOrder(self,key,order=0): + def setOrder(self, key, order=0): res = VipParse.query.filter(VipParse.url == key).first() if res: res.order = order @@ -199,7 +207,7 @@ class parse_service(object): print(f'发生了错误:{e}') return None - def setEverything(self,key,name,state,typeno,order,ext,header): + def setEverything(self, key, name, state, typeno, order, ext, header): res = VipParse.query.filter(VipParse.url == key).first() if res: res.name = name @@ -211,7 +219,7 @@ class parse_service(object): res.write_date = datetime.now() db.session.add(res) else: - res = VipParse(name=name,url=key,state=state,type=typeno,order=order,ext=ext,header=header) + res = VipParse(name=name, url=key, state=state, type=typeno, order=order, ext=ext, header=header) db.session.add(res) db.session.flush() # 获取id try: @@ -221,7 +229,7 @@ class parse_service(object): print(f'发生了错误:{e}') return None - def saveData(self,obj): + def saveData(self, obj): """ db.session.add_all([]) 可以一次性保存多条数据,但是这里用不到,因为涉及修改和新增一起的 :param obj: diff --git a/controllers/web.py b/controllers/web.py index 3775b07..ac96ac3 100644 --- a/controllers/web.py +++ b/controllers/web.py @@ -56,6 +56,16 @@ def custom_player2(): ctx = getParmas() return render_template('player/p2p-media-loader/p2pm3u8.html', ctx=ctx) +@web.route('/player3') +def custom_player3(): + ctx = getParmas() + return render_template('player/p2pplayer/index.htm', ctx=ctx) + +@web.route('/player4') +def custom_player4(): + ctx = getParmas() + return render_template('player/p2phls/p2phls.html', ctx=ctx) + @web.route('//') def web_index(web_name, theme): ctx = {'web_name': web_name, 'key': '关键词', 'description': '描述'} diff --git a/doc/写源教程.md b/doc/写源教程.md index 2f806b9..318c45f 100644 --- a/doc/写源教程.md +++ b/doc/写源教程.md @@ -15,6 +15,7 @@ var rule = { 编码:'',//不填就默认utf-8 搜索编码:'',//不填则不编码,默认都是按utf-8.可优先于全局编码属性.比如网页源码编码是gbk,这里可以指定utf-8搜索独立编码。多数情况这个属性不填或者填写gbk应对特殊的网站搜索 host:'',//网页的域名根,包含http头如 https://www,baidu.com + hostJS:'print(HOST);let html=request(HOST,{headers:{"User-Agent":PC_UA}});let src = jsp.pdfh(html,"ul&&li&&a&&href");print(src);HOST=src.replace("/index.php","")',//网页域名根动态抓取js代码。通过HOST=赋值 homeUrl:'/latest/',//网站的首页链接,可以是完整路径或者相对路径,用于分类获取和推荐获取 fyclass是分类标签 fypage是页数 url:'/fyclass/fypage.html[/fyclass/]',//网站的分类页面链接 detailUrl:'https://yanetflix.com/voddetail/fyid.html',//非必填,二级详情拼接链接,感觉没啥卵用 diff --git a/doc/接口文档.md b/doc/接口文档.md new file mode 100644 index 0000000..fb2f5f9 --- /dev/null +++ b/doc/接口文档.md @@ -0,0 +1,3524 @@ +## 全局公共参数 +#### 全局Header参数 +参数名 | 示例值 | 参数描述 +--- | --- | --- +暂无参数 +#### 全局Query参数 +参数名 | 示例值 | 参数描述 +--- | --- | --- +暂无参数 +#### 全局Body参数 +参数名 | 示例值 | 参数描述 +--- | --- | --- +暂无参数 +#### 全局认证方式 +```text +noauth +``` +#### 全局预执行脚本 +```javascript +暂无预执行脚本 +``` +#### 全局后执行脚本 +```javascript +暂无后执行脚本 +``` +## /cms接口 +```text +核心的api参数文档 +``` +#### Header参数 +参数名 | 示例值 | 参数描述 +--- | --- | --- +暂无参数 +#### Query参数 +参数名 | 示例值 | 参数描述 +--- | --- | --- +暂无参数 +#### Body参数 +参数名 | 示例值 | 参数描述 +--- | --- | --- +暂无参数 +#### 认证方式 +```text +noauth +``` +#### 预执行脚本 +```javascript +暂无预执行脚本 +``` +#### 后执行脚本 +```javascript +暂无后执行脚本 +``` +## /cms接口/主页接口-获取首页推荐和分类数据 +```text +暂无描述 +``` +#### 接口状态 +> 开发中 + +#### 接口URL +> /vod?pwd=daozhangyyds&rule=8K影视 + +#### 请求方式 +> GET + +#### Content-Type +> form-data + +#### 请求Query参数 +参数名 | 示例值 | 参数类型 | 是否必填 | 参数描述 +--- | --- | --- | --- | --- +pwd | daozhangyyds | String | 是 | 接口密码 +rule | 8K影视 | String | 是 | 接口指定内置服务端本地的js源名称 +#### 认证方式 +```text +noauth +``` +#### 预执行脚本 +```javascript +暂无预执行脚本 +``` +#### 后执行脚本 +```javascript +暂无后执行脚本 +``` +#### 成功响应示例 +```javascript +{"class":[{"type_id":"6","type_name":"动作片"},{"type_id":"7","type_name":"喜剧片"},{"type_id":"8","type_name":"爱情片"},{"type_id":"9","type_name":"科幻片"},{"type_id":"10","type_name":"恐怖片"},{"type_id":"11","type_name":"剧情片"},{"type_id":"12","type_name":"战争片"},{"type_id":"48","type_name":"惊悚片"},{"type_id":"49","type_name":"犯罪片"},{"type_id":"50","type_name":"冒险片"},{"type_id":"51","type_name":"悬疑片"},{"type_id":"52","type_name":"奇幻片"},{"type_id":"28","type_name":"纪录片"},{"type_id":"29","type_name":"动画片"},{"type_id":"31","type_name":"其他片"},{"type_id":"13","type_name":"国产剧"},{"type_id":"14","type_name":"港台剧"},{"type_id":"15","type_name":"日韩剧"},{"type_id":"16","type_name":"欧美剧"},{"type_id":"20","type_name":"海外剧"},{"type_id":"21","type_name":"大陆综艺"},{"type_id":"22","type_name":"港台综艺"},{"type_id":"23","type_name":"国外综艺"},{"type_id":"39","type_name":"歌曲MV"},{"type_id":"24","type_name":"国产动漫"},{"type_id":"25","type_name":"日本动漫"},{"type_id":"26","type_name":"欧美动漫"},{"type_id":"27","type_name":"其他动漫"},{"type_id":"53","type_name":"足球"},{"type_id":"54","type_name":"篮球"},{"type_id":"55","type_name":"网球"}],"list":[{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/1824/","vod_name":"乘风 2023","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-2/42d41bdefba7994f9fb241da89c7da1b.jpg","vod_remarks":"更新至第20230604期"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/92262/","vod_name":"妻子的新世界","vod_pic":"http://img.8kvod.com/upload/vod/20230524-1/6cc55a3db42827c584ccd6d4bcef12f8.jpg","vod_remarks":"已完结"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/4200/","vod_name":"斗罗大陆","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-5/ce539c364f0ff7fc456caab30708035e.jpg","vod_remarks":"更新至第262集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121172/","vod_name":"龙马精神","vod_pic":"http://img.8kvod.com/upload/vod/20230601-1/3a64c51c9a30b10cd05d3582ef4b3c73.jpg","vod_remarks":"蓝光"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/88010/","vod_name":"凡人修仙传重制版","vod_pic":"http://img.8kvod.com/upload/vod/20230512-1/31c6f1cc1934edc17b3ec868fe0e7b4e.jpg","vod_remarks":"更新至第19集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/7646/","vod_name":"满江红","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-8/22c0f59f6ed5c6fe343b5335acc69967.jpg","vod_remarks":"完结"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/116239/","vod_name":"毒舌律师","vod_pic":"http://47.119.122.235:99/8kvod-img-230525/20230525-24/5b7fa04b0a7e8bc10a91fd5160058886.jpg","vod_remarks":"TC国语"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/88807/","vod_name":"一舞倾城粤语","vod_pic":"http://img.8kvod.com/upload/vod/20230515-1/d59b29ee917a044bde28695f7ae151d1.jpg","vod_remarks":"更新至第15集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121609/","vod_name":"一千灵异夜之护花使者","vod_pic":"http://img.8kvod.com/upload/vod/20230604-1/ad7b31c60884a81f27edbc405aa3729b.jpg","vod_remarks":"HD国语"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/35211/","vod_name":"杨门女将","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-34/66a39d11305f3714757b886a0936f82c.jpg","vod_remarks":"已完结"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121575/","vod_name":"青春大反抗","vod_pic":"http://img.8kvod.com/upload/vod/20230604-1/a9f52d2969dc3e5f72b2b1b796fc67c8.jpg","vod_remarks":"HD中字"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121574/","vod_name":"圣诞狗狗2:圣诞小宝贝","vod_pic":"http://img.8kvod.com/upload/vod/20230604-1/a09aef0019bb47c33c8747bb1b6fd38c.jpg","vod_remarks":"HD中字"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121573/","vod_name":"圣域守护者","vod_pic":"http://img.8kvod.com/upload/vod/20230604-1/2bb440813c234444e6ba36ae06e09984.jpg","vod_remarks":"HD中字"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121566/","vod_name":"怎么又是你","vod_pic":"http://img.8kvod.com/upload/vod/20230604-1/ab1573e6a030ffe869b8de134a6ef33f.jpg","vod_remarks":"HD中字"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121565/","vod_name":"占卜师们","vod_pic":"http://img.8kvod.com/upload/vod/20230604-1/10aa219a60fb7f6da63d1db62bbe7c26.jpg","vod_remarks":"HD中字"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121564/","vod_name":"史前星球 第一季","vod_pic":"http://img.8kvod.com/upload/vod/20230604-1/f081d0f8bd85066ed1452dc639cebb9e.jpg","vod_remarks":"已完结"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121536/","vod_name":"摇滚斗阵","vod_pic":"http://img.8kvod.com/upload/vod/20230604-1/fb50f0cd70d058cfc1e91d91a9e660d5.jpg","vod_remarks":"HD中字"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121535/","vod_name":"莫欺朋友妻","vod_pic":"http://img.8kvod.com/upload/vod/20230604-1/49607c0bd9f6f1fd94b3b1dcae78cdc4.jpg","vod_remarks":"HD中字"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121534/","vod_name":"偶滴神啊","vod_pic":"http://img.8kvod.com/upload/vod/20230604-1/02f7fa9d8a37f5877c5baab839c3a4a4.jpg","vod_remarks":"HD中字"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121532/","vod_name":"乒乓特种兵","vod_pic":"http://img.8kvod.com/upload/vod/20230604-1/0f33792eef0b2cc2bf1c7addcec5da2b.jpg","vod_remarks":"HD中字"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/71346/","vod_name":"航海王:狂热行动","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-69/a44974a0f1fb14d9883194d187d79805.jpg","vod_remarks":"HD中字"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/33638/","vod_name":"新邻里联防","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-33/f1481829cc480d134eeda0315ba2adba.jpg","vod_remarks":"HD中字"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/1837/","vod_name":"政坛混战","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-2/8dfcc86b09ffe8b35957d5f5d5760a55.jpg","vod_remarks":"HD中字"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121626/","vod_name":"萤之光电影版","vod_pic":"http://img.8kvod.com/upload/vod/20230605-1/917968972190c9d2c1b660ab16965c9b.jpg","vod_remarks":"HD中字"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121228/","vod_name":"危情关系","vod_pic":"http://img.8kvod.com/upload/vod/20230602-1/19e36654c929ca3544dd0bd333b6b023.jpg","vod_remarks":"更新至第12集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/120937/","vod_name":"家有蛇仙美貌妻","vod_pic":"http://img.8kvod.com/upload/vod/20230531-1/41113e9c72ce7be1f91c55a2aac19fe9.jpg","vod_remarks":"更新至第12集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/120794/","vod_name":"我的医妃不好惹3","vod_pic":"http://img.8kvod.com/upload/vod/20230530-1/d99d21b31d30759e8aa0402c2a2dd6e0.jpg","vod_remarks":"更新至第16集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/120110/","vod_name":"是!老板","vod_pic":"http://img.8kvod.com/upload/vod/20230527-1/67f71fb1b91e5e391893c5b439644101.jpg","vod_remarks":"已完结"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/119361/","vod_name":"不止是合租的关系","vod_pic":"http://img.8kvod.com/upload/vod/20230526-1/6683156c78bf54c20b5cc58b317dc030.jpg","vod_remarks":"更新至第23集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/119309/","vod_name":"锁爱三生","vod_pic":"http://img.8kvod.com/upload/vod/20230526-1/d9177a235a90e3566ad544ea0f0c3267.jpg","vod_remarks":"更新至第22集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/91937/","vod_name":"张震讲故事","vod_pic":"http://img.8kvod.com/upload/vod/20230524-1/66246c253538fa6e0aaa786664e59634.jpg","vod_remarks":"更新至第16集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121379/","vod_name":"爱情,开袋即食","vod_pic":"http://img.8kvod.com/upload/vod/20230603-1/fa123fea51f30ed5b34d5e4b00f41c8f.jpg","vod_remarks":"更新至第10集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/120820/","vod_name":"香蕉先生不睡觉","vod_pic":"http://img.8kvod.com/upload/vod/20230530-1/4b2bbc24f718da3adf213ab63f2138e4.jpg","vod_remarks":"更新至第13集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121315/","vod_name":"照亮你","vod_pic":"http://img.8kvod.com/upload/vod/20230602-1/71a65e54860b678a4fc001b2fe51fa53.jpg","vod_remarks":"更新至第08集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121152/","vod_name":"梦中的那片海","vod_pic":"http://img.8kvod.com/upload/vod/20230601-1/4f01c27960cf2f77d9aa7ab684779bd7.jpg","vod_remarks":"更新至第10集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121140/","vod_name":"花戎","vod_pic":"http://img.8kvod.com/upload/vod/20230601-1/0d8e19c7d9c62cd4cd7b8851d5760988.jpg","vod_remarks":"更新至第12集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121030/","vod_name":"白色城堡","vod_pic":"http://img.8kvod.com/upload/vod/20230531-1/e890baaac1b918888212a23da729407f.jpg","vod_remarks":"更新至第12集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/88585/","vod_name":"后浪","vod_pic":"http://img.8kvod.com/upload/vod/20230514-1/c509308ed3b9c3584653cc0b6237043e.jpg","vod_remarks":"更新至第38集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121619/","vod_name":"乔·皮克特 第二季","vod_pic":"http://img.8kvod.com/upload/vod/20230604-1/12739f4c45453534cb88cbf2e6679590.jpg","vod_remarks":"更新至第02集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/120111/","vod_name":"公诉","vod_pic":"http://img.8kvod.com/upload/vod/20230527-1/00b9e3376b527fa3e3af83a7a14aa63f.jpg","vod_remarks":"更新至第12集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/3390/","vod_name":"中国说唱巅峰对决 2023","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-4/0cead7bea71b6f9139915482ca3f9884.jpg","vod_remarks":"更新至第20230604期"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/3362/","vod_name":"向往的生活 第七季","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-4/66fed01c9761aa8ac1ba5523fa3b525d.jpg","vod_remarks":"更新至第20230604期"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/3016/","vod_name":"五十公里桃花坞 第三季","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-3/88aa3f4c96c1e07983115fb91a03d3c7.jpg","vod_remarks":"更新至第20230604期"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/1824/","vod_name":"乘风 2023","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-2/42d41bdefba7994f9fb241da89c7da1b.jpg","vod_remarks":"更新至第20230604期"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/1320/","vod_name":"种地吧","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-2/8d62ebe71fc9ebafdd6dc05c115af025.jpg","vod_remarks":"更新至第34期"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/3270/","vod_name":"萌探探探案 第三季","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-4/b91c30347eaaccafc6d6146d4209e166.jpg","vod_remarks":"更新至第20230604期"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/913/","vod_name":"极限挑战第九季","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-1/51aa3237625e9aaecf81c9b831da71a7.jpg","vod_remarks":"更新至第20230604期"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/3989/","vod_name":"了不起!舞社 第二季","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-4/5064903cc0e31d93b014bac51b26d32c.jpg","vod_remarks":"更新至20230528期"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/3438/","vod_name":"从农场到餐桌","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-4/35cfdb0d25df02b25115722b4326ebc9.jpg","vod_remarks":"更新至2023-5-28期"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/11/","vod_name":"大医本草堂","vod_pic":"http://inews.gtimg.com/newsapp_ls/0/15793594471/0","vod_remarks":"更新至2023-5-29期"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/4/","vod_name":"养生堂","vod_pic":"http://inews.gtimg.com/newsapp_ls/0/15793594364/0","vod_remarks":"更新至2023-5-29期"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/1735/","vod_name":"男生女生向前冲第十五季","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-2/bbc304bdf9754394ec6722123f60b1d9.jpg","vod_remarks":"更新至2023-5-29期"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/1521/","vod_name":"男生女生向前冲 2023","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-2/1b6ef67693fdbe46d0db8aed8d533637.jpg","vod_remarks":"更新至20230529期"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/1416/","vod_name":"第三调解室","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-2/f7dde69d130a5b4148e3cf21021c56ab.jpg","vod_remarks":"更新至2023-5-29期"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/88371/","vod_name":"声生不息·宝岛季舞台纯享版","vod_pic":"http://img.8kvod.com/upload/vod/20230513-1/c198d86d1847ed1578238e05b412c1d3.jpg","vod_remarks":"更新至2023-05-27期期"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/11435/","vod_name":"声生不息·宝岛季一镜到底版","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-12/461d886dcac3665019c1dc4369d3560a.jpg","vod_remarks":"更新至2023-05-27期期"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/88432/","vod_name":"赘婿动画版","vod_pic":"http://img.8kvod.com/upload/vod/20230514-1/7ca03a85b5ac0c7feb693c8f17291ca6.jpg","vod_remarks":"更新至第08集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/5736/","vod_name":"斗破苍穹年番","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-6/ac649dc7b41cd81f31145ba6a64b437b.jpg","vod_remarks":"更新至第47集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/3490/","vod_name":"仙武传","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-4/8593fe69d0ba032fe935f404d04ca43a.jpg","vod_remarks":"更新至第13集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/2800/","vod_name":"武神主宰","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-3/8bd90345c4e1e4c5dce6f57652380897.jpg","vod_remarks":"更新至第338集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/2637/","vod_name":"防御全开","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-3/0cb8c2785cf930d14d3dd92a6a3bd3e1.jpg","vod_remarks":"更新至第49集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/2213/","vod_name":"青莲剑仙传","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-3/2a6e5cc2d3d117c0647fb63b5df23533.jpg","vod_remarks":"更新至第16集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/2208/","vod_name":"绝世武魂","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-3/8442924eda61c2b92b4402bf0850ac48.jpg","vod_remarks":"更新至第276集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/88479/","vod_name":"区区不才,在下野怪","vod_pic":"http://img.8kvod.com/upload/vod/20230514-1/fdc8b80857a02ed5f3afa43ae416ee14.jpg","vod_remarks":"更新至第09集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/1039/","vod_name":"假面骑士极狐","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-2/03da8aa73c31f03be655eaf210ea155a.jpg","vod_remarks":"更新至第38集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/88606/","vod_name":"我与机器妹","vod_pic":"http://img.8kvod.com/upload/vod/20230515-1/6cd9281769d5022ae0d9a4ba8e22bd08.jpg","vod_remarks":"更新至第26集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/88603/","vod_name":"我家的英雄","vod_pic":"http://img.8kvod.com/upload/vod/20230515-1/3c8e59f67fc866c15c509db98e0f2a52.jpg","vod_remarks":"更新至第10集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/27132/","vod_name":"航海王","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-27/aa7403fdefa5b597712497ef24eb9dd0.jpeg","vod_remarks":"全剧集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/271/","vod_name":"我独自崛起","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-1/271e1e83c1feb8dd5588278246c17324.jpg","vod_remarks":"更新至40集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/89565/","vod_name":"今天地球爆炸了吗动态漫画","vod_pic":"http://img.8kvod.com/upload/vod/20230520-1/7b9a99a612d25fee1a994c04e48ebc98.jpg","vod_remarks":"更新至5集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/89562/","vod_name":"我送快递有神豪奖励动态漫画","vod_pic":"http://img.8kvod.com/upload/vod/20230520-1/fede2bb3857aa4f0cdf053f6247a34ef.jpg","vod_remarks":"更新至4集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/4122/","vod_name":"镇国神婿动态漫画","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-5/ced59826e1df311c27f1abc5f81e3d89.jpg","vod_remarks":"更新至9集"}],"no_use":{"code":1,"limit":6,"msg":"数据列表","now_count":72,"page":1,"pagecount":12,"total":72}} +``` +参数名 | 示例值 | 参数类型 | 参数描述 +--- | --- | --- | --- +class | - | Array | +class.type_id | 6 | String | +class.type_name | 动作片 | String | +list | - | Array | +list.no_use | - | Object | +list.no_use.type_id | 1 | Integer | +list.no_use.type_name | 首页推荐 | String | +list.no_use.vod_content | - | String | +list.vod_id | http://www.8kvod.com/k/1824/ | String | +list.vod_name | 乘风 2023 | String | +list.vod_pic | http://47.119.122.235:99/vod-8kvod-230512/20230512-2/42d41bdefba7994f9fb241da89c7da1b.jpg | String | +list.vod_remarks | 更新至第20230604期 | String | +no_use | - | Object | +no_use.code | 1 | Integer | +no_use.limit | 6 | Integer | +no_use.msg | 数据列表 | String | +no_use.now_count | 72 | Integer | +no_use.page | 1 | Integer | +no_use.pagecount | 12 | Integer | +no_use.total | 72 | Integer | +## /cms接口/主页接口-新支持api和ext参数 +```text +api和ext联合等同于rule效果 +rule相当于api是内置服务器里的drpy2.js,ext就是 rule=的值对应的服务器内置的js文件 +``` +#### 接口状态 +> 开发中 + +#### 接口URL +> /vod?pwd=daozhangyyds&api=/libs/drpy2.min.js&ext=/js/8K影视.js + +#### 请求方式 +> GET + +#### Content-Type +> form-data + +#### 请求Query参数 +参数名 | 示例值 | 参数类型 | 是否必填 | 参数描述 +--- | --- | --- | --- | --- +pwd | daozhangyyds | String | 是 | 接口密码 +api | /libs/drpy2.min.js | String | 是 | - +ext | /js/8K影视.js | String | 是 | - +#### 认证方式 +```text +noauth +``` +#### 预执行脚本 +```javascript +暂无预执行脚本 +``` +#### 后执行脚本 +```javascript +暂无后执行脚本 +``` +#### 成功响应示例 +```javascript +{"class":[{"type_id":"6","type_name":"动作片"},{"type_id":"7","type_name":"喜剧片"},{"type_id":"8","type_name":"爱情片"},{"type_id":"9","type_name":"科幻片"},{"type_id":"10","type_name":"恐怖片"},{"type_id":"11","type_name":"剧情片"},{"type_id":"12","type_name":"战争片"},{"type_id":"48","type_name":"惊悚片"},{"type_id":"49","type_name":"犯罪片"},{"type_id":"50","type_name":"冒险片"},{"type_id":"51","type_name":"悬疑片"},{"type_id":"52","type_name":"奇幻片"},{"type_id":"28","type_name":"纪录片"},{"type_id":"29","type_name":"动画片"},{"type_id":"31","type_name":"其他片"},{"type_id":"13","type_name":"国产剧"},{"type_id":"14","type_name":"港台剧"},{"type_id":"15","type_name":"日韩剧"},{"type_id":"16","type_name":"欧美剧"},{"type_id":"20","type_name":"海外剧"},{"type_id":"21","type_name":"大陆综艺"},{"type_id":"22","type_name":"港台综艺"},{"type_id":"23","type_name":"国外综艺"},{"type_id":"39","type_name":"歌曲MV"},{"type_id":"24","type_name":"国产动漫"},{"type_id":"25","type_name":"日本动漫"},{"type_id":"26","type_name":"欧美动漫"},{"type_id":"27","type_name":"其他动漫"},{"type_id":"53","type_name":"足球"},{"type_id":"54","type_name":"篮球"},{"type_id":"55","type_name":"网球"}],"list":[{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/1824/","vod_name":"乘风 2023","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-2/42d41bdefba7994f9fb241da89c7da1b.jpg","vod_remarks":"更新至第20230604期"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/92262/","vod_name":"妻子的新世界","vod_pic":"http://img.8kvod.com/upload/vod/20230524-1/6cc55a3db42827c584ccd6d4bcef12f8.jpg","vod_remarks":"已完结"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/4200/","vod_name":"斗罗大陆","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-5/ce539c364f0ff7fc456caab30708035e.jpg","vod_remarks":"更新至第262集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121172/","vod_name":"龙马精神","vod_pic":"http://img.8kvod.com/upload/vod/20230601-1/3a64c51c9a30b10cd05d3582ef4b3c73.jpg","vod_remarks":"蓝光"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/88010/","vod_name":"凡人修仙传重制版","vod_pic":"http://img.8kvod.com/upload/vod/20230512-1/31c6f1cc1934edc17b3ec868fe0e7b4e.jpg","vod_remarks":"更新至第19集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/7646/","vod_name":"满江红","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-8/22c0f59f6ed5c6fe343b5335acc69967.jpg","vod_remarks":"完结"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/116239/","vod_name":"毒舌律师","vod_pic":"http://47.119.122.235:99/8kvod-img-230525/20230525-24/5b7fa04b0a7e8bc10a91fd5160058886.jpg","vod_remarks":"TC国语"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/88807/","vod_name":"一舞倾城粤语","vod_pic":"http://img.8kvod.com/upload/vod/20230515-1/d59b29ee917a044bde28695f7ae151d1.jpg","vod_remarks":"更新至第15集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121609/","vod_name":"一千灵异夜之护花使者","vod_pic":"http://img.8kvod.com/upload/vod/20230604-1/ad7b31c60884a81f27edbc405aa3729b.jpg","vod_remarks":"HD国语"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/35211/","vod_name":"杨门女将","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-34/66a39d11305f3714757b886a0936f82c.jpg","vod_remarks":"已完结"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121575/","vod_name":"青春大反抗","vod_pic":"http://img.8kvod.com/upload/vod/20230604-1/a9f52d2969dc3e5f72b2b1b796fc67c8.jpg","vod_remarks":"HD中字"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121574/","vod_name":"圣诞狗狗2:圣诞小宝贝","vod_pic":"http://img.8kvod.com/upload/vod/20230604-1/a09aef0019bb47c33c8747bb1b6fd38c.jpg","vod_remarks":"HD中字"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121573/","vod_name":"圣域守护者","vod_pic":"http://img.8kvod.com/upload/vod/20230604-1/2bb440813c234444e6ba36ae06e09984.jpg","vod_remarks":"HD中字"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121566/","vod_name":"怎么又是你","vod_pic":"http://img.8kvod.com/upload/vod/20230604-1/ab1573e6a030ffe869b8de134a6ef33f.jpg","vod_remarks":"HD中字"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121565/","vod_name":"占卜师们","vod_pic":"http://img.8kvod.com/upload/vod/20230604-1/10aa219a60fb7f6da63d1db62bbe7c26.jpg","vod_remarks":"HD中字"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121564/","vod_name":"史前星球 第一季","vod_pic":"http://img.8kvod.com/upload/vod/20230604-1/f081d0f8bd85066ed1452dc639cebb9e.jpg","vod_remarks":"已完结"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121536/","vod_name":"摇滚斗阵","vod_pic":"http://img.8kvod.com/upload/vod/20230604-1/fb50f0cd70d058cfc1e91d91a9e660d5.jpg","vod_remarks":"HD中字"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121535/","vod_name":"莫欺朋友妻","vod_pic":"http://img.8kvod.com/upload/vod/20230604-1/49607c0bd9f6f1fd94b3b1dcae78cdc4.jpg","vod_remarks":"HD中字"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121534/","vod_name":"偶滴神啊","vod_pic":"http://img.8kvod.com/upload/vod/20230604-1/02f7fa9d8a37f5877c5baab839c3a4a4.jpg","vod_remarks":"HD中字"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121532/","vod_name":"乒乓特种兵","vod_pic":"http://img.8kvod.com/upload/vod/20230604-1/0f33792eef0b2cc2bf1c7addcec5da2b.jpg","vod_remarks":"HD中字"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/71346/","vod_name":"航海王:狂热行动","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-69/a44974a0f1fb14d9883194d187d79805.jpg","vod_remarks":"HD中字"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/33638/","vod_name":"新邻里联防","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-33/f1481829cc480d134eeda0315ba2adba.jpg","vod_remarks":"HD中字"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/1837/","vod_name":"政坛混战","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-2/8dfcc86b09ffe8b35957d5f5d5760a55.jpg","vod_remarks":"HD中字"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121626/","vod_name":"萤之光电影版","vod_pic":"http://img.8kvod.com/upload/vod/20230605-1/917968972190c9d2c1b660ab16965c9b.jpg","vod_remarks":"HD中字"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121228/","vod_name":"危情关系","vod_pic":"http://img.8kvod.com/upload/vod/20230602-1/19e36654c929ca3544dd0bd333b6b023.jpg","vod_remarks":"更新至第12集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/120937/","vod_name":"家有蛇仙美貌妻","vod_pic":"http://img.8kvod.com/upload/vod/20230531-1/41113e9c72ce7be1f91c55a2aac19fe9.jpg","vod_remarks":"更新至第12集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/120794/","vod_name":"我的医妃不好惹3","vod_pic":"http://img.8kvod.com/upload/vod/20230530-1/d99d21b31d30759e8aa0402c2a2dd6e0.jpg","vod_remarks":"更新至第16集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/120110/","vod_name":"是!老板","vod_pic":"http://img.8kvod.com/upload/vod/20230527-1/67f71fb1b91e5e391893c5b439644101.jpg","vod_remarks":"已完结"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/119361/","vod_name":"不止是合租的关系","vod_pic":"http://img.8kvod.com/upload/vod/20230526-1/6683156c78bf54c20b5cc58b317dc030.jpg","vod_remarks":"更新至第23集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/119309/","vod_name":"锁爱三生","vod_pic":"http://img.8kvod.com/upload/vod/20230526-1/d9177a235a90e3566ad544ea0f0c3267.jpg","vod_remarks":"更新至第22集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/91937/","vod_name":"张震讲故事","vod_pic":"http://img.8kvod.com/upload/vod/20230524-1/66246c253538fa6e0aaa786664e59634.jpg","vod_remarks":"更新至第16集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121379/","vod_name":"爱情,开袋即食","vod_pic":"http://img.8kvod.com/upload/vod/20230603-1/fa123fea51f30ed5b34d5e4b00f41c8f.jpg","vod_remarks":"更新至第10集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/120820/","vod_name":"香蕉先生不睡觉","vod_pic":"http://img.8kvod.com/upload/vod/20230530-1/4b2bbc24f718da3adf213ab63f2138e4.jpg","vod_remarks":"更新至第13集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121315/","vod_name":"照亮你","vod_pic":"http://img.8kvod.com/upload/vod/20230602-1/71a65e54860b678a4fc001b2fe51fa53.jpg","vod_remarks":"更新至第08集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121152/","vod_name":"梦中的那片海","vod_pic":"http://img.8kvod.com/upload/vod/20230601-1/4f01c27960cf2f77d9aa7ab684779bd7.jpg","vod_remarks":"更新至第10集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121140/","vod_name":"花戎","vod_pic":"http://img.8kvod.com/upload/vod/20230601-1/0d8e19c7d9c62cd4cd7b8851d5760988.jpg","vod_remarks":"更新至第12集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121030/","vod_name":"白色城堡","vod_pic":"http://img.8kvod.com/upload/vod/20230531-1/e890baaac1b918888212a23da729407f.jpg","vod_remarks":"更新至第12集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/88585/","vod_name":"后浪","vod_pic":"http://img.8kvod.com/upload/vod/20230514-1/c509308ed3b9c3584653cc0b6237043e.jpg","vod_remarks":"更新至第38集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/121619/","vod_name":"乔·皮克特 第二季","vod_pic":"http://img.8kvod.com/upload/vod/20230604-1/12739f4c45453534cb88cbf2e6679590.jpg","vod_remarks":"更新至第02集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/120111/","vod_name":"公诉","vod_pic":"http://img.8kvod.com/upload/vod/20230527-1/00b9e3376b527fa3e3af83a7a14aa63f.jpg","vod_remarks":"更新至第12集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/3390/","vod_name":"中国说唱巅峰对决 2023","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-4/0cead7bea71b6f9139915482ca3f9884.jpg","vod_remarks":"更新至第20230604期"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/3362/","vod_name":"向往的生活 第七季","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-4/66fed01c9761aa8ac1ba5523fa3b525d.jpg","vod_remarks":"更新至第20230604期"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/3016/","vod_name":"五十公里桃花坞 第三季","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-3/88aa3f4c96c1e07983115fb91a03d3c7.jpg","vod_remarks":"更新至第20230604期"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/1824/","vod_name":"乘风 2023","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-2/42d41bdefba7994f9fb241da89c7da1b.jpg","vod_remarks":"更新至第20230604期"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/1320/","vod_name":"种地吧","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-2/8d62ebe71fc9ebafdd6dc05c115af025.jpg","vod_remarks":"更新至第34期"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/3270/","vod_name":"萌探探探案 第三季","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-4/b91c30347eaaccafc6d6146d4209e166.jpg","vod_remarks":"更新至第20230604期"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/913/","vod_name":"极限挑战第九季","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-1/51aa3237625e9aaecf81c9b831da71a7.jpg","vod_remarks":"更新至第20230604期"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/3989/","vod_name":"了不起!舞社 第二季","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-4/5064903cc0e31d93b014bac51b26d32c.jpg","vod_remarks":"更新至20230528期"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/3438/","vod_name":"从农场到餐桌","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-4/35cfdb0d25df02b25115722b4326ebc9.jpg","vod_remarks":"更新至2023-5-28期"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/11/","vod_name":"大医本草堂","vod_pic":"http://inews.gtimg.com/newsapp_ls/0/15793594471/0","vod_remarks":"更新至2023-5-29期"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/4/","vod_name":"养生堂","vod_pic":"http://inews.gtimg.com/newsapp_ls/0/15793594364/0","vod_remarks":"更新至2023-5-29期"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/1735/","vod_name":"男生女生向前冲第十五季","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-2/bbc304bdf9754394ec6722123f60b1d9.jpg","vod_remarks":"更新至2023-5-29期"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/1521/","vod_name":"男生女生向前冲 2023","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-2/1b6ef67693fdbe46d0db8aed8d533637.jpg","vod_remarks":"更新至20230529期"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/1416/","vod_name":"第三调解室","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-2/f7dde69d130a5b4148e3cf21021c56ab.jpg","vod_remarks":"更新至2023-5-29期"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/88371/","vod_name":"声生不息·宝岛季舞台纯享版","vod_pic":"http://img.8kvod.com/upload/vod/20230513-1/c198d86d1847ed1578238e05b412c1d3.jpg","vod_remarks":"更新至2023-05-27期期"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/11435/","vod_name":"声生不息·宝岛季一镜到底版","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-12/461d886dcac3665019c1dc4369d3560a.jpg","vod_remarks":"更新至2023-05-27期期"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/88432/","vod_name":"赘婿动画版","vod_pic":"http://img.8kvod.com/upload/vod/20230514-1/7ca03a85b5ac0c7feb693c8f17291ca6.jpg","vod_remarks":"更新至第08集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/5736/","vod_name":"斗破苍穹年番","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-6/ac649dc7b41cd81f31145ba6a64b437b.jpg","vod_remarks":"更新至第47集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/3490/","vod_name":"仙武传","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-4/8593fe69d0ba032fe935f404d04ca43a.jpg","vod_remarks":"更新至第13集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/2800/","vod_name":"武神主宰","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-3/8bd90345c4e1e4c5dce6f57652380897.jpg","vod_remarks":"更新至第338集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/2637/","vod_name":"防御全开","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-3/0cb8c2785cf930d14d3dd92a6a3bd3e1.jpg","vod_remarks":"更新至第49集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/2213/","vod_name":"青莲剑仙传","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-3/2a6e5cc2d3d117c0647fb63b5df23533.jpg","vod_remarks":"更新至第16集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/2208/","vod_name":"绝世武魂","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-3/8442924eda61c2b92b4402bf0850ac48.jpg","vod_remarks":"更新至第276集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/88479/","vod_name":"区区不才,在下野怪","vod_pic":"http://img.8kvod.com/upload/vod/20230514-1/fdc8b80857a02ed5f3afa43ae416ee14.jpg","vod_remarks":"更新至第09集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/1039/","vod_name":"假面骑士极狐","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-2/03da8aa73c31f03be655eaf210ea155a.jpg","vod_remarks":"更新至第38集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/88606/","vod_name":"我与机器妹","vod_pic":"http://img.8kvod.com/upload/vod/20230515-1/6cd9281769d5022ae0d9a4ba8e22bd08.jpg","vod_remarks":"更新至第26集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/88603/","vod_name":"我家的英雄","vod_pic":"http://img.8kvod.com/upload/vod/20230515-1/3c8e59f67fc866c15c509db98e0f2a52.jpg","vod_remarks":"更新至第10集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/27132/","vod_name":"航海王","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-27/aa7403fdefa5b597712497ef24eb9dd0.jpeg","vod_remarks":"全剧集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/271/","vod_name":"我独自崛起","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-1/271e1e83c1feb8dd5588278246c17324.jpg","vod_remarks":"更新至40集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/89565/","vod_name":"今天地球爆炸了吗动态漫画","vod_pic":"http://img.8kvod.com/upload/vod/20230520-1/7b9a99a612d25fee1a994c04e48ebc98.jpg","vod_remarks":"更新至5集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/89562/","vod_name":"我送快递有神豪奖励动态漫画","vod_pic":"http://img.8kvod.com/upload/vod/20230520-1/fede2bb3857aa4f0cdf053f6247a34ef.jpg","vod_remarks":"更新至4集"},{"no_use":{"type_id":1,"type_name":"首页推荐","vod_content":""},"vod_id":"http://www.8kvod.com/k/4122/","vod_name":"镇国神婿动态漫画","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-5/ced59826e1df311c27f1abc5f81e3d89.jpg","vod_remarks":"更新至9集"}],"no_use":{"code":1,"limit":6,"msg":"数据列表","now_count":72,"page":1,"pagecount":12,"total":72}} +``` +参数名 | 示例值 | 参数类型 | 参数描述 +--- | --- | --- | --- +class | - | Array | +class.type_id | 6 | String | +class.type_name | 动作片 | String | +list | - | Array | +list.no_use | - | Object | +list.no_use.type_id | 1 | Integer | +list.no_use.type_name | 首页推荐 | String | +list.no_use.vod_content | - | String | +list.vod_id | http://www.8kvod.com/k/1824/ | String | +list.vod_name | 乘风 2023 | String | +list.vod_pic | http://47.119.122.235:99/vod-8kvod-230512/20230512-2/42d41bdefba7994f9fb241da89c7da1b.jpg | String | +list.vod_remarks | 更新至第20230604期 | String | +no_use | - | Object | +no_use.code | 1 | Integer | +no_use.limit | 6 | Integer | +no_use.msg | 数据列表 | String | +no_use.now_count | 72 | Integer | +no_use.page | 1 | Integer | +no_use.pagecount | 12 | Integer | +no_use.total | 72 | Integer | +## /cms接口/一级分类页接口 +```text +暂无描述 +``` +#### 接口状态 +> 开发中 + +#### 接口URL +> /vod?pwd=daozhangyyds&rule=007影视&t=1&pg=1&ac=videolist&f={"class":"动作","area":"香港"} + +#### 请求方式 +> GET + +#### Content-Type +> form-data + +#### 请求Query参数 +参数名 | 示例值 | 参数类型 | 是否必填 | 参数描述 +--- | --- | --- | --- | --- +pwd | daozhangyyds | String | 是 | 接口密码 +rule | 007影视 | String | 是 | 接口指定内置服务端本地的js源名称 +t | 1 | String | 是 | 指定分类ID +pg | 1 | String | 是 | 指定页数 +ac | videolist | String | 是 | ac=list指定为分类列表数据 +f | {"class":"动作","area":"香港"} | String | 是 | 筛选参数 +#### 路径变量 +参数名 | 示例值 | 参数描述 +--- | --- | --- +"class":"动作","area":"香港" | - | - +#### 认证方式 +```text +noauth +``` +#### 预执行脚本 +```javascript +暂无预执行脚本 +``` +#### 后执行脚本 +```javascript +暂无后执行脚本 +``` +#### 成功响应示例 +```javascript +{"limit":40,"list":[{"vod_content":"","vod_id":"1$/detail/186407.html","vod_name":"黄飞鸿之鬼脚七","vod_pic":"https://img9.doubanio.com/view/photo/m/public/p2681919694.jpeg","vod_remarks":"HD"},{"vod_content":"","vod_id":"1$/detail/145877.html","vod_name":"反贪风暴5:最终章","vod_pic":"https://pic.rmb.bdstatic.com/bjh/user/d4c7173ea8b22ae37a1684d0a29a85b4.jpeg","vod_remarks":"BD高清"},{"vod_content":"","vod_id":"1$/detail/185846.html","vod_name":"鬼侠","vod_pic":"https://img2.doubanio.com/view/photo/m/public/p2324528903.jpeg","vod_remarks":"DVD"},{"vod_content":"","vod_id":"1$/detail/185845.html","vod_name":"英雄重英雄","vod_pic":"https://img1.doubanio.com/view/photo/m/public/p2616204658.jpeg","vod_remarks":"HD"},{"vod_content":"","vod_id":"1$/detail/185834.html","vod_name":"黄飞鸿虎鹤斗五狼","vod_pic":"https://img9.doubanio.com/view/photo/m/public/p2629062405.jpeg","vod_remarks":"HD"},{"vod_content":"","vod_id":"1$/detail/185815.html","vod_name":"盲拳怪招","vod_pic":"https://img2.doubanio.com/view/photo/m/public/p2456354381.jpeg","vod_remarks":"DVD"},{"vod_content":"","vod_id":"1$/detail/185813.html","vod_name":"女黑侠威震地狱门","vod_pic":"https://img2.doubanio.com/view/photo/m/public/p2335014723.jpeg","vod_remarks":"HD"},{"vod_content":"","vod_id":"1$/detail/185804.html","vod_name":"少林与武当","vod_pic":"https://img9.doubanio.com/view/photo/m/public/p2345513445.jpeg","vod_remarks":"DVD"},{"vod_content":"","vod_id":"1$/detail/19412.html","vod_name":"战神传说","vod_pic":"https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2350666192.jpeg","vod_remarks":"BD高清"},{"vod_content":"","vod_id":"1$/detail/185728.html","vod_name":"哪吒大闹天宫","vod_pic":"https://img9.doubanio.com/view/photo/m/public/p2338241286.jpeg","vod_remarks":"HD国语"},{"vod_content":"","vod_id":"1$/detail/183637.html","vod_name":"龙凤贼捉贼","vod_pic":"https://img1.doubanio.com/view/photo/m/public/p1553385967.jpeg","vod_remarks":"BD高清"},{"vod_content":"","vod_id":"1$/detail/185517.html","vod_name":"白玫瑰","vod_pic":"https://img1.doubanio.com/view/photo/m/public/p2509533450.jpeg","vod_remarks":"HD国语"}],"page":1,"pagecount":9999,"total":9999} +``` +参数名 | 示例值 | 参数类型 | 参数描述 +--- | --- | --- | --- +limit | 40 | Integer | +list | - | Array | +list.vod_content | - | String | +list.vod_id | 1$/detail/186407.html | String | +list.vod_name | 黄飞鸿之鬼脚七 | String | +list.vod_pic | https://img9.doubanio.com/view/photo/m/public/p2681919694.jpeg | String | +list.vod_remarks | HD | String | +page | 1 | Integer | +pagecount | 9999 | Integer | +total | 9999 | Integer | +## /cms接口/二级详情页接口 +```text +暂无描述 +``` +#### 接口状态 +> 开发中 + +#### 接口URL +> /vod?pwd=daozhangyyds&rule=8K影视&ids=http://www.8kvod.com/k/121513/&ac=detail + +#### 请求方式 +> GET + +#### Content-Type +> form-data + +#### 请求Query参数 +参数名 | 示例值 | 参数类型 | 是否必填 | 参数描述 +--- | --- | --- | --- | --- +pwd | daozhangyyds | String | 是 | 接口密码 +rule | 8K影视 | String | 是 | 接口指定内置服务端本地的js源名称 +ids | http://www.8kvod.com/k/121513/ | String | 是 | 二级资源详情ID,来自一级的vod_id +ac | detail | String | 是 | 必填detail,指定后为二级详情页 +#### 认证方式 +```text +noauth +``` +#### 预执行脚本 +```javascript +暂无预执行脚本 +``` +#### 后执行脚本 +```javascript +暂无后执行脚本 +``` +#### 成功响应示例 +```javascript +{"list":[{"type_name":"剧情片美国2012","vod_actor":"贝拉·索恩 斯戴芬妮·斯考特 尼克·罗宾森 Mar","vod_area":"","vod_content":"杰克是一名成绩优异的优等生,养了一只忠心耿耿的小狗穆瑞。期末考试临近了,女生...详情","vod_director":"戴斯·冯·施勒·梅耶","vod_id":"http://www.8kvod.com/k/121513/","vod_name":"友情大作战","vod_pic":"http://img.8kvod.com/upload/vod/20230604-1/1ca7de40c5159d34ac971d58769faeda.jpg","vod_play_from":"非凡","vod_play_url":"HD中字$http://www.8kvod.com/p/121513-1-1/","vod_remarks":"评分:2.0很差","vod_year":""}]} +``` +参数名 | 示例值 | 参数类型 | 参数描述 +--- | --- | --- | --- +list | - | Array | +list.type_name | 剧情片美国2012 | String | +list.vod_actor | 贝拉·索恩 斯戴芬妮·斯考特 尼克·罗宾森 Mar | String | +list.vod_area | - | String | +list.vod_content | 杰克是一名成绩优异的优等生,养了一只忠心耿耿的小狗穆瑞。期末考试临近了,女生...详情 | String | +list.vod_director | 戴斯·冯·施勒·梅耶 | String | +list.vod_id | http://www.8kvod.com/k/121513/ | String | +list.vod_name | 友情大作战 | String | +list.vod_pic | http://img.8kvod.com/upload/vod/20230604-1/1ca7de40c5159d34ac971d58769faeda.jpg | String | +list.vod_play_from | 非凡 | String | +list.vod_play_url | HD中字$http://www.8kvod.com/p/121513-1-1/ | String | +list.vod_remarks | 评分:2.0很差 | String | +list.vod_year | - | String | +## /cms接口/搜索接口 +```text +暂无描述 +``` +#### 接口状态 +> 开发中 + +#### 接口URL +> /vod?pwd=daozhangyyds&rule=8K影视&wd=斗罗大陆 + +#### 请求方式 +> GET + +#### Content-Type +> form-data + +#### 请求Query参数 +参数名 | 示例值 | 参数类型 | 是否必填 | 参数描述 +--- | --- | --- | --- | --- +pwd | daozhangyyds | String | 是 | 接口密码 +rule | 8K影视 | String | 是 | 接口指定内置服务端本地的js源名称 +wd | 斗罗大陆 | String | 是 | 搜索关键词,如斗罗大陆 +#### 认证方式 +```text +noauth +``` +#### 预执行脚本 +```javascript +暂无预执行脚本 +``` +#### 后执行脚本 +```javascript +暂无后执行脚本 +``` +#### 成功响应示例 +```javascript +{"list":[{"vod_content":"简介:","vod_id":"http://www.8kvod.com/k/4200/","vod_name":"斗罗大陆","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-5/ce539c364f0ff7fc456caab30708035e.jpg","vod_remarks":"导演:"},{"vod_content":"简介:","vod_id":"http://www.8kvod.com/k/88866/","vod_name":"斗罗大陆2绝世唐门 第五季","vod_pic":"http://img.8kvod.com/upload/vod/20230516-1/54ddb7170bbfc802ebcc688545db6623.jpg","vod_remarks":"导演:"},{"vod_content":"简介:","vod_id":"http://www.8kvod.com/k/69/","vod_name":"斗罗大陆4终极斗罗动态漫画","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-1/684b388befa53b448b8441d19fe62b08.jpg","vod_remarks":"导演:"},{"vod_content":"简介:","vod_id":"http://www.8kvod.com/k/5062/","vod_name":"斗罗大陆2绝世唐门 第五季动态漫画","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-5/6f6d1999a8f9f8ac593ee1c1af3756d8.jpg","vod_remarks":"导演:"},{"vod_content":"简介:","vod_id":"http://www.8kvod.com/k/87889/","vod_name":"斗罗大陆2绝世唐门动态漫画 第五季","vod_pic":"http://img.8kvod.com/upload/vod/20230512-1/b2098f1825b6423a55a9383fadd7ae75.jpg","vod_remarks":"导演:"},{"vod_content":"简介:","vod_id":"http://www.8kvod.com/k/5012/","vod_name":"斗罗大陆4终极斗罗 动态漫画","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-5/3c537753b2a77a68f6c3813a7b4873c8.jpg","vod_remarks":"导演:"},{"vod_content":"简介:","vod_id":"http://www.8kvod.com/k/88694/","vod_name":"斗罗大陆4终极斗罗·动态漫","vod_pic":"http://img.8kvod.com/upload/vod/20230515-1/e6c3bda22b218fa23c6edcfd69a84690.jpg","vod_remarks":"导演:"},{"vod_content":"简介:","vod_id":"http://www.8kvod.com/k/91537/","vod_name":"动态漫画·斗罗大陆4终极斗罗","vod_pic":"http://img.8kvod.com/upload/vod/20230522-1/4b65db414944d6a14167c91124591268.jpg","vod_remarks":"导演:"},{"vod_content":"简介:","vod_id":"http://www.8kvod.com/k/47736/","vod_name":"斗罗大陆","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-46/4350a2e77e63266419d34e7308846bbc.jpeg","vod_remarks":"导演:"},{"vod_content":"简介:","vod_id":"http://www.8kvod.com/k/145/","vod_name":"碟仙诡谭","vod_pic":"http://47.119.122.235:99/vod-8kvod-230512/20230512-1/d748e39f0079b8fffdde4c337c48f726.jpg","vod_remarks":"导演:"}]} +``` +参数名 | 示例值 | 参数类型 | 参数描述 +--- | --- | --- | --- +list | - | Array | +list.vod_content | 简介: | String | +list.vod_id | http://www.8kvod.com/k/4200/ | String | +list.vod_name | 斗罗大陆 | String | +list.vod_pic | http://47.119.122.235:99/vod-8kvod-230512/20230512-5/ce539c364f0ff7fc456caab30708035e.jpg | String | +list.vod_remarks | 导演: | String | +## /cms接口/免嗅探播放接口 +```text +返回免嗅探解析后的结果,可以是json格式的数据,也可以是302重定向后的m3u8等直链。 +``` +#### 接口状态 +> 开发中 + +#### 接口URL +> /vod?pwd=daozhangyyds&rule=8K影视&play_url=http://www.8kvod.com/p/121172-1-2/ + +#### 请求方式 +> GET + +#### Content-Type +> form-data + +#### 请求Query参数 +参数名 | 示例值 | 参数类型 | 是否必填 | 参数描述 +--- | --- | --- | --- | --- +pwd | daozhangyyds | String | 是 | 接口密码 +rule | 8K影视 | String | 是 | 接口指定内置服务端本地的js源名称 +play_url | http://www.8kvod.com/p/121172-1-2/ | String | 是 | 待播放的vod_id +#### 认证方式 +```text +noauth +``` +#### 预执行脚本 +```javascript +暂无预执行脚本 +``` +#### 后执行脚本 +```javascript +暂无后执行脚本 +``` +#### 成功响应示例 +```javascript +#EXTM3U +#EXT-X-VERSION:3 +#EXT-X-PLAYLIST-TYPE:VOD +#EXT-X-MEDIA-SEQUENCE:0 +#EXT-X-TARGETDURATION:8 +#EXT-X-DISCONTINUITY +#EXTINF:4.640000, +0000000.ts +#EXTINF:4.000000, +0000001.ts +#EXTINF:4.000000, +0000002.ts +#EXTINF:4.000000, +0000003.ts +#EXTINF:3.280000, +0000004.ts +#EXTINF:4.000000, +0000005.ts +#EXTINF:6.240000, +0000006.ts +#EXTINF:4.000000, +0000007.ts +#EXTINF:4.000000, +0000008.ts +#EXTINF:4.000000, +0000009.ts +#EXTINF:4.000000, +0000010.ts +#EXTINF:4.000000, +0000011.ts +#EXTINF:4.000000, +0000012.ts +#EXTINF:4.000000, +0000013.ts +#EXTINF:4.000000, +0000014.ts +#EXTINF:4.000000, +0000015.ts +#EXTINF:4.000000, +0000016.ts +#EXTINF:4.000000, +0000017.ts +#EXTINF:4.000000, +0000018.ts +#EXTINF:4.000000, +0000019.ts +#EXTINF:4.000000, +0000020.ts +#EXTINF:4.000000, +0000021.ts +#EXTINF:4.000000, +0000022.ts +#EXTINF:4.000000, +0000023.ts +#EXTINF:4.000000, +0000024.ts +#EXTINF:4.000000, +0000025.ts +#EXTINF:3.720000, +0000026.ts +#EXTINF:3.200000, +0000027.ts +#EXTINF:4.000000, +0000028.ts +#EXTINF:4.000000, +0000029.ts +#EXTINF:4.000000, +0000030.ts +#EXTINF:2.880000, +0000031.ts +#EXTINF:4.360000, +0000032.ts +#EXTINF:4.000000, +0000033.ts +#EXTINF:4.000000, +0000034.ts +#EXTINF:4.960000, +0000035.ts +#EXTINF:4.000000, +0000036.ts +#EXTINF:4.000000, +0000037.ts +#EXTINF:3.880000, +0000038.ts +#EXTINF:5.680000, +0000039.ts +#EXTINF:4.000000, +0000040.ts +#EXTINF:4.000000, +0000041.ts +#EXTINF:4.000000, +0000042.ts +#EXTINF:3.040000, +0000043.ts +#EXTINF:4.000000, +0000044.ts +#EXTINF:4.000000, +0000045.ts +#EXTINF:2.080000, +0000046.ts +#EXTINF:4.000000, +0000047.ts +#EXTINF:4.000000, +0000048.ts +#EXTINF:4.000000, +0000049.ts +#EXTINF:6.600000, +0000050.ts +#EXTINF:4.920000, +0000051.ts +#EXTINF:4.000000, +0000052.ts +#EXTINF:3.000000, +0000053.ts +#EXTINF:4.000000, +0000054.ts +#EXTINF:4.000000, +0000055.ts +#EXTINF:4.000000, +0000056.ts +#EXTINF:4.000000, +0000057.ts +#EXTINF:3.320000, +0000058.ts +#EXTINF:4.000000, +0000059.ts +#EXTINF:4.000000, +0000060.ts +#EXTINF:4.800000, +0000061.ts +#EXTINF:4.000000, +0000062.ts +#EXTINF:4.000000, +0000063.ts +#EXTINF:4.000000, +0000064.ts +#EXTINF:4.000000, +0000065.ts +#EXTINF:4.000000, +0000066.ts +#EXTINF:2.000000, +0000067.ts +#EXTINF:4.000000, +0000068.ts +#EXTINF:4.000000, +0000069.ts +#EXTINF:4.000000, +0000070.ts +#EXTINF:4.000000, +0000071.ts +#EXTINF:4.000000, +0000072.ts +#EXTINF:4.000000, +0000073.ts +#EXTINF:4.000000, +0000074.ts +#EXTINF:4.000000, +0000075.ts +#EXTINF:4.000000, +0000076.ts +#EXTINF:5.880000, +0000077.ts +#EXTINF:4.000000, +0000078.ts +#EXTINF:4.000000, +0000079.ts +#EXTINF:3.480000, +0000080.ts +#EXTINF:4.000000, +0000081.ts +#EXTINF:2.200000, +0000082.ts +#EXTINF:4.000000, +0000083.ts +#EXTINF:4.000000, +0000084.ts +#EXTINF:4.000000, +0000085.ts +#EXTINF:7.360000, +0000086.ts +#EXTINF:3.600000, +0000087.ts +#EXTINF:3.320000, +0000088.ts +#EXTINF:4.000000, +0000089.ts +#EXTINF:2.880000, +0000090.ts +#EXTINF:4.000000, +0000091.ts +#EXTINF:3.000000, +0000092.ts +#EXTINF:7.520000, +0000093.ts +#EXTINF:4.000000, +0000094.ts +#EXTINF:4.000000, +0000095.ts +#EXTINF:4.000000, +0000096.ts +#EXTINF:1.960000, +0000097.ts +#EXTINF:4.000000, +0000098.ts +#EXTINF:4.000000, +0000099.ts +#EXTINF:4.000000, +0000100.ts +#EXTINF:4.000000, +0000101.ts +#EXTINF:4.000000, +0000102.ts +#EXTINF:4.000000, +0000103.ts +#EXTINF:4.000000, +0000104.ts +#EXTINF:4.000000, +0000105.ts +#EXTINF:2.200000, +0000106.ts +#EXTINF:4.000000, +0000107.ts +#EXTINF:5.160000, +0000108.ts +#EXTINF:4.000000, +0000109.ts +#EXTINF:4.000000, +0000110.ts +#EXTINF:4.000000, +0000111.ts +#EXTINF:3.360000, +0000112.ts +#EXTINF:4.000000, +0000113.ts +#EXTINF:4.000000, +0000114.ts +#EXTINF:4.000000, +0000115.ts +#EXTINF:4.000000, +0000116.ts +#EXTINF:4.000000, +0000117.ts +#EXTINF:4.000000, +0000118.ts +#EXTINF:6.360000, +0000119.ts +#EXTINF:4.000000, +0000120.ts +#EXTINF:4.000000, +0000121.ts +#EXTINF:4.000000, +0000122.ts +#EXTINF:4.000000, +0000123.ts +#EXTINF:4.000000, +0000124.ts +#EXTINF:4.000000, +0000125.ts +#EXTINF:4.000000, +0000126.ts +#EXTINF:1.320000, +0000127.ts +#EXTINF:4.000000, +0000128.ts +#EXTINF:4.000000, +0000129.ts +#EXTINF:3.760000, +0000130.ts +#EXTINF:4.000000, +0000131.ts +#EXTINF:4.000000, +0000132.ts +#EXTINF:4.000000, +0000133.ts +#EXTINF:3.960000, +0000134.ts +#EXTINF:4.000000, +0000135.ts +#EXTINF:4.000000, +0000136.ts +#EXTINF:6.600000, +0000137.ts +#EXTINF:4.000000, +0000138.ts +#EXTINF:4.000000, +0000139.ts +#EXTINF:4.000000, +0000140.ts +#EXTINF:4.000000, +0000141.ts +#EXTINF:4.000000, +0000142.ts +#EXTINF:4.000000, +0000143.ts +#EXTINF:4.000000, +0000144.ts +#EXTINF:4.000000, +0000145.ts +#EXTINF:4.000000, +0000146.ts +#EXTINF:4.000000, +0000147.ts +#EXTINF:4.000000, +0000148.ts +#EXTINF:4.000000, +0000149.ts +#EXTINF:4.000000, +0000150.ts +#EXTINF:4.000000, +0000151.ts +#EXTINF:4.000000, +0000152.ts +#EXTINF:4.000000, +0000153.ts +#EXTINF:4.000000, +0000154.ts +#EXTINF:4.000000, +0000155.ts +#EXTINF:4.000000, +0000156.ts +#EXTINF:4.000000, +0000157.ts +#EXTINF:3.880000, +0000158.ts +#EXTINF:4.000000, +0000159.ts +#EXTINF:3.960000, +0000160.ts +#EXTINF:4.000000, +0000161.ts +#EXTINF:4.000000, +0000162.ts +#EXTINF:3.800000, +0000163.ts +#EXTINF:2.640000, +0000164.ts +#EXTINF:4.000000, +0000165.ts +#EXTINF:4.000000, +0000166.ts +#EXTINF:4.000000, +0000167.ts +#EXTINF:4.000000, +0000168.ts +#EXTINF:4.000000, +0000169.ts +#EXTINF:4.000000, +0000170.ts +#EXTINF:4.000000, +0000171.ts +#EXTINF:4.000000, +0000172.ts +#EXTINF:4.000000, +0000173.ts +#EXTINF:4.000000, +0000174.ts +#EXTINF:4.000000, +0000175.ts +#EXTINF:4.000000, +0000176.ts +#EXTINF:4.000000, +0000177.ts +#EXTINF:4.000000, +0000178.ts +#EXTINF:4.000000, +0000179.ts +#EXTINF:4.000000, +0000180.ts +#EXTINF:4.000000, +0000181.ts +#EXTINF:4.000000, +0000182.ts +#EXTINF:4.000000, +0000183.ts +#EXTINF:3.240000, +0000184.ts +#EXTINF:4.000000, +0000185.ts +#EXTINF:5.200000, +0000186.ts +#EXTINF:4.000000, +0000187.ts +#EXTINF:4.000000, +0000188.ts +#EXTINF:4.000000, +0000189.ts +#EXTINF:4.000000, +0000190.ts +#EXTINF:4.000000, +0000191.ts +#EXTINF:4.000000, +0000192.ts +#EXTINF:4.000000, +0000193.ts +#EXTINF:4.000000, +0000194.ts +#EXTINF:4.000000, +0000195.ts +#EXTINF:4.000000, +0000196.ts +#EXTINF:4.000000, +0000197.ts +#EXTINF:4.000000, +0000198.ts +#EXTINF:4.000000, +0000199.ts +#EXTINF:3.360000, +0000200.ts +#EXTINF:4.000000, +0000201.ts +#EXTINF:6.960000, +0000202.ts +#EXTINF:1.560000, +0000203.ts +#EXTINF:4.000000, +0000204.ts +#EXTINF:4.000000, +0000205.ts +#EXTINF:4.000000, +0000206.ts +#EXTINF:4.600000, +0000207.ts +#EXTINF:4.000000, +0000208.ts +#EXTINF:4.000000, +0000209.ts +#EXTINF:4.000000, +0000210.ts +#EXTINF:4.000000, +0000211.ts +#EXTINF:2.280000, +0000212.ts +#EXTINF:4.000000, +0000213.ts +#EXTINF:4.920000, +0000214.ts +#EXTINF:4.000000, +0000215.ts +#EXTINF:5.880000, +0000216.ts +#EXTINF:4.640000, +0000217.ts +#EXTINF:4.000000, +0000218.ts +#EXTINF:4.000000, +0000219.ts +#EXTINF:4.000000, +0000220.ts +#EXTINF:4.000000, +0000221.ts +#EXTINF:4.000000, +0000222.ts +#EXTINF:4.000000, +0000223.ts +#EXTINF:3.680000, +0000224.ts +#EXTINF:4.000000, +0000225.ts +#EXTINF:3.280000, +0000226.ts +#EXTINF:4.000000, +0000227.ts +#EXTINF:1.960000, +0000228.ts +#EXTINF:4.000000, +0000229.ts +#EXTINF:4.000000, +0000230.ts +#EXTINF:4.800000, +0000231.ts +#EXTINF:4.000000, +0000232.ts +#EXTINF:4.000000, +0000233.ts +#EXTINF:6.680000, +0000234.ts +#EXTINF:4.000000, +0000235.ts +#EXTINF:2.840000, +0000236.ts +#EXTINF:2.840000, +0000237.ts +#EXTINF:4.000000, +0000238.ts +#EXTINF:5.120000, +0000239.ts +#EXTINF:4.000000, +0000240.ts +#EXTINF:4.000000, +0000241.ts +#EXTINF:4.000000, +0000242.ts +#EXTINF:4.000000, +0000243.ts +#EXTINF:3.240000, +0000244.ts +#EXTINF:4.000000, +0000245.ts +#EXTINF:2.480000, +0000246.ts +#EXTINF:4.000000, +0000247.ts +#EXTINF:6.840000, +0000248.ts +#EXTINF:2.680000, +0000249.ts +#EXTINF:4.000000, +0000250.ts +#EXTINF:4.000000, +0000251.ts +#EXTINF:4.000000, +0000252.ts +#EXTINF:4.000000, +0000253.ts +#EXTINF:4.000000, +0000254.ts +#EXTINF:4.000000, +0000255.ts +#EXTINF:4.000000, +0000256.ts +#EXTINF:4.000000, +0000257.ts +#EXTINF:3.760000, +0000258.ts +#EXTINF:4.000000, +0000259.ts +#EXTINF:4.000000, +0000260.ts +#EXTINF:4.000000, +0000261.ts +#EXTINF:4.000000, +0000262.ts +#EXTINF:4.000000, +0000263.ts +#EXTINF:4.000000, +0000264.ts +#EXTINF:3.360000, +0000265.ts +#EXTINF:4.000000, +0000266.ts +#EXTINF:4.000000, +0000267.ts +#EXTINF:4.000000, +0000268.ts +#EXTINF:4.000000, +0000269.ts +#EXTINF:4.000000, +0000270.ts +#EXTINF:4.000000, +0000271.ts +#EXTINF:4.600000, +0000272.ts +#EXTINF:4.000000, +0000273.ts +#EXTINF:4.000000, +0000274.ts +#EXTINF:4.000000, +0000275.ts +#EXTINF:4.000000, +0000276.ts +#EXTINF:3.880000, +0000277.ts +#EXTINF:4.000000, +0000278.ts +#EXTINF:5.920000, +0000279.ts +#EXTINF:4.000000, +0000280.ts +#EXTINF:4.000000, +0000281.ts +#EXTINF:4.000000, +0000282.ts +#EXTINF:4.000000, +0000283.ts +#EXTINF:4.000000, +0000284.ts +#EXTINF:4.000000, +0000285.ts +#EXTINF:4.000000, +0000286.ts +#EXTINF:4.000000, +0000287.ts +#EXTINF:4.000000, +0000288.ts +#EXTINF:4.000000, +0000289.ts +#EXTINF:4.000000, +0000290.ts +#EXTINF:4.000000, +0000291.ts +#EXTINF:4.000000, +0000292.ts +#EXTINF:0.840000, +0000293.ts +#EXTINF:4.000000, +0000294.ts +#EXTINF:4.000000, +0000295.ts +#EXTINF:4.000000, +0000296.ts +#EXTINF:4.000000, +0000297.ts +#EXTINF:4.000000, +0000298.ts +#EXTINF:4.000000, +0000299.ts +#EXTINF:4.000000, +0000300.ts +#EXTINF:4.200000, +0000301.ts +#EXTINF:4.000000, +0000302.ts +#EXTINF:4.000000, +0000303.ts +#EXTINF:4.000000, +0000304.ts +#EXTINF:4.000000, +0000305.ts +#EXTINF:3.760000, +0000306.ts +#EXTINF:5.200000, +0000307.ts +#EXTINF:4.000000, +0000308.ts +#EXTINF:4.000000, +0000309.ts +#EXTINF:4.000000, +0000310.ts +#EXTINF:2.920000, +0000311.ts +#EXTINF:5.000000, +0000312.ts +#EXTINF:5.640000, +0000313.ts +#EXTINF:4.000000, +0000314.ts +#EXTINF:4.000000, +0000315.ts +#EXTINF:4.000000, +0000316.ts +#EXTINF:4.000000, +0000317.ts +#EXTINF:4.000000, +0000318.ts +#EXTINF:4.000000, +0000319.ts +#EXTINF:3.240000, +0000320.ts +#EXTINF:4.000000, +0000321.ts +#EXTINF:4.000000, +0000322.ts +#EXTINF:4.000000, +0000323.ts +#EXTINF:4.000000, +0000324.ts +#EXTINF:4.000000, +0000325.ts +#EXTINF:4.000000, +0000326.ts +#EXTINF:4.000000, +0000327.ts +#EXTINF:4.000000, +0000328.ts +#EXTINF:4.000000, +0000329.ts +#EXTINF:2.960000, +0000330.ts +#EXTINF:4.000000, +0000331.ts +#EXTINF:4.000000, +0000332.ts +#EXTINF:3.840000, +0000333.ts +#EXTINF:3.120000, +0000334.ts +#EXTINF:6.960000, +0000335.ts +#EXTINF:4.000000, +0000336.ts +#EXTINF:4.000000, +0000337.ts +#EXTINF:4.000000, +0000338.ts +#EXTINF:1.880000, +0000339.ts +#EXTINF:4.000000, +0000340.ts +#EXTINF:4.000000, +0000341.ts +#EXTINF:4.000000, +0000342.ts +#EXTINF:4.000000, +0000343.ts +#EXTINF:4.000000, +0000344.ts +#EXTINF:4.000000, +0000345.ts +#EXTINF:4.000000, +0000346.ts +#EXTINF:4.000000, +0000347.ts +#EXTINF:4.000000, +0000348.ts +#EXTINF:5.720000, +0000349.ts +#EXTINF:3.040000, +0000350.ts +#EXTINF:4.000000, +0000351.ts +#EXTINF:4.000000, +0000352.ts +#EXTINF:4.000000, +0000353.ts +#EXTINF:3.640000, +0000354.ts +#EXTINF:4.720000, +0000355.ts +#EXTINF:4.000000, +0000356.ts +#EXTINF:4.000000, +0000357.ts +#EXTINF:5.240000, +0000358.ts +#EXTINF:4.000000, +0000359.ts +#EXTINF:4.000000, +0000360.ts +#EXTINF:3.560000, +0000361.ts +#EXTINF:3.040000, +0000362.ts +#EXTINF:3.640000, +0000363.ts +#EXTINF:4.000000, +0000364.ts +#EXTINF:4.000000, +0000365.ts +#EXTINF:4.000000, +0000366.ts +#EXTINF:4.000000, +0000367.ts +#EXTINF:4.000000, +0000368.ts +#EXTINF:4.000000, +0000369.ts +#EXTINF:4.000000, +0000370.ts +#EXTINF:5.560000, +0000371.ts +#EXTINF:4.000000, +0000372.ts +#EXTINF:4.000000, +0000373.ts +#EXTINF:4.000000, +0000374.ts +#EXTINF:4.000000, +0000375.ts +#EXTINF:4.000000, +0000376.ts +#EXTINF:4.000000, +0000377.ts +#EXTINF:4.000000, +0000378.ts +#EXTINF:4.000000, +0000379.ts +#EXTINF:4.000000, +0000380.ts +#EXTINF:4.000000, +0000381.ts +#EXTINF:4.000000, +0000382.ts +#EXTINF:4.000000, +0000383.ts +#EXTINF:4.000000, +0000384.ts +#EXTINF:4.000000, +0000385.ts +#EXTINF:4.000000, +0000386.ts +#EXTINF:4.000000, +0000387.ts +#EXTINF:1.160000, +0000388.ts +#EXTINF:4.000000, +0000389.ts +#EXTINF:4.000000, +0000390.ts +#EXTINF:4.000000, +0000391.ts +#EXTINF:4.000000, +0000392.ts +#EXTINF:3.640000, +0000393.ts +#EXTINF:7.720000, +0000394.ts +#EXTINF:4.000000, +0000395.ts +#EXTINF:4.000000, +0000396.ts +#EXTINF:4.000000, +0000397.ts +#EXTINF:4.000000, +0000398.ts +#EXTINF:4.000000, +0000399.ts +#EXTINF:3.400000, +0000400.ts +#EXTINF:4.000000, +0000401.ts +#EXTINF:4.000000, +0000402.ts +#EXTINF:1.280000, +0000403.ts +#EXTINF:3.760000, +0000404.ts +#EXTINF:4.000000, +0000405.ts +#EXTINF:4.000000, +0000406.ts +#EXTINF:4.000000, +0000407.ts +#EXTINF:4.000000, +0000408.ts +#EXTINF:4.640000, +0000409.ts +#EXTINF:4.000000, +0000410.ts +#EXTINF:4.000000, +0000411.ts +#EXTINF:4.000000, +0000412.ts +#EXTINF:5.400000, +0000413.ts +#EXTINF:4.840000, +0000414.ts +#EXTINF:4.600000, +0000415.ts +#EXTINF:3.480000, +0000416.ts +#EXTINF:4.000000, +0000417.ts +#EXTINF:4.000000, +0000418.ts +#EXTINF:4.000000, +0000419.ts +#EXTINF:2.480000, +0000420.ts +#EXTINF:4.000000, +0000421.ts +#EXTINF:4.000000, +0000422.ts +#EXTINF:4.000000, +0000423.ts +#EXTINF:4.000000, +0000424.ts +#EXTINF:4.000000, +0000425.ts +#EXTINF:2.960000, +0000426.ts +#EXTINF:4.000000, +0000427.ts +#EXTINF:4.000000, +0000428.ts +#EXTINF:4.000000, +0000429.ts +#EXTINF:4.000000, +0000430.ts +#EXTINF:4.000000, +0000431.ts +#EXTINF:4.000000, +0000432.ts +#EXTINF:4.000000, +0000433.ts +#EXTINF:6.000000, +0000434.ts +#EXTINF:4.000000, +0000435.ts +#EXTINF:4.000000, +0000436.ts +#EXTINF:4.000000, +0000437.ts +#EXTINF:4.000000, +0000438.ts +#EXTINF:4.000000, +0000439.ts +#EXTINF:4.000000, +0000440.ts +#EXTINF:4.000000, +0000441.ts +#EXTINF:4.000000, +0000442.ts +#EXTINF:1.480000, +0000443.ts +#EXTINF:4.800000, +0000444.ts +#EXTINF:4.000000, +0000445.ts +#EXTINF:4.000000, +0000446.ts +#EXTINF:4.000000, +0000447.ts +#EXTINF:4.000000, +0000448.ts +#EXTINF:4.000000, +0000449.ts +#EXTINF:5.520000, +0000450.ts +#EXTINF:4.000000, +0000451.ts +#EXTINF:2.960000, +0000452.ts +#EXTINF:4.000000, +0000453.ts +#EXTINF:4.000000, +0000454.ts +#EXTINF:4.000000, +0000455.ts +#EXTINF:4.000000, +0000456.ts +#EXTINF:4.000000, +0000457.ts +#EXTINF:3.800000, +0000458.ts +#EXTINF:3.960000, +0000459.ts +#EXTINF:5.880000, +0000460.ts +#EXTINF:3.040000, +0000461.ts +#EXTINF:3.200000, +0000462.ts +#EXTINF:5.960000, +0000463.ts +#EXTINF:3.720000, +0000464.ts +#EXTINF:4.000000, +0000465.ts +#EXTINF:1.640000, +0000466.ts +#EXTINF:4.000000, +0000467.ts +#EXTINF:4.000000, +0000468.ts +#EXTINF:4.000000, +0000469.ts +#EXTINF:4.000000, +0000470.ts +#EXTINF:7.040000, +0000471.ts +#EXTINF:1.280000, +0000472.ts +#EXTINF:4.000000, +0000473.ts +#EXTINF:3.720000, +0000474.ts +#EXTINF:3.440000, +0000475.ts +#EXTINF:7.720000, +0000476.ts +#EXTINF:4.000000, +0000477.ts +#EXTINF:4.000000, +0000478.ts +#EXTINF:4.000000, +0000479.ts +#EXTINF:1.120000, +0000480.ts +#EXTINF:4.000000, +0000481.ts +#EXTINF:4.000000, +0000482.ts +#EXTINF:6.040000, +0000483.ts +#EXTINF:4.000000, +0000484.ts +#EXTINF:4.000000, +0000485.ts +#EXTINF:2.560000, +0000486.ts +#EXTINF:6.120000, +0000487.ts +#EXTINF:4.000000, +0000488.ts +#EXTINF:4.000000, +0000489.ts +#EXTINF:4.000000, +0000490.ts +#EXTINF:4.000000, +0000491.ts +#EXTINF:1.960000, +0000492.ts +#EXTINF:4.000000, +0000493.ts +#EXTINF:3.200000, +0000494.ts +#EXTINF:4.000000, +0000495.ts +#EXTINF:4.000000, +0000496.ts +#EXTINF:4.320000, +0000497.ts +#EXTINF:3.640000, +0000498.ts +#EXTINF:6.320000, +0000499.ts +#EXTINF:2.200000, +0000500.ts +#EXTINF:4.000000, +0000501.ts +#EXTINF:4.000000, +0000502.ts +#EXTINF:4.000000, +0000503.ts +#EXTINF:4.000000, +0000504.ts +#EXTINF:5.600000, +0000505.ts +#EXTINF:3.440000, +0000506.ts +#EXTINF:4.000000, +0000507.ts +#EXTINF:4.000000, +0000508.ts +#EXTINF:4.000000, +0000509.ts +#EXTINF:2.320000, +0000510.ts +#EXTINF:3.920000, +0000511.ts +#EXTINF:3.720000, +0000512.ts +#EXTINF:5.000000, +0000513.ts +#EXTINF:5.000000, +0000514.ts +#EXTINF:4.000000, +0000515.ts +#EXTINF:4.000000, +0000516.ts +#EXTINF:4.000000, +0000517.ts +#EXTINF:4.000000, +0000518.ts +#EXTINF:2.360000, +0000519.ts +#EXTINF:3.720000, +0000520.ts +#EXTINF:4.000000, +0000521.ts +#EXTINF:6.760000, +0000522.ts +#EXTINF:4.000000, +0000523.ts +#EXTINF:4.000000, +0000524.ts +#EXTINF:4.640000, +0000525.ts +#EXTINF:4.000000, +0000526.ts +#EXTINF:3.920000, +0000527.ts +#EXTINF:4.000000, +0000528.ts +#EXTINF:4.000000, +0000529.ts +#EXTINF:4.000000, +0000530.ts +#EXTINF:4.000000, +0000531.ts +#EXTINF:4.000000, +0000532.ts +#EXTINF:4.000000, +0000533.ts +#EXTINF:4.000000, +0000534.ts +#EXTINF:0.960000, +0000535.ts +#EXTINF:4.000000, +0000536.ts +#EXTINF:4.000000, +0000537.ts +#EXTINF:4.000000, +0000538.ts +#EXTINF:4.000000, +0000539.ts +#EXTINF:4.000000, +0000540.ts +#EXTINF:3.600000, +0000541.ts +#EXTINF:4.000000, +0000542.ts +#EXTINF:4.000000, +0000543.ts +#EXTINF:4.280000, +0000544.ts +#EXTINF:5.960000, +0000545.ts +#EXTINF:4.000000, +0000546.ts +#EXTINF:4.000000, +0000547.ts +#EXTINF:4.000000, +0000548.ts +#EXTINF:4.000000, +0000549.ts +#EXTINF:4.000000, +0000550.ts +#EXTINF:4.000000, +0000551.ts +#EXTINF:4.000000, +0000552.ts +#EXTINF:2.840000, +0000553.ts +#EXTINF:4.000000, +0000554.ts +#EXTINF:4.000000, +0000555.ts +#EXTINF:4.000000, +0000556.ts +#EXTINF:4.000000, +0000557.ts +#EXTINF:4.000000, +0000558.ts +#EXTINF:4.000000, +0000559.ts +#EXTINF:4.000000, +0000560.ts +#EXTINF:6.080000, +0000561.ts +#EXTINF:4.000000, +0000562.ts +#EXTINF:4.000000, +0000563.ts +#EXTINF:4.000000, +0000564.ts +#EXTINF:2.280000, +0000565.ts +#EXTINF:4.000000, +0000566.ts +#EXTINF:4.000000, +0000567.ts +#EXTINF:4.000000, +0000568.ts +#EXTINF:4.000000, +0000569.ts +#EXTINF:4.000000, +0000570.ts +#EXTINF:3.640000, +0000571.ts +#EXTINF:4.000000, +0000572.ts +#EXTINF:4.000000, +0000573.ts +#EXTINF:4.000000, +0000574.ts +#EXTINF:4.000000, +0000575.ts +#EXTINF:3.760000, +0000576.ts +#EXTINF:3.960000, +0000577.ts +#EXTINF:4.600000, +0000578.ts +#EXTINF:4.000000, +0000579.ts +#EXTINF:4.000000, +0000580.ts +#EXTINF:4.000000, +0000581.ts +#EXTINF:3.960000, +0000582.ts +#EXTINF:4.000000, +0000583.ts +#EXTINF:5.880000, +0000584.ts +#EXTINF:3.760000, +0000585.ts +#EXTINF:4.000000, +0000586.ts +#EXTINF:4.000000, +0000587.ts +#EXTINF:4.000000, +0000588.ts +#EXTINF:4.000000, +0000589.ts +#EXTINF:4.000000, +0000590.ts +#EXTINF:1.640000, +0000591.ts +#EXTINF:4.000000, +0000592.ts +#EXTINF:3.560000, +0000593.ts +#EXTINF:4.000000, +0000594.ts +#EXTINF:4.000000, +0000595.ts +#EXTINF:4.000000, +0000596.ts +#EXTINF:4.000000, +0000597.ts +#EXTINF:4.000000, +0000598.ts +#EXTINF:4.000000, +0000599.ts +#EXTINF:4.000000, +0000600.ts +#EXTINF:4.000000, +0000601.ts +#EXTINF:3.720000, +0000602.ts +#EXTINF:3.960000, +0000603.ts +#EXTINF:4.000000, +0000604.ts +#EXTINF:4.000000, +0000605.ts +#EXTINF:4.000000, +0000606.ts +#EXTINF:4.000000, +0000607.ts +#EXTINF:4.000000, +0000608.ts +#EXTINF:4.000000, +0000609.ts +#EXTINF:4.000000, +0000610.ts +#EXTINF:4.000000, +0000611.ts +#EXTINF:4.000000, +0000612.ts +#EXTINF:4.000000, +0000613.ts +#EXTINF:4.000000, +0000614.ts +#EXTINF:4.000000, +0000615.ts +#EXTINF:6.640000, +0000616.ts +#EXTINF:4.000000, +0000617.ts +#EXTINF:4.000000, +0000618.ts +#EXTINF:4.000000, +0000619.ts +#EXTINF:4.000000, +0000620.ts +#EXTINF:2.720000, +0000621.ts +#EXTINF:3.760000, +0000622.ts +#EXTINF:2.960000, +0000623.ts +#EXTINF:4.000000, +0000624.ts +#EXTINF:4.000000, +0000625.ts +#EXTINF:4.000000, +0000626.ts +#EXTINF:4.000000, +0000627.ts +#EXTINF:5.680000, +0000628.ts +#EXTINF:4.000000, +0000629.ts +#EXTINF:6.040000, +0000630.ts +#EXTINF:4.000000, +0000631.ts +#EXTINF:4.000000, +0000632.ts +#EXTINF:4.000000, +0000633.ts +#EXTINF:4.000000, +0000634.ts +#EXTINF:4.000000, +0000635.ts +#EXTINF:4.000000, +0000636.ts +#EXTINF:2.880000, +0000637.ts +#EXTINF:4.000000, +0000638.ts +#EXTINF:4.000000, +0000639.ts +#EXTINF:3.640000, +0000640.ts +#EXTINF:4.000000, +0000641.ts +#EXTINF:4.000000, +0000642.ts +#EXTINF:4.000000, +0000643.ts +#EXTINF:4.000000, +0000644.ts +#EXTINF:3.840000, +0000645.ts +#EXTINF:4.000000, +0000646.ts +#EXTINF:4.000000, +0000647.ts +#EXTINF:4.000000, +0000648.ts +#EXTINF:4.000000, +0000649.ts +#EXTINF:4.000000, +0000650.ts +#EXTINF:4.000000, +0000651.ts +#EXTINF:4.000000, +0000652.ts +#EXTINF:4.000000, +0000653.ts +#EXTINF:4.000000, +0000654.ts +#EXTINF:4.000000, +0000655.ts +#EXTINF:3.880000, +0000656.ts +#EXTINF:3.800000, +0000657.ts +#EXTINF:4.000000, +0000658.ts +#EXTINF:4.440000, +0000659.ts +#EXTINF:4.000000, +0000660.ts +#EXTINF:4.000000, +0000661.ts +#EXTINF:4.000000, +0000662.ts +#EXTINF:4.000000, +0000663.ts +#EXTINF:4.000000, +0000664.ts +#EXTINF:4.000000, +0000665.ts +#EXTINF:4.000000, +0000666.ts +#EXTINF:2.640000, +0000667.ts +#EXTINF:4.000000, +0000668.ts +#EXTINF:4.000000, +0000669.ts +#EXTINF:4.000000, +0000670.ts +#EXTINF:4.000000, +0000671.ts +#EXTINF:3.680000, +0000672.ts +#EXTINF:4.000000, +0000673.ts +#EXTINF:4.000000, +0000674.ts +#EXTINF:4.000000, +0000675.ts +#EXTINF:4.000000, +0000676.ts +#EXTINF:6.160000, +0000677.ts +#EXTINF:4.000000, +0000678.ts +#EXTINF:4.000000, +0000679.ts +#EXTINF:4.000000, +0000680.ts +#EXTINF:4.000000, +0000681.ts +#EXTINF:4.000000, +0000682.ts +#EXTINF:4.000000, +0000683.ts +#EXTINF:2.120000, +0000684.ts +#EXTINF:4.000000, +0000685.ts +#EXTINF:5.240000, +0000686.ts +#EXTINF:4.000000, +0000687.ts +#EXTINF:4.000000, +0000688.ts +#EXTINF:4.000000, +0000689.ts +#EXTINF:4.000000, +0000690.ts +#EXTINF:3.760000, +0000691.ts +#EXTINF:4.000000, +0000692.ts +#EXTINF:2.440000, +0000693.ts +#EXTINF:5.280000, +0000694.ts +#EXTINF:4.000000, +0000695.ts +#EXTINF:4.000000, +0000696.ts +#EXTINF:4.000000, +0000697.ts +#EXTINF:4.000000, +0000698.ts +#EXTINF:4.000000, +0000699.ts +#EXTINF:4.000000, +0000700.ts +#EXTINF:4.000000, +0000701.ts +#EXTINF:4.000000, +0000702.ts +#EXTINF:4.000000, +0000703.ts +#EXTINF:4.000000, +0000704.ts +#EXTINF:3.680000, +0000705.ts +#EXTINF:3.960000, +0000706.ts +#EXTINF:4.000000, +0000707.ts +#EXTINF:4.000000, +0000708.ts +#EXTINF:4.000000, +0000709.ts +#EXTINF:4.000000, +0000710.ts +#EXTINF:4.000000, +0000711.ts +#EXTINF:4.000000, +0000712.ts +#EXTINF:4.000000, +0000713.ts +#EXTINF:4.000000, +0000714.ts +#EXTINF:6.680000, +0000715.ts +#EXTINF:4.000000, +0000716.ts +#EXTINF:4.000000, +0000717.ts +#EXTINF:4.000000, +0000718.ts +#EXTINF:4.000000, +0000719.ts +#EXTINF:4.000000, +0000720.ts +#EXTINF:4.000000, +0000721.ts +#EXTINF:4.000000, +0000722.ts +#EXTINF:4.000000, +0000723.ts +#EXTINF:4.000000, +0000724.ts +#EXTINF:4.000000, +0000725.ts +#EXTINF:4.000000, +0000726.ts +#EXTINF:4.000000, +0000727.ts +#EXTINF:4.000000, +0000728.ts +#EXTINF:2.800000, +0000729.ts +#EXTINF:3.880000, +0000730.ts +#EXTINF:2.120000, +0000731.ts +#EXTINF:4.000000, +0000732.ts +#EXTINF:4.000000, +0000733.ts +#EXTINF:4.000000, +0000734.ts +#EXTINF:4.000000, +0000735.ts +#EXTINF:7.160000, +0000736.ts +#EXTINF:4.000000, +0000737.ts +#EXTINF:1.920000, +0000738.ts +#EXTINF:4.000000, +0000739.ts +#EXTINF:4.000000, +0000740.ts +#EXTINF:5.840000, +0000741.ts +#EXTINF:4.000000, +0000742.ts +#EXTINF:4.000000, +0000743.ts +#EXTINF:2.560000, +0000744.ts +#EXTINF:4.000000, +0000745.ts +#EXTINF:4.000000, +0000746.ts +#EXTINF:4.000000, +0000747.ts +#EXTINF:4.960000, +0000748.ts +#EXTINF:4.000000, +0000749.ts +#EXTINF:1.240000, +0000750.ts +#EXTINF:4.000000, +0000751.ts +#EXTINF:4.000000, +0000752.ts +#EXTINF:4.000000, +0000753.ts +#EXTINF:4.000000, +0000754.ts +#EXTINF:4.000000, +0000755.ts +#EXTINF:4.000000, +0000756.ts +#EXTINF:4.000000, +0000757.ts +#EXTINF:4.000000, +0000758.ts +#EXTINF:4.000000, +0000759.ts +#EXTINF:4.000000, +0000760.ts +#EXTINF:4.000000, +0000761.ts +#EXTINF:4.000000, +0000762.ts +#EXTINF:4.000000, +0000763.ts +#EXTINF:4.000000, +0000764.ts +#EXTINF:4.000000, +0000765.ts +#EXTINF:4.640000, +0000766.ts +#EXTINF:4.000000, +0000767.ts +#EXTINF:4.000000, +0000768.ts +#EXTINF:5.800000, +0000769.ts +#EXTINF:4.000000, +0000770.ts +#EXTINF:2.720000, +0000771.ts +#EXTINF:2.520000, +0000772.ts +#EXTINF:4.400000, +0000773.ts +#EXTINF:4.000000, +0000774.ts +#EXTINF:4.000000, +0000775.ts +#EXTINF:5.000000, +0000776.ts +#EXTINF:2.760000, +0000777.ts +#EXTINF:4.000000, +0000778.ts +#EXTINF:4.000000, +0000779.ts +#EXTINF:6.360000, +0000780.ts +#EXTINF:2.440000, +0000781.ts +#EXTINF:3.520000, +0000782.ts +#EXTINF:4.000000, +0000783.ts +#EXTINF:3.960000, +0000784.ts +#EXTINF:4.680000, +0000785.ts +#EXTINF:5.240000, +0000786.ts +#EXTINF:4.000000, +0000787.ts +#EXTINF:2.280000, +0000788.ts +#EXTINF:3.560000, +0000789.ts +#EXTINF:4.000000, +0000790.ts +#EXTINF:4.000000, +0000791.ts +#EXTINF:4.000000, +0000792.ts +#EXTINF:3.920000, +0000793.ts +#EXTINF:4.000000, +0000794.ts +#EXTINF:6.320000, +0000795.ts +#EXTINF:1.600000, +0000796.ts +#EXTINF:4.000000, +0000797.ts +#EXTINF:4.000000, +0000798.ts +#EXTINF:5.160000, +0000799.ts +#EXTINF:4.000000, +0000800.ts +#EXTINF:4.000000, +0000801.ts +#EXTINF:4.000000, +0000802.ts +#EXTINF:4.000000, +0000803.ts +#EXTINF:4.000000, +0000804.ts +#EXTINF:3.320000, +0000805.ts +#EXTINF:5.800000, +0000806.ts +#EXTINF:4.000000, +0000807.ts +#EXTINF:4.000000, +0000808.ts +#EXTINF:4.000000, +0000809.ts +#EXTINF:4.000000, +0000810.ts +#EXTINF:3.280000, +0000811.ts +#EXTINF:4.000000, +0000812.ts +#EXTINF:2.680000, +0000813.ts +#EXTINF:3.600000, +0000814.ts +#EXTINF:4.000000, +0000815.ts +#EXTINF:5.560000, +0000816.ts +#EXTINF:4.000000, +0000817.ts +#EXTINF:4.000000, +0000818.ts +#EXTINF:3.920000, +0000819.ts +#EXTINF:4.000000, +0000820.ts +#EXTINF:4.000000, +0000821.ts +#EXTINF:4.000000, +0000822.ts +#EXTINF:4.000000, +0000823.ts +#EXTINF:4.000000, +0000824.ts +#EXTINF:2.520000, +0000825.ts +#EXTINF:4.000000, +0000826.ts +#EXTINF:5.600000, +0000827.ts +#EXTINF:4.000000, +0000828.ts +#EXTINF:4.000000, +0000829.ts +#EXTINF:4.000000, +0000830.ts +#EXTINF:4.000000, +0000831.ts +#EXTINF:4.600000, +0000832.ts +#EXTINF:3.760000, +0000833.ts +#EXTINF:4.000000, +0000834.ts +#EXTINF:4.000000, +0000835.ts +#EXTINF:4.000000, +0000836.ts +#EXTINF:4.000000, +0000837.ts +#EXTINF:4.000000, +0000838.ts +#EXTINF:4.000000, +0000839.ts +#EXTINF:4.000000, +0000840.ts +#EXTINF:4.000000, +0000841.ts +#EXTINF:4.000000, +0000842.ts +#EXTINF:2.240000, +0000843.ts +#EXTINF:4.000000, +0000844.ts +#EXTINF:4.000000, +0000845.ts +#EXTINF:4.000000, +0000846.ts +#EXTINF:4.000000, +0000847.ts +#EXTINF:4.000000, +0000848.ts +#EXTINF:5.840000, +0000849.ts +#EXTINF:4.000000, +0000850.ts +#EXTINF:4.000000, +0000851.ts +#EXTINF:4.000000, +0000852.ts +#EXTINF:4.000000, +0000853.ts +#EXTINF:4.000000, +0000854.ts +#EXTINF:4.000000, +0000855.ts +#EXTINF:4.000000, +0000856.ts +#EXTINF:4.000000, +0000857.ts +#EXTINF:4.000000, +0000858.ts +#EXTINF:2.280000, +0000859.ts +#EXTINF:4.000000, +0000860.ts +#EXTINF:4.000000, +0000861.ts +#EXTINF:6.080000, +0000862.ts +#EXTINF:4.000000, +0000863.ts +#EXTINF:4.000000, +0000864.ts +#EXTINF:4.000000, +0000865.ts +#EXTINF:4.720000, +0000866.ts +#EXTINF:1.600000, +0000867.ts +#EXTINF:4.000000, +0000868.ts +#EXTINF:4.000000, +0000869.ts +#EXTINF:4.000000, +0000870.ts +#EXTINF:4.000000, +0000871.ts +#EXTINF:4.000000, +0000872.ts +#EXTINF:7.040000, +0000873.ts +#EXTINF:0.920000, +0000874.ts +#EXTINF:4.000000, +0000875.ts +#EXTINF:4.000000, +0000876.ts +#EXTINF:4.000000, +0000877.ts +#EXTINF:4.000000, +0000878.ts +#EXTINF:3.760000, +0000879.ts +#EXTINF:4.000000, +0000880.ts +#EXTINF:7.480000, +0000881.ts +#EXTINF:4.000000, +0000882.ts +#EXTINF:4.000000, +0000883.ts +#EXTINF:4.000000, +0000884.ts +#EXTINF:4.000000, +0000885.ts +#EXTINF:4.000000, +0000886.ts +#EXTINF:4.000000, +0000887.ts +#EXTINF:4.000000, +0000888.ts +#EXTINF:4.000000, +0000889.ts +#EXTINF:4.000000, +0000890.ts +#EXTINF:4.000000, +0000891.ts +#EXTINF:4.000000, +0000892.ts +#EXTINF:4.000000, +0000893.ts +#EXTINF:4.000000, +0000894.ts +#EXTINF:3.960000, +0000895.ts +#EXTINF:4.000000, +0000896.ts +#EXTINF:4.000000, +0000897.ts +#EXTINF:4.000000, +0000898.ts +#EXTINF:4.000000, +0000899.ts +#EXTINF:2.000000, +0000900.ts +#EXTINF:4.000000, +0000901.ts +#EXTINF:4.000000, +0000902.ts +#EXTINF:4.000000, +0000903.ts +#EXTINF:4.000000, +0000904.ts +#EXTINF:2.920000, +0000905.ts +#EXTINF:4.000000, +0000906.ts +#EXTINF:4.000000, +0000907.ts +#EXTINF:4.000000, +0000908.ts +#EXTINF:4.000000, +0000909.ts +#EXTINF:4.000000, +0000910.ts +#EXTINF:4.000000, +0000911.ts +#EXTINF:4.000000, +0000912.ts +#EXTINF:4.000000, +0000913.ts +#EXTINF:4.000000, +0000914.ts +#EXTINF:4.000000, +0000915.ts +#EXTINF:4.000000, +0000916.ts +#EXTINF:4.000000, +0000917.ts +#EXTINF:4.000000, +0000918.ts +#EXTINF:4.800000, +0000919.ts +#EXTINF:4.000000, +0000920.ts +#EXTINF:4.000000, +0000921.ts +#EXTINF:4.000000, +0000922.ts +#EXTINF:4.000000, +0000923.ts +#EXTINF:4.000000, +0000924.ts +#EXTINF:4.000000, +0000925.ts +#EXTINF:4.000000, +0000926.ts +#EXTINF:4.000000, +0000927.ts +#EXTINF:4.000000, +0000928.ts +#EXTINF:3.800000, +0000929.ts +#EXTINF:4.000000, +0000930.ts +#EXTINF:2.840000, +0000931.ts +#EXTINF:4.000000, +0000932.ts +#EXTINF:4.000000, +0000933.ts +#EXTINF:4.000000, +0000934.ts +#EXTINF:7.640000, +0000935.ts +#EXTINF:4.000000, +0000936.ts +#EXTINF:4.000000, +0000937.ts +#EXTINF:4.000000, +0000938.ts +#EXTINF:4.000000, +0000939.ts +#EXTINF:4.000000, +0000940.ts +#EXTINF:2.600000, +0000941.ts +#EXTINF:4.000000, +0000942.ts +#EXTINF:4.000000, +0000943.ts +#EXTINF:4.000000, +0000944.ts +#EXTINF:3.800000, +0000945.ts +#EXTINF:4.000000, +0000946.ts +#EXTINF:2.120000, +0000947.ts +#EXTINF:4.000000, +0000948.ts +#EXTINF:4.000000, +0000949.ts +#EXTINF:4.000000, +0000950.ts +#EXTINF:3.600000, +0000951.ts +#EXTINF:5.600000, +0000952.ts +#EXTINF:4.000000, +0000953.ts +#EXTINF:4.000000, +0000954.ts +#EXTINF:4.000000, +0000955.ts +#EXTINF:4.000000, +0000956.ts +#EXTINF:4.000000, +0000957.ts +#EXTINF:4.000000, +0000958.ts +#EXTINF:2.520000, +0000959.ts +#EXTINF:4.000000, +0000960.ts +#EXTINF:4.000000, +0000961.ts +#EXTINF:4.000000, +0000962.ts +#EXTINF:4.000000, +0000963.ts +#EXTINF:4.400000, +0000964.ts +#EXTINF:6.000000, +0000965.ts +#EXTINF:4.000000, +0000966.ts +#EXTINF:4.000000, +0000967.ts +#EXTINF:4.000000, +0000968.ts +#EXTINF:5.400000, +0000969.ts +#EXTINF:4.000000, +0000970.ts +#EXTINF:4.000000, +0000971.ts +#EXTINF:1.720000, +0000972.ts +#EXTINF:4.000000, +0000973.ts +#EXTINF:4.000000, +0000974.ts +#EXTINF:3.440000, +0000975.ts +#EXTINF:4.000000, +0000976.ts +#EXTINF:3.600000, +0000977.ts +#EXTINF:4.000000, +0000978.ts +#EXTINF:4.000000, +0000979.ts +#EXTINF:4.000000, +0000980.ts +#EXTINF:4.000000, +0000981.ts +#EXTINF:7.000000, +0000982.ts +#EXTINF:3.160000, +0000983.ts +#EXTINF:4.000000, +0000984.ts +#EXTINF:4.000000, +0000985.ts +#EXTINF:4.000000, +0000986.ts +#EXTINF:4.000000, +0000987.ts +#EXTINF:2.960000, +0000988.ts +#EXTINF:2.200000, +0000989.ts +#EXTINF:4.000000, +0000990.ts +#EXTINF:4.640000, +0000991.ts +#EXTINF:3.880000, +0000992.ts +#EXTINF:4.000000, +0000993.ts +#EXTINF:4.960000, +0000994.ts +#EXTINF:4.000000, +0000995.ts +#EXTINF:4.000000, +0000996.ts +#EXTINF:5.360000, +0000997.ts +#EXTINF:1.360000, +0000998.ts +#EXTINF:4.000000, +0000999.ts +#EXTINF:6.080000, +0001000.ts +#EXTINF:4.000000, +0001001.ts +#EXTINF:3.080000, +0001002.ts +#EXTINF:4.000000, +0001003.ts +#EXTINF:4.000000, +0001004.ts +#EXTINF:4.000000, +0001005.ts +#EXTINF:4.000000, +0001006.ts +#EXTINF:3.720000, +0001007.ts +#EXTINF:4.000000, +0001008.ts +#EXTINF:3.120000, +0001009.ts +#EXTINF:3.840000, +0001010.ts +#EXTINF:4.000000, +0001011.ts +#EXTINF:4.720000, +0001012.ts +#EXTINF:4.000000, +0001013.ts +#EXTINF:4.000000, +0001014.ts +#EXTINF:4.760000, +0001015.ts +#EXTINF:4.000000, +0001016.ts +#EXTINF:5.520000, +0001017.ts +#EXTINF:4.000000, +0001018.ts +#EXTINF:4.000000, +0001019.ts +#EXTINF:4.520000, +0001020.ts +#EXTINF:4.000000, +0001021.ts +#EXTINF:4.000000, +0001022.ts +#EXTINF:4.000000, +0001023.ts +#EXTINF:4.000000, +0001024.ts +#EXTINF:4.000000, +0001025.ts +#EXTINF:2.680000, +0001026.ts +#EXTINF:4.000000, +0001027.ts +#EXTINF:3.560000, +0001028.ts +#EXTINF:3.880000, +0001029.ts +#EXTINF:4.000000, +0001030.ts +#EXTINF:3.960000, +0001031.ts +#EXTINF:4.000000, +0001032.ts +#EXTINF:4.000000, +0001033.ts +#EXTINF:4.000000, +0001034.ts +#EXTINF:4.000000, +0001035.ts +#EXTINF:4.000000, +0001036.ts +#EXTINF:4.000000, +0001037.ts +#EXTINF:2.480000, +0001038.ts +#EXTINF:7.600000, +0001039.ts +#EXTINF:4.000000, +0001040.ts +#EXTINF:4.000000, +0001041.ts +#EXTINF:4.000000, +0001042.ts +#EXTINF:1.880000, +0001043.ts +#EXTINF:4.000000, +0001044.ts +#EXTINF:3.800000, +0001045.ts +#EXTINF:6.320000, +0001046.ts +#EXTINF:4.000000, +0001047.ts +#EXTINF:3.160000, +0001048.ts +#EXTINF:3.720000, +0001049.ts +#EXTINF:5.360000, +0001050.ts +#EXTINF:4.000000, +0001051.ts +#EXTINF:4.000000, +0001052.ts +#EXTINF:0.520000, +0001053.ts +#EXTINF:4.000000, +0001054.ts +#EXTINF:6.320000, +0001055.ts +#EXTINF:4.000000, +0001056.ts +#EXTINF:4.000000, +0001057.ts +#EXTINF:4.000000, +0001058.ts +#EXTINF:3.640000, +0001059.ts +#EXTINF:4.000000, +0001060.ts +#EXTINF:4.000000, +0001061.ts +#EXTINF:4.000000, +0001062.ts +#EXTINF:3.760000, +0001063.ts +#EXTINF:4.000000, +0001064.ts +#EXTINF:4.000000, +0001065.ts +#EXTINF:4.000000, +0001066.ts +#EXTINF:4.000000, +0001067.ts +#EXTINF:4.000000, +0001068.ts +#EXTINF:4.000000, +0001069.ts +#EXTINF:4.000000, +0001070.ts +#EXTINF:4.000000, +0001071.ts +#EXTINF:2.920000, +0001072.ts +#EXTINF:4.000000, +0001073.ts +#EXTINF:2.880000, +0001074.ts +#EXTINF:4.000000, +0001075.ts +#EXTINF:4.000000, +0001076.ts +#EXTINF:7.280000, +0001077.ts +#EXTINF:4.000000, +0001078.ts +#EXTINF:4.000000, +0001079.ts +#EXTINF:4.000000, +0001080.ts +#EXTINF:4.000000, +0001081.ts +#EXTINF:4.000000, +0001082.ts +#EXTINF:3.520000, +0001083.ts +#EXTINF:4.000000, +0001084.ts +#EXTINF:1.680000, +0001085.ts +#EXTINF:4.000000, +0001086.ts +#EXTINF:4.000000, +0001087.ts +#EXTINF:4.000000, +0001088.ts +#EXTINF:7.480000, +0001089.ts +#EXTINF:4.000000, +0001090.ts +#EXTINF:4.000000, +0001091.ts +#EXTINF:4.000000, +0001092.ts +#EXTINF:4.000000, +0001093.ts +#EXTINF:4.000000, +0001094.ts +#EXTINF:4.000000, +0001095.ts +#EXTINF:3.640000, +0001096.ts +#EXTINF:4.000000, +0001097.ts +#EXTINF:4.000000, +0001098.ts +#EXTINF:4.000000, +0001099.ts +#EXTINF:4.000000, +0001100.ts +#EXTINF:3.720000, +0001101.ts +#EXTINF:4.000000, +0001102.ts +#EXTINF:4.000000, +0001103.ts +#EXTINF:4.000000, +0001104.ts +#EXTINF:4.000000, +0001105.ts +#EXTINF:4.000000, +0001106.ts +#EXTINF:3.160000, +0001107.ts +#EXTINF:4.000000, +0001108.ts +#EXTINF:4.000000, +0001109.ts +#EXTINF:4.000000, +0001110.ts +#EXTINF:4.000000, +0001111.ts +#EXTINF:4.000000, +0001112.ts +#EXTINF:5.480000, +0001113.ts +#EXTINF:4.000000, +0001114.ts +#EXTINF:4.000000, +0001115.ts +#EXTINF:4.000000, +0001116.ts +#EXTINF:4.000000, +0001117.ts +#EXTINF:4.000000, +0001118.ts +#EXTINF:4.000000, +0001119.ts +#EXTINF:3.320000, +0001120.ts +#EXTINF:4.000000, +0001121.ts +#EXTINF:2.920000, +0001122.ts +#EXTINF:4.000000, +0001123.ts +#EXTINF:4.280000, +0001124.ts +#EXTINF:3.840000, +0001125.ts +#EXTINF:4.000000, +0001126.ts +#EXTINF:4.000000, +0001127.ts +#EXTINF:4.000000, +0001128.ts +#EXTINF:4.000000, +0001129.ts +#EXTINF:4.000000, +0001130.ts +#EXTINF:4.000000, +0001131.ts +#EXTINF:4.000000, +0001132.ts +#EXTINF:4.000000, +0001133.ts +#EXTINF:4.000000, +0001134.ts +#EXTINF:4.000000, +0001135.ts +#EXTINF:4.000000, +0001136.ts +#EXTINF:2.480000, +0001137.ts +#EXTINF:4.000000, +0001138.ts +#EXTINF:4.000000, +0001139.ts +#EXTINF:4.000000, +0001140.ts +#EXTINF:4.000000, +0001141.ts +#EXTINF:4.000000, +0001142.ts +#EXTINF:3.520000, +0001143.ts +#EXTINF:4.000000, +0001144.ts +#EXTINF:4.000000, +0001145.ts +#EXTINF:4.000000, +0001146.ts +#EXTINF:4.000000, +0001147.ts +#EXTINF:4.000000, +0001148.ts +#EXTINF:4.000000, +0001149.ts +#EXTINF:4.000000, +0001150.ts +#EXTINF:4.000000, +0001151.ts +#EXTINF:4.000000, +0001152.ts +#EXTINF:4.440000, +0001153.ts +#EXTINF:4.000000, +0001154.ts +#EXTINF:4.000000, +0001155.ts +#EXTINF:4.000000, +0001156.ts +#EXTINF:3.640000, +0001157.ts +#EXTINF:4.000000, +0001158.ts +#EXTINF:4.000000, +0001159.ts +#EXTINF:4.000000, +0001160.ts +#EXTINF:4.000000, +0001161.ts +#EXTINF:4.000000, +0001162.ts +#EXTINF:6.840000, +0001163.ts +#EXTINF:4.000000, +0001164.ts +#EXTINF:4.000000, +0001165.ts +#EXTINF:4.000000, +0001166.ts +#EXTINF:4.000000, +0001167.ts +#EXTINF:4.000000, +0001168.ts +#EXTINF:4.000000, +0001169.ts +#EXTINF:2.400000, +0001170.ts +#EXTINF:4.000000, +0001171.ts +#EXTINF:4.000000, +0001172.ts +#EXTINF:4.000000, +0001173.ts +#EXTINF:4.000000, +0001174.ts +#EXTINF:4.000000, +0001175.ts +#EXTINF:6.080000, +0001176.ts +#EXTINF:4.000000, +0001177.ts +#EXTINF:4.000000, +0001178.ts +#EXTINF:2.280000, +0001179.ts +#EXTINF:4.000000, +0001180.ts +#EXTINF:2.560000, +0001181.ts +#EXTINF:4.000000, +0001182.ts +#EXTINF:4.000000, +0001183.ts +#EXTINF:4.000000, +0001184.ts +#EXTINF:4.000000, +0001185.ts +#EXTINF:3.720000, +0001186.ts +#EXTINF:4.000000, +0001187.ts +#EXTINF:4.600000, +0001188.ts +#EXTINF:4.000000, +0001189.ts +#EXTINF:4.000000, +0001190.ts +#EXTINF:6.840000, +0001191.ts +#EXTINF:0.800000, +0001192.ts +#EXTINF:7.080000, +0001193.ts +#EXTINF:4.000000, +0001194.ts +#EXTINF:4.000000, +0001195.ts +#EXTINF:4.000000, +0001196.ts +#EXTINF:4.000000, +0001197.ts +#EXTINF:4.000000, +0001198.ts +#EXTINF:4.000000, +0001199.ts +#EXTINF:4.000000, +0001200.ts +#EXTINF:4.000000, +0001201.ts +#EXTINF:2.280000, +0001202.ts +#EXTINF:2.960000, +0001203.ts +#EXTINF:4.000000, +0001204.ts +#EXTINF:4.000000, +0001205.ts +#EXTINF:4.000000, +0001206.ts +#EXTINF:4.000000, +0001207.ts +#EXTINF:5.440000, +0001208.ts +#EXTINF:3.200000, +0001209.ts +#EXTINF:2.720000, +0001210.ts +#EXTINF:5.760000, +0001211.ts +#EXTINF:4.000000, +0001212.ts +#EXTINF:2.360000, +0001213.ts +#EXTINF:3.960000, +0001214.ts +#EXTINF:4.560000, +0001215.ts +#EXTINF:4.440000, +0001216.ts +#EXTINF:3.440000, +0001217.ts +#EXTINF:4.000000, +0001218.ts +#EXTINF:4.000000, +0001219.ts +#EXTINF:4.000000, +0001220.ts +#EXTINF:4.000000, +0001221.ts +#EXTINF:4.000000, +0001222.ts +#EXTINF:4.000000, +0001223.ts +#EXTINF:4.000000, +0001224.ts +#EXTINF:4.000000, +0001225.ts +#EXTINF:7.160000, +0001226.ts +#EXTINF:4.000000, +0001227.ts +#EXTINF:4.000000, +0001228.ts +#EXTINF:4.000000, +0001229.ts +#EXTINF:4.000000, +0001230.ts +#EXTINF:4.000000, +0001231.ts +#EXTINF:4.000000, +0001232.ts +#EXTINF:0.760000, +0001233.ts +#EXTINF:7.080000, +0001234.ts +#EXTINF:4.000000, +0001235.ts +#EXTINF:4.000000, +0001236.ts +#EXTINF:4.000000, +0001237.ts +#EXTINF:4.000000, +0001238.ts +#EXTINF:1.680000, +0001239.ts +#EXTINF:4.000000, +0001240.ts +#EXTINF:4.000000, +0001241.ts +#EXTINF:4.000000, +0001242.ts +#EXTINF:4.000000, +0001243.ts +#EXTINF:4.000000, +0001244.ts +#EXTINF:4.000000, +0001245.ts +#EXTINF:4.000000, +0001246.ts +#EXTINF:4.000000, +0001247.ts +#EXTINF:4.000000, +0001248.ts +#EXTINF:4.000000, +0001249.ts +#EXTINF:4.000000, +0001250.ts +#EXTINF:4.000000, +0001251.ts +#EXTINF:6.120000, +0001252.ts +#EXTINF:4.000000, +0001253.ts +#EXTINF:4.000000, +0001254.ts +#EXTINF:4.000000, +0001255.ts +#EXTINF:4.000000, +0001256.ts +#EXTINF:4.000000, +0001257.ts +#EXTINF:4.000000, +0001258.ts +#EXTINF:4.000000, +0001259.ts +#EXTINF:2.000000, +0001260.ts +#EXTINF:4.000000, +0001261.ts +#EXTINF:2.480000, +0001262.ts +#EXTINF:4.000000, +0001263.ts +#EXTINF:4.000000, +0001264.ts +#EXTINF:4.000000, +0001265.ts +#EXTINF:4.000000, +0001266.ts +#EXTINF:6.760000, +0001267.ts +#EXTINF:4.000000, +0001268.ts +#EXTINF:4.960000, +0001269.ts +#EXTINF:4.000000, +0001270.ts +#EXTINF:4.000000, +0001271.ts +#EXTINF:4.000000, +0001272.ts +#EXTINF:4.000000, +0001273.ts +#EXTINF:3.440000, +0001274.ts +#EXTINF:4.000000, +0001275.ts +#EXTINF:4.000000, +0001276.ts +#EXTINF:4.000000, +0001277.ts +#EXTINF:4.000000, +0001278.ts +#EXTINF:4.000000, +0001279.ts +#EXTINF:4.000000, +0001280.ts +#EXTINF:4.000000, +0001281.ts +#EXTINF:4.000000, +0001282.ts +#EXTINF:4.000000, +0001283.ts +#EXTINF:4.000000, +0001284.ts +#EXTINF:4.000000, +0001285.ts +#EXTINF:4.000000, +0001286.ts +#EXTINF:3.480000, +0001287.ts +#EXTINF:4.000000, +0001288.ts +#EXTINF:4.000000, +0001289.ts +#EXTINF:4.000000, +0001290.ts +#EXTINF:4.000000, +0001291.ts +#EXTINF:4.000000, +0001292.ts +#EXTINF:4.000000, +0001293.ts +#EXTINF:4.000000, +0001294.ts +#EXTINF:4.000000, +0001295.ts +#EXTINF:4.000000, +0001296.ts +#EXTINF:4.000000, +0001297.ts +#EXTINF:4.000000, +0001298.ts +#EXTINF:4.000000, +0001299.ts +#EXTINF:2.160000, +0001300.ts +#EXTINF:4.000000, +0001301.ts +#EXTINF:4.000000, +0001302.ts +#EXTINF:4.000000, +0001303.ts +#EXTINF:4.000000, +0001304.ts +#EXTINF:4.000000, +0001305.ts +#EXTINF:5.360000, +0001306.ts +#EXTINF:4.000000, +0001307.ts +#EXTINF:4.000000, +0001308.ts +#EXTINF:4.000000, +0001309.ts +#EXTINF:4.000000, +0001310.ts +#EXTINF:4.000000, +0001311.ts +#EXTINF:3.000000, +0001312.ts +#EXTINF:4.000000, +0001313.ts +#EXTINF:4.000000, +0001314.ts +#EXTINF:3.760000, +0001315.ts +#EXTINF:4.000000, +0001316.ts +#EXTINF:3.960000, +0001317.ts +#EXTINF:4.000000, +0001318.ts +#EXTINF:4.000000, +0001319.ts +#EXTINF:4.000000, +0001320.ts +#EXTINF:4.000000, +0001321.ts +#EXTINF:4.000000, +0001322.ts +#EXTINF:4.000000, +0001323.ts +#EXTINF:4.000000, +0001324.ts +#EXTINF:4.000000, +0001325.ts +#EXTINF:4.000000, +0001326.ts +#EXTINF:3.880000, +0001327.ts +#EXTINF:4.000000, +0001328.ts +#EXTINF:4.000000, +0001329.ts +#EXTINF:4.000000, +0001330.ts +#EXTINF:4.000000, +0001331.ts +#EXTINF:3.280000, +0001332.ts +#EXTINF:5.080000, +0001333.ts +#EXTINF:4.000000, +0001334.ts +#EXTINF:4.000000, +0001335.ts +#EXTINF:4.000000, +0001336.ts +#EXTINF:4.000000, +0001337.ts +#EXTINF:4.000000, +0001338.ts +#EXTINF:6.080000, +0001339.ts +#EXTINF:4.000000, +0001340.ts +#EXTINF:4.000000, +0001341.ts +#EXTINF:4.000000, +0001342.ts +#EXTINF:4.000000, +0001343.ts +#EXTINF:4.000000, +0001344.ts +#EXTINF:4.000000, +0001345.ts +#EXTINF:4.000000, +0001346.ts +#EXTINF:4.000000, +0001347.ts +#EXTINF:4.000000, +0001348.ts +#EXTINF:4.000000, +0001349.ts +#EXTINF:4.000000, +0001350.ts +#EXTINF:4.000000, +0001351.ts +#EXTINF:4.000000, +0001352.ts +#EXTINF:4.000000, +0001353.ts +#EXTINF:4.000000, +0001354.ts +#EXTINF:4.000000, +0001355.ts +#EXTINF:3.960000, +0001356.ts +#EXTINF:1.200000, +0001357.ts +#EXTINF:4.000000, +0001358.ts +#EXTINF:4.000000, +0001359.ts +#EXTINF:4.000000, +0001360.ts +#EXTINF:4.000000, +0001361.ts +#EXTINF:4.960000, +0001362.ts +#EXTINF:4.000000, +0001363.ts +#EXTINF:4.000000, +0001364.ts +#EXTINF:4.000000, +0001365.ts +#EXTINF:5.920000, +0001366.ts +#EXTINF:4.000000, +0001367.ts +#EXTINF:4.000000, +0001368.ts +#EXTINF:2.920000, +0001369.ts +#EXTINF:4.000000, +0001370.ts +#EXTINF:4.000000, +0001371.ts +#EXTINF:4.000000, +0001372.ts +#EXTINF:4.000000, +0001373.ts +#EXTINF:3.720000, +0001374.ts +#EXTINF:4.000000, +0001375.ts +#EXTINF:3.120000, +0001376.ts +#EXTINF:4.000000, +0001377.ts +#EXTINF:4.000000, +0001378.ts +#EXTINF:3.560000, +0001379.ts +#EXTINF:4.000000, +0001380.ts +#EXTINF:5.600000, +0001381.ts +#EXTINF:4.000000, +0001382.ts +#EXTINF:4.000000, +0001383.ts +#EXTINF:4.000000, +0001384.ts +#EXTINF:3.640000, +0001385.ts +#EXTINF:4.000000, +0001386.ts +#EXTINF:4.000000, +0001387.ts +#EXTINF:4.000000, +0001388.ts +#EXTINF:4.000000, +0001389.ts +#EXTINF:4.000000, +0001390.ts +#EXTINF:2.280000, +0001391.ts +#EXTINF:4.400000, +0001392.ts +#EXTINF:4.000000, +0001393.ts +#EXTINF:4.000000, +0001394.ts +#EXTINF:4.000000, +0001395.ts +#EXTINF:4.400000, +0001396.ts +#EXTINF:4.000000, +0001397.ts +#EXTINF:4.000000, +0001398.ts +#EXTINF:6.200000, +0001399.ts +#EXTINF:0.920000, +0001400.ts +#EXTINF:4.000000, +0001401.ts +#EXTINF:4.960000, +0001402.ts +#EXTINF:4.000000, +0001403.ts +#EXTINF:4.000000, +0001404.ts +#EXTINF:4.000000, +0001405.ts +#EXTINF:4.000000, +0001406.ts +#EXTINF:4.000000, +0001407.ts +#EXTINF:4.000000, +0001408.ts +#EXTINF:4.600000, +0001409.ts +#EXTINF:5.000000, +0001410.ts +#EXTINF:4.000000, +0001411.ts +#EXTINF:4.000000, +0001412.ts +#EXTINF:4.000000, +0001413.ts +#EXTINF:4.000000, +0001414.ts +#EXTINF:1.600000, +0001415.ts +#EXTINF:7.520000, +0001416.ts +#EXTINF:4.000000, +0001417.ts +#EXTINF:3.560000, +0001418.ts +#EXTINF:4.000000, +0001419.ts +#EXTINF:4.000000, +0001420.ts +#EXTINF:4.000000, +0001421.ts +#EXTINF:4.000000, +0001422.ts +#EXTINF:3.160000, +0001423.ts +#EXTINF:3.080000, +0001424.ts +#EXTINF:4.000000, +0001425.ts +#EXTINF:3.880000, +0001426.ts +#EXTINF:4.000000, +0001427.ts +#EXTINF:3.800000, +0001428.ts +#EXTINF:4.000000, +0001429.ts +#EXTINF:4.000000, +0001430.ts +#EXTINF:4.000000, +0001431.ts +#EXTINF:4.000000, +0001432.ts +#EXTINF:4.000000, +0001433.ts +#EXTINF:4.000000, +0001434.ts +#EXTINF:3.760000, +0001435.ts +#EXTINF:4.000000, +0001436.ts +#EXTINF:4.000000, +0001437.ts +#EXTINF:4.680000, +0001438.ts +#EXTINF:3.840000, +0001439.ts +#EXTINF:4.000000, +0001440.ts +#EXTINF:4.000000, +0001441.ts +#EXTINF:4.000000, +0001442.ts +#EXTINF:4.000000, +0001443.ts +#EXTINF:4.000000, +0001444.ts +#EXTINF:4.000000, +0001445.ts +#EXTINF:4.000000, +0001446.ts +#EXTINF:4.000000, +0001447.ts +#EXTINF:4.000000, +0001448.ts +#EXTINF:4.000000, +0001449.ts +#EXTINF:4.000000, +0001450.ts +#EXTINF:3.760000, +0001451.ts +#EXTINF:4.000000, +0001452.ts +#EXTINF:3.560000, +0001453.ts +#EXTINF:4.000000, +0001454.ts +#EXTINF:4.960000, +0001455.ts +#EXTINF:4.000000, +0001456.ts +#EXTINF:4.000000, +0001457.ts +#EXTINF:4.000000, +0001458.ts +#EXTINF:2.320000, +0001459.ts +#EXTINF:4.000000, +0001460.ts +#EXTINF:4.000000, +0001461.ts +#EXTINF:5.840000, +0001462.ts +#EXTINF:4.000000, +0001463.ts +#EXTINF:4.000000, +0001464.ts +#EXTINF:4.000000, +0001465.ts +#EXTINF:4.000000, +0001466.ts +#EXTINF:2.880000, +0001467.ts +#EXTINF:4.000000, +0001468.ts +#EXTINF:6.400000, +0001469.ts +#EXTINF:4.000000, +0001470.ts +#EXTINF:4.000000, +0001471.ts +#EXTINF:1.240000, +0001472.ts +#EXTINF:4.000000, +0001473.ts +#EXTINF:6.960000, +0001474.ts +#EXTINF:4.000000, +0001475.ts +#EXTINF:4.000000, +0001476.ts +#EXTINF:2.400000, +0001477.ts +#EXTINF:2.400000, +0001478.ts +#EXTINF:6.160000, +0001479.ts +#EXTINF:4.000000, +0001480.ts +#EXTINF:1.920000, +0001481.ts +#EXTINF:4.760000, +0001482.ts +#EXTINF:4.000000, +0001483.ts +#EXTINF:4.000000, +0001484.ts +#EXTINF:4.000000, +0001485.ts +#EXTINF:4.000000, +0001486.ts +#EXTINF:4.480000, +0001487.ts +#EXTINF:5.160000, +0001488.ts +#EXTINF:4.000000, +0001489.ts +#EXTINF:4.000000, +0001490.ts +#EXTINF:4.000000, +0001491.ts +#EXTINF:4.000000, +0001492.ts +#EXTINF:4.000000, +0001493.ts +#EXTINF:4.000000, +0001494.ts +#EXTINF:4.000000, +0001495.ts +#EXTINF:4.000000, +0001496.ts +#EXTINF:4.000000, +0001497.ts +#EXTINF:4.000000, +0001498.ts +#EXTINF:3.160000, +0001499.ts +#EXTINF:4.000000, +0001500.ts +#EXTINF:4.000000, +0001501.ts +#EXTINF:2.320000, +0001502.ts +#EXTINF:4.000000, +0001503.ts +#EXTINF:4.000000, +0001504.ts +#EXTINF:4.000000, +0001505.ts +#EXTINF:4.000000, +0001506.ts +#EXTINF:4.000000, +0001507.ts +#EXTINF:7.560000, +0001508.ts +#EXTINF:1.840000, +0001509.ts +#EXTINF:4.000000, +0001510.ts +#EXTINF:3.360000, +0001511.ts +#EXTINF:5.080000, +0001512.ts +#EXTINF:4.440000, +0001513.ts +#EXTINF:4.000000, +0001514.ts +#EXTINF:4.000000, +0001515.ts +#EXTINF:4.000000, +0001516.ts +#EXTINF:4.000000, +0001517.ts +#EXTINF:4.000000, +0001518.ts +#EXTINF:3.920000, +0001519.ts +#EXTINF:4.000000, +0001520.ts +#EXTINF:4.000000, +0001521.ts +#EXTINF:4.000000, +0001522.ts +#EXTINF:4.000000, +0001523.ts +#EXTINF:4.000000, +0001524.ts +#EXTINF:4.000000, +0001525.ts +#EXTINF:4.000000, +0001526.ts +#EXTINF:4.000000, +0001527.ts +#EXTINF:4.000000, +0001528.ts +#EXTINF:4.000000, +0001529.ts +#EXTINF:4.000000, +0001530.ts +#EXTINF:4.000000, +0001531.ts +#EXTINF:4.000000, +0001532.ts +#EXTINF:4.000000, +0001533.ts +#EXTINF:4.000000, +0001534.ts +#EXTINF:4.000000, +0001535.ts +#EXTINF:4.000000, +0001536.ts +#EXTINF:4.000000, +0001537.ts +#EXTINF:4.040000, +0001538.ts +#EXTINF:4.000000, +0001539.ts +#EXTINF:4.000000, +0001540.ts +#EXTINF:4.320000, +0001541.ts +#EXTINF:2.560000, +0001542.ts +#EXTINF:6.280000, +0001543.ts +#EXTINF:1.160000, +0001544.ts +#EXTINF:6.240000, +0001545.ts +#EXTINF:3.920000, +0001546.ts +#EXTINF:1.360000, +0001547.ts +#EXTINF:7.240000, +0001548.ts +#EXTINF:1.960000, +0001549.ts +#EXTINF:2.880000, +0001550.ts +#EXTINF:4.040000, +0001551.ts +#EXTINF:6.880000, +0001552.ts +#EXTINF:4.000000, +0001553.ts +#EXTINF:1.480000, +0001554.ts +#EXTINF:4.000000, +0001555.ts +#EXTINF:4.000000, +0001556.ts +#EXTINF:4.000000, +0001557.ts +#EXTINF:5.320000, +0001558.ts +#EXTINF:3.440000, +0001559.ts +#EXTINF:4.000000, +0001560.ts +#EXTINF:2.920000, +0001561.ts +#EXTINF:3.800000, +0001562.ts +#EXTINF:5.920000, +0001563.ts +#EXTINF:2.520000, +0001564.ts +#EXTINF:4.000000, +0001565.ts +#EXTINF:4.880000, +0001566.ts +#EXTINF:4.000000, +0001567.ts +#EXTINF:2.760000, +0001568.ts +#EXTINF:5.640000, +0001569.ts +#EXTINF:1.280000, +0001570.ts +#EXT-X-ENDLIST +``` +参数名 | 示例值 | 参数类型 | 参数描述 +--- | --- | --- | --- +list | - | Array | +list.vod_content | 简介: | String | +list.vod_id | http://www.8kvod.com/k/4200/ | String | +list.vod_name | 斗罗大陆 | String | +list.vod_pic | http://47.119.122.235:99/vod-8kvod-230512/20230512-5/ce539c364f0ff7fc456caab30708035e.jpg | String | +list.vod_remarks | 导演: | String | \ No newline at end of file diff --git a/doc/更新日志.md b/doc/更新日志.md index 57d01ee..daf7d35 100644 --- a/doc/更新日志.md +++ b/doc/更新日志.md @@ -1,3 +1,29 @@ +###### 2023/06/12 +- [X] 发布新版本,增加谷歌跨域设置说明。播放页手动增加&debug=1 这个参数可以实现强制嗅探(浏览器支持跨域的情况下手动调试使用) +```text +"C:\Program Files\Google\Chrome\Application\chrome.exe" --disable-site-isolation-trials --disable-web-security --disable-features=SameSiteByDefaultCookies,CookiesWithoutSameSiteMustBeSecure --user-data-dir=C:\Program Files\Google\Chrome\Application +``` + +###### 2023/06/09 +- [X] 发布新版本,增加上传源覆盖提示,增加在线编辑源功能(手机使用可能在此界面会卡死,推荐电脑) + +###### 2023/06/08 +- [X] 后台管理增加优选源功能。参考config.py进行配置优选源参数 +配置好优选源后在动态的在线配置链接ver=2后面添加参数 &sp=1 可以开启优选结果 +填写示例: +```text +腾云驾雾:腾讯&奇珍异兽:爱奇艺&百忙无果:芒果&优酷&哔哩影视&Alist +``` +说明,每个源按&分开,按:起别名。如果没:就按原名称显示。 + +###### 2023/06/07 +- [X] 后台管理增加p2p播放器 +- [X] 3.9.43beta1 drpy新增hostJs属性,可以用js动态捕捉网页根地址,下面是一个示例 +对应8K影视.js +```javascript +hostJs:'print(HOST);let html=request(HOST,{headers:{"User-Agent":PC_UA}});let src = jsp.pdfh(html,"ul&&li&&a&&href");print(src);HOST=src.replace("/index.php","")' +``` + ###### 2023/06/02 - [X] 3.9.42beta22 后台管理增加两套通用在线播放器地址 diff --git a/js/555影视[飞].js b/js/555影视[飞].js index 05e9285..59139b7 100644 --- a/js/555影视[飞].js +++ b/js/555影视[飞].js @@ -4,11 +4,8 @@ muban.mxpro.二级.desc = '.module-info-item:eq(-1)&&Text;;;.module-info-item-co var rule = { title:'555影视[飞]', 模板:'mxpro', - host:'https://zhenfanjixie.com', - // host:'https://www.555dy.vip', - // host:'https://www.555yy7.com', - // host:'https://www.555yy8.com', - // host:'https://www.555yy9.com', + host:'https://www.555dy.app', + hostJs:'print(HOST);let html=request(HOST,{headers:{"User-Agent":PC_UA}});let src=jsp.pdfh(html,".panel-box&&.row:eq(1)&&a&&href");print(src);HOST=src', url:'/vodshow/fyfilter.html', filterable:1,//是否启用分类筛选, filter_url:'{{fl.cateId}}-{{fl.area}}-{{fl.by}}-{{fl.class}}-{{fl.lang}}----fypage---{{fl.year}}', diff --git a/js/8K影视.js b/js/8K影视.js index 981e3c5..aa2e2b5 100644 --- a/js/8K影视.js +++ b/js/8K影视.js @@ -1,19 +1,17 @@ // 发布页 http://www.8kvod.com/ // 一级筛选 数字验证 -muban.首图.二级.title = 'h1&&Text;.data--span:eq(0)&&Text'; -muban.首图.二级.desc = '.score&&Text;;;.data:eq(1)--span&&Text;.data:eq(2)--span&&Text'; -muban.首图.二级.content = '.data:eq(3)--span&&Text'; +muban.mxone5.二级.title = 'h1&&Text;.video-info-aux&&Text'; +muban.mxone5.二级.desc = '.video-info-items:eq(5)&&Text;;;.video-info-actor:eq(1)&&Text;.video-info-actor:eq(0)&&Text'; var rule={ title:'8K影视', - 模板:'首图', + 模板:'mxone5', host:'http://www.8kvod.com', + hostJs:'print(HOST);let html=request(HOST,{headers:{"User-Agent":PC_UA}});let src = jsp.pdfh(html,"ul&&li&&a&&href");print(src);HOST=src.replace("/index.php","")', // host:'http://www.xn--45q.top', homeUrl:'/index.php', url:'/t/fyclass-fypage/', - // class_name:'电影&电视剧&动漫&综艺', - // class_url:'1&2&3&4', - class_parse: '.myui-header__menu&&li.col-md-2;a&&Text;a&&href;/(\\d+)', + class_name:'足球&篮球&网球&动作片&喜剧片&爱情片&科幻片&恐怖片&剧情片&战争片&惊悚片&犯罪片&冒险片&悬疑片&奇幻片&纪录片&动画片&其他片&国产剧&港台剧&日韩剧&欧美剧&海外剧&大陆综艺&港台综艺&国外综艺&歌曲MV&国产动漫&日本动漫&欧美动漫&其他动漫&早教&亲子&儿歌', + class_url:'53&54&55&6&7&8&9&10&11&12&48&49&50&51&52&28&29&31&13&14&15&16&20&21&22&23&39&24&25&26&27&44&45&46', searchUrl:'/vse**/page/fypage/', - lazy:'js:var url=jsp.pdfh(request(input),"iframe&&src");if(/hulihuli/.test(url)){input=url.replace(".m3u8","")}else if(/.m3u8|.mp4/.test(url)){input=url.match(/.*?=(.*?)&next/)[1]}else{input=url}', - 推荐: 'ul.myui-vodlist.clearfix;li.col-lg-8;a&&title;a&&data-original;.pic-text&&Text;a&&href', + 图片来源:'@Referer=http://www.xn--45q.top', } \ No newline at end of file diff --git a/js/AB影院[飞].jsd b/js/AB影院[飞].jsd deleted file mode 100644 index a20f4dc..0000000 --- a/js/AB影院[飞].jsd +++ /dev/null @@ -1,24 +0,0 @@ -// 一级筛选页面 数字验证 -// 搜索验证 -muban.首图2.二级.desc = '.data:eq(3)&&Text;;;.data--span:eq(1)&&Text;.data--span:eq(2)&&Text'; -muban.首图2.二级.content = '.stui-content__desc:eq(0)&&Text'; -muban.首图2.二级.tabs = '.stui-pannel__head h3'; -var rule = { - title:'AB影院[飞]', - 模板:'首图2', - host:'https://abu22.com', - // url:'/vodshow/fyclass--------fypage---.html', - url:'/vodtype/fyclass-fypage.html', - // url:'/vodshow/fyclassfyfilter.html', - // filterable:1,//是否启用分类筛选, - // filter_url:'-{{fl.area}}-{{fl.by}}------fypage---{{fl.year}}', - // filter: { - // "1":[{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"中国大陆","v":"中国大陆"},{"n":"中国香港","v":"中国香港"},{"n":" 中国台湾","v":"中国台湾"},{"n":"美国","v":"美国"},{"n":"韩国","v":"韩国"},{"n":"日本","v":"日本"},{"n":"法国","v":"法国"},{"n":"英国","v":"英国"},{"n":"德国","v":"德国"},{"n":"泰国","v":"泰国"},{"n":"印度","v":"印度"},{"n":"其他","v":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}], - // "2":[{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"中国大陆","v":"中国大陆"},{"n":"中国香港","v":"中国香港"},{"n":"中国台湾","v":"中国台湾"},{"n":"美国","v":"美国"},{"n":"韩国","v":"韩国"},{"n":"日本","v":"日本"},{"n":"法国","v":"法国"},{"n":"英国","v":"英国"},{"n":"德国","v":"德国"},{"n":"泰国","v":"泰国"},{"n":"印度","v":"印度"},{"n":"其他","v":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}], - // "3":[{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"中国大陆","v":"中国大陆"},{"n":"中国香港","v":"中国香港"},{"n":"中国台湾","v":"中国台湾"},{"n":"美国","v":"美国"},{"n":"韩国","v":"韩国"},{"n":"日本","v":"日本"},{"n":"法国","v":"法国"},{"n":"英国","v":"英国"},{"n":"德国","v":"德国"},{"n":"泰国","v":"泰国"},{"n":"印度","v":"印度"},{"n":"其他","v":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}], - // "4":[{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"中国大陆","v":"中国大陆"},{"n":"中国香港","v":"中国香港"},{"n":"中国台湾","v":"中国台湾"},{"n":"美国","v":"美国"},{"n":"韩国","v":"韩国"},{"n":"日本","v":"日本"},{"n":"法国","v":"法国"},{"n":"英国","v":"英国"},{"n":"德国","v":"德国"},{"n":"泰国","v":"泰国"},{"n":"印度","v":"印度"},{"n":"其他","v":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}] - // }, - lazy:"js:var html=JSON.parse(request(input).match(/r player_.*?=(.*?)/g,"$").replace(/\\n/g,"#"))});let vod_play_from=playSource.reverse().join("$$$");let vod_play_url=playUrl.reverse().join("$$$");VOD["vod_play_from"]=vod_play_from;VOD["vod_play_url"]=vod_play_url}catch(e){log("获取二级详情页发生错误:"+e.message)}', + detailUrl:'/v2/detail/fyid', + 搜索:'json:AniPreL;R动画名称;R封面图小;R新番标题;AID', } \ No newline at end of file diff --git a/js/B站影视.js b/js/B站影视.js index be43193..5502e02 100644 --- a/js/B站影视.js +++ b/js/B站影视.js @@ -1,7 +1,8 @@ // 搜索验证 var rule = { title:'B站影视', - host:'https://bzhanys.com', + // host:'https://bzhanys.com', + host:'https://bzhanyy.com', // url:'/index.php/vod/show/id/fyclass/page/fypage.html', url:'/index.php/vod/show/id/fyfilter.html', filterable:1,//是否启用分类筛选, @@ -25,7 +26,7 @@ var rule = { }, class_parse: '.fixed-nav&&.flex:lt(4);li&&Text;li&&data-id', play_parse:true, - lazy:"js:var html=JSON.parse(request(input).match(/r player_.*?=(.*?)0){let sort=MY_FL.sort||"T";let tags=Object.Values(MY_FL).join(",");if(MY_CATE==="movie"){selected_categories={"类型":MY_FL.类型||"","地区":MY_FL.地区||""}}else{selected_categories={"类型":MY_FL.类型||"","形式":MY_FL.类型?MY_FL.类型+"地区":"","地区":MY_FL.地区||""}}}else{let sort="T";let tags="";if(MY_CATE==="movie"){selected_categories={"类型":"","地区":""}}else{selected_categories={"类型":"","形式":"","地区":""}}}let params={tags:tags,sort:sort,refresh:0,selected_categories:stringify(selected_categories),start:(MY_PAGE-1)*count,count:count};let res=miniapp_request(path,params)}let result={page:MY_PAGE,pagecount:Math.ceil(res.total/count),limit:count,total:res.total};let items=[];if(/^rank_list|tv_hot|show_hot/.test(MY_CATE)){items=res["subject_collection_items"]}else if(MY_CATE==="interests"){res["interests"].forEach(function(it){items.push(it.subject)})}else{items=res.items}let lists=[];items.forEach(function(item){if(item.type==="movie"||item.type==="tv"){let rating=item.rating?item.rating.value:"";let rat_str=rating||"暂无评分";let title=item.title;let honor=item.honor_infos||[];let honor_str=honor.map(function(it){return it.title}).join("|");let vod_obj={vod_name:title!=="未知电影"?title:"暂不支持展示",vod_pic:item.pic.normal,vod_remarks:rat_str+" "+honor_str};let vod_obj_d={url:item.type+"$"+item.id,title:title!=="未知电影"?title:"暂不支持展示",pic_url:item.pic.normal,desc:rat_str+" "+honor_str};lists.push(vod_obj);d.push(vod_obj_d)}});result.list=lists;return result}catch(e){print(e.message)}return{}}let res=cate_filter(d);setResult2(res);', - 二级:'', - 搜索:'', -} \ No newline at end of file diff --git a/js/drpy.txt b/js/drpy.txt index c40b745..e3614d0 100644 --- a/js/drpy.txt +++ b/js/drpy.txt @@ -1 +1 @@ -{"showTime":89200000,"txt":"drpy 3.9.42beta23 -道长"} \ No newline at end of file +{"showTime":89200000,"txt":"drpy 3.9.43beta1 -道长"} \ No newline at end of file diff --git a/js/fositv.jsd b/js/fositv.jsd deleted file mode 100644 index 987eb2f..0000000 --- a/js/fositv.jsd +++ /dev/null @@ -1,39 +0,0 @@ -muban.首图.二级.title = '.text-fff&&Text;.myui-player__data p&&Text'; -muban.首图.二级.img = '.lazyload&&data-original'; -muban.首图.二级.desc = '.myui-player__data p&&Text;;;.text-collapse p:eq(1)&&Text;.text-collapse p:eq(0)&&Text'; -muban.首图.二级.content = '.data&&Text'; -var rule={ - title:'fositv', - 模板:'首图', - host:'https://fositv.com', - // url:'/fyclass-fypage.html', - // url:'/vod_________________________show/fyfilter.html', - url:'/vod______________________________show/fyfilter.html', - filterable:1,//是否启用分类筛选, - filter_url:'{{fl.cateId}}-{{fl.area}}-{{fl.by}}------fypage---{{fl.year}}', - filter:{ - "1":[{"key":"cateId","name":"类型","value":[{"n":"全部","v":"1"},{"n":"动作","v":"101"},{"n":"喜剧","v":"102"},{"n":"爱情","v":"103"},{"n":"科幻","v":"104"},{"n":"剧情","v":"105"},{"n":"悬疑","v":"106"},{"n":"惊悚","v":"107"},{"n":"恐怖","v":"108"},{"n":"犯罪","v":"109"},{"n":"谍战","v":"110"},{"n":"冒险","v":"111"},{"n":"奇幻","v":"112"},{"n":"灾难","v":"113"},{"n":"战争","v":"114"},{"n":"动画","v":"115"},{"n":"歌舞","v":"116"},{"n":"历史","v":"117"},{"n":"传记","v":"118"},{"n":"纪录","v":"119"},{"n":"其他","v":"120"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"中国大陆","v":"中国大陆"},{"n":"中国香港","v":"中国香港"},{"n":"中国台湾","v":"中国台湾"},{"n":"美国","v":"美国"},{"n":"韩国","v":"韩国"},{"n":"日本","v":"日本"},{"n":"法国","v":"法国"},{"n":"英国","v":"英国"},{"n":"德国","v":"德国"},{"n":"泰国","v":"泰国"},{"n":"印度","v":"印度"},{"n":"其他","v":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}], - "2":[{"key":"cateId","name":"类型","value":[{"n":"全部","v":"2"},{"n":"武侠","v":"201"},{"n":"喜剧","v":"202"},{"n":"爱情","v":"203"},{"n":"剧情","v":"204"},{"n":"青春","v":"205"},{"n":"悬疑","v":"206"},{"n":"科幻","v":"207"},{"n":"军事","v":"208"},{"n":"警匪","v":"209"},{"n":"谍战","v":"210"},{"n":"奇幻","v":"211"},{"n":"偶像","v":"212"},{"n":"年代","v":"213"},{"n":"乡村","v":"214"},{"n":"都市","v":"215"},{"n":"家庭","v":"216"},{"n":"古装","v":"217"},{"n":"历史","v":"218"},{"n":"神话","v":"219"},{"n":"其他","v":"220"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"中国大陆","v":"中国大陆"},{"n":"中国香港","v":"中国香港"},{"n":"中国台湾","v":"中国台湾"},{"n":"美国","v":"美国"},{"n":"韩国","v":"韩国"},{"n":"日本","v":"日本"},{"n":"法国","v":"法国"},{"n":"英国","v":"英国"},{"n":"德国","v":"德国"},{"n":"泰国","v":"泰国"},{"n":"印度","v":"印度"},{"n":"其他","v":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}], - "3":[{"key":"cateId","name":"类型","value":[{"n":"全部","v":"3"},{"n":"脱口秀","v":"301"},{"n":"真人秀","v":"302"},{"n":"搞笑","v":"303"},{"n":"访谈","v":"304"},{"n":"生活","v":"305"},{"n":"晚会","v":"306"},{"n":"美食","v":"307"},{"n":"游戏","v":"308"},{"n":"亲子","v":"309"},{"n":"旅游","v":"310"},{"n":"文化","v":"311"},{"n":"体育","v":"312"},{"n":"时尚","v":"313"},{"n":"纪实","v":"314"},{"n":"益智","v":"315"},{"n":"演艺","v":"316"},{"n":"歌舞","v":"317"},{"n":"音乐","v":"318"},{"n":"播报","v":"319"},{"n":"其他","v":"320"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"中国大陆","v":"中国大陆"},{"n":"中国香港","v":"中国香港"},{"n":"中国台湾","v":"中国台湾"},{"n":"美国","v":"美国"},{"n":"韩国","v":"韩国"},{"n":"日本","v":"日本"},{"n":"法国","v":"法国"},{"n":"英国","v":"英国"},{"n":"德国","v":"德国"},{"n":"泰国","v":"泰国"},{"n":"印度","v":"印度"},{"n":"其他","v":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}], - "4":[{"key":"cateId","name":"类型","value":[{"n":"全部","v":"4"},{"n":"热血","v":"401"},{"n":"格斗","v":"402"},{"n":"恋爱","v":"403"},{"n":"美少女","v":"404"},{"n":"校园","v":"405"},{"n":"搞笑","v":"406"},{"n":"LOLI","v":"407"},{"n":"神魔","v":"408"},{"n":"机战","v":"409"},{"n":"科幻","v":"410"},{"n":"真人","v":"411"},{"n":"青春","v":"412"},{"n":"魔法","v":"413"},{"n":"神话","v":"414"},{"n":"冒险","v":"415"},{"n":"运动","v":"416"},{"n":"竞技","v":"417"},{"n":"童话","v":"418"},{"n":"亲子","v":"419"},{"n":"教育","v":"420"},{"n":"励志","v":"421"},{"n":"剧情","v":"422"},{"n":"社会","v":"423"},{"n":"历史","v":"424"},{"n":"战争","v":"425"},{"n":"其他","v":"426"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"中国大陆","v":"中国大陆"},{"n":"中国香港","v":"中国香港"},{"n":"中国台湾","v":"中国台湾"},{"n":"美国","v":"美国"},{"n":"韩国","v":"韩国"},{"n":"日本","v":"日本"},{"n":"法国","v":"法国"},{"n":"英国","v":"英国"},{"n":"德国","v":"德国"},{"n":"泰国","v":"泰国"},{"n":"印度","v":"印度"},{"n":"其他","v":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}], - "5":[{"key":"cateId","name":"类型","value":[{"n":"全部","v":"5"},{"n":"人物","v":"501"},{"n":"军事","v":"502"},{"n":"历史","v":"503"},{"n":"自然","v":"504"},{"n":"探险","v":"505"},{"n":"科技","v":"506"},{"n":"文化","v":"507"},{"n":"刑侦","v":"508"},{"n":"社会","v":"509"},{"n":"旅游","v":"510"},{"n":"其他","v":"511"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"中国大陆","v":"中国大陆"},{"n":"中国香港","v":"中国香港"},{"n":"中国台湾","v":"中国台湾"},{"n":"美国","v":"美国"},{"n":"韩国","v":"韩国"},{"n":"日本","v":"日本"},{"n":"法国","v":"法国"},{"n":"英国","v":"英国"},{"n":"德国","v":"德国"},{"n":"泰国","v":"泰国"},{"n":"印度","v":"印度"},{"n":"其他","v":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}] - }, - filter_def:{ - 1:{cateId:'1'}, - 2:{cateId:'2'}, - 3:{cateId:'3'}, - 4:{cateId:'4'}, - 5:{cateId:'5'} - }, - // searchUrl:'/vod_________________________search/**----------fypage---.html', - searchUrl:'/vod______________________________search/**----------fypage---.html', - headers: { - 'User-Agent': 'PC_UA', - }, - // class_parse:'.myui-header__menu li.hidden-sm:gt(0):lt(6);a&&Text;a&&href;com/(.*?).html', - class_parse: '.myui-header__menu li.hidden-sm:gt(0):lt(6);a&&Text;a&&href;.*/(.*?).html', - lazy:"js:var html=JSON.parse(request(input).match(/r player_.*?=(.*?)10){real_url="https://player.buyaotou.xyz/?url="+url;d.saveParse(input,real_url);input=real_url}}catch(e){print("网络请求发生错误:"+e.message)}}', - lazy:'js:cacheUrl=getParse(input);if(cacheUrl){input=cacheUrl}else{try{let html=fetch(input,fetch_params);let ret=html.match(/var player_(.*?)=(.*?)10){real_url="https://player.buyaotou.xyz/?url="+url;saveParse(input,real_url);input=real_url}}catch(e){print("网络请求发生错误:"+e.message)}}', - limit:5, - 推荐:'ul.stui-vodlist.clearfix;li;a&&title;.lazyload&&data-original;.pic-text.text-right&&Text;a&&href', - double:true, // 推荐内容是否双层定位 - 一级:'body .stui-vodlist__box;a&&title;.lazyload&&data-original;.pic-text.text-right&&Text;a&&href', - 二级:{"title":"h1.title&&Text;.stui-content__detail p:eq(1)&&Text","img":".lazyload&&data-original","desc":".stui-content__detail p:eq(-3)&&Text;.stui-content__detail p:eq(-2)&&Text","content":".stui-content__detail p.detail&&Text","tabs":".stui-pannel__head ul li","lists":".stui-content__playlist:eq(#id) li"}, - // 搜索:'body .module-item;.module-card-item-title&&Text;.lazyload&&data-original;.module-item-note&&Text;a&&href;.module-info-item-content&&Text', -} diff --git a/js/城市影视.jsd b/js/城市影视.jsd deleted file mode 100644 index fb17968..0000000 --- a/js/城市影视.jsd +++ /dev/null @@ -1,255 +0,0 @@ -// 重复源 --> 城市电影.js -var rule = { - title: '城市影视', - host: 'https://www.citydy.com', - // homeUrl:'/', - url: '/show/id-fyclassfyfilter.html', - searchUrl: '/search/page/fypage/wd/**.html', - class_name:'电影&电视剧&综艺&动漫&纪录片', - class_url:'1&2&3&4&5', -filter_url:'{{fl.cateId}}{{fl.area}}{{fl.by}}{{fl.class}}/page/fypage{{fl.year}}', -filter: { -"1":[ - {"key":"class","name":"剧情","value":[ - {"n":"全部","v":""}, - {"n":"喜剧","v":"/class/喜剧"}, - {"n":"爱情","v":"/class/爱情"}, - {"n":"恐怖","v":"/class/恐怖"}, - {"n":"动作","v":"/class/动作"}, - {"n":"科幻","v":"/class/科幻"}, - {"n":"剧情","v":"/class/剧情"}, - {"n":"战争","v":"/class/战争"}, - {"n":"犯罪","v":"/class/犯罪"}, - {"n":"灾难","v":"/class/灾难"}, - {"n":"奇幻","v":"/class/奇幻"}, - {"n":"悬疑","v":"/class/悬疑"}, - {"n":"惊悚","v":"/class/惊悚"}, - {"n":"冒险","v":"/class/冒险"}]}, - - {"key":"area","name":"地区","value":[ - {"n":"全部","v":""}, - {"n":"大陆","v":"/area/大陆"}, - {"n":"香港","v":"/area/香港"}, - {"n":"台湾","v":"/area/台湾"}, - {"n":"美国","v":"/area/美国"}, - {"n":"法国","v":"/area/法国"}, - {"n":"英国","v":"/area/英国"}, - {"n":"日本","v":"/area/日本"}, - {"n":"韩国","v":"/area/韩国"}, - {"n":"德国","v":"/area/德国"}, - {"n":"泰国","v":"/area/泰国"}, - {"n":"印度","v":"/area/印度"}, - {"n":"其他","v":"/area/其他"}]}, - - {"key":"year","name":"年份","value":[ - {"n":"全部","v":""}, - {"n":"2023","v":"/year/2023"}, - {"n":"2022","v":"/year/2022"}, - {"n":"2021","v":"/year/2021"}, - {"n":"2020","v":"/year/2020"}, - {"n":"2019","v":"/year/2019"}, - {"n":"2018","v":"/year/2018"}, - {"n":"2017","v":"/year/2017"}, - {"n":"2016","v":"/year/2016"}, - {"n":"2008","v":"/year/2008"}, - {"n":"2000","v":"/year/2000"}, - {"n":"1997","v":"/year/1997"}]}, - - {"key":"by","name":"排序","value":[ - {"n":"全部","v":""}, - {"n":"时间","v":"/by/time"}, - {"n":"人气","v":"/by/hits"}, - {"n":"评分","v":"/by/score"}]}], - -"2":[ - {"key":"class","name":"剧情","value":[ - {"n":"全部","v":""}, - {"n":"古装","v":"/class/古装"}, - {"n":"战争","v":"/class/战争"}, - {"n":"偶像","v":"/class/偶像"}, - {"n":"犯罪","v":"/class/犯罪"}, - {"n":"奇幻","v":"/class/奇幻"}, - {"n":"剧情","v":"/class/剧情"}, - {"n":"历史","v":"/class/历史"}, - {"n":"网剧","v":"/class/网剧"}]}, - - {"key":"area","name":"地区","value":[ - {"n":"全部","v":""}, - {"n":"大陆","v":"/area/大陆"}, - {"n":"韩国","v":"/area/韩国"}, - {"n":"香港","v":"/area/香港"}, - {"n":"台湾","v":"/area/台湾"}, - {"n":"日本","v":"/area/日本"}, - {"n":"美国","v":"/area/美国"}, - {"n":"泰国","v":"/area/泰国"}, - {"n":"英国","v":"/area/英国"}, - {"n":"新加坡","v":"/area/新加坡"}, - {"n":"其他","v":"/area/其他"}]}, - - {"key":"year","name":"年份","value":[ - {"n":"全部","v":""}, - {"n":"2023","v":"/year/2023"}, - {"n":"2022","v":"/year/2022"}, - {"n":"2021","v":"/year/2021"}, - {"n":"2020","v":"/year/2020"}, - {"n":"2019","v":"/year/2019"}, - {"n":"2018","v":"/year/2018"}, - {"n":"2017","v":"/year/2017"}, - {"n":"2016","v":"/year/2016"}, - {"n":"2008","v":"/year/2008"}, - {"n":"2000","v":"/year/2000"}, - {"n":"1997","v":"/year/1997"}]}, - - {"key":"by","name":"排序","value":[ - {"n":"全部","v":""}, - {"n":"时间","v":"/by/time"}, - {"n":"人气","v":"/by/hits"}, - {"n":"评分","v":"/by/score"}]}], - -"3":[ - {"key":"class","name":"剧情","value":[ - {"n":"全部","v":""}, - {"n":"相声","v":"/class/相声"}, - {"n":"真人秀","v":"/class/真人秀"}, - {"n":"脱口秀","v":"/class/脱口秀"}, - {"n":"选秀","v":"/class/选秀"}, - {"n":"情感","v":"/class/情感"}, - {"n":"访谈","v":"/class/访谈"}, - {"n":"播报","v":"/class/播报"}, - {"n":"旅游","v":"/class/旅游"}, - {"n":"音乐","v":"/class/音乐"}, - {"n":"美食","v":"/class/美食"}, - {"n":"纪实","v":"/class/纪实"}, - {"n":"舞蹈","v":"/class/舞蹈"}]}, - - {"key":"area","name":"地区","value":[ - {"n":"全部","v":""}, - {"n":"大陆","v":"/area/大陆"}, - {"n":"香港","v":"/area/香港"}, - {"n":"台湾","v":"/area/台湾"}, - {"n":"日本","v":"/area/日本"}, - {"n":"欧美","v":"/area/欧美"}, - {"n":"韩国","v":"/area/韩国"}]}, - - {"key":"year","name":"年份","value":[ - {"n":"全部","v":""}, - {"n":"2023","v":"/year/2023"}, - {"n":"2022","v":"/year/2022"}, - {"n":"2021","v":"/year/2021"}, - {"n":"2020","v":"/year/2020"}, - {"n":"2019","v":"/year/2019"}, - {"n":"2018","v":"/year/2018"}, - {"n":"2017","v":"/year/2017"}, - {"n":"2016","v":"/year/2016"}, - {"n":"2008","v":"/year/2008"}, - {"n":"2000","v":"/year/2000"}, - {"n":"1997","v":"/year/1997"}]}, - - {"key":"by","name":"排序","value":[ - {"n":"全部","v":""}, - {"n":"时间","v":"/by/time"}, - {"n":"人气","v":"/by/hits"}, - {"n":"评分","v":"/by/score"}]}], - -"4":[ - {"key":"class","name":"剧情","value":[ - {"n":"全部","v":""}, - {"n":"科幻","v":"/class/科幻"}, - {"n":"热血","v":"/class/热血"}, - {"n":"推理","v":"/class/推理"}, - {"n":"搞笑","v":"/class/搞笑"}, - {"n":"冒险","v":"/class/冒险"}, - {"n":"萝莉","v":"/class/萝莉"}, - {"n":"校园","v":"/class/校园"}, - {"n":"动作","v":"/class/动作"}, - {"n":"机战","v":"/class/机战"}, - {"n":"运动","v":"/class/运动"}, - {"n":"战争","v":"/class/战争"}, - {"n":"少年","v":"/class/少年"}, - {"n":"少女","v":"/class/少女"}]}, - - {"key":"area","name":"地区","value":[ - {"n":"全部","v":""}, - {"n":"大陆","v":"/area/大陆"}, - {"n":"日本","v":"/area/日本"}, - {"n":"欧美","v":"/area/欧美"}, - {"n":"海外","v":"/area/海外"}]}, - - {"key":"year","name":"年份","value":[ - {"n":"全部","v":""}, - {"n":"2023","v":"/year/2023"}, - {"n":"2022","v":"/year/2022"}, - {"n":"2021","v":"/year/2021"}, - {"n":"2020","v":"/year/2020"}, - {"n":"2019","v":"/year/2019"}, - {"n":"2018","v":"/year/2018"}, - {"n":"2017","v":"/year/2017"}, - {"n":"2016","v":"/year/2016"}, - {"n":"2008","v":"/year/2008"}, - {"n":"2000","v":"/year/2000"}, - {"n":"1997","v":"/year/1997"}]}, - - {"key":"by","name":"排序","value":[ - {"n":"全部","v":""}, - {"n":"时间","v":"/by/time"}, - {"n":"人气","v":"/by/hits"}, - {"n":"评分","v":"/by/score"}]}], - -"5":[ - {"key":"class","name":"剧情","value":[ - {"n":"全部","v":""}, - {"n":"历史","v":"/class/历史"}, - {"n":"传记","v":"/class/传记"}, - {"n":"生活","v":"/class/生活"}, - {"n":"人文","v":"/class/人文"}, - {"n":"地理","v":"/class/地理"}, - {"n":"舞台","v":"/class/舞台"}, - {"n":"专题","v":"/class/专题"}, - {"n":"时事","v":"/class/时事"}, - {"n":"宣传","v":"/class/宣传"}]}, - - {"key":"area","name":"地区","value":[ - {"n":"全部","v":""}, - {"n":"大陆","v":"/area/大陆"}, - {"n":"香港","v":"/area/香港"}, - {"n":"台湾","v":"/area/台湾"}, - {"n":"日本","v":"/area/日本"}, - {"n":"欧美","v":"/area/欧美"}]}, - - {"key":"year","name":"年份","value":[ - {"n":"全部","v":""}, - {"n":"2023","v":"/year/2023"}, - {"n":"2022","v":"/year/2022"}, - {"n":"2021","v":"/year/2021"}, - {"n":"2020","v":"/year/2020"}, - {"n":"2019","v":"/year/2019"}, - {"n":"2018","v":"/year/2018"}, - {"n":"2017","v":"/year/2017"}, - {"n":"2016","v":"/year/2016"}, - {"n":"2008","v":"/year/2008"}, - {"n":"2000","v":"/year/2000"}, - {"n":"1997","v":"/year/1997"}]}, - - {"key":"by","name":"排序","value":[ - {"n":"全部","v":""}, - {"n":"时间","v":"/by/time"}, - {"n":"人气","v":"/by/hits"}, - {"n":"评分","v":"/by/score"}]}]}, - - - searchable: 2,//是否启用全局搜索, - quickSearch: 0,//是否启用快速搜索, - filterable: 0,//是否启用分类筛选, - headers: {//网站的请求头,完整支持所有的,常带ua和cookies - 'User-Agent': 'MOBILE_UA', - // "Cookie": "searchneed=ok" - }, - play_parse: true,//播放是否解析 - lazy: '',//是否免嗅探 - limit: 6, - 推荐:'ul.img-list;li;a&&title;.lazyload&&data-original;.text-right&&Text;a&&href', - double:true, // 推荐内容是否双层定位 - 一级:'.img-list li;a&&title;.lazyload&&data-original;.text-right&&Text;a&&href', - 二级:{"title":"h1&&Text;.t-muted:eq(-1)&&Text","img":".lazyload&&data-original","desc":";;.vod-detail-info&&ul&&li:eq(2)&&Text;.vod-detail-info&&ul&&li:eq(3)&&Text;.vod-detail-info&&ul&&li:eq(4)&&Text","content":".vod-detail-info&&ul&&li:eq(10)&&Text","tabs":".details-play-nav li","lists":".play-list.fade-in:eq(#id) li"}, - 搜索:'.img-list li;a&&title;*;.title.text-center&&Text;a&&href;.text-muted:eq(-1)&&Text', - } diff --git a/js/城市电影.js b/js/城市电影.js index cfbe21d..306e13b 100644 --- a/js/城市电影.js +++ b/js/城市电影.js @@ -1,26 +1,27 @@ -var rule = { - title: '城市电影', - host: 'https://www.citydy.com', - // homeUrl:'/', - // url: '/show/id-fyclass/page/fypage.html', - url: '/show/id-fyclassfyfilter.html', - searchUrl: '/search/page/fypage/wd/**.html', - class_name:'电影&电视剧&综艺&动漫&纪录片', - class_url:'1&2&3&4&5', - searchable: 2,//是否启用全局搜索, - quickSearch: 0,//是否启用快速搜索, - filterable: 1,//是否启用分类筛选, - filter_url:'{{fl.area}}{{fl.by}}{{fl.class}}/page/fypage{{fl.year}}', - filter: {"1":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"喜剧","v":"/class/喜剧"},{"n":"爱情","v":"/class/爱情"},{"n":"恐怖","v":"/class/恐怖"},{"n":"动作","v":"/class/动作"},{"n":"科幻","v":"/class/科幻"},{"n":"剧情","v":"/class/剧情"},{"n":"战争","v":"/class/战争"},{"n":"犯罪","v":"/class/犯罪"},{"n":"灾难","v":"/class/灾难"},{"n":"奇幻","v":"/class/奇幻"},{"n":"悬疑","v":"/class/悬疑"},{"n":"惊悚","v":"/class/惊悚"},{"n":"冒险","v":"/class/冒险"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"/area/大陆"},{"n":"香港","v":"/area/香港"},{"n":"台湾","v":"/area/台湾"},{"n":"美国","v":"/area/美国"},{"n":"法国","v":"/area/法国"},{"n":"英国","v":"/area/英国"},{"n":"日本","v":"/area/日本"},{"n":"韩国","v":"/area/韩国"},{"n":"德国","v":"/area/德国"},{"n":"泰国","v":"/area/泰国"},{"n":"印度","v":"/area/印度"},{"n":"其他","v":"/area/其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2008","v":"/year/2008"},{"n":"2000","v":"/year/2000"},{"n":"1997","v":"/year/1997"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],"2":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"古装","v":"/class/古装"},{"n":"战争","v":"/class/战争"},{"n":"偶像","v":"/class/偶像"},{"n":"犯罪","v":"/class/犯罪"},{"n":"奇幻","v":"/class/奇幻"},{"n":"剧情","v":"/class/剧情"},{"n":"历史","v":"/class/历史"},{"n":"网剧","v":"/class/网剧"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"/area/大陆"},{"n":"韩国","v":"/area/韩国"},{"n":"香港","v":"/area/香港"},{"n":"台湾","v":"/area/台湾"},{"n":"日本","v":"/area/日本"},{"n":"美国","v":"/area/美国"},{"n":"泰国","v":"/area/泰国"},{"n":"英国","v":"/area/英国"},{"n":"新加坡","v":"/area/新加坡"},{"n":"其他","v":"/area/其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2008","v":"/year/2008"},{"n":"2000","v":"/year/2000"},{"n":"1997","v":"/year/1997"},{"n":"1980","v":"/year/1980"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],"3":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"相声","v":"/class/相声"},{"n":"真人秀","v":"/class/真人秀"},{"n":"脱口秀","v":"/class/脱口秀"},{"n":"选秀","v":"/class/选秀"},{"n":"情感","v":"/class/情感"},{"n":"访谈","v":"/class/访谈"},{"n":"播报","v":"/class/播报"},{"n":"旅游","v":"/class/旅游"},{"n":"音乐","v":"/class/音乐"},{"n":"美食","v":"/class/美食"},{"n":"纪实","v":"/class/纪实"},{"n":"舞蹈","v":"/class/舞蹈"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"/area/大陆"},{"n":"香港","v":"/area/香港"},{"n":"台湾","v":"/area/台湾"},{"n":"日本","v":"/area/日本"},{"n":"欧美","v":"/area/欧美"},{"n":"韩国","v":"/area/韩国"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2008","v":"/year/2008"},{"n":"2000","v":"/year/2000"},{"n":"1997","v":"/year/1997"},{"n":"1980","v":"/year/1980"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],"4":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"科幻","v":"/class/科幻"},{"n":"热血","v":"/class/热血"},{"n":"推理","v":"/class/推理"},{"n":"搞笑","v":"/class/搞笑"},{"n":"冒险","v":"/class/冒险"},{"n":"萝莉","v":"/class/萝莉"},{"n":"校园","v":"/class/校园"},{"n":"动作","v":"/class/动作"},{"n":"机战","v":"/class/机战"},{"n":"运动","v":"/class/运动"},{"n":"战争","v":"/class/战争"},{"n":"少年","v":"/class/少年"},{"n":"少女","v":"/class/少女"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"/area/大陆"},{"n":"日本","v":"/area/日本"},{"n":"欧美","v":"/area/欧美"},{"n":"海外","v":"/area/海外"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2008","v":"/year/2008"},{"n":"2000","v":"/year/2000"},{"n":"1997","v":"/year/1997"},{"n":"1980","v":"/year/1980"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],"5":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"历史","v":"/class/历史"},{"n":"传记","v":"/class/传记"},{"n":"生活","v":"/class/生活"},{"n":"人文","v":"/class/人文"},{"n":"地理","v":"/class/地理"},{"n":"舞台","v":"/class/舞台"},{"n":"专题","v":"/class/专题"},{"n":"时事","v":"/class/时事"},{"n":"宣传","v":"/class/宣传"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"/area/大陆"},{"n":"香港","v":"/area/香港"},{"n":"台湾","v":"/area/台湾"},{"n":"日本","v":"/area/日本"},{"n":"欧美","v":"/area/欧美"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2008","v":"/year/2008"},{"n":"2000","v":"/year/2000"},{"n":"1997","v":"/year/1997"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}]}, - headers: {//网站的请求头,完整支持所有的,常带ua和cookies - 'User-Agent': 'MOBILE_UA', - }, - play_parse: true,//播放是否解析 - lazy: '',//是否免嗅探 - limit: 6, - 推荐:'ul.img-list;li;a&&title;.lazyload&&data-original;.text-right&&Text;a&&href', - double:true, // 推荐内容是否双层定位 - 一级:'.img-list li;a&&title;.lazyload&&data-original;.text-right&&Text;a&&href', - 二级:{"title":"h1&&Text;.t-muted:eq(-1)&&Text","img":".lazyload&&data-original","desc":";;.vod-detail-info&&ul&&li:eq(2)&&Text;.vod-detail-info&&ul&&li:eq(3)&&Text;.vod-detail-info&&ul&&li:eq(4)&&Text","content":".vod-detail-info&&ul&&li:eq(10)&&Text","tabs":".details-play-nav li","lists":".play-list.fade-in:eq(#id) li"}, - 搜索:'.img-list li;a&&title;*;.title.text-center&&Text;a&&href;.text-muted:eq(-1)&&Text', +muban.首图2.二级.title = 'h1&&Text;.data:eq(0)&&Text'; +muban.首图2.二级.desc = '.data:eq(1)&&Text;;;.data:eq(6)&&Text;.data:eq(5)&&Text'; +muban.首图2.二级.content = '.detail-content&&Text'; +muban.首图2.二级.tabs = '.nav-tabs&&li'; +var rule = { + title:'城市电影', + 模板:'首图2', + host:'https://www.citydy.com', + // url:'/show/id-fyclass/page/fypage.html', + url:'/show/id-fyclassfyfilter.html', + filterable:1, + filter_url:'{{fl.area}}{{fl.by}}{{fl.class}}{{fl.lang}}{{fl.letter}}/page/fypage{{fl.year}}', + filter: { + "1":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"喜剧","v":"/class/喜剧"},{"n":"爱情","v":"/class/爱情"},{"n":"恐怖","v":"/class/恐怖"},{"n":"动作","v":"/class/动作"},{"n":"科幻","v":"/class/科幻"},{"n":"剧情","v":"/class/剧情"},{"n":"战争","v":"/class/战争"},{"n":"犯罪","v":"/class/犯罪"},{"n":"灾难","v":"/class/灾难"},{"n":"奇幻","v":"/class/奇幻"},{"n":"悬疑","v":"/class/悬疑"},{"n":"惊悚","v":"/class/惊悚"},{"n":"冒险","v":"/class/冒险"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"/area/大陆"},{"n":"香港","v":"/area/香港"},{"n":"台湾","v":"/area/台湾"},{"n":"美国","v":"/area/美国"},{"n":"法国","v":"/area/法国"},{"n":"英国","v":"/area/英国"},{"n":"日本","v":"/area/日本"},{"n":"韩国","v":"/area/韩国"},{"n":"德国","v":"/area/德国"},{"n":"泰国","v":"/area/泰国"},{"n":"印度","v":"/area/印度"},{"n":"其他","v":"/area/其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2008","v":"/year/2008"},{"n":"2000","v":"/year/2000"},{"n":"1997","v":"/year/1997"},{"n":"1980","v":"/year/1980"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"普通话","v":"/lang/普通话"},{"n":"英语","v":"/lang/英语"},{"n":"粤语","v":"/lang/粤语"},{"n":"闽南语","v":"/lang/闽南语"},{"n":"韩语","v":"/lang/韩语"},{"n":"日语","v":"/lang/日语"},{"n":"法语","v":"/lang/法语"},{"n":"德语","v":"/lang/德语"},{"n":"其它","v":"/lang/其它"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}], + "2":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"古装","v":"/class/古装"},{"n":"战争","v":"/class/战争"},{"n":"偶像","v":"/class/偶像"},{"n":"犯罪","v":"/class/犯罪"},{"n":"奇幻","v":"/class/奇幻"},{"n":"剧情","v":"/class/剧情"},{"n":"历史","v":"/class/历史"},{"n":"网剧","v":"/class/网剧"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"/area/大陆"},{"n":"香港","v":"/area/香港"},{"n":"台湾","v":"/area/台湾"},{"n":"美国","v":"/area/美国"},{"n":"法国","v":"/area/法国"},{"n":"英国","v":"/area/英国"},{"n":"日本","v":"/area/日本"},{"n":"韩国","v":"/area/韩国"},{"n":"德国","v":"/area/德国"},{"n":"泰国","v":"/area/泰国"},{"n":"印度","v":"/area/印度"},{"n":"其他","v":"/area/其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2008","v":"/year/2008"},{"n":"2000","v":"/year/2000"},{"n":"1997","v":"/year/1997"},{"n":"1980","v":"/year/1980"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"普通话","v":"/lang/普通话"},{"n":"英语","v":"/lang/英语"},{"n":"粤语","v":"/lang/粤语"},{"n":"闽南语","v":"/lang/闽南语"},{"n":"韩语","v":"/lang/韩语"},{"n":"日语","v":"/lang/日语"},{"n":"法语","v":"/lang/法语"},{"n":"德语","v":"/lang/德语"},{"n":"其它","v":"/lang/其它"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}], + "3":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"相声","v":"/class/相声"},{"n":"真人秀","v":"/class/真人秀"},{"n":"脱口秀","v":"/class/脱口秀"},{"n":"选秀","v":"/class/选秀"},{"n":"情感","v":"/class/情感"},{"n":"访谈","v":"/class/访谈"},{"n":"播报","v":"/class/播报"},{"n":"旅游","v":"/class/旅游"},{"n":"音乐","v":"/class/音乐"},{"n":"美食","v":"/class/美食"},{"n":"纪实","v":"/class/纪实"},{"n":"舞蹈","v":"/class/舞蹈"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"/area/大陆"},{"n":"香港","v":"/area/香港"},{"n":"台湾","v":"/area/台湾"},{"n":"日本","v":"/area/日本"},{"n":"欧美","v":"/area/欧美"},{"n":"韩国","v":"/area/韩国"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2008","v":"/year/2008"},{"n":"2000","v":"/year/2000"},{"n":"1997","v":"/year/1997"},{"n":"1980","v":"/year/1980"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"普通话","v":"/lang/普通话"},{"n":"粤语","v":"/lang/粤语"},{"n":"英语","v":"/lang/英语"},{"n":"闽南语","v":"/lang/闽南语"},{"n":"韩语","v":"/lang/韩语"},{"n":"日语","v":"/lang/日语"},{"n":"其它","v":"/lang/其它"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}], + "4":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"科幻","v":"/class/科幻"},{"n":"热血","v":"/class/热血"},{"n":"推理","v":"/class/推理"},{"n":"搞笑","v":"/class/搞笑"},{"n":"冒险","v":"/class/冒险"},{"n":"萝莉","v":"/class/萝莉"},{"n":"校园","v":"/class/校园"},{"n":"动作","v":"/class/动作"},{"n":"机战","v":"/class/机战"},{"n":"运动","v":"/class/运动"},{"n":"战争","v":"/class/战争"},{"n":"少年","v":"/class/少年"},{"n":"少女","v":"/class/少女"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"/area/大陆"},{"n":"香港","v":"/area/香港"},{"n":"台湾","v":"/area/台湾"},{"n":"日本","v":"/area/日本"},{"n":"欧美","v":"/area/欧美"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2008","v":"/year/2008"},{"n":"2000","v":"/year/2000"},{"n":"1997","v":"/year/1997"},{"n":"1980","v":"/year/1980"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"普通话","v":"/lang/普通话"},{"n":"英语","v":"/lang/英语"},{"n":"粤语","v":"/lang/粤语"},{"n":"闽南语","v":"/lang/闽南语"},{"n":"韩语","v":"/lang/韩语"},{"n":"日语","v":"/lang/日语"},{"n":"法语","v":"/lang/法语"},{"n":"德语","v":"/lang/德语"},{"n":"其它","v":"/lang/其它"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}], + "5":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"历史","v":"/class/历史"},{"n":"传记","v":"/class/传记"},{"n":"生活","v":"/class/生活"},{"n":"人文","v":"/class/人文"},{"n":"地理","v":"/class/地理"},{"n":"舞台","v":"/class/舞台"},{"n":"专题","v":"/class/专题"},{"n":"时事","v":"/class/时事"},{"n":"宣传","v":"/class/宣传"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"/area/大陆"},{"n":"香港","v":"/area/香港"},{"n":"台湾","v":"/area/台湾"},{"n":"美国","v":"/area/美国"},{"n":"法国","v":"/area/法国"},{"n":"英国","v":"/area/英国"},{"n":"日本","v":"/area/日本"},{"n":"韩国","v":"/area/韩国"},{"n":"德国","v":"/area/德国"},{"n":"泰国","v":"/area/泰国"},{"n":"印度","v":"/area/印度"},{"n":"其他","v":"/area/其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2008","v":"/year/2008"},{"n":"2000","v":"/year/2000"},{"n":"1997","v":"/year/1997"},{"n":"1980","v":"/year/1980"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"普通话","v":"/lang/普通话"},{"n":"英语","v":"/lang/英语"},{"n":"粤语","v":"/lang/粤语"},{"n":"闽南语","v":"/lang/闽南语"},{"n":"韩语","v":"/lang/韩语"},{"n":"日语","v":"/lang/日语"},{"n":"法语","v":"/lang/法语"},{"n":"德语","v":"/lang/德语"},{"n":"其它","v":"/lang/其它"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}], + "6":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"科幻","v":"/class/科幻"},{"n":"热血","v":"/class/热血"},{"n":"推理","v":"/class/推理"},{"n":"搞笑","v":"/class/搞笑"},{"n":"冒险","v":"/class/冒险"},{"n":"萝莉","v":"/class/萝莉"},{"n":"校园","v":"/class/校园"},{"n":"动作","v":"/class/动作"},{"n":"机战","v":"/class/机战"},{"n":"运动","v":"/class/运动"},{"n":"战争","v":"/class/战争"},{"n":"少年","v":"/class/少年"},{"n":"少女","v":"/class/少女"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"/area/大陆"},{"n":"韩国","v":"/area/韩国"},{"n":"香港","v":"/area/香港"},{"n":"台湾","v":"/area/台湾"},{"n":"日本","v":"/area/日本"},{"n":"美国","v":"/area/美国"},{"n":"泰国","v":"/area/泰国"},{"n":"英国","v":"/area/英国"},{"n":"新加坡","v":"/area/新加坡"},{"n":"其他","v":"/area/其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2008","v":"/year/2008"},{"n":"2000","v":"/year/2000"},{"n":"1997","v":"/year/1997"},{"n":"1980","v":"/year/1980"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"普通话","v":"/lang/普通话"},{"n":"英语","v":"/lang/英语"},{"n":"粤语","v":"/lang/粤语"},{"n":"闽南语","v":"/lang/闽南语"},{"n":"韩语","v":"/lang/韩语"},{"n":"日语","v":"/lang/日语"},{"n":"法语","v":"/lang/法语"},{"n":"德语","v":"/lang/德语"},{"n":"其它","v":"/lang/其它"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}] + }, + class_parse: 'ul.dropdown&&li:gt(0):lt(7);a&&Text;a&&href;.*/.*(\\d+).html', + lazy:"js:var html=JSON.parse(request(input).match(/r player_.*?=(.*?){playFrom.push(pdfh(it,"a&&Text"))});playFrom.forEach((it,idex)=>{let new_vod_list=[];let vodList=[];let turl=input;if(idex>0){turl=pd(tabs[idex],"a&&href")}try{vodList=pdfa(request(turl),"#playlist&&a")}catch(e){}vodList.forEach((it)=>{let burl=pd(it,"a&&href");let btitle=pdfh(it,"body&&Text").replace(/.*?(\\d+).*/,"$1").replace("第","").replace("期","");new_vod_list.push(btitle+"$"+burl)});let vlist=new_vod_list.join("#");vod_tab_list.push(vlist)});VOD.vod_play_from=playFrom.join("$$$");VOD.vod_play_url=vod_tab_list.join("$$$");', - 搜索:'js:var d=[];let jo=JSON.parse(fetch(input));jo.forEach((it)=>{d.push({title:it.novel.name,img:"https://m.ysts.cc"+it.novel.cover,desc:"❤️"+it.data.allvisit,url:"https://www.ysts5.com"+it.novel.url})});setResult(d);', -} \ No newline at end of file diff --git a/js/欧乐影院[飞].js b/js/欧乐影院[飞].js index 14986d1..4be33af 100644 --- a/js/欧乐影院[飞].js +++ b/js/欧乐影院[飞].js @@ -1,7 +1,18 @@ /* 播放器要改为EXO --> "playerType":2 可参考底下配置: -{"key":"dr_欧乐影院[飞]","name":"欧乐影院[飞](drpy)","type":3,"api":"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/drpy2.min.js","searchable":2,"quickSearch":0,"filterable":1,"ext":"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/js/欧乐影院[飞].js","playerType":2}, +{ + "key":"dr_欧乐影院[飞]", + "name":"欧乐影院[飞](drpy)", + "type":3, + "api":"https://ghproxy.liuzhicong.com/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/drpy2.min.js", + "searchable":2, + "quickSearch":0, + "filterable":1, + "ext":"https://ghproxy.liuzhicong.com/https://raw.githubusercontent.com/hjdhnx/dr_py/main/js/欧乐影院[飞].js", + "playerType":2 +}, + */ var rule = { @@ -16,14 +27,20 @@ var rule = { "2":[{"key":"cateId","name":"分类","value":[{"n":"全部","v":"2"},{"n":"国产剧","v":"202"},{"n":"欧美剧","v":"201"},{"n":"港台剧","v":"203"},{"n":"日韩剧","v":"204"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"/area/大陆"},{"n":"香港","v":"/area/香港"},{"n":"台湾","v":"/area/台湾"},{"n":"美国","v":"/area/美国"},{"n":"韩国","v":"/area/韩国"},{"n":"日本","v":"/area/日本"},{"n":"印度","v":"/area/印度"},{"n":"英国","v":"/area/英国"},{"n":"法国","v":"/area/法国"},{"n":"加拿大","v":"/area/加拿大"},{"n":"西班牙","v":"/area/西班牙"},{"n":"俄罗斯","v":"/area/俄罗斯"},{"n":"意大利","v":"/area/意大利"},{"n":"泰国","v":"/area/泰国"},{"n":"新加坡","v":"/area/新加坡"},{"n":"马来西亚","v":"/area/马来西亚"},{"n":"其它","v":"/area/其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"},{"n":"2004","v":"/year/2004"},{"n":"2003","v":"/year/2003"},{"n":"2002","v":"/year/2002"},{"n":"2001","v":"/year/2001"},{"n":"2000","v":"/year/2000"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"/lang/国语"},{"n":"英语","v":"/lang/英语"},{"n":"粤语","v":"/lang/粤语"},{"n":"西语","v":"/lang/西语"},{"n":"韩语","v":"/lang/韩语"},{"n":"日语","v":"/lang/日语"},{"n":"法语","v":"/lang/法语"},{"n":"俄语","v":"/lang/俄语"},{"n":"意大利语","v":"/lang/意大利语"},{"n":"德语","v":"/lang/德语"},{"n":"印地语","v":"/lang/印地语"},{"n":"其它","v":"/lang/其它"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"/letter/A"},{"n":"B","v":"/letter/B"},{"n":"C","v":"/letter/C"},{"n":"D","v":"/letter/D"},{"n":"E","v":"/letter/E"},{"n":"F","v":"/letter/F"},{"n":"G","v":"/letter/G"},{"n":"H","v":"/letter/H"},{"n":"I","v":"/letter/I"},{"n":"J","v":"/letter/J"},{"n":"K","v":"/letter/K"},{"n":"L","v":"/letter/L"},{"n":"M","v":"/letter/M"},{"n":"N","v":"/letter/N"},{"n":"O","v":"/letter/O"},{"n":"P","v":"/letter/P"},{"n":"Q","v":"/letter/Q"},{"n":"R","v":"/letter/R"},{"n":"S","v":"/letter/S"},{"n":"T","v":"/letter/T"},{"n":"U","v":"/letter/U"},{"n":"V","v":"/letter/V"},{"n":"W","v":"/letter/W"},{"n":"X","v":"/letter/X"},{"n":"Y","v":"/letter/Y"},{"n":"Z","v":"/letter/Z"},{"n":"0-9","v":"/letter/0-9"}]},{"key":"by","name":"排序","value":[{"n":"按最新","v":"/by/time"},{"n":"按添加","v":"/by/time_add"},{"n":"按最热","v":"/by/hits"},{"n":"按评分","v":"/by/score"}]}], "3":[{"key":"cateId","name":"分类","value":[{"n":"全部","v":"3"},{"n":"真人秀","v":"305"},{"n":"音乐","v":"302"},{"n":"搞笑","v":"304"},{"n":"家庭","v":"301"},{"n":"曲艺","v":"303"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"/area/大陆"},{"n":"香港","v":"/area/香港"},{"n":"台湾","v":"/area/台湾"},{"n":"美国","v":"/area/美国"},{"n":"韩国","v":"/area/韩国"},{"n":"日本","v":"/area/日本"},{"n":"印度","v":"/area/印度"},{"n":"英国","v":"/area/英国"},{"n":"法国","v":"/area/法国"},{"n":"加拿大","v":"/area/加拿大"},{"n":"西班牙","v":"/area/西班牙"},{"n":"俄罗斯","v":"/area/俄罗斯"},{"n":"意大利","v":"/area/意大利"},{"n":"泰国","v":"/area/泰国"},{"n":"新加坡","v":"/area/新加坡"},{"n":"马来西亚","v":"/area/马来西亚"},{"n":"其它","v":"/area/其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"},{"n":"2004","v":"/year/2004"},{"n":"2003","v":"/year/2003"},{"n":"2002","v":"/year/2002"},{"n":"2001","v":"/year/2001"},{"n":"2000","v":"/year/2000"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"/lang/国语"},{"n":"英语","v":"/lang/英语"},{"n":"粤语","v":"/lang/粤语"},{"n":"西语","v":"/lang/西语"},{"n":"韩语","v":"/lang/韩语"},{"n":"日语","v":"/lang/日语"},{"n":"法语","v":"/lang/法语"},{"n":"俄语","v":"/lang/俄语"},{"n":"意大利语","v":"/lang/意大利语"},{"n":"德语","v":"/lang/德语"},{"n":"印地语","v":"/lang/印地语"},{"n":"其它","v":"/lang/其它"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"/letter/A"},{"n":"B","v":"/letter/B"},{"n":"C","v":"/letter/C"},{"n":"D","v":"/letter/D"},{"n":"E","v":"/letter/E"},{"n":"F","v":"/letter/F"},{"n":"G","v":"/letter/G"},{"n":"H","v":"/letter/H"},{"n":"I","v":"/letter/I"},{"n":"J","v":"/letter/J"},{"n":"K","v":"/letter/K"},{"n":"L","v":"/letter/L"},{"n":"M","v":"/letter/M"},{"n":"N","v":"/letter/N"},{"n":"O","v":"/letter/O"},{"n":"P","v":"/letter/P"},{"n":"Q","v":"/letter/Q"},{"n":"R","v":"/letter/R"},{"n":"S","v":"/letter/S"},{"n":"T","v":"/letter/T"},{"n":"U","v":"/letter/U"},{"n":"V","v":"/letter/V"},{"n":"W","v":"/letter/W"},{"n":"X","v":"/letter/X"},{"n":"Y","v":"/letter/Y"},{"n":"Z","v":"/letter/Z"},{"n":"0-9","v":"/letter/0-9"}]},{"key":"by","name":"排序","value":[{"n":"按最新","v":"/by/time"},{"n":"按添加","v":"/by/time_add"},{"n":"按最热","v":"/by/hits"},{"n":"按评分","v":"/by/score"}]}], "4":[{"key":"cateId","name":"分类","value":[{"n":"全部","v":"4"},{"n":"日本","v":"401"},{"n":"国产","v":"402"},{"n":"欧美","v":"403"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"/area/大陆"},{"n":"香港","v":"/area/香港"},{"n":"台湾","v":"/area/台湾"},{"n":"美国","v":"/area/美国"},{"n":"韩国","v":"/area/韩国"},{"n":"日本","v":"/area/日本"},{"n":"印度","v":"/area/印度"},{"n":"英国","v":"/area/英国"},{"n":"法国","v":"/area/法国"},{"n":"加拿大","v":"/area/加拿大"},{"n":"西班牙","v":"/area/西班牙"},{"n":"俄罗斯","v":"/area/俄罗斯"},{"n":"意大利","v":"/area/意大利"},{"n":"泰国","v":"/area/泰国"},{"n":"新加坡","v":"/area/新加坡"},{"n":"马来西亚","v":"/area/马来西亚"},{"n":"其它","v":"/area/其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"},{"n":"2004","v":"/year/2004"},{"n":"2003","v":"/year/2003"},{"n":"2002","v":"/year/2002"},{"n":"2001","v":"/year/2001"},{"n":"2000","v":"/year/2000"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"/lang/国语"},{"n":"英语","v":"/lang/英语"},{"n":"粤语","v":"/lang/粤语"},{"n":"西语","v":"/lang/西语"},{"n":"韩语","v":"/lang/韩语"},{"n":"日语","v":"/lang/日语"},{"n":"法语","v":"/lang/法语"},{"n":"俄语","v":"/lang/俄语"},{"n":"意大利语","v":"/lang/意大利语"},{"n":"德语","v":"/lang/德语"},{"n":"印地语","v":"/lang/印地语"},{"n":"其它","v":"/lang/其它"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"/letter/A"},{"n":"B","v":"/letter/B"},{"n":"C","v":"/letter/C"},{"n":"D","v":"/letter/D"},{"n":"E","v":"/letter/E"},{"n":"F","v":"/letter/F"},{"n":"G","v":"/letter/G"},{"n":"H","v":"/letter/H"},{"n":"I","v":"/letter/I"},{"n":"J","v":"/letter/J"},{"n":"K","v":"/letter/K"},{"n":"L","v":"/letter/L"},{"n":"M","v":"/letter/M"},{"n":"N","v":"/letter/N"},{"n":"O","v":"/letter/O"},{"n":"P","v":"/letter/P"},{"n":"Q","v":"/letter/Q"},{"n":"R","v":"/letter/R"},{"n":"S","v":"/letter/S"},{"n":"T","v":"/letter/T"},{"n":"U","v":"/letter/U"},{"n":"V","v":"/letter/V"},{"n":"W","v":"/letter/W"},{"n":"X","v":"/letter/X"},{"n":"Y","v":"/letter/Y"},{"n":"Z","v":"/letter/Z"},{"n":"0-9","v":"/letter/0-9"}]},{"key":"by","name":"排序","value":[{"n":"按最新","v":"/by/time"},{"n":"按添加","v":"/by/time_add"},{"n":"按最热","v":"/by/hits"},{"n":"按评分","v":"/by/score"}]}], - "13":[{"key":"cateId","name":"分类","value":[{"n":"全部","v":"13"},{"n":"篮球","v":"1205"},{"n":"足球","v":"1206"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":"13"},{"n":"A","v":"/letter/A"},{"n":"B","v":"/letter/B"},{"n":"C","v":"/letter/C"},{"n":"D","v":"/letter/D"},{"n":"E","v":"/letter/E"},{"n":"F","v":"/letter/F"},{"n":"G","v":"/letter/G"},{"n":"H","v":"/letter/H"},{"n":"I","v":"/letter/I"},{"n":"J","v":"/letter/J"},{"n":"K","v":"/letter/K"},{"n":"L","v":"/letter/L"},{"n":"M","v":"/letter/M"},{"n":"N","v":"/letter/N"},{"n":"O","v":"/letter/O"},{"n":"P","v":"/letter/P"},{"n":"Q","v":"/letter/Q"},{"n":"R","v":"/letter/R"},{"n":"S","v":"/letter/S"},{"n":"T","v":"/letter/T"},{"n":"U","v":"/letter/U"},{"n":"V","v":"/letter/V"},{"n":"W","v":"/letter/W"},{"n":"X","v":"/letter/X"},{"n":"Y","v":"/letter/Y"},{"n":"Z","v":"/letter/Z"},{"n":"0-9","v":"/letter/0-9"}]},{"key":"by","name":"排序","value":[{"n":"按最新","v":"/by/time3"},{"n":"按添加","v":"/by/time_add3"},{"n":"按最热","v":"/by/hits3"},{"n":"按评分","v":"/by/score3"}]}] + "13":[{"key":"cateId","name":"分类","value":[{"n":"全部","v":"13"},{"n":"篮球","v":"1205"},{"n":"足球","v":"1206"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"/letter/A"},{"n":"B","v":"/letter/B"},{"n":"C","v":"/letter/C"},{"n":"D","v":"/letter/D"},{"n":"E","v":"/letter/E"},{"n":"F","v":"/letter/F"},{"n":"G","v":"/letter/G"},{"n":"H","v":"/letter/H"},{"n":"I","v":"/letter/I"},{"n":"J","v":"/letter/J"},{"n":"K","v":"/letter/K"},{"n":"L","v":"/letter/L"},{"n":"M","v":"/letter/M"},{"n":"N","v":"/letter/N"},{"n":"O","v":"/letter/O"},{"n":"P","v":"/letter/P"},{"n":"Q","v":"/letter/Q"},{"n":"R","v":"/letter/R"},{"n":"S","v":"/letter/S"},{"n":"T","v":"/letter/T"},{"n":"U","v":"/letter/U"},{"n":"V","v":"/letter/V"},{"n":"W","v":"/letter/W"},{"n":"X","v":"/letter/X"},{"n":"Y","v":"/letter/Y"},{"n":"Z","v":"/letter/Z"},{"n":"0-9","v":"/letter/0-9"}]},{"key":"by","name":"排序","value":[{"n":"按最新","v":"/by/time"},{"n":"按添加","v":"/by/time_add"},{"n":"按最热","v":"/by/hits"},{"n":"按评分","v":"/by/score"}]}], + "5":[{"key":"cateId","name":"分类","value":[{"n":"全部","v":"5"},{"n":"AV女优","v":"505"},{"n":"日韩","v":"502"},{"n":"欧美","v":"501"},{"n":"动漫","v":"503"},{"n":"国产","v":"504"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"},{"n":"2004","v":"/year/2004"},{"n":"2003","v":"/year/2003"},{"n":"2002","v":"/year/2002"},{"n":"2001","v":"/year/2001"},{"n":"2000","v":"/year/2000"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"/letter/A"},{"n":"B","v":"/letter/B"},{"n":"C","v":"/letter/C"},{"n":"D","v":"/letter/D"},{"n":"E","v":"/letter/E"},{"n":"F","v":"/letter/F"},{"n":"G","v":"/letter/G"},{"n":"H","v":"/letter/H"},{"n":"I","v":"/letter/I"},{"n":"J","v":"/letter/J"},{"n":"K","v":"/letter/K"},{"n":"L","v":"/letter/L"},{"n":"M","v":"/letter/M"},{"n":"N","v":"/letter/N"},{"n":"O","v":"/letter/O"},{"n":"P","v":"/letter/P"},{"n":"Q","v":"/letter/Q"},{"n":"R","v":"/letter/R"},{"n":"S","v":"/letter/S"},{"n":"T","v":"/letter/T"},{"n":"U","v":"/letter/U"},{"n":"V","v":"/letter/V"},{"n":"W","v":"/letter/W"},{"n":"X","v":"/letter/X"},{"n":"Y","v":"/letter/Y"},{"n":"Z","v":"/letter/Z"},{"n":"0-9","v":"/letter/0-9"}]},{"key":"by","name":"排序","value":[{"n":"按最新","v":"/by/time"},{"n":"按添加","v":"/by/time_add"},{"n":"按最热","v":"/by/hits"},{"n":"按评分","v":"/by/score"}]}], + "6":[{"key":"cateId","name":"分类","value":[{"n":"全部","v":"6"},{"n":"动作片","v":"601"},{"n":"喜剧片","v":"602"},{"n":"爱情片","v":"603"},{"n":"科幻片","v":"604"},{"n":"恐怖片","v":"605"},{"n":"剧情片","v":"606"},{"n":"战争片","v":"607"},{"n":"动画片","v":"608"},{"n":"悬疑片","v":"609"},{"n":"惊悚片","v":"610"},{"n":"纪录片","v":"611"},{"n":"奇幻片","v":"612"},{"n":"犯罪片","v":"613"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"/area/大陆"},{"n":"香港","v":"/area/香港"},{"n":"台湾","v":"/area/台湾"},{"n":"美国","v":"/area/美国"},{"n":"韩国","v":"/area/韩国"},{"n":"日本","v":"/area/日本"},{"n":"印度","v":"/area/印度"},{"n":"英国","v":"/area/英国"},{"n":"法国","v":"/area/法国"},{"n":"加拿大","v":"/area/加拿大"},{"n":"西班牙","v":"/area/西班牙"},{"n":"俄罗斯","v":"/area/俄罗斯"},{"n":"意大利","v":"/area/意大利"},{"n":"泰国","v":"/area/泰国"},{"n":"新加坡","v":"/area/新加坡"},{"n":"马来西亚","v":"/area/马来西亚"},{"n":"其它","v":"/area/其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"},{"n":"2004","v":"/year/2004"},{"n":"2003","v":"/year/2003"},{"n":"2002","v":"/year/2002"},{"n":"2001","v":"/year/2001"},{"n":"2000","v":"/year/2000"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"/lang/国语"},{"n":"英语","v":"/lang/英语"},{"n":"粤语","v":"/lang/粤语"},{"n":"西语","v":"/lang/西语"},{"n":"韩语","v":"/lang/韩语"},{"n":"日语","v":"/lang/日语"},{"n":"法语","v":"/lang/法语"},{"n":"俄语","v":"/lang/俄语"},{"n":"意大利语","v":"/lang/意大利语"},{"n":"德语","v":"/lang/德语"},{"n":"印地语","v":"/lang/印地语"},{"n":"其它","v":"/lang/其它"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"/letter/A"},{"n":"B","v":"/letter/B"},{"n":"C","v":"/letter/C"},{"n":"D","v":"/letter/D"},{"n":"E","v":"/letter/E"},{"n":"F","v":"/letter/F"},{"n":"G","v":"/letter/G"},{"n":"H","v":"/letter/H"},{"n":"I","v":"/letter/I"},{"n":"J","v":"/letter/J"},{"n":"K","v":"/letter/K"},{"n":"L","v":"/letter/L"},{"n":"M","v":"/letter/M"},{"n":"N","v":"/letter/N"},{"n":"O","v":"/letter/O"},{"n":"P","v":"/letter/P"},{"n":"Q","v":"/letter/Q"},{"n":"R","v":"/letter/R"},{"n":"S","v":"/letter/S"},{"n":"T","v":"/letter/T"},{"n":"U","v":"/letter/U"},{"n":"V","v":"/letter/V"},{"n":"W","v":"/letter/W"},{"n":"X","v":"/letter/X"},{"n":"Y","v":"/letter/Y"},{"n":"Z","v":"/letter/Z"},{"n":"0-9","v":"/letter/0-9"}]},{"key":"by","name":"排序","value":[{"n":"按最新","v":"/by/time"},{"n":"按添加","v":"/by/time_add"},{"n":"按最热","v":"/by/hits"},{"n":"按评分","v":"/by/score"}]}], + "8":[{"key":"cateId","name":"分类","value":[{"n":"全部","v":"8"},{"n":"央视","v":"801"},{"n":"地方","v":"802"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"/letter/A"},{"n":"B","v":"/letter/B"},{"n":"C","v":"/letter/C"},{"n":"D","v":"/letter/D"},{"n":"E","v":"/letter/E"},{"n":"F","v":"/letter/F"},{"n":"G","v":"/letter/G"},{"n":"H","v":"/letter/H"},{"n":"I","v":"/letter/I"},{"n":"J","v":"/letter/J"},{"n":"K","v":"/letter/K"},{"n":"L","v":"/letter/L"},{"n":"M","v":"/letter/M"},{"n":"N","v":"/letter/N"},{"n":"O","v":"/letter/O"},{"n":"P","v":"/letter/P"},{"n":"Q","v":"/letter/Q"},{"n":"R","v":"/letter/R"},{"n":"S","v":"/letter/S"},{"n":"T","v":"/letter/T"},{"n":"U","v":"/letter/U"},{"n":"V","v":"/letter/V"},{"n":"W","v":"/letter/W"},{"n":"X","v":"/letter/X"},{"n":"Y","v":"/letter/Y"},{"n":"Z","v":"/letter/Z"},{"n":"0-9","v":"/letter/0-9"}]},{"key":"by","name":"排序","value":[{"n":"按最新","v":"/by/time"},{"n":"按添加","v":"/by/time_add"},{"n":"按最热","v":"/by/hits"}]}] }, filter_def:{ 1:{cateId:'1'}, 2:{cateId:'2'}, 3:{cateId:'3'}, 4:{cateId:'4'}, - 13:{cateId:'13'} + 13:{cateId:'13'}, + 5:{cateId:'5'}, + 6:{cateId:'6'}, + 8:{cateId:'8'} }, searchUrl:'/index.php/vod/search/page/fypage/wd/**.html', searchable: 2,//是否启用全局搜索, @@ -31,8 +48,11 @@ var rule = { headers: { 'User-Agent': 'UC_UA', }, - class_parse:'.nav_list li:gt(0):lt(6);a--i&&Text;a&&href;.*/(.*?).html', + timeout:5000,//网站的全局请求超时,默认是3000毫秒 + class_parse:'.nav_list&&li;a--i&&Text;a&&href;.*/(\\d+).html', + cate_exclude:'午夜影院|电视直播|VIP蓝光影院', play_parse: true, + pagecount:{"13":1}, lazy:'js:var html=JSON.parse(request(input).match(/r player_.*?=(.*?) 骚火电影.js (多了分类"综艺",其他相同) -// 搜索验证 -var rule={ -title:'骚火', -host:'https://shdy3.com', -// url:'/list/fyclass-fypage.html', -url:'/list/fyfilter-fypage.html', -filterable:1,//是否启用分类筛选, -filter_url:'{{fl.cateId}}', -filter: {"1":[{"key":"cateId","name":"类型","value":[{"v":"1","n":"全部"},{"v":"6","n":"喜剧"},{"v":"7","n":"爱情"},{"v":"8","n":"恐怖"},{"v":"9","n":"动作"},{"v":"10","n":"科幻"},{"v":"11","n":"战争"},{"v":"12","n":"犯罪"},{"v":"13","n":"动画"},{"v":"14","n":"奇幻"},{"v":"15","n":"剧情"},{"v":"16","n":"冒险"},{"v":"17","n":"悬疑"},{"v":"18","n":"惊悚"},{"v":"19","n":"其它"}]}],"2":[{"key":"cateId","name":"类型","value":[{"v":"2","n":"全部"},{"v":"20","n":"大陆"},{"v":"21","n":"TVB"},{"v":"22","n":"韩剧"},{"v":"23","n":"美剧"},{"v":"24","n":"日剧"},{"v":"25","n":"英剧"},{"v":"26","n":"台剧"},{"v":"27","n":"其它"}]}],"4":[{"key":"cateId","name":"类型","value":[{"v":"4","n":"全部"},{"v":"38","n":"搞笑"},{"v":"39","n":"恋爱"},{"v":"40","n":"热血"},{"v":"41","n":"格斗"},{"v":"42","n":"美少女"},{"v":"43","n":"魔法"},{"v":"44","n":"机战"},{"v":"45","n":"校园"},{"v":"46","n":"亲子"},{"v":"47","n":"童话"},{"v":"48","n":"冒险"},{"v":"49","n":"真人"},{"v":"50","n":"LOLI"},{"v":"51","n":"其它"}]}]}, -filter_def:{ - 1:{cateId:'1'}, - 2:{cateId:'2'}, - 4:{cateId:'4'} -}, -searchUrl:'/search.php?searchword=**', -searchable:2, -quickSearch:0, - -headers:{'User-Agent':'MOBILE_UA', }, -class_name:'电影&电视剧&动漫', -class_url:'1&2&4', -// 推荐:'.v_list li;a&&title;.lazyload&&data-original;.v_note&&Text;a&&href', -推荐:'*', -一级:'.v_list li;a&&title;.lazyload&&data-original;.v_note&&Text;a&&href', -二级:{ - "title":"h1&&Text;", - "img":".lazyload&&data-original", - "desc":";;;.v_info_box&&p&&Text", - "content":".p_txt.show_part&&Text", - "tabs":".from_list li", - "lists":"#play_link:eq(#id) li a" -}, -// 搜索:'.v_list li;a&&title;.lazyload&&data-original;.v_note&&Text;a&&href', -搜索:'*', -} diff --git a/libs/drpy.js b/libs/drpy.js index 9553904..310e188 100644 --- a/libs/drpy.js +++ b/libs/drpy.js @@ -55,7 +55,7 @@ function pre(){ } let rule = {}; -const VERSION = 'drpy1 3.9.41beta14 20230428'; +const VERSION = 'drpy1 3.9.43beta1 20230607'; /** 已知问题记录 * 1.影魔的jinjia2引擎不支持 {{fl}}对象直接渲染 (有能力解决的话尽量解决下,支持对象直接渲染字符串转义,如果加了|safe就不转义)[影魔牛逼,最新的文件发现这问题已经解决了] * Array.prototype.append = Array.prototype.push; 这种js执行后有毛病,for in 循环列表会把属性给打印出来 (这个大毛病需要重点排除一下) @@ -97,6 +97,7 @@ const OCR_API = 'http://drpy.nokia.press:8028/ocr/drpy/text';//ocr在线识别 if(typeof(MY_URL)==='undefined'){ var MY_URL; // 全局注入变量,pd函数需要 } +var HOST; var RKEY; // 源的唯一标识 var fetch; var print; @@ -1259,7 +1260,7 @@ function homeVodParse(homeVodObj){ if(p.startsWith('js:')){ const TYPE = 'home'; var input = MY_URL; - const HOST = rule.host; + HOST = rule.host; eval(p.replace('js:','')); d = VODS; }else { @@ -2145,6 +2146,16 @@ function playParse(playObj){ rule.cate_exclude = rule_cate_excludes.join('|'); rule.tab_exclude = rule_tab_excludes.join('|'); rule.host = (rule.host||'').rstrip('/'); + HOST = rule.host; + if(rule.hostJs){ + console.log(`检测到hostJs,准备执行...`); + try { + eval(rule.hostJs); + rule.host = HOST.rstrip('/'); + }catch (e) { + console.log(`执行${rule.hostJs}获取host发生错误:`+e.message); + } + } rule.url = rule.url||''; rule.double = rule.double||false; rule.homeUrl = rule.homeUrl||''; diff --git a/libs/drpy.min.js b/libs/drpy.min.js index 82f64f0..45f30d7 100644 --- a/libs/drpy.min.js +++ b/libs/drpy.min.js @@ -1 +1 @@ -import cheerio from"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/cheerio.min.js";import"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/crypto-js.js";import"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/drT.js";import 模板 from"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/js/模板.js";import{gbkTool}from"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/gbk.js";function init_test(){console.log("init_test_start");console.log("当前版本号:"+VERSION);console.log(RKEY);console.log(JSON.stringify(rule));console.log("init_test_end")}function pre(){if(typeof rule.预处理==="string"&&rule.预处理&&rule.预处理.trim()){let code=rule.预处理.trim();console.log("执行预处理代码:"+code);if(code.startsWith("js:")){code=code.replace("js:","")}try{eval(code)}catch(e){console.log("预处理执行失败:"+e.message)}}}let rule={};const VERSION="drpy1 3.9.41beta1 20230328";const MOBILE_UA="Mozilla/5.0 (Linux; Android 11; M2007J3SC Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045714 Mobile Safari/537.36";const PC_UA="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36";const UA="Mozilla/5.0";const UC_UA="Mozilla/5.0 (Linux; U; Android 9; zh-CN; MI 9 Build/PKQ1.181121.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 UCBrowser/12.5.5.1035 Mobile Safari/537.36";const IOS_UA="Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1";const RULE_CK="cookie";const CATE_EXCLUDE="首页|留言|APP|下载|资讯|新闻|动态";const TAB_EXCLUDE="猜你|喜欢|下载|剧情|热播";const OCR_RETRY=3;const OCR_API="http://drpy.nokia.press:8028/ocr/drpy/text";if(typeof MY_URL==="undefined"){var MY_URL}var RKEY;var fetch;var print;var log;var rule_fetch_params;var fetch_params;var oheaders;var _pdfh;var _pdfa;var _pd;const DOM_CHECK_ATTR=/(url|src|href|-original|-src|-play|-url)$/;const SELECT_REGEX=/:eq|:lt|:gt|#/g;const SELECT_REGEX_A=/:eq|:lt|:gt/g;if(typeof Object.assign!="function"){Object.assign=function(){var target=arguments[0];for(var i=1;ithis.length){return false}else{return this.indexOf(search,start)!==-1}}}if(!Array.prototype.includes){Object.defineProperty(Array.prototype,"includes",{value:function(searchElement,fromIndex){if(this==null){throw new TypeError('"this" is null or not defined')}var o=Object(this);var len=o.length>>>0;if(len===0){return false}var n=fromIndex|0;var k=Math.max(n>=0?n:len-Math.abs(n),0);while(k=end){return lists}let first=lists[start];let second=lists[end];if(key){try{first=first[key];second=second[key]}catch(e){}}if(option&&typeof option==="function"){try{first=option(first);second=option(second)}catch(e){}}first+="";second+="";if(first.match(/(\d+)/)&&second.match(/(\d+)/)){let num1=Number(first.match(/(\d+)/)[1]);let num2=Number(second.match(/(\d+)/)[1]);if(num1>num2){lists.reverse()}}return lists}let VODS=[];let VOD={};let TABS=[];let LISTS=[];globalThis.encodeUrl=urlencode;globalThis.urlencode=urlencode;function urljoin(fromPath,nowPath){fromPath=fromPath||"";nowPath=nowPath||"";return joinUrl(fromPath,nowPath)}var urljoin2=urljoin;const defaultParser={pdfh:pdfh,pdfa:pdfa,pd(html,parse,uri){let ret=this.pdfh(html,parse);if(typeof uri==="undefined"||!uri){uri=""}if(DOM_CHECK_ATTR.test(parse)){if(/http/.test(ret)){ret=ret.substr(ret.indexOf("http"))}else{ret=urljoin(MY_URL,ret)}}return ret}};function pdfh2(html,parse){let html2=html;try{if(typeof html!=="string"){html2=html.rr(html.ele).toString()}}catch(e){print("html对象转文本发生了错误:"+e.message)}let result=defaultParser.pdfh(html2,parse);let option=parse.includes("&&")?parse.split("&&").slice(-1)[0]:parse.split(" ").slice(-1)[0];if(/style/.test(option.toLowerCase())&&/url\(/.test(result)){try{result=result.match(/url\((.*?)\)/)[1]}catch(e){}}return result}function pdfa2(html,parse){let html2=html;try{if(typeof html!=="string"){html2=html.rr(html.ele).toString()}}catch(e){print("html对象转文本发生了错误:"+e.message)}return defaultParser.pdfa(html2,parse)}function pd2(html,parse,uri){let ret=pdfh2(html,parse);if(typeof uri==="undefined"||!uri){uri=""}if(DOM_CHECK_ATTR.test(parse)){if(/http/.test(ret)){ret=ret.substr(ret.indexOf("http"))}else{ret=urljoin(MY_URL,ret)}}return ret}const parseTags={jsp:{pdfh:pdfh2,pdfa:pdfa2,pd:pd2},json:{pdfh(html,parse){if(!parse||!parse.trim()){return""}if(typeof html==="string"){html=JSON.parse(html)}parse=parse.trim();if(!parse.startsWith("$.")){parse="$."+parse}parse=parse.split("||");for(let ps of parse){let ret=cheerio.jp(ps,html);if(Array.isArray(ret)){ret=ret[0]||""}else{ret=ret||""}if(ret&&typeof ret!=="string"){ret=ret.toString()}if(ret){return ret}}return""},pdfa(html,parse){if(!parse||!parse.trim()){return""}if(typeof html==="string"){html=JSON.parse(html)}parse=parse.trim();if(!parse.startsWith("$.")){parse="$."+parse}let ret=cheerio.jp(parse,html);if(Array.isArray(ret)&&Array.isArray(ret[0])&&ret.length===1){return ret[0]||[]}return ret||[]},pd(html,parse){let ret=parseTags.json.pdfh(html,parse);if(ret){return urljoin(MY_URL,ret)}return ret}},jq:{pdfh(html,parse,base_url){if(!parse||!parse.trim()){return""}let eleFind=typeof html==="object";let option=undefined;if(eleFind&&parse.startsWith("body&&")){parse=parse.substr(6);if(parse.indexOf("&&")<0){option=parse.trim();parse="*=*"}}if(parse.indexOf("&&")>-1){let sp=parse.split("&&");option=sp[sp.length-1];sp.splice(sp.length-1);if(sp.length>1){for(let i in sp){if(sp.hasOwnProperty(i)){if(!SELECT_REGEX.test(sp[i])){sp[i]=sp[i]+":eq(0)"}}}}else{if(!SELECT_REGEX.test(sp[0])){sp[0]=sp[0]+":eq(0)"}}parse=sp.join(" ")}let result="";const $=eleFind?html.rr:cheerio.load(html);let ret=eleFind?parse==="*=*"||$(html.ele).is(parse)?html.ele:$(html.ele).find(parse):$(parse);if(option){if(option==="Text"){result=$(ret).text()}else if(option==="Html"){result=$(ret).html()}else{result=$(ret).attr(option);if(/style/.test(option.toLowerCase())&&/url\(/.test(result)){try{result=result.match(/url\((.*?)\)/)[1]}catch(e){}}}if(result&&base_url&&DOM_CHECK_ATTR.test(option)){if(/http/.test(result)){result=result.substr(result.indexOf("http"))}else{result=urljoin(base_url,result)}}}else{result=$(ret).toString()}return result},pdfa(html,parse){if(!parse||!parse.trim()){print("!parse");return[]}let eleFind=typeof html==="object";if(parse.indexOf("&&")>-1){let sp=parse.split("&&");for(let i in sp){if(sp.hasOwnProperty(i)){if(!SELECT_REGEX_A.test(sp[i])&&iit.toLowerCase()==="set-cookie");cookie=setCk?json[setCk].split(";")[0]:""}console.log("cookie:"+cookie);let img=json.body;let code=OcrApi.classification(img);console.log(`第${cnt+1}次验证码识别结果:${code}`);let submit_url=`${host}/index.php/ajax/verify_check?type=search&verify=${code}`;console.log(submit_url);let html=request(submit_url,{headers:{Cookie:cookie,"User-Agent":MOBILE_UA},method:"POST"});html=JSON.parse(html);if(html.msg==="ok"){console.log(`第${cnt+1}次验证码提交成功`);return cookie}else if(html.msg!=="ok"&&cnt+1>=OCR_RETRY){cookie=""}}catch(e){console.log(`第${cnt+1}次验证码提交失败:${e.message}`);if(cnt+1>=OCR_RETRY){cookie=""}}cnt+=1}return cookie}function setItem(k,v){local.set(RKEY,k,v);console.log(`规则${RKEY}设置${k} => ${v}`)}function getItem(k,v){return local.get(RKEY,k)||v}function clearItem(k){local.delete(RKEY,k)}function getHome(url){if(!url){return""}let tmp=url.split("//");url=tmp[0]+"//"+tmp[1].split("/")[0];try{url=decodeURIComponent(url)}catch(e){}return url}function buildUrl(url,obj){obj=obj||{};if(url.indexOf("?")<0){url+="?"}let param_list=[];let keys=Object.keys(obj);keys.forEach(it=>{param_list.push(it+"="+obj[it])});let prs=param_list.join("&");if(keys.length>0&&!url.endsWith("?")){url+="&"}url+=prs;return url}function require(url){eval(request(url))}function request(url,obj,ocr_flag){ocr_flag=ocr_flag||false;if(typeof obj==="undefined"||!obj||obj==={}){if(!fetch_params||!fetch_params.headers){let headers={"User-Agent":MOBILE_UA};if(rule.headers){Object.assign(headers,rule.headers)}if(!fetch_params){fetch_params={}}fetch_params.headers=headers}if(!fetch_params.headers.Referer){fetch_params.headers.Referer=getHome(url)}obj=fetch_params}else{let headers=obj.headers||{};let keys=Object.keys(headers).map(it=>it.toLowerCase());if(!keys.includes("user-agent")){headers["User-Agent"]=MOBILE_UA}if(!keys.includes("referer")){headers["Referer"]=getHome(url)}obj.headers=headers}if(rule.encoding&&rule.encoding!=="utf-8"&&!ocr_flag){if(!obj.headers.hasOwnProperty("Content-Type")&&!obj.headers.hasOwnProperty("content-type")){obj.headers["Content-Type"]="text/html; charset="+rule.encoding}}if(typeof obj.body!="undefined"&&obj.body&&typeof obj.body==="string"){if(!obj.headers.hasOwnProperty("Content-Type")&&!obj.headers.hasOwnProperty("content-type")){obj.headers["Content-Type"]="application/x-www-form-urlencoded; charset="+rule.encoding}}else if(typeof obj.body!="undefined"&&obj.body&&typeof obj.body==="object"){obj.data=obj.body;delete obj.body}if(!url){return obj.withHeaders?"{}":""}if(obj.toBase64){obj.buffer=2;delete obj.toBase64}console.log(JSON.stringify(obj.headers));console.log("request:"+url+`|method:${obj.method||"GET"}|body:${obj.body||""}`);let res=req(url,obj);let html=res.content||"";if(obj.withHeaders){let htmlWithHeaders=res.headers;htmlWithHeaders.body=html;return JSON.stringify(htmlWithHeaders)}else{return html}}function post(url,obj){obj.method="POST";return request(url,obj)}fetch=request;print=function(data){data=data||"";if(typeof data=="object"&&Object.keys(data).length>0){try{data=JSON.stringify(data);console.log(data)}catch(e){console.log(typeof data+":"+data.length);return}}else if(typeof data=="object"&&Object.keys(data).length<1){console.log("null object")}else{console.log(data)}};log=print;function checkHtml(html,url,obj){if(/\?btwaf=/.test(html)){let btwaf=html.match(/btwaf(.*?)"/)[1];url=url.split("#")[0]+"?btwaf"+btwaf;print("宝塔验证访问链接:"+url);html=request(url,obj)}return html}function getCode(url,obj){let html=request(url,obj);html=checkHtml(html,url,obj);return html}function getHtml(url){let obj={};if(rule.headers){obj.headers=rule.headers}let cookie=getItem(RULE_CK,"");if(cookie){if(obj.headers&&!Object.keys(obj.headers).map(it=>it.toLowerCase()).includes("cookie")){log("历史无cookie,新增过验证后的cookie");obj.headers["Cookie"]=cookie}else if(obj.headers&&obj.headers.cookie&&obj.headers.cookie!==cookie){obj.headers["Cookie"]=cookie;log("历史有小写过期的cookie,更新过验证后的cookie")}else if(obj.headers&&obj.headers.Cookie&&obj.headers.Cookie!==cookie){obj.headers["Cookie"]=cookie;log("历史有大写过期的cookie,更新过验证后的cookie")}else if(!obj.headers){obj.headers={Cookie:cookie};log("历史无headers,更新过验证后的含cookie的headers")}}let html=getCode(url,obj);return html}function homeParse(homeObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let classes=[];if(homeObj.class_name&&homeObj.class_url){let names=homeObj.class_name.split("&");let urls=homeObj.class_url.split("&");let cnt=Math.min(names.length,urls.length);for(let i=0;i=3){try{let html=getHtml(homeObj.MY_URL);if(html){homeHtmlCache=html;let list=_pdfa(html,p[0]);if(list&&list.length>0){list.forEach((it,idex)=>{try{let name=_pdfh(it,p[1]);if(homeObj.cate_exclude&&new RegExp(homeObj.cate_exclude).test(name)){return}let url=_pd(it,p[2]);if(p.length>3&&p[3]){let exp=new RegExp(p[3]);url=url.match(exp)[1]}classes.push({type_id:url.trim(),type_name:name.trim()})}catch(e){console.log(`分类列表定位第${idex}个元素正常报错:${e.message}`)}})}}}catch(e){console.log(e.message)}}}classes=classes.filter(it=>!homeObj.cate_exclude||!new RegExp(homeObj.cate_exclude).test(it.type_name));let resp={class:classes};if(homeObj.filter){resp.filters=homeObj.filter}console.log(JSON.stringify(resp));return JSON.stringify(resp)}function getPP(p,pn,pp,ppn){try{let ps=p[pn]==="*"&&pp.length>ppn?pp[ppn]:p[pn];return ps}catch(e){return""}}function homeVodParse(homeVodObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let d=[];MY_URL=homeVodObj.homeUrl;console.log(MY_URL);let t1=(new Date).getTime();let p=homeVodObj.推荐;print("p:"+p);if(p==="*"&&rule.一级){p=rule.一级;homeVodObj.double=false}if(!p||typeof p!=="string"){return"{}"}p=p.trim();let pp=rule.一级.split(";");if(p.startsWith("js:")){const TYPE="home";var input=MY_URL;const HOST=rule.host;eval(p.replace("js:",""));d=VODS}else{p=p.split(";");if(!homeVodObj.double&&p.length<5){return"{}"}else if(homeVodObj.double&&p.length<6){return"{}"}let p0=getPP(p,0,pp,0);let _ps=parseTags.getParse(p0);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p0.startsWith("json:");p0=p0.replace(/^(jsp:|json:|jq:)/,"");let html=homeHtmlCache||getHtml(MY_URL);homeHtmlCache=undefined;if(is_json){html=dealJson(html)}try{console.log("double:"+homeVodObj.double);if(homeVodObj.double){let items=_pdfa(html,p0);let p1=getPP(p,1,pp,0);let p2=getPP(p,2,pp,1);let p3=getPP(p,3,pp,2);let p4=getPP(p,4,pp,3);let p5=getPP(p,5,pp,4);let p6=getPP(p,6,pp,5);for(let item of items){let items2=_pdfa(item,p1);for(let item2 of items2){try{let title=_pdfh(item2,p2);let img="";try{img=_pd(item2,p3)}catch(e){}let desc="";try{desc=_pdfh(item2,p4)}catch(e){}let links=[];for(let _p5 of p5.split("+")){let link=!homeVodObj.detailUrl?_pd(item2,_p5,MY_URL):_pdfh(item2,_p5);links.push(link)}let content;if(p.length>6&&p[6]){content=_pdfh(item2,p6)}else{content=""}let vid=links.join("$");if(rule.二级==="*"){vid=vid+"@@"+title+"@@"+img}let vod={vod_name:title,vod_pic:img,vod_remarks:desc,vod_content:content,vod_id:vid};d.push(vod)}catch(e){console.log("首页列表处理发生错误:"+e.message)}}}}else{let items=_pdfa(html,p0);let p1=getPP(p,1,pp,1);let p2=getPP(p,2,pp,2);let p3=getPP(p,3,pp,3);let p4=getPP(p,4,pp,4);let p5=getPP(p,5,pp,5);for(let item of items){try{let title=_pdfh(item,p1);let img="";try{img=_pd(item,p2,MY_URL)}catch(e){}let desc="";try{desc=_pdfh(item,p3)}catch(e){}let links=[];for(let _p5 of p4.split("+")){let link=!homeVodObj.detailUrl?_pd(item,_p5,MY_URL):_pdfh(item,_p5);links.push(link)}let content;if(p.length>5&&p[5]){content=_pdfh(item,p5)}else{content=""}let vid=links.join("$");if(rule.二级==="*"){vid=vid+"@@"+title+"@@"+img}let vod={vod_name:title,vod_pic:img,vod_remarks:desc,vod_content:content,vod_id:vid};d.push(vod)}catch(e){}}}}catch(e){}}let t2=(new Date).getTime();console.log("加载首页推荐耗时:"+(t2-t1)+"毫秒");if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}if(d.length>0){print(d.slice(0,2))}return JSON.stringify({list:d})}function categoryParse(cateObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let p=cateObj.一级;if(!p||typeof p!=="string"){return"{}"}let d=[];let url=cateObj.url.replaceAll("fyclass",cateObj.tid);if(cateObj.pg===1&&url.includes("[")&&url.includes("]")){url=url.split("[")[1].split("]")[0]}else if(cateObj.pg>1&&url.includes("[")&&url.includes("]")){url=url.split("[")[0]}if(rule.filter_url){if(!/fyfilter/.test(url)){if(!url.endsWith("&")&&!rule.filter_url.startsWith("&")){url+="&"}url+=rule.filter_url}else{url=url.replace("fyfilter",rule.filter_url)}let fl=cateObj.filter?cateObj.extend:{};if(rule.filter_def&&typeof rule.filter_def==="object"){try{if(Object.keys(rule.filter_def).length>0&&rule.filter_def.hasOwnProperty(cateObj.tid)){let self_fl_def=rule.filter_def[cateObj.tid];if(self_fl_def&&typeof self_fl_def==="object"){let fl_def=JSON.parse(JSON.stringify(self_fl_def));fl=Object.assign(fl_def,fl)}}}catch(e){print("合并不同分类对应的默认筛选出错:"+e.message)}}let new_url;new_url=cheerio.jinja2(url,{fl:fl});if(/object Object/.test(new_url)){new_url=drT.renderText(url,fl)}url=new_url}if(/fypage/.test(url)){if(url.includes("(")&&url.includes(")")){let url_rep=url.match(/.*?\((.*)\)/)[1];let cnt_page=url_rep.replaceAll("fypage",cateObj.pg);let cnt_pg=eval(cnt_page);url=url.replaceAll(url_rep,cnt_pg).replaceAll("(","").replaceAll(")","")}else{url=url.replaceAll("fypage",cateObj.pg)}}MY_URL=url;console.log(MY_URL);p=p.trim();const MY_CATE=cateObj.tid;if(p.startsWith("js:")){var MY_FL=cateObj.extend;const TYPE="cate";var input=MY_URL;const MY_PAGE=cateObj.pg;var desc="";eval(p.trim().replace("js:",""));d=VODS}else{p=p.split(";");if(p.length<5){return"{}"}let _ps=parseTags.getParse(p[0]);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p[0].startsWith("json:");p[0]=p[0].replace(/^(jsp:|json:|jq:)/,"");try{let html=getHtml(MY_URL);if(html){if(is_json){html=dealJson(html)}let list=_pdfa(html,p[0]);list.forEach(it=>{let links=p[4].split("+").map(p4=>{return!rule.detailUrl?_pd(it,p4,MY_URL):_pdfh(it,p4)});let link=links.join("$");let vod_id=rule.detailUrl?MY_CATE+"$"+link:link;let vod_name=_pdfh(it,p[1]).replace(/\n|\t/g,"").trim();let vod_pic=_pd(it,p[2],MY_URL);if(rule.二级==="*"){vod_id=vod_id+"@@"+vod_name+"@@"+vod_pic}d.push({vod_id:vod_id,vod_name:vod_name,vod_pic:vod_pic,vod_remarks:_pdfh(it,p[3]).replace(/\n|\t/g,"").trim()})})}}catch(e){console.log(e.message)}}if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}if(d.length>0){print(d.slice(0,2))}let pagecount=0;if(rule.pagecount&&typeof rule.pagecount==="object"&&rule.pagecount.hasOwnProperty(MY_CATE)){print(`MY_CATE:${MY_CATE},pagecount:${JSON.stringify(rule.pagecount)}`);pagecount=parseInt(rule.pagecount[MY_CATE])}let nodata={list:[{vod_name:"无数据,防无限请求",vod_id:"no_data",vod_remarks:"不要点,会崩的",vod_pic:"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/404.jpg"}],total:1,pagecount:1,page:1,limit:1};let vod=d.length<1?JSON.stringify(nodata):JSON.stringify({page:parseInt(cateObj.pg),pagecount:pagecount||999,limit:20,total:999,list:d});return vod}function searchParse(searchObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let d=[];if(!searchObj.searchUrl){return"{}"}let p=searchObj.搜索==="*"&&rule.一级?rule.一级:searchObj.搜索;if(!p||typeof p!=="string"){return"{}"}p=p.trim();let pp=rule.一级.split(";");let url=searchObj.searchUrl.replaceAll("**",searchObj.wd).replaceAll("fypage",searchObj.pg);MY_URL=url;console.log(MY_URL);if(p.startsWith("js:")){const TYPE="search";const MY_PAGE=searchObj.pg;const KEY=searchObj.wd;var input=MY_URL;var detailUrl=rule.detailUrl||"";eval(p.trim().replace("js:",""));d=VODS}else{p=p.split(";");if(p.length<5){return"{}"}let p0=getPP(p,0,pp,0);let _ps=parseTags.getParse(p0);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p0.startsWith("json:");p0=p0.replace(/^(jsp:|json:|jq:)/,"");try{let req_method=MY_URL.split(";").length>1?MY_URL.split(";")[1].toLowerCase():"get";let html;if(req_method==="post"){let rurls=MY_URL.split(";")[0].split("#");let rurl=rurls[0];let params=rurls.length>1?rurls[1]:"";print(`post=》rurl:${rurl},params:${params}`);let _fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let postData={body:params};Object.assign(_fetch_params,postData);html=post(rurl,_fetch_params)}else if(req_method==="postjson"){let rurls=MY_URL.split(";")[0].split("#");let rurl=rurls[0];let params=rurls.length>1?rurls[1]:"";print(`postjson-》rurl:${rurl},params:${params}`);try{params=JSON.parse(params)}catch(e){params="{}"}let _fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let postData={body:params};Object.assign(_fetch_params,postData);html=post(rurl,_fetch_params)}else{html=getHtml(MY_URL)}if(html){if(/系统安全验证|输入验证码/.test(html)){let cookie=verifyCode(MY_URL);if(cookie){console.log(`本次成功过验证,cookie:${cookie}`);setItem(RULE_CK,cookie)}else{console.log(`本次自动过搜索验证失败,cookie:${cookie}`)}html=getHtml(MY_URL)}if(!html.includes(searchObj.wd)){console.log("搜索结果源码未包含关键字,疑似搜索失败,正为您打印结果源码");console.log(html)}if(is_json){html=dealJson(html)}let list=_pdfa(html,p0);let p1=getPP(p,1,pp,1);let p2=getPP(p,2,pp,2);let p3=getPP(p,3,pp,3);let p4=getPP(p,4,pp,4);let p5=getPP(p,5,pp,5);list.forEach(it=>{let links=p4.split("+").map(_p4=>{return!rule.detailUrl?_pd(it,_p4,MY_URL):_pdfh(it,_p4)});let link=links.join("$");let content;if(p.length>5&&p[5]){content=_pdfh(it,p5)}else{content=""}let vod_id=link;let vod_name=_pdfh(it,p1).replace(/\n|\t/g,"").trim();let vod_pic=_pd(it,p2,MY_URL);if(rule.二级==="*"){vod_id=vod_id+"@@"+vod_name+"@@"+vod_pic}let ob={vod_id:vod_id,vod_name:vod_name,vod_pic:vod_pic,vod_remarks:_pdfh(it,p3).replace(/\n|\t/g,"").trim(),vod_content:content.replace(/\n|\t/g,"").trim()};d.push(ob)})}}catch(e){print("搜索发生错误:"+e.message);return"{}"}}if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}return JSON.stringify({page:parseInt(searchObj.pg),pagecount:10,limit:20,total:100,list:d})}function detailParse(detailObj){let t1=(new Date).getTime();fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let orId=detailObj.orId;let vod_name="片名";let vod_pic="";let vod_id=orId;if(rule.二级==="*"){let extra=orId.split("@@");vod_name=extra.length>1?extra[1]:vod_name;vod_pic=extra.length>2?extra[2]:vod_pic}let vod={vod_id:vod_id,vod_name:vod_name,vod_pic:vod_pic,type_name:"类型",vod_year:"年份",vod_area:"地区",vod_remarks:"更新信息",vod_actor:"主演",vod_director:"导演",vod_content:"简介"};let p=detailObj.二级;let url=detailObj.url;let detailUrl=detailObj.detailUrl;let fyclass=detailObj.fyclass;let tab_exclude=detailObj.tab_exclude;let html=detailObj.html||"";MY_URL=url;if(detailObj.二级访问前){try{print(`尝试在二级访问前执行代码:${detailObj.二级访问前}`);eval(detailObj.二级访问前.trim().replace("js:",""))}catch(e){print(`二级访问前执行代码出现错误:${e.message}`)}}if(p==="*"){vod.vod_play_from="道长在线";vod.vod_remarks=detailUrl;vod.vod_actor="没有二级,只有一级链接直接嗅探播放";vod.vod_content=MY_URL;vod.vod_play_url="嗅探播放$"+MY_URL.split("@@")[0]}else if(typeof p==="string"&&p.trim().startsWith("js:")){const TYPE="detail";var input=MY_URL;var play_url="";eval(p.trim().replace("js:",""));vod=VOD;console.log(JSON.stringify(vod))}else if(p&&typeof p==="object"){let tt1=(new Date).getTime();if(!html){html=getHtml(MY_URL)}print(`二级${MY_URL}仅获取源码耗时:${(new Date).getTime()-tt1}毫秒`);let _impJQP=false;let _ps;if(p.is_json){print("二级是json");_ps=parseTags.json;html=dealJson(html)}else if(p.is_jsp){print("二级是jsp");_ps=parseTags.jsp}else if(p.is_jq){print("二级是jq");_ps=parseTags.jq}else{print("二级默认jq");_ps=parseTags.jq}if(_ps===parseTags.jq){_impJQP=true}if(_impJQP){let ttt1=(new Date).getTime();let c$=cheerio.load(html);html={rr:c$,ele:c$("html")[0]};print(`二级${MY_URL}仅cheerio.load源码耗时:${(new Date).getTime()-ttt1}毫秒`)}let tt2=(new Date).getTime();print(`二级${MY_URL}获取并装载源码耗时:${tt2-tt1}毫秒`);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;if(p.title){let p1=p.title.split(";");vod.vod_name=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim();let type_name=p1.length>1?_pdfh(html,p1[1]).replace(/\n|\t/g,"").replace(/ /g,"").trim():"";vod.type_name=type_name||vod.type_name}if(p.desc){try{let p1=p.desc.split(";");vod.vod_remarks=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim();vod.vod_year=p1.length>1?_pdfh(html,p1[1]).replace(/\n|\t/g,"").trim():"";vod.vod_area=p1.length>2?_pdfh(html,p1[2]).replace(/\n|\t/g,"").trim():"";vod.vod_actor=p1.length>3?_pdfh(html,p1[3]).replace(/\n|\t/g,"").trim():"";vod.vod_director=p1.length>4?_pdfh(html,p1[4]).replace(/\n|\t/g,"").trim():""}catch(e){}}if(p.content){try{let p1=p.content.split(";");vod.vod_content=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim()}catch(e){}}if(p.img){try{let p1=p.img.split(";");vod.vod_pic=_pd(html,p1[0],MY_URL)}catch(e){}}let vod_play_from="$$$";let playFrom=[];if(p.重定向&&p.重定向.startsWith("js:")){print("开始执行重定向代码:"+p.重定向);html=eval(p.重定向.replace("js:",""));if(_impJQP){let c$=cheerio.load(html);html={rr:c$,ele:c$("html")[0]}}}if(p.tabs){if(p.tabs.startsWith("js:")){print("开始执行tabs代码:"+p.tabs);if(html&&_impJQP&&typeof html!=="string"){try{html=html.rr(html.ele).toString()}catch(e){}}var input=MY_URL;eval(p.tabs.replace("js:",""));playFrom=TABS}else{let p_tab=p.tabs.split(";")[0];let vHeader=_pdfa(html,p_tab);console.log(vHeader.length);let tab_text=p.tab_text||"body&&Text";let new_map={};for(let v of vHeader){let v_title=_pdfh(v,tab_text).trim();console.log(v_title);if(tab_exclude&&new RegExp(tab_exclude).test(v_title)){continue}if(!new_map.hasOwnProperty(v_title)){new_map[v_title]=1}else{new_map[v_title]+=1}if(new_map[v_title]>1){v_title+=Number(new_map[v_title]-1)}playFrom.push(v_title)}}console.log(JSON.stringify(playFrom))}else{playFrom=["道长在线"]}vod.vod_play_from=playFrom.join(vod_play_from);let vod_play_url="$$$";let vod_tab_list=[];if(p.lists){if(p.lists.startsWith("js:")){print("开始执行lists代码:"+p.lists);try{if(html&&_impJQP&&typeof html!=="string"){try{html=html.rr(html.ele).toString()}catch(e){}}var input=MY_URL;var play_url="";eval(p.lists.replace("js:",""));for(let i in LISTS){if(LISTS.hasOwnProperty(i)){try{LISTS[i]=LISTS[i].map(it=>it.split("$").slice(0,2).join("$"))}catch(e){print("格式化LISTS发生错误:"+e.message)}}}vod_play_url=LISTS.map(it=>it.join("#")).join(vod_play_url)}catch(e){print("js执行lists: 发生错误:"+e.message)}}else{let list_text=p.list_text||"body&&Text";let list_url=p.list_url||"a&&href";let is_tab_js=p.tabs.trim().startsWith("js:");for(let i=0;i1&&!is_tab_js?p.tabs.split(";")[1]:"";let p1=p.lists.replaceAll("#idv",tab_name).replaceAll("#id",i);tab_ext=tab_ext.replaceAll("#idv",tab_name).replaceAll("#id",i);let vodList=[];try{vodList=_pdfa(html,p1);console.log("len(vodList):"+vodList.length)}catch(e){}let new_vod_list=[];let tabName=tab_ext?_pdfh(html,tab_ext):tab_name;console.log(tabName);let tt1=(new Date).getTime();if(vodList.length>0){for(let i=0;ix.split("$")[0]);console.log(`drpy影响性能代码共计列表数循环次数:${vodList.length},耗时:${(new Date).getTime()-tt1}毫秒`)}let vlist=new_vod_list.join("#");vod_tab_list.push(vlist)}vod_play_url=vod_tab_list.join(vod_play_url)}}vod.vod_play_url=vod_play_url}if(rule.图片来源&&vod.vod_pic&&vod.vod_pic.startsWith("http")){vod.vod_pic=vod.vod_pic+rule.图片来源}if(!vod.vod_id||vod_id.includes("$")&&vod.vod_id!==vod_id){vod.vod_id=vod_id}let t2=(new Date).getTime();console.log(`加载二级界面${MY_URL}耗时:${t2-t1}毫秒`);return JSON.stringify({list:[vod]})}function tellIsJx(url){try{let is_vip=!/\.(m3u8|mp4|m4a)$/.test(url.split("?")[0])&&是否正版(url);return is_vip?1:0}catch(e){return 1}}function playParse(playObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));MY_URL=playObj.url;if(!/http/.test(MY_URL)){try{MY_URL=base64Decode(MY_URL)}catch(e){}}MY_URL=decodeURIComponent(MY_URL);var input=MY_URL;let common_play={parse:1,url:input,jx:tellIsJx(input)};let lazy_play;if(!rule.play_parse||!rule.lazy){lazy_play=common_play}else if(rule.play_parse&&rule.lazy&&typeof rule.lazy==="string"){try{let lazy_code=rule.lazy.replace("js:","").trim();print("开始执行js免嗅=>"+lazy_code);eval(lazy_code);lazy_play=typeof input==="object"?input:{parse:1,jx:tellIsJx(input),url:input}}catch(e){print("js免嗅错误:"+e.message);lazy_play=common_play}}else{lazy_play=common_play}if(Array.isArray(rule.play_json)&&rule.play_json.length>0){let web_url=lazy_play.url;for(let pjson of rule.play_json){if(pjson.re&&(pjson.re==="*"||web_url.match(new RegExp(pjson.re)))){if(pjson.json&&typeof pjson.json==="object"){let base_json=pjson.json;lazy_play=Object.assign(lazy_play,base_json);break}}}}else if(rule.play_json&&!Array.isArray(rule.play_json)){let base_json={jx:1,parse:1};lazy_play=Object.assign(lazy_play,base_json)}else if(!rule.play_json){let base_json={jx:0,parse:1};lazy_play=Object.assign(lazy_play,base_json)}console.log(JSON.stringify(lazy_play));return JSON.stringify(lazy_play)}function init(ext){console.log("init");try{let muban=模板.getMubans();if(typeof ext=="object"){rule=ext}else if(typeof ext=="string"){if(ext.startsWith("http")){let js=request(ext,{method:"GET"});if(js){eval(js.replace("var rule","rule"))}}else{eval(ext.replace("var rule","rule"))}}if(rule.模板&&muban.hasOwnProperty(rule.模板)){print("继承模板:"+rule.模板);rule=Object.assign(muban[rule.模板],rule)}let rule_cate_excludes=(rule.cate_exclude||"").split("|").filter(it=>it.trim());let rule_tab_excludes=(rule.tab_exclude||"").split("|").filter(it=>it.trim());rule_cate_excludes=rule_cate_excludes.concat(CATE_EXCLUDE.split("|").filter(it=>it.trim()));rule_tab_excludes=rule_tab_excludes.concat(TAB_EXCLUDE.split("|").filter(it=>it.trim()));rule.cate_exclude=rule_cate_excludes.join("|");rule.tab_exclude=rule_tab_excludes.join("|");rule.host=(rule.host||"").rstrip("/");rule.url=rule.url||"";rule.double=rule.double||false;rule.homeUrl=rule.homeUrl||"";rule.detailUrl=rule.detailUrl||"";rule.searchUrl=rule.searchUrl||"";rule.homeUrl=rule.host&&rule.homeUrl?urljoin(rule.host,rule.homeUrl):rule.homeUrl||rule.host;rule.detailUrl=rule.host&&rule.detailUrl?urljoin(rule.host,rule.detailUrl):rule.detailUrl;rule.二级访问前=rule.二级访问前||"";if(rule.url.includes("[")&&rule.url.includes("]")){let u1=rule.url.split("[")[0];let u2=rule.url.split("[")[1].split("]")[0];rule.url=rule.host&&rule.url?urljoin(rule.host,u1)+"["+urljoin(rule.host,u2)+"]":rule.url}else{rule.url=rule.host&&rule.url?urljoin(rule.host,rule.url):rule.url}rule.searchUrl=rule.host&&rule.searchUrl?urljoin(rule.host,rule.searchUrl):rule.searchUrl;rule.timeout=rule.timeout||5e3;rule.encoding=rule.编码||rule.encoding||"utf-8";rule.search_encoding=rule.搜索编码||rule.search_encoding||"";rule.图片来源=rule.图片来源||"";rule.play_json=rule.hasOwnProperty("play_json")?rule.play_json:[];rule.pagecount=rule.hasOwnProperty("pagecount")?rule.pagecount:{};if(rule.headers&&typeof rule.headers==="object"){try{let header_keys=Object.keys(rule.headers);for(let k of header_keys){if(k.toLowerCase()==="user-agent"){let v=rule.headers[k];console.log(v);if(["MOBILE_UA","PC_UA","UC_UA","IOS_UA","UA"].includes(v)){rule.headers[k]=eval(v)}}}}catch(e){console.log("处理headers发生错误:"+e.message)}}rule_fetch_params={headers:rule.headers||false,timeout:rule.timeout,encoding:rule.encoding};oheaders=rule.headers||{};RKEY=typeof key!=="undefined"&&key?key:"drpy_"+(rule.title||rule.host);pre();init_test()}catch(e){console.log("init_test发生错误:"+e.message)}}let homeHtmlCache=undefined;function home(filter){console.log("home");let homeObj={filter:rule.filter||false,MY_URL:rule.homeUrl,class_name:rule.class_name||"",class_url:rule.class_url||"",class_parse:rule.class_parse||"",cate_exclude:rule.cate_exclude};return homeParse(homeObj)}function homeVod(params){console.log("homeVod");let homeVodObj={"推荐":rule.推荐,double:rule.double,homeUrl:rule.homeUrl,detailUrl:rule.detailUrl};return homeVodParse(homeVodObj)}function category(tid,pg,filter,extend){let cateObj={url:rule.url,"一级":rule.一级,tid:tid,pg:parseInt(pg),filter:filter,extend:extend};return categoryParse(cateObj)}function detail(vod_url){let orId=vod_url;let fyclass="";if(vod_url.indexOf("$")>-1){let tmp=vod_url.split("$");fyclass=tmp[0];vod_url=tmp[1]}let detailUrl=vod_url.split("@@")[0];let url;if(!detailUrl.startsWith("http")&&!detailUrl.includes("/")){url=rule.detailUrl.replaceAll("fyid",detailUrl).replaceAll("fyclass",fyclass)}else if(detailUrl.includes("/")){url=urljoin(rule.homeUrl,detailUrl)}else{url=detailUrl}let detailObj={orId:orId,url:url,"二级":rule.二级,"二级访问前":rule.二级访问前,detailUrl:detailUrl,fyclass:fyclass,tab_exclude:rule.tab_exclude};return detailParse(detailObj)}function play(flag,id,flags){let playObj={url:id,flag:flag,flags:flags};return playParse(playObj)}function search(wd,quick){if(rule.search_encoding){if(rule.search_encoding.toLowerCase()!=="utf-8"){wd=encodeStr(wd,rule.search_encoding)}}else if(rule.encoding&&rule.encoding.toLowerCase()!=="utf-8"){wd=encodeStr(wd,rule.encoding)}let searchObj={searchUrl:rule.searchUrl,"搜索":rule.搜索,wd:wd,pg:1,quick:quick};return searchParse(searchObj)}function DRPY(){return{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search}}export default{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search,DRPY:DRPY}; \ No newline at end of file +import cheerio from"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/cheerio.min.js";import"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/crypto-js.js";import"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/drT.js";import 模板 from"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/js/模板.js";import{gbkTool}from"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/gbk.js";function init_test(){console.log("init_test_start");console.log("当前版本号:"+VERSION);console.log(RKEY);console.log(JSON.stringify(rule));console.log("init_test_end")}function pre(){if(typeof rule.预处理==="string"&&rule.预处理&&rule.预处理.trim()){let code=rule.预处理.trim();console.log("执行预处理代码:"+code);if(code.startsWith("js:")){code=code.replace("js:","")}try{eval(code)}catch(e){console.log("预处理执行失败:"+e.message)}}}let rule={};const VERSION="drpy1 3.9.43beta1 20230607";const MOBILE_UA="Mozilla/5.0 (Linux; Android 11; M2007J3SC Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045714 Mobile Safari/537.36";const PC_UA="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36";const UA="Mozilla/5.0";const UC_UA="Mozilla/5.0 (Linux; U; Android 9; zh-CN; MI 9 Build/PKQ1.181121.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 UCBrowser/12.5.5.1035 Mobile Safari/537.36";const IOS_UA="Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1";const RULE_CK="cookie";const CATE_EXCLUDE="首页|留言|APP|下载|资讯|新闻|动态";const TAB_EXCLUDE="猜你|喜欢|下载|剧情|热播";const OCR_RETRY=3;const OCR_API="http://drpy.nokia.press:8028/ocr/drpy/text";if(typeof MY_URL==="undefined"){var MY_URL}var HOST;var RKEY;var fetch;var print;var log;var rule_fetch_params;var fetch_params;var oheaders;var _pdfh;var _pdfa;var _pd;const DOM_CHECK_ATTR=/(url|src|href|-original|-src|-play|-url)$/;const SELECT_REGEX=/:eq|:lt|:gt|#/g;const SELECT_REGEX_A=/:eq|:lt|:gt/g;if(typeof Object.assign!="function"){Object.assign=function(){var target=arguments[0];for(var i=1;ithis.length){return false}else{return this.indexOf(search,start)!==-1}}}if(!Array.prototype.includes){Object.defineProperty(Array.prototype,"includes",{value:function(searchElement,fromIndex){if(this==null){throw new TypeError('"this" is null or not defined')}var o=Object(this);var len=o.length>>>0;if(len===0){return false}var n=fromIndex|0;var k=Math.max(n>=0?n:len-Math.abs(n),0);while(k=end){return lists}let first=lists[start];let second=lists[end];if(key){try{first=first[key];second=second[key]}catch(e){}}if(option&&typeof option==="function"){try{first=option(first);second=option(second)}catch(e){}}first+="";second+="";if(first.match(/(\d+)/)&&second.match(/(\d+)/)){let num1=Number(first.match(/(\d+)/)[1]);let num2=Number(second.match(/(\d+)/)[1]);if(num1>num2){lists.reverse()}}return lists}let VODS=[];let VOD={};let TABS=[];let LISTS=[];globalThis.encodeUrl=urlencode;globalThis.urlencode=urlencode;function urljoin(fromPath,nowPath){fromPath=fromPath||"";nowPath=nowPath||"";return joinUrl(fromPath,nowPath)}var urljoin2=urljoin;const defaultParser={pdfh:pdfh,pdfa:pdfa,pd(html,parse,uri){let ret=this.pdfh(html,parse);if(typeof uri==="undefined"||!uri){uri=""}if(DOM_CHECK_ATTR.test(parse)){if(/http/.test(ret)){ret=ret.substr(ret.indexOf("http"))}else{ret=urljoin(MY_URL,ret)}}return ret}};function pdfh2(html,parse){let html2=html;try{if(typeof html!=="string"){html2=html.rr(html.ele).toString()}}catch(e){print("html对象转文本发生了错误:"+e.message)}let result=defaultParser.pdfh(html2,parse);let option=parse.includes("&&")?parse.split("&&").slice(-1)[0]:parse.split(" ").slice(-1)[0];if(/style/.test(option.toLowerCase())&&/url\(/.test(result)){try{result=result.match(/url\((.*?)\)/)[1]}catch(e){}}return result}function pdfa2(html,parse){let html2=html;try{if(typeof html!=="string"){html2=html.rr(html.ele).toString()}}catch(e){print("html对象转文本发生了错误:"+e.message)}return defaultParser.pdfa(html2,parse)}function pd2(html,parse,uri){let ret=pdfh2(html,parse);if(typeof uri==="undefined"||!uri){uri=""}if(DOM_CHECK_ATTR.test(parse)){if(/http/.test(ret)){ret=ret.substr(ret.indexOf("http"))}else{ret=urljoin(MY_URL,ret)}}return ret}const parseTags={jsp:{pdfh:pdfh2,pdfa:pdfa2,pd:pd2},json:{pdfh(html,parse){if(!parse||!parse.trim()){return""}if(typeof html==="string"){html=JSON.parse(html)}parse=parse.trim();if(!parse.startsWith("$.")){parse="$."+parse}parse=parse.split("||");for(let ps of parse){let ret=cheerio.jp(ps,html);if(Array.isArray(ret)){ret=ret[0]||""}else{ret=ret||""}if(ret&&typeof ret!=="string"){ret=ret.toString()}if(ret){return ret}}return""},pdfa(html,parse){if(!parse||!parse.trim()){return""}if(typeof html==="string"){html=JSON.parse(html)}parse=parse.trim();if(!parse.startsWith("$.")){parse="$."+parse}let ret=cheerio.jp(parse,html);if(Array.isArray(ret)&&Array.isArray(ret[0])&&ret.length===1){return ret[0]||[]}return ret||[]},pd(html,parse){let ret=parseTags.json.pdfh(html,parse);if(ret){return urljoin(MY_URL,ret)}return ret}},jq:{pdfh(html,parse,base_url){if(!parse||!parse.trim()){return""}let eleFind=typeof html==="object";let option=undefined;if(eleFind&&parse.startsWith("body&&")){parse=parse.substr(6);if(parse.indexOf("&&")<0){option=parse.trim();parse="*=*"}}if(parse.indexOf("&&")>-1){let sp=parse.split("&&");option=sp[sp.length-1];sp.splice(sp.length-1);if(sp.length>1){for(let i in sp){if(sp.hasOwnProperty(i)){if(!SELECT_REGEX.test(sp[i])){sp[i]=sp[i]+":eq(0)"}}}}else{if(!SELECT_REGEX.test(sp[0])){sp[0]=sp[0]+":eq(0)"}}parse=sp.join(" ")}let result="";const $=eleFind?html.rr:cheerio.load(html);let ret=eleFind?parse==="*=*"||$(html.ele).is(parse)?html.ele:$(html.ele).find(parse):$(parse);if(option){if(option==="Text"){result=$(ret).text()}else if(option==="Html"){result=$(ret).html()}else{result=$(ret).attr(option);if(/style/.test(option.toLowerCase())&&/url\(/.test(result)){try{result=result.match(/url\((.*?)\)/)[1]}catch(e){}}}if(result&&base_url&&DOM_CHECK_ATTR.test(option)){if(/http/.test(result)){result=result.substr(result.indexOf("http"))}else{result=urljoin(base_url,result)}}}else{result=$(ret).toString()}return result},pdfa(html,parse){if(!parse||!parse.trim()){print("!parse");return[]}let eleFind=typeof html==="object";if(parse.indexOf("&&")>-1){let sp=parse.split("&&");for(let i in sp){if(sp.hasOwnProperty(i)){if(!SELECT_REGEX_A.test(sp[i])&&iit.toLowerCase()==="set-cookie");cookie=setCk?json[setCk].split(";")[0]:""}console.log("cookie:"+cookie);let img=json.body;let code=OcrApi.classification(img);console.log(`第${cnt+1}次验证码识别结果:${code}`);let submit_url=`${host}/index.php/ajax/verify_check?type=search&verify=${code}`;console.log(submit_url);let html=request(submit_url,{headers:{Cookie:cookie,"User-Agent":MOBILE_UA},method:"POST"});html=JSON.parse(html);if(html.msg==="ok"){console.log(`第${cnt+1}次验证码提交成功`);return cookie}else if(html.msg!=="ok"&&cnt+1>=OCR_RETRY){cookie=""}}catch(e){console.log(`第${cnt+1}次验证码提交失败:${e.message}`);if(cnt+1>=OCR_RETRY){cookie=""}}cnt+=1}return cookie}function setItem(k,v){local.set(RKEY,k,v);console.log(`规则${RKEY}设置${k} => ${v}`)}function getItem(k,v){return local.get(RKEY,k)||v}function clearItem(k){local.delete(RKEY,k)}function getHome(url){if(!url){return""}let tmp=url.split("//");url=tmp[0]+"//"+tmp[1].split("/")[0];try{url=decodeURIComponent(url)}catch(e){}return url}function buildUrl(url,obj){obj=obj||{};if(url.indexOf("?")<0){url+="?"}let param_list=[];let keys=Object.keys(obj);keys.forEach(it=>{param_list.push(it+"="+obj[it])});let prs=param_list.join("&");if(keys.length>0&&!url.endsWith("?")){url+="&"}url+=prs;return url}function require(url){eval(request(url))}function request(url,obj,ocr_flag){ocr_flag=ocr_flag||false;if(typeof obj==="undefined"||!obj||obj==={}){if(!fetch_params||!fetch_params.headers){let headers={"User-Agent":MOBILE_UA};if(rule.headers){Object.assign(headers,rule.headers)}if(!fetch_params){fetch_params={}}fetch_params.headers=headers}if(!fetch_params.headers.Referer){fetch_params.headers.Referer=getHome(url)}obj=fetch_params}else{let headers=obj.headers||{};let keys=Object.keys(headers).map(it=>it.toLowerCase());if(!keys.includes("user-agent")){headers["User-Agent"]=MOBILE_UA}if(!keys.includes("referer")){headers["Referer"]=getHome(url)}obj.headers=headers}if(rule.encoding&&rule.encoding!=="utf-8"&&!ocr_flag){if(!obj.headers.hasOwnProperty("Content-Type")&&!obj.headers.hasOwnProperty("content-type")){obj.headers["Content-Type"]="text/html; charset="+rule.encoding}}if(typeof obj.body!="undefined"&&obj.body&&typeof obj.body==="string"){if(!obj.headers.hasOwnProperty("Content-Type")&&!obj.headers.hasOwnProperty("content-type")){obj.headers["Content-Type"]="application/x-www-form-urlencoded; charset="+rule.encoding}}else if(typeof obj.body!="undefined"&&obj.body&&typeof obj.body==="object"){obj.data=obj.body;delete obj.body}if(!url){return obj.withHeaders?"{}":""}if(obj.toBase64){obj.buffer=2;delete obj.toBase64}console.log(JSON.stringify(obj.headers));console.log("request:"+url+`|method:${obj.method||"GET"}|body:${obj.body||""}`);let res=req(url,obj);let html=res.content||"";if(obj.withHeaders){let htmlWithHeaders=res.headers;htmlWithHeaders.body=html;return JSON.stringify(htmlWithHeaders)}else{return html}}function post(url,obj){obj.method="POST";return request(url,obj)}fetch=request;print=function(data){data=data||"";if(typeof data=="object"&&Object.keys(data).length>0){try{data=JSON.stringify(data);console.log(data)}catch(e){console.log(typeof data+":"+data.length);return}}else if(typeof data=="object"&&Object.keys(data).length<1){console.log("null object")}else{console.log(data)}};log=print;function checkHtml(html,url,obj){if(/\?btwaf=/.test(html)){let btwaf=html.match(/btwaf(.*?)"/)[1];url=url.split("#")[0]+"?btwaf"+btwaf;print("宝塔验证访问链接:"+url);html=request(url,obj)}return html}function getCode(url,obj){let html=request(url,obj);html=checkHtml(html,url,obj);return html}function getHtml(url){let obj={};if(rule.headers){obj.headers=rule.headers}let cookie=getItem(RULE_CK,"");if(cookie){if(obj.headers&&!Object.keys(obj.headers).map(it=>it.toLowerCase()).includes("cookie")){log("历史无cookie,新增过验证后的cookie");obj.headers["Cookie"]=cookie}else if(obj.headers&&obj.headers.cookie&&obj.headers.cookie!==cookie){obj.headers["Cookie"]=cookie;log("历史有小写过期的cookie,更新过验证后的cookie")}else if(obj.headers&&obj.headers.Cookie&&obj.headers.Cookie!==cookie){obj.headers["Cookie"]=cookie;log("历史有大写过期的cookie,更新过验证后的cookie")}else if(!obj.headers){obj.headers={Cookie:cookie};log("历史无headers,更新过验证后的含cookie的headers")}}let html=getCode(url,obj);return html}function homeParse(homeObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let classes=[];if(homeObj.class_name&&homeObj.class_url){let names=homeObj.class_name.split("&");let urls=homeObj.class_url.split("&");let cnt=Math.min(names.length,urls.length);for(let i=0;i=3){try{let html=getHtml(homeObj.MY_URL);if(html){homeHtmlCache=html;let list=_pdfa(html,p[0]);if(list&&list.length>0){list.forEach((it,idex)=>{try{let name=_pdfh(it,p[1]);if(homeObj.cate_exclude&&new RegExp(homeObj.cate_exclude).test(name)){return}let url=_pd(it,p[2]);if(p.length>3&&p[3]){let exp=new RegExp(p[3]);url=url.match(exp)[1]}classes.push({type_id:url.trim(),type_name:name.trim()})}catch(e){console.log(`分类列表定位第${idex}个元素正常报错:${e.message}`)}})}}}catch(e){console.log(e.message)}}}classes=classes.filter(it=>!homeObj.cate_exclude||!new RegExp(homeObj.cate_exclude).test(it.type_name));let resp={class:classes};if(homeObj.filter){resp.filters=homeObj.filter}console.log(JSON.stringify(resp));return JSON.stringify(resp)}function getPP(p,pn,pp,ppn){try{let ps=p[pn]==="*"&&pp.length>ppn?pp[ppn]:p[pn];return ps}catch(e){return""}}function homeVodParse(homeVodObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let d=[];MY_URL=homeVodObj.homeUrl;console.log(MY_URL);let t1=(new Date).getTime();let p=homeVodObj.推荐;print("p:"+p);if(p==="*"&&rule.一级){p=rule.一级;homeVodObj.double=false}if(!p||typeof p!=="string"){return"{}"}p=p.trim();let pp=rule.一级.split(";");if(p.startsWith("js:")){const TYPE="home";var input=MY_URL;HOST=rule.host;eval(p.replace("js:",""));d=VODS}else{p=p.split(";");if(!homeVodObj.double&&p.length<5){return"{}"}else if(homeVodObj.double&&p.length<6){return"{}"}let p0=getPP(p,0,pp,0);let _ps=parseTags.getParse(p0);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p0.startsWith("json:");p0=p0.replace(/^(jsp:|json:|jq:)/,"");let html=homeHtmlCache||getHtml(MY_URL);homeHtmlCache=undefined;if(is_json){html=dealJson(html)}try{console.log("double:"+homeVodObj.double);if(homeVodObj.double){let items=_pdfa(html,p0);let p1=getPP(p,1,pp,0);let p2=getPP(p,2,pp,1);let p3=getPP(p,3,pp,2);let p4=getPP(p,4,pp,3);let p5=getPP(p,5,pp,4);let p6=getPP(p,6,pp,5);for(let item of items){let items2=_pdfa(item,p1);for(let item2 of items2){try{let title=_pdfh(item2,p2);let img="";try{img=_pd(item2,p3)}catch(e){}let desc="";try{desc=_pdfh(item2,p4)}catch(e){}let links=[];for(let _p5 of p5.split("+")){let link=!homeVodObj.detailUrl?_pd(item2,_p5,MY_URL):_pdfh(item2,_p5);links.push(link)}let content;if(p.length>6&&p[6]){content=_pdfh(item2,p6)}else{content=""}let vid=links.join("$");if(rule.二级==="*"){vid=vid+"@@"+title+"@@"+img}let vod={vod_name:title,vod_pic:img,vod_remarks:desc,vod_content:content,vod_id:vid};d.push(vod)}catch(e){console.log("首页列表处理发生错误:"+e.message)}}}}else{let items=_pdfa(html,p0);let p1=getPP(p,1,pp,1);let p2=getPP(p,2,pp,2);let p3=getPP(p,3,pp,3);let p4=getPP(p,4,pp,4);let p5=getPP(p,5,pp,5);for(let item of items){try{let title=_pdfh(item,p1);let img="";try{img=_pd(item,p2,MY_URL)}catch(e){}let desc="";try{desc=_pdfh(item,p3)}catch(e){}let links=[];for(let _p5 of p4.split("+")){let link=!homeVodObj.detailUrl?_pd(item,_p5,MY_URL):_pdfh(item,_p5);links.push(link)}let content;if(p.length>5&&p[5]){content=_pdfh(item,p5)}else{content=""}let vid=links.join("$");if(rule.二级==="*"){vid=vid+"@@"+title+"@@"+img}let vod={vod_name:title,vod_pic:img,vod_remarks:desc,vod_content:content,vod_id:vid};d.push(vod)}catch(e){}}}}catch(e){}}let t2=(new Date).getTime();console.log("加载首页推荐耗时:"+(t2-t1)+"毫秒");if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}if(d.length>0){print(d.slice(0,2))}return JSON.stringify({list:d})}function categoryParse(cateObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let p=cateObj.一级;if(!p||typeof p!=="string"){return"{}"}let d=[];let url=cateObj.url.replaceAll("fyclass",cateObj.tid);if(cateObj.pg===1&&url.includes("[")&&url.includes("]")){url=url.split("[")[1].split("]")[0]}else if(cateObj.pg>1&&url.includes("[")&&url.includes("]")){url=url.split("[")[0]}if(rule.filter_url){if(!/fyfilter/.test(url)){if(!url.endsWith("&")&&!rule.filter_url.startsWith("&")){url+="&"}url+=rule.filter_url}else{url=url.replace("fyfilter",rule.filter_url)}let fl=cateObj.filter?cateObj.extend:{};if(rule.filter_def&&typeof rule.filter_def==="object"){try{if(Object.keys(rule.filter_def).length>0&&rule.filter_def.hasOwnProperty(cateObj.tid)){let self_fl_def=rule.filter_def[cateObj.tid];if(self_fl_def&&typeof self_fl_def==="object"){let fl_def=JSON.parse(JSON.stringify(self_fl_def));fl=Object.assign(fl_def,fl)}}}catch(e){print("合并不同分类对应的默认筛选出错:"+e.message)}}let new_url;new_url=cheerio.jinja2(url,{fl:fl});if(/object Object/.test(new_url)){new_url=drT.renderText(url,fl)}url=new_url}if(/fypage/.test(url)){if(url.includes("(")&&url.includes(")")){let url_rep=url.match(/.*?\((.*)\)/)[1];let cnt_page=url_rep.replaceAll("fypage",cateObj.pg);let cnt_pg=eval(cnt_page);url=url.replaceAll(url_rep,cnt_pg).replaceAll("(","").replaceAll(")","")}else{url=url.replaceAll("fypage",cateObj.pg)}}MY_URL=url;console.log(MY_URL);p=p.trim();const MY_CATE=cateObj.tid;if(p.startsWith("js:")){var MY_FL=cateObj.extend;const TYPE="cate";var input=MY_URL;const MY_PAGE=cateObj.pg;var desc="";eval(p.trim().replace("js:",""));d=VODS}else{p=p.split(";");if(p.length<5){return"{}"}let _ps=parseTags.getParse(p[0]);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p[0].startsWith("json:");p[0]=p[0].replace(/^(jsp:|json:|jq:)/,"");try{let html=getHtml(MY_URL);if(html){if(is_json){html=dealJson(html)}let list=_pdfa(html,p[0]);list.forEach(it=>{let links=p[4].split("+").map(p4=>{return!rule.detailUrl?_pd(it,p4,MY_URL):_pdfh(it,p4)});let link=links.join("$");let vod_id=rule.detailUrl?MY_CATE+"$"+link:link;let vod_name=_pdfh(it,p[1]).replace(/\n|\t/g,"").trim();let vod_pic=_pd(it,p[2],MY_URL);if(rule.二级==="*"){vod_id=vod_id+"@@"+vod_name+"@@"+vod_pic}d.push({vod_id:vod_id,vod_name:vod_name,vod_pic:vod_pic,vod_remarks:_pdfh(it,p[3]).replace(/\n|\t/g,"").trim()})})}}catch(e){console.log(e.message)}}if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}if(d.length>0){print(d.slice(0,2))}let pagecount=0;if(rule.pagecount&&typeof rule.pagecount==="object"&&rule.pagecount.hasOwnProperty(MY_CATE)){print(`MY_CATE:${MY_CATE},pagecount:${JSON.stringify(rule.pagecount)}`);pagecount=parseInt(rule.pagecount[MY_CATE])}let nodata={list:[{vod_name:"无数据,防无限请求",vod_id:"no_data",vod_remarks:"不要点,会崩的",vod_pic:"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/404.jpg"}],total:1,pagecount:1,page:1,limit:1};let vod=d.length<1?JSON.stringify(nodata):JSON.stringify({page:parseInt(cateObj.pg),pagecount:pagecount||999,limit:20,total:999,list:d});return vod}function searchParse(searchObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let d=[];if(!searchObj.searchUrl){return"{}"}let p=searchObj.搜索==="*"&&rule.一级?rule.一级:searchObj.搜索;if(!p||typeof p!=="string"){return"{}"}p=p.trim();let pp=rule.一级.split(";");let url=searchObj.searchUrl.replaceAll("**",searchObj.wd).replaceAll("fypage",searchObj.pg);MY_URL=url;console.log(MY_URL);if(p.startsWith("js:")){const TYPE="search";const MY_PAGE=searchObj.pg;const KEY=searchObj.wd;var input=MY_URL;var detailUrl=rule.detailUrl||"";eval(p.trim().replace("js:",""));d=VODS}else{p=p.split(";");if(p.length<5){return"{}"}let p0=getPP(p,0,pp,0);let _ps=parseTags.getParse(p0);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p0.startsWith("json:");p0=p0.replace(/^(jsp:|json:|jq:)/,"");try{let req_method=MY_URL.split(";").length>1?MY_URL.split(";")[1].toLowerCase():"get";let html;if(req_method==="post"){let rurls=MY_URL.split(";")[0].split("#");let rurl=rurls[0];let params=rurls.length>1?rurls[1]:"";print(`post=》rurl:${rurl},params:${params}`);let _fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let postData={body:params};Object.assign(_fetch_params,postData);html=post(rurl,_fetch_params)}else if(req_method==="postjson"){let rurls=MY_URL.split(";")[0].split("#");let rurl=rurls[0];let params=rurls.length>1?rurls[1]:"";print(`postjson-》rurl:${rurl},params:${params}`);try{params=JSON.parse(params)}catch(e){params="{}"}let _fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let postData={body:params};Object.assign(_fetch_params,postData);html=post(rurl,_fetch_params)}else{html=getHtml(MY_URL)}if(html){if(/系统安全验证|输入验证码/.test(html)){let cookie=verifyCode(MY_URL);if(cookie){console.log(`本次成功过验证,cookie:${cookie}`);setItem(RULE_CK,cookie)}else{console.log(`本次自动过搜索验证失败,cookie:${cookie}`)}html=getHtml(MY_URL)}if(!html.includes(searchObj.wd)){console.log("搜索结果源码未包含关键字,疑似搜索失败,正为您打印结果源码");console.log(html)}if(is_json){html=dealJson(html)}let list=_pdfa(html,p0);let p1=getPP(p,1,pp,1);let p2=getPP(p,2,pp,2);let p3=getPP(p,3,pp,3);let p4=getPP(p,4,pp,4);let p5=getPP(p,5,pp,5);list.forEach(it=>{let links=p4.split("+").map(_p4=>{return!rule.detailUrl?_pd(it,_p4,MY_URL):_pdfh(it,_p4)});let link=links.join("$");let content;if(p.length>5&&p[5]){content=_pdfh(it,p5)}else{content=""}let vod_id=link;let vod_name=_pdfh(it,p1).replace(/\n|\t/g,"").trim();let vod_pic=_pd(it,p2,MY_URL);if(rule.二级==="*"){vod_id=vod_id+"@@"+vod_name+"@@"+vod_pic}let ob={vod_id:vod_id,vod_name:vod_name,vod_pic:vod_pic,vod_remarks:_pdfh(it,p3).replace(/\n|\t/g,"").trim(),vod_content:content.replace(/\n|\t/g,"").trim()};d.push(ob)})}}catch(e){print("搜索发生错误:"+e.message);return"{}"}}if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}return JSON.stringify({page:parseInt(searchObj.pg),pagecount:10,limit:20,total:100,list:d})}function detailParse(detailObj){let t1=(new Date).getTime();fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let orId=detailObj.orId;let vod_name="片名";let vod_pic="";let vod_id=orId;if(rule.二级==="*"){let extra=orId.split("@@");vod_name=extra.length>1?extra[1]:vod_name;vod_pic=extra.length>2?extra[2]:vod_pic}let vod={vod_id:vod_id,vod_name:vod_name,vod_pic:vod_pic,type_name:"类型",vod_year:"年份",vod_area:"地区",vod_remarks:"更新信息",vod_actor:"主演",vod_director:"导演",vod_content:"简介"};let p=detailObj.二级;let url=detailObj.url;let detailUrl=detailObj.detailUrl;let fyclass=detailObj.fyclass;let tab_exclude=detailObj.tab_exclude;let html=detailObj.html||"";MY_URL=url;if(detailObj.二级访问前){try{print(`尝试在二级访问前执行代码:${detailObj.二级访问前}`);eval(detailObj.二级访问前.trim().replace("js:",""))}catch(e){print(`二级访问前执行代码出现错误:${e.message}`)}}if(p==="*"){vod.vod_play_from="道长在线";vod.vod_remarks=detailUrl;vod.vod_actor="没有二级,只有一级链接直接嗅探播放";vod.vod_content=MY_URL;vod.vod_play_url="嗅探播放$"+MY_URL.split("@@")[0]}else if(typeof p==="string"&&p.trim().startsWith("js:")){const TYPE="detail";var input=MY_URL;var play_url="";eval(p.trim().replace("js:",""));vod=VOD;console.log(JSON.stringify(vod))}else if(p&&typeof p==="object"){let tt1=(new Date).getTime();if(!html){html=getHtml(MY_URL)}print(`二级${MY_URL}仅获取源码耗时:${(new Date).getTime()-tt1}毫秒`);let _impJQP=false;let _ps;if(p.is_json){print("二级是json");_ps=parseTags.json;html=dealJson(html)}else if(p.is_jsp){print("二级是jsp");_ps=parseTags.jsp}else if(p.is_jq){print("二级是jq");_ps=parseTags.jq}else{print("二级默认jq");_ps=parseTags.jq}if(_ps===parseTags.jq){_impJQP=true}if(_impJQP){let ttt1=(new Date).getTime();let c$=cheerio.load(html);html={rr:c$,ele:c$("html")[0]};print(`二级${MY_URL}仅cheerio.load源码耗时:${(new Date).getTime()-ttt1}毫秒`)}let tt2=(new Date).getTime();print(`二级${MY_URL}获取并装载源码耗时:${tt2-tt1}毫秒`);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;if(p.title){let p1=p.title.split(";");vod.vod_name=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim();let type_name=p1.length>1?_pdfh(html,p1[1]).replace(/\n|\t/g,"").replace(/ /g,"").trim():"";vod.type_name=type_name||vod.type_name}if(p.desc){try{let p1=p.desc.split(";");vod.vod_remarks=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim();vod.vod_year=p1.length>1?_pdfh(html,p1[1]).replace(/\n|\t/g,"").trim():"";vod.vod_area=p1.length>2?_pdfh(html,p1[2]).replace(/\n|\t/g,"").trim():"";vod.vod_actor=p1.length>3?_pdfh(html,p1[3]).replace(/\n|\t/g,"").trim():"";vod.vod_director=p1.length>4?_pdfh(html,p1[4]).replace(/\n|\t/g,"").trim():""}catch(e){}}if(p.content){try{let p1=p.content.split(";");vod.vod_content=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim()}catch(e){}}if(p.img){try{let p1=p.img.split(";");vod.vod_pic=_pd(html,p1[0],MY_URL)}catch(e){}}let vod_play_from="$$$";let playFrom=[];if(p.重定向&&p.重定向.startsWith("js:")){print("开始执行重定向代码:"+p.重定向);html=eval(p.重定向.replace("js:",""));if(_impJQP){let c$=cheerio.load(html);html={rr:c$,ele:c$("html")[0]}}}if(p.tabs){if(p.tabs.startsWith("js:")){print("开始执行tabs代码:"+p.tabs);if(html&&_impJQP&&typeof html!=="string"){try{html=html.rr(html.ele).toString()}catch(e){}}var input=MY_URL;eval(p.tabs.replace("js:",""));playFrom=TABS}else{let p_tab=p.tabs.split(";")[0];let vHeader=_pdfa(html,p_tab);console.log(vHeader.length);let tab_text=p.tab_text||"body&&Text";let new_map={};for(let v of vHeader){let v_title=_pdfh(v,tab_text).trim();console.log(v_title);if(tab_exclude&&new RegExp(tab_exclude).test(v_title)){continue}if(!new_map.hasOwnProperty(v_title)){new_map[v_title]=1}else{new_map[v_title]+=1}if(new_map[v_title]>1){v_title+=Number(new_map[v_title]-1)}playFrom.push(v_title)}}console.log(JSON.stringify(playFrom))}else{playFrom=["道长在线"]}vod.vod_play_from=playFrom.join(vod_play_from);let vod_play_url="$$$";let vod_tab_list=[];if(p.lists){if(p.lists.startsWith("js:")){print("开始执行lists代码:"+p.lists);try{if(html&&_impJQP&&typeof html!=="string"){try{html=html.rr(html.ele).toString()}catch(e){}}var input=MY_URL;var play_url="";eval(p.lists.replace("js:",""));for(let i in LISTS){if(LISTS.hasOwnProperty(i)){try{LISTS[i]=LISTS[i].map(it=>it.split("$").slice(0,2).join("$"))}catch(e){print("格式化LISTS发生错误:"+e.message)}}}vod_play_url=LISTS.map(it=>it.join("#")).join(vod_play_url)}catch(e){print("js执行lists: 发生错误:"+e.message)}}else{let list_text=p.list_text||"body&&Text";let list_url=p.list_url||"a&&href";let is_tab_js=p.tabs.trim().startsWith("js:");for(let i=0;i1&&!is_tab_js?p.tabs.split(";")[1]:"";let p1=p.lists.replaceAll("#idv",tab_name).replaceAll("#id",i);tab_ext=tab_ext.replaceAll("#idv",tab_name).replaceAll("#id",i);let vodList=[];try{vodList=_pdfa(html,p1);console.log("len(vodList):"+vodList.length)}catch(e){}let new_vod_list=[];let tabName=tab_ext?_pdfh(html,tab_ext):tab_name;console.log(tabName);let tt1=(new Date).getTime();if(vodList.length>0){for(let i=0;ix.split("$")[0]);console.log(`drpy影响性能代码共计列表数循环次数:${vodList.length},耗时:${(new Date).getTime()-tt1}毫秒`)}let vlist=new_vod_list.join("#");vod_tab_list.push(vlist)}vod_play_url=vod_tab_list.join(vod_play_url)}}vod.vod_play_url=vod_play_url}if(rule.图片来源&&vod.vod_pic&&vod.vod_pic.startsWith("http")){vod.vod_pic=vod.vod_pic+rule.图片来源}if(!vod.vod_id||vod_id.includes("$")&&vod.vod_id!==vod_id){vod.vod_id=vod_id}let t2=(new Date).getTime();console.log(`加载二级界面${MY_URL}耗时:${t2-t1}毫秒`);return JSON.stringify({list:[vod]})}function tellIsJx(url){try{let is_vip=!/\.(m3u8|mp4|m4a)$/.test(url.split("?")[0])&&是否正版(url);return is_vip?1:0}catch(e){return 1}}function playParse(playObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));MY_URL=playObj.url;if(!/http/.test(MY_URL)){try{MY_URL=base64Decode(MY_URL)}catch(e){}}MY_URL=decodeURIComponent(MY_URL);var input=MY_URL;let common_play={parse:1,url:input,jx:tellIsJx(input)};let lazy_play;if(!rule.play_parse||!rule.lazy){lazy_play=common_play}else if(rule.play_parse&&rule.lazy&&typeof rule.lazy==="string"){try{let lazy_code=rule.lazy.replace("js:","").trim();print("开始执行js免嗅=>"+lazy_code);eval(lazy_code);lazy_play=typeof input==="object"?input:{parse:1,jx:tellIsJx(input),url:input}}catch(e){print("js免嗅错误:"+e.message);lazy_play=common_play}}else{lazy_play=common_play}if(Array.isArray(rule.play_json)&&rule.play_json.length>0){let web_url=lazy_play.url;for(let pjson of rule.play_json){if(pjson.re&&(pjson.re==="*"||web_url.match(new RegExp(pjson.re)))){if(pjson.json&&typeof pjson.json==="object"){let base_json=pjson.json;lazy_play=Object.assign(lazy_play,base_json);break}}}}else if(rule.play_json&&!Array.isArray(rule.play_json)){let base_json={jx:1,parse:1};lazy_play=Object.assign(lazy_play,base_json)}else if(!rule.play_json){let base_json={jx:0,parse:1};lazy_play=Object.assign(lazy_play,base_json)}console.log(JSON.stringify(lazy_play));return JSON.stringify(lazy_play)}function init(ext){console.log("init");try{let muban=模板.getMubans();if(typeof ext=="object"){rule=ext}else if(typeof ext=="string"){if(ext.startsWith("http")){let js=request(ext,{method:"GET"});if(js){eval(js.replace("var rule","rule"))}}else{eval(ext.replace("var rule","rule"))}}if(rule.模板&&muban.hasOwnProperty(rule.模板)){print("继承模板:"+rule.模板);rule=Object.assign(muban[rule.模板],rule)}let rule_cate_excludes=(rule.cate_exclude||"").split("|").filter(it=>it.trim());let rule_tab_excludes=(rule.tab_exclude||"").split("|").filter(it=>it.trim());rule_cate_excludes=rule_cate_excludes.concat(CATE_EXCLUDE.split("|").filter(it=>it.trim()));rule_tab_excludes=rule_tab_excludes.concat(TAB_EXCLUDE.split("|").filter(it=>it.trim()));rule.cate_exclude=rule_cate_excludes.join("|");rule.tab_exclude=rule_tab_excludes.join("|");rule.host=(rule.host||"").rstrip("/");HOST=rule.host;if(rule.hostJs){console.log(`检测到hostJs,准备执行...`);try{eval(rule.hostJs);rule.host=HOST.rstrip("/")}catch(e){console.log(`执行${rule.hostJs}获取host发生错误:`+e.message)}}rule.url=rule.url||"";rule.double=rule.double||false;rule.homeUrl=rule.homeUrl||"";rule.detailUrl=rule.detailUrl||"";rule.searchUrl=rule.searchUrl||"";rule.homeUrl=rule.host&&rule.homeUrl?urljoin(rule.host,rule.homeUrl):rule.homeUrl||rule.host;rule.detailUrl=rule.host&&rule.detailUrl?urljoin(rule.host,rule.detailUrl):rule.detailUrl;rule.二级访问前=rule.二级访问前||"";if(rule.url.includes("[")&&rule.url.includes("]")){let u1=rule.url.split("[")[0];let u2=rule.url.split("[")[1].split("]")[0];rule.url=rule.host&&rule.url?urljoin(rule.host,u1)+"["+urljoin(rule.host,u2)+"]":rule.url}else{rule.url=rule.host&&rule.url?urljoin(rule.host,rule.url):rule.url}rule.searchUrl=rule.host&&rule.searchUrl?urljoin(rule.host,rule.searchUrl):rule.searchUrl;rule.timeout=rule.timeout||5e3;rule.encoding=rule.编码||rule.encoding||"utf-8";rule.search_encoding=rule.搜索编码||rule.search_encoding||"";rule.图片来源=rule.图片来源||"";rule.play_json=rule.hasOwnProperty("play_json")?rule.play_json:[];rule.pagecount=rule.hasOwnProperty("pagecount")?rule.pagecount:{};if(rule.headers&&typeof rule.headers==="object"){try{let header_keys=Object.keys(rule.headers);for(let k of header_keys){if(k.toLowerCase()==="user-agent"){let v=rule.headers[k];console.log(v);if(["MOBILE_UA","PC_UA","UC_UA","IOS_UA","UA"].includes(v)){rule.headers[k]=eval(v)}}}}catch(e){console.log("处理headers发生错误:"+e.message)}}rule_fetch_params={headers:rule.headers||false,timeout:rule.timeout,encoding:rule.encoding};oheaders=rule.headers||{};RKEY=typeof key!=="undefined"&&key?key:"drpy_"+(rule.title||rule.host);pre();init_test()}catch(e){console.log("init_test发生错误:"+e.message)}}let homeHtmlCache=undefined;function home(filter){console.log("home");let homeObj={filter:rule.filter||false,MY_URL:rule.homeUrl,class_name:rule.class_name||"",class_url:rule.class_url||"",class_parse:rule.class_parse||"",cate_exclude:rule.cate_exclude};return homeParse(homeObj)}function homeVod(params){console.log("homeVod");let homeVodObj={"推荐":rule.推荐,double:rule.double,homeUrl:rule.homeUrl,detailUrl:rule.detailUrl};return homeVodParse(homeVodObj)}function category(tid,pg,filter,extend){let cateObj={url:rule.url,"一级":rule.一级,tid:tid,pg:parseInt(pg),filter:filter,extend:extend};return categoryParse(cateObj)}function detail(vod_url){let orId=vod_url;let fyclass="";if(vod_url.indexOf("$")>-1){let tmp=vod_url.split("$");fyclass=tmp[0];vod_url=tmp[1]}let detailUrl=vod_url.split("@@")[0];let url;if(!detailUrl.startsWith("http")&&!detailUrl.includes("/")){url=rule.detailUrl.replaceAll("fyid",detailUrl).replaceAll("fyclass",fyclass)}else if(detailUrl.includes("/")){url=urljoin(rule.homeUrl,detailUrl)}else{url=detailUrl}let detailObj={orId:orId,url:url,"二级":rule.二级,"二级访问前":rule.二级访问前,detailUrl:detailUrl,fyclass:fyclass,tab_exclude:rule.tab_exclude};return detailParse(detailObj)}function play(flag,id,flags){let playObj={url:id,flag:flag,flags:flags};return playParse(playObj)}function search(wd,quick){if(rule.search_encoding){if(rule.search_encoding.toLowerCase()!=="utf-8"){wd=encodeStr(wd,rule.search_encoding)}}else if(rule.encoding&&rule.encoding.toLowerCase()!=="utf-8"){wd=encodeStr(wd,rule.encoding)}let searchObj={searchUrl:rule.searchUrl,"搜索":rule.搜索,wd:wd,pg:1,quick:quick};return searchParse(searchObj)}function DRPY(){return{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search}}export default{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search,DRPY:DRPY}; \ No newline at end of file diff --git a/libs/drpy2.js b/libs/drpy2.js index d43ef5d..882d056 100644 --- a/libs/drpy2.js +++ b/libs/drpy2.js @@ -41,7 +41,7 @@ function pre(){ let rule = {}; let vercode = typeof(pdfl) ==='function'?'drpy2.1':'drpy2'; -const VERSION = vercode+' 3.9.41beta14 20230428'; +const VERSION = vercode+' 3.9.43beta1 20230607'; /** 已知问题记录 * 1.影魔的jinjia2引擎不支持 {{fl}}对象直接渲染 (有能力解决的话尽量解决下,支持对象直接渲染字符串转义,如果加了|safe就不转义)[影魔牛逼,最新的文件发现这问题已经解决了] * Array.prototype.append = Array.prototype.push; 这种js执行后有毛病,for in 循环列表会把属性给打印出来 (这个大毛病需要重点排除一下) @@ -84,6 +84,7 @@ const OCR_API = 'http://drpy.nokia.press:8028/ocr/drpy/text';//ocr在线识别 if(typeof(MY_URL)==='undefined'){ var MY_URL; // 全局注入变量,pd函数需要 } +var HOST; var RKEY; // 源的唯一标识 var fetch; var print; @@ -1162,7 +1163,7 @@ function homeVodParse(homeVodObj){ if(p.startsWith('js:')){ const TYPE = 'home'; var input = MY_URL; - const HOST = rule.host; + HOST = rule.host; eval(p.replace('js:','')); d = VODS; }else { @@ -2012,6 +2013,16 @@ function init(ext) { rule.cate_exclude = rule_cate_excludes.join('|'); rule.tab_exclude = rule_tab_excludes.join('|'); rule.host = (rule.host||'').rstrip('/'); + HOST = rule.host; + if(rule.hostJs){ + console.log(`检测到hostJs,准备执行...`); + try { + eval(rule.hostJs); + rule.host = HOST.rstrip('/'); + }catch (e) { + console.log(`执行${rule.hostJs}获取host发生错误:`+e.message); + } + } rule.url = rule.url||''; rule.double = rule.double||false; rule.homeUrl = rule.homeUrl||''; diff --git a/libs/drpy2.min.js b/libs/drpy2.min.js index 53041fe..c1a5ec6 100644 --- a/libs/drpy2.min.js +++ b/libs/drpy2.min.js @@ -1 +1 @@ -import cheerio from"assets://js/lib/cheerio.min.js";import"assets://js/lib/crypto-js.js";import 模板 from"../js/模板.js";import{gbkTool}from"./gbk.js";function init_test(){console.log("init_test_start");console.log("当前版本号:"+VERSION);console.log(RKEY);console.log(JSON.stringify(rule));console.log("init_test_end")}function pre(){if(typeof rule.预处理==="string"&&rule.预处理&&rule.预处理.trim()){let code=rule.预处理.trim();console.log("执行预处理代码:"+code);if(code.startsWith("js:")){code=code.replace("js:","")}try{eval(code)}catch(e){console.log("预处理执行失败:"+e.message)}}}let rule={};let vercode=typeof pdfl==="function"?"drpy2.1":"drpy2";const VERSION=vercode+" 3.9.41beta14 20230428";const MOBILE_UA="Mozilla/5.0 (Linux; Android 11; M2007J3SC Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045714 Mobile Safari/537.36";const PC_UA="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36";const UA="Mozilla/5.0";const UC_UA="Mozilla/5.0 (Linux; U; Android 9; zh-CN; MI 9 Build/PKQ1.181121.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 UCBrowser/12.5.5.1035 Mobile Safari/537.36";const IOS_UA="Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1";const RULE_CK="cookie";const CATE_EXCLUDE="首页|留言|APP|下载|资讯|新闻|动态";const TAB_EXCLUDE="猜你|喜欢|下载|剧情|热播";const OCR_RETRY=3;const OCR_API="http://drpy.nokia.press:8028/ocr/drpy/text";if(typeof MY_URL==="undefined"){var MY_URL}var RKEY;var fetch;var print;var log;var rule_fetch_params;var fetch_params;var oheaders;var _pdfh;var _pdfa;var _pd;const DOM_CHECK_ATTR=/(url|src|href|-original|-src|-play|-url)$/;const NOADD_INDEX=/:eq|:lt|:gt|:first|:last|^body$|^#/;const URLJOIN_ATTR=/(url|src|href|-original|-src|-play|-url)$/;const SELECT_REGEX=/:eq|:lt|:gt|#/g;const SELECT_REGEX_A=/:eq|:lt|:gt/g;if(typeof Object.assign!="function"){Object.assign=function(){var target=arguments[0];for(var i=1;ithis.length){return false}else{return this.indexOf(search,start)!==-1}}}if(!Array.prototype.includes){Object.defineProperty(Array.prototype,"includes",{value:function(searchElement,fromIndex){if(this==null){throw new TypeError('"this" is null or not defined')}var o=Object(this);var len=o.length>>>0;if(len===0){return false}var n=fromIndex|0;var k=Math.max(n>=0?n:len-Math.abs(n),0);while(k=end){return lists}let first=lists[start];let second=lists[end];if(key){try{first=first[key];second=second[key]}catch(e){}}if(option&&typeof option==="function"){try{first=option(first);second=option(second)}catch(e){}}first+="";second+="";if(first.match(/(\d+)/)&&second.match(/(\d+)/)){let num1=Number(first.match(/(\d+)/)[1]);let num2=Number(second.match(/(\d+)/)[1]);if(num1>num2){lists.reverse()}}return lists}let VODS=[];let VOD={};let TABS=[];let LISTS=[];globalThis.encodeUrl=urlencode;globalThis.urlencode=urlencode;function urljoin(fromPath,nowPath){fromPath=fromPath||"";nowPath=nowPath||"";return joinUrl(fromPath,nowPath)}var urljoin2=urljoin;const defaultParser={pdfh:pdfh,pdfa:pdfa,pd:pd};function pdfh2(html,parse){let html2=html;try{if(typeof html!=="string"){html2=html.rr(html.ele).toString()}}catch(e){print("html对象转文本发生了错误:"+e.message)}let result=defaultParser.pdfh(html2,parse);let option=parse.includes("&&")?parse.split("&&").slice(-1)[0]:parse.split(" ").slice(-1)[0];if(/style/.test(option.toLowerCase())&&/url\(/.test(result)){try{result=result.match(/url\((.*?)\)/)[1]}catch(e){}}return result}function pdfa2(html,parse){let html2=html;try{if(typeof html!=="string"){html2=html.rr(html.ele).toString()}}catch(e){print("html对象转文本发生了错误:"+e.message)}return defaultParser.pdfa(html2,parse)}function pd2(html,parse,uri){let ret=pdfh2(html,parse);if(typeof uri==="undefined"||!uri){uri=""}if(DOM_CHECK_ATTR.test(parse)){if(/http/.test(ret)){ret=ret.substr(ret.indexOf("http"))}else{ret=urljoin(MY_URL,ret)}}return ret}const parseTags={jsp:{pdfh:pdfh2,pdfa:pdfa2,pd:pd2},json:{pdfh(html,parse){if(!parse||!parse.trim()){return""}if(typeof html==="string"){html=JSON.parse(html)}parse=parse.trim();if(!parse.startsWith("$.")){parse="$."+parse}parse=parse.split("||");for(let ps of parse){let ret=cheerio.jp(ps,html);if(Array.isArray(ret)){ret=ret[0]||""}else{ret=ret||""}if(ret&&typeof ret!=="string"){ret=ret.toString()}if(ret){return ret}}return""},pdfa(html,parse){if(!parse||!parse.trim()){return""}if(typeof html==="string"){html=JSON.parse(html)}parse=parse.trim();if(!parse.startsWith("$.")){parse="$."+parse}let ret=cheerio.jp(parse,html);if(Array.isArray(ret)&&Array.isArray(ret[0])&&ret.length===1){return ret[0]||[]}return ret||[]},pd(html,parse){let ret=parseTags.json.pdfh(html,parse);if(ret){return urljoin(MY_URL,ret)}return ret}},jq:{pdfh(html,parse){if(!html||!parse||!parse.trim()){return""}parse=parse.trim();let result=defaultParser.pdfh(html,parse);return result},pdfa(html,parse){if(!html||!parse||!parse.trim()){return[]}parse=parse.trim();let result=defaultParser.pdfa(html,parse);print(`pdfa解析${parse}=>${result.length}`);return result},pd(html,parse,base_url){if(!html||!parse||!parse.trim()){return""}parse=parse.trim();base_url=base_url||MY_URL;return defaultParser.pd(html,parse,base_url)}},getParse(p0){if(p0.startsWith("jsp:")){return this.jsp}else if(p0.startsWith("json:")){return this.json}else if(p0.startsWith("jq:")){return this.jq}else{return this.jq}}};const stringify=JSON.stringify;const jsp=parseTags.jsp;const jq=parseTags.jq;function readFile(filePath){filePath=filePath||"./uri.min.js";var fd=os.open(filePath);var buffer=new ArrayBuffer(1024);var len=os.read(fd,buffer,0,1024);console.log(len);let text=String.fromCharCode.apply(null,new Uint8Array(buffer));console.log(text);return text}function dealJson(html){try{html=html.trim();if(!(html.startsWith("{")&&html.endsWith("}")||html.startsWith("[")&&html.endsWith("]"))){html="{"+html.match(/.*?\{(.*)\}/m)[1]+"}"}}catch(e){}try{html=JSON.parse(html)}catch(e){}return html}var OcrApi={api:OCR_API,classification:function(img){let code="";try{log("通过drpy_ocr验证码接口过验证...");let html=request(OCR_API,{data:{img:img},headers:{"User-Agent":PC_UA},method:"POST"},true);code=html||""}catch(e){log(`OCR识别验证码发生错误:${e.message}`)}return code}};function verifyCode(url){let cnt=0;let host=getHome(url);let cookie="";while(cntit.toLowerCase()==="set-cookie");cookie=setCk?json[setCk].split(";")[0]:""}console.log("cookie:"+cookie);let img=json.body;let code=OcrApi.classification(img);console.log(`第${cnt+1}次验证码识别结果:${code}`);let submit_url=`${host}/index.php/ajax/verify_check?type=search&verify=${code}`;console.log(submit_url);let html=request(submit_url,{headers:{Cookie:cookie,"User-Agent":MOBILE_UA},method:"POST"});html=JSON.parse(html);if(html.msg==="ok"){console.log(`第${cnt+1}次验证码提交成功`);return cookie}else if(html.msg!=="ok"&&cnt+1>=OCR_RETRY){cookie=""}}catch(e){console.log(`第${cnt+1}次验证码提交失败:${e.message}`);if(cnt+1>=OCR_RETRY){cookie=""}}cnt+=1}return cookie}function setItem(k,v){local.set(RKEY,k,v);console.log(`规则${RKEY}设置${k} => ${v}`)}function getItem(k,v){return local.get(RKEY,k)||v}function clearItem(k){local.delete(RKEY,k)}function getHome(url){if(!url){return""}let tmp=url.split("//");url=tmp[0]+"//"+tmp[1].split("/")[0];try{url=decodeURIComponent(url)}catch(e){}return url}function buildUrl(url,obj){obj=obj||{};if(url.indexOf("?")<0){url+="?"}let param_list=[];let keys=Object.keys(obj);keys.forEach(it=>{param_list.push(it+"="+obj[it])});let prs=param_list.join("&");if(keys.length>0&&!url.endsWith("?")){url+="&"}url+=prs;return url}function require(url){eval(request(url))}function request(url,obj,ocr_flag){ocr_flag=ocr_flag||false;if(typeof obj==="undefined"||!obj||obj==={}){if(!fetch_params||!fetch_params.headers){let headers={"User-Agent":MOBILE_UA};if(rule.headers){Object.assign(headers,rule.headers)}if(!fetch_params){fetch_params={}}fetch_params.headers=headers}if(!fetch_params.headers.Referer){fetch_params.headers.Referer=getHome(url)}obj=fetch_params}else{let headers=obj.headers||{};let keys=Object.keys(headers).map(it=>it.toLowerCase());if(!keys.includes("user-agent")){headers["User-Agent"]=MOBILE_UA}if(!keys.includes("referer")){headers["Referer"]=getHome(url)}obj.headers=headers}if(rule.encoding&&rule.encoding!=="utf-8"&&!ocr_flag){if(!obj.headers.hasOwnProperty("Content-Type")&&!obj.headers.hasOwnProperty("content-type")){obj.headers["Content-Type"]="text/html; charset="+rule.encoding}}if(typeof obj.body!="undefined"&&obj.body&&typeof obj.body==="string"){if(!obj.headers.hasOwnProperty("Content-Type")&&!obj.headers.hasOwnProperty("content-type")){obj.headers["Content-Type"]="application/x-www-form-urlencoded; charset="+rule.encoding}}else if(typeof obj.body!="undefined"&&obj.body&&typeof obj.body==="object"){obj.data=obj.body;delete obj.body}if(!url){return obj.withHeaders?"{}":""}if(obj.toBase64){obj.buffer=2;delete obj.toBase64}console.log(JSON.stringify(obj.headers));console.log("request:"+url+`|method:${obj.method||"GET"}|body:${obj.body||""}`);let res=req(url,obj);let html=res.content||"";if(obj.withHeaders){let htmlWithHeaders=res.headers;htmlWithHeaders.body=html;return JSON.stringify(htmlWithHeaders)}else{return html}}function post(url,obj){obj.method="POST";return request(url,obj)}fetch=request;print=function(data){data=data||"";if(typeof data=="object"&&Object.keys(data).length>0){try{data=JSON.stringify(data);console.log(data)}catch(e){console.log(typeof data+":"+data.length);return}}else if(typeof data=="object"&&Object.keys(data).length<1){console.log("null object")}else{console.log(data)}};log=print;function checkHtml(html,url,obj){if(/\?btwaf=/.test(html)){let btwaf=html.match(/btwaf(.*?)"/)[1];url=url.split("#")[0]+"?btwaf"+btwaf;print("宝塔验证访问链接:"+url);html=request(url,obj)}return html}function getCode(url,obj){let html=request(url,obj);html=checkHtml(html,url,obj);return html}function getHtml(url){let obj={};if(rule.headers){obj.headers=rule.headers}let cookie=getItem(RULE_CK,"");if(cookie){if(obj.headers&&!Object.keys(obj.headers).map(it=>it.toLowerCase()).includes("cookie")){log("历史无cookie,新增过验证后的cookie");obj.headers["Cookie"]=cookie}else if(obj.headers&&obj.headers.cookie&&obj.headers.cookie!==cookie){obj.headers["Cookie"]=cookie;log("历史有小写过期的cookie,更新过验证后的cookie")}else if(obj.headers&&obj.headers.Cookie&&obj.headers.Cookie!==cookie){obj.headers["Cookie"]=cookie;log("历史有大写过期的cookie,更新过验证后的cookie")}else if(!obj.headers){obj.headers={Cookie:cookie};log("历史无headers,更新过验证后的含cookie的headers")}}let html=getCode(url,obj);return html}function homeParse(homeObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let classes=[];if(homeObj.class_name&&homeObj.class_url){let names=homeObj.class_name.split("&");let urls=homeObj.class_url.split("&");let cnt=Math.min(names.length,urls.length);for(let i=0;i=3){try{let html=getHtml(homeObj.MY_URL);if(html){homeHtmlCache=html;let list=_pdfa(html,p[0]);if(list&&list.length>0){list.forEach((it,idex)=>{try{let name=_pdfh(it,p[1]);if(homeObj.cate_exclude&&new RegExp(homeObj.cate_exclude).test(name)){return}let url=_pd(it,p[2]);if(p.length>3&&p[3]){let exp=new RegExp(p[3]);url=url.match(exp)[1]}classes.push({type_id:url.trim(),type_name:name.trim()})}catch(e){console.log(`分类列表定位第${idex}个元素正常报错:${e.message}`)}})}}}catch(e){console.log(e.message)}}}classes=classes.filter(it=>!homeObj.cate_exclude||!new RegExp(homeObj.cate_exclude).test(it.type_name));let resp={class:classes};if(homeObj.filter){resp.filters=homeObj.filter}console.log(JSON.stringify(resp));return JSON.stringify(resp)}function getPP(p,pn,pp,ppn){try{let ps=p[pn]==="*"&&pp.length>ppn?pp[ppn]:p[pn];return ps}catch(e){return""}}function homeVodParse(homeVodObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let d=[];MY_URL=homeVodObj.homeUrl;console.log(MY_URL);let t1=(new Date).getTime();let p=homeVodObj.推荐;print("p:"+p);if(p==="*"&&rule.一级){p=rule.一级;homeVodObj.double=false}if(!p||typeof p!=="string"){return"{}"}p=p.trim();let pp=rule.一级.split(";");if(p.startsWith("js:")){const TYPE="home";var input=MY_URL;const HOST=rule.host;eval(p.replace("js:",""));d=VODS}else{p=p.split(";");if(!homeVodObj.double&&p.length<5){return"{}"}else if(homeVodObj.double&&p.length<6){return"{}"}let p0=getPP(p,0,pp,0);let _ps=parseTags.getParse(p0);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p0.startsWith("json:");p0=p0.replace(/^(jsp:|json:|jq:)/,"");let html=homeHtmlCache||getHtml(MY_URL);homeHtmlCache=undefined;if(is_json){html=dealJson(html)}try{console.log("double:"+homeVodObj.double);if(homeVodObj.double){let items=_pdfa(html,p0);let p1=getPP(p,1,pp,0);let p2=getPP(p,2,pp,1);let p3=getPP(p,3,pp,2);let p4=getPP(p,4,pp,3);let p5=getPP(p,5,pp,4);let p6=getPP(p,6,pp,5);for(let item of items){let items2=_pdfa(item,p1);for(let item2 of items2){try{let title=_pdfh(item2,p2);let img="";try{img=_pd(item2,p3)}catch(e){}let desc="";try{desc=_pdfh(item2,p4)}catch(e){}let links=[];for(let _p5 of p5.split("+")){let link=!homeVodObj.detailUrl?_pd(item2,_p5,MY_URL):_pdfh(item2,_p5);links.push(link)}let content;if(p.length>6&&p[6]){content=_pdfh(item2,p6)}else{content=""}let vid=links.join("$");if(rule.二级==="*"){vid=vid+"@@"+title+"@@"+img}let vod={vod_name:title,vod_pic:img,vod_remarks:desc,vod_content:content,vod_id:vid};d.push(vod)}catch(e){console.log("首页列表双层定位处理发生错误:"+e.message)}}}}else{let items=_pdfa(html,p0);let p1=getPP(p,1,pp,1);let p2=getPP(p,2,pp,2);let p3=getPP(p,3,pp,3);let p4=getPP(p,4,pp,4);let p5=getPP(p,5,pp,5);for(let item of items){try{let title=_pdfh(item,p1);let img="";try{img=_pd(item,p2,MY_URL)}catch(e){}let desc="";try{desc=_pdfh(item,p3)}catch(e){}let links=[];for(let _p5 of p4.split("+")){let link=!homeVodObj.detailUrl?_pd(item,_p5,MY_URL):_pdfh(item,_p5);links.push(link)}let content;if(p.length>5&&p[5]){content=_pdfh(item,p5)}else{content=""}let vid=links.join("$");if(rule.二级==="*"){vid=vid+"@@"+title+"@@"+img}let vod={vod_name:title,vod_pic:img,vod_remarks:desc,vod_content:content,vod_id:vid};d.push(vod)}catch(e){console.log("首页列表单层定位处理发生错误:"+e.message)}}}}catch(e){}}let t2=(new Date).getTime();console.log("加载首页推荐耗时:"+(t2-t1)+"毫秒");if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}if(d.length>0){print(d.slice(0,2))}return JSON.stringify({list:d})}function categoryParse(cateObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let p=cateObj.一级;if(!p||typeof p!=="string"){return"{}"}let d=[];let url=cateObj.url.replaceAll("fyclass",cateObj.tid);if(cateObj.pg===1&&url.includes("[")&&url.includes("]")){url=url.split("[")[1].split("]")[0]}else if(cateObj.pg>1&&url.includes("[")&&url.includes("]")){url=url.split("[")[0]}if(rule.filter_url){if(!/fyfilter/.test(url)){if(!url.endsWith("&")&&!rule.filter_url.startsWith("&")){url+="&"}url+=rule.filter_url}else{url=url.replace("fyfilter",rule.filter_url)}let fl=cateObj.filter?cateObj.extend:{};if(rule.filter_def&&typeof rule.filter_def==="object"){try{if(Object.keys(rule.filter_def).length>0&&rule.filter_def.hasOwnProperty(cateObj.tid)){let self_fl_def=rule.filter_def[cateObj.tid];if(self_fl_def&&typeof self_fl_def==="object"){let fl_def=JSON.parse(JSON.stringify(self_fl_def));fl=Object.assign(fl_def,fl)}}}catch(e){print("合并不同分类对应的默认筛选出错:"+e.message)}}let new_url;new_url=cheerio.jinja2(url,{fl:fl});url=new_url}if(/fypage/.test(url)){if(url.includes("(")&&url.includes(")")){let url_rep=url.match(/.*?\((.*)\)/)[1];let cnt_page=url_rep.replaceAll("fypage",cateObj.pg);let cnt_pg=eval(cnt_page);url=url.replaceAll(url_rep,cnt_pg).replaceAll("(","").replaceAll(")","")}else{url=url.replaceAll("fypage",cateObj.pg)}}MY_URL=url;console.log(MY_URL);p=p.trim();const MY_CATE=cateObj.tid;if(p.startsWith("js:")){var MY_FL=cateObj.extend;const TYPE="cate";var input=MY_URL;const MY_PAGE=cateObj.pg;var desc="";eval(p.trim().replace("js:",""));d=VODS}else{p=p.split(";");if(p.length<5){return"{}"}let _ps=parseTags.getParse(p[0]);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p[0].startsWith("json:");p[0]=p[0].replace(/^(jsp:|json:|jq:)/,"");try{let html=getHtml(MY_URL);if(html){if(is_json){html=dealJson(html)}let list=_pdfa(html,p[0]);list.forEach(it=>{let links=p[4].split("+").map(p4=>{return!rule.detailUrl?_pd(it,p4,MY_URL):_pdfh(it,p4)});let link=links.join("$");let vod_id=rule.detailUrl?MY_CATE+"$"+link:link;let vod_name=_pdfh(it,p[1]).replace(/\n|\t/g,"").trim();let vod_pic=_pd(it,p[2],MY_URL);if(rule.二级==="*"){vod_id=vod_id+"@@"+vod_name+"@@"+vod_pic}d.push({vod_id:vod_id,vod_name:vod_name,vod_pic:vod_pic,vod_remarks:_pdfh(it,p[3]).replace(/\n|\t/g,"").trim()})})}}catch(e){console.log(e.message)}}if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}if(d.length>0){print(d.slice(0,2))}let pagecount=0;if(rule.pagecount&&typeof rule.pagecount==="object"&&rule.pagecount.hasOwnProperty(MY_CATE)){print(`MY_CATE:${MY_CATE},pagecount:${JSON.stringify(rule.pagecount)}`);pagecount=parseInt(rule.pagecount[MY_CATE])}let nodata={list:[{vod_name:"无数据,防无限请求",vod_id:"no_data",vod_remarks:"不要点,会崩的",vod_pic:"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/404.jpg"}],total:1,pagecount:1,page:1,limit:1};let vod=d.length<1?JSON.stringify(nodata):JSON.stringify({page:parseInt(cateObj.pg),pagecount:pagecount||999,limit:20,total:999,list:d});return vod}function searchParse(searchObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let d=[];if(!searchObj.searchUrl){return"{}"}let p=searchObj.搜索==="*"&&rule.一级?rule.一级:searchObj.搜索;if(!p||typeof p!=="string"){return"{}"}p=p.trim();let pp=rule.一级.split(";");let url=searchObj.searchUrl.replaceAll("**",searchObj.wd).replaceAll("fypage",searchObj.pg);MY_URL=url;console.log(MY_URL);if(p.startsWith("js:")){const TYPE="search";const MY_PAGE=searchObj.pg;const KEY=searchObj.wd;var input=MY_URL;var detailUrl=rule.detailUrl||"";eval(p.trim().replace("js:",""));d=VODS}else{p=p.split(";");if(p.length<5){return"{}"}let p0=getPP(p,0,pp,0);let _ps=parseTags.getParse(p0);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p0.startsWith("json:");p0=p0.replace(/^(jsp:|json:|jq:)/,"");try{let req_method=MY_URL.split(";").length>1?MY_URL.split(";")[1].toLowerCase():"get";let html;if(req_method==="post"){let rurls=MY_URL.split(";")[0].split("#");let rurl=rurls[0];let params=rurls.length>1?rurls[1]:"";print(`post=》rurl:${rurl},params:${params}`);let _fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let postData={body:params};Object.assign(_fetch_params,postData);html=post(rurl,_fetch_params)}else if(req_method==="postjson"){let rurls=MY_URL.split(";")[0].split("#");let rurl=rurls[0];let params=rurls.length>1?rurls[1]:"";print(`postjson-》rurl:${rurl},params:${params}`);try{params=JSON.parse(params)}catch(e){params="{}"}let _fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let postData={body:params};Object.assign(_fetch_params,postData);html=post(rurl,_fetch_params)}else{html=getHtml(MY_URL)}if(html){if(/系统安全验证|输入验证码/.test(html)){let cookie=verifyCode(MY_URL);if(cookie){console.log(`本次成功过验证,cookie:${cookie}`);setItem(RULE_CK,cookie)}else{console.log(`本次自动过搜索验证失败,cookie:${cookie}`)}html=getHtml(MY_URL)}if(!html.includes(searchObj.wd)){console.log("搜索结果源码未包含关键字,疑似搜索失败,正为您打印结果源码");console.log(html)}if(is_json){html=dealJson(html)}let list=_pdfa(html,p0);let p1=getPP(p,1,pp,1);let p2=getPP(p,2,pp,2);let p3=getPP(p,3,pp,3);let p4=getPP(p,4,pp,4);let p5=getPP(p,5,pp,5);list.forEach(it=>{let links=p4.split("+").map(_p4=>{return!rule.detailUrl?_pd(it,_p4,MY_URL):_pdfh(it,_p4)});let link=links.join("$");let content;if(p.length>5&&p[5]){content=_pdfh(it,p5)}else{content=""}let vod_id=link;let vod_name=_pdfh(it,p1).replace(/\n|\t/g,"").trim();let vod_pic=_pd(it,p2,MY_URL);if(rule.二级==="*"){vod_id=vod_id+"@@"+vod_name+"@@"+vod_pic}let ob={vod_id:vod_id,vod_name:vod_name,vod_pic:vod_pic,vod_remarks:_pdfh(it,p3).replace(/\n|\t/g,"").trim(),vod_content:content.replace(/\n|\t/g,"").trim()};d.push(ob)})}}catch(e){print("搜索发生错误:"+e.message);return"{}"}}if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}return JSON.stringify({page:parseInt(searchObj.pg),pagecount:10,limit:20,total:100,list:d})}function detailParse(detailObj){let t1=(new Date).getTime();fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let orId=detailObj.orId;let vod_name="片名";let vod_pic="";let vod_id=orId;if(rule.二级==="*"){let extra=orId.split("@@");vod_name=extra.length>1?extra[1]:vod_name;vod_pic=extra.length>2?extra[2]:vod_pic}let vod={vod_id:vod_id,vod_name:vod_name,vod_pic:vod_pic,type_name:"类型",vod_year:"年份",vod_area:"地区",vod_remarks:"更新信息",vod_actor:"主演",vod_director:"导演",vod_content:"简介"};let p=detailObj.二级;let url=detailObj.url;let detailUrl=detailObj.detailUrl;let fyclass=detailObj.fyclass;let tab_exclude=detailObj.tab_exclude;let html=detailObj.html||"";MY_URL=url;if(detailObj.二级访问前){try{print(`尝试在二级访问前执行代码:${detailObj.二级访问前}`);eval(detailObj.二级访问前.trim().replace("js:",""))}catch(e){print(`二级访问前执行代码出现错误:${e.message}`)}}if(p==="*"){vod.vod_play_from="道长在线";vod.vod_remarks=detailUrl;vod.vod_actor="没有二级,只有一级链接直接嗅探播放";vod.vod_content=MY_URL;vod.vod_play_url="嗅探播放$"+MY_URL.split("@@")[0]}else if(typeof p==="string"&&p.trim().startsWith("js:")){const TYPE="detail";var input=MY_URL;var play_url="";eval(p.trim().replace("js:",""));vod=VOD;console.log(JSON.stringify(vod))}else if(p&&typeof p==="object"){let tt1=(new Date).getTime();if(!html){html=getHtml(MY_URL)}print(`二级${MY_URL}仅获取源码耗时:${(new Date).getTime()-tt1}毫秒`);let _ps;if(p.is_json){print("二级是json");_ps=parseTags.json;html=dealJson(html)}else if(p.is_jsp){print("二级是jsp");_ps=parseTags.jsp}else if(p.is_jq){print("二级是jq");_ps=parseTags.jq}else{print("二级默认jq");_ps=parseTags.jq}let tt2=(new Date).getTime();print(`二级${MY_URL}获取并装载源码耗时:${tt2-tt1}毫秒`);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;if(p.title){let p1=p.title.split(";");vod.vod_name=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim();let type_name=p1.length>1?_pdfh(html,p1[1]).replace(/\n|\t/g,"").replace(/ /g,"").trim():"";vod.type_name=type_name||vod.type_name}if(p.desc){try{let p1=p.desc.split(";");vod.vod_remarks=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim();vod.vod_year=p1.length>1?_pdfh(html,p1[1]).replace(/\n|\t/g,"").trim():"";vod.vod_area=p1.length>2?_pdfh(html,p1[2]).replace(/\n|\t/g,"").trim():"";vod.vod_actor=p1.length>3?_pdfh(html,p1[3]).replace(/\n|\t/g,"").trim():"";vod.vod_director=p1.length>4?_pdfh(html,p1[4]).replace(/\n|\t/g,"").trim():""}catch(e){}}if(p.content){try{let p1=p.content.split(";");vod.vod_content=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim()}catch(e){}}if(p.img){try{let p1=p.img.split(";");vod.vod_pic=_pd(html,p1[0],MY_URL)}catch(e){}}let vod_play_from="$$$";let playFrom=[];if(p.重定向&&p.重定向.startsWith("js:")){print("开始执行重定向代码:"+p.重定向);html=eval(p.重定向.replace("js:",""))}if(p.tabs){if(p.tabs.startsWith("js:")){print("开始执行tabs代码:"+p.tabs);var input=MY_URL;eval(p.tabs.replace("js:",""));playFrom=TABS}else{let p_tab=p.tabs.split(";")[0];let vHeader=_pdfa(html,p_tab);console.log(vHeader.length);let tab_text=p.tab_text||"body&&Text";let new_map={};for(let v of vHeader){let v_title=_pdfh(v,tab_text).trim();console.log(v_title);if(tab_exclude&&new RegExp(tab_exclude).test(v_title)){continue}if(!new_map.hasOwnProperty(v_title)){new_map[v_title]=1}else{new_map[v_title]+=1}if(new_map[v_title]>1){v_title+=Number(new_map[v_title]-1)}playFrom.push(v_title)}}console.log(JSON.stringify(playFrom))}else{playFrom=["道长在线"]}vod.vod_play_from=playFrom.join(vod_play_from);let vod_play_url="$$$";let vod_tab_list=[];if(p.lists){if(p.lists.startsWith("js:")){print("开始执行lists代码:"+p.lists);try{var input=MY_URL;var play_url="";eval(p.lists.replace("js:",""));for(let i in LISTS){if(LISTS.hasOwnProperty(i)){try{LISTS[i]=LISTS[i].map(it=>it.split("$").slice(0,2).join("$"))}catch(e){print("格式化LISTS发生错误:"+e.message)}}}vod_play_url=LISTS.map(it=>it.join("#")).join(vod_play_url)}catch(e){print("js执行lists: 发生错误:"+e.message)}}else{let list_text=p.list_text||"body&&Text";let list_url=p.list_url||"a&&href";let is_tab_js=p.tabs.trim().startsWith("js:");for(let i=0;i1&&!is_tab_js?p.tabs.split(";")[1]:"";let p1=p.lists.replaceAll("#idv",tab_name).replaceAll("#id",i);tab_ext=tab_ext.replaceAll("#idv",tab_name).replaceAll("#id",i);let tabName=tab_ext?_pdfh(html,tab_ext):tab_name;console.log(tabName);let new_vod_list=[];let tt1=(new Date).getTime();if(typeof pdfl==="function"){new_vod_list=pdfl(html,p1,list_text,list_url,MY_URL)}else{let vodList=[];try{vodList=_pdfa(html,p1);console.log("len(vodList):"+vodList.length)}catch(e){}for(let i=0;i0){new_vod_list=forceOrder(new_vod_list,"",x=>x.split("$")[0]);console.log(`drpy影响性能代码共计列表数循环次数:${new_vod_list.length},耗时:${(new Date).getTime()-tt1}毫秒`)}let vlist=new_vod_list.join("#");vod_tab_list.push(vlist)}vod_play_url=vod_tab_list.join(vod_play_url)}}vod.vod_play_url=vod_play_url}if(rule.图片来源&&vod.vod_pic&&vod.vod_pic.startsWith("http")){vod.vod_pic=vod.vod_pic+rule.图片来源}if(!vod.vod_id||vod_id.includes("$")&&vod.vod_id!==vod_id){vod.vod_id=vod_id}let t2=(new Date).getTime();console.log(`加载二级界面${MY_URL}耗时:${t2-t1}毫秒`);return JSON.stringify({list:[vod]})}function tellIsJx(url){try{let is_vip=!/\.(m3u8|mp4|m4a)$/.test(url.split("?")[0])&&是否正版(url);return is_vip?1:0}catch(e){return 1}}function playParse(playObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));MY_URL=playObj.url;if(!/http/.test(MY_URL)){try{MY_URL=base64Decode(MY_URL)}catch(e){}}MY_URL=decodeURIComponent(MY_URL);var input=MY_URL;let common_play={parse:1,url:input,jx:tellIsJx(input)};let lazy_play;if(!rule.play_parse||!rule.lazy){lazy_play=common_play}else if(rule.play_parse&&rule.lazy&&typeof rule.lazy==="string"){try{let lazy_code=rule.lazy.replace("js:","").trim();print("开始执行js免嗅=>"+lazy_code);eval(lazy_code);lazy_play=typeof input==="object"?input:{parse:1,jx:tellIsJx(input),url:input}}catch(e){print("js免嗅错误:"+e.message);lazy_play=common_play}}else{lazy_play=common_play}if(Array.isArray(rule.play_json)&&rule.play_json.length>0){let web_url=lazy_play.url;for(let pjson of rule.play_json){if(pjson.re&&(pjson.re==="*"||web_url.match(new RegExp(pjson.re)))){if(pjson.json&&typeof pjson.json==="object"){let base_json=pjson.json;lazy_play=Object.assign(lazy_play,base_json);break}}}}else if(rule.play_json&&!Array.isArray(rule.play_json)){let base_json={jx:1,parse:1};lazy_play=Object.assign(lazy_play,base_json)}else if(!rule.play_json){let base_json={jx:0,parse:1};lazy_play=Object.assign(lazy_play,base_json)}console.log(JSON.stringify(lazy_play));return JSON.stringify(lazy_play)}function init(ext){console.log("init");try{let muban=模板.getMubans();if(typeof ext=="object"){rule=ext}else if(typeof ext=="string"){if(ext.startsWith("http")){let js=request(ext,{method:"GET"});if(js){eval(js.replace("var rule","rule"))}}else{eval(ext.replace("var rule","rule"))}}if(rule.模板&&muban.hasOwnProperty(rule.模板)){print("继承模板:"+rule.模板);rule=Object.assign(muban[rule.模板],rule)}let rule_cate_excludes=(rule.cate_exclude||"").split("|").filter(it=>it.trim());let rule_tab_excludes=(rule.tab_exclude||"").split("|").filter(it=>it.trim());rule_cate_excludes=rule_cate_excludes.concat(CATE_EXCLUDE.split("|").filter(it=>it.trim()));rule_tab_excludes=rule_tab_excludes.concat(TAB_EXCLUDE.split("|").filter(it=>it.trim()));rule.cate_exclude=rule_cate_excludes.join("|");rule.tab_exclude=rule_tab_excludes.join("|");rule.host=(rule.host||"").rstrip("/");rule.url=rule.url||"";rule.double=rule.double||false;rule.homeUrl=rule.homeUrl||"";rule.detailUrl=rule.detailUrl||"";rule.searchUrl=rule.searchUrl||"";rule.homeUrl=rule.host&&rule.homeUrl?urljoin(rule.host,rule.homeUrl):rule.homeUrl||rule.host;rule.detailUrl=rule.host&&rule.detailUrl?urljoin(rule.host,rule.detailUrl):rule.detailUrl;rule.二级访问前=rule.二级访问前||"";if(rule.url.includes("[")&&rule.url.includes("]")){let u1=rule.url.split("[")[0];let u2=rule.url.split("[")[1].split("]")[0];rule.url=rule.host&&rule.url?urljoin(rule.host,u1)+"["+urljoin(rule.host,u2)+"]":rule.url}else{rule.url=rule.host&&rule.url?urljoin(rule.host,rule.url):rule.url}rule.searchUrl=rule.host&&rule.searchUrl?urljoin(rule.host,rule.searchUrl):rule.searchUrl;rule.timeout=rule.timeout||5e3;rule.encoding=rule.编码||rule.encoding||"utf-8";rule.search_encoding=rule.搜索编码||rule.search_encoding||"";rule.图片来源=rule.图片来源||"";rule.play_json=rule.hasOwnProperty("play_json")?rule.play_json:[];rule.pagecount=rule.hasOwnProperty("pagecount")?rule.pagecount:{};if(rule.headers&&typeof rule.headers==="object"){try{let header_keys=Object.keys(rule.headers);for(let k of header_keys){if(k.toLowerCase()==="user-agent"){let v=rule.headers[k];console.log(v);if(["MOBILE_UA","PC_UA","UC_UA","IOS_UA","UA"].includes(v)){rule.headers[k]=eval(v)}}else if(k.toLowerCase()==="cookie"){let v=rule.headers[k];if(v&&v.startsWith("http")){console.log(v);try{v=fetch(v);console.log(v);rule.headers[k]=v}catch(e){console.log(`从${v}获取cookie发生错误:`+e.message)}}}}}catch(e){console.log("处理headers发生错误:"+e.message)}}rule_fetch_params={headers:rule.headers||false,timeout:rule.timeout,encoding:rule.encoding};oheaders=rule.headers||{};RKEY=typeof key!=="undefined"&&key?key:"drpy_"+(rule.title||rule.host);pre();init_test()}catch(e){console.log("init_test发生错误:"+e.message)}}let homeHtmlCache=undefined;function home(filter){console.log("home");let homeObj={filter:rule.filter||false,MY_URL:rule.homeUrl,class_name:rule.class_name||"",class_url:rule.class_url||"",class_parse:rule.class_parse||"",cate_exclude:rule.cate_exclude};return homeParse(homeObj)}function homeVod(params){console.log("homeVod");let homeVodObj={"推荐":rule.推荐,double:rule.double,homeUrl:rule.homeUrl,detailUrl:rule.detailUrl};return homeVodParse(homeVodObj)}function category(tid,pg,filter,extend){let cateObj={url:rule.url,"一级":rule.一级,tid:tid,pg:parseInt(pg),filter:filter,extend:extend};return categoryParse(cateObj)}function detail(vod_url){let orId=vod_url;let fyclass="";log("orId:"+orId);if(vod_url.indexOf("$")>-1){let tmp=vod_url.split("$");fyclass=tmp[0];vod_url=tmp[1]}let detailUrl=vod_url.split("@@")[0];let url;if(!detailUrl.startsWith("http")&&!detailUrl.includes("/")){url=rule.detailUrl.replaceAll("fyid",detailUrl).replaceAll("fyclass",fyclass)}else if(detailUrl.includes("/")){url=urljoin(rule.homeUrl,detailUrl)}else{url=detailUrl}let detailObj={orId:orId,url:url,"二级":rule.二级,"二级访问前":rule.二级访问前,detailUrl:detailUrl,fyclass:fyclass,tab_exclude:rule.tab_exclude};return detailParse(detailObj)}function play(flag,id,flags){let playObj={url:id,flag:flag,flags:flags};return playParse(playObj)}function search(wd,quick){if(rule.search_encoding){if(rule.search_encoding.toLowerCase()!=="utf-8"){wd=encodeStr(wd,rule.search_encoding)}}else if(rule.encoding&&rule.encoding.toLowerCase()!=="utf-8"){wd=encodeStr(wd,rule.encoding)}let searchObj={searchUrl:rule.searchUrl,"搜索":rule.搜索,wd:wd,pg:1,quick:quick};return searchParse(searchObj)}function DRPY(){return{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search}}export default{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search,DRPY:DRPY}; \ No newline at end of file +import cheerio from"assets://js/lib/cheerio.min.js";import"assets://js/lib/crypto-js.js";import 模板 from"../js/模板.js";import{gbkTool}from"./gbk.js";function init_test(){console.log("init_test_start");console.log("当前版本号:"+VERSION);console.log(RKEY);console.log(JSON.stringify(rule));console.log("init_test_end")}function pre(){if(typeof rule.预处理==="string"&&rule.预处理&&rule.预处理.trim()){let code=rule.预处理.trim();console.log("执行预处理代码:"+code);if(code.startsWith("js:")){code=code.replace("js:","")}try{eval(code)}catch(e){console.log("预处理执行失败:"+e.message)}}}let rule={};let vercode=typeof pdfl==="function"?"drpy2.1":"drpy2";const VERSION=vercode+" 3.9.43beta1 20230607";const MOBILE_UA="Mozilla/5.0 (Linux; Android 11; M2007J3SC Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045714 Mobile Safari/537.36";const PC_UA="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36";const UA="Mozilla/5.0";const UC_UA="Mozilla/5.0 (Linux; U; Android 9; zh-CN; MI 9 Build/PKQ1.181121.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 UCBrowser/12.5.5.1035 Mobile Safari/537.36";const IOS_UA="Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1";const RULE_CK="cookie";const CATE_EXCLUDE="首页|留言|APP|下载|资讯|新闻|动态";const TAB_EXCLUDE="猜你|喜欢|下载|剧情|热播";const OCR_RETRY=3;const OCR_API="http://drpy.nokia.press:8028/ocr/drpy/text";if(typeof MY_URL==="undefined"){var MY_URL}var HOST;var RKEY;var fetch;var print;var log;var rule_fetch_params;var fetch_params;var oheaders;var _pdfh;var _pdfa;var _pd;const DOM_CHECK_ATTR=/(url|src|href|-original|-src|-play|-url)$/;const NOADD_INDEX=/:eq|:lt|:gt|:first|:last|^body$|^#/;const URLJOIN_ATTR=/(url|src|href|-original|-src|-play|-url)$/;const SELECT_REGEX=/:eq|:lt|:gt|#/g;const SELECT_REGEX_A=/:eq|:lt|:gt/g;if(typeof Object.assign!="function"){Object.assign=function(){var target=arguments[0];for(var i=1;ithis.length){return false}else{return this.indexOf(search,start)!==-1}}}if(!Array.prototype.includes){Object.defineProperty(Array.prototype,"includes",{value:function(searchElement,fromIndex){if(this==null){throw new TypeError('"this" is null or not defined')}var o=Object(this);var len=o.length>>>0;if(len===0){return false}var n=fromIndex|0;var k=Math.max(n>=0?n:len-Math.abs(n),0);while(k=end){return lists}let first=lists[start];let second=lists[end];if(key){try{first=first[key];second=second[key]}catch(e){}}if(option&&typeof option==="function"){try{first=option(first);second=option(second)}catch(e){}}first+="";second+="";if(first.match(/(\d+)/)&&second.match(/(\d+)/)){let num1=Number(first.match(/(\d+)/)[1]);let num2=Number(second.match(/(\d+)/)[1]);if(num1>num2){lists.reverse()}}return lists}let VODS=[];let VOD={};let TABS=[];let LISTS=[];globalThis.encodeUrl=urlencode;globalThis.urlencode=urlencode;function urljoin(fromPath,nowPath){fromPath=fromPath||"";nowPath=nowPath||"";return joinUrl(fromPath,nowPath)}var urljoin2=urljoin;const defaultParser={pdfh:pdfh,pdfa:pdfa,pd:pd};function pdfh2(html,parse){let html2=html;try{if(typeof html!=="string"){html2=html.rr(html.ele).toString()}}catch(e){print("html对象转文本发生了错误:"+e.message)}let result=defaultParser.pdfh(html2,parse);let option=parse.includes("&&")?parse.split("&&").slice(-1)[0]:parse.split(" ").slice(-1)[0];if(/style/.test(option.toLowerCase())&&/url\(/.test(result)){try{result=result.match(/url\((.*?)\)/)[1]}catch(e){}}return result}function pdfa2(html,parse){let html2=html;try{if(typeof html!=="string"){html2=html.rr(html.ele).toString()}}catch(e){print("html对象转文本发生了错误:"+e.message)}return defaultParser.pdfa(html2,parse)}function pd2(html,parse,uri){let ret=pdfh2(html,parse);if(typeof uri==="undefined"||!uri){uri=""}if(DOM_CHECK_ATTR.test(parse)){if(/http/.test(ret)){ret=ret.substr(ret.indexOf("http"))}else{ret=urljoin(MY_URL,ret)}}return ret}const parseTags={jsp:{pdfh:pdfh2,pdfa:pdfa2,pd:pd2},json:{pdfh(html,parse){if(!parse||!parse.trim()){return""}if(typeof html==="string"){html=JSON.parse(html)}parse=parse.trim();if(!parse.startsWith("$.")){parse="$."+parse}parse=parse.split("||");for(let ps of parse){let ret=cheerio.jp(ps,html);if(Array.isArray(ret)){ret=ret[0]||""}else{ret=ret||""}if(ret&&typeof ret!=="string"){ret=ret.toString()}if(ret){return ret}}return""},pdfa(html,parse){if(!parse||!parse.trim()){return""}if(typeof html==="string"){html=JSON.parse(html)}parse=parse.trim();if(!parse.startsWith("$.")){parse="$."+parse}let ret=cheerio.jp(parse,html);if(Array.isArray(ret)&&Array.isArray(ret[0])&&ret.length===1){return ret[0]||[]}return ret||[]},pd(html,parse){let ret=parseTags.json.pdfh(html,parse);if(ret){return urljoin(MY_URL,ret)}return ret}},jq:{pdfh(html,parse){if(!html||!parse||!parse.trim()){return""}parse=parse.trim();let result=defaultParser.pdfh(html,parse);return result},pdfa(html,parse){if(!html||!parse||!parse.trim()){return[]}parse=parse.trim();let result=defaultParser.pdfa(html,parse);print(`pdfa解析${parse}=>${result.length}`);return result},pd(html,parse,base_url){if(!html||!parse||!parse.trim()){return""}parse=parse.trim();base_url=base_url||MY_URL;return defaultParser.pd(html,parse,base_url)}},getParse(p0){if(p0.startsWith("jsp:")){return this.jsp}else if(p0.startsWith("json:")){return this.json}else if(p0.startsWith("jq:")){return this.jq}else{return this.jq}}};const stringify=JSON.stringify;const jsp=parseTags.jsp;const jq=parseTags.jq;function readFile(filePath){filePath=filePath||"./uri.min.js";var fd=os.open(filePath);var buffer=new ArrayBuffer(1024);var len=os.read(fd,buffer,0,1024);console.log(len);let text=String.fromCharCode.apply(null,new Uint8Array(buffer));console.log(text);return text}function dealJson(html){try{html=html.trim();if(!(html.startsWith("{")&&html.endsWith("}")||html.startsWith("[")&&html.endsWith("]"))){html="{"+html.match(/.*?\{(.*)\}/m)[1]+"}"}}catch(e){}try{html=JSON.parse(html)}catch(e){}return html}var OcrApi={api:OCR_API,classification:function(img){let code="";try{log("通过drpy_ocr验证码接口过验证...");let html=request(OCR_API,{data:{img:img},headers:{"User-Agent":PC_UA},method:"POST"},true);code=html||""}catch(e){log(`OCR识别验证码发生错误:${e.message}`)}return code}};function verifyCode(url){let cnt=0;let host=getHome(url);let cookie="";while(cntit.toLowerCase()==="set-cookie");cookie=setCk?json[setCk].split(";")[0]:""}console.log("cookie:"+cookie);let img=json.body;let code=OcrApi.classification(img);console.log(`第${cnt+1}次验证码识别结果:${code}`);let submit_url=`${host}/index.php/ajax/verify_check?type=search&verify=${code}`;console.log(submit_url);let html=request(submit_url,{headers:{Cookie:cookie,"User-Agent":MOBILE_UA},method:"POST"});html=JSON.parse(html);if(html.msg==="ok"){console.log(`第${cnt+1}次验证码提交成功`);return cookie}else if(html.msg!=="ok"&&cnt+1>=OCR_RETRY){cookie=""}}catch(e){console.log(`第${cnt+1}次验证码提交失败:${e.message}`);if(cnt+1>=OCR_RETRY){cookie=""}}cnt+=1}return cookie}function setItem(k,v){local.set(RKEY,k,v);console.log(`规则${RKEY}设置${k} => ${v}`)}function getItem(k,v){return local.get(RKEY,k)||v}function clearItem(k){local.delete(RKEY,k)}function getHome(url){if(!url){return""}let tmp=url.split("//");url=tmp[0]+"//"+tmp[1].split("/")[0];try{url=decodeURIComponent(url)}catch(e){}return url}function buildUrl(url,obj){obj=obj||{};if(url.indexOf("?")<0){url+="?"}let param_list=[];let keys=Object.keys(obj);keys.forEach(it=>{param_list.push(it+"="+obj[it])});let prs=param_list.join("&");if(keys.length>0&&!url.endsWith("?")){url+="&"}url+=prs;return url}function require(url){eval(request(url))}function request(url,obj,ocr_flag){ocr_flag=ocr_flag||false;if(typeof obj==="undefined"||!obj||obj==={}){if(!fetch_params||!fetch_params.headers){let headers={"User-Agent":MOBILE_UA};if(rule.headers){Object.assign(headers,rule.headers)}if(!fetch_params){fetch_params={}}fetch_params.headers=headers}if(!fetch_params.headers.Referer){fetch_params.headers.Referer=getHome(url)}obj=fetch_params}else{let headers=obj.headers||{};let keys=Object.keys(headers).map(it=>it.toLowerCase());if(!keys.includes("user-agent")){headers["User-Agent"]=MOBILE_UA}if(!keys.includes("referer")){headers["Referer"]=getHome(url)}obj.headers=headers}if(rule.encoding&&rule.encoding!=="utf-8"&&!ocr_flag){if(!obj.headers.hasOwnProperty("Content-Type")&&!obj.headers.hasOwnProperty("content-type")){obj.headers["Content-Type"]="text/html; charset="+rule.encoding}}if(typeof obj.body!="undefined"&&obj.body&&typeof obj.body==="string"){if(!obj.headers.hasOwnProperty("Content-Type")&&!obj.headers.hasOwnProperty("content-type")){obj.headers["Content-Type"]="application/x-www-form-urlencoded; charset="+rule.encoding}}else if(typeof obj.body!="undefined"&&obj.body&&typeof obj.body==="object"){obj.data=obj.body;delete obj.body}if(!url){return obj.withHeaders?"{}":""}if(obj.toBase64){obj.buffer=2;delete obj.toBase64}console.log(JSON.stringify(obj.headers));console.log("request:"+url+`|method:${obj.method||"GET"}|body:${obj.body||""}`);let res=req(url,obj);let html=res.content||"";if(obj.withHeaders){let htmlWithHeaders=res.headers;htmlWithHeaders.body=html;return JSON.stringify(htmlWithHeaders)}else{return html}}function post(url,obj){obj.method="POST";return request(url,obj)}fetch=request;print=function(data){data=data||"";if(typeof data=="object"&&Object.keys(data).length>0){try{data=JSON.stringify(data);console.log(data)}catch(e){console.log(typeof data+":"+data.length);return}}else if(typeof data=="object"&&Object.keys(data).length<1){console.log("null object")}else{console.log(data)}};log=print;function checkHtml(html,url,obj){if(/\?btwaf=/.test(html)){let btwaf=html.match(/btwaf(.*?)"/)[1];url=url.split("#")[0]+"?btwaf"+btwaf;print("宝塔验证访问链接:"+url);html=request(url,obj)}return html}function getCode(url,obj){let html=request(url,obj);html=checkHtml(html,url,obj);return html}function getHtml(url){let obj={};if(rule.headers){obj.headers=rule.headers}let cookie=getItem(RULE_CK,"");if(cookie){if(obj.headers&&!Object.keys(obj.headers).map(it=>it.toLowerCase()).includes("cookie")){log("历史无cookie,新增过验证后的cookie");obj.headers["Cookie"]=cookie}else if(obj.headers&&obj.headers.cookie&&obj.headers.cookie!==cookie){obj.headers["Cookie"]=cookie;log("历史有小写过期的cookie,更新过验证后的cookie")}else if(obj.headers&&obj.headers.Cookie&&obj.headers.Cookie!==cookie){obj.headers["Cookie"]=cookie;log("历史有大写过期的cookie,更新过验证后的cookie")}else if(!obj.headers){obj.headers={Cookie:cookie};log("历史无headers,更新过验证后的含cookie的headers")}}let html=getCode(url,obj);return html}function homeParse(homeObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let classes=[];if(homeObj.class_name&&homeObj.class_url){let names=homeObj.class_name.split("&");let urls=homeObj.class_url.split("&");let cnt=Math.min(names.length,urls.length);for(let i=0;i=3){try{let html=getHtml(homeObj.MY_URL);if(html){homeHtmlCache=html;let list=_pdfa(html,p[0]);if(list&&list.length>0){list.forEach((it,idex)=>{try{let name=_pdfh(it,p[1]);if(homeObj.cate_exclude&&new RegExp(homeObj.cate_exclude).test(name)){return}let url=_pd(it,p[2]);if(p.length>3&&p[3]){let exp=new RegExp(p[3]);url=url.match(exp)[1]}classes.push({type_id:url.trim(),type_name:name.trim()})}catch(e){console.log(`分类列表定位第${idex}个元素正常报错:${e.message}`)}})}}}catch(e){console.log(e.message)}}}classes=classes.filter(it=>!homeObj.cate_exclude||!new RegExp(homeObj.cate_exclude).test(it.type_name));let resp={class:classes};if(homeObj.filter){resp.filters=homeObj.filter}console.log(JSON.stringify(resp));return JSON.stringify(resp)}function getPP(p,pn,pp,ppn){try{let ps=p[pn]==="*"&&pp.length>ppn?pp[ppn]:p[pn];return ps}catch(e){return""}}function homeVodParse(homeVodObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let d=[];MY_URL=homeVodObj.homeUrl;console.log(MY_URL);let t1=(new Date).getTime();let p=homeVodObj.推荐;print("p:"+p);if(p==="*"&&rule.一级){p=rule.一级;homeVodObj.double=false}if(!p||typeof p!=="string"){return"{}"}p=p.trim();let pp=rule.一级.split(";");if(p.startsWith("js:")){const TYPE="home";var input=MY_URL;HOST=rule.host;eval(p.replace("js:",""));d=VODS}else{p=p.split(";");if(!homeVodObj.double&&p.length<5){return"{}"}else if(homeVodObj.double&&p.length<6){return"{}"}let p0=getPP(p,0,pp,0);let _ps=parseTags.getParse(p0);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p0.startsWith("json:");p0=p0.replace(/^(jsp:|json:|jq:)/,"");let html=homeHtmlCache||getHtml(MY_URL);homeHtmlCache=undefined;if(is_json){html=dealJson(html)}try{console.log("double:"+homeVodObj.double);if(homeVodObj.double){let items=_pdfa(html,p0);let p1=getPP(p,1,pp,0);let p2=getPP(p,2,pp,1);let p3=getPP(p,3,pp,2);let p4=getPP(p,4,pp,3);let p5=getPP(p,5,pp,4);let p6=getPP(p,6,pp,5);for(let item of items){let items2=_pdfa(item,p1);for(let item2 of items2){try{let title=_pdfh(item2,p2);let img="";try{img=_pd(item2,p3)}catch(e){}let desc="";try{desc=_pdfh(item2,p4)}catch(e){}let links=[];for(let _p5 of p5.split("+")){let link=!homeVodObj.detailUrl?_pd(item2,_p5,MY_URL):_pdfh(item2,_p5);links.push(link)}let content;if(p.length>6&&p[6]){content=_pdfh(item2,p6)}else{content=""}let vid=links.join("$");if(rule.二级==="*"){vid=vid+"@@"+title+"@@"+img}let vod={vod_name:title,vod_pic:img,vod_remarks:desc,vod_content:content,vod_id:vid};d.push(vod)}catch(e){console.log("首页列表双层定位处理发生错误:"+e.message)}}}}else{let items=_pdfa(html,p0);let p1=getPP(p,1,pp,1);let p2=getPP(p,2,pp,2);let p3=getPP(p,3,pp,3);let p4=getPP(p,4,pp,4);let p5=getPP(p,5,pp,5);for(let item of items){try{let title=_pdfh(item,p1);let img="";try{img=_pd(item,p2,MY_URL)}catch(e){}let desc="";try{desc=_pdfh(item,p3)}catch(e){}let links=[];for(let _p5 of p4.split("+")){let link=!homeVodObj.detailUrl?_pd(item,_p5,MY_URL):_pdfh(item,_p5);links.push(link)}let content;if(p.length>5&&p[5]){content=_pdfh(item,p5)}else{content=""}let vid=links.join("$");if(rule.二级==="*"){vid=vid+"@@"+title+"@@"+img}let vod={vod_name:title,vod_pic:img,vod_remarks:desc,vod_content:content,vod_id:vid};d.push(vod)}catch(e){console.log("首页列表单层定位处理发生错误:"+e.message)}}}}catch(e){}}let t2=(new Date).getTime();console.log("加载首页推荐耗时:"+(t2-t1)+"毫秒");if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}if(d.length>0){print(d.slice(0,2))}return JSON.stringify({list:d})}function categoryParse(cateObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let p=cateObj.一级;if(!p||typeof p!=="string"){return"{}"}let d=[];let url=cateObj.url.replaceAll("fyclass",cateObj.tid);if(cateObj.pg===1&&url.includes("[")&&url.includes("]")){url=url.split("[")[1].split("]")[0]}else if(cateObj.pg>1&&url.includes("[")&&url.includes("]")){url=url.split("[")[0]}if(rule.filter_url){if(!/fyfilter/.test(url)){if(!url.endsWith("&")&&!rule.filter_url.startsWith("&")){url+="&"}url+=rule.filter_url}else{url=url.replace("fyfilter",rule.filter_url)}let fl=cateObj.filter?cateObj.extend:{};if(rule.filter_def&&typeof rule.filter_def==="object"){try{if(Object.keys(rule.filter_def).length>0&&rule.filter_def.hasOwnProperty(cateObj.tid)){let self_fl_def=rule.filter_def[cateObj.tid];if(self_fl_def&&typeof self_fl_def==="object"){let fl_def=JSON.parse(JSON.stringify(self_fl_def));fl=Object.assign(fl_def,fl)}}}catch(e){print("合并不同分类对应的默认筛选出错:"+e.message)}}let new_url;new_url=cheerio.jinja2(url,{fl:fl});url=new_url}if(/fypage/.test(url)){if(url.includes("(")&&url.includes(")")){let url_rep=url.match(/.*?\((.*)\)/)[1];let cnt_page=url_rep.replaceAll("fypage",cateObj.pg);let cnt_pg=eval(cnt_page);url=url.replaceAll(url_rep,cnt_pg).replaceAll("(","").replaceAll(")","")}else{url=url.replaceAll("fypage",cateObj.pg)}}MY_URL=url;console.log(MY_URL);p=p.trim();const MY_CATE=cateObj.tid;if(p.startsWith("js:")){var MY_FL=cateObj.extend;const TYPE="cate";var input=MY_URL;const MY_PAGE=cateObj.pg;var desc="";eval(p.trim().replace("js:",""));d=VODS}else{p=p.split(";");if(p.length<5){return"{}"}let _ps=parseTags.getParse(p[0]);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p[0].startsWith("json:");p[0]=p[0].replace(/^(jsp:|json:|jq:)/,"");try{let html=getHtml(MY_URL);if(html){if(is_json){html=dealJson(html)}let list=_pdfa(html,p[0]);list.forEach(it=>{let links=p[4].split("+").map(p4=>{return!rule.detailUrl?_pd(it,p4,MY_URL):_pdfh(it,p4)});let link=links.join("$");let vod_id=rule.detailUrl?MY_CATE+"$"+link:link;let vod_name=_pdfh(it,p[1]).replace(/\n|\t/g,"").trim();let vod_pic=_pd(it,p[2],MY_URL);if(rule.二级==="*"){vod_id=vod_id+"@@"+vod_name+"@@"+vod_pic}d.push({vod_id:vod_id,vod_name:vod_name,vod_pic:vod_pic,vod_remarks:_pdfh(it,p[3]).replace(/\n|\t/g,"").trim()})})}}catch(e){console.log(e.message)}}if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}if(d.length>0){print(d.slice(0,2))}let pagecount=0;if(rule.pagecount&&typeof rule.pagecount==="object"&&rule.pagecount.hasOwnProperty(MY_CATE)){print(`MY_CATE:${MY_CATE},pagecount:${JSON.stringify(rule.pagecount)}`);pagecount=parseInt(rule.pagecount[MY_CATE])}let nodata={list:[{vod_name:"无数据,防无限请求",vod_id:"no_data",vod_remarks:"不要点,会崩的",vod_pic:"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/404.jpg"}],total:1,pagecount:1,page:1,limit:1};let vod=d.length<1?JSON.stringify(nodata):JSON.stringify({page:parseInt(cateObj.pg),pagecount:pagecount||999,limit:20,total:999,list:d});return vod}function searchParse(searchObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let d=[];if(!searchObj.searchUrl){return"{}"}let p=searchObj.搜索==="*"&&rule.一级?rule.一级:searchObj.搜索;if(!p||typeof p!=="string"){return"{}"}p=p.trim();let pp=rule.一级.split(";");let url=searchObj.searchUrl.replaceAll("**",searchObj.wd).replaceAll("fypage",searchObj.pg);MY_URL=url;console.log(MY_URL);if(p.startsWith("js:")){const TYPE="search";const MY_PAGE=searchObj.pg;const KEY=searchObj.wd;var input=MY_URL;var detailUrl=rule.detailUrl||"";eval(p.trim().replace("js:",""));d=VODS}else{p=p.split(";");if(p.length<5){return"{}"}let p0=getPP(p,0,pp,0);let _ps=parseTags.getParse(p0);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p0.startsWith("json:");p0=p0.replace(/^(jsp:|json:|jq:)/,"");try{let req_method=MY_URL.split(";").length>1?MY_URL.split(";")[1].toLowerCase():"get";let html;if(req_method==="post"){let rurls=MY_URL.split(";")[0].split("#");let rurl=rurls[0];let params=rurls.length>1?rurls[1]:"";print(`post=》rurl:${rurl},params:${params}`);let _fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let postData={body:params};Object.assign(_fetch_params,postData);html=post(rurl,_fetch_params)}else if(req_method==="postjson"){let rurls=MY_URL.split(";")[0].split("#");let rurl=rurls[0];let params=rurls.length>1?rurls[1]:"";print(`postjson-》rurl:${rurl},params:${params}`);try{params=JSON.parse(params)}catch(e){params="{}"}let _fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let postData={body:params};Object.assign(_fetch_params,postData);html=post(rurl,_fetch_params)}else{html=getHtml(MY_URL)}if(html){if(/系统安全验证|输入验证码/.test(html)){let cookie=verifyCode(MY_URL);if(cookie){console.log(`本次成功过验证,cookie:${cookie}`);setItem(RULE_CK,cookie)}else{console.log(`本次自动过搜索验证失败,cookie:${cookie}`)}html=getHtml(MY_URL)}if(!html.includes(searchObj.wd)){console.log("搜索结果源码未包含关键字,疑似搜索失败,正为您打印结果源码");console.log(html)}if(is_json){html=dealJson(html)}let list=_pdfa(html,p0);let p1=getPP(p,1,pp,1);let p2=getPP(p,2,pp,2);let p3=getPP(p,3,pp,3);let p4=getPP(p,4,pp,4);let p5=getPP(p,5,pp,5);list.forEach(it=>{let links=p4.split("+").map(_p4=>{return!rule.detailUrl?_pd(it,_p4,MY_URL):_pdfh(it,_p4)});let link=links.join("$");let content;if(p.length>5&&p[5]){content=_pdfh(it,p5)}else{content=""}let vod_id=link;let vod_name=_pdfh(it,p1).replace(/\n|\t/g,"").trim();let vod_pic=_pd(it,p2,MY_URL);if(rule.二级==="*"){vod_id=vod_id+"@@"+vod_name+"@@"+vod_pic}let ob={vod_id:vod_id,vod_name:vod_name,vod_pic:vod_pic,vod_remarks:_pdfh(it,p3).replace(/\n|\t/g,"").trim(),vod_content:content.replace(/\n|\t/g,"").trim()};d.push(ob)})}}catch(e){print("搜索发生错误:"+e.message);return"{}"}}if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}return JSON.stringify({page:parseInt(searchObj.pg),pagecount:10,limit:20,total:100,list:d})}function detailParse(detailObj){let t1=(new Date).getTime();fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let orId=detailObj.orId;let vod_name="片名";let vod_pic="";let vod_id=orId;if(rule.二级==="*"){let extra=orId.split("@@");vod_name=extra.length>1?extra[1]:vod_name;vod_pic=extra.length>2?extra[2]:vod_pic}let vod={vod_id:vod_id,vod_name:vod_name,vod_pic:vod_pic,type_name:"类型",vod_year:"年份",vod_area:"地区",vod_remarks:"更新信息",vod_actor:"主演",vod_director:"导演",vod_content:"简介"};let p=detailObj.二级;let url=detailObj.url;let detailUrl=detailObj.detailUrl;let fyclass=detailObj.fyclass;let tab_exclude=detailObj.tab_exclude;let html=detailObj.html||"";MY_URL=url;if(detailObj.二级访问前){try{print(`尝试在二级访问前执行代码:${detailObj.二级访问前}`);eval(detailObj.二级访问前.trim().replace("js:",""))}catch(e){print(`二级访问前执行代码出现错误:${e.message}`)}}if(p==="*"){vod.vod_play_from="道长在线";vod.vod_remarks=detailUrl;vod.vod_actor="没有二级,只有一级链接直接嗅探播放";vod.vod_content=MY_URL;vod.vod_play_url="嗅探播放$"+MY_URL.split("@@")[0]}else if(typeof p==="string"&&p.trim().startsWith("js:")){const TYPE="detail";var input=MY_URL;var play_url="";eval(p.trim().replace("js:",""));vod=VOD;console.log(JSON.stringify(vod))}else if(p&&typeof p==="object"){let tt1=(new Date).getTime();if(!html){html=getHtml(MY_URL)}print(`二级${MY_URL}仅获取源码耗时:${(new Date).getTime()-tt1}毫秒`);let _ps;if(p.is_json){print("二级是json");_ps=parseTags.json;html=dealJson(html)}else if(p.is_jsp){print("二级是jsp");_ps=parseTags.jsp}else if(p.is_jq){print("二级是jq");_ps=parseTags.jq}else{print("二级默认jq");_ps=parseTags.jq}let tt2=(new Date).getTime();print(`二级${MY_URL}获取并装载源码耗时:${tt2-tt1}毫秒`);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;if(p.title){let p1=p.title.split(";");vod.vod_name=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim();let type_name=p1.length>1?_pdfh(html,p1[1]).replace(/\n|\t/g,"").replace(/ /g,"").trim():"";vod.type_name=type_name||vod.type_name}if(p.desc){try{let p1=p.desc.split(";");vod.vod_remarks=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim();vod.vod_year=p1.length>1?_pdfh(html,p1[1]).replace(/\n|\t/g,"").trim():"";vod.vod_area=p1.length>2?_pdfh(html,p1[2]).replace(/\n|\t/g,"").trim():"";vod.vod_actor=p1.length>3?_pdfh(html,p1[3]).replace(/\n|\t/g,"").trim():"";vod.vod_director=p1.length>4?_pdfh(html,p1[4]).replace(/\n|\t/g,"").trim():""}catch(e){}}if(p.content){try{let p1=p.content.split(";");vod.vod_content=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim()}catch(e){}}if(p.img){try{let p1=p.img.split(";");vod.vod_pic=_pd(html,p1[0],MY_URL)}catch(e){}}let vod_play_from="$$$";let playFrom=[];if(p.重定向&&p.重定向.startsWith("js:")){print("开始执行重定向代码:"+p.重定向);html=eval(p.重定向.replace("js:",""))}if(p.tabs){if(p.tabs.startsWith("js:")){print("开始执行tabs代码:"+p.tabs);var input=MY_URL;eval(p.tabs.replace("js:",""));playFrom=TABS}else{let p_tab=p.tabs.split(";")[0];let vHeader=_pdfa(html,p_tab);console.log(vHeader.length);let tab_text=p.tab_text||"body&&Text";let new_map={};for(let v of vHeader){let v_title=_pdfh(v,tab_text).trim();console.log(v_title);if(tab_exclude&&new RegExp(tab_exclude).test(v_title)){continue}if(!new_map.hasOwnProperty(v_title)){new_map[v_title]=1}else{new_map[v_title]+=1}if(new_map[v_title]>1){v_title+=Number(new_map[v_title]-1)}playFrom.push(v_title)}}console.log(JSON.stringify(playFrom))}else{playFrom=["道长在线"]}vod.vod_play_from=playFrom.join(vod_play_from);let vod_play_url="$$$";let vod_tab_list=[];if(p.lists){if(p.lists.startsWith("js:")){print("开始执行lists代码:"+p.lists);try{var input=MY_URL;var play_url="";eval(p.lists.replace("js:",""));for(let i in LISTS){if(LISTS.hasOwnProperty(i)){try{LISTS[i]=LISTS[i].map(it=>it.split("$").slice(0,2).join("$"))}catch(e){print("格式化LISTS发生错误:"+e.message)}}}vod_play_url=LISTS.map(it=>it.join("#")).join(vod_play_url)}catch(e){print("js执行lists: 发生错误:"+e.message)}}else{let list_text=p.list_text||"body&&Text";let list_url=p.list_url||"a&&href";let is_tab_js=p.tabs.trim().startsWith("js:");for(let i=0;i1&&!is_tab_js?p.tabs.split(";")[1]:"";let p1=p.lists.replaceAll("#idv",tab_name).replaceAll("#id",i);tab_ext=tab_ext.replaceAll("#idv",tab_name).replaceAll("#id",i);let tabName=tab_ext?_pdfh(html,tab_ext):tab_name;console.log(tabName);let new_vod_list=[];let tt1=(new Date).getTime();if(typeof pdfl==="function"){new_vod_list=pdfl(html,p1,list_text,list_url,MY_URL)}else{let vodList=[];try{vodList=_pdfa(html,p1);console.log("len(vodList):"+vodList.length)}catch(e){}for(let i=0;i0){new_vod_list=forceOrder(new_vod_list,"",x=>x.split("$")[0]);console.log(`drpy影响性能代码共计列表数循环次数:${new_vod_list.length},耗时:${(new Date).getTime()-tt1}毫秒`)}let vlist=new_vod_list.join("#");vod_tab_list.push(vlist)}vod_play_url=vod_tab_list.join(vod_play_url)}}vod.vod_play_url=vod_play_url}if(rule.图片来源&&vod.vod_pic&&vod.vod_pic.startsWith("http")){vod.vod_pic=vod.vod_pic+rule.图片来源}if(!vod.vod_id||vod_id.includes("$")&&vod.vod_id!==vod_id){vod.vod_id=vod_id}let t2=(new Date).getTime();console.log(`加载二级界面${MY_URL}耗时:${t2-t1}毫秒`);return JSON.stringify({list:[vod]})}function tellIsJx(url){try{let is_vip=!/\.(m3u8|mp4|m4a)$/.test(url.split("?")[0])&&是否正版(url);return is_vip?1:0}catch(e){return 1}}function playParse(playObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));MY_URL=playObj.url;if(!/http/.test(MY_URL)){try{MY_URL=base64Decode(MY_URL)}catch(e){}}MY_URL=decodeURIComponent(MY_URL);var input=MY_URL;let common_play={parse:1,url:input,jx:tellIsJx(input)};let lazy_play;if(!rule.play_parse||!rule.lazy){lazy_play=common_play}else if(rule.play_parse&&rule.lazy&&typeof rule.lazy==="string"){try{let lazy_code=rule.lazy.replace("js:","").trim();print("开始执行js免嗅=>"+lazy_code);eval(lazy_code);lazy_play=typeof input==="object"?input:{parse:1,jx:tellIsJx(input),url:input}}catch(e){print("js免嗅错误:"+e.message);lazy_play=common_play}}else{lazy_play=common_play}if(Array.isArray(rule.play_json)&&rule.play_json.length>0){let web_url=lazy_play.url;for(let pjson of rule.play_json){if(pjson.re&&(pjson.re==="*"||web_url.match(new RegExp(pjson.re)))){if(pjson.json&&typeof pjson.json==="object"){let base_json=pjson.json;lazy_play=Object.assign(lazy_play,base_json);break}}}}else if(rule.play_json&&!Array.isArray(rule.play_json)){let base_json={jx:1,parse:1};lazy_play=Object.assign(lazy_play,base_json)}else if(!rule.play_json){let base_json={jx:0,parse:1};lazy_play=Object.assign(lazy_play,base_json)}console.log(JSON.stringify(lazy_play));return JSON.stringify(lazy_play)}function init(ext){console.log("init");try{let muban=模板.getMubans();if(typeof ext=="object"){rule=ext}else if(typeof ext=="string"){if(ext.startsWith("http")){let js=request(ext,{method:"GET"});if(js){eval(js.replace("var rule","rule"))}}else{eval(ext.replace("var rule","rule"))}}if(rule.模板&&muban.hasOwnProperty(rule.模板)){print("继承模板:"+rule.模板);rule=Object.assign(muban[rule.模板],rule)}let rule_cate_excludes=(rule.cate_exclude||"").split("|").filter(it=>it.trim());let rule_tab_excludes=(rule.tab_exclude||"").split("|").filter(it=>it.trim());rule_cate_excludes=rule_cate_excludes.concat(CATE_EXCLUDE.split("|").filter(it=>it.trim()));rule_tab_excludes=rule_tab_excludes.concat(TAB_EXCLUDE.split("|").filter(it=>it.trim()));rule.cate_exclude=rule_cate_excludes.join("|");rule.tab_exclude=rule_tab_excludes.join("|");rule.host=(rule.host||"").rstrip("/");HOST=rule.host;if(rule.hostJs){console.log(`检测到hostJs,准备执行...`);try{eval(rule.hostJs);rule.host=HOST.rstrip("/")}catch(e){console.log(`执行${rule.hostJs}获取host发生错误:`+e.message)}}rule.url=rule.url||"";rule.double=rule.double||false;rule.homeUrl=rule.homeUrl||"";rule.detailUrl=rule.detailUrl||"";rule.searchUrl=rule.searchUrl||"";rule.homeUrl=rule.host&&rule.homeUrl?urljoin(rule.host,rule.homeUrl):rule.homeUrl||rule.host;rule.detailUrl=rule.host&&rule.detailUrl?urljoin(rule.host,rule.detailUrl):rule.detailUrl;rule.二级访问前=rule.二级访问前||"";if(rule.url.includes("[")&&rule.url.includes("]")){let u1=rule.url.split("[")[0];let u2=rule.url.split("[")[1].split("]")[0];rule.url=rule.host&&rule.url?urljoin(rule.host,u1)+"["+urljoin(rule.host,u2)+"]":rule.url}else{rule.url=rule.host&&rule.url?urljoin(rule.host,rule.url):rule.url}rule.searchUrl=rule.host&&rule.searchUrl?urljoin(rule.host,rule.searchUrl):rule.searchUrl;rule.timeout=rule.timeout||5e3;rule.encoding=rule.编码||rule.encoding||"utf-8";rule.search_encoding=rule.搜索编码||rule.search_encoding||"";rule.图片来源=rule.图片来源||"";rule.play_json=rule.hasOwnProperty("play_json")?rule.play_json:[];rule.pagecount=rule.hasOwnProperty("pagecount")?rule.pagecount:{};if(rule.headers&&typeof rule.headers==="object"){try{let header_keys=Object.keys(rule.headers);for(let k of header_keys){if(k.toLowerCase()==="user-agent"){let v=rule.headers[k];console.log(v);if(["MOBILE_UA","PC_UA","UC_UA","IOS_UA","UA"].includes(v)){rule.headers[k]=eval(v)}}else if(k.toLowerCase()==="cookie"){let v=rule.headers[k];if(v&&v.startsWith("http")){console.log(v);try{v=fetch(v);console.log(v);rule.headers[k]=v}catch(e){console.log(`从${v}获取cookie发生错误:`+e.message)}}}}}catch(e){console.log("处理headers发生错误:"+e.message)}}rule_fetch_params={headers:rule.headers||false,timeout:rule.timeout,encoding:rule.encoding};oheaders=rule.headers||{};RKEY=typeof key!=="undefined"&&key?key:"drpy_"+(rule.title||rule.host);pre();init_test()}catch(e){console.log("init_test发生错误:"+e.message)}}let homeHtmlCache=undefined;function home(filter){console.log("home");let homeObj={filter:rule.filter||false,MY_URL:rule.homeUrl,class_name:rule.class_name||"",class_url:rule.class_url||"",class_parse:rule.class_parse||"",cate_exclude:rule.cate_exclude};return homeParse(homeObj)}function homeVod(params){console.log("homeVod");let homeVodObj={"推荐":rule.推荐,double:rule.double,homeUrl:rule.homeUrl,detailUrl:rule.detailUrl};return homeVodParse(homeVodObj)}function category(tid,pg,filter,extend){let cateObj={url:rule.url,"一级":rule.一级,tid:tid,pg:parseInt(pg),filter:filter,extend:extend};return categoryParse(cateObj)}function detail(vod_url){let orId=vod_url;let fyclass="";log("orId:"+orId);if(vod_url.indexOf("$")>-1){let tmp=vod_url.split("$");fyclass=tmp[0];vod_url=tmp[1]}let detailUrl=vod_url.split("@@")[0];let url;if(!detailUrl.startsWith("http")&&!detailUrl.includes("/")){url=rule.detailUrl.replaceAll("fyid",detailUrl).replaceAll("fyclass",fyclass)}else if(detailUrl.includes("/")){url=urljoin(rule.homeUrl,detailUrl)}else{url=detailUrl}let detailObj={orId:orId,url:url,"二级":rule.二级,"二级访问前":rule.二级访问前,detailUrl:detailUrl,fyclass:fyclass,tab_exclude:rule.tab_exclude};return detailParse(detailObj)}function play(flag,id,flags){let playObj={url:id,flag:flag,flags:flags};return playParse(playObj)}function search(wd,quick){if(rule.search_encoding){if(rule.search_encoding.toLowerCase()!=="utf-8"){wd=encodeStr(wd,rule.search_encoding)}}else if(rule.encoding&&rule.encoding.toLowerCase()!=="utf-8"){wd=encodeStr(wd,rule.encoding)}let searchObj={searchUrl:rule.searchUrl,"搜索":rule.搜索,wd:wd,pg:1,quick:quick};return searchParse(searchObj)}function DRPY(){return{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search}}export default{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search,DRPY:DRPY}; \ No newline at end of file diff --git a/libs/live2cms.js b/libs/live2cms.js new file mode 100644 index 0000000..9fe092a --- /dev/null +++ b/libs/live2cms.js @@ -0,0 +1,489 @@ +/** + * live2cms.js + * 配置设置 {"key":"Live2CMS","name":"直播转点播V2","type":3,"api":"{{host}}/libs/live2cms.js","searchable":2,"quickSearch":0,"filterable":0,"ext":"{{host}}/txt/json/live2mv_data.json"} + * live2mv_data.json + * 支持m3u类直播,支持线路归并。支持筛选切换显示模式 +[ +{"name": "甜蜜", "url": "http://zdir.kebedd69.repl.co/public/live.txt"}, +{"name": "俊于", "url": "http://home.jundie.top:81/Cat/tv/live.txt"}, +{"name": "菜妮丝", "url": "http://xn--ihqu10cn4c.xn--z7x900a.love:63/TV/tvzb.txt"}, +{"name": "布里m3u", "url": "http://jiexi.bulisite.top/m3u.php"}, +{"name": "吾爱", "url": "http://52bsj.vip:81/api/v3/file/get/763/live.txt?sign=87BTGT1_6AOry7FPwy_uuxFTv2Wcb9aDMj46rDdRTD8%3D%3A0"}, +{"name": "饭太硬", "url": "http://ftyyy.tk/live.txt"} +] + + * 提示 ext文件格式为json列表,name,url参数 + * 取消加密,减少性能问题 + */ +String.prototype.rstrip = function (chars) { + let regex = new RegExp(chars + "$"); + return this.replace(regex, ""); +}; +const request_timeout = 5000; +const RKEY = 'live2cms'; // 源的唯一标识 +const VERSION = 'live2cms 20230619'; +const UA = 'Mozilla/5.0'; //默认请求ua +const __ext = {data_dict:{}}; +const tips = `\n道长直播转点播js-当前版本${VERSION}`; +const def_pic = 'https://avatars.githubusercontent.com/u/97389433?s=120&v=4'; + +/** + * 存在数据库配置表里, key字段对应值value,没有就新增,有就更新,调用此方法会清除key对应的内存缓存 + * @param k 键 + * @param v 值 + */ +function setItem(k,v){ + local.set(RKEY,k,v); + console.log(`规则${RKEY}设置${k} => ${v}`) +} + +/** + * 获取数据库配置表对应的key字段的value,没有这个key就返回value默认传参.需要有缓存,第一次获取后会存在内存里 + * @param k 键 + * @param v 值 + * @returns {*} + */ +function getItem(k,v){ + return local.get(RKEY,k) || v; +} + +/** + * 删除数据库key对应的一条数据,并清除此key对应的内存缓存 + * @param k + */ +function clearItem(k){ + local.delete(RKEY,k); +} + +var showMode = getItem('showMode','groups'); // groups按组分类显示 all全部一条线路展示 + +/** + * 打印日志 + * @param any 任意变量 + */ +function print(any){ + any = any||''; + if(typeof(any)=='object'&&Object.keys(any).length>0){ + try { + any = JSON.stringify(any); + console.log(any); + }catch (e) { + // console.log('print:'+e.message); + console.log(typeof(any)+':'+any.length); + } + }else if(typeof(any)=='object'&&Object.keys(any).length<1){ + console.log('null object'); + }else{ + console.log(any); + } +} + +/*** js自封装的方法 ***/ + +/** + * 获取链接的host(带http协议的完整链接) + * @param url 任意一个正常完整的Url,自动提取根 + * @returns {string} + */ +function getHome(url){ + if(!url){ + return '' + } + let tmp = url.split('//'); + url = tmp[0] + '//' + tmp[1].split('/')[0]; + try { + url = decodeURIComponent(url); + }catch (e) {} + return url +} + +/** + * m3u直播格式转一般直播格式 + * @param m3u + * @returns {string} + */ +function convertM3uToNormal(m3u) { + try { + const lines = m3u.split('\n'); + let result = ''; + let TV=''; + // let flag='#genre#'; + let flag='#m3u#'; + let currentGroupTitle = ''; + lines.forEach((line) => { + if (line.startsWith('#EXTINF:')) { + const groupTitle = line.split('"')[1].trim(); + TV= line.split('"')[2].substring(1); + if (currentGroupTitle !== groupTitle) { + currentGroupTitle = groupTitle; + result += `\n${currentGroupTitle},${flag}\n`; + } + } else if (line.startsWith('http')) { + const splitLine = line.split(','); + result += `${TV}\,${splitLine[0]}\n`; + } + }); + return result.trim(); + }catch (e) { + print(`m3u直播转普通直播发生错误:${e.message}`); + return m3u + } +} + +/** + * 线路归类 + * @param arr + * @returns {*[][]} + */ +function merge(arr) { + var parse = arguments[1] ? arguments[1] : ''; + var p = []; + if (parse !== '' && typeof(parse)=="function") { + p = arr.map(parse); + } + const createEmptyArrays = (length) => Array.from({ + length + }, () => []); + let lists = createEmptyArrays(arr.length); + let sl = createEmptyArrays(arr.length); + (p.length ? p : arr).forEach((k, index) => { + var i = 0; + while (sl[i].includes(k)) { + i = i + 1 + } + sl[i].push(k); + lists[i].push(arr[index]); + }) + lists=lists.filter(x=>x.some(k=>k.length)); + return lists +} + +/** + * 线路归类/小棉袄算法 + * @param arr 数组 + * @param parse 解析式 + * @returns {[[*]]} + */ +function splitArray(arr,parse) { + parse = parse&&typeof(parse)=='function'?parse:''; + let result = [[arr[0]]]; + for (let i = 1; i < arr.length; i++) { + let index = -1; + for (let j = 0; j < result.length; j++) { + if (parse&&result[j].map(parse).includes(parse(arr[i]))) { + index = j; + }else if((!parse) && result[j].includes(arr[i])){ + index = j; + } + } + if (index >= result.length - 1) { + result.push([]); + result[result.length - 1].push(arr[i]); + } else { + result[index + 1].push(arr[i]); + } + } + return result; +} + +const http = function (url, options = {}) { + if(options.method ==='POST' && options.data){ + options.body = JSON.stringify(options.data); + options.headers = Object.assign({'content-type':'application/json'}, options.headers); + } + options.timeout = request_timeout; + if(!options.headers){ + options.headers = {}; + } + let keys = Object.keys(options.headers).map(it=>it.toLowerCase()); + if(!keys.includes('referer')){ + options.headers['Referer'] = getHome(url); + } + if(!keys.includes('user-agent')){ + options.headers['User-Agent'] = UA; + } + console.log(JSON.stringify(options.headers)); + try { + const res = req(url, options); + // if(options.headers['Authorization']){ + // console.log(res.content); + // } + res.json = () => res&&res.content ? JSON.parse(res.content) : null; + res.text = () => res&&res.content ? res.content:''; + return res + }catch (e) { + return { + json() { + return null + }, text() { + return '' + } + } + } +}; +["get", "post"].forEach(method => { + http[method] = function (url, options = {}) { + return http(url, Object.assign(options, {method: method.toUpperCase()})); + } +}); + +function init(ext) { + console.log("当前版本号:"+VERSION); + let data; + if (typeof ext == 'object'){ + data = ext; + print('live ext:object'); + } else if (typeof ext == 'string') { + if (ext.startsWith('http')) { + let ext_paramas = ext.split(';'); + let data_url = ext_paramas[0]; + print(data_url); + data = http.get(data_url).json(); + } + } + print(data); + __ext.data = data; + print('init执行完毕'); +} + +function home(filter) { + let classes = __ext.data.map(it => ({ + type_id: it.url, + type_name: it.name, + })); + print("----home----"); + let filter_dict = {}; + let filters = [ + {'key': 'show', 'name': '播放展示', 'value': [{'n': '多线路分组', 'v': 'groups'},{'n': '单线路', 'v': 'all'}]} + ]; + classes.forEach(it=>{ + filter_dict[it.type_id] = filters; + }); + print(classes); + return JSON.stringify({ 'class': classes,'filters': filter_dict}); +} + +function homeVod(params) { + let _get_url = __ext.data[0].url; + let html; + if(__ext.data_dict[_get_url]){ + html = __ext.data_dict[_get_url]; + }else{ + html = http.get(_get_url).text(); + if(/#EXTM3U/.test(html)){ + html = convertM3uToNormal(html); + } + __ext.data_dict[_get_url] = html; + } + // let arr = html.match(/.*?,#[\s\S].*?#/g); + let arr = html.match(/.*?[,,]#[\s\S].*?#/g); // 可能存在中文逗号 + let _list = []; + try { + arr.forEach(it=>{ + let vname = it.split(/[,,]/)[0]; + let vtab = it.match(/#(.*?)#/)[0]; + _list.push({ + vod_name:vname, + vod_id:_get_url+'$'+vname, + vod_pic:def_pic, + vod_remarks:vtab, + }); + }); + }catch (e) { + print('Live2cms获取首页推荐发送错误:'+e.message); + } + return JSON.stringify({ 'list': _list }); +} + +function category(tid, pg, filter, extend) { + let fl = filter?extend:{}; + if(fl.show){ + showMode = fl.show; + setItem('showMode',showMode); + } + if(parseInt(pg)>1){ + return JSON.stringify({ + 'list': [], + }); + } + let _get_url = tid; + let html; + if(__ext.data_dict[_get_url]){ + html = __ext.data_dict[_get_url]; + }else{ + html = http.get(_get_url).text(); + if(/#EXTM3U/.test(html)){ + html = convertM3uToNormal(html); + } + __ext.data_dict[_get_url] = html; + } + // let arr = html.match(/.*?[,,]#[\s\S].*?#/g); + let arr = html.match(/.*?[,,]#[\s\S].*?#/g); // 可能存在中文逗号 + let _list = []; + try { + arr.forEach(it=>{ + let vname = it.split(/[,,]/)[0]; + let vtab = it.match(/#(.*?)#/)[0]; + _list.push({ + // vod_name:it.split(',')[0], + vod_name:vname, + vod_id:_get_url+'$'+vname, + vod_pic:def_pic, + vod_remarks:vtab, + }); + }); + }catch (e) { + print('Live2cms获取一级分类页发生错误:'+e.message); + } + + return JSON.stringify({ + 'page': 1, + 'pagecount': 1, + 'limit': _list.length, + 'total': _list.length, + 'list': _list, + }); +} + +function detail(tid) { // ⛵ 港•澳•台 + let _get_url = tid.split('$')[0]; + let _tab = tid.split('$')[1]; + if(tid.includes('#search#')){ + let vod_play_url = _tab.replace('#search#','')+'$'+_get_url; + print(vod_play_url); + return JSON.stringify({ + list: [{ + vod_id: tid, + vod_name: '搜索:'+_tab.replace('#search#',''), + type_name: "直播列表", + vod_pic: def_pic, + vod_content: tid, + vod_play_from: '来自搜索', + vod_play_url: vod_play_url, + vod_director: tips, + vod_remarks: `道长直播转点播js-当前版本${VERSION}`, + }] + }); + } + let html; + if(__ext.data_dict[_get_url]){ + html = __ext.data_dict[_get_url]; + }else{ + html = http.get(_get_url).text(); + if(/#EXTM3U/.test(html)){ + html = convertM3uToNormal(html); + } + __ext.data_dict[_get_url] = html; + } + // let a = new RegExp(`.*?${_tab},#[\\s\\S].*?#`); + let a = new RegExp(`.*?${_tab.replace('(','\\(').replace(')','\\)')}[,,]#[\\s\\S].*?#`); + let b = html.match(a)[0]; + let c = html.split(b)[1]; + if(c.match(/.*?[,,]#[\s\S].*?#/)){ + let d = c.match(/.*?[,,]#[\s\S].*?#/)[0]; + c = c.split(d)[0]; + } + let arr = c.trim().split('\n'); + let _list = []; + arr.forEach((it)=>{ + if(it.trim()){ + let t = it.trim().split(',')[0]; + let u = it.trim().split(',')[1]; + _list.push(t+'$'+u); + } + }); + + let vod_name = __ext.data.find(x=>x.url===_get_url).name; + let vod_play_url; + let vod_play_from; + + if(showMode==='groups'){ + let groups = splitArray(_list,x=>x.split('$')[0]); + let tabs = []; + for(let i=0;iit.join('#')).join('$$$'); + vod_play_from = tabs.join('$$$'); + }else{ + vod_play_url = _list.join('#'); + vod_play_from = vod_name; + } + let vod = { + vod_id: tid, + vod_name: vod_name+'|'+_tab, + type_name: "直播列表", + vod_pic: def_pic, + vod_content: tid, + vod_play_from: vod_play_from, + vod_play_url: vod_play_url, + vod_director: tips, + vod_remarks: `道长直播转点播js-当前版本${VERSION}`, + }; + + return JSON.stringify({ + list: [vod] + }); +} + +function play(flag, id, flags) { + let vod = { + 'parse': /m3u8/.test(id)?0:1, + 'playUrl': '', + 'url': id + }; + print(vod); + return JSON.stringify(vod); +} + +function search(wd, quick) { + let _get_url = __ext.data[0].url; + let html; + if(__ext.data_dict[_get_url]){ + html = __ext.data_dict[_get_url]; + }else{ + html = http.get(_get_url).text(); + if(/#EXTM3U/.test(html)){ + html = convertM3uToNormal(html); + } + __ext.data_dict[_get_url] = html; + } + let str=''; + Object.keys(__ext.data_dict).forEach(()=>{ + str+=__ext.data_dict[_get_url]; + }); + let links = str.split('\n').filter(it=>it.trim() && it.includes(',')); + links = links.map(it=>it.trim()); + let plays = Array.from(new Set(links)); + print('搜索关键词:'+wd); + print('过滤前:'+plays.length); + plays = plays.filter(it=>it.includes(wd)); + print('过滤后:'+plays.length); + print(plays); + let _list = []; + plays.forEach((it)=>{ + _list.push({ + 'vod_name':it.split(',')[0], + 'vod_id':it.split(',')[1].trim()+'$'+it.split(',')[0].trim()+'#search#', + 'vod_pic':def_pic, + }) + }); + return JSON.stringify({ + 'list': _list + }); +} + +// 导出函数对象 +export default { + init: init, + home: home, + homeVod: homeVod, + category: category, + detail: detail, + play: play, + search: search +} diff --git a/libs/pre.js b/libs/pre.js index 3180124..fb957f3 100644 --- a/libs/pre.js +++ b/libs/pre.js @@ -229,7 +229,10 @@ function request(url,obj){ }else{ new_obj = obj||{} } - if(!new_obj||!new_obj.headers||(!new_obj.headers['User-Agent']&&!new_obj.headers['user-agent'])){ + if(!new_obj||!new_obj.headers){ + new_obj.headers = {}; + } + if(!new_obj.headers['User-Agent']&&!new_obj.headers['user-agent']){ new_obj.headers['User-Agent'] = MOBILE_UA; } // delete new_obj.headers['Referer']; diff --git a/readme.md b/readme.md index 2e8ac6c..fb873de 100644 --- a/readme.md +++ b/readme.md @@ -4,14 +4,14 @@ logo

🗂️A webServer convert web and x5 movie sites to cms api data

- latest version + latest version discussions - - Downloads + + Downloads @@ -49,6 +49,7 @@ [JS引擎的选择](./doc/python最强js引擎.md) [我的豆瓣](./static/img/豆瓣.png) [爱看不看](https://jason-ray.notion.site/jason-ray/Pluto-TVB-706da08332804a19ab012b4f8385df64)|[goorm](./doc/道长乱说.md)|[大佬地盘](./doc/大佬友链.md) +[其他语言实现drpy-cms接口](./doc/接口文档.md) [dr项目QQ官群](https://qm.qq.com/cgi-bin/qm/qr?k=H2KwcXrMdiR5M2blHR5gjZzPfN_S3N_C&jump_from=webapi) @@ -59,10 +60,15 @@ cd utils && wget https://ghproxy.liuzhicong.com/https://raw.githubusercontent.co ``` 执行后重启9001或者docker即可正常检测升级 +### 谷歌浏览器跨域支持嗅探 +```text +"C:\Program Files\Google\Chrome\Application\chrome.exe" --disable-site-isolation-trials --disable-web-security --disable-features=SameSiteByDefaultCookies,CookiesWithoutSameSiteMustBeSecure --user-data-dir=C:\Program Files\Google\Chrome\Application +``` #### 参考地址 [参考T4](https://github.com/sec-an/TV_Spider/blob/main/spider/sp360.py) -[golang最好的js引擎-otto](https://github.com/robertkrimen/otto) +[golang最好的js引擎-goja](https://github.com/dop251/goja) +[安卓最好的js引擎](https://github.com/HarlonWang/quickjs-wrapper) [flutter最好的js引擎-dart_quickjs](https://pub.flutter-io.cn/packages/dart_quickjs) [dockerfile教程](https://blog.csdn.net/qq_46158060/article/details/125718218) [获取本地设备信息](https://blog.csdn.net/cui_yonghua/article/details/125508991) diff --git a/static/js/jquery.js b/static/js/jquery.js new file mode 100644 index 0000000..5c3c456 --- /dev/null +++ b/static/js/jquery.js @@ -0,0 +1,9814 @@ +/*! + * jQuery JavaScript Library v2.2.4 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2016-05-20T17:23Z + */ + +(function( global, factory ) { + + if ( typeof module === "object" && typeof module.exports === "object" ) { + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Support: Firefox 18+ +// Can't be in strict mode, several libs including ASP.NET trace +// the stack via arguments.caller.callee and Firefox dies if +// you try to trace through "use strict" call chains. (#13335) +//"use strict"; +var arr = []; + +var document = window.document; + +var slice = arr.slice; + +var concat = arr.concat; + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var support = {}; + + + +var + version = "2.2.4", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android<4.1 + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([\da-z])/gi, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // Start with an empty selector + selector: "", + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num != null ? + + // Return just the one element from the set + ( num < 0 ? this[ num + this.length ] : this[ num ] ) : + + // Return all the elements in a clean array + slice.call( this ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + ret.context = this.context; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = jQuery.isArray( copy ) ) ) ) { + + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray( src ) ? src : []; + + } else { + clone = src && jQuery.isPlainObject( src ) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isFunction: function( obj ) { + return jQuery.type( obj ) === "function"; + }, + + isArray: Array.isArray, + + isWindow: function( obj ) { + return obj != null && obj === obj.window; + }, + + isNumeric: function( obj ) { + + // parseFloat NaNs numeric-cast false positives (null|true|false|"") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + // adding 1 corrects loss of precision from parseFloat (#15100) + var realStringObj = obj && obj.toString(); + return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0; + }, + + isPlainObject: function( obj ) { + var key; + + // Not plain objects: + // - Any object or value whose internal [[Class]] property is not "[object Object]" + // - DOM nodes + // - window + if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call( obj, "constructor" ) && + !hasOwn.call( obj.constructor.prototype || {}, "isPrototypeOf" ) ) { + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android<4.0, iOS<6 (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; + }, + + // Evaluates a script in a global context + globalEval: function( code ) { + var script, + indirect = eval; + + code = jQuery.trim( code ); + + if ( code ) { + + // If the code includes a valid, prologue position + // strict mode pragma, execute code by injecting a + // script tag into the document. + if ( code.indexOf( "use strict" ) === 1 ) { + script = document.createElement( "script" ); + script.text = code; + document.head.appendChild( script ).parentNode.removeChild( script ); + } else { + + // Otherwise, avoid the DOM node creation, insertion + // and removal by using an indirect global eval + + indirect( code ); + } + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Support: IE9-11+ + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // Support: Android<4.1 + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var tmp, args, proxy; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: Date.now, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +// JSHint would error on this code due to the Symbol not being defined in ES5. +// Defining this global in .jshintrc would create a danger of using the global +// unguarded in another place, it seems safer to just disable JSHint for these +// three lines. +/* jshint ignore: start */ +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} +/* jshint ignore: end */ + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: iOS 8.2 (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.2.1 + * http://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2015-10-17 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // General-purpose constants + MAX_NEGATIVE = 1 << 31, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // http://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + rescape = /'|\\/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }; + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, nidselect, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + + // ID selector + if ( (m = match[1]) ) { + + // Document context + if ( nodeType === 9 ) { + if ( (elem = context.getElementById( m )) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && (elem = newContext.getElementById( m )) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( (m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !compilerCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + + if ( nodeType !== 1 ) { + newContext = context; + newSelector = selector; + + // qSA looks outside Element context, which is not what we want + // Thanks to Andrew Dupont for this workaround technique + // Support: IE <=8 + // Exclude object elements + } else if ( context.nodeName.toLowerCase() !== "object" ) { + + // Capture the context ID, setting it first if necessary + if ( (nid = context.getAttribute( "id" )) ) { + nid = nid.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", (nid = expando) ); + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']"; + while ( i-- ) { + groups[i] = nidselect + " " + toSelector( groups[i] ); + } + newSelector = groups.join( "," ); + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ +function assert( fn ) { + var div = document.createElement("div"); + + try { + return !!fn( div ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( div.parentNode ) { + div.parentNode.removeChild( div ); + } + // release memory in IE + div = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + ( ~b.sourceIndex || MAX_NEGATIVE ) - + ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, parent, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9-11, Edge + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + if ( (parent = document.defaultView) && parent.top !== parent ) { + // Support: IE 11 + if ( parent.addEventListener ) { + parent.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( parent.attachEvent ) { + parent.attachEvent( "onunload", unloadHandler ); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( div ) { + div.className = "i"; + return !div.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( div ) { + div.appendChild( document.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( div ) { + docElem.appendChild( div ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + }); + + // ID find and filter + if ( support.getById ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var m = context.getElementById( id ); + return m ? [ m ] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + // Support: IE6/7 + // getElementById is not reliable as a find shortcut + delete Expr.find["ID"]; + + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See http://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + docElem.appendChild( div ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( div.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibing-combinator selector` fails + if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( div ) { + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement("input"); + input.setAttribute( "type", "hidden" ); + div.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( div.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === document ? -1 : + b === document ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + !compilerCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + // Use previously-cached element index if available + if ( useCache ) { + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); + + if ( (oldCache = uniqueCache[ dir ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ dir ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context === document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + if ( !context && elem.ownerDocument !== document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context || document, xml) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + support.getById && context.nodeType === 9 && documentIsHTML && + Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( div1 ) { + // Should return 1, but returns 4 (following) + return div1.compareDocumentPosition( document.createElement("div") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( div ) { + div.innerHTML = ""; + return div.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( div ) { + div.innerHTML = ""; + div.firstChild.setAttribute( "value", "" ); + return div.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( div ) { + return div.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + +var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ ); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + /* jshint -W018 */ + return !!qualifier.call( elem, i, elem ) !== not; + } ); + + } + + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + + } + + if ( typeof qualifier === "string" ) { + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + qualifier = jQuery.filter( qualifier, elements ); + } + + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 && elem.nodeType === 1 ? + jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : + jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, + len = this.length, + ret = [], + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + // Needed because $( selector, context ) becomes $( context ).find( selector ) + ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); + ret.selector = this.selector ? this.selector + " " + selector : selector; + return ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + // Support: Blackberry 4.6 + // gEBID returns nodes no longer in the document (#6963) + if ( elem && elem.parentNode ) { + + // Inject the element directly into the jQuery object + this.length = 1; + this[ 0 ] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this.context = this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( pos ? + pos.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + return elem.contentDocument || jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnotwhite = ( /\S+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( jQuery.isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ], + [ "notify", "progress", jQuery.Callbacks( "memory" ) ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; + + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this === promise ? newDefer.promise() : this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( function() { + + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments ); + return this; + }; + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || + ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. + // If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( values === progressValues ) { + deferred.notifyWith( contexts, values ); + } else if ( !( --remaining ) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // Add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .progress( updateFunc( i, progressContexts, progressValues ) ) + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ); + } else { + --remaining; + } + } + } + + // If we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } +} ); + + +// The deferred used on DOM ready +var readyList; + +jQuery.fn.ready = function( fn ) { + + // Add the callback + jQuery.ready.promise().done( fn ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.triggerHandler ) { + jQuery( document ).triggerHandler( "ready" ); + jQuery( document ).off( "ready" ); + } + } +} ); + +/** + * The ready event handler and self cleanup method + */ +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +jQuery.ready.promise = function( obj ) { + if ( !readyList ) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called + // after the browser event has already occurred. + // Support: IE9-10 only + // Older IE sometimes signals "interactive" too soon + if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + + } else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); + } + } + return readyList.promise( obj ); +}; + +// Kick off the DOM ready check even if the user does not +jQuery.ready.promise(); + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + len ? fn( elems[ 0 ], key ) : emptyGet; +}; +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + /* jshint -W018 */ + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + register: function( owner, initial ) { + var value = initial || {}; + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable, non-writable property + // configurability must be true to allow the property to be + // deleted with the delete operator + } else { + Object.defineProperty( owner, this.expando, { + value: value, + writable: true, + configurable: true + } ); + } + return owner[ this.expando ]; + }, + cache: function( owner ) { + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( !acceptData( owner ) ) { + return {}; + } + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + if ( typeof data === "string" ) { + cache[ data ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ prop ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + owner[ this.expando ] && owner[ this.expando ][ key ]; + }, + access: function( owner, key, value ) { + var stored; + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + stored = this.get( owner, key ); + + return stored !== undefined ? + stored : this.get( owner, jQuery.camelCase( key ) ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, name, camel, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key === undefined ) { + this.register( owner ); + + } else { + + // Support array or space separated string of keys + if ( jQuery.isArray( key ) ) { + + // If "name" is an array of keys... + // When data is initially created, via ("key", "val") signature, + // keys will be converted to camelCase. + // Since there is no way to tell _how_ a key was added, remove + // both plain key and camelCase key. #12786 + // This will only penalize the array argument path. + name = key.concat( key.map( jQuery.camelCase ) ); + } else { + camel = jQuery.camelCase( key ); + + // Try the string as a key before any manipulation + if ( key in cache ) { + name = [ key, camel ]; + } else { + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + name = camel; + name = name in cache ? + [ name ] : ( name.match( rnotwhite ) || [] ); + } + } + + i = name.length; + + while ( i-- ) { + delete cache[ name[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <= 35-45+ + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://code.google.com/p/chromium/issues/detail?id=378607 + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE11+ + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data, camelKey; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // with the key as-is + data = dataUser.get( elem, key ) || + + // Try to find dashed key if it exists (gh-2779) + // This is for 2.2.x only + dataUser.get( elem, key.replace( rmultiDash, "-$&" ).toLowerCase() ); + + if ( data !== undefined ) { + return data; + } + + camelKey = jQuery.camelCase( key ); + + // Attempt to get data from the cache + // with the key camelized + data = dataUser.get( elem, camelKey ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, camelKey, undefined ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + camelKey = jQuery.camelCase( key ); + this.each( function() { + + // First, attempt to store a copy or reference of any + // data that might've been store with a camelCased key. + var data = dataUser.get( this, camelKey ); + + // For HTML5 data-* attribute interop, we have to + // store property names with dashes in a camelCase form. + // This might not apply to all properties...* + dataUser.set( this, camelKey, value ); + + // *... In the case of properties that might _actually_ + // have dashes, we need to also store a copy of that + // unchanged property. + if ( key.indexOf( "-" ) > -1 && data !== undefined ) { + dataUser.set( this, key, value ); + } + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHidden = function( elem, el ) { + + // isHidden might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || + !jQuery.contains( elem.ownerDocument, elem ); + }; + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, + scale = 1, + maxIterations = 20, + currentValue = tween ? + function() { return tween.cur(); } : + function() { return jQuery.css( elem, prop, "" ); }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + do { + + // If previous iteration zeroed out, double until we get *something*. + // Use string for doubling so we don't accidentally see scale as unchanged below + scale = scale || ".5"; + + // Adjust and apply + initialInUnit = initialInUnit / scale; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Update scale, tolerating zero or NaN from tween.cur() + // Break the loop if scale is unchanged or perfect, or if we've just had enough. + } while ( + scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations + ); + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([\w:-]+)/ ); + +var rscriptType = ( /^$|\/(?:java|ecma)script/i ); + + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // Support: IE9 + option: [ 1, "" ], + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
" ], + col: [ 2, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + _default: [ 0, "", "" ] +}; + +// Support: IE9 +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function getAll( context, tag ) { + + // Support: IE9-11+ + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( tag || "*" ) : + typeof context.querySelectorAll !== "undefined" ? + context.querySelectorAll( tag || "*" ) : + []; + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], ret ) : + ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, contains, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + + // Support: Android<4.1, PhantomJS<2 + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android<4.1, PhantomJS<2 + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0-4.3, Safari<=5.1 + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Safari<=5.1, Android<4.2 + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE<=11+ + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; +} )(); + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE9 +// See #13393 for more info +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = {}; + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event ); + + var i, j, ret, matched, handleObj, + handlerQueue = [], + args = slice.call( arguments ), + handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, matches, sel, handleObj, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Support (at least): Chrome, IE9 + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // + // Support: Firefox<=42+ + // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343) + if ( delegateCount && cur.nodeType && + ( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push( { elem: cur, handlers: matches } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " + + "metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split( " " ), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: ( "button buttons clientX clientY offsetX offsetY pageX pageY " + + "screenX screenY toElement" ).split( " " ), + filter: function( event, original ) { + var eventDoc, doc, body, + button = original.button; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - + ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - + ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: Cordova 2.5 (WebKit) (#13255) + // All events should have a target; Cordova deviceready doesn't + if ( !event.target ) { + event.target = document; + } + + // Support: Safari 6.0+, Chrome<28 + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + this.focus(); + return false; + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android<4.0 + src.returnValue === false ? + returnTrue : + returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://code.google.com/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi, + + // Support: IE 10-11, Edge 10240+ + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Manipulating tables requires a tbody +function manipulationTarget( elem, content ) { + return jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? + + elem.getElementsByTagName( "tbody" )[ 0 ] || + elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) : + elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + + if ( match ) { + elem.type = match[ 1 ]; + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.access( src ); + pdataCur = dataPriv.set( dest, pdataOld ); + events = pdataOld.events; + + if ( events ) { + delete pdataCur.handle; + pdataCur.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( isFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android<4.1, PhantomJS<2 + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html.replace( rxhtmlTag, "<$1>" ); + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = jQuery.contains( elem.ownerDocument, elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <= 35-45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <= 35-45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + + // Keep domManip exposed until 3.0 (gh-2225) + domManip: domManip, + + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: QtWebKit + // .get() because push.apply(_, arraylike) throws + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); + + +var iframe, + elemdisplay = { + + // Support: Firefox + // We have to pre-define these values for FF (#10227) + HTML: "block", + BODY: "block" + }; + +/** + * Retrieve the actual display of a element + * @param {String} name nodeName of the element + * @param {Object} doc Document object + */ + +// Called only from within defaultDisplay +function actualDisplay( name, doc ) { + var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), + + display = jQuery.css( elem[ 0 ], "display" ); + + // We don't have any data stored on the element, + // so use "detach" method as fast way to get rid of the element + elem.detach(); + + return display; +} + +/** + * Try to determine the default display value of an element + * @param {String} nodeName + */ +function defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + + // Use the already-created iframe if possible + iframe = ( iframe || jQuery( " @@ -278,12 +278,17 @@ const app = createApp({ if(res.redirect){ // 重定向的直接设置播放器的值 if(isVideo(res.url)){ // 判断重定向的为直链 methods.setPlayUrl(res.url); + return }else{ console.log('重定向待嗅探页面,但是由于跨域问题,只好内嵌播放页播放'); iframeSrc.value = res.url; } - return - // throw new Error('重定向网页直接播放,尝试嗅探(存在跨域无法嗅探问题,暂时考虑直接内嵌人家的播放页)'); + console.log(location.href); + if(location.href.includes('debug=1')){ + throw new Error('重定向网页直接播放,尝试嗅探(存在跨域无法嗅探问题,暂时考虑直接内嵌人家的播放页)'); + }else{ + return + } } // const res = await axios.get(url,{maxRedirects: 0}); @@ -374,6 +379,9 @@ const app = createApp({ // iframeSrc.value = ctx.value.path+'?url='+'https://sf9-dycdn-tos.pstatp.com/obj/tos-cn-i-8gu37r9deh/7c399215485c40cb9f1d1da640354a12?filename=1.mp4'; }, setPlayUrl(url){ + if(url.includes('url=')){ + url = url.split('url=')[1]; + } iframeSrc.value = ctx.value.path+'?url='+url; } } diff --git a/templates/config.txt b/templates/config.txt index 71be952..4620b86 100644 --- a/templates/config.txt +++ b/templates/config.txt @@ -4,7 +4,7 @@ "mode": {{ mode }}, "spider": "{{ host }}/liveslib", {% if alists|length > 0 %}"drives": {{alists_str}},{% endif %} -"homepage":"https://gitcode.net/qq_32394351/dr_py", +"homepage":"https://github.com/hjdhnx/dr_py", "sites": [{% for rule in rules.list %}{% if js_mode != 1 %} { "key":"dr_{{ rule.name }}", diff --git a/templates/edit_rule.html b/templates/edit_rule.html new file mode 100644 index 0000000..621d5de --- /dev/null +++ b/templates/edit_rule.html @@ -0,0 +1,279 @@ + + + + + 规则编辑 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ +
+ + + + + + + +
+
+ +
+ +
+ +
+
+
+ +
+
+ +
+ + + + + +
+
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/templates/edit_rule_mobile.html b/templates/edit_rule_mobile.html new file mode 100644 index 0000000..b2d3886 --- /dev/null +++ b/templates/edit_rule_mobile.html @@ -0,0 +1,165 @@ + + + + + 规则编辑-{{name}} + + + + + + + + + + + + + +
+ + +
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/templates/player/p2phls/cbplayer2.js b/templates/player/p2phls/cbplayer2.js new file mode 100644 index 0000000..8793e6d --- /dev/null +++ b/templates/player/p2phls/cbplayer2.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("CBPlayer",[],t):"object"==typeof exports?exports.CBPlayer=t():e.CBPlayer=t()}(window,(function(){return function(e){var t={};function n(a){if(t[a])return t[a].exports;var i=t[a]={i:a,l:!1,exports:{}};return e[a].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=e,n.c=t,n.d=function(e,t,a){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:a})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(n.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(a,i,function(t){return e[t]}.bind(null,i));return a},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=58)}([function(e,t,n){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var i=n(7),o=Object.prototype.toString;function r(e){return"[object Array]"===o.call(e)}function l(e){return void 0===e}function s(e){return null!==e&&"object"===a(e)}function p(e){if("[object Object]"!==o.call(e))return!1;var t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}function d(e){return"[object Function]"===o.call(e)}function c(e,t){if(null!=e)if("object"!==a(e)&&(e=[e]),r(e))for(var n=0,i=e.length;n\n ",n&&(t+='\n \n '),t+="\n"}},function(e,t,n){"use strict";var a=n(1),i=n.n(a),o=n(17),r=i()((function(e){return e[1]}));r.i(o.a),r.push([e.i,'@-webkit-keyframes my-face{2%{transform:translateY(1.5px) rotate(1.5deg)}4%{transform:translateY(-1.5px) rotate(-.5deg)}6%{transform:translateY(1.5px) rotate(-1.5deg)}8%{transform:translateY(-1.5px) rotate(-1.5deg)}10%{transform:translateY(2.5px) rotate(1.5deg)}12%{transform:translateY(-.5px) rotate(1.5deg)}14%{transform:translateY(-1.5px) rotate(1.5deg)}16%{transform:translateY(-.5px) rotate(-1.5deg)}18%{transform:translateY(.5px) rotate(-1.5deg)}20%{transform:translateY(-1.5px) rotate(2.5deg)}22%{transform:translateY(.5px) rotate(-1.5deg)}24%{transform:translateY(1.5px) rotate(1.5deg)}26%{transform:translateY(.5px) rotate(.5deg)}28%{transform:translateY(.5px) rotate(1.5deg)}30%{transform:translateY(-.5px) rotate(2.5deg)}32%{transform:translateY(1.5px) rotate(-.5deg)}34%{transform:translateY(1.5px) rotate(-.5deg)}36%{transform:translateY(-1.5px) rotate(2.5deg)}38%{transform:translateY(1.5px) rotate(-1.5deg)}40%{transform:translateY(-.5px) rotate(2.5deg)}42%{transform:translateY(2.5px) rotate(-1.5deg)}44%{transform:translateY(1.5px) rotate(.5deg)}46%{transform:translateY(-1.5px) rotate(2.5deg)}48%{transform:translateY(-.5px) rotate(.5deg)}50%{transform:translateY(.5px) rotate(.5deg)}52%{transform:translateY(2.5px) rotate(2.5deg)}54%{transform:translateY(-1.5px) rotate(1.5deg)}56%{transform:translateY(2.5px) rotate(2.5deg)}58%{transform:translateY(.5px) rotate(2.5deg)}60%{transform:translateY(2.5px) rotate(2.5deg)}62%{transform:translateY(-.5px) rotate(2.5deg)}64%{transform:translateY(-.5px) rotate(1.5deg)}66%{transform:translateY(1.5px) rotate(-.5deg)}68%{transform:translateY(-1.5px) rotate(-.5deg)}70%{transform:translateY(1.5px) rotate(.5deg)}72%{transform:translateY(2.5px) rotate(1.5deg)}74%{transform:translateY(-.5px) rotate(.5deg)}76%{transform:translateY(-.5px) rotate(2.5deg)}78%{transform:translateY(-.5px) rotate(1.5deg)}80%{transform:translateY(1.5px) rotate(1.5deg)}82%{transform:translateY(-.5px) rotate(.5deg)}84%{transform:translateY(1.5px) rotate(2.5deg)}86%{transform:translateY(-1.5px) rotate(-1.5deg)}88%{transform:translateY(-.5px) rotate(2.5deg)}90%{transform:translateY(2.5px) rotate(-.5deg)}92%{transform:translateY(.5px) rotate(-.5deg)}94%{transform:translateY(2.5px) rotate(.5deg)}96%{transform:translateY(-.5px) rotate(1.5deg)}98%{transform:translateY(-1.5px) rotate(-.5deg)}0%,to{transform:translate(0) rotate(0deg)}}@keyframes my-face{2%{transform:translateY(1.5px) rotate(1.5deg)}4%{transform:translateY(-1.5px) rotate(-.5deg)}6%{transform:translateY(1.5px) rotate(-1.5deg)}8%{transform:translateY(-1.5px) rotate(-1.5deg)}10%{transform:translateY(2.5px) rotate(1.5deg)}12%{transform:translateY(-.5px) rotate(1.5deg)}14%{transform:translateY(-1.5px) rotate(1.5deg)}16%{transform:translateY(-.5px) rotate(-1.5deg)}18%{transform:translateY(.5px) rotate(-1.5deg)}20%{transform:translateY(-1.5px) rotate(2.5deg)}22%{transform:translateY(.5px) rotate(-1.5deg)}24%{transform:translateY(1.5px) rotate(1.5deg)}26%{transform:translateY(.5px) rotate(.5deg)}28%{transform:translateY(.5px) rotate(1.5deg)}30%{transform:translateY(-.5px) rotate(2.5deg)}32%{transform:translateY(1.5px) rotate(-.5deg)}34%{transform:translateY(1.5px) rotate(-.5deg)}36%{transform:translateY(-1.5px) rotate(2.5deg)}38%{transform:translateY(1.5px) rotate(-1.5deg)}40%{transform:translateY(-.5px) rotate(2.5deg)}42%{transform:translateY(2.5px) rotate(-1.5deg)}44%{transform:translateY(1.5px) rotate(.5deg)}46%{transform:translateY(-1.5px) rotate(2.5deg)}48%{transform:translateY(-.5px) rotate(.5deg)}50%{transform:translateY(.5px) rotate(.5deg)}52%{transform:translateY(2.5px) rotate(2.5deg)}54%{transform:translateY(-1.5px) rotate(1.5deg)}56%{transform:translateY(2.5px) rotate(2.5deg)}58%{transform:translateY(.5px) rotate(2.5deg)}60%{transform:translateY(2.5px) rotate(2.5deg)}62%{transform:translateY(-.5px) rotate(2.5deg)}64%{transform:translateY(-.5px) rotate(1.5deg)}66%{transform:translateY(1.5px) rotate(-.5deg)}68%{transform:translateY(-1.5px) rotate(-.5deg)}70%{transform:translateY(1.5px) rotate(.5deg)}72%{transform:translateY(2.5px) rotate(1.5deg)}74%{transform:translateY(-.5px) rotate(.5deg)}76%{transform:translateY(-.5px) rotate(2.5deg)}78%{transform:translateY(-.5px) rotate(1.5deg)}80%{transform:translateY(1.5px) rotate(1.5deg)}82%{transform:translateY(-.5px) rotate(.5deg)}84%{transform:translateY(1.5px) rotate(2.5deg)}86%{transform:translateY(-1.5px) rotate(-1.5deg)}88%{transform:translateY(-.5px) rotate(2.5deg)}90%{transform:translateY(2.5px) rotate(-.5deg)}92%{transform:translateY(.5px) rotate(-.5deg)}94%{transform:translateY(2.5px) rotate(.5deg)}96%{transform:translateY(-.5px) rotate(1.5deg)}98%{transform:translateY(-1.5px) rotate(-.5deg)}0%,to{transform:translate(0) rotate(0deg)}}.dplayer{position:relative;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;line-height:1}.dplayer *{box-sizing:content-box}.dplayer svg{width:100%;height:100%}.dplayer svg circle,.dplayer svg path{fill:#fff}.dplayer:-webkit-full-screen{width:100%;height:100%;background:#000;position:fixed;z-index:100000;left:0;top:0;margin:0;padding:0;transform:translate(0)}.dplayer:-webkit-full-screen .dplayer-danmaku .dplayer-danmaku-bottom.dplayer-danmaku-move,.dplayer:-webkit-full-screen .dplayer-danmaku .dplayer-danmaku-top.dplayer-danmaku-move{-webkit-animation:danmaku-center 6s linear;animation:danmaku-center 6s linear;-webkit-animation-play-state:inherit;animation-play-state:inherit}.dplayer:-webkit-full-screen .dplayer-danmaku .dplayer-danmaku-right.dplayer-danmaku-move{-webkit-animation:danmaku 8s linear;animation:danmaku 8s linear;-webkit-animation-play-state:inherit;animation-play-state:inherit}.dplayer.dplayer-live .dplayer-bar-wrap,.dplayer.dplayer-live.dplayer-no-danmaku .dplayer-setting,.dplayer.dplayer-live .dplayer-setting-loop,.dplayer.dplayer-live .dplayer-setting-speed,.dplayer.dplayer-live .dplayer-time,.dplayer.dplayer-no-danmaku .dplayer-controller .dplayer-icons .dplayer-comment,.dplayer.dplayer-no-danmaku .dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box .dplayer-setting-danmaku,.dplayer.dplayer-no-danmaku .dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box .dplayer-setting-danunlimit,.dplayer.dplayer-no-danmaku .dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box .dplayer-setting-showdan,.dplayer.dplayer-no-danmaku .dplayer-danmaku{display:none}.dplayer.dplayer-arrow .dplayer-danmaku{font-size:18px}.dplayer.dplayer-arrow .dplayer-icon{margin:0 -3px}.dplayer.dplayer-playing .dplayer-danmaku .dplayer-danmaku-move{-webkit-animation-play-state:running;animation-play-state:running}@media (min-width:900px){.dplayer.dplayer-playing .dplayer-controller,.dplayer.dplayer-playing .dplayer-controller-mask{opacity:0}.dplayer.dplayer-playing:hover .dplayer-controller,.dplayer.dplayer-playing:hover .dplayer-controller-mask{opacity:1}}.dplayer.dplayer-loading .dplayer-bezel .diplayer-loading-icon{display:block}.dplayer.dplayer-loading .dplayer-danmaku,.dplayer.dplayer-loading .dplayer-danmaku-move,.dplayer.dplayer-paused .dplayer-danmaku,.dplayer.dplayer-paused .dplayer-danmaku-move{-webkit-animation-play-state:paused;animation-play-state:paused}.dplayer.dplayer-hide-controller{cursor:none}.dplayer.dplayer-hide-controller .dplayer-controller,.dplayer.dplayer-hide-controller .dplayer-controller-mask{opacity:0;transform:translateY(100%)}.dplayer.dplayer-show-controller .dplayer-controller,.dplayer.dplayer-show-controller .dplayer-controller-mask{opacity:1}.dplayer.dplayer-fulled{position:fixed;z-index:100000;left:0;top:0;width:100%!important;height:100%!important}.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-airplay-icon,.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-camera-icon,.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-play-icon,.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-volume{display:none}.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-full .dplayer-full-in-icon{position:static;display:inline-block}.dplayer.dplayer-mobile .dplayer-bar-time,.dplayer.dplayer-mobile.dplayer-hide-controller .dplayer-mobile-play{display:none}.dplayer.dplayer-mobile .dplayer-mobile-play{display:block}.dplayer-web-fullscreen-fix{position:fixed;top:0;left:0;margin:0;padding:0}[data-balloon]:before{display:none}[data-balloon]:after{padding:.3em .7em;background:rgba(17,17,17,.7)}[data-balloon][data-balloon-pos=up]:after{margin-bottom:0}.dplayer-bezel{position:absolute;left:0;right:0;top:0;bottom:0;font-size:22px;color:#fff;pointer-events:none}.dplayer-bezel .dplayer-bezel-icon{position:absolute;top:50%;left:50%;margin:-26px 0 0 -26px;height:52px;width:52px;padding:12px;box-sizing:border-box;background:rgba(0,0,0,.5);border-radius:50%;opacity:0;pointer-events:none}.dplayer-bezel .dplayer-bezel-icon.dplayer-bezel-transition{-webkit-animation:bezel-hide .5s linear;animation:bezel-hide .5s linear}@-webkit-keyframes bezel-hide{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(2)}}@keyframes bezel-hide{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(2)}}.dplayer-bezel .dplayer-danloading{position:absolute;top:50%;margin-top:-7px;width:100%;text-align:center;font-size:14px;line-height:14px;-webkit-animation:my-face 5s ease-in-out infinite;animation:my-face 5s ease-in-out infinite}.dplayer-bezel .diplayer-loading-icon{display:none;position:absolute;top:50%;left:50%;margin:-18px 0 0 -18px;height:36px;width:36px;pointer-events:none}.dplayer-bezel .diplayer-loading-icon .diplayer-loading-hide{display:none}.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot{-webkit-animation:diplayer-loading-dot-fade .8s ease infinite;animation:diplayer-loading-dot-fade .8s ease infinite;opacity:0;transform-origin:4px 4px}.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-7{-webkit-animation-delay:.7s;animation-delay:.7s}.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-6{-webkit-animation-delay:.6s;animation-delay:.6s}.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-5{-webkit-animation-delay:.5s;animation-delay:.5s}.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-4{-webkit-animation-delay:.4s;animation-delay:.4s}.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-3{-webkit-animation-delay:.3s;animation-delay:.3s}.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-2{-webkit-animation-delay:.2s;animation-delay:.2s}.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-1{-webkit-animation-delay:.1s;animation-delay:.1s}@-webkit-keyframes diplayer-loading-dot-fade{0%{opacity:.7;transform:scale(1.2)}50%{opacity:.25;transform:scale(.9)}to{opacity:.25;transform:scale(.85)}}@keyframes diplayer-loading-dot-fade{0%{opacity:.7;transform:scale(1.2)}50%{opacity:.25;transform:scale(.9)}to{opacity:.25;transform:scale(.85)}}.dplayer-controller-mask{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==) repeat-x bottom;height:98px;width:100%}.dplayer-controller,.dplayer-controller-mask{position:absolute;bottom:0;transition:all .3s ease}.dplayer-controller{left:0;right:0;height:41px;padding:0 20px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.dplayer-controller.dplayer-controller-comment .dplayer-icons{display:none}.dplayer-controller.dplayer-controller-comment .dplayer-icons.dplayer-comment-box{display:block}.dplayer-controller .dplayer-bar-wrap{padding:5px 0;cursor:pointer;position:absolute;bottom:33px;width:calc(100% - 40px);height:3px}.dplayer-controller .dplayer-bar-wrap:hover .dplayer-bar .dplayer-played .dplayer-thumb{transform:scale(1)}.dplayer-controller .dplayer-bar-wrap:hover .dplayer-highlight{display:block;width:8px;transform:translateX(-4px);top:4px;height:40%}.dplayer-controller .dplayer-bar-wrap .dplayer-highlight{z-index:12;position:absolute;top:5px;width:6px;height:20%;border-radius:6px;background-color:#fff;text-align:center;transform:translateX(-3px);transition:all .2s ease-in-out}.dplayer-controller .dplayer-bar-wrap .dplayer-highlight:hover .dplayer-highlight-text{display:block}.dplayer-controller .dplayer-bar-wrap .dplayer-highlight:hover~.dplayer-bar-preview,.dplayer-controller .dplayer-bar-wrap .dplayer-highlight:hover~.dplayer-bar-time{opacity:0}.dplayer-controller .dplayer-bar-wrap .dplayer-highlight .dplayer-highlight-text{display:none;position:absolute;left:50%;top:-24px;padding:5px 8px;background-color:rgba(0,0,0,.62);color:#fff;border-radius:4px;font-size:12px;white-space:nowrap;transform:translateX(-50%)}.dplayer-controller .dplayer-bar-wrap .dplayer-bar-preview{position:absolute;background:#fff;pointer-events:none;display:none;background-size:16000px 100%}.dplayer-controller .dplayer-bar-wrap .dplayer-bar-preview-canvas{position:absolute;width:100%;height:100%;z-index:1;pointer-events:none}.dplayer-controller .dplayer-bar-wrap .dplayer-bar-time{position:absolute;left:0;top:-20px;border-radius:4px;padding:5px 7px;background-color:rgba(0,0,0,.62);color:#fff;font-size:12px;text-align:center;opacity:1;transition:opacity .1s ease-in-out;word-wrap:normal;word-break:normal;z-index:2;pointer-events:none}.dplayer-controller .dplayer-bar-wrap .dplayer-bar-time.hidden{opacity:0}.dplayer-controller .dplayer-bar-wrap .dplayer-bar{position:relative;height:3px;width:100%;background:hsla(0,0%,100%,.2);cursor:pointer}.dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-loaded{background:hsla(0,0%,100%,.4);transition:all .5s ease}.dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-loaded,.dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-played{position:absolute;left:0;top:0;bottom:0;height:3px;will-change:width}.dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-played .dplayer-thumb{position:absolute;top:0;right:5px;margin-top:-4px;margin-right:-10px;height:11px;width:11px;border-radius:50%;cursor:pointer;transition:all .3s ease-in-out;transform:scale(0)}.dplayer-controller .dplayer-icons{height:38px;position:absolute;bottom:0}.dplayer-controller .dplayer-icons.dplayer-comment-box{display:none;position:absolute;transition:all .3s ease-in-out;z-index:2;height:38px;bottom:0;left:20px;right:20px;color:#fff}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-icon{padding:7px}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-icon{position:absolute;left:0;top:0}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-send-icon{position:absolute;right:0;top:0}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box{position:absolute;background:rgba(28,28,28,.9);bottom:41px;left:0;box-shadow:0 0 25px rgba(0,0,0,.3);border-radius:4px;padding:10px 10px 16px;font-size:14px;width:204px;transition:all .3s ease-in-out;transform:scale(0)}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box.dplayer-comment-setting-open{transform:scale(1)}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box input[type=radio]{display:none}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box label{cursor:pointer}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-title{font-size:13px;color:#fff;line-height:30px}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type{font-size:0}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type .dplayer-comment-setting-title{margin-bottom:6px}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type label:nth-child(2) span{border-radius:4px 0 0 4px}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type label:nth-child(4) span{border-radius:0 4px 4px 0}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type span{width:33%;padding:4px 6px;line-height:16px;display:inline-block;font-size:12px;color:#fff;border:1px solid #fff;margin-right:-1px;box-sizing:border-box;text-align:center;cursor:pointer}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type input:checked+span{background:#e4e4e6;color:#1c1c1c}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-color{font-size:0}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-color label{font-size:0;padding:6px;display:inline-block}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-color span{width:22px;height:22px;display:inline-block;border-radius:50%;box-sizing:border-box;cursor:pointer}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-color span:hover{-webkit-animation:my-face 5s ease-in-out infinite;animation:my-face 5s ease-in-out infinite}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input{outline:none;border:none;padding:8px 31px;font-size:14px;line-height:18px;text-align:center;border-radius:4px;background:none;margin:0;height:100%;box-sizing:border-box;width:100%;color:#fff}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input::-moz-placeholder{color:#fff;opacity:.8}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input:-ms-input-placeholder{color:#fff;opacity:.8}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input::placeholder{color:#fff;opacity:.8}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input::-ms-clear{display:none}.dplayer-controller .dplayer-icons.dplayer-icons-left .dplayer-icon{padding:7px}.dplayer-controller .dplayer-icons.dplayer-icons-right{right:20px}.dplayer-controller .dplayer-icons.dplayer-icons-right .dplayer-icon{padding:8px}.dplayer-controller .dplayer-icons .dplayer-live-badge,.dplayer-controller .dplayer-icons .dplayer-time{line-height:38px;color:#eee;text-shadow:0 0 2px rgba(0,0,0,.5);vertical-align:middle;font-size:13px;cursor:default}.dplayer-controller .dplayer-icons .dplayer-live-dot{display:inline-block;width:6px;height:6px;vertical-align:4%;margin-right:5px;content:"";border-radius:6px}.dplayer-controller .dplayer-icons .dplayer-icon{width:40px;height:100%;border:none;background-color:transparent;outline:none;cursor:pointer;vertical-align:middle;box-sizing:border-box;display:inline-block}.dplayer-controller .dplayer-icons .dplayer-icon .dplayer-icon-content{transition:all .2s ease-in-out;opacity:.8}.dplayer-controller .dplayer-icons .dplayer-icon:hover .dplayer-icon-content{opacity:1}.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-quality-icon{color:#fff;width:auto;line-height:22px;font-size:14px}.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-comment-icon{padding:10px 9px 9px}.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-setting-icon{padding-top:8.5px}.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-volume-icon{width:43px}.dplayer-controller .dplayer-icons .dplayer-volume{position:relative;display:inline-block;cursor:pointer;height:100%}.dplayer-controller .dplayer-icons .dplayer-volume:hover .dplayer-volume-bar-wrap .dplayer-volume-bar{width:45px}.dplayer-controller .dplayer-icons .dplayer-volume:hover .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb{transform:scale(1)}.dplayer-controller .dplayer-icons .dplayer-volume.dplayer-volume-active .dplayer-volume-bar-wrap .dplayer-volume-bar{width:45px}.dplayer-controller .dplayer-icons .dplayer-volume.dplayer-volume-active .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb{transform:scale(1)}.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap{display:inline-block;margin:0 10px 0 -5px;vertical-align:middle;height:100%}.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap .dplayer-volume-bar{position:relative;top:17px;width:0;height:3px;background:#aaa;transition:all .3s ease-in-out}.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner{position:absolute;bottom:0;left:0;height:100%;transition:all .1s ease;will-change:width}.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb{position:absolute;top:0;right:5px;margin-top:-4px;margin-right:-10px;height:11px;width:11px;border-radius:50%;cursor:pointer;transition:all .3s ease-in-out;transform:scale(0)}.dplayer-controller .dplayer-icons .dplayer-setting,.dplayer-controller .dplayer-icons .dplayer-subtitle-btn{display:inline-block;height:100%}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box{position:absolute;right:0;bottom:50px;transform:scale(0);width:150px;border-radius:2px;background:rgba(28,28,28,.9);padding:7px 0;transition:all .3s ease-in-out;overflow:hidden;z-index:2}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box>div{display:none}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box>div.dplayer-setting-origin-panel{display:block}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box.dplayer-setting-box-open{transform:scale(1)}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box.dplayer-setting-box-narrow{width:70px;text-align:center}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box.dplayer-setting-box-speed .dplayer-setting-origin-panel{display:none}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box.dplayer-setting-box-speed .dplayer-setting-speed-panel{display:block}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-item,.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-speed-item{height:30px;padding:5px 10px;box-sizing:border-box;cursor:pointer;position:relative}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-item:hover,.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-speed-item:hover{background-color:hsla(0,0%,100%,.1)}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku{padding:5px 0}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku .dplayer-label{padding:0 10px;display:inline}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku:hover .dplayer-label{display:none}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku:hover .dplayer-danmaku-bar-wrap{display:inline-block}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku.dplayer-setting-danmaku-active .dplayer-label{display:none}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku.dplayer-setting-danmaku-active .dplayer-danmaku-bar-wrap{display:inline-block}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap{padding:0 10px;box-sizing:border-box;display:none;vertical-align:middle;height:100%;width:100%}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap .dplayer-danmaku-bar{position:relative;top:8.5px;width:100%;height:3px;background:#fff;transition:all .3s ease-in-out}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap .dplayer-danmaku-bar .dplayer-danmaku-bar-inner{position:absolute;bottom:0;left:0;height:100%;transition:all .1s ease;background:#aaa;will-change:width}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap .dplayer-danmaku-bar .dplayer-danmaku-bar-inner .dplayer-thumb{position:absolute;top:0;right:5px;margin-top:-4px;margin-right:-10px;height:11px;width:11px;border-radius:50%;cursor:pointer;transition:all .3s ease-in-out;background:#aaa}.dplayer-controller .dplayer-icons .dplayer-full{display:inline-block;height:100%;position:relative}.dplayer-controller .dplayer-icons .dplayer-full:hover .dplayer-full-in-icon{display:block}.dplayer-controller .dplayer-icons .dplayer-full .dplayer-full-in-icon{position:absolute;top:-30px;z-index:1;display:none}.dplayer-controller .dplayer-icons .dplayer-quality{position:relative;display:inline-block;height:100%;z-index:2}.dplayer-controller .dplayer-icons .dplayer-quality:hover .dplayer-quality-list,.dplayer-controller .dplayer-icons .dplayer-quality:hover .dplayer-quality-mask{display:block}.dplayer-controller .dplayer-icons .dplayer-quality .dplayer-quality-mask{display:none;position:absolute;bottom:38px;left:-18px;width:80px;padding-bottom:12px}.dplayer-controller .dplayer-icons .dplayer-quality .dplayer-quality-list{display:none;font-size:12px;width:80px;border-radius:2px;background:rgba(28,28,28,.9);padding:5px 0;transition:all .3s ease-in-out;overflow:hidden;color:#fff;text-align:center}.dplayer-controller .dplayer-icons .dplayer-quality .dplayer-quality-item{height:25px;box-sizing:border-box;cursor:pointer;line-height:25px}.dplayer-controller .dplayer-icons .dplayer-quality .dplayer-quality-item:hover{background-color:hsla(0,0%,100%,.1)}.dplayer-controller .dplayer-icons .dplayer-comment{display:inline-block;height:100%}.dplayer-controller .dplayer-icons .dplayer-label{color:#eee;font-size:13px;display:inline-block;vertical-align:middle;white-space:nowrap}.dplayer-controller .dplayer-icons .dplayer-toggle{width:32px;height:20px;text-align:center;font-size:0;vertical-align:middle;position:absolute;top:5px;right:10px}.dplayer-controller .dplayer-icons .dplayer-toggle input{max-height:0;max-width:0;display:none}.dplayer-controller .dplayer-icons .dplayer-toggle input+label{display:inline-block;position:relative;box-shadow:inset 0 0 0 0 #dfdfdf;border:1px solid #dfdfdf;height:20px;width:32px;border-radius:10px;box-sizing:border-box;cursor:pointer;transition:.2s ease-in-out}.dplayer-controller .dplayer-icons .dplayer-toggle input+label:after,.dplayer-controller .dplayer-icons .dplayer-toggle input+label:before{content:"";position:absolute;display:block;height:18px;width:18px;top:0;left:0;border-radius:15px;transition:.2s ease-in-out}.dplayer-controller .dplayer-icons .dplayer-toggle input+label:after{background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.4)}.dplayer-controller .dplayer-icons .dplayer-toggle input:checked+label{border-color:hsla(0,0%,100%,.5)}.dplayer-controller .dplayer-icons .dplayer-toggle input:checked+label:before{width:30px;background:hsla(0,0%,100%,.5)}.dplayer-controller .dplayer-icons .dplayer-toggle input:checked+label:after{left:12px}.dplayer-mobile-play{display:none;width:50px;height:50px;border:none;background-color:transparent;outline:none;cursor:pointer;box-sizing:border-box;bottom:0;opacity:.8;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%)}.dplayer-danmaku{position:absolute;left:0;right:0;top:0;bottom:0;font-size:22px;color:#fff}.dplayer-danmaku .dplayer-danmaku-item{display:inline-block;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default;white-space:nowrap;text-shadow:.5px .5px .5px rgba(0,0,0,.5)}.dplayer-danmaku .dplayer-danmaku-item--demo{position:absolute;visibility:hidden}.dplayer-danmaku .dplayer-danmaku-right{position:absolute;right:0;transform:translateX(100%)}.dplayer-danmaku .dplayer-danmaku-right.dplayer-danmaku-move{will-change:transform;-webkit-animation:danmaku 5s linear;animation:danmaku 5s linear;-webkit-animation-play-state:paused;animation-play-state:paused}@-webkit-keyframes danmaku{0%{transform:translateX(100%)}}@keyframes danmaku{0%{transform:translateX(100%)}}.dplayer-danmaku .dplayer-danmaku-bottom,.dplayer-danmaku .dplayer-danmaku-top{position:absolute;width:100%;text-align:center;visibility:hidden}.dplayer-danmaku .dplayer-danmaku-bottom.dplayer-danmaku-move,.dplayer-danmaku .dplayer-danmaku-top.dplayer-danmaku-move{will-change:visibility;-webkit-animation:danmaku-center 4s linear;animation:danmaku-center 4s linear;-webkit-animation-play-state:paused;animation-play-state:paused}@-webkit-keyframes danmaku-center{0%{visibility:visible}to{visibility:visible}}@keyframes danmaku-center{0%{visibility:visible}to{visibility:visible}}.dplayer-logo{pointer-events:none;position:absolute;left:20px;top:20px;max-width:50px;max-height:50px}.dplayer-logo img{max-width:100%;max-height:100%;background:none}.dplayer-menu{position:absolute;width:170px;border-radius:2px;background:rgba(28,28,28,.85);padding:5px 0;overflow:hidden;z-index:3;display:none}.dplayer-menu.dplayer-menu-show{display:block}.dplayer-menu .dplayer-menu-item{height:30px;box-sizing:border-box;cursor:pointer}.dplayer-menu .dplayer-menu-item:hover{background-color:hsla(0,0%,100%,.1)}.dplayer-menu .dplayer-menu-item a{padding:0 10px;line-height:30px;color:#eee;font-size:13px;display:inline-block;vertical-align:middle;width:100%;box-sizing:border-box;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.dplayer-menu .dplayer-menu-item a:hover{text-decoration:none}.dplayer-notice{opacity:0;position:absolute;bottom:60px;left:20px;font-size:14px;border-radius:2px;background:rgba(28,28,28,.9);padding:7px 20px;transition:all .3s ease-in-out;overflow:hidden;color:#fff;pointer-events:none}.dplayer-subtitle{position:absolute;bottom:40px;width:90%;left:5%;text-align:center;color:#fff;text-shadow:.5px .5px .5px rgba(0,0,0,.5);font-size:20px}.dplayer-subtitle.dplayer-subtitle-hide{display:none}.dplayer-mask{position:absolute;top:0;bottom:0;left:0;right:0;z-index:1;display:none}.dplayer-mask.dplayer-mask-show{display:block}.dplayer-video-wrap{position:relative;background:#000;font-size:0;width:100%;height:100%}.dplayer-video-wrap .dplayer-video{width:100%;height:100%;display:none}.dplayer-video-wrap .dplayer-video-current{display:block}.dplayer-video-wrap .dplayer-video-prepare{display:none}.dplayer-info-panel{position:absolute;top:10px;left:10px;width:400px;background:rgba(28,28,28,.8);padding:10px;color:#fff;font-size:12px;border-radius:2px}.dplayer-info-panel-hide{display:none}.dplayer-info-panel .dplayer-info-panel-close{cursor:pointer;position:absolute;right:10px;top:10px}.dplayer-info-panel .dplayer-info-panel-item>span{display:inline-block;vertical-align:middle;line-height:15px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.dplayer-info-panel .dplayer-info-panel-item-title{width:100px;text-align:right;margin-right:10px}.dplayer-info-panel .dplayer-info-panel-item-data{width:260px}',""]),t.a=r},function(e,t,n){e.exports=n(41)},function(e,t){var n,a,i=e.exports={};function o(){throw new Error("setTimeout has not been defined")}function r(){throw new Error("clearTimeout has not been defined")}function l(e){if(n===setTimeout)return setTimeout(e,0);if((n===o||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:o}catch(e){n=o}try{a="function"==typeof clearTimeout?clearTimeout:r}catch(e){a=r}}();var s,p=[],d=!1,c=-1;function u(){d&&s&&(d=!1,s.length?p=s.concat(p):c=-1,p.length&&y())}function y(){if(!d){var e=l(u);d=!0;for(var t=p.length;t;){for(s=p,p=[];++c1)for(var n=1;n=200&&e<300}};s.headers={common:{Accept:"application/json, text/plain, */*"}},a.forEach(["delete","get","head"],(function(e){s.headers[e]={}})),a.forEach(["post","put","patch"],(function(e){s.headers[e]=a.merge(o)})),e.exports=s}).call(this,n(6))},function(e,t,n){"use strict";var a=n(0),i=n(47),o=n(49),r=n(8),l=n(50),s=n(53),p=n(54),d=n(12);e.exports=function(e){return new Promise((function(t,n){var c=e.data,u=e.headers;a.isFormData(c)&&delete u["Content-Type"];var y=new XMLHttpRequest;if(e.auth){var h=e.auth.username||"",m=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";u.Authorization="Basic "+btoa(h+":"+m)}var f=l(e.baseURL,e.url);if(y.open(e.method.toUpperCase(),r(f,e.params,e.paramsSerializer),!0),y.timeout=e.timeout,y.onreadystatechange=function(){if(y&&4===y.readyState&&(0!==y.status||y.responseURL&&0===y.responseURL.indexOf("file:"))){var a="getAllResponseHeaders"in y?s(y.getAllResponseHeaders()):null,o={data:e.responseType&&"text"!==e.responseType?y.response:y.responseText,status:y.status,statusText:y.statusText,headers:a,config:e,request:y};i(t,n,o),y=null}},y.onabort=function(){y&&(n(d("Request aborted",e,"ECONNABORTED",y)),y=null)},y.onerror=function(){n(d("Network Error",e,null,y)),y=null},y.ontimeout=function(){var t="timeout of "+e.timeout+"ms exceeded";e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),n(d(t,e,"ECONNABORTED",y)),y=null},a.isStandardBrowserEnv()){var v=(e.withCredentials||p(f))&&e.xsrfCookieName?o.read(e.xsrfCookieName):void 0;v&&(u[e.xsrfHeaderName]=v)}if("setRequestHeader"in y&&a.forEach(u,(function(e,t){void 0===c&&"content-type"===t.toLowerCase()?delete u[t]:y.setRequestHeader(t,e)})),a.isUndefined(e.withCredentials)||(y.withCredentials=!!e.withCredentials),e.responseType)try{y.responseType=e.responseType}catch(t){if("json"!==e.responseType)throw t}"function"==typeof e.onDownloadProgress&&y.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&y.upload&&y.upload.addEventListener("progress",e.onUploadProgress),e.cancelToken&&e.cancelToken.promise.then((function(e){y&&(y.abort(),n(e),y=null)})),c||(c=null),y.send(c)}))}},function(e,t,n){"use strict";var a=n(48);e.exports=function(e,t,n,i,o){var r=new Error(e);return a(r,t,n,i,o)}},function(e,t,n){"use strict";var a=n(0);e.exports=function(e,t){t=t||{};var n={},i=["url","method","data"],o=["headers","auth","proxy","params"],r=["baseURL","transformRequest","transformResponse","paramsSerializer","timeout","timeoutMessage","withCredentials","adapter","responseType","xsrfCookieName","xsrfHeaderName","onUploadProgress","onDownloadProgress","decompress","maxContentLength","maxBodyLength","maxRedirects","transport","httpAgent","httpsAgent","cancelToken","socketPath","responseEncoding"],l=["validateStatus"];function s(e,t){return a.isPlainObject(e)&&a.isPlainObject(t)?a.merge(e,t):a.isPlainObject(t)?a.merge({},t):a.isArray(t)?t.slice():t}function p(i){a.isUndefined(t[i])?a.isUndefined(e[i])||(n[i]=s(void 0,e[i])):n[i]=s(e[i],t[i])}a.forEach(i,(function(e){a.isUndefined(t[e])||(n[e]=s(void 0,t[e]))})),a.forEach(o,p),a.forEach(r,(function(i){a.isUndefined(t[i])?a.isUndefined(e[i])||(n[i]=s(void 0,e[i])):n[i]=s(void 0,t[i])})),a.forEach(l,(function(a){a in t?n[a]=s(e[a],t[a]):a in e&&(n[a]=s(void 0,e[a]))}));var d=i.concat(o).concat(r).concat(l),c=Object.keys(e).concat(Object.keys(t)).filter((function(e){return-1===d.indexOf(e)}));return a.forEach(c,p),n}},function(e,t,n){"use strict";function a(e){this.message=e}a.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},a.prototype.__CANCEL__=!0,e.exports=a},function(e,t,n){"use strict";e.exports=n(57)},function(e,t,n){"use strict";var a,i=function(){return void 0===a&&(a=Boolean(window&&document&&document.all&&!window.atob)),a},o=function(){var e={};return function(t){if(void 0===e[t]){var n=document.querySelector(t);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}e[t]=n}return e[t]}}(),r=[];function l(e){for(var t=-1,n=0;n'},function(e,t){e.exports=''},function(e,t){e.exports=''},function(e,t){e.exports=''},function(e,t){e.exports=''},function(e,t){e.exports=''},function(e,t){e.exports=''},function(e,t){e.exports=''},function(e,t){e.exports=''},function(e,t){e.exports=''},function(e,t){e.exports=''},function(e,t){e.exports=''},function(e,t){e.exports=''},function(e,t){e.exports=''},function(e,t){e.exports=''},function(e,t){e.exports=''},function(e,t){e.exports=''},function(e,t,n){var a=n(15);e.exports=function(e){"use strict";var t="",i=function(e){return t+=e},o=(e=e||{}).video,r=e.options,l=a.$escape,s=e.tran,p=e.icons,d=e.index,c=a.$each;e.$value,e.$index;return t+='
\n
\n ',i(n(3)(o)),t+="\n ",r.logo&&(t+='\n \n '),t+='\n
\n
\n
\n
\n
\n \n ',r.danmaku&&(t+='\n ',t+=l(s("Danmaku is loading")),t+="\n "),t+='\n ',t+=p.loading,t+='\n
\n
\n
\n
\n
\n \n
\n
\n
',t+=l(s("Set danmaku color")),t+='
\n \n \n \n \n \n \n
\n
\n
',t+=l(s("Set danmaku type")),t+='
\n \n \n \n
\n
\n \n ',t+=p.send,t+='\n \n
\n
\n \n
\n \n
\n
\n
\n \n
\n
\n
\n
\n \n 0:00 /\n 0:00\n \n ',r.live&&(t+='\n ',t+=l(s("Live")),t+="\n "),t+='\n
\n
\n ',r.video.quality&&(t+='\n
\n \n
\n
\n ',c(r.video.quality,(function(e,n){t+='\n
',t+=l(e.name),t+="
\n "})),t+="\n
\n
\n
\n "),t+="\n ",r.screenshot&&(t+='\n
\n
\n "),t+="\n ",r.airplay&&(t+='\n
\n
\n "),t+='\n
\n \n
\n ",r.subtitle&&(t+='\n
\n \n
\n "),t+='\n
\n \n
\n
\n
\n ',t+=l(s("Speed")),t+='\n
',t+=p.right,t+='
\n
\n
\n ',t+=l(s("Loop")),t+='\n
\n \n \n
\n
\n
\n ',t+=l(s("Show danmaku")),t+='\n
\n \n \n
\n
\n
\n ',t+=l(s("Unlimited danmaku")),t+='\n
\n \n \n
\n
\n
\n ',t+=l(s("Opacity for danmaku")),t+='\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n ',c(r.playbackSpeed,(function(e,n){t+='\n
\n ',t+=l(1===e?s("Normal"):e),t+="\n
\n "})),t+='\n
\n
\n
\n
\n \n \n
\n
\n
\n \n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
[x]
\n
\n 播放器版本\n \n
\n
\n 解码器\n \n
\n
\n 播放帧率\n \n
\n
\n 视频类型\n \n
\n
\n 视频地址\n \n
\n
\n 视频分辨率\n \n
\n
\n 视频时长\n \n
\n ',r.danmaku&&(t+='\n
\n 弹幕ID\n \n
\n
\n 弹幕API\n \n
\n
\n 弹幕数量\n \n
\n '),t+='\n
\n 加速器版本\n \n
\n
\n P2P 下载\n \n
\n
\n P2P 比率\n \n
\n
\n P2P 分享\n \n
\n
\n 节点Id\n \n
\n
\n 可用节点\n \n
\n
\n
\n ',c(r.contextmenu,(function(e,n){t+='\n
\n ',t+=l(s(e.text)),t+="\n
\n "})),t+='\n
\n
\n\n"}},function(e,t,n){(function(e){var a=void 0!==e&&e||"undefined"!=typeof self&&self||window,i=Function.prototype.apply;function o(e,t){this._id=e,this._clearFn=t}t.setTimeout=function(){return new o(i.call(setTimeout,a,arguments),clearTimeout)},t.setInterval=function(){return new o(i.call(setInterval,a,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},o.prototype.unref=o.prototype.ref=function(){},o.prototype.close=function(){this._clearFn.call(a,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},n(40),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,n(2))},function(e,t,n){(function(e,t){!function(e,n){"use strict";if(!e.setImmediate){var a,i,o,r,l,s=1,p={},d=!1,c=e.document,u=Object.getPrototypeOf&&Object.getPrototypeOf(e);u=u&&u.setTimeout?u:e,"[object process]"==={}.toString.call(e.process)?a=function(e){t.nextTick((function(){h(e)}))}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=n,t}}()?e.MessageChannel?((o=new MessageChannel).port1.onmessage=function(e){h(e.data)},a=function(e){o.port2.postMessage(e)}):c&&"onreadystatechange"in c.createElement("script")?(i=c.documentElement,a=function(e){var t=c.createElement("script");t.onreadystatechange=function(){h(e),t.onreadystatechange=null,i.removeChild(t),t=null},i.appendChild(t)}):a=function(e){setTimeout(h,0,e)}:(r="setImmediate$"+Math.random()+"$",l=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(r)&&h(+t.data.slice(r.length))},e.addEventListener?e.addEventListener("message",l,!1):e.attachEvent("onmessage",l),a=function(t){e.postMessage(r+t,"*")}),u.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),n=0;n=0)return;r[t]="set-cookie"===t?(r[t]?r[t]:[]).concat([n]):r[t]?r[t]+", "+n:n}})),r):r}},function(e,t,n){"use strict";var a=n(0);e.exports=a.isStandardBrowserEnv()?function(){var e,t=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");function i(e){var a=e;return t&&(n.setAttribute("href",a),a=n.href),n.setAttribute("href",a),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:"/"===n.pathname.charAt(0)?n.pathname:"/"+n.pathname}}return e=i(window.location.href),function(t){var n=a.isString(t)?i(t):t;return n.protocol===e.protocol&&n.host===e.host}}():function(){return!0}},function(e,t,n){"use strict";var a=n(14);function i(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise((function(e){t=e}));var n=this;e((function(e){n.reason||(n.reason=new a(e),t(n.reason))}))}i.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},i.source=function(){var e;return{token:new i((function(t){e=t})),cancel:e}},e.exports=i},function(e,t,n){"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}},function(e,t,n){"use strict";(function(t){var n="undefined"!=typeof self?self:"undefined"!=typeof window?window:void 0!==t?t:{},a=Object.create(n),i=/["&'<>]/;a.$escape=function(e){return function(e){var t=""+e,n=i.exec(t);if(!n)return e;var a="",o=void 0,r=void 0,l=void 0;for(o=n.index,r=0;o0?[t,n,a]:[n,a]).map((function(e){return e<10?"0"+e:""+e})).join(":")},getElementViewLeft:function(e){var t=e.offsetLeft,n=e.offsetParent,a=document.body.scrollLeft+document.documentElement.scrollLeft;if(document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement)for(;null!==n&&n!==e;)t+=n.offsetLeft,n=n.offsetParent;else for(;null!==n;)t+=n.offsetLeft,n=n.offsetParent;return t-a},getBoundingClientRectViewLeft:function(e){var t=window.scrollY||window.pageYOffset||document.body.scrollTop+(document.documentElement&&document.documentElement.scrollTop||0);if(e.getBoundingClientRect){if("number"!=typeof this.getBoundingClientRectViewLeft.offset){var n=document.createElement("div");n.style.cssText="position:absolute;top:0;left:0;",document.body.appendChild(n),this.getBoundingClientRectViewLeft.offset=-n.getBoundingClientRect().top-t,document.body.removeChild(n),n=null}var a=e.getBoundingClientRect(),i=this.getBoundingClientRectViewLeft.offset;return a.left+i}return this.getElementViewLeft(e)},getScrollPosition:function(){return{left:window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0,top:window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0}},setScrollPosition:function(e){var t=e.left,n=void 0===t?0:t,a=e.top,i=void 0===a?0:a;this.isFirefox?(document.documentElement.scrollLeft=n,document.documentElement.scrollTop=i):window.scrollTo(n,i)},isMobile:y,isP2pSupported:(i=function(){if("undefined"!=typeof window)return window.MediaSource||window.WebKitMediaSource}(),o=window.SourceBuffer||window.WebKitSourceBuffer,r=i&&"function"==typeof i.isTypeSupported&&i.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"'),l=!o||o.prototype&&"function"==typeof o.prototype.appendBuffer&&"function"==typeof o.prototype.remove,!!r&&!!l&&((a=function(){if("undefined"==typeof window)return null;var e={RTCPeerConnection:window.RTCPeerConnection||window.mozRTCPeerConnection||window.webkitRTCPeerConnection,RTCSessionDescription:window.RTCSessionDescription||window.mozRTCSessionDescription||window.webkitRTCSessionDescription,RTCIceCandidate:window.RTCIceCandidate||window.mozRTCIceCandidate||window.webkitRTCIceCandidate};return e.RTCPeerConnection?e:null}())&&void 0!==a.RTCPeerConnection.prototype.createDataChannel)),isFirefox:/firefox/i.test(window.navigator.userAgent),isChrome:/chrome/i.test(window.navigator.userAgent),storage:{set:function(e,t){localStorage.setItem(e,t)},get:function(e){return localStorage.getItem(e)}},nameMap:{dragStart:y?"touchstart":"mousedown",dragMove:y?"touchmove":"mousemove",dragEnd:y?"touchend":"mouseup"},color2Number:function(e){return"#"===e[0]&&(e=e.substr(1)),3===e.length&&(e="".concat(e[0]).concat(e[0]).concat(e[1]).concat(e[1]).concat(e[2]).concat(e[2])),parseInt(e,16)+0&16777215},number2Color:function(e){return"#"+("00000"+e.toString(16)).slice(-6)},number2Type:function(e){switch(e){case 0:return"right";case 1:return"top";case 2:return"bottom";default:return"right"}}},m=n(5),f=n.n(m),v={send:function(e){f.a.post(e.url,e.data).then((function(t){var n=t.data;n&&0===n.code?e.success&&e.success(n):e.error&&e.error(n&&n.msg)})).catch((function(t){console.error(t),e.error&&e.error()}))},read:function(e){f.a.get(e.url).then((function(t){var n=t.data;n&&0===n.code?e.success&&e.success(n.data.map((function(e){return{time:e[0],type:e[1],color:e[2],author:e[3],text:e[4]}}))):e.error&&e.error(n&&n.msg)})).catch((function(t){console.error(t),e.error&&e.error()}))}};function g(e){return(g="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var b={"zh-cn":{"Danmaku is loading":"弹幕加载中",Top:"顶部",Bottom:"底部",Rolling:"滚动","Input danmaku, hit Enter":"输入弹幕,回车发送","About author":"关于作者","DPlayer feedback":"播放器意见反馈","About DPlayer":"关于 DPlayer 播放器",Loop:"洗脑循环",Speed:"速度","Opacity for danmaku":"弹幕透明度",Normal:"正常","Please input danmaku content!":"要输入弹幕内容啊喂!","Set danmaku color":"设置弹幕颜色","Set danmaku type":"设置弹幕类型","Show danmaku":"显示弹幕","Video load failed":"视频加载失败","Danmaku load failed":"弹幕加载失败","Danmaku send failed":"弹幕发送失败","Switching to":"正在切换至","Switched to":"已经切换至",quality:"画质",FF:"快进",REW:"快退","Unlimited danmaku":"海量弹幕","Send danmaku":"发送弹幕",Setting:"设置","Full screen":"全屏","Web full screen":"页面全屏",Send:"发送",Screenshot:"截图",AirPlay:"无线投屏",s:"秒","Show subtitle":"显示字幕","Hide subtitle":"隐藏字幕",Volume:"音量",Live:"直播","Video info":"视频统计信息"},"zh-tw":{"Danmaku is loading":"彈幕載入中",Top:"頂部",Bottom:"底部",Rolling:"滾動","Input danmaku, hit Enter":"輸入彈幕,Enter 發送","About author":"關於作者","DPlayer feedback":"播放器意見回饋","About DPlayer":"關於 DPlayer 播放器",Loop:"循環播放",Speed:"速度","Opacity for danmaku":"彈幕透明度",Normal:"正常","Please input danmaku content!":"請輸入彈幕內容啊!","Set danmaku color":"設定彈幕顏色","Set danmaku type":"設定彈幕類型","Show danmaku":"顯示彈幕","Video load failed":"影片載入失敗","Danmaku load failed":"彈幕載入失敗","Danmaku send failed":"彈幕發送失敗","Switching to":"正在切換至","Switched to":"已經切換至",quality:"畫質",FF:"快進",REW:"快退","Unlimited danmaku":"巨量彈幕","Send danmaku":"發送彈幕",Setting:"設定","Full screen":"全螢幕","Web full screen":"頁面全螢幕",Send:"發送",Screenshot:"截圖",AirPlay:"無線投屏",s:"秒","Show subtitle":"顯示字幕","Hide subtitle":"隱藏字幕",Volume:"音量",Live:"直播","Video info":"影片&P2P統計訊息"}},w=function(e){var t=this;this.lang=e,this.tran=function(e){return b[t.lang]&&b[t.lang][e]?b[t.lang][e]:e}},k=n(21),x=n.n(k),S=n(22),E=n.n(S),T=n(23),L=n.n(T),P=n(24),B=n.n(P),q=n(25),M=n.n(q),C=n(26),z=n.n(C),O=n(27),I=n.n(O),A=n(28),j=n.n(A),D=n(29),F=n.n(D),R=n(30),_=n.n(R),Y=n(31),H=n.n(Y),W=n(32),N=n.n(W),U=n(33),V=n.n(U),X=n(34),Q=n.n(X),$=n(35),J=n.n($),K=n(36),Z=n.n(K),G=n(37),ee=n.n(G),te={play:x.a,pause:E.a,volumeUp:L.a,volumeDown:B.a,volumeOff:M.a,full:z.a,fullWeb:I.a,setting:j.a,right:F.a,comment:_.a,commentOff:H.a,send:N.a,pallette:V.a,camera:Q.a,subtitle:Z.a,loading:ee.a,airplay:J.a},ne=n(38),ae=n.n(ne);function ie(e,t){for(var n=0;nparseFloat(t.time);)n.push(t),t=this.dan[++this.danIndex];this.draw(n)}window.requestAnimationFrame((function(){e.frame()}))}},{key:"opacity",value:function(e){if(void 0!==e){for(var t=this.container.getElementsByClassName("dplayer-danmaku-item"),n=0;n').concat(e[i].text,""):o.innerHTML=e[i].text,o.style.opacity=t._opacity,o.style.color=h.number2Color(e[i].color),o.addEventListener("animationend",(function(){t.container.removeChild(o)}));var r=t._measure(e[i].text),l=void 0;switch(e[i].type){case"right":(l=s(o,e[i].type,r))>=0&&(o.style.width=r+1+"px",o.style.top=n*l+"px",o.style.transform="translateX(-".concat(a,"px)"));break;case"top":(l=s(o,e[i].type))>=0&&(o.style.top=n*l+"px");break;case"bottom":(l=s(o,e[i].type))>=0&&(o.style.bottom=n*l+"px");break;default:console.error("Can't handled danmaku type: ".concat(e[i].type))}l>=0&&(o.classList.add("dplayer-danmaku-move"),p.appendChild(o))},c=0;c=this.options.time()){this.danIndex=e;break}this.danIndex=this.dan.length}}},{key:"clear",value:function(){this.danTunnel={right:{},top:{},bottom:{}},this.danIndex=0,this.options.container.innerHTML="",this.events&&this.events.trigger("danmaku_clear")}},{key:"htmlEncode",value:function(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/")}},{key:"resize",value:function(){for(var e=this.container.offsetWidth,t=this.container.getElementsByClassName("dplayer-danmaku-item"),n=0;n0&&void 0!==arguments[0]?arguments[0]:"browser";switch(e){case"browser":return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement;case"web":return this.player.container.classList.contains("dplayer-fulled")}}},{key:"request",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"browser",t="browser"===e?"web":"browser",n=this.isFullScreen(t);switch(n||(this.lastScrollPosition=h.getScrollPosition()),e){case"browser":this.player.container.requestFullscreen?this.player.container.requestFullscreen():this.player.container.mozRequestFullScreen?this.player.container.mozRequestFullScreen():this.player.container.webkitRequestFullscreen?this.player.container.webkitRequestFullscreen():this.player.video.webkitEnterFullscreen?this.player.video.webkitEnterFullscreen():this.player.video.webkitEnterFullScreen?this.player.video.webkitEnterFullScreen():this.player.container.msRequestFullscreen&&this.player.container.msRequestFullscreen();break;case"web":this.player.container.classList.add("dplayer-fulled"),document.body.classList.add("dplayer-web-fullscreen-fix"),this.player.events.trigger("webfullscreen")}n&&this.cancel(t)}},{key:"cancel",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"browser";switch(e){case"browser":document.cancelFullScreen?document.cancelFullScreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.webkitCancelFullscreen?document.webkitCancelFullscreen():document.msCancelFullScreen?document.msCancelFullScreen():document.msExitFullscreen&&document.msExitFullscreen();break;case"web":this.player.container.classList.remove("dplayer-fulled"),document.body.classList.remove("dplayer-web-fullscreen-fix"),this.player.events.trigger("webfullscreen_cancel")}}},{key:"toggle",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"browser";this.isFullScreen(e)?this.cancel(e):this.request(e)}}])&&ce(t.prototype,n),a&&ce(t,a),e}();function ye(e,t){for(var n=0;n".concat(e,"

")})).join("");e.container.innerHTML=i}e.events.trigger("subtitle_change")}}}},{key:"show",value:function(){this.container.classList.remove("dplayer-subtitle-hide"),this.events.trigger("subtitle_show")}},{key:"hide",value:function(){this.container.classList.add("dplayer-subtitle-hide"),this.events.trigger("subtitle_hide")}},{key:"toggle",value:function(){this.container.classList.contains("dplayer-subtitle-hide")?this.show():this.hide()}}])&&me(t.prototype,n),a&&me(t,a),e}();function ve(e,t){for(var n=0;nt&&!e.player.video.paused&&(e.player.container.classList.remove("dplayer-loading"),a=!1),t=n)}),100)}},{key:"initfpsChecker",value:function(){var e=this;window.requestAnimationFrame((function(){if(e.enablefpsChecker)if(e.initfpsChecker(),e.fpsStart){e.fpsIndex++;var t=new Date;t-e.fpsStart>1e3&&(e.player.infoPanel.fps(e.fpsIndex/(t-e.fpsStart)*1e3),e.fpsStart=new Date,e.fpsIndex=0)}else e.fpsStart=new Date,e.fpsIndex=0;else e.fpsStart=0,e.fpsIndex=0}))}},{key:"initinfoChecker",value:function(){var e=this;this.infoChecker=setInterval((function(){e.enableinfoChecker&&e.player.infoPanel.update()}),1e3)}},{key:"enable",value:function(e){this["enable".concat(e,"Checker")]=!0,"fps"===e&&this.initfpsChecker()}},{key:"disable",value:function(e){this["enable".concat(e,"Checker")]=!1}},{key:"destroy",value:function(){var e=this;this.types.map((function(t){return e["enable".concat(t,"Checker")]=!1,e["".concat(t,"Checker")]&&clearInterval(e["".concat(t,"Checker")]),t}))}}])&&be(t.prototype,n),a&&be(t,a),e}();function ke(e,t){for(var n=0;n'+e.player.options.highlight[n].text+"",e.player.template.playedBarWrap.insertBefore(a,e.player.template.playedBarTime)}}}))}},{key:"initThumbnails",value:function(){var e=this;this.player.options.video.thumbnails&&(this.thumbnails=new Ee({container:this.player.template.barPreview,barWidth:this.player.template.barWrap.offsetWidth,url:this.player.options.video.thumbnails,events:this.player.events}),this.player.on("loadedmetadata",(function(){e.thumbnails.resize(160,e.player.video.videoHeight/e.player.video.videoWidth*160,e.player.template.barWrap.offsetWidth)})))}},{key:"initPlayedBar",value:function(){var e=this,t=function(t){var n=((t.clientX||t.changedTouches[0].clientX)-h.getBoundingClientRectViewLeft(e.player.template.playedBarWrap))/e.player.template.playedBarWrap.clientWidth;n=Math.max(n,0),n=Math.min(n,1),e.player.bar.set("played",n,"width"),e.player.template.ptime.innerHTML=h.secondToTime(n*e.player.video.duration)},n=function n(a){document.removeEventListener(h.nameMap.dragEnd,n),document.removeEventListener(h.nameMap.dragMove,t);var i=((a.clientX||a.changedTouches[0].clientX)-h.getBoundingClientRectViewLeft(e.player.template.playedBarWrap))/e.player.template.playedBarWrap.clientWidth;i=Math.max(i,0),i=Math.min(i,1),e.player.bar.set("played",i,"width"),e.player.seek(e.player.bar.get("played")*e.player.video.duration),e.player.timer.enable("progress")};this.player.template.playedBarWrap.addEventListener(h.nameMap.dragStart,(function(){e.player.timer.disable("progress"),document.addEventListener(h.nameMap.dragMove,t),document.addEventListener(h.nameMap.dragEnd,n)})),this.player.template.playedBarWrap.addEventListener(h.nameMap.dragMove,(function(t){if(e.player.video.duration){var n=e.player.template.playedBarWrap.getBoundingClientRect().left,a=(t.clientX||t.changedTouches[0].clientX)-n;if(a<0||a>e.player.template.playedBarWrap.offsetWidth)return;var i=e.player.video.duration*(a/e.player.template.playedBarWrap.offsetWidth);h.isMobile&&e.thumbnails&&e.thumbnails.show(),e.thumbnails&&e.thumbnails.move(a),e.player.template.playedBarTime.style.left="".concat(a-(i>=3600?25:20),"px"),e.player.template.playedBarTime.innerText=h.secondToTime(i),e.player.template.playedBarTime.classList.remove("hidden")}})),this.player.template.playedBarWrap.addEventListener(h.nameMap.dragEnd,(function(){h.isMobile&&e.thumbnails&&e.thumbnails.hide()})),h.isMobile||(this.player.template.playedBarWrap.addEventListener("mouseenter",(function(){e.player.video.duration&&(e.thumbnails&&e.thumbnails.show(),e.player.template.playedBarTime.classList.remove("hidden"))})),this.player.template.playedBarWrap.addEventListener("mouseleave",(function(){e.player.video.duration&&(e.thumbnails&&e.thumbnails.hide(),e.player.template.playedBarTime.classList.add("hidden"))})))}},{key:"initFullButton",value:function(){var e=this;this.player.template.browserFullButton.addEventListener("click",(function(){e.player.fullScreen.toggle("browser")})),this.player.template.webFullButton.addEventListener("click",(function(){e.player.fullScreen.toggle("web")}))}},{key:"initVolumeButton",value:function(){var e=this,t=function(t){var n=t||window.event,a=((n.clientX||n.changedTouches[0].clientX)-h.getBoundingClientRectViewLeft(e.player.template.volumeBarWrap)-5.5)/35;e.player.volume(a)},n=function n(){document.removeEventListener(h.nameMap.dragEnd,n),document.removeEventListener(h.nameMap.dragMove,t),e.player.template.volumeButton.classList.remove("dplayer-volume-active")};this.player.template.volumeBarWrapWrap.addEventListener("click",(function(t){var n=t||window.event,a=((n.clientX||n.changedTouches[0].clientX)-h.getBoundingClientRectViewLeft(e.player.template.volumeBarWrap)-5.5)/35;e.player.volume(a)})),this.player.template.volumeBarWrapWrap.addEventListener(h.nameMap.dragStart,(function(){document.addEventListener(h.nameMap.dragMove,t),document.addEventListener(h.nameMap.dragEnd,n),e.player.template.volumeButton.classList.add("dplayer-volume-active")})),this.player.template.volumeButtonIcon.addEventListener("click",(function(){e.player.video.muted?(e.player.video.muted=!1,e.player.switchVolumeIcon(),e.player.bar.set("volume",e.player.volume(),"width")):(e.player.video.muted=!0,e.player.template.volumeIcon.innerHTML=te.volumeOff,e.player.bar.set("volume",0,"width"))}))}},{key:"initQualityButton",value:function(){var e=this;this.player.options.video.quality&&this.player.template.qualityList.addEventListener("click",(function(t){t.target.classList.contains("dplayer-quality-item")&&e.player.switchQuality(t.target.dataset.index)}))}},{key:"initScreenshotButton",value:function(){var e=this;this.player.options.screenshot&&this.player.template.camareButton.addEventListener("click",(function(){var t,n=document.createElement("canvas");n.width=e.player.video.videoWidth,n.height=e.player.video.videoHeight,n.getContext("2d").drawImage(e.player.video,0,0,n.width,n.height),n.toBlob((function(e){t=URL.createObjectURL(e);var n=document.createElement("a");n.href=t,n.download="DPlayer.png",n.style.display="none",document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(t)})),e.player.events.trigger("screenshot",t)}))}},{key:"initAirplayButton",value:function(){this.player.options.airplay&&(window.WebKitPlaybackTargetAvailabilityEvent?this.player.video.addEventListener("webkitplaybacktargetavailabilitychanged",function(e){switch(e.availability){case"available":this.template.airplayButton.disable=!1;break;default:this.template.airplayButton.disable=!0}this.template.airplayButton.addEventListener("click",function(){this.video.webkitShowPlaybackTargetPicker()}.bind(this))}.bind(this.player)):this.player.template.airplayButton.style.display="none")}},{key:"initSubtitleButton",value:function(){var e=this;this.player.options.subtitle&&(this.player.events.on("subtitle_show",(function(){e.player.template.subtitleButton.dataset.balloon=e.player.tran("Hide subtitle"),e.player.template.subtitleButtonInner.style.opacity="",e.player.user.set("subtitle",1)})),this.player.events.on("subtitle_hide",(function(){e.player.template.subtitleButton.dataset.balloon=e.player.tran("Show subtitle"),e.player.template.subtitleButtonInner.style.opacity="0.4",e.player.user.set("subtitle",0)})),this.player.template.subtitleButton.addEventListener("click",(function(){e.player.subtitle.toggle()})))}},{key:"setAutoHide",value:function(){var e=this;this.show(),clearTimeout(this.autoHideTimer),this.autoHideTimer=setTimeout((function(){!e.player.video.played.length||e.player.paused||e.disableAutoHide||e.hide()}),3e3)}},{key:"show",value:function(){this.player.container.classList.remove("dplayer-hide-controller")}},{key:"hide",value:function(){this.player.container.classList.add("dplayer-hide-controller"),this.player.setting.hide(),this.player.comment&&this.player.comment.hide()}},{key:"isShow",value:function(){return!this.player.container.classList.contains("dplayer-hide-controller")}},{key:"toggle",value:function(){this.isShow()?this.hide():this.show()}},{key:"destroy",value:function(){clearTimeout(this.autoHideTimer)}}])&&Te(t.prototype,n),a&&Te(t,a),e}();function Pe(e,t){for(var n=0;n=n.width?(this.player.template.menu.style.right=n.width-e+"px",this.player.template.menu.style.left="initial"):(this.player.template.menu.style.left=e+"px",this.player.template.menu.style.right="initial"),t+this.player.template.menu.offsetHeight>=n.height?(this.player.template.menu.style.bottom=n.height-t+"px",this.player.template.menu.style.top="initial"):(this.player.template.menu.style.top=t+"px",this.player.template.menu.style.bottom="initial"),this.player.template.mask.classList.add("dplayer-mask-show"),this.shown=!0,this.player.events.trigger("contextmenu_show")}},{key:"hide",value:function(){this.player.template.mask.classList.remove("dplayer-mask-show"),this.player.template.menu.classList.remove("dplayer-menu-show"),this.shown=!1,this.player.events.trigger("contextmenu_hide")}}])&&ze(t.prototype,n),a&&ze(t,a),e}();function Ie(e,t){for(var n=0;ne&&this.notice("".concat(this.tran("REW")," ").concat((this.video.currentTime-e).toFixed(0)," ").concat(this.tran("s"))),this.video.currentTime=e,this.danmaku&&this.danmaku.seek(),this.bar.set("played",e/this.video.duration,"width"),this.template.ptime.innerHTML=h.secondToTime(e)}},{key:"play",value:function(e){var t=this;if(this.paused=!1,this.video.paused&&!h.isMobile&&this.bezel.switch(te.play),this.template.playButton.innerHTML=te.pause,this.template.mobilePlayButton.innerHTML=te.pause,e||u.a.resolve(this.video.play()).catch((function(){t.pause()})).then((function(){})),this.timer.enable("loading"),this.container.classList.remove("dplayer-paused"),this.container.classList.add("dplayer-playing"),this.danmaku&&this.danmaku.play(),this.options.mutex)for(var n=0;n=.95?this.template.volumeIcon.innerHTML=te.volumeUp:this.volume()>0?this.template.volumeIcon.innerHTML=te.volumeDown:this.template.volumeIcon.innerHTML=te.volumeOff}},{key:"volume",value:function(e,t,n){if(e=parseFloat(e),!isNaN(e)){e=Math.max(e,0),e=Math.min(e,1),this.bar.set("volume",e,"width");var a="".concat((100*e).toFixed(0),"%");this.template.volumeBarWrapWrap.dataset.balloon=a,t||this.user.set("volume",e),n||this.notice("".concat(this.tran("Volume")," ").concat((100*e).toFixed(0),"%")),this.video.volume=e,this.video.muted&&(this.video.muted=!1),this.switchVolumeIcon()}return this.video.volume}},{key:"toggle",value:function(){this.video.paused?this.play():this.pause()}},{key:"on",value:function(e,t){this.events.on(e,t)}},{key:"switchVideo",value:function(e,t){this.pause(),this.plugins.p2pEngine&&(this.plugins.p2pEngine.destroy(),this.plugins.p2pEngine=null),this.plugins.dash?this.plugins.dash.attachSource(null):this.plugins.hls?this.plugins.hls.destroy():this.plugins.shaka,this.video.poster=e.pic?e.pic:"",this.video.src=e.url,this.initMSE(this.video,e.type||"auto"),t&&(this.template.danmakuLoading.style.display="block",this.bar.set("played",0,"width"),this.bar.set("loaded",0,"width"),this.template.ptime.innerHTML="00:00",this.template.danmaku.innerHTML="",this.danmaku&&this.danmaku.reload({id:t.id,address:t.api,token:t.token,maximum:t.maximum,addition:t.addition,user:t.user}))}},{key:"initMSE",value:function(e,t){var n=this;if(this.type=t,this.options.video.customType&&this.options.video.customType[t])"[object Function]"===Object.prototype.toString.call(this.options.video.customType[t])?this.options.video.customType[t](this.video,this):console.error("Illegal customType: ".concat(t));else switch("auto"===this.type&&(/m3u8(#|\?|$)/i.exec(e.src)?this.type="hls":/.flv(#|\?|$)/i.exec(e.src)?this.type="flv":/.mpd(#|\?|$)/i.exec(e.src)?this.type="dash":/.mp4(#|\?|$)/i.exec(e.src)?this.type="mp4":this.type="normal"),h.isP2pSupported||(this.type="normal"),this.type){case"hls":window.Hls?(this.p2pInfo.decoder="Hls.js",this.initHlsjs(e)):window.shaka?(this.p2pInfo.decoder="Shaka-Player",this.initShaka(e)):this.notice("Error: Can't find hls.js.");break;case"flv":if(window.flvjs)if(window.flvjs.isSupported()){var a=window.flvjs.createPlayer(Object.assign(this.options.pluginOptions.flv.mediaDataSource||{},{type:"flv",url:e.src}),this.options.pluginOptions.flv.config);this.plugins.flvjs=a,a.attachMediaElement(e),a.load(),this.events.on("destroy",(function(){a.unload(),a.detachMediaElement(),a.destroy(),delete n.plugins.flvjs}))}else this.notice("Error: flvjs is not supported.");else this.notice("Error: Can't find flvjs.");break;case"dash":window.dashjs?(this.p2pInfo.decoder="Dash.js",this.initDashjs(e)):window.shaka?(this.p2pInfo.decoder="Shaka-Player",this.initShaka(e)):this.notice("Error: Can't find dashjs or shaka-player.");break;case"mp4":window.P2PEngineMp4?(this.p2pInfo.decoder="VideoStream",this.initMp4(e)):this.notice("Error: Can't find P2PEngineMp4.")}}},{key:"initVideo",value:function(e,t){var n=this;this.initMSE(e,t),this.on("durationchange",(function(){1!==e.duration&&e.duration!==1/0&&(n.template.dtime.innerHTML=h.secondToTime(e.duration))})),this.on("progress",(function(){var t=e.buffered.length?e.buffered.end(e.buffered.length-1)/e.duration:0;n.bar.set("loaded",t,"width")})),this.on("error",(function(){n.video.error&&n.tran&&n.notice&&"webtorrent"!==n.type&&n.notice(n.tran("Video load failed"),-1)})),this.on("ended",(function(){n.bar.set("played",1,"width"),n.setting.loop?(n.seek(0),n.play()):n.pause(),n.danmaku&&(n.danmaku.danIndex=0)})),this.on("play",(function(){n.paused&&n.play(!0)})),this.on("pause",(function(){n.paused||n.pause(!0)})),this.on("timeupdate",(function(){n.bar.set("played",n.video.currentTime/n.video.duration,"width");var e=h.secondToTime(n.video.currentTime);n.template.ptime.innerHTML!==e&&(n.template.ptime.innerHTML=e)}));for(var a=function(t){e.addEventListener(n.events.videoEvents[t],(function(){n.events.trigger(n.events.videoEvents[t])}))},i=0;i1&&void 0!==arguments[1]?arguments[1]:2e3,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:.8;this.template.notice.innerHTML=e,this.template.notice.style.opacity=a,this.noticeTime&&clearTimeout(this.noticeTime),this.events.trigger("notice_show",e),n>0&&(this.noticeTime=setTimeout((function(){t.template.notice.style.opacity=0,t.events.trigger("notice_hide")}),n))}},{key:"resize",value:function(){this.danmaku&&this.danmaku.resize(),this.controller.thumbnails&&this.controller.thumbnails.resize(160,this.video.videoHeight/this.video.videoWidth*160,this.template.barWrap.offsetWidth),this.events.trigger("resize")}},{key:"speed",value:function(e){this.video.playbackRate=e}},{key:"destroy",value:function(){Ne.splice(Ne.indexOf(this),1),this.pause(),this.controller.destroy(),this.timer.destroy(),this.video.src="",this.container.innerHTML="",this.events.trigger("destroy")}},{key:"initIOSWeb",value:function(){var e=this;if(window.P2PEngineIOS&&window.P2PEngineIOS.isSupported()){var t=this.options.pluginOptions.ios||{},n=new P2PEngineIOS(t);n.registerServiceWorker().then((function(t){window.Hls||(e.p2pInfo.decoder="Native")})).catch((function(){})),(!t.nativePlaybackOnly||t.nativePlaybackOnly&&!P2PEngineIOS.isMSESupported())&&(this.p2pInfo.version=P2PEngineIOS.version),this.setupP2PListeners(n),this.events.on("destroy",(function(){n.destroy()}))}else if(window.Hls&&window.Hls.P2pEngine&&!window.Hls.isSupported()){this.p2pInfo.decoder="Native",this.p2pInfo.version=window.Hls.engineVersion;var a=(this.options.pluginOptions.hls||{}).p2pConfig||{},i=new window.Hls.P2pEngine(a);this.setupP2PListeners(i),this.events.on("destroy",(function(){i.destroy()}))}}},{key:"initHlsjs",value:function(e){var t=this;if(window.Hls.isSupported()){var n=this.options.pluginOptions.hls||{},a=n.p2pConfig||{};this.options&&!0!==this.options.live?a.live=!1:a.live=!0,a.useHttpRange||(a.useHttpRange=!1),a.live&&(n=Object.assign({maxBufferSize:0,maxBufferLength:10,liveSyncDurationCount:15},n));var i=new window.Hls(n);window.P2PEngine&&window.P2PEngine.isSupported()?(this.plugins.p2pEngine=i.p2pEngine=new window.P2PEngine(i,a),this.p2pInfo.version=i.p2pEngine.version):window.Hls.P2pEngine&&(this.p2pInfo.version=window.Hls.engineVersion),this.plugins.hls=i,i.loadSource(e.src),i.attachMedia(e),this.setupP2PListeners(i.p2pEngine),this.events.on("destroy",(function(){i.p2pEngine&&i.p2pEngine.destroy(),delete t.plugins.p2pEngine,i.destroy(),delete t.plugins.hls}))}else this.notice("Error: hls.js is not supported.")}},{key:"initShaka",value:function(e){var t=this;shaka.polyfill.installAll();var n=this.options.pluginOptions.shaka||{},a=n.p2pConfig;delete n.p2pConfig;var i=e.src,o=this.plugins.shaka;if(o||(o=new shaka.Player(e)).configure(n),o.load(i),this.plugins.shaka=o,window.P2PEngineShaka&&window.P2PEngineShaka.isSupported()){var r=new window.P2PEngineShaka(o,a);this.plugins.p2pEngine=r,this.p2pInfo.version=r.version,this.setupP2PListeners(r)}this.events.once("destroy",(function(){t.plugins.p2pEngine.destroy(),delete t.plugins.p2pEngine,delete t.plugins.shaka}))}},{key:"initDashjs",value:function(e){var t=this,n=this.options.pluginOptions.dash||{},a=n.p2pConfig;delete n.p2pConfig;var i=this.plugins.dash;if(i?i.attachSource(e.src):((i=window.dashjs.MediaPlayer().create()).initialize(e,e.src,this.options.autoplay),i.updateSettings(n)),window.P2PEngineDash&&window.P2PEngineDash.isSupported()){var o=new window.P2PEngineDash(i,a);this.plugins.p2pEngine=i.p2pEngine=o,this.p2pInfo.version=o.version}this.plugins.dash=i,this.events.once("destroy",(function(){t.plugins.p2pEngine.destroy(),delete t.plugins.p2pEngine,t.plugins.dash.reset(),delete t.plugins.dash})),this.setupP2PListeners(i.p2pEngine)}},{key:"initMp4",value:function(e){var t=this,n=this.options.pluginOptions.mp4||{},a=new P2PEngineMp4(e,n);this.plugins.p2pEngine=a,this.events.once("destroy",(function(){t.plugins.p2pEngine.destroy(),delete t.plugins.p2pEngine})),a.loadSource(e.src),this.p2pInfo.version=P2PEngineMp4.version,this.setupP2PListeners(a)}},{key:"setupP2PListeners",value:function(e){var t=this;e&&e.on("stats",(function(e){t.p2pInfo.p2pDownloaded=e.totalP2PDownloaded,t.p2pInfo.httpDownloaded=e.totalHTTPDownloaded,t.p2pInfo.uploaded=e.totalP2PUploaded,t.events.trigger("stats",e)})).on("peerId",(function(e){t.p2pInfo.peerId=e,t.events.trigger("peerId",e)})).on("peers",(function(e){t.p2pInfo.peers=e.length,t.events.trigger("peers",e)}))}}])&&He(t.prototype,n),a&&He(t,a),e}();t.default=Ue}]).default})); \ No newline at end of file diff --git a/templates/player/p2phls/hls.min.js b/templates/player/p2phls/hls.min.js new file mode 100644 index 0000000..146e5ec --- /dev/null +++ b/templates/player/p2phls/hls.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.Hls=t():e.Hls=t()}(self,(()=>(()=>{var e={204:e=>{"use strict";var t,r="object"==typeof Reflect?Reflect:null,i=r&&"function"==typeof r.apply?r.apply:function(e,t,r){return Function.prototype.apply.call(e,t,r)};t=r&&"function"==typeof r.ownKeys?r.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var s=Number.isNaN||function(e){return e!=e};function n(){n.init.call(this)}e.exports=n,e.exports.once=function(e,t){return new Promise((function(r,i){function s(r){e.removeListener(t,n),i(r)}function n(){"function"==typeof e.removeListener&&e.removeListener("error",s),r([].slice.call(arguments))}p(e,t,n,{once:!0}),"error"!==t&&function(e,t,r){"function"==typeof e.on&&p(e,"error",t,r)}(e,s,{once:!0})}))},n.EventEmitter=n,n.prototype._events=void 0,n.prototype._eventsCount=0,n.prototype._maxListeners=void 0;var a=10;function o(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function l(e){return void 0===e._maxListeners?n.defaultMaxListeners:e._maxListeners}function h(e,t,r,i){var s,n,a,h;if(o(r),void 0===(n=e._events)?(n=e._events=Object.create(null),e._eventsCount=0):(void 0!==n.newListener&&(e.emit("newListener",t,r.listener?r.listener:r),n=e._events),a=n[t]),void 0===a)a=n[t]=r,++e._eventsCount;else if("function"==typeof a?a=n[t]=i?[r,a]:[a,r]:i?a.unshift(r):a.push(r),(s=l(e))>0&&a.length>s&&!a.warned){a.warned=!0;var u=new Error("Possible EventEmitter memory leak detected. "+a.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");u.name="MaxListenersExceededWarning",u.emitter=e,u.type=t,u.count=a.length,h=u,console&&console.warn&&console.warn(h)}return e}function u(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function c(e,t,r){var i={fired:!1,wrapFn:void 0,target:e,type:t,listener:r},s=u.bind(i);return s.listener=r,i.wrapFn=s,s}function d(e,t,r){var i=e._events;if(void 0===i)return[];var s=i[t];return void 0===s?[]:"function"==typeof s?r?[s.listener||s]:[s]:r?function(e){for(var t=new Array(e.length),r=0;r0&&(a=t[0]),a instanceof Error)throw a;var o=new Error("Unhandled error."+(a?" ("+a.message+")":""));throw o.context=a,o}var l=n[e];if(void 0===l)return!1;if("function"==typeof l)i(l,this,t);else{var h=l.length,u=g(l,h);for(r=0;r=0;n--)if(r[n]===t||r[n].listener===t){a=r[n].listener,s=n;break}if(s<0)return this;0===s?r.shift():function(e,t){for(;t+1=0;i--)this.removeListener(e,t[i]);return this},n.prototype.listeners=function(e){return d(this,e,!0)},n.prototype.rawListeners=function(e){return d(this,e,!1)},n.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):f.call(e,t)},n.prototype.listenerCount=f,n.prototype.eventNames=function(){return this._eventsCount>0?t(this._events):[]}},305:function(e){var t;"undefined"!=typeof window&&(t=function(){return function(e){var t={};function r(i){if(t[i])return t[i].exports;var s=t[i]={i,l:!1,exports:{}};return e[i].call(s.exports,s,s.exports,r),s.l=!0,s.exports}return r.m=e,r.c=t,r.d=function(e,t,i){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(r.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var s in e)r.d(i,s,function(t){return e[t]}.bind(null,s));return i},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="/dist/",r(r.s="./src/hls.ts")}({"./node_modules/eventemitter3/index.js":function(e,t,r){"use strict";var i=Object.prototype.hasOwnProperty,s="~";function n(){}function a(e,t,r){this.fn=e,this.context=t,this.once=r||!1}function o(e,t,r,i,n){if("function"!=typeof r)throw new TypeError("The listener must be a function");var o=new a(r,i||e,n),l=s?s+t:t;return e._events[l]?e._events[l].fn?e._events[l]=[e._events[l],o]:e._events[l].push(o):(e._events[l]=o,e._eventsCount++),e}function l(e,t){0==--e._eventsCount?e._events=new n:delete e._events[t]}function h(){this._events=new n,this._eventsCount=0}Object.create&&(n.prototype=Object.create(null),(new n).__proto__||(s=!1)),h.prototype.eventNames=function(){var e,t,r=[];if(0===this._eventsCount)return r;for(t in e=this._events)i.call(e,t)&&r.push(s?t.slice(1):t);return Object.getOwnPropertySymbols?r.concat(Object.getOwnPropertySymbols(e)):r},h.prototype.listeners=function(e){var t=s?s+e:e,r=this._events[t];if(!r)return[];if(r.fn)return[r.fn];for(var i=0,n=r.length,a=new Array(n);i0}),!1)}e.exports=function(e,t){t=t||{};var s={main:r.m},n=t.all?{main:Object.keys(s.main)}:function(e,t){for(var r={main:[t]},i={main:[]},s={main:{}};l(r);)for(var n=Object.keys(r),a=0;a=2*c/f||E<=T)){var b,_=Number.POSITIVE_INFINITY;for(b=e.level-1;b>p&&!((_=c*g[b].maxBitrate/(6.4*y))=E)){var L=this.bwEstimator.getEstimate();h.logger.warn("Fragment "+e.sn+(t?" part "+t.index:"")+" of level "+e.level+" is loading too slowly and will cause an underbuffer; aborting and switching to level "+b+"\n Current BW estimate: "+(Object(i.isFiniteNumber)(L)?(L/1024).toFixed(3):"Unknown")+" Kb/s\n Estimated load time for current fragment: "+E.toFixed(3)+" s\n Estimated load time for the next fragment: "+_.toFixed(3)+" s\n Time to underbuffer: "+T.toFixed(3)+" s"),r.nextLoadLevel=b,this.bwEstimator.sample(d,u.loaded),this.clearTimer(),e.loader&&(this.fragCurrent=this.partCurrent=null,e.loader.abort()),r.trigger(n.Events.FRAG_LOAD_EMERGENCY_ABORTED,{frag:e,part:t,stats:u})}}}}}},d.onFragLoaded=function(e,t){var r=t.frag,s=t.part;if(r.type===l.PlaylistLevelType.MAIN&&Object(i.isFiniteNumber)(r.sn)){var a=s?s.stats:r.stats,o=s?s.duration:r.duration;if(this.clearTimer(),this.lastLoadedFragLevel=r.level,this._nextAutoLevel=-1,this.hls.config.abrMaxWithRealBitrate){var h=this.hls.levels[r.level],u=(h.loaded?h.loaded.bytes:0)+a.loaded,c=(h.loaded?h.loaded.duration:0)+o;h.loaded={bytes:u,duration:c},h.realBitrate=Math.round(8*u/c)}if(r.bitrateTest){var d={stats:a,frag:r,part:s,id:r.type};this.onFragBuffered(n.Events.FRAG_BUFFERED,d),r.bitrateTest=!1}}},d.onFragBuffered=function(e,t){var r=t.frag,i=t.part,s=i?i.stats:r.stats;if(!s.aborted&&r.type===l.PlaylistLevelType.MAIN&&"initSegment"!==r.sn){var n=s.parsing.end-s.loading.start;this.bwEstimator.sample(n,s.loaded),s.bwEstimate=this.bwEstimator.getEstimate(),r.bitrateTest?this.bitrateTestDelay=n/1e3:this.bitrateTestDelay=0}},d.onError=function(e,t){switch(t.details){case o.ErrorDetails.FRAG_LOAD_ERROR:case o.ErrorDetails.FRAG_LOAD_TIMEOUT:this.clearTimer()}},d.clearTimer=function(){self.clearInterval(this.timer),this.timer=void 0},d.getNextABRAutoLevel=function(){var e=this.fragCurrent,t=this.partCurrent,r=this.hls,i=r.maxAutoLevel,s=r.config,n=r.minAutoLevel,o=r.media,l=t?t.duration:e?e.duration:0,u=o?o.currentTime:0,c=o&&0!==o.playbackRate?Math.abs(o.playbackRate):1,d=this.bwEstimator?this.bwEstimator.getEstimate():s.abrEwmaDefaultEstimate,f=(a.BufferHelper.bufferInfo(o,u,s.maxBufferHole).end-u)/c,g=this.findBestLevel(d,n,i,f,s.abrBandWidthFactor,s.abrBandWidthUpFactor);if(g>=0)return g;h.logger.trace((f?"rebuffering expected":"buffer is empty")+", finding optimal quality level");var p=l?Math.min(l,s.maxStarvationDelay):s.maxStarvationDelay,v=s.abrBandWidthFactor,m=s.abrBandWidthUpFactor;if(!f){var y=this.bitrateTestDelay;y&&(p=(l?Math.min(l,s.maxLoadingDelay):s.maxLoadingDelay)-y,h.logger.trace("bitrate test took "+Math.round(1e3*y)+"ms, set first fragment max fetchDuration to "+Math.round(1e3*p)+" ms"),v=m=1)}return g=this.findBestLevel(d,n,i,f+p,v,m),Math.max(g,0)},d.findBestLevel=function(e,t,r,i,s,n){for(var a,o=this.fragCurrent,l=this.partCurrent,u=this.lastLoadedFragLevel,c=this.hls.levels,d=c[u],f=!(null==d||null===(a=d.details)||void 0===a||!a.live),g=null==d?void 0:d.codecSet,p=l?l.duration:o?o.duration:0,v=r;v>=t;v--){var m=c[v];if(m&&(!g||m.codecSet===g)){var y=m.details,E=(l?null==y?void 0:y.partTarget:null==y?void 0:y.averagetargetduration)||p,S=void 0;S=v<=u?s*e:n*e;var T=c[v].maxBitrate,b=T*E/S;if(h.logger.trace("level/adjustedbw/bitrate/avgDuration/maxFetchDuration/fetchDuration: "+v+"/"+Math.round(S)+"/"+T+"/"+E+"/"+i+"/"+b),S>T&&(!b||f&&!this.bitrateTestDelay||b0&&-1===e?(this.log("Override startPosition with lastCurrentTime @"+t.toFixed(3)),this.state=s.State.IDLE):(this.loadedmetadata=!1,this.state=s.State.WAITING_TRACK),this.nextLoadPosition=this.startPosition=this.lastCurrentTime=e,this.tick()},T.doTick=function(){switch(this.state){case s.State.IDLE:this.doTickIdle();break;case s.State.WAITING_TRACK:var t,r=this.levels,i=this.trackId,n=null==r||null===(t=r[i])||void 0===t?void 0:t.details;if(n){if(this.waitForCdnTuneIn(n))break;this.state=s.State.WAITING_INIT_PTS}break;case s.State.FRAG_LOADING_WAITING_RETRY:var o,l=performance.now(),h=this.retryDate;(!h||l>=h||null!==(o=this.media)&&void 0!==o&&o.seeking)&&(this.log("RetryDate reached, switch back to IDLE state"),this.state=s.State.IDLE);break;case s.State.WAITING_INIT_PTS:var u=this.waitingData;if(u){var c=u.frag,d=u.part,f=u.cache,p=u.complete;if(void 0!==this.initPTS[c.cc]){this.waitingData=null,this.waitingVideoCC=-1,this.state=s.State.FRAG_LOADING;var v={frag:c,part:d,payload:f.flush(),networkDetails:null};this._handleFragmentLoadProgress(v),p&&e.prototype._handleFragmentLoadComplete.call(this,v)}else if(this.videoTrackCC!==this.waitingVideoCC)m.logger.log("Waiting fragment cc ("+c.cc+") cancelled because video is at cc "+this.videoTrackCC),this.clearWaitingFragment();else{var y=this.getLoadPosition(),E=a.BufferHelper.bufferInfo(this.mediaBuffer,y,this.config.maxBufferHole);Object(g.fragmentWithinToleranceTest)(E.end,this.config.maxFragLookUpTolerance,c)<0&&(m.logger.log("Waiting fragment cc ("+c.cc+") @ "+c.start+" cancelled because another fragment at "+E.end+" is needed"),this.clearWaitingFragment())}}else this.state=s.State.IDLE}this.onTickEnd()},T.clearWaitingFragment=function(){var e=this.waitingData;e&&(this.fragmentTracker.removeFragment(e.frag),this.waitingData=null,this.waitingVideoCC=-1,this.state=s.State.IDLE)},T.onTickEnd=function(){var e=this.media;if(e&&e.readyState){var t=(this.mediaBuffer?this.mediaBuffer:e).buffered;!this.loadedmetadata&&t.length&&(this.loadedmetadata=!0),this.lastCurrentTime=e.currentTime}},T.doTickIdle=function(){var e,t,r=this.hls,i=this.levels,a=this.media,o=this.trackId,l=r.config;if(i&&i[o]&&(a||!this.startFragRequested&&l.startFragPrefetch)){var c=i[o].details;if(!c||c.live&&this.levelLastLoaded!==o||this.waitForCdnTuneIn(c))this.state=s.State.WAITING_TRACK;else{this.bufferFlushed&&(this.bufferFlushed=!1,this.afterBufferFlushed(this.mediaBuffer?this.mediaBuffer:this.media,u.ElementaryStreamTypes.AUDIO,h.PlaylistLevelType.AUDIO));var d=this.getFwdBufferInfo(this.mediaBuffer?this.mediaBuffer:this.media,h.PlaylistLevelType.AUDIO);if(null!==d){var f=d.len,g=this.getMaxBufferLength(),p=this.audioSwitch;if(!(f>=g)||p){if(!p&&this._streamEnded(d,c))return r.trigger(n.Events.BUFFER_EOS,{type:"audio"}),void(this.state=s.State.ENDED);var v=c.fragments[0].start,m=d.end;if(p){var y=this.getLoadPosition();m=y,c.PTSKnown&&yv||d.nextStart)&&(this.log("Alt audio track ahead of main track, seek to start of alt audio track"),a.currentTime=v+.05)}var E=this.getNextFragment(m,c);E?"identity"!==(null===(e=E.decryptdata)||void 0===e?void 0:e.keyFormat)||null!==(t=E.decryptdata)&&void 0!==t&&t.key?this.loadFragment(E,c,m):this.loadKey(E,c):this.bufferFlushed=!0}}}}},T.getMaxBufferLength=function(){var t=e.prototype.getMaxBufferLength.call(this),r=this.getFwdBufferInfo(this.videoBuffer?this.videoBuffer:this.media,h.PlaylistLevelType.MAIN);return null===r?t:Math.max(t,r.len)},T.onMediaDetaching=function(){this.videoBuffer=null,e.prototype.onMediaDetaching.call(this)},T.onAudioTracksUpdated=function(e,t){var r=t.audioTracks;this.resetTransmuxer(),this.levels=r.map((function(e){return new l.Level(e)}))},T.onAudioTrackSwitching=function(e,t){var r=!!t.url;this.trackId=t.id;var i=this.fragCurrent;null!=i&&i.loader&&i.loader.abort(),this.fragCurrent=null,this.clearWaitingFragment(),r?this.setInterval(100):this.resetTransmuxer(),r?(this.audioSwitch=!0,this.state=s.State.IDLE):this.state=s.State.STOPPED,this.tick()},T.onManifestLoading=function(){this.mainDetails=null,this.fragmentTracker.removeAllFragments(),this.startPosition=this.lastCurrentTime=0,this.bufferFlushed=!1},T.onLevelLoaded=function(e,t){this.mainDetails=t.details},T.onAudioTrackLoaded=function(e,t){var r,i=this.levels,n=t.details,a=t.id;if(i){this.log("Track "+a+" loaded ["+n.startSN+","+n.endSN+"],duration:"+n.totalduration);var o=i[a],l=0;if(n.live||null!==(r=o.details)&&void 0!==r&&r.live){var h=this.mainDetails;if(n.fragments[0]||(n.deltaUpdateFailed=!0),n.deltaUpdateFailed||!h)return;!o.details&&n.hasProgramDateTime&&h.hasProgramDateTime?(Object(p.alignMediaPlaylistByPDT)(n,h),l=n.fragments[0].start):l=this.alignPlaylists(n,o.details)}o.details=n,this.levelLastLoaded=a,this.startFragRequested||!this.mainDetails&&n.live||this.setStartPosition(o.details,l),this.state!==s.State.WAITING_TRACK||this.waitForCdnTuneIn(n)||(this.state=s.State.IDLE),this.tick()}else this.warn("Audio tracks were reset while loading level "+a)},T._handleFragmentLoadProgress=function(e){var t,r=e.frag,i=e.part,n=e.payload,a=this.config,o=this.trackId,l=this.levels;if(l){var u=l[o];console.assert(u,"Audio track is defined on fragment load progress");var g=u.details;console.assert(g,"Audio track details are defined on fragment load progress");var p=a.defaultAudioCodec||u.audioCodec||"mp4a.40.2",v=this.transmuxer;v||(v=this.transmuxer=new d.default(this.hls,h.PlaylistLevelType.AUDIO,this._handleTransmuxComplete.bind(this),this._handleTransmuxerFlush.bind(this)));var y=this.initPTS[r.cc],E=null===(t=r.initSegment)||void 0===t?void 0:t.data;if(void 0!==y){var S=i?i.index:-1,T=-1!==S,b=new f.ChunkMetadata(r.level,r.sn,r.stats.chunkCount,n.byteLength,S,T);v.push(n,E,p,"",r,i,g.totalduration,!1,b,y)}else m.logger.log("Unknown video PTS for cc "+r.cc+", waiting for video PTS before demuxing audio frag "+r.sn+" of ["+g.startSN+" ,"+g.endSN+"],track "+o),(this.waitingData=this.waitingData||{frag:r,part:i,cache:new c.default,complete:!1}).cache.push(new Uint8Array(n)),this.waitingVideoCC=this.videoTrackCC,this.state=s.State.WAITING_INIT_PTS}else this.warn("Audio tracks were reset while fragment load was in progress. Fragment "+r.sn+" of level "+r.level+" will not be buffered")},T._handleFragmentLoadComplete=function(t){this.waitingData?this.waitingData.complete=!0:e.prototype._handleFragmentLoadComplete.call(this,t)},T.onBufferReset=function(){this.mediaBuffer=this.videoBuffer=null,this.loadedmetadata=!1},T.onBufferCreated=function(e,t){var r=t.tracks.audio;r&&(this.mediaBuffer=r.buffer),t.tracks.video&&(this.videoBuffer=t.tracks.video.buffer)},T.onFragBuffered=function(e,t){var r=t.frag,i=t.part;r.type===h.PlaylistLevelType.AUDIO&&(this.fragContextChanged(r)?this.warn("Fragment "+r.sn+(i?" p: "+i.index:"")+" of level "+r.level+" finished buffering, but was aborted. state: "+this.state+", audioSwitch: "+this.audioSwitch):("initSegment"!==r.sn&&(this.fragPrevious=r,this.audioSwitch&&(this.audioSwitch=!1,this.hls.trigger(n.Events.AUDIO_TRACK_SWITCHED,{id:this.trackId}))),this.fragBufferedComplete(r,i)))},T.onError=function(t,r){switch(r.details){case v.ErrorDetails.FRAG_LOAD_ERROR:case v.ErrorDetails.FRAG_LOAD_TIMEOUT:case v.ErrorDetails.KEY_LOAD_ERROR:case v.ErrorDetails.KEY_LOAD_TIMEOUT:this.onFragmentOrKeyLoadError(h.PlaylistLevelType.AUDIO,r);break;case v.ErrorDetails.AUDIO_TRACK_LOAD_ERROR:case v.ErrorDetails.AUDIO_TRACK_LOAD_TIMEOUT:this.state!==s.State.ERROR&&this.state!==s.State.STOPPED&&(this.state=r.fatal?s.State.ERROR:s.State.IDLE,this.warn(r.details+" while loading frag, switching to "+this.state+" state"));break;case v.ErrorDetails.BUFFER_FULL_ERROR:if("audio"===r.parent&&(this.state===s.State.PARSING||this.state===s.State.PARSED)){var i=!0,n=this.getFwdBufferInfo(this.mediaBuffer,h.PlaylistLevelType.AUDIO);n&&n.len>.5&&(i=!this.reduceMaxBufferLength(n.len)),i&&(this.warn("Buffer full error also media.currentTime is not buffered, flush audio buffer"),this.fragCurrent=null,e.prototype.flushMainBuffer.call(this,0,Number.POSITIVE_INFINITY,"audio")),this.resetLoadingState()}}},T.onBufferFlushed=function(e,t){t.type===u.ElementaryStreamTypes.AUDIO&&(this.bufferFlushed=!0)},T._handleTransmuxComplete=function(e){var t,r="audio",i=this.hls,a=e.remuxResult,o=e.chunkMeta,l=this.getCurrentContext(o);if(!l)return this.warn("The loading context changed while buffering fragment "+o.sn+" of level "+o.level+". This chunk will not be buffered."),void this.resetLiveStartWhenNotLoaded(o.level);var h=l.frag,c=l.part,d=a.audio,f=a.text,g=a.id3,p=a.initSegment;if(!this.fragContextChanged(h)){if(this.state=s.State.PARSING,this.audioSwitch&&d&&this.completeAudioSwitch(),null!=p&&p.tracks&&(this._bufferInitSegment(p.tracks,h,o),i.trigger(n.Events.FRAG_PARSING_INIT_SEGMENT,{frag:h,id:r,tracks:p.tracks})),d){var v=d.startPTS,m=d.endPTS,E=d.startDTS,S=d.endDTS;c&&(c.elementaryStreams[u.ElementaryStreamTypes.AUDIO]={startPTS:v,endPTS:m,startDTS:E,endDTS:S}),h.setElementaryStreamInfo(u.ElementaryStreamTypes.AUDIO,v,m,E,S),this.bufferFragmentData(d,h,c,o)}if(null!=g&&null!==(t=g.samples)&&void 0!==t&&t.length){var T=y({frag:h,id:r},g);i.trigger(n.Events.FRAG_PARSING_METADATA,T)}if(f){var b=y({frag:h,id:r},f);i.trigger(n.Events.FRAG_PARSING_USERDATA,b)}}},T._bufferInitSegment=function(e,t,r){if(this.state===s.State.PARSING){e.video&&delete e.video;var i=e.audio;if(i){i.levelCodec=i.codec,i.id="audio",this.log("Init audio buffer, container:"+i.container+", codecs[parsed]=["+i.codec+"]"),this.hls.trigger(n.Events.BUFFER_CODECS,e);var a=i.initSegment;if(null!=a&&a.byteLength){var o={type:"audio",frag:t,part:null,chunkMeta:r,parent:t.type,data:a};this.hls.trigger(n.Events.BUFFER_APPENDING,o)}this.tick()}}},T.loadFragment=function(t,r,n){var a=this.fragmentTracker.getState(t);this.fragCurrent=t,(this.audioSwitch||a===o.FragmentState.NOT_LOADED||a===o.FragmentState.PARTIAL)&&("initSegment"===t.sn?this._loadInitSegment(t):r.live&&!Object(i.isFiniteNumber)(this.initPTS[t.cc])?(this.log("Waiting for video PTS in continuity counter "+t.cc+" of live stream before loading audio fragment "+t.sn+" of level "+this.trackId),this.state=s.State.WAITING_INIT_PTS):(this.startFragRequested=!0,e.prototype.loadFragment.call(this,t,r,n)))},T.completeAudioSwitch=function(){var t=this.hls,r=this.media,i=this.trackId;r&&(this.log("Switching audio track : flushing all audio"),e.prototype.flushMainBuffer.call(this,0,Number.POSITIVE_INFINITY,"audio")),this.audioSwitch=!1,t.trigger(n.Events.AUDIO_TRACK_SWITCHED,{id:i})},S}(s.default);t.default=S},"./src/controller/audio-track-controller.ts":function(e,t,r){"use strict";r.r(t);var i=r("./src/events.ts"),s=r("./src/errors.ts"),n=r("./src/controller/base-playlist-controller.ts"),a=r("./src/types/loader.ts");function o(e,t){for(var r=0;r=t.length)this.warn("Invalid id passed to audio-track controller");else{this.clearTimer();var r=t[this.trackId];this.log("Now switching to audio-track index "+e);var s=t[e],n=s.id,a=s.groupId,o=void 0===a?"":a,l=s.name,h=s.type,u=s.url;if(this.trackId=e,this.trackName=l,this.selectDefaultTrack=!1,this.hls.trigger(i.Events.AUDIO_TRACK_SWITCHING,{id:n,groupId:o,name:l,type:h,url:u}),!s.details||s.details.live){var c=this.switchParams(s.url,null==r?void 0:r.details);this.loadPlaylist(c)}}},d.selectInitialTrack=function(){var e=this.tracksInGroup;console.assert(e.length,"Initial audio track should be selected when tracks are known");var t=this.trackName,r=this.findTrackId(t)||this.findTrackId();-1!==r?this.setAudioTrack(r):(this.warn("No track found for running audio group-ID: "+this.groupId),this.hls.trigger(i.Events.ERROR,{type:s.ErrorTypes.MEDIA_ERROR,details:s.ErrorDetails.AUDIO_TRACK_LOAD_ERROR,fatal:!0}))},d.findTrackId=function(e){for(var t=this.tracksInGroup,r=0;rt.partTarget&&(h+=1)}if(Object(i.isFiniteNumber)(l))return new s.HlsUrlParameters(l,Object(i.isFiniteNumber)(h)?h:void 0,s.HlsSkip.No)}}},t.loadPlaylist=function(e){},t.shouldLoadTrack=function(e){return this.canLoad&&e&&!!e.url&&(!e.details||e.details.live)},t.playlistLoaded=function(e,t,r){var i=this,s=t.details,a=t.stats,o=a.loading.end?Math.max(0,self.performance.now()-a.loading.end):0;if(s.advancedDateTime=Date.now()-o,s.live||null!=r&&r.live){if(s.reloaded(r),r&&this.log("live playlist "+e+" "+(s.advanced?"REFRESHED "+s.lastPartSn+"-"+s.lastPartIndex:"MISSED")),r&&s.fragments.length>0&&Object(n.mergeDetails)(r,s),!this.canLoad||!s.live)return;var l,h=void 0,u=void 0;if(s.canBlockReload&&s.endSN&&s.advanced){var c=this.hls.config.lowLatencyMode,d=s.lastPartSn,f=s.endSN,g=s.lastPartIndex,p=d===f;-1!==g?(h=p?f+1:d,u=p?c?0:g:g+1):h=f+1;var v=s.age,m=v+s.ageHeader,y=Math.min(m-s.partTarget,1.5*s.targetduration);if(y>0){if(r&&y>r.tuneInGoal)this.warn("CDN Tune-in goal increased from: "+r.tuneInGoal+" to: "+y+" with playlist age: "+s.age),y=0;else{var E=Math.floor(y/s.targetduration);h+=E,void 0!==u&&(u+=Math.round(y%s.targetduration/s.partTarget)),this.log("CDN Tune-in age: "+s.ageHeader+"s last advanced "+v.toFixed(2)+"s goal: "+y+" skip sn "+E+" to part "+u)}s.tuneInGoal=y}if(l=this.getDeliveryDirectives(s,t.deliveryDirectives,h,u),c||!p)return void this.loadPlaylist(l)}else l=this.getDeliveryDirectives(s,t.deliveryDirectives,h,u);var S=Object(n.computeReloadInterval)(s,a);void 0!==h&&s.canBlockReload&&(S-=s.partTarget||1),this.log("reload live playlist "+e+" in "+Math.round(S)+" ms"),this.timer=self.setTimeout((function(){return i.loadPlaylist(l)}),S)}else this.clearTimer()},t.getDeliveryDirectives=function(e,t,r,i){var n=Object(s.getSkipValue)(e,r);return null!=t&&t.skip&&e.deltaUpdateFailed&&(r=t.msn,i=t.part,n=s.HlsSkip.No),new s.HlsUrlParameters(r,i,n)},t.retryLoadingOrFail=function(e){var t,r=this,i=this.hls.config,s=this.retryCount-1&&null!==(t=e.context)&&void 0!==t&&t.deliveryDirectives)this.warn("retry playlist loading #"+this.retryCount+' after "'+e.details+'"'),this.loadPlaylist();else{var n=Math.min(Math.pow(2,this.retryCount)*i.levelLoadingRetryDelay,i.levelLoadingMaxRetryTimeout);this.timer=self.setTimeout((function(){return r.loadPlaylist()}),n),this.warn("retry playlist loading #"+this.retryCount+" in "+n+' ms after "'+e.details+'"')}else this.warn('cannot recover from error "'+e.details+'"'),this.clearTimer(),e.fatal=!0;return s},e}()},"./src/controller/base-stream-controller.ts":function(e,t,r){"use strict";r.r(t),r.d(t,"State",(function(){return T})),r.d(t,"default",(function(){return b}));var i=r("./src/polyfills/number.ts"),s=r("./src/task-loop.ts"),n=r("./src/controller/fragment-tracker.ts"),a=r("./src/utils/buffer-helper.ts"),o=r("./src/utils/logger.ts"),l=r("./src/events.ts"),h=r("./src/errors.ts"),u=r("./src/types/transmuxer.ts"),c=r("./src/utils/mp4-tools.ts"),d=r("./src/utils/discontinuities.ts"),f=r("./src/controller/fragment-finders.ts"),g=r("./src/controller/level-helper.ts"),p=r("./src/loader/fragment-loader.ts"),v=r("./src/crypt/decrypter.ts"),m=r("./src/utils/time-ranges.ts"),y=r("./src/types/loader.ts");function E(e,t){for(var r=0;r=t.endSN&&!e.nextStart){var s=t.partList;if(null!=s&&s.length){var o=s[s.length-1];return a.BufferHelper.isBuffered(this.media,o.start+o.duration/2)}var l=i.getState(r);return l===n.FragmentState.PARTIAL||l===n.FragmentState.OK}return!1},A.onMediaAttached=function(e,t){var r=this.media=this.mediaBuffer=t.media;this.onvseeking=this.onMediaSeeking.bind(this),this.onvended=this.onMediaEnded.bind(this),r.addEventListener("seeking",this.onvseeking),r.addEventListener("ended",this.onvended);var i=this.config;this.levels&&i.autoStartLoad&&this.state===T.STOPPED&&this.startLoad(i.startPosition)},A.onMediaDetaching=function(){var e=this.media;null!=e&&e.ended&&(this.log("MSE detaching and video ended, reset startPosition"),this.startPosition=this.lastCurrentTime=0),e&&(e.removeEventListener("seeking",this.onvseeking),e.removeEventListener("ended",this.onvended),this.onvseeking=this.onvended=null),this.media=this.mediaBuffer=null,this.loadedmetadata=!1,this.fragmentTracker.removeAllFragments(),this.stopLoad()},A.onMediaSeeking=function(){var e=this.config,t=this.fragCurrent,r=this.media,s=this.mediaBuffer,n=this.state,o=r?r.currentTime:0,l=a.BufferHelper.bufferInfo(s||r,o,e.maxBufferHole);if(this.log("media seeking to "+(Object(i.isFiniteNumber)(o)?o.toFixed(3):o)+", state: "+n),n===T.ENDED)this.resetLoadingState();else if(t&&!l.len){var h=e.maxFragLookUpTolerance,u=t.start-h,c=o>t.start+t.duration+h;(o0&&n&&n.key&&n.iv&&"AES-128"===n.method){var a=self.performance.now();return t.decrypter.webCryptoDecrypt(new Uint8Array(s),n.key.buffer,n.iv.buffer).then((function(t){var s=self.performance.now();return i.trigger(l.Events.FRAG_DECRYPTED,{frag:e,payload:t,stats:{tstart:a,tdecrypt:s}}),r.payload=t,r}))}return r})).then((function(r){var i=t.fragCurrent,s=t.hls,n=t.levels;if(!n)throw new Error("init load aborted, missing levels");var a=n[e.level].details;console.assert(a,"Level details are defined when init segment is loaded");var o=e.stats;t.state=T.IDLE,t.fragLoadError=0,e.data=new Uint8Array(r.payload),o.parsing.start=o.buffering.start=self.performance.now(),o.parsing.end=o.buffering.end=self.performance.now(),r.frag===i&&s.trigger(l.Events.FRAG_BUFFERED,{stats:o,frag:i,part:null,id:e.type}),t.tick()})).catch((function(r){t.warn(r),t.resetFragmentLoading(e)}))},A.fragContextChanged=function(e){var t=this.fragCurrent;return!e||!t||e.level!==t.level||e.sn!==t.sn||e.urlId!==t.urlId},A.fragBufferedComplete=function(e,t){var r=this.mediaBuffer?this.mediaBuffer:this.media;this.log("Buffered "+e.type+" sn: "+e.sn+(t?" part: "+t.index:"")+" of "+("[stream-controller]"===this.logPrefix?"level":"track")+" "+e.level+" "+m.default.toString(a.BufferHelper.getBuffered(r))),this.state=T.IDLE,this.tick()},A._handleFragmentLoadComplete=function(e){var t=this.transmuxer;if(t){var r=e.frag,i=e.part,s=e.partsLoaded,n=!s||0===s.length||s.some((function(e){return!e})),a=new u.ChunkMetadata(r.level,r.sn,r.stats.chunkCount+1,0,i?i.index:-1,!n);t.flush(a)}},A._handleFragmentLoadProgress=function(e){},A._doFragLoad=function(e,t,r,s){var n=this;if(void 0===r&&(r=null),!this.levels)throw new Error("frag load aborted, missing levels");if(r=Math.max(e.start,r||0),this.config.lowLatencyMode&&t){var a=t.partList;if(a&&s){r>e.end&&t.fragmentHint&&(e=t.fragmentHint);var o=this.getNextPart(a,e,r);if(o>-1){var h=a[o];return this.log("Loading part sn: "+e.sn+" p: "+h.index+" cc: "+e.cc+" of playlist ["+t.startSN+"-"+t.endSN+"] parts [0-"+o+"-"+(a.length-1)+"] "+("[stream-controller]"===this.logPrefix?"level":"track")+": "+e.level+", target: "+parseFloat(r.toFixed(3))),this.nextLoadPosition=h.start+h.duration,this.state=T.FRAG_LOADING,this.hls.trigger(l.Events.FRAG_LOADING,{frag:e,part:a[o],targetBufferTime:r}),this.doFragPartsLoad(e,a,o,s).catch((function(e){return n.handleFragLoadError(e)}))}if(!e.url||this.loadedEndOfParts(a,r))return Promise.resolve(null)}}return this.log("Loading fragment "+e.sn+" cc: "+e.cc+" "+(t?"of ["+t.startSN+"-"+t.endSN+"] ":"")+("[stream-controller]"===this.logPrefix?"level":"track")+": "+e.level+", target: "+parseFloat(r.toFixed(3))),Object(i.isFiniteNumber)(e.sn)&&!this.bitrateTest&&(this.nextLoadPosition=e.start+e.duration),this.state=T.FRAG_LOADING,this.hls.trigger(l.Events.FRAG_LOADING,{frag:e,targetBufferTime:r}),this.fragmentLoader.load(e,s).catch((function(e){return n.handleFragLoadError(e)}))},A.doFragPartsLoad=function(e,t,r,i){var s=this;return new Promise((function(n,a){var o=[];!function r(h){var u=t[h];s.fragmentLoader.loadPart(e,u,i).then((function(i){o[u.index]=i;var a=i.part;s.hls.trigger(l.Events.FRAG_LOADED,i);var c=t[h+1];if(!c||c.fragment!==e)return n({frag:e,part:a,partsLoaded:o});r(h+1)})).catch(a)}(r)}))},A.handleFragLoadError=function(e){var t=e.data;return t&&t.details===h.ErrorDetails.INTERNAL_ABORTED?this.handleFragLoadAborted(t.frag,t.part):this.hls.trigger(l.Events.ERROR,t),null},A._handleTransmuxerFlush=function(e){var t=this.getCurrentContext(e);if(t&&this.state===T.PARSING){var r=t.frag,i=t.part,s=t.level,n=self.performance.now();r.stats.parsing.end=n,i&&(i.stats.parsing.end=n),this.updateLevelTiming(r,i,s,e.partial)}else this.fragCurrent||(this.state=T.IDLE)},A.getCurrentContext=function(e){var t=this.levels,r=e.level,i=e.sn,s=e.part;if(!t||!t[r])return this.warn("Levels object was unset while buffering fragment "+i+" of level "+r+". The current chunk will not be buffered."),null;var n=t[r],a=s>-1?Object(g.getPartWith)(n,i,s):null,o=a?a.fragment:Object(g.getFragmentWithSN)(n,i,this.fragCurrent);return o?{frag:o,part:a,level:n}:null},A.bufferFragmentData=function(e,t,r,i){if(e&&this.state===T.PARSING){var s=e.data1,n=e.data2,a=s;if(s&&n&&(a=Object(c.appendUint8Array)(s,n)),a&&a.length){var o={type:e.type,frag:t,part:r,chunkMeta:i,parent:t.type,data:a};this.hls.trigger(l.Events.BUFFER_APPENDING,o),e.dropped&&e.independent&&!r&&this.flushBufferGap(t)}}},A.flushBufferGap=function(e){var t=this.media;if(t)if(a.BufferHelper.isBuffered(t,t.currentTime)){var r=t.currentTime,i=a.BufferHelper.bufferInfo(t,r,0),s=e.duration,n=Math.min(2*this.config.maxFragLookUpTolerance,.25*s),o=Math.max(Math.min(e.start-n,i.end-n),r+n);e.start-o>n&&this.flushMainBuffer(o,e.start)}else this.flushMainBuffer(0,e.start)},A.getFwdBufferInfo=function(e,t){var r=this.config,s=this.getLoadPosition();if(!Object(i.isFiniteNumber)(s))return null;var n=a.BufferHelper.bufferInfo(e,s,r.maxBufferHole);if(0===n.len&&void 0!==n.nextStart){var o=this.fragmentTracker.getBufferedFrag(s,t);if(o&&n.nextStart=r&&(t.maxMaxBufferLength/=2,this.warn("Reduce max buffer length to "+t.maxMaxBufferLength+"s"),!0)},A.getNextFragment=function(e,t){var r,i,s=t.fragments,n=s.length;if(!n)return null;var a,o=this.config,l=s[0].start;if(t.live){var h=o.initialLiveManifestSize;if(n-1&&rr.start&&r.loaded},A.getInitialLiveFragment=function(e,t){var r=this.fragPrevious,i=null;if(r){if(e.hasProgramDateTime&&(this.log("Live playlist, switching playlist, load frag with same PDT: "+r.programDateTime),i=Object(f.findFragmentByPDT)(t,r.endProgramDateTime,this.config.maxFragLookUpTolerance)),!i){var s=r.sn+1;if(s>=e.startSN&&s<=e.endSN){var n=t[s-e.startSN];r.cc===n.cc&&(i=n,this.log("Live playlist, switching playlist, load frag with next SN: "+i.sn))}i||(i=Object(f.findFragWithCC)(t,r.cc))&&this.log("Live playlist, switching playlist, load frag with same CC: "+i.sn)}}else{var a=this.hls.liveSyncPosition;null!==a&&(i=this.getFragmentAtPosition(a,this.bitrateTest?e.fragmentEnd:e.edge,e))}return i},A.getFragmentAtPosition=function(e,t,r){var i,s=this.config,a=this.fragPrevious,o=r.fragments,l=r.endSN,h=r.fragmentHint,u=s.maxFragLookUpTolerance,c=!!(s.lowLatencyMode&&r.partList&&h);if(c&&h&&!this.bitrateTest&&(o=o.concat(h),l=h.sn),et-u?0:u;i=Object(f.findFragmentByPTS)(a,o,e,d)}else i=o[o.length-1];if(i){var g=i.sn-r.startSN,p=a&&i.level===a.level,v=o[g+1];if(this.fragmentTracker.getState(i)===n.FragmentState.BACKTRACKED){i=null;for(var m=g;o[m]&&this.fragmentTracker.getState(o[m])===n.FragmentState.BACKTRACKED;)i=a?o[m--]:o[--m];i||(i=v)}else a&&i.sn===a.sn&&!c&&p&&(i.sn=n-t.maxFragLookUpTolerance&&s<=a;if(null!==i&&r.duration>i&&(s"+e.startSN+" prev-sn: "+(n?n.sn:"na")+" fragments: "+o),c}return l},A.waitForCdnTuneIn=function(e){return e.live&&e.canBlockReload&&e.tuneInGoal>Math.max(e.partHoldBack,3*e.partTarget)},A.setStartPosition=function(e,t){var r=this.startPosition;if(r"+e))}}])&&E(b.prototype,_),L&&E(b,L),s}(s.default)},"./src/controller/buffer-controller.ts":function(e,t,r){"use strict";r.r(t),r.d(t,"default",(function(){return f}));var i=r("./src/polyfills/number.ts"),s=r("./src/events.ts"),n=r("./src/utils/logger.ts"),a=r("./src/errors.ts"),o=r("./src/utils/buffer-helper.ts"),l=r("./src/utils/mediasource-helper.ts"),h=r("./src/loader/fragment.ts"),u=r("./src/controller/buffer-operation-queue.ts"),c=Object(l.getMediaSource)(),d=/([ha]vc.)(?:\.[^.,]+)+/,f=function(){function e(e){var t=this;this.details=null,this._objectUrl=null,this.operationQueue=void 0,this.listeners=void 0,this.hls=void 0,this.bufferCodecEventsExpected=0,this._bufferCodecEventsTotal=0,this.media=null,this.mediaSource=null,this.appendError=0,this.tracks={},this.pendingTracks={},this.sourceBuffer=void 0,this._onMediaSourceOpen=function(){var e=t.hls,r=t.media,i=t.mediaSource;n.logger.log("[buffer-controller]: Media source opened"),r&&(t.updateMediaElementDuration(),e.trigger(s.Events.MEDIA_ATTACHED,{media:r})),i&&i.removeEventListener("sourceopen",t._onMediaSourceOpen),t.checkPendingTracks()},this._onMediaSourceClose=function(){n.logger.log("[buffer-controller]: Media source closed")},this._onMediaSourceEnded=function(){n.logger.log("[buffer-controller]: Media source ended")},this.hls=e,this._initSourceBuffer(),this.registerListeners()}var t=e.prototype;return t.hasSourceTypes=function(){return this.getSourceBufferTypes().length>0||Object.keys(this.pendingTracks).length>0},t.destroy=function(){this.unregisterListeners(),this.details=null},t.registerListeners=function(){var e=this.hls;e.on(s.Events.MEDIA_ATTACHING,this.onMediaAttaching,this),e.on(s.Events.MEDIA_DETACHING,this.onMediaDetaching,this),e.on(s.Events.MANIFEST_PARSED,this.onManifestParsed,this),e.on(s.Events.BUFFER_RESET,this.onBufferReset,this),e.on(s.Events.BUFFER_APPENDING,this.onBufferAppending,this),e.on(s.Events.BUFFER_CODECS,this.onBufferCodecs,this),e.on(s.Events.BUFFER_EOS,this.onBufferEos,this),e.on(s.Events.BUFFER_FLUSHING,this.onBufferFlushing,this),e.on(s.Events.LEVEL_UPDATED,this.onLevelUpdated,this),e.on(s.Events.FRAG_PARSED,this.onFragParsed,this),e.on(s.Events.FRAG_CHANGED,this.onFragChanged,this)},t.unregisterListeners=function(){var e=this.hls;e.off(s.Events.MEDIA_ATTACHING,this.onMediaAttaching,this),e.off(s.Events.MEDIA_DETACHING,this.onMediaDetaching,this),e.off(s.Events.MANIFEST_PARSED,this.onManifestParsed,this),e.off(s.Events.BUFFER_RESET,this.onBufferReset,this),e.off(s.Events.BUFFER_APPENDING,this.onBufferAppending,this),e.off(s.Events.BUFFER_CODECS,this.onBufferCodecs,this),e.off(s.Events.BUFFER_EOS,this.onBufferEos,this),e.off(s.Events.BUFFER_FLUSHING,this.onBufferFlushing,this),e.off(s.Events.LEVEL_UPDATED,this.onLevelUpdated,this),e.off(s.Events.FRAG_PARSED,this.onFragParsed,this),e.off(s.Events.FRAG_CHANGED,this.onFragChanged,this)},t._initSourceBuffer=function(){this.sourceBuffer={},this.operationQueue=new u.default(this.sourceBuffer),this.listeners={audio:[],video:[],audiovideo:[]}},t.onManifestParsed=function(e,t){var r=2;(t.audio&&!t.video||!t.altAudio)&&(r=1),this.bufferCodecEventsExpected=this._bufferCodecEventsTotal=r,this.details=null,n.logger.log(this.bufferCodecEventsExpected+" bufferCodec event(s) expected")},t.onMediaAttaching=function(e,t){var r=this.media=t.media;if(r&&c){var i=this.mediaSource=new c;i.addEventListener("sourceopen",this._onMediaSourceOpen),i.addEventListener("sourceended",this._onMediaSourceEnded),i.addEventListener("sourceclose",this._onMediaSourceClose),r.src=self.URL.createObjectURL(i),this._objectUrl=r.src}},t.onMediaDetaching=function(){var e=this.media,t=this.mediaSource,r=this._objectUrl;if(t){if(n.logger.log("[buffer-controller]: media source detaching"),"open"===t.readyState)try{t.endOfStream()}catch(e){n.logger.warn("[buffer-controller]: onMediaDetaching: "+e.message+" while calling endOfStream")}this.onBufferReset(),t.removeEventListener("sourceopen",this._onMediaSourceOpen),t.removeEventListener("sourceended",this._onMediaSourceEnded),t.removeEventListener("sourceclose",this._onMediaSourceClose),e&&(r&&self.URL.revokeObjectURL(r),e.src===r?(e.removeAttribute("src"),e.load()):n.logger.warn("[buffer-controller]: media.src was changed by a third party - skip cleanup")),this.mediaSource=null,this.media=null,this._objectUrl=null,this.bufferCodecEventsExpected=this._bufferCodecEventsTotal,this.pendingTracks={},this.tracks={}}this.hls.trigger(s.Events.MEDIA_DETACHED,void 0)},t.onBufferReset=function(){var e=this;this.getSourceBufferTypes().forEach((function(t){var r=e.sourceBuffer[t];try{r&&(e.removeBufferListeners(t),e.mediaSource&&e.mediaSource.removeSourceBuffer(r),e.sourceBuffer[t]=void 0)}catch(e){n.logger.warn("[buffer-controller]: Failed to reset the "+t+" buffer",e)}})),this._initSourceBuffer()},t.onBufferCodecs=function(e,t){var r=this,i=this.getSourceBufferTypes().length;Object.keys(t).forEach((function(e){if(i){var s=r.tracks[e];if(s&&"function"==typeof s.buffer.changeType){var n=t[e],a=n.codec,o=n.levelCodec,l=n.container;if((s.levelCodec||s.codec).replace(d,"$1")!==(o||a).replace(d,"$1")){var h=l+";codecs="+(o||a);r.appendChangeType(e,h)}}}else r.pendingTracks[e]=t[e]})),i||(this.bufferCodecEventsExpected=Math.max(this.bufferCodecEventsExpected-1,0),this.mediaSource&&"open"===this.mediaSource.readyState&&this.checkPendingTracks())},t.appendChangeType=function(e,t){var r=this,i=this.operationQueue,s={execute:function(){var s=r.sourceBuffer[e];s&&(n.logger.log("[buffer-controller]: changing "+e+" sourceBuffer type to "+t),s.changeType(t)),i.shiftAndExecuteNext(e)},onStart:function(){},onComplete:function(){},onError:function(t){n.logger.warn("[buffer-controller]: Failed to change "+e+" SourceBuffer type",t)}};i.append(s,e)},t.onBufferAppending=function(e,t){var r=this,i=this.hls,l=this.operationQueue,h=this.tracks,u=t.data,c=t.type,d=t.frag,f=t.part,g=t.chunkMeta,p=g.buffering[c],v=self.performance.now();p.start=v;var m=d.stats.buffering,y=f?f.stats.buffering:null;0===m.start&&(m.start=v),y&&0===y.start&&(y.start=v);var E=h.audio,S="audio"===c&&1===g.id&&"audio/mpeg"===(null==E?void 0:E.container),T={execute:function(){if(p.executeStart=self.performance.now(),S){var e=r.sourceBuffer[c];if(e){var t=d.start-e.timestampOffset;Math.abs(t)>=.1&&(n.logger.log("[buffer-controller]: Updating audio SourceBuffer timestampOffset to "+d.start+" (delta: "+t+") sn: "+d.sn+")"),e.timestampOffset=d.start)}}r.appendExecutor(u,c)},onStart:function(){},onComplete:function(){var e=self.performance.now();p.executeEnd=p.end=e,0===m.first&&(m.first=e),y&&0===y.first&&(y.first=e);var t=r.sourceBuffer,i={};for(var n in t)i[n]=o.BufferHelper.getBuffered(t[n]);r.appendError=0,r.hls.trigger(s.Events.BUFFER_APPENDED,{type:c,frag:d,part:f,chunkMeta:g,parent:d.type,timeRanges:i})},onError:function(e){n.logger.error("[buffer-controller]: Error encountered while trying to append to the "+c+" SourceBuffer",e);var t={type:a.ErrorTypes.MEDIA_ERROR,parent:d.type,details:a.ErrorDetails.BUFFER_APPEND_ERROR,err:e,fatal:!1};e.code===DOMException.QUOTA_EXCEEDED_ERR?t.details=a.ErrorDetails.BUFFER_FULL_ERROR:(r.appendError++,t.details=a.ErrorDetails.BUFFER_APPEND_ERROR,r.appendError>i.config.appendErrorMaxRetry&&(n.logger.error("[buffer-controller]: Failed "+i.config.appendErrorMaxRetry+" times to append segment in sourceBuffer"),t.fatal=!0)),i.trigger(s.Events.ERROR,t)}};l.append(T,c)},t.onBufferFlushing=function(e,t){var r=this,i=this.operationQueue,a=function(e){return{execute:r.removeExecutor.bind(r,e,t.startOffset,t.endOffset),onStart:function(){},onComplete:function(){r.hls.trigger(s.Events.BUFFER_FLUSHED,{type:e})},onError:function(t){n.logger.warn("[buffer-controller]: Failed to remove from "+e+" SourceBuffer",t)}}};t.type?i.append(a(t.type),t.type):this.getSourceBufferTypes().forEach((function(e){i.append(a(e),e)}))},t.onFragParsed=function(e,t){var r=this,i=t.frag,a=t.part,o=[],l=a?a.elementaryStreams:i.elementaryStreams;l[h.ElementaryStreamTypes.AUDIOVIDEO]?o.push("audiovideo"):(l[h.ElementaryStreamTypes.AUDIO]&&o.push("audio"),l[h.ElementaryStreamTypes.VIDEO]&&o.push("video")),0===o.length&&n.logger.warn("Fragments must have at least one ElementaryStreamType set. type: "+i.type+" level: "+i.level+" sn: "+i.sn),this.blockBuffers((function(){var e=self.performance.now();i.stats.buffering.end=e,a&&(a.stats.buffering.end=e);var t=a?a.stats:i.stats;r.hls.trigger(s.Events.FRAG_BUFFERED,{frag:i,part:a,stats:t,id:i.type})}),o)},t.onFragChanged=function(e,t){this.flushBackBuffer()},t.onBufferEos=function(e,t){var r=this;this.getSourceBufferTypes().reduce((function(e,i){var s=r.sourceBuffer[i];return t.type&&t.type!==i||s&&!s.ended&&(s.ended=!0,n.logger.log("[buffer-controller]: "+i+" sourceBuffer now EOS")),e&&!(s&&!s.ended)}),!0)&&this.blockBuffers((function(){var e=r.mediaSource;e&&"open"===e.readyState&&e.endOfStream()}))},t.onLevelUpdated=function(e,t){var r=t.details;r.fragments.length&&(this.details=r,this.getSourceBufferTypes().length?this.blockBuffers(this.updateMediaElementDuration.bind(this)):this.updateMediaElementDuration())},t.flushBackBuffer=function(){var e=this.hls,t=this.details,r=this.media,n=this.sourceBuffer;if(r&&null!==t){var a=this.getSourceBufferTypes();if(a.length){var l=t.live&&null!==e.config.liveBackBufferLength?e.config.liveBackBufferLength:e.config.backBufferLength;if(Object(i.isFiniteNumber)(l)&&!(l<0)){var h=r.currentTime,u=t.levelTargetDuration,c=Math.max(l,u),d=Math.floor(h/u)*u-c;a.forEach((function(r){var i=n[r];if(i){var a=o.BufferHelper.getBuffered(i);a.length>0&&d>a.start(0)&&(e.trigger(s.Events.BACK_BUFFER_REACHED,{bufferEnd:d}),t.live&&e.trigger(s.Events.LIVE_BACK_BUFFER_REACHED,{bufferEnd:d}),e.trigger(s.Events.BUFFER_FLUSHING,{startOffset:0,endOffset:d,type:r}))}}))}}}},t.updateMediaElementDuration=function(){if(this.details&&this.media&&this.mediaSource&&"open"===this.mediaSource.readyState){var e=this.details,t=this.hls,r=this.media,s=this.mediaSource,a=e.fragments[0].start+e.totalduration,o=r.duration,l=Object(i.isFiniteNumber)(s.duration)?s.duration:0;e.live&&t.config.liveDurationInfinity?(n.logger.log("[buffer-controller]: Media Source duration is set to Infinity"),s.duration=1/0,this.updateSeekableRange(e)):(a>l&&a>o||!Object(i.isFiniteNumber)(o))&&(n.logger.log("[buffer-controller]: Updating Media Source duration to "+a.toFixed(3)),s.duration=a)}},t.updateSeekableRange=function(e){var t=this.mediaSource,r=e.fragments;if(r.length&&e.live&&null!=t&&t.setLiveSeekableRange){var i=Math.max(0,r[0].start),s=Math.max(i,i+e.totalduration);t.setLiveSeekableRange(i,s)}},t.checkPendingTracks=function(){var e=this.bufferCodecEventsExpected,t=this.operationQueue,r=this.pendingTracks,i=Object.keys(r).length;if(i&&!e||2===i){this.createSourceBuffers(r),this.pendingTracks={};var n=this.getSourceBufferTypes();if(0===n.length)return void this.hls.trigger(s.Events.ERROR,{type:a.ErrorTypes.MEDIA_ERROR,details:a.ErrorDetails.BUFFER_INCOMPATIBLE_CODECS_ERROR,fatal:!0,reason:"could not create source buffer for media codec(s)"});n.forEach((function(e){t.executeNext(e)}))}},t.createSourceBuffers=function(e){var t=this.sourceBuffer,r=this.mediaSource;if(!r)throw Error("createSourceBuffers called when mediaSource was null");var i=0;for(var o in e)if(!t[o]){var l=e[o];if(!l)throw Error("source buffer exists for track "+o+", however track does not");var h=l.levelCodec||l.codec,u=l.container+";codecs="+h;n.logger.log("[buffer-controller]: creating sourceBuffer("+u+")");try{var c=t[o]=r.addSourceBuffer(u),d=o;this.addBufferListener(d,"updatestart",this._onSBUpdateStart),this.addBufferListener(d,"updateend",this._onSBUpdateEnd),this.addBufferListener(d,"error",this._onSBUpdateError),this.tracks[o]={buffer:c,codec:h,container:l.container,levelCodec:l.levelCodec,id:l.id},i++}catch(e){n.logger.error("[buffer-controller]: error while trying to add sourceBuffer: "+e.message),this.hls.trigger(s.Events.ERROR,{type:a.ErrorTypes.MEDIA_ERROR,details:a.ErrorDetails.BUFFER_ADD_CODEC_ERROR,fatal:!1,error:e,mimeType:u})}}i&&this.hls.trigger(s.Events.BUFFER_CREATED,{tracks:this.tracks})},t._onSBUpdateStart=function(e){this.operationQueue.current(e).onStart()},t._onSBUpdateEnd=function(e){var t=this.operationQueue;t.current(e).onComplete(),t.shiftAndExecuteNext(e)},t._onSBUpdateError=function(e,t){n.logger.error("[buffer-controller]: "+e+" SourceBuffer error",t),this.hls.trigger(s.Events.ERROR,{type:a.ErrorTypes.MEDIA_ERROR,details:a.ErrorDetails.BUFFER_APPENDING_ERROR,fatal:!1});var r=this.operationQueue.current(e);r&&r.onError(t)},t.removeExecutor=function(e,t,r){var s=this.media,a=this.mediaSource,o=this.operationQueue,l=this.sourceBuffer[e];if(!s||!a||!l)return n.logger.warn("[buffer-controller]: Attempting to remove from the "+e+" SourceBuffer, but it does not exist"),void o.shiftAndExecuteNext(e);var h=Object(i.isFiniteNumber)(s.duration)?s.duration:1/0,u=Object(i.isFiniteNumber)(a.duration)?a.duration:1/0,c=Math.max(0,t),d=Math.min(r,h,u);d>c?(n.logger.log("[buffer-controller]: Removing ["+c+","+d+"] from the "+e+" SourceBuffer"),console.assert(!l.updating,e+" sourceBuffer must not be updating"),l.remove(c,d)):o.shiftAndExecuteNext(e)},t.appendExecutor=function(e,t){var r=this.operationQueue,i=this.sourceBuffer[t];if(!i)return n.logger.warn("[buffer-controller]: Attempting to append to the "+t+" SourceBuffer, but it does not exist"),void r.shiftAndExecuteNext(t);i.ended=!1,console.assert(!i.updating,t+" sourceBuffer must not be updating"),i.appendBuffer(e)},t.blockBuffers=function(e,t){var r=this;if(void 0===t&&(t=this.getSourceBufferTypes()),!t.length)return n.logger.log("[buffer-controller]: Blocking operation requested, but no SourceBuffers exist"),void Promise.resolve(e);var i=this.operationQueue,s=t.map((function(e){return i.appendBlocker(e)}));Promise.all(s).then((function(){e(),t.forEach((function(e){var t=r.sourceBuffer[e];t&&t.updating||i.shiftAndExecuteNext(e)}))}))},t.getSourceBufferTypes=function(){return Object.keys(this.sourceBuffer)},t.addBufferListener=function(e,t,r){var i=this.sourceBuffer[e];if(i){var s=r.bind(this,e);this.listeners[e].push({event:t,listener:s}),i.addEventListener(t,s)}},t.removeBufferListeners=function(e){var t=this.sourceBuffer[e];t&&this.listeners[e].forEach((function(e){t.removeEventListener(e.event,e.listener)}))},e}()},"./src/controller/buffer-operation-queue.ts":function(e,t,r){"use strict";r.r(t),r.d(t,"default",(function(){return s}));var i=r("./src/utils/logger.ts"),s=function(){function e(e){this.buffers=void 0,this.queues={video:[],audio:[],audiovideo:[]},this.buffers=e}var t=e.prototype;return t.append=function(e,t){var r=this.queues[t];r.push(e),1===r.length&&this.buffers[t]&&this.executeNext(t)},t.insertAbort=function(e,t){this.queues[t].unshift(e),this.executeNext(t)},t.appendBlocker=function(e){var t,r=new Promise((function(e){t=e})),i={execute:t,onStart:function(){},onComplete:function(){},onError:function(){}};return this.append(i,e),r},t.executeNext=function(e){var t=this.buffers,r=this.queues,s=t[e],n=r[e];if(n.length){var a=n[0];try{a.execute()}catch(t){i.logger.warn("[buffer-operation-queue]: Unhandled exception executing the current operation"),a.onError(t),s&&s.updating||(n.shift(),this.executeNext(e))}}},t.shiftAndExecuteNext=function(e){this.queues[e].shift(),this.executeNext(e)},t.current=function(e){return this.queues[e][0]},e}()},"./src/controller/cap-level-controller.ts":function(e,t,r){"use strict";r.r(t);var i=r("./src/events.ts");function s(e,t){for(var r=0;r0&&this.mediaWidth>0){var e=this.hls.levels;if(e.length){var t=this.hls;t.autoLevelCapping=this.getMaxLevel(e.length-1),t.autoLevelCapping>this.autoLevelCapping&&this.streamController&&this.streamController.nextLevelSwitch(),this.autoLevelCapping=t.autoLevelCapping}}},a.getMaxLevel=function(t){var r=this,i=this.hls.levels;if(!i.length)return-1;var s=i.filter((function(i,s){return e.isLevelAllowed(s,r.restrictedLevels)&&s<=t}));return this.clientRect=null,e.getMaxLevelByMediaSize(s,this.mediaWidth,this.mediaHeight)},a.startCapping=function(){this.timer||(this.autoLevelCapping=Number.POSITIVE_INFINITY,this.hls.firstLevel=this.getMaxLevel(this.firstLevel),self.clearInterval(this.timer),this.timer=self.setInterval(this.detectPlayerSize.bind(this),1e3),this.detectPlayerSize())},a.stopCapping=function(){this.restrictedLevels=[],this.firstLevel=-1,this.autoLevelCapping=Number.POSITIVE_INFINITY,this.timer&&(self.clearInterval(this.timer),this.timer=void 0)},a.getDimensions=function(){if(this.clientRect)return this.clientRect;var e=this.media,t={width:0,height:0};if(e){var r=e.getBoundingClientRect();t.width=r.width,t.height=r.height,t.width||t.height||(t.width=r.right-r.left||e.width||0,t.height=r.bottom-r.top||e.height||0)}return this.clientRect=t,t},e.isLevelAllowed=function(e,t){return void 0===t&&(t=[]),-1===t.indexOf(e)},e.getMaxLevelByMediaSize=function(e,t,r){if(!e||!e.length)return-1;for(var i,s,n=e.length-1,a=0;a=t||o.height>=r)&&(i=o,!(s=e[a+1])||i.width!==s.width||i.height!==s.height)){n=a;break}}return n},t=e,n=[{key:"contentScaleFactor",get:function(){var e=1;try{e=self.devicePixelRatio}catch(e){}return e}}],(r=[{key:"mediaWidth",get:function(){return this.getDimensions().width*e.contentScaleFactor}},{key:"mediaHeight",get:function(){return this.getDimensions().height*e.contentScaleFactor}}])&&s(t.prototype,r),n&&s(t,n),e}();t.default=n},"./src/controller/cmcd-controller.ts":function(e,t,r){"use strict";r.r(t),r.d(t,"default",(function(){return d}));var i=r("./src/events.ts"),s=r("./src/types/cmcd.ts"),n=r("./src/utils/buffer-helper.ts"),a=r("./src/utils/logger.ts");function o(e,t){for(var r=0;r=e.length?{done:!0}:{done:!1,value:e[i++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,i=new Array(t);r-1?n+1:i.levels.length;t=i.levels.slice(0,a)}for(var o,l=h(t);!(o=l()).done;){var u=o.value;u.bitrate>r&&(r=u.bitrate)}return r>0?r:NaN},t.getBufferLength=function(e){var t=this.hls.media,r=e===s.CMCDObjectType.AUDIO?this.audioBuffer:this.videoBuffer;return r&&t?1e3*n.BufferHelper.bufferInfo(r,t.currentTime,this.config.maxBufferHole).len:NaN},t.createPlaylistLoader=function(){var e=this.config.pLoader,t=this.applyPlaylistData,r=e||this.config.loader;return function(){function e(e){this.loader=void 0,this.loader=new r(e)}var i=e.prototype;return i.destroy=function(){this.loader.destroy()},i.abort=function(){this.loader.abort()},i.load=function(e,r,i){t(e),this.loader.load(e,r,i)},l(e,[{key:"stats",get:function(){return this.loader.stats}},{key:"context",get:function(){return this.loader.context}}]),e}()},t.createFragmentLoader=function(){var e=this.config.fLoader,t=this.applyFragmentData,r=e||this.config.loader;return function(){function e(e){this.loader=void 0,this.loader=new r(e)}var i=e.prototype;return i.destroy=function(){this.loader.destroy()},i.abort=function(){this.loader.abort()},i.load=function(e,r,i){t(e),this.loader.load(e,r,i)},l(e,[{key:"stats",get:function(){return this.loader.stats}},{key:"context",get:function(){return this.loader.context}}]),e}()},e.uuid=function(){var e=URL.createObjectURL(new Blob),t=e.toString();return URL.revokeObjectURL(e),t.substr(t.lastIndexOf("/")+1)},e.serialize=function(e){for(var t,r=[],i=function(e){return!Number.isNaN(e)&&null!=e&&""!==e&&!1!==e},s=function(e){return Math.round(e)},n=function(e){return 100*s(e/100)},a={br:s,d:s,bl:n,dl:n,mtp:n,nor:function(e){return encodeURIComponent(e)},rtp:n,tb:s},o=h(Object.keys(e||{}).sort());!(t=o()).done;){var l=t.value,u=e[l];if(i(u)&&!("v"===l&&1===u||"pr"==l&&1===u)){var c=a[l];c&&(u=c(u));var d=typeof u,f=void 0;f="ot"===l||"sf"===l||"st"===l?l+"="+u:"boolean"===d?l:"number"===d?l+"="+u:l+"="+JSON.stringify(u),r.push(f)}}return r.join(",")},e.toHeaders=function(t){for(var r={},i=["Object","Request","Session","Status"],s=[{},{},{},{}],n={br:0,d:0,ot:0,tb:0,bl:1,dl:1,mtp:1,nor:1,nrr:1,su:1,cid:2,pr:2,sf:2,sid:2,st:2,v:2,bs:3,rtp:3},a=0,o=Object.keys(t);a3)return void this.hls.trigger(i.Events.ERROR,{type:s.ErrorTypes.KEY_SYSTEM_ERROR,details:s.ErrorDetails.KEY_SYSTEM_LICENSE_REQUEST_FAILED,fatal:!0});var h=3-this._requestLicenseFailureCount+1;n.logger.warn("Retrying license request, "+h+" attempts left"),this._requestLicense(r,a)}},h._generateLicenseRequestChallenge=function(e,t){if(e.mediaKeySystemDomain===a.KeySystems.WIDEVINE)return t;throw new Error("unsupported key-system: "+e.mediaKeySystemDomain)},h._requestLicense=function(e,t){n.logger.log("Requesting content license for key-system");var r=this._mediaKeysList[0];if(!r)return n.logger.error("Fatal error: Media is encrypted but no key-system access has been obtained yet"),void this.hls.trigger(i.Events.ERROR,{type:s.ErrorTypes.KEY_SYSTEM_ERROR,details:s.ErrorDetails.KEY_SYSTEM_NO_ACCESS,fatal:!0});try{var a=this.getLicenseServerUrl(r.mediaKeySystemDomain),o=this._createLicenseXhr(a,e,t);n.logger.log("Sending license request to URL: "+a);var l=this._generateLicenseRequestChallenge(r,e);o.send(l)}catch(e){n.logger.error("Failure requesting DRM license: "+e),this.hls.trigger(i.Events.ERROR,{type:s.ErrorTypes.KEY_SYSTEM_ERROR,details:s.ErrorDetails.KEY_SYSTEM_LICENSE_REQUEST_FAILED,fatal:!0})}},h.onMediaAttached=function(e,t){if(this._emeEnabled){var r=t.media;this._media=r,r.addEventListener("encrypted",this._onMediaEncrypted)}},h.onMediaDetached=function(){var e=this._media,t=this._mediaKeysList;e&&(e.removeEventListener("encrypted",this._onMediaEncrypted),this._media=null,this._mediaKeysList=[],Promise.all(t.map((function(e){if(e.mediaKeysSession)return e.mediaKeysSession.close().catch((function(){}))}))).then((function(){return e.setMediaKeys(null)})).catch((function(){})))},h.onManifestParsed=function(e,t){if(this._emeEnabled){var r=t.levels.map((function(e){return e.audioCodec})).filter((function(e){return!!e})),i=t.levels.map((function(e){return e.videoCodec})).filter((function(e){return!!e}));this._attemptKeySystemAccess(a.KeySystems.WIDEVINE,r,i)}},t=e,(r=[{key:"requestMediaKeySystemAccess",get:function(){if(!this._requestMediaKeySystemAccess)throw new Error("No requestMediaKeySystemAccess function configured");return this._requestMediaKeySystemAccess}}])&&o(t.prototype,r),l&&o(t,l),e}();t.default=l},"./src/controller/fps-controller.ts":function(e,t,r){"use strict";r.r(t);var i=r("./src/events.ts"),s=r("./src/utils/logger.ts"),n=function(){function e(e){this.hls=void 0,this.isVideoPlaybackQualityAvailable=!1,this.timer=void 0,this.media=null,this.lastTime=void 0,this.lastDroppedFrames=0,this.lastDecodedFrames=0,this.streamController=void 0,this.hls=e,this.registerListeners()}var t=e.prototype;return t.setStreamController=function(e){this.streamController=e},t.registerListeners=function(){this.hls.on(i.Events.MEDIA_ATTACHING,this.onMediaAttaching,this)},t.unregisterListeners=function(){this.hls.off(i.Events.MEDIA_ATTACHING,this.onMediaAttaching)},t.destroy=function(){this.timer&&clearInterval(this.timer),this.unregisterListeners(),this.isVideoPlaybackQualityAvailable=!1,this.media=null},t.onMediaAttaching=function(e,t){var r=this.hls.config;if(r.capLevelOnFPSDrop){var i=t.media instanceof self.HTMLVideoElement?t.media:null;this.media=i,i&&"function"==typeof i.getVideoPlaybackQuality&&(this.isVideoPlaybackQualityAvailable=!0),self.clearInterval(this.timer),this.timer=self.setInterval(this.checkFPSInterval.bind(this),r.fpsDroppedMonitoringPeriod)}},t.checkFPS=function(e,t,r){var n=performance.now();if(t){if(this.lastTime){var a=n-this.lastTime,o=r-this.lastDroppedFrames,l=t-this.lastDecodedFrames,h=1e3*o/a,u=this.hls;if(u.trigger(i.Events.FPS_DROP,{currentDropped:o,currentDecoded:l,totalDroppedFrames:r}),h>0&&o>u.config.fpsDroppedMonitoringThreshold*l){var c=u.currentLevel;s.logger.warn("drop FPS ratio greater than max allowed value for currentLevel: "+c),c>0&&(-1===u.autoLevelCapping||u.autoLevelCapping>=c)&&(c-=1,u.trigger(i.Events.FPS_DROP_LEVEL_CAPPING,{level:c,droppedLevel:u.currentLevel}),u.autoLevelCapping=c,this.streamController.nextLevelSwitch())}}this.lastTime=n,this.lastDroppedFrames=r,this.lastDecodedFrames=t}},t.checkFPSInterval=function(){var e=this.media;if(e)if(this.isVideoPlaybackQualityAvailable){var t=e.getVideoPlaybackQuality();this.checkFPS(e,t.totalVideoFrames,t.droppedVideoFrames)}else this.checkFPS(e,e.webkitDecodedFrameCount,e.webkitDroppedFrameCount)},e}();t.default=n},"./src/controller/fragment-finders.ts":function(e,t,r){"use strict";r.r(t),r.d(t,"findFragmentByPDT",(function(){return n})),r.d(t,"findFragmentByPTS",(function(){return a})),r.d(t,"fragmentWithinToleranceTest",(function(){return o})),r.d(t,"pdtWithinToleranceTest",(function(){return l})),r.d(t,"findFragWithCC",(function(){return h}));var i=r("./src/polyfills/number.ts"),s=r("./src/utils/binary-search.ts");function n(e,t,r){if(null===t||!Array.isArray(e)||!e.length||!Object(i.isFiniteNumber)(t))return null;if(t<(e[0].programDateTime||0))return null;if(t>=(e[e.length-1].endProgramDateTime||0))return null;r=r||0;for(var s=0;se&&r.start?-1:0}function l(e,t,r){var i=1e3*Math.min(t,r.duration+(r.deltaPTS?r.deltaPTS:0));return(r.endProgramDateTime||0)-i>e}function h(e,t){return s.default.search(e,(function(e){return e.cct?-1:0}))}},"./src/controller/fragment-tracker.ts":function(e,t,r){"use strict";r.r(t),r.d(t,"FragmentState",(function(){return i})),r.d(t,"FragmentTracker",(function(){return a}));var i,s=r("./src/events.ts"),n=r("./src/types/loader.ts");!function(e){e.NOT_LOADED="NOT_LOADED",e.BACKTRACKED="BACKTRACKED",e.APPENDING="APPENDING",e.PARTIAL="PARTIAL",e.OK="OK"}(i||(i={}));var a=function(){function e(e){this.activeFragment=null,this.activeParts=null,this.fragments=Object.create(null),this.timeRanges=Object.create(null),this.bufferPadding=.2,this.hls=void 0,this.hls=e,this._registerListeners()}var t=e.prototype;return t._registerListeners=function(){var e=this.hls;e.on(s.Events.BUFFER_APPENDED,this.onBufferAppended,this),e.on(s.Events.FRAG_BUFFERED,this.onFragBuffered,this),e.on(s.Events.FRAG_LOADED,this.onFragLoaded,this)},t._unregisterListeners=function(){var e=this.hls;e.off(s.Events.BUFFER_APPENDED,this.onBufferAppended,this),e.off(s.Events.FRAG_BUFFERED,this.onFragBuffered,this),e.off(s.Events.FRAG_LOADED,this.onFragLoaded,this)},t.destroy=function(){this._unregisterListeners(),this.fragments=this.timeRanges=null},t.getAppendedFrag=function(e,t){if(t===n.PlaylistLevelType.MAIN){var r=this.activeFragment,i=this.activeParts;if(!r)return null;if(i)for(var s=i.length;s--;){var a=i[s],o=a?a.end:r.appendedPTS;if(a.start<=e&&void 0!==o&&e<=o)return s>9&&(this.activeParts=i.slice(s-9)),a}else if(r.start<=e&&void 0!==r.appendedPTS&&e<=r.appendedPTS)return r}return this.getBufferedFrag(e,t)},t.getBufferedFrag=function(e,t){for(var r=this.fragments,i=Object.keys(r),s=i.length;s--;){var n=r[i[s]];if((null==n?void 0:n.body.type)===t&&n.buffered){var a=n.body;if(a.start<=e&&e<=a.end)return a}}return null},t.detectEvictedFragments=function(e,t,r){var i=this;Object.keys(this.fragments).forEach((function(s){var n=i.fragments[s];if(n)if(n.buffered){var a=n.range[e];a&&a.time.some((function(e){var r=!i.isTimeBuffered(e.startPTS,e.endPTS,t);return r&&i.removeFragment(n.body),r}))}else n.body.type===r&&i.removeFragment(n.body)}))},t.detectPartialFragments=function(e){var t=this,r=this.timeRanges,i=e.frag,s=e.part;if(r&&"initSegment"!==i.sn){var n=l(i),a=this.fragments[n];a&&(Object.keys(r).forEach((function(e){var n=i.elementaryStreams[e];if(n){var o=r[e],l=null!==s||!0===n.partial;a.range[e]=t.getBufferedTimes(i,s,l,o)}})),a.backtrack=a.loaded=null,Object.keys(a.range).length?a.buffered=!0:this.removeFragment(a.body))}},t.fragBuffered=function(e){var t=l(e),r=this.fragments[t];r&&(r.backtrack=r.loaded=null,r.buffered=!0)},t.getBufferedTimes=function(e,t,r,i){for(var s={time:[],partial:r},n=t?t.start:e.start,a=t?t.end:e.end,o=e.minEndPTS||a,l=e.maxStartPTS||n,h=0;h=u&&o<=c){s.time.push({startPTS:Math.max(n,i.start(h)),endPTS:Math.min(a,i.end(h))});break}if(nu)s.partial=!0,s.time.push({startPTS:Math.max(n,i.start(h)),endPTS:Math.min(a,i.end(h))});else if(a<=u)break}return s},t.getPartialFragment=function(e){var t,r,i,s=null,n=0,a=this.bufferPadding,l=this.fragments;return Object.keys(l).forEach((function(h){var u=l[h];u&&o(u)&&(r=u.body.start-a,i=u.body.end+a,e>=r&&e<=i&&(t=Math.min(e-r,i-e),n<=t&&(s=u.body,n=t)))})),s},t.getState=function(e){var t=l(e),r=this.fragments[t];return r?r.buffered?o(r)?i.PARTIAL:i.OK:r.backtrack?i.BACKTRACKED:i.APPENDING:i.NOT_LOADED},t.backtrack=function(e,t){var r=l(e),i=this.fragments[r];if(!i||i.backtrack)return null;var s=i.backtrack=t||i.loaded;return i.loaded=null,s},t.getBacktrackData=function(e){var t=l(e),r=this.fragments[t];if(r){var i,s=r.backtrack;if(null!=s&&null!==(i=s.payload)&&void 0!==i&&i.byteLength)return s;this.removeFragment(e)}return null},t.isTimeBuffered=function(e,t,r){for(var i,s,n=0;n=i&&t<=s)return!0;if(t<=i)return!1}return!1},t.onFragLoaded=function(e,t){var r=t.frag,i=t.part;if("initSegment"!==r.sn&&!r.bitrateTest&&!i){var s=l(r);this.fragments[s]={body:r,loaded:t,backtrack:null,buffered:!1,range:Object.create(null)}}},t.onBufferAppended=function(e,t){var r=this,i=t.frag,s=t.part,a=t.timeRanges;if(i.type===n.PlaylistLevelType.MAIN)if(this.activeFragment=i,s){var o=this.activeParts;o||(this.activeParts=o=[]),o.push(s)}else this.activeParts=null;this.timeRanges=a,Object.keys(a).forEach((function(e){var t=a[e];if(r.detectEvictedFragments(e,t),!s)for(var n=0;ne&&i.removeFragment(a)}}))},t.removeFragment=function(e){var t=l(e);e.stats.loaded=0,e.clearElementaryStreamInfo(),delete this.fragments[t]},t.removeAllFragments=function(){this.fragments=Object.create(null),this.activeFragment=null,this.activeParts=null},e}();function o(e){var t,r;return e.buffered&&((null===(t=e.range.video)||void 0===t?void 0:t.partial)||(null===(r=e.range.audio)||void 0===r?void 0:r.partial))}function l(e){return e.type+"_"+e.level+"_"+e.urlId+"_"+e.sn}},"./src/controller/gap-controller.ts":function(e,t,r){"use strict";r.r(t),r.d(t,"STALL_MINIMUM_DURATION_MS",(function(){return o})),r.d(t,"MAX_START_GAP_JUMP",(function(){return l})),r.d(t,"SKIP_BUFFER_HOLE_STEP_SECONDS",(function(){return h})),r.d(t,"SKIP_BUFFER_RANGE_START",(function(){return u})),r.d(t,"default",(function(){return c}));var i=r("./src/utils/buffer-helper.ts"),s=r("./src/errors.ts"),n=r("./src/events.ts"),a=r("./src/utils/logger.ts"),o=250,l=2,h=.1,u=.05,c=function(){function e(e,t,r,i){this.config=void 0,this.media=void 0,this.fragmentTracker=void 0,this.hls=void 0,this.nudgeRetry=0,this.stallReported=!1,this.stalled=null,this.moved=!1,this.seeking=!1,this.config=e,this.media=t,this.fragmentTracker=r,this.hls=i}var t=e.prototype;return t.destroy=function(){this.hls=this.fragmentTracker=this.media=null},t.poll=function(e){var t=this.config,r=this.media,s=this.stalled,n=r.currentTime,h=r.seeking,u=this.seeking&&!h,c=!this.seeking&&h;if(this.seeking=h,n===e){if((c||u)&&(this.stalled=null),!r.paused&&!r.ended&&0!==r.playbackRate&&i.BufferHelper.getBuffered(r).length){var d=i.BufferHelper.bufferInfo(r,n,0),f=d.len>0,g=d.nextStart||0;if(f||g){if(h){var p=d.len>l,v=!g||g-n>l&&!this.fragmentTracker.getPartialFragment(n);if(p||v)return;this.moved=!1}if(!this.moved&&null!==this.stalled){var m,y=Math.max(g,d.start||0)-n,E=this.hls.levels?this.hls.levels[this.hls.currentLevel]:null,S=(null==E||null===(m=E.details)||void 0===m?void 0:m.live)?2*E.details.targetduration:l;if(y>0&&y<=S)return void this._trySkipBufferHole(null)}var T=self.performance.now();if(null!==s){var b=T-s;!h&&b>=o&&this._reportStall(d.len);var _=i.BufferHelper.bufferInfo(r,n,t.maxBufferHole);this._tryFixBufferStall(_,b)}else this.stalled=T}}}else if(this.moved=!0,null!==s){if(this.stallReported){var L=self.performance.now()-s;a.logger.warn("playback not stuck anymore @"+n+", after "+Math.round(L)+"ms"),this.stallReported=!1}this.stalled=null,this.nudgeRetry=0}},t._tryFixBufferStall=function(e,t){var r=this.config,i=this.fragmentTracker,s=this.media.currentTime,n=i.getPartialFragment(s);n&&this._trySkipBufferHole(n)||e.len>r.maxBufferHole&&t>1e3*r.highBufferWatchdogPeriod&&(a.logger.warn("Trying to nudge playhead over buffer-hole"),this.stalled=null,this._tryNudgeBuffer())},t._reportStall=function(e){var t=this.hls,r=this.media;this.stallReported||(this.stallReported=!0,a.logger.warn("Playback stalling at @"+r.currentTime+" due to low buffer (buffer="+e+")"),t.trigger(n.Events.ERROR,{type:s.ErrorTypes.MEDIA_ERROR,details:s.ErrorDetails.BUFFER_STALLED_ERROR,fatal:!1,buffer:e}))},t._trySkipBufferHole=function(e){for(var t=this.config,r=this.hls,o=this.media,l=o.currentTime,c=0,d=i.BufferHelper.getBuffered(o),f=0;f=c&&l.05&&this.forwardBufferLength>1){var h=Math.min(2,Math.max(1,n)),u=Math.round(2/(1+Math.exp(-.75*o-this.edgeStalled))*20)/20;e.playbackRate=Math.min(h,Math.max(1,u))}else 1!==e.playbackRate&&0!==e.playbackRate&&(e.playbackRate=1)}}}}},l.estimateLiveEdge=function(){var e=this.levelDetails;return null===e?null:e.edge+e.age},l.computeLatency=function(){var e=this.estimateLiveEdge();return null===e?null:e-this.currentTime},t=e,(r=[{key:"latency",get:function(){return this._latency||0}},{key:"maxLatency",get:function(){var e=this.config,t=this.levelDetails;return void 0!==e.liveMaxLatencyDuration?e.liveMaxLatencyDuration:t?e.liveMaxLatencyDurationCount*t.targetduration:0}},{key:"targetLatency",get:function(){var e=this.levelDetails;if(null===e)return null;var t=e.holdBack,r=e.partHoldBack,i=e.targetduration,s=this.config,n=s.liveSyncDuration,a=s.liveSyncDurationCount,o=s.lowLatencyMode,l=this.hls.userConfig,h=o&&r||t;(l.liveSyncDuration||l.liveSyncDurationCount||0===h)&&(h=void 0!==n?n:a*i);var u=i;return h+Math.min(1*this.stallCount,u)}},{key:"liveSyncPosition",get:function(){var e=this.estimateLiveEdge(),t=this.targetLatency,r=this.levelDetails;if(null===e||null===t||null===r)return null;var i=r.edge,s=e-t-this.edgeStalled,n=i-r.totalduration,a=i-(this.config.lowLatencyMode&&r.partTarget||r.targetduration);return Math.min(Math.max(n,s),a)}},{key:"drift",get:function(){var e=this.levelDetails;return null===e?1:e.drift}},{key:"edgeStalled",get:function(){var e=this.levelDetails;if(null===e)return 0;var t=3*(this.config.lowLatencyMode&&e.partTarget||e.targetduration);return Math.max(e.age-t,0)}},{key:"forwardBufferLength",get:function(){var e=this.media,t=this.levelDetails;if(!e||!t)return 0;var r=e.buffered.length;return r?e.buffered.end(r-1):t.edge-this.currentTime}}])&&a(t.prototype,r),o&&a(t,o),e}()},"./src/controller/level-controller.ts":function(e,t,r){"use strict";r.r(t),r.d(t,"default",(function(){return g}));var i=r("./src/types/level.ts"),s=r("./src/events.ts"),n=r("./src/errors.ts"),a=r("./src/utils/codecs.ts"),o=r("./src/controller/level-helper.ts"),l=r("./src/controller/base-playlist-controller.ts"),h=r("./src/types/loader.ts");function u(){return u=Object.assign||function(e){for(var t=1;t0){r=h[0].bitrate,h.sort((function(e,t){return e.bitrate-t.bitrate})),this._levels=h;for(var m=0;mthis.hls.config.fragLoadingMaxRetry&&(a=r.frag.level)):a=r.frag.level}break;case n.ErrorDetails.LEVEL_LOAD_ERROR:case n.ErrorDetails.LEVEL_LOAD_TIMEOUT:i&&(i.deliveryDirectives&&(l=!1),a=i.level),o=!0;break;case n.ErrorDetails.REMUX_ALLOC_ERROR:a=r.level,o=!0}void 0!==a&&this.recoverLevel(r,a,o,l)}}},m.recoverLevel=function(e,t,r,i){var s=e.details,n=this._levels[t];if(n.loadError++,r){if(!this.retryLoadingOrFail(e))return void(this.currentLevelIndex=-1);e.levelRetry=!0}if(i){var a=n.url.length;if(a>1&&n.loadError1){var i=(t.urlId+1)%r;this.warn("Switching to redundant URL-id "+i),this._levels.forEach((function(e){e.urlId=i})),this.level=e}},m.onFragLoaded=function(e,t){var r=t.frag;if(void 0!==r&&r.type===h.PlaylistLevelType.MAIN){var i=this._levels[r.level];void 0!==i&&(i.fragmentError=0,i.loadError=0)}},m.onLevelLoaded=function(e,t){var r,i,s=t.level,n=t.details,a=this._levels[s];if(!a)return this.warn("Invalid level index "+s),void(null!==(i=t.deliveryDirectives)&&void 0!==i&&i.skip&&(n.deltaUpdateFailed=!0));s===this.currentLevelIndex?(0===a.fragmentError&&(a.loadError=0,this.retryCount=0),this.playlistLoaded(s,t,a.details)):null!==(r=t.deliveryDirectives)&&void 0!==r&&r.skip&&(n.deltaUpdateFailed=!0)},m.onAudioTrackSwitched=function(e,t){var r=this.hls.levels[this.currentLevelIndex];if(r&&r.audioGroupIds){for(var i=-1,s=this.hls.audioTracks[t.id].groupId,n=0;n0){var i=r.urlId,n=r.url[i];if(e)try{n=e.addDirectives(n)}catch(e){this.warn("Could not construct new URL with HLS Delivery Directives: "+e)}this.log("Attempt loading level index "+t+(e?" at sn "+e.msn+" part "+e.part:"")+" with URL-id "+i+" "+n),this.clearTimer(),this.hls.trigger(s.Events.LEVEL_LOADING,{url:n,level:t,id:i,deliveryDirectives:e||null})}},m.removeLevel=function(e,t){var r=function(e,r){return r!==t},i=this._levels.filter((function(i,s){return s!==e||i.url.length>1&&void 0!==t&&(i.url=i.url.filter(r),i.audioGroupIds&&(i.audioGroupIds=i.audioGroupIds.filter(r)),i.textGroupIds&&(i.textGroupIds=i.textGroupIds.filter(r)),i.urlId=0,!0)})).map((function(e,t){var r=e.details;return null!=r&&r.fragments&&r.fragments.forEach((function(e){e.level=t})),e}));this._levels=i,this.hls.trigger(s.Events.LEVELS_UPDATED,{levels:i})},g=l,(p=[{key:"levels",get:function(){return 0===this._levels.length?null:this._levels}},{key:"level",get:function(){return this.currentLevelIndex},set:function(e){var t,r=this._levels;if(0!==r.length&&(this.currentLevelIndex!==e||null===(t=r[e])||void 0===t||!t.details)){if(e<0||e>=r.length){var i=e<0;if(this.hls.trigger(s.Events.ERROR,{type:n.ErrorTypes.OTHER_ERROR,details:n.ErrorDetails.LEVEL_SWITCH_ERROR,level:e,fatal:i,reason:"invalid level idx"}),i)return;e=Math.min(e,r.length-1)}this.clearTimer();var a=this.currentLevelIndex,o=r[a],l=r[e];this.log("switching to level "+e+" from "+a),this.currentLevelIndex=e;var h=u({},l,{level:e,maxBitrate:l.maxBitrate,uri:l.uri,urlId:l.urlId});delete h._urlId,this.hls.trigger(s.Events.LEVEL_SWITCHING,h);var c=l.details;if(!c||c.live){var d=this.switchParams(l.uri,null==o?void 0:o.details);this.loadPlaylist(d)}}}},{key:"manualLevel",get:function(){return this.manualLevelIndex},set:function(e){this.manualLevelIndex=e,void 0===this._startLevel&&(this._startLevel=e),-1!==e&&(this.level=e)}},{key:"firstLevel",get:function(){return this._firstLevel},set:function(e){this._firstLevel=e}},{key:"startLevel",get:function(){if(void 0===this._startLevel){var e=this.hls.config.startLevel;return void 0!==e?e:this._firstLevel}return this._startLevel},set:function(e){this._startLevel=e}},{key:"nextLoadLevel",get:function(){return-1!==this.manualLevelIndex?this.manualLevelIndex:this.hls.nextAutoLevel},set:function(e){this.level=e,-1===this.manualLevelIndex&&(this.hls.nextAutoLevel=e)}}])&&c(g.prototype,p),v&&c(g,v),l}(l.default)},"./src/controller/level-helper.ts":function(e,t,r){"use strict";r.r(t),r.d(t,"addGroupId",(function(){return n})),r.d(t,"assignTrackIdsByGroup",(function(){return a})),r.d(t,"updatePTS",(function(){return o})),r.d(t,"updateFragPTSDTS",(function(){return h})),r.d(t,"mergeDetails",(function(){return u})),r.d(t,"mapPartIntersection",(function(){return c})),r.d(t,"mapFragmentIntersection",(function(){return d})),r.d(t,"adjustSliding",(function(){return f})),r.d(t,"addSliding",(function(){return g})),r.d(t,"computeReloadInterval",(function(){return p})),r.d(t,"getFragmentWithSN",(function(){return v})),r.d(t,"getPartWith",(function(){return m}));var i=r("./src/polyfills/number.ts"),s=r("./src/utils/logger.ts");function n(e,t,r){switch(t){case"audio":e.audioGroupIds||(e.audioGroupIds=[]),e.audioGroupIds.push(r);break;case"text":e.textGroupIds||(e.textGroupIds=[]),e.textGroupIds.push(r)}}function a(e){var t={};e.forEach((function(e){var r=e.groupId||"";e.id=t[r]=t[r]||0,t[r]++}))}function o(e,t,r){l(e[t],e[r])}function l(e,t){var r=t.startPTS;if(Object(i.isFiniteNumber)(r)){var s,n=0;t.sn>e.sn?(n=r-e.start,s=e):(n=e.start-r,s=t),s.duration!==n&&(s.duration=n)}else t.sn>e.sn?e.cc===t.cc&&e.minEndPTS?t.start=e.start+(e.minEndPTS-e.start):t.start=e.start+e.duration:t.start=Math.max(e.start-t.duration,0)}function h(e,t,r,n,a,o){n-r<=0&&(s.logger.warn("Fragment should have a positive duration",t),n=r+t.duration,o=a+t.duration);var h=r,u=n,c=t.startPTS,d=t.endPTS;if(Object(i.isFiniteNumber)(c)){var f=Math.abs(c-r);Object(i.isFiniteNumber)(t.deltaPTS)?t.deltaPTS=Math.max(f,t.deltaPTS):t.deltaPTS=f,h=Math.max(r,c),r=Math.min(r,c),a=Math.min(a,t.startDTS),u=Math.min(n,d),n=Math.max(n,d),o=Math.max(o,t.endDTS)}t.duration=n-r;var g=r-t.start;t.appendedPTS=n,t.start=t.startPTS=r,t.maxStartPTS=h,t.startDTS=a,t.endPTS=n,t.minEndPTS=u,t.endDTS=o;var p,v=t.sn;if(!e||ve.endSN)return 0;var m=v-e.startSN,y=e.fragments;for(y[m]=t,p=m;p>0;p--)l(y[p],y[p-1]);for(p=m;p=0;a--){var o=n[a].initSegment;if(o){r=o;break}}e.fragmentHint&&delete e.fragmentHint.endPTS;var l,u=0;if(d(e,t,(function(e,s){e.relurl&&(u=e.cc-s.cc),Object(i.isFiniteNumber)(e.startPTS)&&Object(i.isFiniteNumber)(e.endPTS)&&(s.start=s.startPTS=e.startPTS,s.startDTS=e.startDTS,s.appendedPTS=e.appendedPTS,s.maxStartPTS=e.maxStartPTS,s.endPTS=e.endPTS,s.endDTS=e.endDTS,s.minEndPTS=e.minEndPTS,s.duration=e.endPTS-e.startPTS,s.duration&&(l=s),t.PTSKnown=t.alignedSliding=!0),s.elementaryStreams=e.elementaryStreams,s.loader=e.loader,s.stats=e.stats,s.urlId=e.urlId,e.initSegment&&(s.initSegment=e.initSegment,r=e.initSegment)})),r&&(t.fragmentHint?t.fragments.concat(t.fragmentHint):t.fragments).forEach((function(e){var t;e.initSegment&&e.initSegment.relurl!==(null===(t=r)||void 0===t?void 0:t.relurl)||(e.initSegment=r)})),t.skippedSegments&&(t.deltaUpdateFailed=t.fragments.some((function(e){return!e})),t.deltaUpdateFailed)){s.logger.warn("[level-helper] Previous playlist missing segments skipped in delta playlist");for(var g=t.skippedSegments;g--;)t.fragments.shift();t.startSN=t.fragments[0].sn,t.startCC=t.fragments[0].cc}var p=t.fragments;if(u){s.logger.warn("discontinuity sliding from playlist, take drift into account");for(var v=0;v=i.length||g(t,i[r].start)}function g(e,t){if(t){for(var r=e.fragments,i=e.skippedSegments;i0&&n<3*i,o=t.loading.end-t.loading.start,l=e.availabilityDelay;if(!1===e.updated)if(a){var h=333*e.misses;r=Math.max(Math.min(s,2*o),h),e.availabilityDelay=(e.availabilityDelay||0)+r}else r=s;else a?(l=Math.min(l||i/2,n),e.availabilityDelay=l,r=l+i-n):r=i-o;return Math.round(r)}function v(e,t,r){if(!e||!e.details)return null;var i=e.details,s=i.fragments[t-i.startSN];return s||((s=i.fragmentHint)&&s.sn===t?s:t0&&-1===e&&(this.log("Override startPosition with lastCurrentTime @"+t.toFixed(3)),e=t),this.state=s.State.IDLE,this.nextLoadPosition=this.startPosition=this.lastCurrentTime=e,this.tick()}else this._forceStartLoad=!0,this.state=s.State.STOPPED},b.stopLoad=function(){this._forceStartLoad=!1,e.prototype.stopLoad.call(this)},b.doTick=function(){switch(this.state){case s.State.IDLE:this.doTickIdle();break;case s.State.WAITING_LEVEL:var e,t=this.levels,r=this.level,i=null==t||null===(e=t[r])||void 0===e?void 0:e.details;if(i&&(!i.live||this.levelLastLoaded===this.level)){if(this.waitForCdnTuneIn(i))break;this.state=s.State.IDLE;break}break;case s.State.FRAG_LOADING_WAITING_RETRY:var n,a=self.performance.now(),o=this.retryDate;(!o||a>=o||null!==(n=this.media)&&void 0!==n&&n.seeking)&&(this.log("retryDate reached, switch back to IDLE state"),this.state=s.State.IDLE)}this.onTickEnd()},b.onTickEnd=function(){e.prototype.onTickEnd.call(this),this.checkBuffer(),this.checkFragmentChanged()},b.doTickIdle=function(){var e,t,r=this.hls,i=this.levelLastLoaded,n=this.levels,o=this.media,c=r.config,d=r.nextLoadLevel;if(null!==i&&(o||!this.startFragRequested&&c.startFragPrefetch)&&(!this.altAudio||!this.audioOnly)&&n&&n[d]){var f=n[d];this.level=r.nextLoadLevel=d;var g=f.details;if(!g||this.state===s.State.WAITING_LEVEL||g.live&&this.levelLastLoaded!==d)this.state=s.State.WAITING_LEVEL;else{var p=this.getFwdBufferInfo(this.mediaBuffer?this.mediaBuffer:o,h.PlaylistLevelType.MAIN);if(null!==p&&!(p.len>=this.getMaxBufferLength(f.maxBitrate))){if(this._streamEnded(p,g)){var v={};return this.altAudio&&(v.type="video"),this.hls.trigger(a.Events.BUFFER_EOS,v),void(this.state=s.State.ENDED)}var m=p.end,y=this.getNextFragment(m,g);if(this.couldBacktrack&&!this.fragPrevious&&y&&"initSegment"!==y.sn){var E=y.sn-g.startSN;E>1&&(y=g.fragments[E-1],this.fragmentTracker.removeFragment(y))}if(y&&this.fragmentTracker.getState(y)===l.FragmentState.OK&&this.nextLoadPosition>m){var S=this.audioOnly&&!this.altAudio?u.ElementaryStreamTypes.AUDIO:u.ElementaryStreamTypes.VIDEO;this.afterBufferFlushed(o,S,h.PlaylistLevelType.MAIN),y=this.getNextFragment(this.nextLoadPosition,g)}y&&(!y.initSegment||y.initSegment.data||this.bitrateTest||(y=y.initSegment),"identity"!==(null===(e=y.decryptdata)||void 0===e?void 0:e.keyFormat)||null!==(t=y.decryptdata)&&void 0!==t&&t.key?this.loadFragment(y,g,m):this.loadKey(y,g))}}}},b.loadFragment=function(t,r,i){var s,n=this.fragmentTracker.getState(t);if(this.fragCurrent=t,n===l.FragmentState.BACKTRACKED){var a=this.fragmentTracker.getBacktrackData(t);if(a)return this._handleFragmentLoadProgress(a),void this._handleFragmentLoadComplete(a);n=l.FragmentState.NOT_LOADED}n===l.FragmentState.NOT_LOADED||n===l.FragmentState.PARTIAL?"initSegment"===t.sn?this._loadInitSegment(t):this.bitrateTest?(t.bitrateTest=!0,this.log("Fragment "+t.sn+" of level "+t.level+" is being downloaded to test bitrate and will not be buffered"),this._loadBitrateTestFrag(t)):(this.startFragRequested=!0,e.prototype.loadFragment.call(this,t,r,i)):n===l.FragmentState.APPENDING?this.reduceMaxBufferLength(t.duration)&&this.fragmentTracker.removeFragment(t):0===(null===(s=this.media)||void 0===s?void 0:s.buffered.length)&&this.fragmentTracker.removeAllFragments()},b.getAppendedFrag=function(e){var t=this.fragmentTracker.getAppendedFrag(e,h.PlaylistLevelType.MAIN);return t&&"fragment"in t?t.fragment:t},b.getBufferedFrag=function(e){return this.fragmentTracker.getBufferedFrag(e,h.PlaylistLevelType.MAIN)},b.followingBufferedFrag=function(e){return e?this.getBufferedFrag(e.end+.5):null},b.immediateLevelSwitch=function(){this.abortCurrentFrag(),this.flushMainBuffer(0,Number.POSITIVE_INFINITY)},b.nextLevelSwitch=function(){var e=this.levels,t=this.media;if(null!=t&&t.readyState){var r,i=this.getAppendedFrag(t.currentTime);if(i&&i.start>1&&this.flushMainBuffer(0,i.start-1),!t.paused&&e){var s=e[this.hls.nextLoadLevel],n=this.fragLastKbps;r=n&&this.fragCurrent?this.fragCurrent.duration*s.maxBitrate/(1e3*n)+1:0}else r=0;var a=this.getBufferedFrag(t.currentTime+r);if(a){var o=this.followingBufferedFrag(a);if(o){this.abortCurrentFrag();var l=o.maxStartPTS?o.maxStartPTS:o.start,h=o.duration,u=Math.max(a.end,l+Math.min(Math.max(h-this.config.maxFragLookUpTolerance,.5*h),.75*h));this.flushMainBuffer(u,Number.POSITIVE_INFINITY)}}}},b.abortCurrentFrag=function(){var e=this.fragCurrent;this.fragCurrent=null,null!=e&&e.loader&&e.loader.abort(),this.state===s.State.KEY_LOADING&&(this.state=s.State.IDLE),this.nextLoadPosition=this.getLoadPosition()},b.flushMainBuffer=function(t,r){e.prototype.flushMainBuffer.call(this,t,r,this.altAudio?"video":null)},b.onMediaAttached=function(t,r){e.prototype.onMediaAttached.call(this,t,r);var i=r.media;this.onvplaying=this.onMediaPlaying.bind(this),this.onvseeked=this.onMediaSeeked.bind(this),i.addEventListener("playing",this.onvplaying),i.addEventListener("seeked",this.onvseeked),this.gapController=new f.default(this.config,i,this.fragmentTracker,this.hls)},b.onMediaDetaching=function(){var t=this.media;t&&(t.removeEventListener("playing",this.onvplaying),t.removeEventListener("seeked",this.onvseeked),this.onvplaying=this.onvseeked=null,this.videoBuffer=null),this.fragPlaying=null,this.gapController&&(this.gapController.destroy(),this.gapController=null),e.prototype.onMediaDetaching.call(this)},b.onMediaPlaying=function(){this.tick()},b.onMediaSeeked=function(){var e=this.media,t=e?e.currentTime:null;Object(i.isFiniteNumber)(t)&&this.log("Media seeked to "+t.toFixed(3)),this.tick()},b.onManifestLoading=function(){this.log("Trigger BUFFER_RESET"),this.hls.trigger(a.Events.BUFFER_RESET,void 0),this.fragmentTracker.removeAllFragments(),this.couldBacktrack=this.stalled=!1,this.startPosition=this.lastCurrentTime=0,this.fragPlaying=null},b.onManifestParsed=function(e,t){var r,i=!1,s=!1;t.levels.forEach((function(e){(r=e.audioCodec)&&(-1!==r.indexOf("mp4a.40.2")&&(i=!0),-1!==r.indexOf("mp4a.40.5")&&(s=!0))})),this.audioCodecSwitch=i&&s&&!Object(n.changeTypeSupported)(),this.audioCodecSwitch&&this.log("Both AAC/HE-AAC audio found in levels; declaring level codec as HE-AAC"),this.levels=t.levels,this.startFragRequested=!1},b.onLevelLoading=function(e,t){var r=this.levels;if(r&&this.state===s.State.IDLE){var i=r[t.level];(!i.details||i.details.live&&this.levelLastLoaded!==t.level||this.waitForCdnTuneIn(i.details))&&(this.state=s.State.WAITING_LEVEL)}},b.onLevelLoaded=function(e,t){var r,i=this.levels,n=t.level,o=t.details,l=o.totalduration;if(i){this.log("Level "+n+" loaded ["+o.startSN+","+o.endSN+"], cc ["+o.startCC+", "+o.endCC+"] duration:"+l);var h=this.fragCurrent;!h||this.state!==s.State.FRAG_LOADING&&this.state!==s.State.FRAG_LOADING_WAITING_RETRY||h.level!==t.level&&h.loader&&(this.state=s.State.IDLE,h.loader.abort());var u=i[n],c=0;if(o.live||null!==(r=u.details)&&void 0!==r&&r.live){if(o.fragments[0]||(o.deltaUpdateFailed=!0),o.deltaUpdateFailed)return;c=this.alignPlaylists(o,u.details)}if(u.details=o,this.levelLastLoaded=n,this.hls.trigger(a.Events.LEVEL_UPDATED,{details:o,level:n}),this.state===s.State.WAITING_LEVEL){if(this.waitForCdnTuneIn(o))return;this.state=s.State.IDLE}this.startFragRequested?o.live&&this.synchronizeToLiveEdge(o):this.setStartPosition(o,c),this.tick()}else this.warn("Levels were reset while loading level "+n)},b._handleFragmentLoadProgress=function(e){var t,r=e.frag,i=e.part,s=e.payload,n=this.levels;if(n){var a=n[r.level],o=a.details;if(o){var l=a.videoCodec,u=o.PTSKnown||!o.live,f=null===(t=r.initSegment)||void 0===t?void 0:t.data,g=this._getAudioCodec(a),p=this.transmuxer=this.transmuxer||new c.default(this.hls,h.PlaylistLevelType.MAIN,this._handleTransmuxComplete.bind(this),this._handleTransmuxerFlush.bind(this)),v=i?i.index:-1,m=-1!==v,y=new d.ChunkMetadata(r.level,r.sn,r.stats.chunkCount,s.byteLength,v,m),E=this.initPTS[r.cc];p.push(s,f,g,l,r,i,o.totalduration,u,y,E)}else this.warn("Dropping fragment "+r.sn+" of level "+r.level+" after level details were reset")}else this.warn("Levels were reset while fragment load was in progress. Fragment "+r.sn+" of level "+r.level+" will not be buffered")},b.onAudioTrackSwitching=function(e,t){var r=this.altAudio,i=!!t.url,s=t.id;if(!i){if(this.mediaBuffer!==this.media){this.log("Switching on main audio, use media.buffered to schedule main fragment loading"),this.mediaBuffer=this.media;var n=this.fragCurrent;null!=n&&n.loader&&(this.log("Switching to main audio track, cancel main fragment load"),n.loader.abort()),this.resetTransmuxer(),this.resetLoadingState()}else this.audioOnly&&this.resetTransmuxer();var o=this.hls;r&&o.trigger(a.Events.BUFFER_FLUSHING,{startOffset:0,endOffset:Number.POSITIVE_INFINITY,type:"audio"}),o.trigger(a.Events.AUDIO_TRACK_SWITCHED,{id:s})}},b.onAudioTrackSwitched=function(e,t){var r=t.id,i=!!this.hls.audioTracks[r].url;if(i){var s=this.videoBuffer;s&&this.mediaBuffer!==s&&(this.log("Switching on alternate audio, use video.buffered to schedule main fragment loading"),this.mediaBuffer=s)}this.altAudio=i,this.tick()},b.onBufferCreated=function(e,t){var r,i,s=t.tracks,n=!1;for(var a in s){var o=s[a];if("main"===o.id){if(i=a,r=o,"video"===a){var l=s[a];l&&(this.videoBuffer=l.buffer)}}else n=!0}n&&r?(this.log("Alternate track found, use "+i+".buffered to schedule main fragment loading"),this.mediaBuffer=r.buffer):this.mediaBuffer=this.media},b.onFragBuffered=function(e,t){var r=t.frag,i=t.part;if(!r||r.type===h.PlaylistLevelType.MAIN){if(this.fragContextChanged(r))return this.warn("Fragment "+r.sn+(i?" p: "+i.index:"")+" of level "+r.level+" finished buffering, but was aborted. state: "+this.state),void(this.state===s.State.PARSED&&(this.state=s.State.IDLE));var n=i?i.stats:r.stats;this.fragLastKbps=Math.round(8*n.total/(n.buffering.end-n.loading.first)),"initSegment"!==r.sn&&(this.fragPrevious=r),this.fragBufferedComplete(r,i)}},b.onError=function(e,t){switch(t.details){case g.ErrorDetails.FRAG_LOAD_ERROR:case g.ErrorDetails.FRAG_LOAD_TIMEOUT:case g.ErrorDetails.KEY_LOAD_ERROR:case g.ErrorDetails.KEY_LOAD_TIMEOUT:this.onFragmentOrKeyLoadError(h.PlaylistLevelType.MAIN,t);break;case g.ErrorDetails.LEVEL_LOAD_ERROR:case g.ErrorDetails.LEVEL_LOAD_TIMEOUT:this.state!==s.State.ERROR&&(t.fatal?(this.warn(""+t.details),this.state=s.State.ERROR):t.levelRetry||this.state!==s.State.WAITING_LEVEL||(this.state=s.State.IDLE));break;case g.ErrorDetails.BUFFER_FULL_ERROR:if("main"===t.parent&&(this.state===s.State.PARSING||this.state===s.State.PARSED)){var r=!0,i=this.getFwdBufferInfo(this.media,h.PlaylistLevelType.MAIN);i&&i.len>.5&&(r=!this.reduceMaxBufferLength(i.len)),r&&(this.warn("buffer full error also media.currentTime is not buffered, flush main"),this.immediateLevelSwitch()),this.resetLoadingState()}}},b.checkBuffer=function(){var e=this.media,t=this.gapController;if(e&&t&&e.readyState){var r=o.BufferHelper.getBuffered(e);!this.loadedmetadata&&r.length?(this.loadedmetadata=!0,this.seekToStartPos()):t.poll(this.lastCurrentTime),this.lastCurrentTime=e.currentTime}},b.onFragLoadEmergencyAborted=function(){this.state=s.State.IDLE,this.loadedmetadata||(this.startFragRequested=!1,this.nextLoadPosition=this.startPosition),this.tickImmediate()},b.onBufferFlushed=function(e,t){var r=t.type;if(r!==u.ElementaryStreamTypes.AUDIO||this.audioOnly&&!this.altAudio){var i=(r===u.ElementaryStreamTypes.VIDEO?this.videoBuffer:this.mediaBuffer)||this.media;this.afterBufferFlushed(i,r,h.PlaylistLevelType.MAIN)}},b.onLevelsUpdated=function(e,t){this.levels=t.levels},b.swapAudioCodec=function(){this.audioCodecSwap=!this.audioCodecSwap},b.seekToStartPos=function(){var e=this.media,t=e.currentTime,r=this.startPosition;if(r>=0&&t0&&(s1&&!1===e.seeking){var r=e.currentTime;if(o.BufferHelper.isBuffered(e,r)?t=this.getAppendedFrag(r):o.BufferHelper.isBuffered(e,r+.1)&&(t=this.getAppendedFrag(r+.1)),t){var i=this.fragPlaying,s=t.level;i&&t.sn===i.sn&&i.level===s&&t.urlId===i.urlId||(this.hls.trigger(a.Events.FRAG_CHANGED,{frag:t}),i&&i.level===s||this.hls.trigger(a.Events.LEVEL_SWITCHED,{level:s}),this.fragPlaying=t)}}},E=y,(S=[{key:"nextLevel",get:function(){var e=this.nextBufferedFrag;return e?e.level:-1}},{key:"currentLevel",get:function(){var e=this.media;if(e){var t=this.getAppendedFrag(e.currentTime);if(t)return t.level}return-1}},{key:"nextBufferedFrag",get:function(){var e=this.media;if(e){var t=this.getAppendedFrag(e.currentTime);return this.followingBufferedFrag(t)}return null}},{key:"forceStartLoad",get:function(){return this._forceStartLoad}}])&&v(E.prototype,S),T&&v(E,T),y}(s.default)},"./src/controller/subtitle-stream-controller.ts":function(e,t,r){"use strict";r.r(t),r.d(t,"SubtitleStreamController",(function(){return g}));var i=r("./src/events.ts"),s=r("./src/utils/buffer-helper.ts"),n=r("./src/controller/fragment-finders.ts"),a=r("./src/utils/discontinuities.ts"),o=r("./src/controller/level-helper.ts"),l=r("./src/controller/fragment-tracker.ts"),h=r("./src/controller/base-stream-controller.ts"),u=r("./src/types/loader.ts"),c=r("./src/types/level.ts");function d(e,t){for(var r=0;r=s[o].start&&a<=s[o].end){n=s[o];break}var l=r.start+r.duration;n?n.end=l:(n={start:a,end:l},s.push(n)),this.fragmentTracker.fragBuffered(r)}}},y.onBufferFlushing=function(e,t){var r=t.startOffset,i=t.endOffset;if(0===r&&i!==Number.POSITIVE_INFINITY){var s=this.currentTrackId,n=this.levels;if(!n.length||!n[s]||!n[s].details)return;var a=i-n[s].details.targetduration;if(a<=0)return;t.endOffsetSubtitles=Math.max(0,a),this.tracksBuffered.forEach((function(e){for(var t=0;t=u.length||s!==l)&&c){if(this.mediaBuffer=this.mediaBufferTimeRanges,i.live||null!==(r=c.details)&&void 0!==r&&r.live){var d=this.mainDetails;if(i.deltaUpdateFailed||!d)return;var f=d.fragments[0];c.details?0===this.alignPlaylists(i,c.details)&&f&&Object(o.addSliding)(i,f.start):i.hasProgramDateTime&&d.hasProgramDateTime?Object(a.alignMediaPlaylistByPDT)(i,d):f&&Object(o.addSliding)(i,f.start)}c.details=i,this.levelLastLoaded=s,this.tick(),i.live&&!this.fragCurrent&&this.media&&this.state===h.State.IDLE&&(Object(n.findFragmentByPTS)(null,i.fragments,this.media.currentTime,0)||(this.warn("Subtitle playlist not aligned with playback"),c.details=void 0))}}},y._handleFragmentLoadComplete=function(e){var t=e.frag,r=e.payload,s=t.decryptdata,n=this.hls;if(!this.fragContextChanged(t)&&r&&r.byteLength>0&&s&&s.key&&s.iv&&"AES-128"===s.method){var a=performance.now();this.decrypter.webCryptoDecrypt(new Uint8Array(r),s.key.buffer,s.iv.buffer).then((function(e){var r=performance.now();n.trigger(i.Events.FRAG_DECRYPTED,{frag:t,payload:e,stats:{tstart:a,tdecrypt:r}})}))}},y.doTick=function(){if(this.media){if(this.state===h.State.IDLE){var e,t=this.currentTrackId,r=this.levels;if(!r.length||!r[t]||!r[t].details)return;var i=r[t].details,a=i.targetduration,o=this.config,u=this.media,c=s.BufferHelper.bufferedInfo(this.mediaBufferTimeRanges,u.currentTime-a,o.maxBufferHole),d=c.end;if(c.len>this.getMaxBufferLength()+a)return;console.assert(i,"Subtitle track details are defined on idle subtitle stream controller tick");var f,g=i.fragments,p=g.length,v=i.edge,m=this.fragPrevious;if(d-1&&(this.subtitleTrack=this.queuedDefaultTrack,this.queuedDefaultTrack=-1),this.useTextTrackPolling=!(this.media.textTracks&&"onchange"in this.media.textTracks),this.useTextTrackPolling?this.pollTrackChange(500):this.media.textTracks.addEventListener("change",this.asyncPollTrackChange))},f.pollTrackChange=function(e){self.clearInterval(this.subtitlePollingInterval),this.subtitlePollingInterval=self.setInterval(this.trackChangeListener,e)},f.onMediaDetaching=function(){this.media&&(self.clearInterval(this.subtitlePollingInterval),this.useTextTrackPolling||this.media.textTracks.removeEventListener("change",this.asyncPollTrackChange),this.trackId>-1&&(this.queuedDefaultTrack=this.trackId),u(this.media.textTracks).forEach((function(e){Object(s.clearCurrentCues)(e)})),this.subtitleTrack=-1,this.media=null)},f.onManifestLoading=function(){this.tracks=[],this.groupId=null,this.tracksInGroup=[],this.trackId=-1,this.selectDefaultTrack=!0},f.onManifestParsed=function(e,t){this.tracks=t.subtitleTracks},f.onSubtitleTrackLoaded=function(e,t){var r=t.id,i=t.details,s=this.trackId,n=this.tracksInGroup[s];if(n){var a=n.details;n.details=t.details,this.log("subtitle track "+r+" loaded ["+i.startSN+"-"+i.endSN+"]"),r===this.trackId&&(this.retryCount=0,this.playlistLoaded(r,t,a))}else this.warn("Invalid subtitle track id "+r)},f.onLevelLoading=function(e,t){this.switchLevel(t.level)},f.onLevelSwitching=function(e,t){this.switchLevel(t.level)},f.switchLevel=function(e){var t=this.hls.levels[e];if(null!=t&&t.textGroupIds){var r=t.textGroupIds[t.urlId];if(this.groupId!==r){var s=this.tracksInGroup?this.tracksInGroup[this.trackId]:void 0,n=this.tracks.filter((function(e){return!r||e.groupId===r}));this.tracksInGroup=n;var a=this.findTrackId(null==s?void 0:s.name)||this.findTrackId();this.groupId=r;var o={subtitleTracks:n};this.log("Updating subtitle tracks, "+n.length+' track(s) found in "'+r+'" group-id'),this.hls.trigger(i.Events.SUBTITLE_TRACKS_UPDATED,o),-1!==a&&this.setSubtitleTrack(a,s)}}},f.findTrackId=function(e){for(var t=this.tracksInGroup,r=0;r=s.length)){this.clearTimer();var n=s[e];if(this.log("Switching to subtitle track "+e),this.trackId=e,n){var a=n.id,o=n.groupId,l=void 0===o?"":o,h=n.name,u=n.type,c=n.url;this.hls.trigger(i.Events.SUBTITLE_TRACK_SWITCH,{id:a,groupId:l,name:h,type:u,url:c});var d=this.switchParams(n.url,null==t?void 0:t.details);this.loadPlaylist(d)}else this.hls.trigger(i.Events.SUBTITLE_TRACK_SWITCH,{id:e})}}else this.queuedDefaultTrack=e},f.onTextTracksChanged=function(){if(this.useTextTrackPolling||self.clearInterval(this.subtitlePollingInterval),this.media&&this.hls.config.renderTextTracksNatively){for(var e=-1,t=u(this.media.textTracks),r=0;r=0&&(d[0]=Math.min(d[0],t),d[1]=Math.max(d[1],r),u=!0,f/(r-t)>.5))return}if(u||n.push([t,r]),this.config.renderTextTracksNatively){var g=this.captionsTracks[e];this.Cues.newCue(g,t,r,i)}else{var p=this.Cues.newCue(null,t,r,i);this.hls.trigger(s.Events.CUES_PARSED,{type:"captions",cues:p,track:e})}},t.onInitPtsFound=function(e,t){var r=this,i=t.frag,n=t.id,a=t.initPTS,o=t.timescale,l=this.unparsedVttFrags;"main"===n&&(this.initPTS[i.cc]=a,this.timescale[i.cc]=o),l.length&&(this.unparsedVttFrags=[],l.forEach((function(e){r.onFragLoaded(s.Events.FRAG_LOADED,e)})))},t.getExistingTrack=function(e){var t=this.media;if(t)for(var r=0;r>>8^255&v^99,e[f]=v,t[v]=f;var m=d[f],y=d[m],E=d[y],S=257*d[v]^16843008*v;i[f]=S<<24|S>>>8,s[f]=S<<16|S>>>16,n[f]=S<<8|S>>>24,a[f]=S,S=16843009*E^65537*y^257*m^16843008*f,l[v]=S<<24|S>>>8,h[v]=S<<16|S>>>16,u[v]=S<<8|S>>>24,c[v]=S,f?(f=m^d[d[d[E^m]]],g^=d[d[g]]):f=g=1}},t.expandKey=function(e){for(var t=this.uint8ArrayToUint32Array_(e),r=!0,i=0;i>>6);var g=(60&t[r+2])>>>2;if(!(g>f.length-1))return h=(1&t[r+2])<<2,h|=(192&t[r+3])>>>6,i.logger.log("manifest codec:"+a+", ADTS type:"+o+", samplingIndex:"+g),/firefox/i.test(c)?g>=6?(o=5,u=new Array(4),l=g-3):(o=2,u=new Array(2),l=g):-1!==c.indexOf("android")?(o=2,u=new Array(2),l=g):(o=5,u=new Array(4),a&&(-1!==a.indexOf("mp4a.40.29")||-1!==a.indexOf("mp4a.40.5"))||!a&&g>=6?l=g-3:((a&&-1!==a.indexOf("mp4a.40.2")&&(g>=6&&1===h||/vivaldi/i.test(c))||!a&&1===h)&&(o=2,u=new Array(2)),l=g)),u[0]=o<<3,u[0]|=(14&g)>>1,u[1]|=(1&g)<<7,u[1]|=h<<3,5===o&&(u[1]|=(14&l)>>1,u[2]=(1&l)<<7,u[2]|=8,u[3]=0),{config:u,samplerate:f[g],channelCount:h,codec:"mp4a.40."+o,manifestCodec:d};e.trigger(n.Events.ERROR,{type:s.ErrorTypes.MEDIA_ERROR,details:s.ErrorDetails.FRAG_PARSING_ERROR,fatal:!0,reason:"invalid ADTS sampling index:"+g})}function o(e,t){return 255===e[t]&&240==(246&e[t+1])}function l(e,t){return 1&e[t+1]?7:9}function h(e,t){return(3&e[t+3])<<11|e[t+4]<<3|(224&e[t+5])>>>5}function u(e,t){return t+5=e.length)return!1;var i=h(e,t);if(i<=r)return!1;var s=t+i;return s===e.length||c(e,s)}return!1}function g(e,t,r,s,n){if(!e.samplerate){var o=a(t,r,s,n);if(!o)return;e.config=o.config,e.samplerate=o.samplerate,e.channelCount=o.channelCount,e.codec=o.codec,e.manifestCodec=o.manifestCodec,i.logger.log("parsed codec:"+e.codec+", rate:"+o.samplerate+", channels:"+o.channelCount)}}function p(e){return 9216e4/e}function v(e,t,r,i,s){var n=l(e,t),a=h(e,t);if((a-=n)>0)return{headerLength:n,frameLength:a,stamp:r+i*s}}function m(e,t,r,i,s){var n=v(t,r,i,s,p(e.samplerate));if(n){var a,o=n.frameLength,l=n.headerLength,h=n.stamp,u=l+o,c=Math.max(0,r+u-t.length);c?(a=new Uint8Array(u-l)).set(t.subarray(r+l,t.length),0):a=t.subarray(r+l,r+u);var d={unit:a,pts:h};return c||e.samples.push(d),{sample:d,length:u,missing:c}}}},"./src/demux/base-audio-demuxer.ts":function(e,t,r){"use strict";r.r(t),r.d(t,"initPTSFn",(function(){return h}));var i=r("./src/polyfills/number.ts"),s=r("./src/demux/id3.ts"),n=r("./src/demux/dummy-demuxed-track.ts"),a=r("./src/utils/mp4-tools.ts"),o=r("./src/utils/typed-array.ts"),l=function(){function e(){this._audioTrack=void 0,this._id3Track=void 0,this.frameIndex=0,this.cachedData=null,this.initPTS=null}var t=e.prototype;return t.resetInitSegment=function(e,t,r){this._id3Track={type:"id3",id:3,pid:-1,inputTimeScale:9e4,sequenceNumber:0,samples:[],dropped:0}},t.resetTimeStamp=function(){},t.resetContiguity=function(){},t.canParse=function(e,t){return!1},t.appendFrame=function(e,t,r){},t.demux=function(e,t){this.cachedData&&(e=Object(a.appendUint8Array)(this.cachedData,e),this.cachedData=null);var r,i,l=s.getID3Data(e,0),u=l?l.length:0,c=this._audioTrack,d=this._id3Track,f=l?s.getTimeStamp(l):void 0,g=e.length;for(0!==this.frameIndex&&null!==this.initPTS||(this.initPTS=h(f,t)),l&&l.length>0&&d.samples.push({pts:this.initPTS,dts:this.initPTS,data:l}),i=this.initPTS;ue?(this.word<<=e,this.bitsAvailable-=e):(e-=this.bitsAvailable,e-=(t=e>>3)>>3,this.bytesAvailable-=t,this.loadWord(),this.word<<=e,this.bitsAvailable-=e)},t.readBits=function(e){var t=Math.min(this.bitsAvailable,e),r=this.word>>>32-t;return e>32&&i.logger.error("Cannot read more than 32 bits at a time"),this.bitsAvailable-=t,this.bitsAvailable>0?this.word<<=t:this.bytesAvailable>0&&this.loadWord(),(t=e-t)>0&&this.bitsAvailable?r<>>e))return this.word<<=e,this.bitsAvailable-=e,e;return this.loadWord(),e+this.skipLZ()},t.skipUEG=function(){this.skipBits(1+this.skipLZ())},t.skipEG=function(){this.skipBits(1+this.skipLZ())},t.readUEG=function(){var e=this.skipLZ();return this.readBits(e+1)-1},t.readEG=function(){var e=this.readUEG();return 1&e?1+e>>>1:-1*(e>>>1)},t.readBoolean=function(){return 1===this.readBits(1)},t.readUByte=function(){return this.readBits(8)},t.readUShort=function(){return this.readBits(16)},t.readUInt=function(){return this.readBits(32)},t.skipScalingList=function(e){for(var t=8,r=8,i=0;i0)return e.subarray(r,r+i)},o=function(e,t){var r=0;return r=(127&e[t])<<21,r|=(127&e[t+1])<<14,r|=(127&e[t+2])<<7,r|=127&e[t+3]},l=function(e,t){return s(e,t)&&o(e,t+6)+10<=e.length-t},h=function(e){for(var t=d(e),r=0;r>4){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:h+=String.fromCharCode(n);break;case 12:case 13:a=e[u++],h+=String.fromCharCode((31&n)<<6|63&a);break;case 14:a=e[u++],o=e[u++],h+=String.fromCharCode((15&n)<<12|(63&a)<<6|(63&o)<<0)}}return h},E={decodeTextFrame:p};function S(){return i||void 0===self.TextDecoder||(i=new self.TextDecoder("utf-8")),i}},"./src/demux/mp3demuxer.ts":function(e,t,r){"use strict";r.r(t);var i=r("./src/demux/base-audio-demuxer.ts"),s=r("./src/demux/id3.ts"),n=r("./src/utils/logger.ts"),a=r("./src/demux/mpegaudio.ts");function o(e,t){return o=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},o(e,t)}var l=function(e){var t,r;function i(){return e.apply(this,arguments)||this}r=e,(t=i).prototype=Object.create(r.prototype),t.prototype.constructor=t,o(t,r);var l=i.prototype;return l.resetInitSegment=function(t,r,i){e.prototype.resetInitSegment.call(this,t,r,i),this._audioTrack={container:"audio/mpeg",type:"audio",id:2,pid:-1,sequenceNumber:0,isAAC:!1,samples:[],manifestCodec:t,duration:i,inputTimeScale:9e4,dropped:0}},i.probe=function(e){if(!e)return!1;for(var t=(s.getID3Data(e,0)||[]).length,r=e.length;t0},t.demux=function(e){var t=e,r=Object(s.dummyTrack)();if(this.config.progressive){this.remainderData&&(t=Object(i.appendUint8Array)(this.remainderData,e));var n=Object(i.segmentValidRange)(t);this.remainderData=n.remainder,r.samples=n.valid||new Uint8Array}else r.samples=t;return{audioTrack:Object(s.dummyTrack)(),avcTrack:r,id3Track:Object(s.dummyTrack)(),textTrack:Object(s.dummyTrack)()}},t.flush=function(){var e=Object(s.dummyTrack)();return e.samples=this.remainderData||new Uint8Array,this.remainderData=null,{audioTrack:Object(s.dummyTrack)(),avcTrack:e,id3Track:Object(s.dummyTrack)(),textTrack:Object(s.dummyTrack)()}},t.demuxSampleAes=function(e,t,r){return Promise.reject(new Error("The MP4 demuxer does not support SAMPLE-AES decryption"))},t.destroy=function(){},e}();n.minProbeByteLength=1024,t.default=n},"./src/demux/mpegaudio.ts":function(e,t,r){"use strict";r.r(t),r.d(t,"appendFrame",(function(){return l})),r.d(t,"parseHeader",(function(){return h})),r.d(t,"isHeaderPattern",(function(){return u})),r.d(t,"isHeader",(function(){return c})),r.d(t,"canParse",(function(){return d})),r.d(t,"probe",(function(){return f}));var i=null,s=[32,64,96,128,160,192,224,256,288,320,352,384,416,448,32,48,56,64,80,96,112,128,160,192,224,256,320,384,32,40,48,56,64,80,96,112,128,160,192,224,256,320,32,48,56,64,80,96,112,128,144,160,176,192,224,256,8,16,24,32,40,48,56,64,80,96,112,128,144,160],n=[44100,48e3,32e3,22050,24e3,16e3,11025,12e3,8e3],a=[[0,72,144,12],[0,0,0,0],[0,72,144,12],[0,144,144,12]],o=[0,1,1,4];function l(e,t,r,i,s){if(!(r+24>t.length)){var n=h(t,r);if(n&&r+n.frameLength<=t.length){var a=i+s*(9e4*n.samplesPerFrame/n.sampleRate),o={unit:t.subarray(r,r+n.frameLength),pts:a,dts:a};return e.config=[],e.channelCount=n.channelCount,e.samplerate=n.sampleRate,e.samples.push(o),{sample:o,length:n.frameLength,missing:0}}}}function h(e,t){var r=e[t+1]>>3&3,l=e[t+1]>>1&3,h=e[t+2]>>4&15,u=e[t+2]>>2&3;if(1!==r&&0!==h&&15!==h&&3!==u){var c=e[t+2]>>1&1,d=e[t+3]>>6,f=1e3*s[14*(3===r?3-l:3===l?3:4)+h-1],g=n[3*(3===r?0:2===r?1:2)+u],p=3===d?1:2,v=a[r][l],m=o[l],y=8*v*m,E=Math.floor(v*f/g+c)*m;if(null===i){var S=(navigator.userAgent||"").match(/Chrome\/(\d+)/i);i=S?parseInt(S[1]):0}return!!i&&i<=87&&2===l&&f>=224e3&&0===d&&(e[t+3]=128|e[t+3]),{sampleRate:g,channelCount:p,frameLength:E,samplesPerFrame:y}}}function u(e,t){return 255===e[t]&&224==(224&e[t+1])&&0!=(6&e[t+1])}function c(e,t){return t+1=e.length)return void r();if(!(e[t].unit.length<32)){var i=this.decrypter.isSync();if(this.decryptAacSample(e,t,r,i),!i)return}}},t.getAvcEncryptedData=function(e){for(var t=16*Math.floor((e.length-48)/160)+16,r=new Int8Array(t),i=0,s=32;s=e.length)return void i();for(var s=e[t].units;!(r>=s.length);r++){var n=s[r];if(!(n.data.length<=48||1!==n.type&&5!==n.type)){var a=this.decrypter.isSync();if(this.decryptAvcSample(e,t,r,i,n,a),!a)return}}}},e}();t.default=n},"./src/demux/transmuxer-interface.ts":function(e,t,r){"use strict";r.r(t),r.d(t,"default",(function(){return c}));var i=r("./node_modules/webworkify-webpack/index.js"),s=r("./src/events.ts"),n=r("./src/demux/transmuxer.ts"),a=r("./src/utils/logger.ts"),o=r("./src/errors.ts"),l=r("./src/utils/mediasource-helper.ts"),h=r("./node_modules/eventemitter3/index.js"),u=Object(l.getMediaSource)()||{isTypeSupported:function(){return!1}},c=function(){function e(e,t,r,l){var c=this;this.hls=void 0,this.id=void 0,this.observer=void 0,this.frag=null,this.part=null,this.worker=void 0,this.onwmsg=void 0,this.transmuxer=null,this.onTransmuxComplete=void 0,this.onFlush=void 0,this.hls=e,this.id=t,this.onTransmuxComplete=r,this.onFlush=l;var d=e.config,f=function(t,r){(r=r||{}).frag=c.frag,r.id=c.id,e.trigger(t,r)};this.observer=new h.EventEmitter,this.observer.on(s.Events.FRAG_DECRYPTED,f),this.observer.on(s.Events.ERROR,f);var g={mp4:u.isTypeSupported("video/mp4"),mpeg:u.isTypeSupported("audio/mpeg"),mp3:u.isTypeSupported('audio/mp4; codecs="mp3"')},p=navigator.vendor;if(d.enableWorker&&"undefined"!=typeof Worker){var v;a.logger.log("demuxing in webworker");try{v=this.worker=i("./src/demux/transmuxer-worker.ts"),this.onwmsg=this.onWorkerMessage.bind(this),v.addEventListener("message",this.onwmsg),v.onerror=function(t){e.trigger(s.Events.ERROR,{type:o.ErrorTypes.OTHER_ERROR,details:o.ErrorDetails.INTERNAL_EXCEPTION,fatal:!0,event:"demuxerWorker",error:new Error(t.message+" ("+t.filename+":"+t.lineno+")")})},v.postMessage({cmd:"init",typeSupported:g,vendor:p,id:t,config:JSON.stringify(d)})}catch(e){a.logger.warn("Error in worker:",e),a.logger.error("Error while initializing DemuxerWorker, fallback to inline"),v&&self.URL.revokeObjectURL(v.objectURL),this.transmuxer=new n.default(this.observer,g,d,p,t),this.worker=null}}else this.transmuxer=new n.default(this.observer,g,d,p,t)}var t=e.prototype;return t.destroy=function(){var e=this.worker;if(e)e.removeEventListener("message",this.onwmsg),e.terminate(),this.worker=null;else{var t=this.transmuxer;t&&(t.destroy(),this.transmuxer=null)}var r=this.observer;r&&r.removeAllListeners(),this.observer=null},t.push=function(e,t,r,i,s,o,l,h,u,c){var d,f,g=this;u.transmuxing.start=self.performance.now();var p=this.transmuxer,v=this.worker,m=o?o.start:s.start,y=s.decryptdata,E=this.frag,S=!(E&&s.cc===E.cc),T=!(E&&u.level===E.level),b=E?u.sn-E.sn:-1,_=this.part?u.part-this.part.index:1,L=!T&&(1===b||0===b&&1===_),A=self.performance.now();(T||b||0===s.stats.parsing.start)&&(s.stats.parsing.start=A),!o||!_&&L||(o.stats.parsing.start=A);var D=!(E&&(null===(d=s.initSegment)||void 0===d?void 0:d.url)===(null===(f=E.initSegment)||void 0===f?void 0:f.url)),w=new n.TransmuxState(S,L,h,T,m,D);if(!L||S||D){a.logger.log("[transmuxer-interface, "+s.type+"]: Starting new transmux session for sn: "+u.sn+" p: "+u.part+" level: "+u.level+" id: "+u.id+"\n discontinuity: "+S+"\n trackSwitch: "+T+"\n contiguous: "+L+"\n accurateTimeOffset: "+h+"\n timeOffset: "+m+"\n initSegmentChange: "+D);var I=new n.TransmuxConfig(r,i,t,l,c);this.configureTransmuxer(I)}if(this.frag=s,this.part=o,v)v.postMessage({cmd:"demux",data:e,decryptdata:y,chunkMeta:u,state:w},e instanceof ArrayBuffer?[e]:[]);else if(p){var P=p.push(e,y,u,w);Object(n.isPromise)(P)?P.then((function(e){g.handleTransmuxComplete(e)})):this.handleTransmuxComplete(P)}},t.flush=function(e){var t=this;e.transmuxing.start=self.performance.now();var r=this.transmuxer,i=this.worker;if(i)i.postMessage({cmd:"flush",chunkMeta:e});else if(r){var s=r.flush(e);Object(n.isPromise)(s)?s.then((function(r){t.handleFlushResult(r,e)})):this.handleFlushResult(s,e)}},t.handleFlushResult=function(e,t){var r=this;e.forEach((function(e){r.handleTransmuxComplete(e)})),this.onFlush(t)},t.onWorkerMessage=function(e){var t=e.data,r=this.hls;switch(t.event){case"init":self.URL.revokeObjectURL(this.worker.objectURL);break;case"transmuxComplete":this.handleTransmuxComplete(t.data);break;case"flush":this.onFlush(t.data);break;default:t.data=t.data||{},t.data.frag=this.frag,t.data.id=this.id,r.trigger(t.event,t.data)}},t.configureTransmuxer=function(e){var t=this.worker,r=this.transmuxer;t?t.postMessage({cmd:"configure",config:e}):r&&r.configure(e)},t.handleTransmuxComplete=function(e){e.chunkMeta.transmuxing.end=self.performance.now(),this.onTransmuxComplete(e)},e}()},"./src/demux/transmuxer-worker.ts":function(e,t,r){"use strict";r.r(t),r.d(t,"default",(function(){return o}));var i=r("./src/demux/transmuxer.ts"),s=r("./src/events.ts"),n=r("./src/utils/logger.ts"),a=r("./node_modules/eventemitter3/index.js");function o(e){var t=new a.EventEmitter,r=function(t,r){e.postMessage({event:t,data:r})};t.on(s.Events.FRAG_DECRYPTED,r),t.on(s.Events.ERROR,r),e.addEventListener("message",(function(s){var a=s.data;switch(a.cmd){case"init":var o=JSON.parse(a.config);e.transmuxer=new i.default(t,a.typeSupported,o,a.vendor,a.id),Object(n.enableLogs)(o.debug),r("init",null);break;case"configure":e.transmuxer.configure(a.config);break;case"demux":var h=e.transmuxer.push(a.data,a.decryptdata,a.chunkMeta,a.state);Object(i.isPromise)(h)?h.then((function(t){l(e,t)})):l(e,h);break;case"flush":var c=a.chunkMeta,d=e.transmuxer.flush(c);Object(i.isPromise)(d)?d.then((function(t){u(e,t,c)})):u(e,d,c)}}))}function l(e,t){if((r=t.remuxResult).audio||r.video||r.text||r.id3||r.initSegment){var r,i=[],s=t.remuxResult,n=s.audio,a=s.video;n&&h(i,n),a&&h(i,a),e.postMessage({event:"transmuxComplete",data:t},i)}}function h(e,t){t.data1&&e.push(t.data1.buffer),t.data2&&e.push(t.data2.buffer)}function u(e,t,r){t.forEach((function(t){l(e,t)})),e.postMessage({event:"flush",data:r})}},"./src/demux/transmuxer.ts":function(e,t,r){"use strict";r.r(t),r.d(t,"default",(function(){return y})),r.d(t,"isPromise",(function(){return S})),r.d(t,"TransmuxConfig",(function(){return T})),r.d(t,"TransmuxState",(function(){return b}));var i,s=r("./src/events.ts"),n=r("./src/errors.ts"),a=r("./src/crypt/decrypter.ts"),o=r("./src/demux/aacdemuxer.ts"),l=r("./src/demux/mp4demuxer.ts"),h=r("./src/demux/tsdemuxer.ts"),u=r("./src/demux/mp3demuxer.ts"),c=r("./src/remux/mp4-remuxer.ts"),d=r("./src/remux/passthrough-remuxer.ts"),f=r("./src/demux/chunk-cache.ts"),g=r("./src/utils/mp4-tools.ts"),p=r("./src/utils/logger.ts");try{i=self.performance.now.bind(self.performance)}catch(e){p.logger.debug("Unable to use Performance API on this environment"),i=self.Date.now}var v=[{demux:h.default,remux:c.default},{demux:l.default,remux:d.default},{demux:o.default,remux:c.default},{demux:u.default,remux:c.default}],m=1024;v.forEach((function(e){var t=e.demux;m=Math.max(m,t.minProbeByteLength)}));var y=function(){function e(e,t,r,i,s){this.observer=void 0,this.typeSupported=void 0,this.config=void 0,this.vendor=void 0,this.id=void 0,this.demuxer=void 0,this.remuxer=void 0,this.decrypter=void 0,this.probe=void 0,this.decryptionPromise=null,this.transmuxConfig=void 0,this.currentTransmuxState=void 0,this.cache=new f.default,this.observer=e,this.typeSupported=t,this.config=r,this.vendor=i,this.id=s}var t=e.prototype;return t.configure=function(e){this.transmuxConfig=e,this.decrypter&&this.decrypter.reset()},t.push=function(e,t,r,s){var n=this,a=r.transmuxing;a.executeStart=i();var o=new Uint8Array(e),l=this.cache,h=this.config,u=this.currentTransmuxState,c=this.transmuxConfig;s&&(this.currentTransmuxState=s);var d=function(e,t){var r=null;return e.byteLength>0&&null!=t&&null!=t.key&&null!==t.iv&&null!=t.method&&(r=t),r}(o,t);if(d&&"AES-128"===d.method){var f=this.getDecrypter();if(!h.enableSoftwareAES)return this.decryptionPromise=f.webCryptoDecrypt(o,d.key.buffer,d.iv.buffer).then((function(e){var t=n.push(e,null,r);return n.decryptionPromise=null,t})),this.decryptionPromise;var p=f.softwareDecrypt(o,d.key.buffer,d.iv.buffer);if(!p)return a.executeEnd=i(),E(r);o=new Uint8Array(p)}var v=s||u,m=v.contiguous,y=v.discontinuity,S=v.trackSwitch,T=v.accurateTimeOffset,b=v.timeOffset,_=v.initSegmentChange,L=c.audioCodec,A=c.videoCodec,D=c.defaultInitPts,w=c.duration,I=c.initSegmentData;if((y||S||_)&&this.resetInitSegment(I,L,A,w),(y||_)&&this.resetInitialTimestamp(D),m||this.resetContiguity(),this.needsProbing(o,y,S)){if(l.dataLength){var P=l.flush();o=Object(g.appendUint8Array)(P,o)}this.configureTransmuxer(o,c)}var R=this.transmux(o,d,b,T,r),C=this.currentTransmuxState;return C.contiguous=!0,C.discontinuity=!1,C.trackSwitch=!1,a.executeEnd=i(),R},t.flush=function(e){var t=this,r=e.transmuxing;r.executeStart=i();var a=this.decrypter,o=this.cache,l=this.currentTransmuxState,h=this.decryptionPromise;if(h)return h.then((function(){return t.flush(e)}));var u=[],c=l.timeOffset;if(a){var d=a.flush();d&&u.push(this.push(d,null,e))}var f=o.dataLength;o.reset();var g=this.demuxer,p=this.remuxer;if(!g||!p)return f>=m&&this.observer.emit(s.Events.ERROR,s.Events.ERROR,{type:n.ErrorTypes.MEDIA_ERROR,details:n.ErrorDetails.FRAG_PARSING_ERROR,fatal:!0,reason:"no demux matching with content found"}),r.executeEnd=i(),[E(e)];var v=g.flush(c);return S(v)?v.then((function(r){return t.flushRemux(u,r,e),u})):(this.flushRemux(u,v,e),u)},t.flushRemux=function(e,t,r){var s=t.audioTrack,n=t.avcTrack,a=t.id3Track,o=t.textTrack,l=this.currentTransmuxState,h=l.accurateTimeOffset,u=l.timeOffset;p.logger.log("[transmuxer.ts]: Flushed fragment "+r.sn+(r.part>-1?" p: "+r.part:"")+" of level "+r.level);var c=this.remuxer.remux(s,n,a,o,u,h,!0,this.id);e.push({remuxResult:c,chunkMeta:r}),r.transmuxing.executeEnd=i()},t.resetInitialTimestamp=function(e){var t=this.demuxer,r=this.remuxer;t&&r&&(t.resetTimeStamp(e),r.resetTimeStamp(e))},t.resetContiguity=function(){var e=this.demuxer,t=this.remuxer;e&&t&&(e.resetContiguity(),t.resetNextTimestamp())},t.resetInitSegment=function(e,t,r,i){var s=this.demuxer,n=this.remuxer;s&&n&&(s.resetInitSegment(t,r,i),n.resetInitSegment(e,t,r))},t.destroy=function(){this.demuxer&&(this.demuxer.destroy(),this.demuxer=void 0),this.remuxer&&(this.remuxer.destroy(),this.remuxer=void 0)},t.transmux=function(e,t,r,i,s){return t&&"SAMPLE-AES"===t.method?this.transmuxSampleAes(e,t,r,i,s):this.transmuxUnencrypted(e,r,i,s)},t.transmuxUnencrypted=function(e,t,r,i){var s=this.demuxer.demux(e,t,!1,!this.config.progressive),n=s.audioTrack,a=s.avcTrack,o=s.id3Track,l=s.textTrack;return{remuxResult:this.remuxer.remux(n,a,o,l,t,r,!1,this.id),chunkMeta:i}},t.transmuxSampleAes=function(e,t,r,i,s){var n=this;return this.demuxer.demuxSampleAes(e,t,r).then((function(e){return{remuxResult:n.remuxer.remux(e.audioTrack,e.avcTrack,e.id3Track,e.textTrack,r,i,!1,n.id),chunkMeta:s}}))},t.configureTransmuxer=function(e,t){for(var r,i=this.config,s=this.observer,n=this.typeSupported,a=this.vendor,o=t.audioCodec,h=t.defaultInitPts,u=t.duration,c=t.initSegmentData,f=t.videoCodec,g=0,m=v.length;g>4>1){if((C=I+5+t[I+4])===I+188)continue}else C=I+4;switch(R){case f:P&&(g&&(n=m(g))&&this.parseAVCPES(n,!1),g={data:[],size:0}),g&&(g.data.push(t.subarray(C,I+188)),g.size+=I+188-C);break;case y:P&&(S&&(n=m(S))&&(o.isAAC?this.parseAACPES(n):this.parseMPEGPES(n)),S={data:[],size:0}),S&&(S.data.push(t.subarray(C,I+188)),S.size+=I+188-C);break;case E:P&&(T&&(n=m(T))&&this.parseID3PES(n),T={data:[],size:0}),T&&(T.data.push(t.subarray(C,I+188)),T.size+=I+188-C);break;case 0:P&&(C+=t[C]+1),L=this._pmtId=p(t,C);break;case L:P&&(C+=t[C]+1);var k=v(t,C,!0===this.typeSupported.mpeg||!0===this.typeSupported.mp3,i);(f=k.avc)>0&&(a.pid=f),(y=k.audio)>0&&(o.pid=y,o.isAAC=k.isAAC),(E=k.id3)>0&&(d.pid=E),b&&!_&&(u.logger.log("reparse from beginning"),b=!1,I=D-188),_=this.pmtParsed=!0;break;case 17:case 8191:break;default:b=!0}}else w++;w>0&&this.observer.emit(l.Events.ERROR,l.Events.ERROR,{type:c.ErrorTypes.MEDIA_ERROR,details:c.ErrorDetails.FRAG_PARSING_ERROR,fatal:!1,reason:"Found "+w+" TS packet/s that do not start with 0x47"}),a.pesData=g,o.pesData=S,d.pesData=T;var O={audioTrack:o,avcTrack:a,id3Track:d,textTrack:this._txtTrack};return s&&this.extractRemainingSamples(O),O},t.flush=function(){var e,t=this.remainderData;return this.remainderData=null,e=t?this.demux(t,-1,!1,!0):{audioTrack:this._audioTrack,avcTrack:this._avcTrack,textTrack:this._txtTrack,id3Track:this._id3Track},this.extractRemainingSamples(e),this.sampleAes?this.decrypt(e,this.sampleAes):e},t.extractRemainingSamples=function(e){var t,r=e.audioTrack,i=e.avcTrack,s=e.id3Track,n=i.pesData,a=r.pesData,o=s.pesData;n&&(t=m(n))?(this.parseAVCPES(t,!0),i.pesData=null):i.pesData=n,a&&(t=m(a))?(r.isAAC?this.parseAACPES(t):this.parseMPEGPES(t),r.pesData=null):(null!=a&&a.size&&u.logger.log("last AAC PES packet truncated,might overlap between fragments"),r.pesData=a),o&&(t=m(o))?(this.parseID3PES(t),s.pesData=null):s.pesData=o},t.demuxSampleAes=function(e,t,r){var i=this.demux(e,r,!0,!this.config.progressive),s=this.sampleAes=new o.default(this.observer,this.config,t);return this.decrypt(i,s)},t.decrypt=function(e,t){return new Promise((function(r){var i=e.audioTrack,s=e.avcTrack;i.samples&&i.isAAC?t.decryptAacSamples(i.samples,0,(function(){s.samples?t.decryptAvcSamples(s.samples,0,0,(function(){r(e)})):r(e)})):s.samples&&t.decryptAvcSamples(s.samples,0,0,(function(){r(e)}))}))},t.destroy=function(){this._initPTS=this._initDTS=null,this._duration=0},t.parseAVCPES=function(e,t){var r,i=this,s=this._avcTrack,o=this.parseAVCNALu(e.data),l=this.avcSample,h=!1;e.data=null,l&&o.length&&!s.audFound&&(y(l,s),l=this.avcSample=g(!1,e.pts,e.dts,"")),o.forEach((function(t){switch(t.type){case 1:r=!0,l||(l=i.avcSample=g(!0,e.pts,e.dts,"")),l.frame=!0;var o=t.data;if(h&&o.length>4){var u=new n.default(o).readSliceType();2!==u&&4!==u&&7!==u&&9!==u||(l.key=!0)}break;case 5:r=!0,l||(l=i.avcSample=g(!0,e.pts,e.dts,"")),l.key=!0,l.frame=!0;break;case 6:r=!0;var c=new n.default(S(t.data));c.readUByte();for(var d=0,f=0,p=!1,v=0;!p&&c.bytesAvailable>1;){d=0;do{d+=v=c.readUByte()}while(255===v);f=0;do{f+=v=c.readUByte()}while(255===v);if(4===d&&0!==c.bytesAvailable){if(p=!0,181===c.readUByte()&&49===c.readUShort()&&1195456820===c.readUInt()&&3===c.readUByte()){for(var m=c.readUByte(),T=31&m,b=[m,c.readUByte()],_=0;_16){for(var L=[],A=0;A<16;A++)L.push(c.readUByte().toString(16)),3!==A&&5!==A&&7!==A&&9!==A||L.push("-");for(var D=f-16,w=new Uint8Array(D),I=0;I=0){var c={data:e.subarray(h,l-n-1),type:u};o.push(c)}else{var d=this.getLastNalUnit();if(d&&(a&&l<=4-a&&d.state&&(d.data=d.data.subarray(0,d.data.byteLength-a)),(r=l-n-1)>0)){var f=new Uint8Array(d.data.byteLength+r);f.set(d.data,0),f.set(e.subarray(0,r),d.data.byteLength),d.data=f,d.state=0}}l=0&&n>=0){var g={data:e.subarray(h,i),type:u,state:n};o.push(g)}if(0===o.length){var p=this.getLastNalUnit();if(p){var v=new Uint8Array(p.data.byteLength+e.byteLength);v.set(p.data,0),v.set(e,p.data.byteLength),p.data=v}}return s.naluState=n,o},t.parseAACPES=function(e){var t,r,s,n,a,o=0,h=this._audioTrack,d=this.aacOverFlow,f=e.data;if(d){this.aacOverFlow=null;var g=d.sample.unit.byteLength,p=Math.min(d.missing,g),v=g-p;d.sample.unit.set(f.subarray(0,p),v),h.samples.push(d.sample),o=d.missing}for(t=o,r=f.length;t1;){var l=new Uint8Array(o[0].length+o[1].length);l.set(o[0]),l.set(o[1],o[0].length),o[0]=l,o.splice(1,1)}if(1===((t=o[0])[0]<<16)+(t[1]<<8)+t[2]){if((r=(t[4]<<8)+t[5])&&r>e.size-6)return null;var h=t[7];192&h&&(s=536870912*(14&t[9])+4194304*(255&t[10])+16384*(254&t[11])+128*(255&t[12])+(254&t[13])/2,64&h?s-(n=536870912*(14&t[14])+4194304*(255&t[15])+16384*(254&t[16])+128*(255&t[17])+(254&t[18])/2)>54e5&&(u.logger.warn(Math.round((s-n)/9e4)+"s delta between PTS and DTS, align them"),s=n):n=s);var c=(i=t[8])+9;if(e.size<=c)return null;e.size-=c;for(var d=new Uint8Array(e.size),f=0,g=o.length;fp){c-=p;continue}t=t.subarray(c),p-=c,c=0}d.set(t,a),a+=p}return r&&(r-=i+3),{data:d,pts:s,dts:n,len:r}}return null}function y(e,t){if(e.units.length&&e.frame){if(void 0===e.pts){var r=t.samples,i=r.length;if(!i)return void t.dropped++;var s=r[i-1];e.pts=s.pts,e.dts=s.dts}t.samples.push(e)}e.debug.length&&u.logger.log(e.pts+"/"+e.dts+":"+e.debug)}function E(e,t){var r=e.length;if(r>0){if(t.pts>=e[r-1].pts)e.push(t);else for(var i=r-1;i>=0;i--)if(t.ptst)return i;return 0}},{key:"maxAutoLevel",get:function(){var e=this.levels,t=this.autoLevelCapping;return-1===t&&e&&e.length?e.length-1:t}},{key:"nextAutoLevel",get:function(){return Math.min(Math.max(this.abrController.nextAutoLevel,this.minAutoLevel),this.maxAutoLevel)},set:function(e){this.abrController.nextAutoLevel=Math.max(this.minAutoLevel,e)}},{key:"audioTracks",get:function(){var e=this.audioTrackController;return e?e.audioTracks:[]}},{key:"audioTrack",get:function(){var e=this.audioTrackController;return e?e.audioTrack:-1},set:function(e){var t=this.audioTrackController;t&&(t.audioTrack=e)}},{key:"subtitleTracks",get:function(){var e=this.subtitleTrackController;return e?e.subtitleTracks:[]}},{key:"subtitleTrack",get:function(){var e=this.subtitleTrackController;return e?e.subtitleTrack:-1},set:function(e){var t=this.subtitleTrackController;t&&(t.subtitleTrack=e)}},{key:"media",get:function(){return this._media}},{key:"subtitleDisplay",get:function(){var e=this.subtitleTrackController;return!!e&&e.subtitleDisplay},set:function(e){var t=this.subtitleTrackController;t&&(t.subtitleDisplay=e)}},{key:"lowLatencyMode",get:function(){return this.config.lowLatencyMode},set:function(e){this.config.lowLatencyMode=e}},{key:"liveSyncPosition",get:function(){return this.latencyController.liveSyncPosition}},{key:"latency",get:function(){return this.latencyController.latency}},{key:"maxLatency",get:function(){return this.latencyController.maxLatency}},{key:"targetLatency",get:function(){return this.latencyController.targetLatency}},{key:"drift",get:function(){return this.latencyController.drift}},{key:"forceStartLoad",get:function(){return this.streamController.forceStartLoad}}])&&m(t.prototype,r),y&&m(t,y),e}();y.defaultConfig=void 0},"./src/is-supported.ts":function(e,t,r){"use strict";r.r(t),r.d(t,"isSupported",(function(){return n})),r.d(t,"changeTypeSupported",(function(){return a}));var i=r("./src/utils/mediasource-helper.ts");function s(){return self.SourceBuffer||self.WebKitSourceBuffer}function n(){var e=Object(i.getMediaSource)();if(!e)return!1;var t=s(),r=e&&"function"==typeof e.isTypeSupported&&e.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"'),n=!t||t.prototype&&"function"==typeof t.prototype.appendBuffer&&"function"==typeof t.prototype.remove;return!!r&&!!n}function a(){var e,t=s();return"function"==typeof(null==t||null===(e=t.prototype)||void 0===e?void 0:e.changeType)}},"./src/loader/fragment-loader.ts":function(e,t,r){"use strict";r.r(t),r.d(t,"default",(function(){return c})),r.d(t,"LoadError",(function(){return f}));var i=r("./src/polyfills/number.ts"),s=r("./src/errors.ts");function n(e){var t="function"==typeof Map?new Map:void 0;return n=function(e){if(null===e||(r=e,-1===Function.toString.call(r).indexOf("[native code]")))return e;var r;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,i)}function i(){return a(e,arguments,h(this).constructor)}return i.prototype=Object.create(e.prototype,{constructor:{value:i,enumerable:!1,writable:!0,configurable:!0}}),l(i,e)},n(e)}function a(e,t,r){return a=o()?Reflect.construct:function(e,t,r){var i=[null];i.push.apply(i,t);var s=new(Function.bind.apply(e,i));return r&&l(s,r.prototype),s},a.apply(null,arguments)}function o(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}function l(e,t){return l=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},l(e,t)}function h(e){return h=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},h(e)}var u=Math.pow(2,17),c=function(){function e(e){this.config=void 0,this.loader=null,this.partLoadTimeout=-1,this.config=e}var t=e.prototype;return t.destroy=function(){this.loader&&(this.loader.destroy(),this.loader=null)},t.abort=function(){this.loader&&this.loader.abort()},t.load=function(e,t){var r=this,i=e.url;if(!i)return Promise.reject(new f({type:s.ErrorTypes.NETWORK_ERROR,details:s.ErrorDetails.FRAG_LOAD_ERROR,fatal:!1,frag:e,networkDetails:null},"Fragment does not have a "+(i?"part list":"url")));this.abort();var n=this.config,a=n.fLoader,o=n.loader;return new Promise((function(i,l){r.loader&&r.loader.destroy();var h=r.loader=e.loader=a?new a(n):new o(n),c=d(e),g={timeout:n.fragLoadingTimeOut,maxRetry:0,retryDelay:0,maxRetryDelay:n.fragLoadingMaxRetryTimeout,highWaterMark:u};e.stats=h.stats,h.load(c,g,{onSuccess:function(t,s,n,a){r.resetLoader(e,h),i({frag:e,part:null,payload:t.data,networkDetails:a})},onError:function(t,i,n){r.resetLoader(e,h),l(new f({type:s.ErrorTypes.NETWORK_ERROR,details:s.ErrorDetails.FRAG_LOAD_ERROR,fatal:!1,frag:e,response:t,networkDetails:n}))},onAbort:function(t,i,n){r.resetLoader(e,h),l(new f({type:s.ErrorTypes.NETWORK_ERROR,details:s.ErrorDetails.INTERNAL_ABORTED,fatal:!1,frag:e,networkDetails:n}))},onTimeout:function(t,i,n){r.resetLoader(e,h),l(new f({type:s.ErrorTypes.NETWORK_ERROR,details:s.ErrorDetails.FRAG_LOAD_TIMEOUT,fatal:!1,frag:e,networkDetails:n}))},onProgress:function(r,i,s,n){t&&t({frag:e,part:null,payload:s,networkDetails:n})}})}))},t.loadPart=function(e,t,r){var i=this;this.abort();var n=this.config,a=n.fLoader,o=n.loader;return new Promise((function(l,h){i.loader&&i.loader.destroy();var c=i.loader=e.loader=a?new a(n):new o(n),g=d(e,t),p={timeout:n.fragLoadingTimeOut,maxRetry:0,retryDelay:0,maxRetryDelay:n.fragLoadingMaxRetryTimeout,highWaterMark:u};t.stats=c.stats,c.load(g,p,{onSuccess:function(s,n,a,o){i.resetLoader(e,c),i.updateStatsFromPart(e,t);var h={frag:e,part:t,payload:s.data,networkDetails:o};r(h),l(h)},onError:function(r,n,a){i.resetLoader(e,c),h(new f({type:s.ErrorTypes.NETWORK_ERROR,details:s.ErrorDetails.FRAG_LOAD_ERROR,fatal:!1,frag:e,part:t,response:r,networkDetails:a}))},onAbort:function(r,n,a){e.stats.aborted=t.stats.aborted,i.resetLoader(e,c),h(new f({type:s.ErrorTypes.NETWORK_ERROR,details:s.ErrorDetails.INTERNAL_ABORTED,fatal:!1,frag:e,part:t,networkDetails:a}))},onTimeout:function(r,n,a){i.resetLoader(e,c),h(new f({type:s.ErrorTypes.NETWORK_ERROR,details:s.ErrorDetails.FRAG_LOAD_TIMEOUT,fatal:!1,frag:e,part:t,networkDetails:a}))}})}))},t.updateStatsFromPart=function(e,t){var r=e.stats,i=t.stats,s=i.total;if(r.loaded+=i.loaded,s){var n=Math.round(e.duration/t.duration),a=Math.min(Math.round(r.loaded/s),n),o=(n-a)*Math.round(r.loaded/a);r.total=r.loaded+o}else r.total=Math.max(r.loaded,r.total);var l=r.loading,h=i.loading;l.start?l.first+=h.first-h.start:(l.start=h.start,l.first=h.first),l.end=h.end},t.resetLoader=function(e,t){e.loader=null,this.loader===t&&(self.clearTimeout(this.partLoadTimeout),this.loader=null),t.destroy()},e}();function d(e,t){void 0===t&&(t=null);var r=t||e,s={frag:e,part:t,responseType:"arraybuffer",url:r.url,headers:{},rangeStart:0,rangeEnd:0},n=r.byteRangeStartOffset,a=r.byteRangeEndOffset;return Object(i.isFiniteNumber)(n)&&Object(i.isFiniteNumber)(a)&&(s.rangeStart=n,s.rangeEnd=a),s}var f=function(e){var t,r;function i(t){for(var r,i=arguments.length,s=new Array(i>1?i-1:0),n=1;n>8*(15-r)&255;return t},r.setDecryptDataFromLevelKey=function(e,t){var r=e;return"AES-128"===(null==e?void 0:e.method)&&e.uri&&!e.iv&&((r=o.LevelKey.fromURI(e.uri)).method=e.method,r.iv=this.createInitializationVector(t),r.keyFormat="identity"),r},r.setElementaryStreamInfo=function(e,t,r,i,s,n){void 0===n&&(n=!1);var a=this.elementaryStreams,o=a[e];o?(o.startPTS=Math.min(o.startPTS,t),o.endPTS=Math.max(o.endPTS,r),o.startDTS=Math.min(o.startDTS,i),o.endDTS=Math.max(o.endDTS,s)):a[e]={startPTS:t,endPTS:r,startDTS:i,endDTS:s,partial:n}},r.clearElementaryStreamInfo=function(){var e=this.elementaryStreams;e[i.AUDIO]=null,e[i.VIDEO]=null,e[i.AUDIOVIDEO]=null},d(t,[{key:"decryptdata",get:function(){if(!this.levelkey&&!this._decryptdata)return null;if(!this._decryptdata&&this.levelkey){var e=this.sn;"number"!=typeof e&&(this.levelkey&&"AES-128"===this.levelkey.method&&!this.levelkey.iv&&a.logger.warn('missing IV for initialization segment with method="'+this.levelkey.method+'" - compliance issue'),e=0),this._decryptdata=this.setDecryptDataFromLevelKey(this.levelkey,e)}return this._decryptdata}},{key:"end",get:function(){return this.start+this.duration}},{key:"endProgramDateTime",get:function(){if(null===this.programDateTime)return null;if(!Object(s.isFiniteNumber)(this.programDateTime))return null;var e=Object(s.isFiniteNumber)(this.duration)?this.duration:0;return this.programDateTime+1e3*e}},{key:"encrypted",get:function(){var e;return!(null===(e=this.decryptdata)||void 0===e||!e.keyFormat||!this.decryptdata.uri)}}]),t}(f),p=function(e){function t(t,r,i,s,n){var a;(a=e.call(this,i)||this).fragOffset=0,a.duration=0,a.gap=!1,a.independent=!1,a.relurl=void 0,a.fragment=void 0,a.index=void 0,a.stats=new l.LoadStats,a.duration=t.decimalFloatingPoint("DURATION"),a.gap=t.bool("GAP"),a.independent=t.bool("INDEPENDENT"),a.relurl=t.enumeratedString("URI"),a.fragment=r,a.index=s;var o=t.enumeratedString("BYTERANGE");return o&&a.setByteRange(o,n),n&&(a.fragOffset=n.fragOffset+n.duration),a}return h(t,e),d(t,[{key:"start",get:function(){return this.fragment.start+this.fragOffset}},{key:"end",get:function(){return this.start+this.duration}},{key:"loaded",get:function(){var e=this.elementaryStreams;return!!(e.audio||e.video||e.audiovideo)}}]),t}(f)},"./src/loader/key-loader.ts":function(e,t,r){"use strict";r.r(t),r.d(t,"default",(function(){return a}));var i=r("./src/events.ts"),s=r("./src/errors.ts"),n=r("./src/utils/logger.ts"),a=function(){function e(e){this.hls=void 0,this.loaders={},this.decryptkey=null,this.decrypturl=null,this.hls=e,this._registerListeners()}var t=e.prototype;return t._registerListeners=function(){this.hls.on(i.Events.KEY_LOADING,this.onKeyLoading,this)},t._unregisterListeners=function(){this.hls.off(i.Events.KEY_LOADING,this.onKeyLoading)},t.destroy=function(){for(var e in this._unregisterListeners(),this.loaders){var t=this.loaders[e];t&&t.destroy()}this.loaders={}},t.onKeyLoading=function(e,t){var r=t.frag,s=r.type,a=this.loaders[s];if(r.decryptdata){var o=r.decryptdata.uri;if(o!==this.decrypturl||null===this.decryptkey){var l=this.hls.config;if(a&&(n.logger.warn("abort previous key loader for type:"+s),a.abort()),!o)return void n.logger.warn("key uri is falsy");var h=l.loader,u=r.loader=this.loaders[s]=new h(l);this.decrypturl=o,this.decryptkey=null;var c={url:o,frag:r,responseType:"arraybuffer"},d={timeout:l.fragLoadingTimeOut,maxRetry:0,retryDelay:l.fragLoadingRetryDelay,maxRetryDelay:l.fragLoadingMaxRetryTimeout,highWaterMark:0},f={onSuccess:this.loadsuccess.bind(this),onError:this.loaderror.bind(this),onTimeout:this.loadtimeout.bind(this)};u.load(c,d,f)}else this.decryptkey&&(r.decryptdata.key=this.decryptkey,this.hls.trigger(i.Events.KEY_LOADED,{frag:r}))}else n.logger.warn("Missing decryption data on fragment in onKeyLoading")},t.loadsuccess=function(e,t,r){var s=r.frag;s.decryptdata?(this.decryptkey=s.decryptdata.key=new Uint8Array(e.data),s.loader=null,delete this.loaders[s.type],this.hls.trigger(i.Events.KEY_LOADED,{frag:s})):n.logger.error("after key load, decryptdata unset")},t.loaderror=function(e,t){var r=t.frag,n=r.loader;n&&n.abort(),delete this.loaders[r.type],this.hls.trigger(i.Events.ERROR,{type:s.ErrorTypes.NETWORK_ERROR,details:s.ErrorDetails.KEY_LOAD_ERROR,fatal:!1,frag:r,response:e})},t.loadtimeout=function(e,t){var r=t.frag,n=r.loader;n&&n.abort(),delete this.loaders[r.type],this.hls.trigger(i.Events.ERROR,{type:s.ErrorTypes.NETWORK_ERROR,details:s.ErrorDetails.KEY_LOAD_TIMEOUT,fatal:!1,frag:r})},e}()},"./src/loader/level-details.ts":function(e,t,r){"use strict";r.r(t),r.d(t,"LevelDetails",(function(){return n}));var i=r("./src/polyfills/number.ts");function s(e,t){for(var r=0;re.endSN||t>0||0===t&&r>0,this.updated||this.advanced?this.misses=Math.floor(.6*e.misses):this.misses=e.misses+1,this.availabilityDelay=e.availabilityDelay},t=e,(r=[{key:"hasProgramDateTime",get:function(){return!!this.fragments.length&&Object(i.isFiniteNumber)(this.fragments[this.fragments.length-1].programDateTime)}},{key:"levelTargetDuration",get:function(){return this.averagetargetduration||this.targetduration||10}},{key:"drift",get:function(){var e=this.driftEndTime-this.driftStartTime;return e>0?1e3*(this.driftEnd-this.driftStart)/e:1}},{key:"edge",get:function(){return this.partEnd||this.fragmentEnd}},{key:"partEnd",get:function(){var e;return null!==(e=this.partList)&&void 0!==e&&e.length?this.partList[this.partList.length-1].end:this.fragmentEnd}},{key:"fragmentEnd",get:function(){var e;return null!==(e=this.fragments)&&void 0!==e&&e.length?this.fragments[this.fragments.length-1].end:0}},{key:"age",get:function(){return this.advancedDateTime?Math.max(Date.now()-this.advancedDateTime,0)/1e3:0}},{key:"lastPartIndex",get:function(){var e;return null!==(e=this.partList)&&void 0!==e&&e.length?this.partList[this.partList.length-1].index:-1}},{key:"lastPartSn",get:function(){var e;return null!==(e=this.partList)&&void 0!==e&&e.length?this.partList[this.partList.length-1].fragment.sn:this.endSN}}])&&s(t.prototype,r),n&&s(t,n),e}()},"./src/loader/level-key.ts":function(e,t,r){"use strict";r.r(t),r.d(t,"LevelKey",(function(){return n}));var i=r("./node_modules/url-toolkit/src/url-toolkit.js");function s(e,t){for(var r=0;r2){var r=t.shift()+".";return r+=parseInt(t.shift()).toString(16),r+=("000"+parseInt(t.shift()).toString(16)).substr(-4)}return e},e.resolve=function(e,t){return s.buildAbsoluteURL(t,e,{alwaysNormalize:!0})},e.parseMasterPlaylist=function(t,r){var i,s=[],n={},a=!1;for(c.lastIndex=0;null!=(i=c.exec(t));)if(i[1]){var o=new l.AttrList(i[1]),h={attrs:o,bitrate:o.decimalInteger("AVERAGE-BANDWIDTH")||o.decimalInteger("BANDWIDTH"),name:o.NAME,url:e.resolve(i[2],r)},u=o.decimalResolution("RESOLUTION");u&&(h.width=u.width,h.height=u.height),m((o.CODECS||"").split(/[ ,]+/).filter((function(e){return e})),h),h.videoCodec&&-1!==h.videoCodec.indexOf("avc1")&&(h.videoCodec=e.convertAVC1ToAVCOTI(h.videoCodec)),s.push(h)}else if(i[3]){var d=new l.AttrList(i[3]);d["DATA-ID"]&&(a=!0,n[d["DATA-ID"]]=d)}return{levels:s,sessionData:a?n:null}},e.parseMasterPlaylistMedia=function(t,r,i,s){var n;void 0===s&&(s=[]);var a=[],o=0;for(d.lastIndex=0;null!==(n=d.exec(t));){var h=new l.AttrList(n[1]);if(h.TYPE===i){var u={attrs:h,bitrate:0,id:o++,groupId:h["GROUP-ID"],instreamId:h["INSTREAM-ID"],name:h.NAME||h.LANGUAGE||"",type:i,default:h.bool("DEFAULT"),autoselect:h.bool("AUTOSELECT"),forced:h.bool("FORCED"),lang:h.LANGUAGE,url:h.URI?e.resolve(h.URI,r):""};if(s.length){var c=e.findGroup(s,u.groupId)||s[0];y(u,c,"audioCodec"),y(u,c,"textCodec")}a.push(u)}}return a},e.parseLevelPlaylist=function(e,t,r,u,c){var d,v,m,y=new a.LevelDetails(t),S=y.fragments,T=null,b=0,_=0,L=0,A=0,D=null,w=new n.Fragment(u,t),I=-1,P=!1;for(f.lastIndex=0,y.m3u8=e;null!==(d=f.exec(e));){P&&(P=!1,(w=new n.Fragment(u,t)).start=L,w.sn=b,w.cc=A,w.level=r,T&&(w.initSegment=T,w.rawProgramDateTime=T.rawProgramDateTime));var R=d[1];if(R){w.duration=parseFloat(R);var C=(" "+d[2]).slice(1);w.title=C||null,w.tagList.push(C?["INF",R,C]:["INF",R])}else if(d[3])Object(i.isFiniteNumber)(w.duration)&&(w.start=L,m&&(w.levelkey=m),w.sn=b,w.level=r,w.cc=A,w.urlId=c,S.push(w),w.relurl=(" "+d[3]).slice(1),E(w,D),D=w,L+=w.duration,b++,_=0,P=!0);else if(d[4]){var k=(" "+d[4]).slice(1);D?w.setByteRange(k,D):w.setByteRange(k)}else if(d[5])w.rawProgramDateTime=(" "+d[5]).slice(1),w.tagList.push(["PROGRAM-DATE-TIME",w.rawProgramDateTime]),-1===I&&(I=S.length);else{if(!(d=d[0].match(g))){h.logger.warn("No matches on slow regex match for level playlist!");continue}for(v=1;v-1){h.logger.warn("Keyformat "+V+" is not supported from the manifest");continue}if("identity"!==V)continue;H&&(m=o.LevelKey.fromURL(t,$),$&&["AES-128","SAMPLE-AES","SAMPLE-AES-CENC"].indexOf(H)>=0&&(m.method=H,m.keyFormat=V,q&&(m.keyID=q),K&&(m.keyFormatVersions=K),m.iv=W));break;case"START":var z=new l.AttrList(M).decimalFloatingPoint("TIME-OFFSET");Object(i.isFiniteNumber)(z)&&(y.startTimeOffset=z);break;case"MAP":var Y=new l.AttrList(M);w.relurl=Y.URI,Y.BYTERANGE&&w.setByteRange(Y.BYTERANGE),w.level=r,w.sn="initSegment",m&&(w.levelkey=m),w.initSegment=null,T=w,P=!0;break;case"SERVER-CONTROL":var X=new l.AttrList(M);y.canBlockReload=X.bool("CAN-BLOCK-RELOAD"),y.canSkipUntil=X.optionalFloat("CAN-SKIP-UNTIL",0),y.canSkipDateRanges=y.canSkipUntil>0&&X.bool("CAN-SKIP-DATERANGES"),y.partHoldBack=X.optionalFloat("PART-HOLD-BACK",0),y.holdBack=X.optionalFloat("HOLD-BACK",0);break;case"PART-INF":var Q=new l.AttrList(M);y.partTarget=Q.decimalFloatingPoint("PART-TARGET");break;case"PART":var J=y.partList;J||(J=y.partList=[]);var Z=_>0?J[J.length-1]:void 0,ee=_++,te=new n.Part(new l.AttrList(M),w,t,ee,Z);J.push(te),w.duration+=te.duration;break;case"PRELOAD-HINT":var re=new l.AttrList(M);y.preloadHint=re;break;case"RENDITION-REPORT":var ie=new l.AttrList(M);y.renditionReports=y.renditionReports||[],y.renditionReports.push(ie);break;default:h.logger.warn("line parsed but not handled: "+d)}}}D&&!D.relurl?(S.pop(),L-=D.duration,y.partList&&(y.fragmentHint=D)):y.partList&&(E(w,D),w.cc=A,y.fragmentHint=w);var se=S.length,ne=S[0],ae=S[se-1];if((L+=y.skippedSegments*y.targetduration)>0&&se&&ae){y.averagetargetduration=L/se;var oe=ae.sn;y.endSN="initSegment"!==oe?oe:0,ne&&(y.startCC=ne.cc,ne.initSegment||y.fragments.every((function(e){return e.relurl&&(t=e.relurl,p.test(null!=(r=null===(i=s.parseURL(t))||void 0===i?void 0:i.path)?r:""));var t,r,i}))&&(h.logger.warn("MP4 fragments found but no init segment (probably no MAP, incomplete M3U8), trying to fetch SIDX"),(w=new n.Fragment(u,t)).relurl=ae.relurl,w.level=r,w.sn="initSegment",ne.initSegment=w,y.needSidxRanges=!0))}else y.endSN=0,y.startCC=0;return y.fragmentHint&&(L+=y.fragmentHint.duration),y.totalduration=L,y.endCC=A,I>0&&function(e,t){for(var r=e[t],i=t;i--;){var s=e[i];if(!s)return;s.programDateTime=r.programDateTime-1e3*s.duration,r=s}}(S,I),y},e}();function m(e,t){["video","audio","text"].forEach((function(r){var i=e.filter((function(e){return Object(u.isCodecType)(e,r)}));if(i.length){var s=i.filter((function(e){return 0===e.lastIndexOf("avc1",0)||0===e.lastIndexOf("mp4a",0)}));t[r+"Codec"]=s.length>0?s[0]:i[0],e=e.filter((function(e){return-1===i.indexOf(e)}))}})),t.unknownCodecs=e}function y(e,t,r){var i=t[r];i&&(e[r]=i)}function E(e,t){e.rawProgramDateTime?e.programDateTime=Date.parse(e.rawProgramDateTime):null!=t&&t.programDateTime&&(e.programDateTime=t.endProgramDateTime),Object(i.isFiniteNumber)(e.programDateTime)||(e.programDateTime=null,e.rawProgramDateTime=null)}},"./src/loader/playlist-loader.ts":function(e,t,r){"use strict";r.r(t);var i=r("./src/polyfills/number.ts"),s=r("./src/events.ts"),n=r("./src/errors.ts"),a=r("./src/utils/logger.ts"),o=r("./src/utils/mp4-tools.ts"),l=r("./src/loader/m3u8-parser.ts"),h=r("./src/types/loader.ts"),u=r("./src/utils/attr-list.ts");function c(e,t){var r=e.url;return void 0!==r&&0!==r.indexOf("data:")||(r=t.url),r}var d=function(){function e(e){this.hls=void 0,this.loaders=Object.create(null),this.hls=e,this.registerListeners()}var t=e.prototype;return t.registerListeners=function(){var e=this.hls;e.on(s.Events.MANIFEST_LOADING,this.onManifestLoading,this),e.on(s.Events.LEVEL_LOADING,this.onLevelLoading,this),e.on(s.Events.AUDIO_TRACK_LOADING,this.onAudioTrackLoading,this),e.on(s.Events.SUBTITLE_TRACK_LOADING,this.onSubtitleTrackLoading,this)},t.unregisterListeners=function(){var e=this.hls;e.off(s.Events.MANIFEST_LOADING,this.onManifestLoading,this),e.off(s.Events.LEVEL_LOADING,this.onLevelLoading,this),e.off(s.Events.AUDIO_TRACK_LOADING,this.onAudioTrackLoading,this),e.off(s.Events.SUBTITLE_TRACK_LOADING,this.onSubtitleTrackLoading,this)},t.createInternalLoader=function(e){var t=this.hls.config,r=t.pLoader,i=t.loader,s=new(r||i)(t);return e.loader=s,this.loaders[e.type]=s,s},t.getInternalLoader=function(e){return this.loaders[e.type]},t.resetInternalLoader=function(e){this.loaders[e]&&delete this.loaders[e]},t.destroyInternalLoaders=function(){for(var e in this.loaders){var t=this.loaders[e];t&&t.destroy(),this.resetInternalLoader(e)}},t.destroy=function(){this.unregisterListeners(),this.destroyInternalLoaders()},t.onManifestLoading=function(e,t){var r=t.url;this.load({id:null,groupId:null,level:0,responseType:"text",type:h.PlaylistContextType.MANIFEST,url:r,deliveryDirectives:null})},t.onLevelLoading=function(e,t){var r=t.id,i=t.level,s=t.url,n=t.deliveryDirectives;this.load({id:r,groupId:null,level:i,responseType:"text",type:h.PlaylistContextType.LEVEL,url:s,deliveryDirectives:n})},t.onAudioTrackLoading=function(e,t){var r=t.id,i=t.groupId,s=t.url,n=t.deliveryDirectives;this.load({id:r,groupId:i,level:null,responseType:"text",type:h.PlaylistContextType.AUDIO_TRACK,url:s,deliveryDirectives:n})},t.onSubtitleTrackLoading=function(e,t){var r=t.id,i=t.groupId,s=t.url,n=t.deliveryDirectives;this.load({id:r,groupId:i,level:null,responseType:"text",type:h.PlaylistContextType.SUBTITLE_TRACK,url:s,deliveryDirectives:n})},t.load=function(e){var t,r,i,s,n,o,l=this.hls.config,u=this.getInternalLoader(e);if(u){var c=u.context;if(c&&c.url===e.url)return void a.logger.trace("[playlist-loader]: playlist request ongoing");a.logger.log("[playlist-loader]: aborting previous loader for type: "+e.type),u.abort()}switch(e.type){case h.PlaylistContextType.MANIFEST:r=l.manifestLoadingMaxRetry,i=l.manifestLoadingTimeOut,s=l.manifestLoadingRetryDelay,n=l.manifestLoadingMaxRetryTimeout;break;case h.PlaylistContextType.LEVEL:case h.PlaylistContextType.AUDIO_TRACK:case h.PlaylistContextType.SUBTITLE_TRACK:r=0,i=l.levelLoadingTimeOut;break;default:r=l.levelLoadingMaxRetry,i=l.levelLoadingTimeOut,s=l.levelLoadingRetryDelay,n=l.levelLoadingMaxRetryTimeout}if(u=this.createInternalLoader(e),null!==(t=e.deliveryDirectives)&&void 0!==t&&t.part&&(e.type===h.PlaylistContextType.LEVEL&&null!==e.level?o=this.hls.levels[e.level].details:e.type===h.PlaylistContextType.AUDIO_TRACK&&null!==e.id?o=this.hls.audioTracks[e.id].details:e.type===h.PlaylistContextType.SUBTITLE_TRACK&&null!==e.id&&(o=this.hls.subtitleTracks[e.id].details),o)){var d=o.partTarget,f=o.targetduration;d&&f&&(i=Math.min(1e3*Math.max(3*d,.8*f),i))}var g={timeout:i,maxRetry:r,retryDelay:s,maxRetryDelay:n,highWaterMark:0},p={onSuccess:this.loadsuccess.bind(this),onError:this.loaderror.bind(this),onTimeout:this.loadtimeout.bind(this)};u.load(e,g,p)},t.loadsuccess=function(e,t,r,i){if(void 0===i&&(i=null),r.isSidxRequest)return this.handleSidxRequest(e,r),void this.handlePlaylistLoaded(e,t,r,i);this.resetInternalLoader(r.type);var s=e.data;0===s.indexOf("#EXTM3U")?(t.parsing.start=performance.now(),s.indexOf("#EXTINF:")>0||s.indexOf("#EXT-X-TARGETDURATION:")>0?this.handleTrackOrLevelPlaylist(e,t,r,i):this.handleMasterPlaylist(e,t,r,i)):this.handleManifestParsingError(e,r,"no EXTM3U delimiter",i)},t.loaderror=function(e,t,r){void 0===r&&(r=null),this.handleNetworkError(t,r,!1,e)},t.loadtimeout=function(e,t,r){void 0===r&&(r=null),this.handleNetworkError(t,r,!0)},t.handleMasterPlaylist=function(e,t,r,i){var n=this.hls,o=e.data,h=c(e,r),d=l.default.parseMasterPlaylist(o,h),f=d.levels,g=d.sessionData;if(f.length){var p=f.map((function(e){return{id:e.attrs.AUDIO,audioCodec:e.audioCodec}})),v=f.map((function(e){return{id:e.attrs.SUBTITLES,textCodec:e.textCodec}})),m=l.default.parseMasterPlaylistMedia(o,h,"AUDIO",p),y=l.default.parseMasterPlaylistMedia(o,h,"SUBTITLES",v),E=l.default.parseMasterPlaylistMedia(o,h,"CLOSED-CAPTIONS");m.length&&(m.some((function(e){return!e.url}))||!f[0].audioCodec||f[0].attrs.AUDIO||(a.logger.log("[playlist-loader]: audio codec signaled in quality level, but no embedded audio track signaled, create one"),m.unshift({type:"main",name:"main",default:!1,autoselect:!1,forced:!1,id:-1,attrs:new u.AttrList({}),bitrate:0,url:""}))),n.trigger(s.Events.MANIFEST_LOADED,{levels:f,audioTracks:m,subtitles:y,captions:E,url:h,stats:t,networkDetails:i,sessionData:g})}else this.handleManifestParsingError(e,r,"no level found in manifest",i)},t.handleTrackOrLevelPlaylist=function(e,t,r,a){var o=this.hls,d=r.id,f=r.level,g=r.type,p=c(e,r),v=Object(i.isFiniteNumber)(d)?d:0,m=Object(i.isFiniteNumber)(f)?f:v,y=function(e){switch(e.type){case h.PlaylistContextType.AUDIO_TRACK:return h.PlaylistLevelType.AUDIO;case h.PlaylistContextType.SUBTITLE_TRACK:return h.PlaylistLevelType.SUBTITLE;default:return h.PlaylistLevelType.MAIN}}(r),E=l.default.parseLevelPlaylist(e.data,p,m,y,v);if(E.fragments.length){if(g===h.PlaylistContextType.MANIFEST){var S={attrs:new u.AttrList({}),bitrate:0,details:E,name:"",url:p};o.trigger(s.Events.MANIFEST_LOADED,{levels:[S],audioTracks:[],url:p,stats:t,networkDetails:a,sessionData:null})}if(t.parsing.end=performance.now(),E.needSidxRanges){var T,b=null===(T=E.fragments[0].initSegment)||void 0===T?void 0:T.url;this.load({url:b,isSidxRequest:!0,type:g,level:f,levelDetails:E,id:d,groupId:null,rangeStart:0,rangeEnd:2048,responseType:"arraybuffer",deliveryDirectives:null})}else r.levelDetails=E,this.handlePlaylistLoaded(e,t,r,a)}else o.trigger(s.Events.ERROR,{type:n.ErrorTypes.NETWORK_ERROR,details:n.ErrorDetails.LEVEL_EMPTY_ERROR,fatal:!1,url:p,reason:"no fragments found in level",level:"number"==typeof r.level?r.level:void 0})},t.handleSidxRequest=function(e,t){var r=Object(o.parseSegmentIndex)(new Uint8Array(e.data));if(r){var i=r.references,s=t.levelDetails;i.forEach((function(e,t){var i=e.info,n=s.fragments[t];0===n.byteRange.length&&n.setByteRange(String(1+i.end-i.start)+"@"+String(i.start)),n.initSegment&&n.initSegment.setByteRange(String(r.moovEndOffset)+"@0")}))}},t.handleManifestParsingError=function(e,t,r,i){this.hls.trigger(s.Events.ERROR,{type:n.ErrorTypes.NETWORK_ERROR,details:n.ErrorDetails.MANIFEST_PARSING_ERROR,fatal:t.type===h.PlaylistContextType.MANIFEST,url:e.url,reason:r,response:e,context:t,networkDetails:i})},t.handleNetworkError=function(e,t,r,i){void 0===r&&(r=!1),a.logger.warn("[playlist-loader]: A network "+(r?"timeout":"error")+" occurred while loading "+e.type+" level: "+e.level+" id: "+e.id+' group-id: "'+e.groupId+'"');var o=n.ErrorDetails.UNKNOWN,l=!1,u=this.getInternalLoader(e);switch(e.type){case h.PlaylistContextType.MANIFEST:o=r?n.ErrorDetails.MANIFEST_LOAD_TIMEOUT:n.ErrorDetails.MANIFEST_LOAD_ERROR,l=!0;break;case h.PlaylistContextType.LEVEL:o=r?n.ErrorDetails.LEVEL_LOAD_TIMEOUT:n.ErrorDetails.LEVEL_LOAD_ERROR,l=!1;break;case h.PlaylistContextType.AUDIO_TRACK:o=r?n.ErrorDetails.AUDIO_TRACK_LOAD_TIMEOUT:n.ErrorDetails.AUDIO_TRACK_LOAD_ERROR,l=!1;break;case h.PlaylistContextType.SUBTITLE_TRACK:o=r?n.ErrorDetails.SUBTITLE_TRACK_LOAD_TIMEOUT:n.ErrorDetails.SUBTITLE_LOAD_ERROR,l=!1}u&&this.resetInternalLoader(e.type);var c={type:n.ErrorTypes.NETWORK_ERROR,details:o,fatal:l,url:e.url,loader:u,context:e,networkDetails:t};i&&(c.response=i),this.hls.trigger(s.Events.ERROR,c)},t.handlePlaylistLoaded=function(e,t,r,i){var n=r.type,a=r.level,o=r.id,l=r.groupId,u=r.loader,c=r.levelDetails,d=r.deliveryDirectives;if(null!=c&&c.targetduration){if(u)switch(c.live&&(u.getCacheAge&&(c.ageHeader=u.getCacheAge()||0),u.getCacheAge&&!isNaN(c.ageHeader)||(c.ageHeader=0)),n){case h.PlaylistContextType.MANIFEST:case h.PlaylistContextType.LEVEL:this.hls.trigger(s.Events.LEVEL_LOADED,{details:c,level:a||0,id:o||0,stats:t,networkDetails:i,deliveryDirectives:d});break;case h.PlaylistContextType.AUDIO_TRACK:this.hls.trigger(s.Events.AUDIO_TRACK_LOADED,{details:c,id:o||0,groupId:l||"",stats:t,networkDetails:i,deliveryDirectives:d});break;case h.PlaylistContextType.SUBTITLE_TRACK:this.hls.trigger(s.Events.SUBTITLE_TRACK_LOADED,{details:c,id:o||0,groupId:l||"",stats:t,networkDetails:i,deliveryDirectives:d})}}else this.handleManifestParsingError(e,r,"invalid target duration",i)},e}();t.default=d},"./src/polyfills/number.ts":function(e,t,r){"use strict";r.r(t),r.d(t,"isFiniteNumber",(function(){return i})),r.d(t,"MAX_SAFE_INTEGER",(function(){return s}));var i=Number.isFinite||function(e){return"number"==typeof e&&isFinite(e)},s=Number.MAX_SAFE_INTEGER||9007199254740991},"./src/remux/aac-helper.ts":function(e,t,r){"use strict";r.r(t);var i=function(){function e(){}return e.getSilentFrame=function(e,t){if("mp4a.40.2"===e){if(1===t)return new Uint8Array([0,200,0,128,35,128]);if(2===t)return new Uint8Array([33,0,73,144,2,25,0,35,128]);if(3===t)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,142]);if(4===t)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,128,44,128,8,2,56]);if(5===t)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,130,48,4,153,0,33,144,2,56]);if(6===t)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,130,48,4,153,0,33,144,2,0,178,0,32,8,224])}else{if(1===t)return new Uint8Array([1,64,34,128,163,78,230,128,186,8,0,0,0,28,6,241,193,10,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,94]);if(2===t)return new Uint8Array([1,64,34,128,163,94,230,128,186,8,0,0,0,0,149,0,6,241,161,10,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,94]);if(3===t)return new Uint8Array([1,64,34,128,163,94,230,128,186,8,0,0,0,0,149,0,6,241,161,10,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,94])}},e}();t.default=i},"./src/remux/mp4-generator.ts":function(e,t,r){"use strict";r.r(t);var i=Math.pow(2,32)-1,s=function(){function e(){}return e.init=function(){var t;for(t in e.types={avc1:[],avcC:[],btrt:[],dinf:[],dref:[],esds:[],ftyp:[],hdlr:[],mdat:[],mdhd:[],mdia:[],mfhd:[],minf:[],moof:[],moov:[],mp4a:[],".mp3":[],mvex:[],mvhd:[],pasp:[],sdtp:[],stbl:[],stco:[],stsc:[],stsd:[],stsz:[],stts:[],tfdt:[],tfhd:[],traf:[],trak:[],trun:[],trex:[],tkhd:[],vmhd:[],smhd:[]},e.types)e.types.hasOwnProperty(t)&&(e.types[t]=[t.charCodeAt(0),t.charCodeAt(1),t.charCodeAt(2),t.charCodeAt(3)]);var r=new Uint8Array([0,0,0,0,0,0,0,0,118,105,100,101,0,0,0,0,0,0,0,0,0,0,0,0,86,105,100,101,111,72,97,110,100,108,101,114,0]),i=new Uint8Array([0,0,0,0,0,0,0,0,115,111,117,110,0,0,0,0,0,0,0,0,0,0,0,0,83,111,117,110,100,72,97,110,100,108,101,114,0]);e.HDLR_TYPES={video:r,audio:i};var s=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,12,117,114,108,32,0,0,0,1]),n=new Uint8Array([0,0,0,0,0,0,0,0]);e.STTS=e.STSC=e.STCO=n,e.STSZ=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0]),e.VMHD=new Uint8Array([0,0,0,1,0,0,0,0,0,0,0,0]),e.SMHD=new Uint8Array([0,0,0,0,0,0,0,0]),e.STSD=new Uint8Array([0,0,0,0,0,0,0,1]);var a=new Uint8Array([105,115,111,109]),o=new Uint8Array([97,118,99,49]),l=new Uint8Array([0,0,0,1]);e.FTYP=e.box(e.types.ftyp,a,l,a,o),e.DINF=e.box(e.types.dinf,e.box(e.types.dref,s))},e.box=function(e){for(var t=8,r=arguments.length,i=new Array(r>1?r-1:0),s=1;s>24&255,o[1]=t>>16&255,o[2]=t>>8&255,o[3]=255&t,o.set(e,4),n=0,t=8;n>24&255,t>>16&255,t>>8&255,255&t,s>>24,s>>16&255,s>>8&255,255&s,n>>24,n>>16&255,n>>8&255,255&n,85,196,0,0]))},e.mdia=function(t){return e.box(e.types.mdia,e.mdhd(t.timescale,t.duration),e.hdlr(t.type),e.minf(t))},e.mfhd=function(t){return e.box(e.types.mfhd,new Uint8Array([0,0,0,0,t>>24,t>>16&255,t>>8&255,255&t]))},e.minf=function(t){return"audio"===t.type?e.box(e.types.minf,e.box(e.types.smhd,e.SMHD),e.DINF,e.stbl(t)):e.box(e.types.minf,e.box(e.types.vmhd,e.VMHD),e.DINF,e.stbl(t))},e.moof=function(t,r,i){return e.box(e.types.moof,e.mfhd(t),e.traf(i,r))},e.moov=function(t){for(var r=t.length,i=[];r--;)i[r]=e.trak(t[r]);return e.box.apply(null,[e.types.moov,e.mvhd(t[0].timescale,t[0].duration)].concat(i).concat(e.mvex(t)))},e.mvex=function(t){for(var r=t.length,i=[];r--;)i[r]=e.trex(t[r]);return e.box.apply(null,[e.types.mvex].concat(i))},e.mvhd=function(t,r){r*=t;var s=Math.floor(r/(i+1)),n=Math.floor(r%(i+1)),a=new Uint8Array([1,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,3,t>>24&255,t>>16&255,t>>8&255,255&t,s>>24,s>>16&255,s>>8&255,255&s,n>>24,n>>16&255,n>>8&255,255&n,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255]);return e.box(e.types.mvhd,a)},e.sdtp=function(t){var r,i,s=t.samples||[],n=new Uint8Array(4+s.length);for(r=0;r>>8&255),n.push(255&s),n=n.concat(Array.prototype.slice.call(i));for(r=0;r>>8&255),a.push(255&s),a=a.concat(Array.prototype.slice.call(i));var o=e.box(e.types.avcC,new Uint8Array([1,n[3],n[4],n[5],255,224|t.sps.length].concat(n).concat([t.pps.length]).concat(a))),l=t.width,h=t.height,u=t.pixelRatio[0],c=t.pixelRatio[1];return e.box(e.types.avc1,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,l>>8&255,255&l,h>>8&255,255&h,0,72,0,0,0,72,0,0,0,0,0,0,0,1,18,100,97,105,108,121,109,111,116,105,111,110,47,104,108,115,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,17,17]),o,e.box(e.types.btrt,new Uint8Array([0,28,156,128,0,45,198,192,0,45,198,192])),e.box(e.types.pasp,new Uint8Array([u>>24,u>>16&255,u>>8&255,255&u,c>>24,c>>16&255,c>>8&255,255&c])))},e.esds=function(e){var t=e.config.length;return new Uint8Array([0,0,0,0,3,23+t,0,1,0,4,15+t,64,21,0,0,0,0,0,0,0,0,0,0,0,5].concat([t]).concat(e.config).concat([6,1,2]))},e.mp4a=function(t){var r=t.samplerate;return e.box(e.types.mp4a,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,t.channelCount,0,16,0,0,0,0,r>>8&255,255&r,0,0]),e.box(e.types.esds,e.esds(t)))},e.mp3=function(t){var r=t.samplerate;return e.box(e.types[".mp3"],new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,t.channelCount,0,16,0,0,0,0,r>>8&255,255&r,0,0]))},e.stsd=function(t){return"audio"===t.type?t.isAAC||"mp3"!==t.codec?e.box(e.types.stsd,e.STSD,e.mp4a(t)):e.box(e.types.stsd,e.STSD,e.mp3(t)):e.box(e.types.stsd,e.STSD,e.avc1(t))},e.tkhd=function(t){var r=t.id,s=t.duration*t.timescale,n=t.width,a=t.height,o=Math.floor(s/(i+1)),l=Math.floor(s%(i+1));return e.box(e.types.tkhd,new Uint8Array([1,0,0,7,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,3,r>>24&255,r>>16&255,r>>8&255,255&r,0,0,0,0,o>>24,o>>16&255,o>>8&255,255&o,l>>24,l>>16&255,l>>8&255,255&l,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,n>>8&255,255&n,0,0,a>>8&255,255&a,0,0]))},e.traf=function(t,r){var s=e.sdtp(t),n=t.id,a=Math.floor(r/(i+1)),o=Math.floor(r%(i+1));return e.box(e.types.traf,e.box(e.types.tfhd,new Uint8Array([0,0,0,0,n>>24,n>>16&255,n>>8&255,255&n])),e.box(e.types.tfdt,new Uint8Array([1,0,0,0,a>>24,a>>16&255,a>>8&255,255&a,o>>24,o>>16&255,o>>8&255,255&o])),e.trun(t,s.length+16+20+8+16+8+8),s)},e.trak=function(t){return t.duration=t.duration||4294967295,e.box(e.types.trak,e.tkhd(t),e.mdia(t))},e.trex=function(t){var r=t.id;return e.box(e.types.trex,new Uint8Array([0,0,0,0,r>>24,r>>16&255,r>>8&255,255&r,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1]))},e.trun=function(t,r){var i,s,n,a,o,l,h=t.samples||[],u=h.length,c=12+16*u,d=new Uint8Array(c);for(r+=8+c,d.set([0,0,15,1,u>>>24&255,u>>>16&255,u>>>8&255,255&u,r>>>24&255,r>>>16&255,r>>>8&255,255&r],0),i=0;i>>24&255,n>>>16&255,n>>>8&255,255&n,a>>>24&255,a>>>16&255,a>>>8&255,255&a,o.isLeading<<2|o.dependsOn,o.isDependedOn<<6|o.hasRedundancy<<4|o.paddingValue<<1|o.isNonSync,61440&o.degradPrio,15&o.degradPrio,l>>>24&255,l>>>16&255,l>>>8&255,255&l],12+16*i);return e.box(e.types.trun,d)},e.initSegment=function(t){e.types||e.init();var r=e.moov(t),i=new Uint8Array(e.FTYP.byteLength+r.byteLength);return i.set(e.FTYP),i.set(r,e.FTYP.byteLength),i},e}();s.types=void 0,s.HDLR_TYPES=void 0,s.STTS=void 0,s.STSC=void 0,s.STCO=void 0,s.STSZ=void 0,s.VMHD=void 0,s.SMHD=void 0,s.STSD=void 0,s.FTYP=void 0,s.DINF=void 0,t.default=s},"./src/remux/mp4-remuxer.ts":function(e,t,r){"use strict";r.r(t),r.d(t,"default",(function(){return p})),r.d(t,"normalizePts",(function(){return v}));var i=r("./src/polyfills/number.ts"),s=r("./src/remux/aac-helper.ts"),n=r("./src/remux/mp4-generator.ts"),a=r("./src/events.ts"),o=r("./src/errors.ts"),l=r("./src/utils/logger.ts"),h=r("./src/types/loader.ts"),u=r("./src/utils/timescale-conversion.ts");function c(){return c=Object.assign||function(e){for(var t=1;t0?e:r.pts}),e[0].pts);return t&&l.logger.debug("PTS rollover detected"),r},t.remux=function(e,t,r,i,s,n,a,o){var u,c,d,f,g,p,m=s,y=s,E=e.pid>-1,S=t.pid>-1,T=t.samples.length,b=e.samples.length>0,_=T>1;if((!E||b)&&(!S||_)||this.ISGenerated||a){this.ISGenerated||(d=this.generateIS(e,t,s));var L=this.isVideoContiguous,A=-1;if(_&&(A=function(e){for(var t=0;t0){l.logger.warn("[mp4-remuxer]: Dropped "+A+" out of "+T+" video samples due to a missing keyframe");var D=this.getVideoStartPts(t.samples);t.samples=t.samples.slice(A),t.dropped+=A,y+=(t.samples[0].pts-D)/(t.timescale||9e4)}else-1===A&&(l.logger.warn("[mp4-remuxer]: No keyframe found out of "+T+" video samples"),p=!1);if(this.ISGenerated){if(b&&_){var w=this.getVideoStartPts(t.samples),I=(v(e.samples[0].pts,w)-w)/t.inputTimeScale;m+=Math.max(0,I),y+=Math.max(0,-I)}if(b){if(e.samplerate||(l.logger.warn("[mp4-remuxer]: regenerate InitSegment as audio detected"),d=this.generateIS(e,t,s)),c=this.remuxAudio(e,m,this.isAudioContiguous,n,S||_||o===h.PlaylistLevelType.AUDIO?y:void 0),_){var P=c?c.endPTS-c.startPTS:0;t.inputTimeScale||(l.logger.warn("[mp4-remuxer]: regenerate InitSegment as video detected"),d=this.generateIS(e,t,s)),u=this.remuxVideo(t,y,L,P)}}else _&&(u=this.remuxVideo(t,y,L,0));u&&(u.firstKeyFrame=A,u.independent=-1!==A)}}return this.ISGenerated&&(r.samples.length&&(g=this.remuxID3(r,s)),i.samples.length&&(f=this.remuxText(i,s))),{audio:c,video:u,initSegment:d,independent:p,text:f,id3:g}},t.generateIS=function(e,t,r){var s,a,o,l=e.samples,h=t.samples,u=this.typeSupported,c={},d=!Object(i.isFiniteNumber)(this._initPTS),f="audio/mp4";if(d&&(s=a=1/0),e.config&&l.length&&(e.timescale=e.samplerate,e.isAAC||(u.mpeg?(f="audio/mpeg",e.codec=""):u.mp3&&(e.codec="mp3")),c.audio={id:"audio",container:f,codec:e.codec,initSegment:!e.isAAC&&u.mpeg?new Uint8Array(0):n.default.initSegment([e]),metadata:{channelCount:e.channelCount}},d&&(o=e.inputTimeScale,s=a=l[0].pts-Math.round(o*r))),t.sps&&t.pps&&h.length&&(t.timescale=t.inputTimeScale,c.video={id:"main",container:"video/mp4",codec:t.codec,initSegment:n.default.initSegment([t]),metadata:{width:t.width,height:t.height}},d)){o=t.inputTimeScale;var g=this.getVideoStartPts(h),p=Math.round(o*r);a=Math.min(a,v(h[0].dts,g)-p),s=Math.min(s,g-p)}if(Object.keys(c).length)return this.ISGenerated=!0,d&&(this._initPTS=s,this._initDTS=a),{tracks:c,initPTS:s,timescale:o}},t.remuxVideo=function(e,t,r,i){var s,h,f,p=e.inputTimeScale,y=e.samples,E=[],S=y.length,T=this._initPTS,b=this.nextAvcDts,_=8,L=Number.POSITIVE_INFINITY,A=Number.NEGATIVE_INFINITY,D=0,w=!1;r&&null!==b||(b=t*p-(y[0].pts-v(y[0].dts,y[0].pts)));for(var I=0;IP.pts&&(D=Math.max(Math.min(D,P.pts-P.dts),-18e3)),P.dts0?I-1:I].dts&&(w=!0)}w&&y.sort((function(e,t){var r=e.dts-t.dts,i=e.pts-t.pts;return r||i})),h=y[0].dts,f=y[y.length-1].dts;var R=Math.round((f-h)/(S-1));if(D<0){if(D<-2*R){l.logger.warn("PTS < DTS detected in video samples, offsetting DTS from PTS by "+Object(u.toMsFromMpegTsClock)(-R,!0)+" ms");for(var C=D,k=0;kR;if(x||M<-1){x?l.logger.warn("AVC: "+Object(u.toMsFromMpegTsClock)(M,!0)+" ms ("+M+"dts) hole between fragments detected, filling it"):l.logger.warn("AVC: "+Object(u.toMsFromMpegTsClock)(-M,!0)+" ms ("+M+"dts) overlapping between fragments detected"),h=b;var F=y[0].pts-M;y[0].dts=h,y[0].pts=F,l.logger.log("Video: First PTS/DTS adjusted: "+Object(u.toMsFromMpegTsClock)(F,!0)+"/"+Object(u.toMsFromMpegTsClock)(h,!0)+", delta: "+Object(u.toMsFromMpegTsClock)(M,!0)+" ms")}}g&&(h=Math.max(0,h));for(var N=0,B=0,U=0;U0?z-1:z].dts;if(ie.stretchShortVideoTrack&&null!==this.nextAudioPts){var ne=Math.floor(ie.maxBufferHole*p),ae=(i?L+i*p:this.nextAudioPts)-Y.pts;ae>ne?((s=ae-se)<0&&(s=se),l.logger.log("[mp4-remuxer]: It is approximately "+ae/90+" ms to the next segment; using duration "+s/90+" ms for the last video frame.")):s=se}else s=se}var oe=Math.round(Y.pts-Y.dts);E.push(new m(Y.key,s,Q,oe))}if(E.length&&d&&d<70){var le=E[0].flags;le.dependsOn=2,le.isNonSync=0}console.assert(void 0!==s,"mp4SampleDuration must be computed"),this.nextAvcDts=b=f+s,this.isVideoContiguous=!0;var he={data1:n.default.moof(e.sequenceNumber++,h,c({},e,{samples:E})),data2:K,startPTS:L/p,endPTS:(A+s)/p,startDTS:h/p,endDTS:b/p,type:"video",hasAudio:!1,hasVideo:!0,nb:E.length,dropped:e.dropped};return e.samples=[],e.dropped=0,console.assert(K.length,"MDAT length must not be zero"),he},t.remuxAudio=function(e,t,r,i,h){var u=e.inputTimeScale,d=u/(e.samplerate?e.samplerate:u),f=e.isAAC?1024:1152,g=f*d,p=this._initPTS,y=!e.isAAC&&this.typeSupported.mpeg,E=[],S=e.samples,T=y?0:8,b=this.nextAudioPts||-1,_=t*u;if(this.isAudioContiguous=r=r||S.length&&b>0&&(i&&Math.abs(_-b)<9e3||Math.abs(v(S[0].pts-p,_)-b)<20*g),S.forEach((function(e){e.pts=v(e.pts-p,_)})),!r||b<0){if(S=S.filter((function(e){return e.pts>=0})),!S.length)return;b=0===h?0:i?Math.max(0,_):S[0].pts}if(e.isAAC)for(var L=void 0!==h,A=this.config.maxAudioFramesDrift,D=0,w=b;D=A*g&&C<1e4&&L){var k=Math.round(R/g);(w=P-k*g)<0&&(k--,w+=g),0===D&&(this.nextAudioPts=b=w),l.logger.warn("[mp4-remuxer]: Injecting "+k+" audio frame @ "+(w/u).toFixed(3)+"s due to "+Math.round(1e3*R/u)+" ms gap.");for(var O=0;O0))return;U+=T;try{F=new Uint8Array(U)}catch(e){return void this.observer.emit(a.Events.ERROR,a.Events.ERROR,{type:o.ErrorTypes.MUX_ERROR,details:o.ErrorDetails.REMUX_ALLOC_ERROR,fatal:!1,bytes:U,reason:"fail allocating audio mdat "+U})}y||(new DataView(F.buffer).setUint32(0,U),F.set(n.default.types.mdat,4))}F.set(W,T);var q=W.byteLength;T+=q,E.push(new m(!0,f,q,0)),B=K}var V=E.length;if(V){var z=E[E.length-1];this.nextAudioPts=b=B+d*z.duration;var Y=y?new Uint8Array(0):n.default.moof(e.sequenceNumber++,N/d,c({},e,{samples:E}));e.samples=[];var X=N/u,Q=b/u,J={data1:Y,data2:F,startPTS:X,endPTS:Q,startDTS:X,endDTS:Q,type:"audio",hasAudio:!0,hasVideo:!1,nb:V};return this.isAudioContiguous=!0,console.assert(F.length,"MDAT length must not be zero"),J}},t.remuxEmptyAudio=function(e,t,r,i){var n=e.inputTimeScale,a=n/(e.samplerate?e.samplerate:n),o=this.nextAudioPts,h=(null!==o?o:i.startDTS*n)+this._initDTS,u=i.endDTS*n+this._initDTS,c=1024*a,d=Math.ceil((u-h)/c),f=s.default.getSilentFrame(e.manifestCodec||e.codec,e.channelCount);if(l.logger.warn("[mp4-remuxer]: remux empty Audio"),f){for(var g=[],p=0;p4294967296;)e+=r;return e}var m=function(e,t,r,i){this.size=void 0,this.duration=void 0,this.cts=void 0,this.flags=void 0,this.duration=t,this.size=r,this.cts=i,this.flags=new y(e)},y=function(e){this.isLeading=0,this.isDependedOn=0,this.hasRedundancy=0,this.degradPrio=0,this.dependsOn=1,this.isNonSync=1,this.dependsOn=e?2:1,this.isNonSync=e?0:1}},"./src/remux/passthrough-remuxer.ts":function(e,t,r){"use strict";r.r(t);var i=r("./src/polyfills/number.ts"),s=r("./src/utils/mp4-tools.ts"),n=r("./src/loader/fragment.ts"),a=r("./src/utils/logger.ts"),o=function(){function e(){this.emitInitSegment=!1,this.audioCodec=void 0,this.videoCodec=void 0,this.initData=void 0,this.initPTS=void 0,this.initTracks=void 0,this.lastEndDTS=null}var t=e.prototype;return t.destroy=function(){},t.resetTimeStamp=function(e){this.initPTS=e,this.lastEndDTS=null},t.resetNextTimestamp=function(){this.lastEndDTS=null},t.resetInitSegment=function(e,t,r){this.audioCodec=t,this.videoCodec=r,this.generateInitSegment(e),this.emitInitSegment=!0},t.generateInitSegment=function(e){var t=this.audioCodec,r=this.videoCodec;if(!e||!e.byteLength)return this.initTracks=void 0,void(this.initData=void 0);var i=this.initData=Object(s.parseInitSegment)(e);t||(t=h(i.audio,n.ElementaryStreamTypes.AUDIO)),r||(r=h(i.video,n.ElementaryStreamTypes.VIDEO));var o={};i.audio&&i.video?o.audiovideo={container:"video/mp4",codec:t+","+r,initSegment:e,id:"main"}:i.audio?o.audio={container:"audio/mp4",codec:t,initSegment:e,id:"audio"}:i.video?o.video={container:"video/mp4",codec:r,initSegment:e,id:"main"}:a.logger.warn("[passthrough-remuxer.ts]: initSegment does not contain moov or trak boxes."),this.initTracks=o},t.remux=function(e,t,r,n,o){var h=this.initPTS,u=this.lastEndDTS,c={audio:void 0,video:void 0,text:n,id3:r,initSegment:void 0};Object(i.isFiniteNumber)(u)||(u=this.lastEndDTS=o||0);var d=t.samples;if(!d||!d.length)return c;var f={initPTS:void 0,timescale:1},g=this.initData;if(g&&g.length||(this.generateInitSegment(d),g=this.initData),!g||!g.length)return a.logger.warn("[passthrough-remuxer.ts]: Failed to generate initSegment."),c;this.emitInitSegment&&(f.tracks=this.initTracks,this.emitInitSegment=!1),Object(i.isFiniteNumber)(h)||(this.initPTS=f.initPTS=h=l(g,d,u));var p=Object(s.getDuration)(d,g),v=u,m=p+v;Object(s.offsetStartDTS)(g,d,h),p>0?this.lastEndDTS=m:(a.logger.warn("Duration parsed from mp4 should be greater than zero"),this.resetNextTimestamp());var y=!!g.audio,E=!!g.video,S="";y&&(S+="audio"),E&&(S+="video");var T={data1:d,startPTS:v,startDTS:v,endPTS:m,endDTS:m,type:S,hasAudio:y,hasVideo:E,nb:1,dropped:0};return c.audio="audio"===T.type?T:void 0,c.video="audio"!==T.type?T:void 0,c.text=n,c.id3=r,c.initSegment=f,c},e}(),l=function(e,t,r){return Object(s.getStartDTS)(e,t)-r};function h(e,t){var r=null==e?void 0:e.codec;return r&&r.length>4?r:"hvc1"===r?"hvc1.1.c.L120.90":"av01"===r?"av01.0.04M.08":"avc1"===r||t===n.ElementaryStreamTypes.VIDEO?"avc1.42e01e":"mp4a.40.5"}t.default=o},"./src/task-loop.ts":function(e,t,r){"use strict";r.r(t),r.d(t,"default",(function(){return i}));var i=function(){function e(){this._boundTick=void 0,this._tickTimer=null,this._tickInterval=null,this._tickCallCount=0,this._boundTick=this.tick.bind(this)}var t=e.prototype;return t.destroy=function(){this.onHandlerDestroying(),this.onHandlerDestroyed()},t.onHandlerDestroying=function(){this.clearNextTick(),this.clearInterval()},t.onHandlerDestroyed=function(){},t.hasInterval=function(){return!!this._tickInterval},t.hasNextTick=function(){return!!this._tickTimer},t.setInterval=function(e){return!this._tickInterval&&(this._tickInterval=self.setInterval(this._boundTick,e),!0)},t.clearInterval=function(){return!!this._tickInterval&&(self.clearInterval(this._tickInterval),this._tickInterval=null,!0)},t.clearNextTick=function(){return!!this._tickTimer&&(self.clearTimeout(this._tickTimer),this._tickTimer=null,!0)},t.tick=function(){this._tickCallCount++,1===this._tickCallCount&&(this.doTick(),this._tickCallCount>1&&this.tickImmediate(),this._tickCallCount=0)},t.tickImmediate=function(){this.clearNextTick(),this._tickTimer=self.setTimeout(this._boundTick,0)},t.doTick=function(){},e}()},"./src/types/cmcd.ts":function(e,t,r){"use strict";r.r(t),r.d(t,"CMCDVersion",(function(){return a})),r.d(t,"CMCDObjectType",(function(){return i})),r.d(t,"CMCDStreamingFormat",(function(){return s})),r.d(t,"CMCDStreamType",(function(){return n}));var i,s,n,a=1;!function(e){e.MANIFEST="m",e.AUDIO="a",e.VIDEO="v",e.MUXED="av",e.INIT="i",e.CAPTION="c",e.TIMED_TEXT="tt",e.KEY="k",e.OTHER="o"}(i||(i={})),function(e){e.DASH="d",e.HLS="h",e.SMOOTH="s",e.OTHER="o"}(s||(s={})),function(e){e.VOD="v",e.LIVE="l"}(n||(n={}))},"./src/types/level.ts":function(e,t,r){"use strict";function i(e,t){for(var r=0;rNumber.MAX_SAFE_INTEGER?1/0:t},t.hexadecimalInteger=function(e){if(this[e]){var t=(this[e]||"0x").slice(2);t=(1&t.length?"0":"")+t;for(var r=new Uint8Array(t.length/2),i=0;iNumber.MAX_SAFE_INTEGER?1/0:t},t.decimalFloatingPoint=function(e){return parseFloat(this[e])},t.optionalFloat=function(e,t){var r=this[e];return r?parseFloat(r):t},t.enumeratedString=function(e){return this[e]},t.bool=function(e){return"YES"===this[e]},t.decimalResolution=function(e){var t=i.exec(this[e]);if(null!==t)return{width:parseInt(t[1],10),height:parseInt(t[2],10)}},e.parseAttrList=function(e){var t,r={};for(s.lastIndex=0;null!==(t=s.exec(e));){var i=t[2];0===i.indexOf('"')&&i.lastIndexOf('"')===i.length-1&&(i=i.slice(1,-1)),r[t[1]]=i}return r},e}()},"./src/utils/binary-search.ts":function(e,t,r){"use strict";r.r(t),t.default={search:function(e,t){for(var r=0,i=e.length-1,s=null,n=null;r<=i;){var a=t(n=e[s=(r+i)/2|0]);if(a>0)r=s+1;else{if(!(a<0))return n;i=s-1}}return null}}},"./src/utils/buffer-helper.ts":function(e,t,r){"use strict";r.r(t),r.d(t,"BufferHelper",(function(){return n}));var i=r("./src/utils/logger.ts"),s={length:0,start:function(){return 0},end:function(){return 0}},n=function(){function e(){}return e.isBuffered=function(t,r){try{if(t)for(var i=e.getBuffered(t),s=0;s=i.start(s)&&r<=i.end(s))return!0}catch(e){}return!1},e.bufferInfo=function(t,r,i){try{if(t){var s,n=e.getBuffered(t),a=[];for(s=0;sa&&(i[n-1].end=e[s].end):i.push(e[s])}else i.push(e[s])}else i=e;for(var o,l=0,h=t,u=t,c=0;c=d&&t=e&&s.logger.log(this.time+" ["+e+"] "+t)},e}(),p=function(e){for(var t=[],r=0;rl&&(this.logger.log(i.DEBUG,"Too large cursor position "+this.pos),this.pos=l)},t.moveCursor=function(e){var t=this.pos+e;if(e>1)for(var r=this.pos+1;r=144&&this.backSpace();var t=a(e);this.pos>=l?this.logger.log(i.ERROR,"Cannot insert "+e.toString(16)+" ("+t+") at position "+this.pos+". Skipping it!"):(this.chars[this.pos].setChar(t,this.currPenState),this.moveCursor(1))},t.clearFromPos=function(e){var t;for(t=e;t0&&(r=e?"["+t.join(" | ")+"]":t.join("\n")),r},t.getTextAndFormat=function(){return this.rows},e}(),S=function(){function e(e,t,r){this.chNr=void 0,this.outputFilter=void 0,this.mode=void 0,this.verbose=void 0,this.displayedMemory=void 0,this.nonDisplayedMemory=void 0,this.lastOutputScreen=void 0,this.currRollUpRow=void 0,this.writeScreen=void 0,this.cueStartTime=void 0,this.logger=void 0,this.chNr=e,this.outputFilter=t,this.mode=null,this.verbose=0,this.displayedMemory=new E(r),this.nonDisplayedMemory=new E(r),this.lastOutputScreen=new E(r),this.currRollUpRow=this.displayedMemory.rows[14],this.writeScreen=this.displayedMemory,this.mode=null,this.cueStartTime=null,this.logger=r}var t=e.prototype;return t.reset=function(){this.mode=null,this.displayedMemory.reset(),this.nonDisplayedMemory.reset(),this.lastOutputScreen.reset(),this.outputFilter.reset(),this.currRollUpRow=this.displayedMemory.rows[14],this.writeScreen=this.displayedMemory,this.mode=null,this.cueStartTime=null},t.getHandler=function(){return this.outputFilter},t.setHandler=function(e){this.outputFilter=e},t.setPAC=function(e){this.writeScreen.setPAC(e)},t.setBkgData=function(e){this.writeScreen.setBkgData(e)},t.setMode=function(e){e!==this.mode&&(this.mode=e,this.logger.log(i.INFO,"MODE="+e),"MODE_POP-ON"===this.mode?this.writeScreen=this.nonDisplayedMemory:(this.writeScreen=this.displayedMemory,this.writeScreen.reset()),"MODE_ROLL-UP"!==this.mode&&(this.displayedMemory.nrRollUpRows=null,this.nonDisplayedMemory.nrRollUpRows=null),this.mode=e)},t.insertChars=function(e){for(var t=0;t=46,t.italics)t.foreground="white";else{var r=Math.floor(e/2)-16;t.foreground=["white","green","blue","cyan","red","yellow","magenta"][r]}this.logger.log(i.INFO,"MIDROW: "+JSON.stringify(t)),this.writeScreen.setPen(t)},t.outputDataUpdate=function(e){void 0===e&&(e=!1);var t=this.logger.time;null!==t&&this.outputFilter&&(null!==this.cueStartTime||this.displayedMemory.isEmpty()?this.displayedMemory.equals(this.lastOutputScreen)||(this.outputFilter.newCue(this.cueStartTime,t,this.lastOutputScreen),e&&this.outputFilter.dispatchCue&&this.outputFilter.dispatchCue(),this.cueStartTime=this.displayedMemory.isEmpty()?null:t):this.cueStartTime=t,this.lastOutputScreen.copy(this.displayedMemory))},t.cueSplitAtTime=function(e){this.outputFilter&&(this.displayedMemory.isEmpty()||(this.outputFilter.newCue&&this.outputFilter.newCue(this.cueStartTime,e,this.displayedMemory),this.cueStartTime=e))},e}(),T=function(){function e(e,t,r){this.channels=void 0,this.currentChannel=0,this.cmdHistory=void 0,this.logger=void 0;var i=new g;this.channels=[null,new S(e,t,i),new S(e+1,r,i)],this.cmdHistory={a:null,b:null},this.logger=i}var t=e.prototype;return t.getHandler=function(e){return this.channels[e].getHandler()},t.setHandler=function(e,t){this.channels[e].setHandler(t)},t.addData=function(e,t){var r,s,n,a=!1;this.logger.time=e;for(var o=0;o ("+p([s,n])+")"),(r=this.parseCmd(s,n))||(r=this.parseMidrow(s,n)),r||(r=this.parsePAC(s,n)),r||(r=this.parseBackgroundAttributes(s,n)),!r&&(a=this.parseChars(s,n))){var l=this.currentChannel;l&&l>0?this.channels[l].insertChars(a):this.logger.log(i.WARNING,"No channel found yet. TEXT-MODE?")}r||a||this.logger.log(i.WARNING,"Couldn't parse cleaned data "+p([s,n])+" orig: "+p([t[o],t[o+1]]))}},t.parseCmd=function(e,t){var r=this.cmdHistory;if(!((20===e||28===e||21===e||29===e)&&t>=32&&t<=47||(23===e||31===e)&&t>=33&&t<=35))return!1;if(_(e,t,r))return b(null,null,r),this.logger.log(i.DEBUG,"Repeated command ("+p([e,t])+") is dropped"),!0;var s=20===e||21===e||23===e?1:2,n=this.channels[s];return 20===e||21===e||28===e||29===e?32===t?n.ccRCL():33===t?n.ccBS():34===t?n.ccAOF():35===t?n.ccAON():36===t?n.ccDER():37===t?n.ccRU(2):38===t?n.ccRU(3):39===t?n.ccRU(4):40===t?n.ccFON():41===t?n.ccRDC():42===t?n.ccTR():43===t?n.ccRTD():44===t?n.ccEDM():45===t?n.ccCR():46===t?n.ccENM():47===t&&n.ccEOC():n.ccTO(t-32),b(e,t,r),this.currentChannel=s,!0},t.parseMidrow=function(e,t){var r=0;if((17===e||25===e)&&t>=32&&t<=47){if((r=17===e?1:2)!==this.currentChannel)return this.logger.log(i.ERROR,"Mismatch channel in midrow parsing"),!1;var s=this.channels[r];return!!s&&(s.ccMIDROW(t),this.logger.log(i.DEBUG,"MIDROW ("+p([e,t])+")"),!0)}return!1},t.parsePAC=function(e,t){var r,i=this.cmdHistory;if(!((e>=17&&e<=23||e>=25&&e<=31)&&t>=64&&t<=127||(16===e||24===e)&&t>=64&&t<=95))return!1;if(_(e,t,i))return b(null,null,i),!0;var s=e<=23?1:2;r=t>=64&&t<=95?1===s?h[e]:c[e]:1===s?u[e]:d[e];var n=this.channels[s];return!!n&&(n.setPAC(this.interpretPAC(r,t)),b(e,t,i),this.currentChannel=s,!0)},t.interpretPAC=function(e,t){var r,i={color:null,italics:!1,indent:null,underline:!1,row:e};return r=t>95?t-96:t-64,i.underline=1==(1&r),r<=13?i.color=["white","green","blue","cyan","red","yellow","magenta","white"][Math.floor(r/2)]:r<=15?(i.italics=!0,i.color="white"):i.indent=4*Math.floor((r-16)/2),i},t.parseChars=function(e,t){var r,s,n=null,o=null;if(e>=25?(r=2,o=e-8):(r=1,o=e),o>=17&&o<=19?(s=17===o?t+80:18===o?t+112:t+144,this.logger.log(i.INFO,"Special char '"+a(s)+"' in channel "+r),n=[s]):e>=32&&e<=127&&(n=0===t?[e]:[e,t]),n){var l=p(n);this.logger.log(i.DEBUG,"Char codes = "+l.join(",")),b(e,t,this.cmdHistory)}return n},t.parseBackgroundAttributes=function(e,t){var r;if(!((16===e||24===e)&&t>=32&&t<=47||(23===e||31===e)&&t>=45&&t<=47))return!1;var i={};16===e||24===e?(r=Math.floor((t-32)/2),i.background=f[r],t%2==1&&(i.background=i.background+"_semi")):45===t?i.background="transparent":(i.foreground="black",47===t&&(i.underline=!0));var s=e<=23?1:2;return this.channels[s].setBkgData(i),b(e,t,this.cmdHistory),!0},t.reset=function(){for(var e=0;e=16?c--:c++;var m=Object(i.fixLineBreaks)(d.trim()),y=Object(s.generateCueId)(t,r,m);e&&e.cues&&e.cues.getCueById(y)||((h=new g(t,r,m)).id=y,h.line=p+1,h.align="left",h.position=10+Math.min(80,10*Math.floor(8*c/32)),f.push(h))}return e&&f.length&&(f.sort((function(e,t){return"auto"===e.line||"auto"===t.line?0:e.line>8&&t.line>8?t.line-e.line:e.line-t.line})),f.forEach((function(t){return Object(n.addCueToTrack)(e,t)}))),f}};t.default=o},"./src/utils/discontinuities.ts":function(e,t,r){"use strict";r.r(t),r.d(t,"findFirstFragWithCC",(function(){return a})),r.d(t,"shouldAlignOnDiscontinuities",(function(){return o})),r.d(t,"findDiscontinuousReferenceFrag",(function(){return l})),r.d(t,"adjustSlidingStart",(function(){return u})),r.d(t,"alignStream",(function(){return c})),r.d(t,"alignPDT",(function(){return d})),r.d(t,"alignFragmentByPDTDelta",(function(){return f})),r.d(t,"alignMediaPlaylistByPDT",(function(){return g}));var i=r("./src/polyfills/number.ts"),s=r("./src/utils/logger.ts"),n=r("./src/controller/level-helper.ts");function a(e,t){for(var r=null,i=0,s=e.length;ir.startCC||e&&e.cc=this.minWeight_},t.getEstimate=function(){return this.canEstimate()?Math.min(this.fast_.getEstimate(),this.slow_.getEstimate()):this.defaultEstimate_},t.destroy=function(){},e}();t.default=s},"./src/utils/ewma.ts":function(e,t,r){"use strict";r.r(t);var i=function(){function e(e,t,r){void 0===t&&(t=0),void 0===r&&(r=0),this.halfLife=void 0,this.alpha_=void 0,this.estimate_=void 0,this.totalWeight_=void 0,this.halfLife=e,this.alpha_=e?Math.exp(Math.log(.5)/e):0,this.estimate_=t,this.totalWeight_=r}var t=e.prototype;return t.sample=function(e,t){var r=Math.pow(this.alpha_,e);this.estimate_=t*(1-r)+r*this.estimate_,this.totalWeight_+=e},t.getTotalWeight=function(){return this.totalWeight_},t.getEstimate=function(){if(this.alpha_){var e=1-Math.pow(this.alpha_,this.totalWeight_);if(e)return this.estimate_/e}return this.estimate_},e}();t.default=i},"./src/utils/fetch-loader.ts":function(e,t,r){"use strict";r.r(t),r.d(t,"fetchSupported",(function(){return d}));var i=r("./src/polyfills/number.ts"),s=r("./src/loader/load-stats.ts"),n=r("./src/demux/chunk-cache.ts");function a(e){var t="function"==typeof Map?new Map:void 0;return a=function(e){if(null===e||(r=e,-1===Function.toString.call(r).indexOf("[native code]")))return e;var r;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,i)}function i(){return o(e,arguments,u(this).constructor)}return i.prototype=Object.create(e.prototype,{constructor:{value:i,enumerable:!1,writable:!0,configurable:!0}}),h(i,e)},a(e)}function o(e,t,r){return o=l()?Reflect.construct:function(e,t,r){var i=[null];i.push.apply(i,t);var s=new(Function.bind.apply(e,i));return r&&h(s,r.prototype),s},o.apply(null,arguments)}function l(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}function h(e,t){return h=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},h(e,t)}function u(e){return u=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},u(e)}function c(){return c=Object.assign||function(e){for(var t=1;t=i&&s(t,r,a.flush(),e)):s(t,r,l,e),n()})).catch((function(){return Promise.reject()}))}()},e}();function g(e,t){return new self.Request(e.url,t)}var p=function(e){var t,r;function i(t,r,i){var s;return(s=e.call(this,t)||this).code=void 0,s.details=void 0,s.code=r,s.details=i,s}return r=e,(t=i).prototype=Object.create(r.prototype),t.prototype.constructor=t,h(t,r),i}(a(Error));t.default=f},"./src/utils/imsc1-ttml-parser.ts":function(e,t,r){"use strict";r.r(t),r.d(t,"IMSC1_CODEC",(function(){return u})),r.d(t,"parseIMSC1",(function(){return g}));var i=r("./src/utils/mp4-tools.ts"),s=r("./src/utils/vttparser.ts"),n=r("./src/utils/vttcue.ts"),a=r("./src/demux/id3.ts"),o=r("./src/utils/timescale-conversion.ts"),l=r("./src/utils/webvtt-parser.ts");function h(){return h=Object.assign||function(e){for(var t=1;t"):i}function o(e){if(self.console&&!0===e||"object"==typeof e){!function(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),i=1;i>24,e[t+1]=r>>16&255,e[t+2]=r>>8&255,e[t+3]=255&r}function c(e,t){var r,i,s,n=[];if(!t.length)return n;"data"in e?(r=e.data,i=e.start,s=e.end):(i=0,s=(r=e).byteLength);for(var l=i;l1?l+u:s;if(o(r.subarray(l+4,l+8))===t[0])if(1===t.length)n.push({data:r,start:l+8,end:d});else{var f=c({data:r,start:l+8,end:d},t.slice(1));f.length&&a.apply(n,f)}l=d}return n}function d(e){var t=c(e,["moov"])[0],r=t?t.end:null,i=c(e,["sidx"]);if(!i||!i[0])return null;var s=[],n=i[0],a=n.data[0],o=0===a?8:16,u=h(n,o);o+=4,o+=0===a?8:16,o+=2;var d=n.end+0,f=l(n,o);o+=2;for(var g=0;g>>31)return console.warn("SIDX has hierarchical references (not supported)"),null;var y=h(n,p);p+=4,s.push({referenceSize:m,subsegmentDuration:y,info:{duration:y/u,start:d,end:d+m-1}}),d+=m,o=p+=4}return{earliestPresentationTime:0,timescale:u,version:a,referencesCount:f,references:s,moovEndOffset:r}}function f(e){for(var t=[],r=c(e,["moov","trak"]),i=0;ie)&&(this.startTime=e),this.endTime=t,this.screen=r,this.timelineController.createCaptionsTrack(this.trackName)},t.reset=function(){this.cueRanges=[],this.startTime=null},e}()},"./src/utils/texttrack-utils.ts":function(e,t,r){"use strict";r.r(t),r.d(t,"sendAddTrackEvent",(function(){return s})),r.d(t,"addCueToTrack",(function(){return n})),r.d(t,"clearCurrentCues",(function(){return a})),r.d(t,"removeCuesInRange",(function(){return o})),r.d(t,"getCuesInRange",(function(){return l}));var i=r("./src/utils/logger.ts");function s(e,t){var r;try{r=new Event("addtrack")}catch(e){(r=document.createEvent("Event")).initEvent("addtrack",!1,!1)}r.track=e,t.dispatchEvent(r)}function n(e,t){var r=e.mode;if("disabled"===r&&(e.mode="hidden"),e.cues&&!e.cues.getCueById(t.id))try{if(e.addCue(t),!e.cues.getCueById(t.id))throw new Error("addCue is failed for: "+t)}catch(r){i.logger.debug("[texttrack-utils]: "+r);var s=new self.TextTrackCue(t.startTime,t.endTime,t.text);s.id=t.id,e.addCue(s)}"disabled"===r&&(e.mode=r)}function a(e){var t=e.mode;if("disabled"===t&&(e.mode="hidden"),e.cues)for(var r=e.cues.length;r--;)e.removeCue(e.cues[r]);"disabled"===t&&(e.mode=t)}function o(e,t,r){var i=e.mode;if("disabled"===i&&(e.mode="hidden"),e.cues&&e.cues.length>0)for(var s=l(e.cues,t,r),n=0;ne[r].endTime)return-1;for(var i=0,s=r;i<=s;){var n=Math.floor((s+i)/2);if(te[n].startTime&&i-1)for(var n=s,a=e.length;n=t&&o.endTime<=r)i.push(o);else if(o.startTime>r)return i}return i}},"./src/utils/time-ranges.ts":function(e,t,r){"use strict";r.r(t),t.default={toString:function(e){for(var t="",r=e.length,i=0;i1?t-1:0),i=1;i100)throw new Error("Position must be between 0 and 100.");E=e,this.hasBeenReset=!0}})),Object.defineProperty(o,"positionAlign",s({},l,{get:function(){return S},set:function(e){var t=i(e);if(!t)throw new SyntaxError("An invalid or illegal string was specified.");S=t,this.hasBeenReset=!0}})),Object.defineProperty(o,"size",s({},l,{get:function(){return T},set:function(e){if(e<0||e>100)throw new Error("Size must be between 0 and 100.");T=e,this.hasBeenReset=!0}})),Object.defineProperty(o,"align",s({},l,{get:function(){return b},set:function(e){var t=i(e);if(!t)throw new SyntaxError("An invalid or illegal string was specified.");b=t,this.hasBeenReset=!0}})),o.displayState=void 0}return n.prototype.getCueAsHTML=function(){return self.WebVTT.convertCueToDOMTree(self,this.text)},n}()},"./src/utils/vttparser.ts":function(e,t,r){"use strict";r.r(t),r.d(t,"parseTimeStamp",(function(){return n})),r.d(t,"fixLineBreaks",(function(){return c})),r.d(t,"VTTParser",(function(){return d}));var i=r("./src/utils/vttcue.ts"),s=function(){function e(){}return e.prototype.decode=function(e,t){if(!e)return"";if("string"!=typeof e)throw new Error("Error - expected string data.");return decodeURIComponent(encodeURIComponent(e))},e}();function n(e){function t(e,t,r,i){return 3600*(0|e)+60*(0|t)+(0|r)+parseFloat(i||0)}var r=e.match(/^(?:(\d+):)?(\d{2}):(\d{2})(\.\d+)?/);return r?parseFloat(r[2])>59?t(r[2],r[3],0,r[4]):t(r[1],r[2],r[3],r[4]):null}var a=function(){function e(){this.values=Object.create(null)}var t=e.prototype;return t.set=function(e,t){this.get(e)||""===t||(this.values[e]=t)},t.get=function(e,t,r){return r?this.has(e)?this.values[e]:t[r]:this.has(e)?this.values[e]:t},t.has=function(e){return e in this.values},t.alt=function(e,t,r){for(var i=0;i=0&&r<=100)return this.set(e,r),!0}return!1},e}();function o(e,t,r,i){var s=i?e.split(i):[e];for(var n in s)if("string"==typeof s[n]){var a=s[n].split(r);2===a.length&&t(a[0],a[1])}}var l=new i.default(0,0,""),h="middle"===l.align?"middle":"center";function u(e,t,r){var i=e;function s(){var t=n(e);if(null===t)throw new Error("Malformed timestamp: "+i);return e=e.replace(/^[^\sa-zA-Z-]+/,""),t}function u(){e=e.replace(/^\s+/,"")}if(u(),t.startTime=s(),u(),"--\x3e"!==e.substr(0,3))throw new Error("Malformed time stamp (time stamps must be separated by '--\x3e'): "+i);e=e.substr(3),u(),t.endTime=s(),u(),function(e,t){var i=new a;o(e,(function(e,t){var s;switch(e){case"region":for(var n=r.length-1;n>=0;n--)if(r[n].id===t){i.set(e,r[n].region);break}break;case"vertical":i.alt(e,t,["rl","lr"]);break;case"line":s=t.split(","),i.integer(e,s[0]),i.percent(e,s[0])&&i.set("snapToLines",!1),i.alt(e,s[0],["auto"]),2===s.length&&i.alt("lineAlign",s[1],["start",h,"end"]);break;case"position":s=t.split(","),i.percent(e,s[0]),2===s.length&&i.alt("positionAlign",s[1],["start",h,"end","line-left","line-right","auto"]);break;case"size":i.percent(e,t);break;case"align":i.alt(e,t,["start",h,"end","left","right"])}}),/:/,/\s/),t.region=i.get("region",null),t.vertical=i.get("vertical","");var s=i.get("line","auto");"auto"===s&&-1===l.line&&(s=-1),t.line=s,t.lineAlign=i.get("lineAlign","start"),t.snapToLines=i.get("snapToLines",!0),t.size=i.get("size",100),t.align=i.get("align",h);var n=i.get("position","auto");"auto"===n&&50===l.position&&(n="start"===t.align||"left"===t.align?0:"end"===t.align||"right"===t.align?100:50),t.position=n}(e,t)}function c(e){return e.replace(//gi,"\n")}var d=function(){function e(){this.state="INITIAL",this.buffer="",this.decoder=new s,this.regionList=[],this.cue=null,this.oncue=void 0,this.onparsingerror=void 0,this.onflush=void 0}var t=e.prototype;return t.parse=function(e){var t=this;function r(){var e=t.buffer,r=0;for(e=c(e);r>>0).toString()};function c(e,t,r){return u(e.toString())+u(t.toString())+u(r)}function d(e,t,r,u,d,f,g,p){var v,m=new s.VTTParser,y=Object(n.utf8ArrayToStr)(new Uint8Array(e)).trim().replace(l,"\n").split("\n"),E=[],S=Object(a.toMpegTsClockFromTimescale)(t,r),T="00:00.000",b=0,_=0,L=!0,A=!1;m.oncue=function(e){var t=u[d],r=u.ccOffset,i=(b-S)/9e4;if(null!=t&&t.new&&(void 0!==_?r=u.ccOffset=t.start:function(e,t,r){var i=e[t],s=e[i.prevCC];if(!s||!s.new&&i.new)return e.ccOffset=e.presentationOffset=i.start,void(i.new=!1);for(;null!==(n=s)&&void 0!==n&&n.new;){var n;e.ccOffset+=i.start-s.start,i.new=!1,s=e[(i=s).prevCC]}e.presentationOffset=r}(u,d,i)),i&&(r=i-u.presentationOffset),A){var s=e.endTime-e.startTime,n=Object(o.normalizePts)(9e4*(e.startTime+r-_),9e4*f)/9e4;e.startTime=n,e.endTime=n+s}var a=e.text.trim();e.text=decodeURIComponent(encodeURIComponent(a)),e.id||(e.id=c(e.startTime,e.endTime,a)),e.endTime>0&&E.push(e)},m.onparsingerror=function(e){v=e},m.onflush=function(){v?p(v):g(E)},y.forEach((function(e){if(L){if(h(e,"X-TIMESTAMP-MAP=")){L=!1,A=!0,e.substr(16).split(",").forEach((function(e){h(e,"LOCAL:")?T=e.substr(6):h(e,"MPEGTS:")&&(b=parseInt(e.substr(7)))}));try{_=function(e){var t=parseInt(e.substr(-3)),r=parseInt(e.substr(-6,2)),s=parseInt(e.substr(-9,2)),n=e.length>9?parseInt(e.substr(0,e.indexOf(":"))):0;if(!(Object(i.isFiniteNumber)(t)&&Object(i.isFiniteNumber)(r)&&Object(i.isFiniteNumber)(s)&&Object(i.isFiniteNumber)(n)))throw Error("Malformed X-TIMESTAMP-MAP: Local:"+e);return t+=1e3*r,(t+=6e4*s)+36e5*n}(T)/1e3}catch(e){A=!1,v=e}return}""===e&&(L=!1)}m.parse(e+"\n")})),m.flush()}},"./src/utils/xhr-loader.ts":function(e,t,r){"use strict";r.r(t);var i=r("./src/utils/logger.ts"),s=r("./src/loader/load-stats.ts"),n=/^age:\s*[\d.]+\s*$/m,a=function(){function e(e){this.xhrSetup=void 0,this.requestTimeout=void 0,this.retryTimeout=void 0,this.retryDelay=void 0,this.config=null,this.callbacks=null,this.context=void 0,this.loader=null,this.stats=void 0,this.xhrSetup=e?e.xhrSetup:null,this.stats=new s.LoadStats,this.retryDelay=0}var t=e.prototype;return t.destroy=function(){this.callbacks=null,this.abortInternal(),this.loader=null,this.config=null},t.abortInternal=function(){var e=this.loader;self.clearTimeout(this.requestTimeout),self.clearTimeout(this.retryTimeout),e&&(e.onreadystatechange=null,e.onprogress=null,4!==e.readyState&&(this.stats.aborted=!0,e.abort()))},t.abort=function(){var e;this.abortInternal(),null!==(e=this.callbacks)&&void 0!==e&&e.onAbort&&this.callbacks.onAbort(this.stats,this.context,this.loader)},t.load=function(e,t,r){if(this.stats.loading.start)throw new Error("Loader can only be used once.");this.stats.loading.start=self.performance.now(),this.context=e,this.config=t,this.callbacks=r,this.retryDelay=t.retryDelay,this.loadInternal()},t.loadInternal=function(){var e=this.config,t=this.context;if(e){var r=this.loader=new self.XMLHttpRequest,i=this.stats;i.loading.first=0,i.loaded=0;var s=this.xhrSetup;try{if(s)try{s(r,t.url)}catch(e){r.open("GET",t.url,!0),s(r,t.url)}r.readyState||r.open("GET",t.url,!0);var n=this.context.headers;if(n)for(var a in n)r.setRequestHeader(a,n[a])}catch(e){return void this.callbacks.onError({code:r.status,text:e.message},t,r)}t.rangeEnd&&r.setRequestHeader("Range","bytes="+t.rangeStart+"-"+(t.rangeEnd-1)),r.onreadystatechange=this.readystatechange.bind(this),r.onprogress=this.loadprogress.bind(this),r.responseType=t.responseType,self.clearTimeout(this.requestTimeout),this.requestTimeout=self.setTimeout(this.loadtimeout.bind(this),e.timeout),r.send()}},t.readystatechange=function(){var e=this.context,t=this.loader,r=this.stats;if(e&&t){var s=t.readyState,n=this.config;if(!r.aborted&&s>=2)if(self.clearTimeout(this.requestTimeout),0===r.loading.first&&(r.loading.first=Math.max(self.performance.now(),r.loading.start)),4===s){t.onreadystatechange=null,t.onprogress=null;var a=t.status;if(a>=200&&a<300){var o,l;if(r.loading.end=Math.max(self.performance.now(),r.loading.first),l="arraybuffer"===e.responseType?(o=t.response).byteLength:(o=t.responseText).length,r.loaded=r.total=l,!this.callbacks)return;var h=this.callbacks.onProgress;if(h&&h(r,e,o,t),!this.callbacks)return;var u={url:t.responseURL,data:o};this.callbacks.onSuccess(u,r,e,t)}else r.retry>=n.maxRetry||a>=400&&a<499?(i.logger.error(a+" while loading "+e.url),this.callbacks.onError({code:a,text:t.statusText},e,t)):(i.logger.warn(a+" while loading "+e.url+", retrying in "+this.retryDelay+"..."),this.abortInternal(),this.loader=null,self.clearTimeout(this.retryTimeout),this.retryTimeout=self.setTimeout(this.loadInternal.bind(this),this.retryDelay),this.retryDelay=Math.min(2*this.retryDelay,n.maxRetryDelay),r.retry++)}else self.clearTimeout(this.requestTimeout),this.requestTimeout=self.setTimeout(this.loadtimeout.bind(this),n.timeout)}},t.loadtimeout=function(){i.logger.warn("timeout while loading "+this.context.url);var e=this.callbacks;e&&(this.abortInternal(),e.onTimeout(this.stats,this.context,this.loader))},t.loadprogress=function(e){var t=this.stats;t.loaded=e.loaded,e.lengthComputable&&(t.total=e.total)},t.getCacheAge=function(){var e=null;if(this.loader&&n.test(this.loader.getAllResponseHeaders())){var t=this.loader.getResponseHeader("age");e=t?parseFloat(t):null}return e},e}();t.default=a}}).default},e.exports=t())},622:function(e){var t,r,i,s,n;t=/^(?=((?:[a-zA-Z0-9+\-.]+:)?))\1(?=((?:\/\/[^\/?#]*)?))\2(?=((?:(?:[^?#\/]*\/)*[^;?#\/]*)?))\3((?:;[^?#]*)?)(\?[^#]*)?(#[^]*)?$/,r=/^(?=([^\/?#]*))\1([^]*)$/,i=/(?:\/|^)\.(?=\/)/g,s=/(?:\/|^)\.\.\/(?!\.\.\/)[^\/]*(?=\/)/g,n={buildAbsoluteURL:function(e,t,i){if(i=i||{},e=e.trim(),!(t=t.trim())){if(!i.alwaysNormalize)return e;var s=n.parseURL(e);if(!s)throw new Error("Error trying to parse base URL.");return s.path=n.normalizePath(s.path),n.buildURLFromParts(s)}var a=n.parseURL(t);if(!a)throw new Error("Error trying to parse relative URL.");if(a.scheme)return i.alwaysNormalize?(a.path=n.normalizePath(a.path),n.buildURLFromParts(a)):t;var o=n.parseURL(e);if(!o)throw new Error("Error trying to parse base URL.");if(!o.netLoc&&o.path&&"/"!==o.path[0]){var l=r.exec(o.path);o.netLoc=l[1],o.path=l[2]}o.netLoc&&!o.path&&(o.path="/");var h={scheme:o.scheme,netLoc:a.netLoc,path:null,params:a.params,query:a.query,fragment:a.fragment};if(!a.netLoc&&(h.netLoc=o.netLoc,"/"!==a.path[0]))if(a.path){var u=o.path,c=u.substring(0,u.lastIndexOf("/")+1)+a.path;h.path=n.normalizePath(c)}else h.path=o.path,a.params||(h.params=o.params,a.query||(h.query=o.query));return null===h.path&&(h.path=i.alwaysNormalize?n.normalizePath(a.path):a.path),n.buildURLFromParts(h)},parseURL:function(e){var r=t.exec(e);return r?{scheme:r[1]||"",netLoc:r[2]||"",path:r[3]||"",params:r[4]||"",query:r[5]||"",fragment:r[6]||""}:null},normalizePath:function(e){for(e=e.split("").reverse().join("").replace(i,"");e.length!==(e=e.replace(s,"")).length;);return e.split("").reverse().join("")},buildURLFromParts:function(e){return e.scheme+e.netLoc+e.path+e.params+e.query+e.fragment}},e.exports=n},47:(e,t)=>{"use strict";t.l=s;var r=2147483647;function i(e){if(e>r)throw new RangeError('The value "'+e+'" is invalid for option "size"');var t=new Uint8Array(e);return t.__proto__=s.prototype,t}function s(e,t,r){if("number"==typeof e){if("string"==typeof t)throw new TypeError('The "string" argument must be of type string. Received type number');return o(e)}return n(e,t,r)}function n(e,t,r){if("string"==typeof e)return function(e,t){"string"==typeof t&&""!==t||(t="utf8");if(!s.isEncoding(t))throw new TypeError("Unknown encoding: "+t);var r=0|u(e,t),n=i(r),a=n.write(e,t);a!==r&&(n=n.slice(0,a));return n}(e,t);if(ArrayBuffer.isView(e))return l(e);if(null==e)throw TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof e);if(m(e,ArrayBuffer)||e&&m(e.buffer,ArrayBuffer))return function(e,t,r){if(t<0||e.byteLength=r)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+r.toString(16)+" bytes");return 0|e}function u(e,t){if(s.isBuffer(e))return e.length;if(ArrayBuffer.isView(e)||m(e,ArrayBuffer))return e.byteLength;if("string"!=typeof e)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof e);var r=e.length,i=arguments.length>2&&!0===arguments[2];if(!i&&0===r)return 0;for(var n=!1;;)switch(t){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":return v(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;default:if(n)return i?-1:v(e).length;t=(""+t).toLowerCase(),n=!0}}function c(e,t,r,i){r=Number(r)||0;const s=e.length-r;i?(i=Number(i))>s&&(i=s):i=s;const n=t.length;let a;for(i>n/2&&(i=n/2),a=0;a>8,s=r%256,n.push(s),n.push(i);return n}(t,e.length-r),e,r,i)}function p(e,t,r,i){let s;for(s=0;s=t.length||s>=e.length);++s)t[s+r]=e[s];return s}function v(e,t){var r;t=t||1/0;for(var i=e.length,s=null,n=[],a=0;a55295&&r<57344){if(!s){if(r>56319){(t-=3)>-1&&n.push(239,191,189);continue}if(a+1===i){(t-=3)>-1&&n.push(239,191,189);continue}s=r;continue}if(r<56320){(t-=3)>-1&&n.push(239,191,189),s=r;continue}r=65536+(s-55296<<10|r-56320)}else s&&(t-=3)>-1&&n.push(239,191,189);if(s=null,r<128){if((t-=1)<0)break;n.push(r)}else if(r<2048){if((t-=2)<0)break;n.push(r>>6|192,63&r|128)}else if(r<65536){if((t-=3)<0)break;n.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;n.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return n}function m(e,t){return e instanceof t||null!=e&&null!=e.constructor&&null!=e.constructor.name&&e.constructor.name===t.name}function y(e){return e!=e}"undefined"!=typeof Symbol&&null!=Symbol.species&&s[Symbol.species]===s&&Object.defineProperty(s,Symbol.species,{value:null,configurable:!0,enumerable:!1,writable:!1}),s.from=function(e,t,r){return n(e,t,r)},s.prototype.__proto__=Uint8Array.prototype,s.__proto__=Uint8Array,s.alloc=function(e,t,r){return function(e,t,r){return a(e),e<=0?i(e):void 0!==t?"string"==typeof r?i(e).fill(t,r):i(e).fill(t):i(e)}(e,t,r)},s.allocUnsafe=function(e){return o(e)},s.isBuffer=function(e){return null!=e&&!0===e._isBuffer&&e!==s.prototype},s.isEncoding=function(e){switch(String(e).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},s.concat=function(e,t){if(!Array.isArray(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return s.alloc(0);var r;if(void 0===t)for(t=0,r=0;r=e.length&&(t=e.length),t||(t=0),i>0&&i=this.length)throw new RangeError("Index out of range");if(i<0)throw new RangeError("sourceEnd out of bounds");i>this.length&&(i=this.length),e.length-t=0;--a)e[a+t]=this[a+r];else Uint8Array.prototype.set.call(e,this.subarray(r,i),t);return n},s.prototype.write=function(e,t,r,i){if(void 0===t)i="utf8",r=this.length,t=0;else if(void 0===r&&"string"==typeof t)i=t,r=this.length,t=0;else{if(!isFinite(t))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");t>>>=0,isFinite(r)?(r>>>=0,void 0===i&&(i="utf8")):(i=r,r=void 0)}const s=this.length-t;if((void 0===r||r>s)&&(r=s),e.length>0&&(r<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");i||(i="utf8");let n=!1;for(;;)switch(i){case"hex":return c(this,e,t,r);case"utf8":case"utf-8":return d(this,e,t,r);case"ascii":case"latin1":case"binary":return f(this,e,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return g(this,e,t,r);default:if(n)throw new TypeError("Unknown encoding: "+i);i=(""+i).toLowerCase(),n=!0}}},934:e=>{"use strict";function t(e,t){for(const r in t)Object.defineProperty(e,r,{value:t[r],enumerable:!0,configurable:!0});return e}e.exports=function(e,r,i){if(!e||"string"==typeof e)throw new TypeError("Please pass an Error to err-code");i||(i={}),"object"==typeof r&&(i=r,r=void 0),null!=r&&(i.code=r);try{return t(e,i)}catch(r){i.message=e.message,i.stack=e.stack;const s=function(){};return s.prototype=Object.create(Object.getPrototypeOf(e)),t(new s,i)}}},485:function(e,t,r){var i;!function(s){"use strict";function n(e,t){var r=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(r>>16)<<16|65535&r}function a(e,t,r,i,s,a){return n((o=n(n(t,e),n(i,a)))<<(l=s)|o>>>32-l,r);var o,l}function o(e,t,r,i,s,n,o){return a(t&r|~t&i,e,t,s,n,o)}function l(e,t,r,i,s,n,o){return a(t&i|r&~i,e,t,s,n,o)}function h(e,t,r,i,s,n,o){return a(t^r^i,e,t,s,n,o)}function u(e,t,r,i,s,n,o){return a(r^(t|~i),e,t,s,n,o)}function c(e,t){var r,i,s,a,c;e[t>>5]|=128<>>9<<4)]=t;var d=1732584193,f=-271733879,g=-1732584194,p=271733878;for(r=0;r>5]>>>t%32&255);return r}function f(e){var t,r=[];for(r[(e.length>>2)-1]=void 0,t=0;t>5]|=(255&e.charCodeAt(t/8))<>>4&15)+i.charAt(15&t);return s}function p(e){return unescape(encodeURIComponent(e))}function v(e){return function(e){return d(c(f(e),8*e.length))}(p(e))}function m(e,t){return function(e,t){var r,i,s=f(e),n=[],a=[];for(n[15]=a[15]=void 0,s.length>16&&(s=c(s,8*e.length)),r=0;r<16;r+=1)n[r]=909522486^s[r],a[r]=1549556828^s[r];return i=c(n.concat(f(t)),512+8*t.length),d(c(a.concat(i),640))}(p(e),p(t))}function y(e,t,r){return t?r?m(t,e):g(m(t,e)):r?v(e):g(v(e))}void 0===(i=function(){return y}.call(t,r,t,e))||(e.exports=i)}()},422:e=>{const t={ANDROID_WEB:"android-web",IOS_WEB:"iOS-web",PC_NATIVE:"PC-native",PC_WEB:"PC-web"};var r={getNetType:function(){let e=(new RegExp("nettype\\/(\\w*)").exec(i())||[,""])[1].toLowerCase();if(!e&&navigator.connection){switch(navigator.connection.type){case"ethernet":e="ethernet";break;case"cellular":e="cellular";break;default:e="wifi"}}return e},getPlatform:function(){return r.isAndroid()?t.ANDROID_WEB:r.isIOS()?t.IOS_WEB:r.isElectron()?t.PC_NATIVE:t.PC_WEB},isX5:function(){return this.isAndroid()&&/\s(TBS|X5Core)\/[\w\.\-]+/i.test(i())},isPC:function(){return!n(s("os "))&&!n(s("android[/ ]"))},isIOS:function(){return n(s("os "))},isAndroid:function(){return n(s("android[/ ]"))},isIOSSafari:function(){return this.isIOS()&&this.isSafari()},isElectron:function(){return/electron/i.test(i())},isMobile:function(){return r.isAndroid()||r.isIOS()},isSafari:function(){return/^((?!chrome|android).)*safari/i.test(i())},isFirefox:function(){return/firefox/i.test(i())},isChrome:function(){return/chrome/i.test(i())},isLocalHost:function(){return"localhost"===location.hostname},device:t,getBrowser:function(){return r.isX5()?"X5":r.isChrome()?"Chrome":r.isFirefox()?"Firefox":r.isIOSSafari()?"iOS-Safari":r.isSafari()?"Mac-Safari":"Unknown"}};function i(){return navigator.userAgent.toLowerCase()}function s(e){return""+(new RegExp(e+"(\\d+((\\.|_)\\d+)*)").exec(i())||[,0])[1]||void 0}function n(e){return parseFloat((e||"").replace(/\_/g,"."))||0}e.exports=r},77:e=>{let t;e.exports="function"==typeof queueMicrotask?queueMicrotask.bind(globalThis):e=>(t||(t=Promise.resolve())).then(e).catch((e=>setTimeout((()=>{throw e}),0)))}},t={};function r(i){var s=t[i];if(void 0!==s)return s.exports;var n=t[i]={exports:{}};return e[i].call(n.exports,n,n.exports,r),n.exports}r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var i in t)r.o(t,i)&&!r.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var i={};return(()=>{"use strict";r.d(i,{default:()=>Jt});const e={DC_SIGNAL:"SIGNAL",DC_OPEN:"OPEN",DC_REQUEST:"REQUEST",DC_SEND_REQUEST:"SEND_REQUEST",DC_PIECE_NOT_FOUND:"PIECE_NOT_FOUND",DC_PIECE_ABORT:"PIECE_ABORT",DC_PIECE_CANCEL:"PIECE_CANCEL",DC_CLOSE:"CLOSE",DC_RESPONSE:"RESPONSE",DC_ERROR:"ERROR",DC_PIECE:"PIECE",DC_PIECE_DATA:"PIECE_DATA",DC_TIMEOUT:"TIMEOUT",DC_PIECE_ACK:"PIECE_ACK",DC_METADATA:"METADATA",DC_PLAT_ANDROID:"ANDROID",DC_PLAT_IOS:"IOS",DC_PLAT_WEB:"WEB",DC_CHOKE:"CHOKE",DC_UNCHOKE:"UNCHOKE",DC_HAVE:"HAVE",DC_HAVE_REVERSE:"HAVE_REVERSE",DC_LOST:"LOST",DC_GET_PEERS:"GET_PEERS",DC_PEERS:"PEERS",DC_STATS:"STATS",DC_PEER_SIGNAL:"PEER_SIGNAL",DC_PLAYLIST:"PLAYLIST",BM_LOST:"lost",BM_ADDED_SEG_:"BM_ADDED_SEG_",BM_ADDED_SN_:"BM_ADDED_SN_",BM_SEG_ADDED:"BM_SEG_ADDED",FRAG_CHANGED:"FRAG_CHANGED",FRAG_LOADED:"FRAG_LOADED",FRAG_LOADING:"FRAG_LOADING",RESTART_P2P:"RESTART_P2P",EXCEPTION:"exception",REQUESTING_MAP_HAVE:"REQUESTING_MAP_HAVE",BUILDER_MAP_HAVE:"BUILDER_MAP_HAVE",SYN_OUTPUT:"SYN_OUTPUT",SYN_ERROR:"SYN_ERROR",SYN_PARTIAL:"SYN_PARTIAL"},t={...e,SCH_DCHAVE:"SCH_DCHAVE",SCH_WAIT_PEER:"SCH_WAIT_PEER",STREAM_DETECT:"STREAM_DETECT",STREAM_DISABLE:"STREAM_DISABLE",SW_STREAM_ENABLE:"SW_STREAM_ENABLE",SW_PLAYLIST:"SW_PLAYLIST",SW_GET_PLAYLIST:"SW_GET_PLAYLIST",SW_MEDIA:"SW_MEDIA",SW_PRE_MEDIA:"SW_PRE_MEDIA",SW_GET_MEDIA:"SW_GET_MEDIA",SW_STREAM:"SW_STREAM",LEVEL_LOADED:"LEVEL_LOADED",MANIFEST_PARSED:"MANIFEST_PARSED"};var s=r(204),n=r.n(s),a=r(47);const o=64e3;function l(){return!0}function h(e){return new URL(location.href).searchParams.get(e)}function u(){return Date.parse(new Date)/1e3}function c(e,t){return parseInt(Math.random()*(t-e+1)+e,10)}function d(e,t,r,i=3500){const s=new XMLHttpRequest;return new Promise(((n,a)=>{s.open("GET",e,!0),s.responseType="arraybuffer",s.timeout=i,s.onreadystatechange=e=>{if(4===s.readyState){const e=s.status;206===e?n(s.response):a(`status ${e}`)}},s.onerror=e=>{a("request error")},s.ontimeout=e=>{a("timeout")},s.setRequestHeader("Range",t||"bytes=0-0"),r&&r(s,e),s.send()})).catch((e=>{}))}function f(){if("undefined"==typeof window)return null;var e={RTCPeerConnection:window.RTCPeerConnection||window.mozRTCPeerConnection||window.webkitRTCPeerConnection,RTCSessionDescription:window.RTCSessionDescription||window.mozRTCSessionDescription||window.webkitRTCSessionDescription,RTCIceCandidate:window.RTCIceCandidate||window.mozRTCIceCandidate||window.webkitRTCIceCandidate};return e.RTCPeerConnection?e:null}function g(e){const t=a.l.from(e),r=new a.l(e.byteLength);return t.copy(r),r}function p(){return location.protocol.startsWith("https")}function v(e,t){const r=e.byteLength-t,i=[];let s=t,n=Math.floor(r/o),l=r%o;for(let t=0;t0){const t=(0,a.l)(l);e.copy(t,0,s,s+l),i.push(t)}return i}function m(e,t){if(e.size<=t)return;const r=[...e.values()];do{e.delete(r.shift())}while(e.size>t)}function y(e){return e instanceof ArrayBuffer&&0!==e.byteLength}const E={debug:0,info:1,warn:2,error:3,none:4};const S=class{constructor(e){this.logLevel=e,this.onlineDebug=!1,console.debug=console.log,"debug"!==e&&"info"!==e||(this.logLevel="warn"),!0===e?this.logLevel="warn":!1===e?this.logLevel="none":e in E||(this.logLevel="error"),this.resetLogger()}enableDebug(){this.onlineDebug=!0;for(let e in E)this[e]=console[e]}resetLogger(){this.onlineDebug=!1;for(let e in E)E[e]e),this.trickle=void 0===e.trickle||e.trickle,this.allowHalfTrickle=void 0!==e.allowHalfTrickle&&e.allowHalfTrickle,this.iceCompleteTimeout=e.iceCompleteTimeout||5e3,this.destroyed=!1,this.destroying=!1,this._connected=!1,this.remoteAddress=void 0,this.remoteFamily=void 0,this.remotePort=void 0,this.localAddress=void 0,this.localFamily=void 0,this.localPort=void 0,this._wrtc=e.wrtc&&"object"==typeof e.wrtc?e.wrtc:f(),this._pcReady=!1,this._channelReady=!1,this._iceComplete=!1,this._iceCompleteTimer=null,this._channel=null,this._pendingCandidates=[],this._isNegotiating=!1,this._firstNegotiation=!0,this._batchedNegotiation=!1,this._queuedNegotiation=!1,this._sendersAwaitingStable=[],this._senderMap=new Map,this._closingInterval=null,this._chunk=null,this._cb=null,this._interval=null;try{this._pc=new this._wrtc.RTCPeerConnection(this.config)}catch(e){return void L()((()=>this.destroy(e)))}this._pc.oniceconnectionstatechange=()=>{this._onIceStateChange()},this._pc.onicegatheringstatechange=()=>{this._onIceStateChange()},this._pc.onconnectionstatechange=()=>{this._onConnectionStateChange()},this._pc.onsignalingstatechange=()=>{this._onSignalingStateChange()},this._pc.onicecandidate=e=>{this._onIceCandidate(e)},this.initiator||this.channelNegotiated?this._setupData({channel:this._pc.createDataChannel(this.channelName,this.channelConfig)}):this._pc.ondatachannel=e=>{this._setupData(e)},this._needsNegotiation()}get bufferSize(){return this._channel&&this._channel.bufferedAmount||0}get connected(){return this._connected&&"open"===this._channel.readyState}signal(e){if(!this.destroyed){if("string"==typeof e)try{e=JSON.parse(e)}catch(t){e={}}e.renegotiate&&this.initiator&&this._needsNegotiation(),e.candidate&&(this._pc.remoteDescription&&this._pc.remoteDescription.type?this._addIceCandidate(e.candidate):this._pendingCandidates.push(e.candidate)),e.sdp&&this._pc.setRemoteDescription(new this._wrtc.RTCSessionDescription(e)).then((()=>{this.destroyed||(this._pendingCandidates.forEach((e=>{this._addIceCandidate(e)})),this._pendingCandidates=[],"offer"===this._pc.remoteDescription.type&&this._createAnswer())})).catch((e=>{this.destroy(e)})),e.sdp||e.candidate||e.renegotiate||e.transceiverRequest||this.destroy(new Error("signal() called with invalid signal data"))}}_addIceCandidate(e){const t=new this._wrtc.RTCIceCandidate(e);this._pc.addIceCandidate(t).catch((e=>{var r;!t.address||t.address.endsWith(".local")?(r="Ignoring unsupported ICE candidate.",console.warn(r)):this.destroy(e)}))}send(e){this._channel.send(e)}_needsNegotiation(){this._batchedNegotiation||(this._batchedNegotiation=!0,L()((()=>{this._batchedNegotiation=!1,!this.initiator&&this._firstNegotiation||this.negotiate(),this._firstNegotiation=!1})))}negotiate(){this.initiator?this._isNegotiating?this._queuedNegotiation=!0:setTimeout((()=>{this._createOffer()}),0):this._isNegotiating?this._queuedNegotiation=!0:this.emit("signal",{type:"renegotiate",renegotiate:!0}),this._isNegotiating=!0}destroy(e){this._destroy(e)}_destroy(e){this.destroyed||this.destroying||(this.destroying=!0,L()((()=>{if(this.destroyed=!0,this.destroying=!1,this._connected=!1,this._pcReady=!1,this._channelReady=!1,this._senderMap=null,clearInterval(this._closingInterval),this._closingInterval=null,clearInterval(this._interval),this._interval=null,this._chunk=null,this._cb=null,this._channel){try{this._channel.close()}catch(e){}this._channel.onmessage=null,this._channel.onopen=null,this._channel.onclose=null,this._channel.onerror=null}if(this._pc){try{this._pc.close()}catch(e){}this._pc.oniceconnectionstatechange=null,this._pc.onicegatheringstatechange=null,this._pc.onsignalingstatechange=null,this._pc.onicecandidate=null,this._pc.ondatachannel=null}this._pc=null,this._channel=null,e&&this.emit("error",e),this.emit("close")})))}_setupData(e){if(!e.channel)return this.destroy(new Error("Data channel event is missing `channel` property"));this._channel=e.channel,this._channel.binaryType="arraybuffer","number"==typeof this._channel.bufferedAmountLowThreshold&&(this._channel.bufferedAmountLowThreshold=A),this.channelName=this._channel.label,this._channel.onmessage=e=>{this._onChannelMessage(e)},this._channel.onbufferedamountlow=()=>{this._onChannelBufferedAmountLow()},this._channel.onopen=()=>{this._onChannelOpen()},this._channel.onclose=()=>{this._onChannelClose()},this._channel.onerror=e=>{this.destroy(e)};let t=!1;this._closingInterval=setInterval((()=>{this._channel&&"closing"===this._channel.readyState?(t&&this._onChannelClose(),t=!0):t=!1}),5e3)}get isBufferedAmountHigh(){return this._channel.bufferedAmount>A}write(e,t){if(this.destroyed)return t(new Error("cannot write after peer is destroyed"));if(this._connected){try{this.send(e)}catch(e){return this.destroy(e)}this.isBufferedAmountHigh?this._cb=t:t(null)}else this._chunk=e,this._cb=t}_startIceCompleteTimeout(){this.destroyed||this._iceCompleteTimer||(this._iceCompleteTimer=setTimeout((()=>{this._iceComplete||(this._iceComplete=!0,this.emit("iceTimeout"),this.emit("_iceComplete"))}),this.iceCompleteTimeout))}_createOffer(){this.destroyed||this._pc.createOffer(this.offerOptions).then((e=>{if(this.destroyed)return;this.trickle||this.allowHalfTrickle||(e.sdp=D(e.sdp)),e.sdp=this.sdpTransform(e.sdp);const t=()=>{if(this.destroyed)return;const t=this._pc.localDescription||e;this.emit("signal",{type:t.type,sdp:t.sdp})};this._pc.setLocalDescription(e).then((()=>{this.destroyed||(this.trickle||this._iceComplete?t():this.once("_iceComplete",t))})).catch((e=>{this.destroy(e)}))})).catch((e=>{this.destroy(e)}))}_createAnswer(){this.destroyed||this._pc.createAnswer(this.answerOptions).then((e=>{if(this.destroyed)return;this.trickle||this.allowHalfTrickle||(e.sdp=D(e.sdp)),e.sdp=this.sdpTransform(e.sdp);const t=()=>{if(this.destroyed)return;const t=this._pc.localDescription||e;this.emit("signal",{type:t.type,sdp:t.sdp})};this._pc.setLocalDescription(e).then((()=>{this.destroyed||(this.trickle||this._iceComplete?t():this.once("_iceComplete",t))})).catch((e=>{this.destroy(e)}))})).catch((e=>{this.destroy(e)}))}_onConnectionStateChange(){this.destroyed||"failed"===this._pc.connectionState&&this.destroy(new Error("Connection failed."))}_onIceStateChange(){if(this.destroyed)return;const e=this._pc.iceConnectionState,t=this._pc.iceGatheringState;this.emit("iceStateChange",e,t),"connected"!==e&&"completed"!==e||(this._pcReady=!0,this._maybeReady()),"failed"===e&&this.destroy(new Error("Ice connection failed.")),"closed"===e&&this.destroy(new Error("Ice connection closed."))}getStats(e){const t=e=>("[object Array]"===Object.prototype.toString.call(e.values)&&e.values.forEach((t=>{Object.assign(e,t)})),e);0===this._pc.getStats.length?this._pc.getStats().then((r=>{const i=[];r.forEach((e=>{i.push(t(e))})),e(null,i)}),(t=>e(t))):this._pc.getStats.length>0?this._pc.getStats((r=>{if(this.destroyed)return;const i=[];r.result().forEach((e=>{const r={};e.names().forEach((t=>{r[t]=e.stat(t)})),r.id=e.id,r.type=e.type,r.timestamp=e.timestamp,i.push(t(r))})),e(null,i)}),(t=>e(t))):e(null,[])}_maybeReady(){if(this._connected||this._connecting||!this._pcReady||!this._channelReady)return;this._connecting=!0;const e=()=>{this.destroyed||this.getStats(((t,r)=>{if(this.destroyed)return;t&&(r=[]);const i={},s={},n={};let a=!1;r.forEach((e=>{"remotecandidate"!==e.type&&"remote-candidate"!==e.type||(i[e.id]=e),"localcandidate"!==e.type&&"local-candidate"!==e.type||(s[e.id]=e),"candidatepair"!==e.type&&"candidate-pair"!==e.type||(n[e.id]=e)}));const o=e=>{a=!0;let t=s[e.localCandidateId];t&&(t.ip||t.address)?(this.localAddress=t.ip||t.address,this.localPort=Number(t.port)):t&&t.ipAddress?(this.localAddress=t.ipAddress,this.localPort=Number(t.portNumber)):"string"==typeof e.googLocalAddress&&(t=e.googLocalAddress.split(":"),this.localAddress=t[0],this.localPort=Number(t[1])),this.localAddress&&(this.localFamily=this.localAddress.includes(":")?"IPv6":"IPv4");let r=i[e.remoteCandidateId];r&&(r.ip||r.address)?(this.remoteAddress=r.ip||r.address,this.remotePort=Number(r.port)):r&&r.ipAddress?(this.remoteAddress=r.ipAddress,this.remotePort=Number(r.portNumber)):"string"==typeof e.googRemoteAddress&&(r=e.googRemoteAddress.split(":"),this.remoteAddress=r[0],this.remotePort=Number(r[1])),this.remoteAddress&&(this.remoteFamily=this.remoteAddress.includes(":")?"IPv6":"IPv4")};if(r.forEach((e=>{"transport"===e.type&&e.selectedCandidatePairId&&o(n[e.selectedCandidatePairId]),("googCandidatePair"===e.type&&"true"===e.googActiveConnection||("candidatepair"===e.type||"candidate-pair"===e.type)&&e.selected)&&o(e)})),a||Object.keys(n).length&&!Object.keys(s).length){if(this._connecting=!1,this._connected=!0,this._chunk){try{this.send(this._chunk)}catch(t){return this.destroy(t)}this._chunk=null;const e=this._cb;this._cb=null,e(null)}"number"!=typeof this._channel.bufferedAmountLowThreshold&&(this._interval=setInterval((()=>this._onInterval()),150),this._interval.unref&&this._interval.unref()),this.emit("connect")}else setTimeout(e,100)}))};e()}_onInterval(){!this._cb||!this._channel||this._channel.bufferedAmount>A||this._onChannelBufferedAmountLow()}_onSignalingStateChange(){this.destroyed||("stable"===this._pc.signalingState&&(this._isNegotiating=!1,this._sendersAwaitingStable.forEach((e=>{this._pc.removeTrack(e),this._queuedNegotiation=!0})),this._sendersAwaitingStable=[],this._queuedNegotiation?(this._queuedNegotiation=!1,this._needsNegotiation()):this.emit("negotiated")),this.emit("signalingStateChange",this._pc.signalingState))}_onIceCandidate(e){this.destroyed||(e.candidate&&this.trickle?this.emit("signal",{type:"candidate",candidate:{candidate:e.candidate.candidate,sdpMLineIndex:e.candidate.sdpMLineIndex,sdpMid:e.candidate.sdpMid}}):e.candidate||this._iceComplete||(this._iceComplete=!0,this.emit("_iceComplete")),e.candidate&&this._startIceCompleteTimeout())}_onChannelMessage(e){if(this.destroyed)return;let t=e.data;t instanceof ArrayBuffer&&(t=a.l.from(t)),this.emit("data",t)}_onChannelBufferedAmountLow(){if(this.destroyed||!this._cb)return;const e=this._cb;this._cb=null,e(null)}_onChannelOpen(){this._connected||this.destroyed||(this._channelReady=!0,this._maybeReady())}_onChannelClose(){this.destroyed||this.destroy()}}w.config={iceServers:[{urls:["stun:stun.l.google.com:19302","stun:global.stun.twilio.com:3478"]}],sdpSemantics:"unified-plan"},w.channelConfig={};const I=w;class P{constructor(e,t,r,i,s=0){this.sn=e,this.segId=t,this.data=r,this.fromPeerId=i,this.level=s||0}static fromSegment(e){return new P(e.sn,e.segId,e.data,e.fromPeerId,e.level)}get size(){return this.data.byteLength}get isSequential(){return this.sn>=0}}var R=r(422),C=r.n(R);class k extends(n()){static get defaultPacketSize(){return o}static get VERSION(){return"8"}constructor(e,t,r,i,s,n={}){super(),this.channel=e.fetcher.channelId,this.logger=e.logger,this.config=s,this.isInitiator=i,this.options=n,this.intermediator=n.intermediator||null,this.signalMsgs=[],this.assignPeerId(t,r),this.platform="unknown",this.super=!1,this.mobile=!1,this.mobileWeb=!1,this.mobileNet=!1,this.connected=!1,this.msgQueue=[],this.miss=0,this.notifySet=new Set,this.bufArr=[],this.packetSize=o,this.sendReqQueue=[],this.downloading=!1,this.uploading=!1,this.choked=!1,this.streamListeners=[],this.pieceMsg={},this.uploadInterrupter={targetSegId:void 0,currentSegId:void 0,canceled:!1},this.datasToSend=[],this.bytesUploaded=0,this.dataWriting=!1,this.timeSendRequest=0,this.timeReceivePiece=0,this.timeSendPiece=0,this.weight=0,this.peersConnected=1,this.uploadSpeed=0,this.gotPeers=!1,this.currentLevel=0,this.currentPos=0,this.useBackupSignal=!1,this.webRTCConfig={};const{stuns:a}=this.options;if(a&&a.length>0){const e=[];a.forEach((t=>{this.logger.info(`use stun ${t}`),e.push({urls:t})})),this.webRTCConfig.iceServers=e}this.config.webRTCConfig&&(this.webRTCConfig={...this.config.webRTCConfig,...this.webRTCConfig}),this.playlistMap=new Map,this._initPeerChannel(),this.notFatalClosed=!1,this.startSN=Number.MAX_SAFE_INTEGER,this.endSN=-1,this._loadedBytes=0}assignPeerId(t,r){this.remotePeerId=r,this.channelId=this.isInitiator?`${t}-${r}`:`${r}-${t}`,r&&(this.timeJoin=u(),this.dataExchangeTs=this.timeJoin,this.gotStatsTs=this.timeJoin,this._startTimer()),setTimeout((()=>{for(let t of this.signalMsgs)this.emit(e.DC_SIGNAL,t,!0)}),0)}_startTimer(){this.connTimeout=setTimeout((()=>{this.logger.warn(`dc ${this.channelId} connection timeout`),this.emit(e.DC_TIMEOUT)}),25e3)}get isAvailable(){return this.downloadNum<2&&!this.choked}get isAvailableUrgently(){return!this.downloading&&!this.choked}cancelDownload(t,r,i){if(i&&this.downloading&&!(this.streamListeners.length>0||this.remainAttachments<=2))return this.logger.info(`cancel download ${i} remain packets ${this.remainAttachments}`),this.timeReceivePiece=0,this.sendJson({event:e.DC_PIECE_CANCEL,sn:t,level:r,seg_id:i})}addStreamListener(e,t,r){this.streamListeners.push({handler:r,peerId:t})}removeStreamListener(e){this.streamListeners=this.streamListeners.filter((t=>t.peerId!==e||(t.handler(void 0,void 0,!0,"aborted by cancel"),!1)))}_initPeerChannel(){const t=new I({initiator:this.isInitiator,trickle:this.options.trickle||!1,config:this.webRTCConfig});this._datachannel=t,t.on("error",(t=>{let r=!0;"Ice connection failed."===t.message&&this.notFatalClosed&&(r=!1),this.emit(e.DC_ERROR,r)})),t.on("signal",(t=>{this.signalMsgs.push(t),this.emit(e.DC_SIGNAL,t)}));t.on("connect",(()=>{for(this.logger.info(`datachannel CONNECTED to ${this.remotePeerId} from ${this.intermediator?"peer":"server"}`),this.connected=!0,clearTimeout(this.connTimeout),this.signalMsgs=[],this.emit(e.DC_OPEN);this.msgQueue.length>0;){let e=this.msgQueue.shift();this.emit(e.event,e)}})),t.on("data",(t=>{const{logger:r}=this;if("string"==typeof t){let i=JSON.parse(t);if(!this.connected)return void this.msgQueue.push(i);let s,n=i.event;switch(s=n!==e.DC_PLAYLIST&&n!==e.DC_PEER_SIGNAL?`string: ${t}`:`event: ${n}`,r.debug(`datachannel receive ${s} from ${this.remotePeerId}`),n){case e.DC_HAVE:if(this.emit(i.event,i),!i.sn)return;this.config.live||(i.snthis.endSN&&(this.endSN=i.sn));break;case e.DC_PIECE:this.downloading=!0,this.dataExchangeTs=u(),this.timeReceivePiece=performance.now(),this.pieceMsg=i,this._prepareForBinary(i.attachments,i.seg_id,i.sn,i.size),this.emit(i.event,i);break;case e.DC_PIECE_CANCEL:this.uploadInterrupter.targetSegId=i.seg_id,this.emit(i.event,i);break;case e.DC_PIECE_NOT_FOUND:this._sendNextReq()||(this.downloading=!1),this.emit(i.event,i);break;case e.DC_REQUEST:this._handleRequestMsg(i);break;case e.DC_PIECE_ACK:this.uploadInterrupter.canceled||(this._handlePieceAck(i.size,i.miss),this.emit(i.event,i));break;case e.DC_STATS:this._handleStats(i);break;case e.DC_PLAYLIST:this.config.sharePlaylist&&this._handlePlaylist(i);break;case e.DC_METADATA:this._handleMetadata(i);break;case e.DC_PIECE_ABORT:this.downloading&&(this._notifyDownloadListenersAbort("aborted by upstream peer"),this.emit(e.DC_PIECE_ABORT,i));break;case e.DC_CHOKE:r.info(`choke peer ${this.remotePeerId}`),this.choked=!0;break;case e.DC_UNCHOKE:r.info(`unchoke peer ${this.remotePeerId}`),this.choked=!1;break;case e.DC_CLOSE:this.emit(i.event,i.fatal||!1);break;default:this.emit(i.event,i)}}else{if(!this.downloading)return void r.warn(`peer not downloading, data size ${t.byteLength} pieceMsg ${JSON.stringify(this.pieceMsg)}`);this._handleBinaryMsg(t)}})),t.once("close",(()=>{this.emit(e.DC_CLOSE,!1)})),t.on("iceStateChange",((e,t)=>{"disconnected"===e&&(this.logger.warn(`${this.remotePeerId} disconnected`),this.connected=!1)}))}sendJson(t){t.event!==e.DC_PLAYLIST&&t.event!==e.DC_PEER_SIGNAL?this.logger.debug(`dc bufferSize ${this._datachannel.bufferSize} send ${JSON.stringify(t)} to ${this.remotePeerId}`):this.logger.debug(`dc send event ${t.event} to ${this.remotePeerId}`);const r=JSON.stringify(t);return r.length>o?(this.logger.error("string to send is too large"),!1):this.send(r,!1)}send(e,t=!0){return t?(this.datasToSend.push(e),this.dataWriting||this._sendDataSync(),!0):this.sendImmediately(e)}_checkIfNeedInterrupt(){const{targetSegId:t,currentSegId:r,canceled:i}=this.uploadInterrupter;return!!i||!(!t||t!==r)&&(this.logger.info("cancel send data"),this.sendMsgPieceAbort(`${r} transfer canceled`),this.datasToSend=[],this.uploadInterrupter.canceled=!0,this._handlePieceAck(this.bytesUploaded,0),this.emit(e.DC_PIECE_ACK,{seg_id:r,size:this.bytesUploaded,canceled:!0}),!0)}_sendDataSync(){if(this._checkIfNeedInterrupt()||0===this.datasToSend.length)return void(this.dataWriting=!1);this.dataWriting=!0;const t=this.datasToSend.shift();this.bytesUploaded+=t.byteLength,this._datachannel.write(t,(t=>{if(t)return this.dataWriting=!1,this.logger.warn(t.message),void this.emit(e.DC_ERROR,!1);this._sendDataSync()}))}sendImmediately(t){if(this._datachannel.connected)try{return this._datachannel.send(t),!0}catch(t){this.logger.warn(`datachannel ${this.channelId} send data failed, close it`),this.emit(e.DC_ERROR,!1)}return!1}sendMsgHave(t,r,i={}){const s=i.reverse||void 0;delete i.reverse,this.sendJson({event:s?e.DC_HAVE_REVERSE:e.DC_HAVE,sn:t,seg_id:r,...i})}sendPieceNotFound(t,r,i={}){this.uploading=!1,this.sendJson({event:e.DC_PIECE_NOT_FOUND,seg_id:r,sn:t,...i})}sendPeers(t){this.sendJson({event:e.DC_PEERS,peers:t})}sendPeersRequest(){this.sendJson({event:e.DC_GET_PEERS})}sendMsgStats(t,r={}){const i={event:e.DC_STATS,total_conns:t,...r};this.sendJson(i)}sendMsgPlaylist(t,r,i){const s=this.playlistMap.get(t);if(s&&s.seq>=i)return;const n={event:e.DC_PLAYLIST,url:t,data:r,seq:i};this.playlistMap.set(t,{data:r,seq:i}),this.sendJson(n)}sendMsgSignal(t,r,i){return this.sendJson({event:e.DC_PEER_SIGNAL,action:"signal",to_peer_id:t,from_peer_id:r,data:i})}sendMsgSignalReject(t,r,i,s=!1){return this.sendJson({event:e.DC_PEER_SIGNAL,action:"reject",to_peer_id:t,from_peer_id:r,reason:i,fatal:s})}sendMetaData(t,r,i,s=!1){this.isInitiator&&(this.timeSendRequest=performance.now()),this.sendJson({event:e.DC_METADATA,field:t,platform:e.DC_PLAT_WEB,mobile:!!C().isMobile(),mobile_net:s,channel:this.channel,version:"2.7.4",sequential:r,peers:i})}sendPartialBuffer(e,t,r={}){this.sendMsgPiece(e,r);for(let e=0;e${t.from}`),t.incompletes&&e.ext.incompletes&&(t.incompletes+=e.ext.incompletes),t=Object.assign({},e.ext,t);const i={...e,ext:t};this.sendJson(i)}sendBuffer(t,r,i,s={}){const n=s.reverse||void 0;delete s.reverse;let a=i.byteLength,o=0,l=0;a%this.packetSize==0?l=a/this.packetSize:(l=Math.floor(a/this.packetSize)+1,o=a%this.packetSize);let h={event:e.DC_PIECE,attachments:l,seg_id:r,sn:t,level:s.level,size:a,reverse:n};delete s.level,this.sendMsgPiece(h,s);const u=function(e,t,r,i){let s=[];if(i){let n;for(let i=0;i=this.minRequiredSpeed(e))}close(t){t||(this.notFatalClosed=!0),this.emit(e.DC_CLOSE,t)}receiveSignal(e){e&&this._datachannel.signal(e)}_notifyDownloadListenersAbort(e){for(let t of this.streamListeners){const{handler:r}=t;r(void 0,void 0,!0,e)}this.streamListeners=[]}destroy(t=!0){this.logger.info(`destroy datachannel ${this.channelId}`),this.chokeTimer&&clearTimeout(this.chokeTimer),this.connTimeout&&clearTimeout(this.connTimeout),this.uploading&&this.sendMsgPieceAbort("peer is closing"),this._notifyDownloadListenersAbort("upstream peer is closed");let r={event:e.DC_CLOSE,fatal:t};this.sendJson(r),this._datachannel.removeAllListeners(),this.removeAllListeners(),this._datachannel.destroy()}_handleBinaryMsg(t){const{attachments:r,level:i,reverse:s}=this.pieceMsg;this.listenerCount(e.DC_RESPONSE)>0&&this.bufArr.push(t),this._loadedBytes+=t.byteLength,this.remainAttachments--;let n=s?this.remainAttachments+1:r-this.remainAttachments;const a=0===this.remainAttachments;if(this.emit(e.DC_PIECE_DATA,this.bufSN,this.segId,t,n,a,this.pieceMsg),this.streamListeners.length>0)for(let e of this.streamListeners){const{handler:r}=e;r(this.bufSN,this.segId,!1,t,a)}if(a){if(this.streamListeners=[],this.timeSendRequest>0)if(this.super)this.weight=1;else{const e=this.expectedSize/(performance.now()-this.timeSendRequest);this.weight=this.weight>0?.6*this.weight+.4*e:e}this.sendJson({event:e.DC_PIECE_ACK,sn:this.bufSN,seg_id:this.segId,level:i,size:this.expectedSize,miss:this.miss||void 0}),this.timeSendRequest=0,this.timeReceivePiece=0,this._sendNextReq()||(this.downloading=!1),this._handleBinaryData(s)}}_sendNextReq(){if(this.sendReqQueue.length>0){const e=this.sendReqQueue.shift();return this.logger.info(`get msg from sendReqQueue ${JSON.stringify(e)}`),this._realRequestData(e),!0}return!1}_handlePlaylist(e){const{url:t,data:r,seq:i}=e;this.playlistMap.set(t,{data:r,seq:i})}getLatestPlaylist(e,t){if(!this.playlistMap.has(e))return null;const r=this.playlistMap.get(e);return r.seq<=t||r.seq>t+2?null:r}_handleMetadata(t){const{logger:r}=this;if(this.isInitiator){const e=performance.now()-this.timeSendRequest;e>0&&(this.weight=1e5/e,r.info(`handle Metadata from ${this.remotePeerId} initial weight ${this.weight}`)),this.timeSendRequest=0}const i=t.channel;if(this.channel!==i)return r.error(`peer channel ${i} not matched!`),void this.emit(e.DC_ERROR,!0);t.super&&(r.info(`got super peer ${this.remotePeerId}`),this.super=!0);switch(t.platform){case e.DC_PLAT_ANDROID:this.platform=e.DC_PLAT_ANDROID;break;case e.DC_PLAT_IOS:this.platform=e.DC_PLAT_IOS;break;case e.DC_PLAT_WEB:this.platform=e.DC_PLAT_WEB}if(this.mobile=t.mobile||!1,this.mobileNet=t.mobile_net||!1,this.mobileWeb=this.mobile&&this.platform===e.DC_PLAT_WEB||!1,this.sequential=t.sequential,r.info(`${this.remotePeerId} platform ${this.platform} sequential ${this.sequential}`),t.peers&&(this.peersConnected+=t.peers,r.info(`${this.remotePeerId} now has ${this.peersConnected} peers`)),this.emit(e.DC_METADATA,t),t.field&&!this.config.live&&t.sequential){const{field:e}=t;if(Array.isArray(e))this._handleField(e);else for(let t in e)this._handleField(e[t])}}_handleField(e){e.forEach((e=>{e>=0&&(ethis.endSN&&(this.endSN=e))}))}_handleStats(e){this.gotStatsTs=u();const t=e.total_conns;t>0&&this.peersConnected!==t&&(this.peersConnected=t,this.logger.info(`${this.remotePeerId} now has ${this.peersConnected} peers`)),e.level&&(this.currentLevel=e.level),e.pos&&(this.currentPos=e.pos)}_handleRequestMsg(t){if(this.dataExchangeTs=u(),this.uploading)return this.logger.warn(`${this.remotePeerId} is uploading when receive request`),void this.sendPieceNotFound(t.sn,t.seg_id,{level:t.level});this.uploading=!0,this.emit(e.DC_REQUEST,t)}_handlePieceAck(e,t){0!==this.timeSendPiece&&(this.uploadSpeed=Math.round(e/(performance.now()-this.timeSendPiece)*2),this.timeSendPiece=0,this.logger.info(`${this.remotePeerId} uploadSpeed is ${this.uploadSpeed}`)),t>0&&this.logger.warn(`peer ${this.remotePeerId} miss ${t}`)}_prepareForBinary(e,t,r,i){this.bufArr=[],this.remainAttachments=e,this.segId=t,this.bufSN=r,this.expectedSize=i}_handleBinaryData(t=!1){if(this.listenerCount(e.DC_RESPONSE)>0){t&&this.bufArr.reverse();let r=a.l.concat(this.bufArr);const i=r.byteLength;if(i===this.expectedSize){let t=r.buffer;const i=new P(this.bufSN,this.segId,t,this.remotePeerId,this.pieceMsg.level);this.emit(e.DC_RESPONSE,i,this.weight)}else this.logger.error(`${this.segId} expectedSize ${this.expectedSize} != byteLength ${i}`)}this.segId="",this.bufArr=[],this._loadedBytes=0}checkIfNeedChoke(e=!1){const{logger:t}=this,r=performance.now()-this.timeSendRequest;if(!e&&r<1500)t.info(`duration ${r} no need choke`);else if(this.miss++,t.info(`${this.remotePeerId} miss ${this.miss}`),this.miss>2&&!this.choked){this.choked=!0;const e=30*this.miss;e<=150?(t.warn(`datachannel ${this.channelId} is choked`),this.chokeTimer=setTimeout((()=>{this.choked=!1,t.warn(`datachannel ${this.channelId} is unchoked`)}),1e3*e)):t.warn(`datachannel ${this.channelId} is choked permanently`)}}get bufArrSize(){return this.downloading?this.pieceMsg.attachments-this.remainAttachments:0}loadtimeout(){const{logger:e,pieceMsg:t}=this;return e.warn(`timeout while downloading from ${this.remotePeerId}, ${this.bufArrSize} of ${t.attachments} packets loaded`),this.checkIfNeedChoke(),!0}sendMsgPieceAbort(t){(this.uploading||0!==this.datasToSend.length)&&(this.uploading=!1,this.sendJson({event:e.DC_PIECE_ABORT,reason:t}))}loadedBytes(){return this._loadedBytes}currentLoadSpeed(){return 0===this.timeReceivePiece?0:this.loadedBytes()/(performance.now()-this.timeReceivePiece)}minRequiredSpeed(e){return(this.pieceMsg.size-this.loadedBytes())/e}}const O=k,M={DPlayer:"dplayer",CBPlayer:"cbplayer",jwplayer:"jwplayer",videojs:"videojs",Clappr:"clappr",ckplayer:"ckplayer",MediaElementPlayer:"mediaelement",MediaElement:"mediaelement",TcPlayer:"tcplayer",flowplayer:"flowplayer",Chimee:"chimee",ChimeePlayer:"chimee",HlsJsPlayer:"xgplayer",fluidPlayer:"fluidplayer",OpenPlayer:"openplayer",Plyr:"plyr",Playerjs:"playerjs",Aliplayer:"aliplayer",shaka:"shakaplayer"};function x(){let e;for(let t in M)if(window[t]){e=M[t];break}return e}const F="nllL",N="d3NzJ",B="==",U="TNBLy9z",G="aWduY",j="mNvbQ",H="WwuY2RuY";class $ extends(n()){constructor(e={}){if(super(),this.p2pEnabled=!(!1===e.p2pEnabled||"0"===h("_p2p")),e.tag&&e.tag.length>20)throw new Error("Tag is too long");if(e.appName&&e.appName.length>30)throw new Error("appName is too long");if(e.appId&&e.appId.length>30)throw new Error("appId is too long");if(e.token&&e.token.length>20)throw new Error("Token is too long")}initLogger(){const{config:e}=this;e.showSlogan&&"en"==("zh-CN"===(navigator.language||navigator.userLanguage)?"cn":"en")&&console.log(`%cLet the browsers become your unlimitedly scalable CDN!\n%c${window.atob("aHR0cHM6Ly9zd2FybWNsb3VkLm5ldC9lbi8=")}`,"color: dodgerblue; padding:20px 0; font-size: x-large","font-size: medium; padding-bottom:15px");const t=new S(e.logLevel);return e.logger=this.logger=t,t}getExtraForStats(){return{}}getExtraForPeersRequest(){const e={};return e.num_want=this._getNumWant(),e}_getNumWant(){const{tracker:e}=this,t=e.scheduler.peersNum;if(t>0&&e.maxConnsActive-t>0)return e.maxConnsActive-t}makeChannelId(e,t){if(!e||"string"!=typeof e){const e="token is required while using customized channelId!";throw console.error(e),new Error(e)}return"function"==typeof t?(r,i)=>`${e}-${t(r,i)}`:()=>`${e}-${t}`}makeSignalId(){let e="";const{config:t}=this,r=decodeURIComponent(window.atob(N+U+G+H+F+j+B)),{wsSignalerAddr:i}=t;if(i){let s;"object"==typeof i?(i.main||(i.main=r),s=i.main):"string"==typeof i&&(s=i,t.wsSignalerAddr={main:s}),s===r&&(s=void 0),s&&!t.wsSignalerAddr.backup&&(e=b().parseURL(s).netLoc.substr(2))}else t.wsSignalerAddr={main:r,default:!0};return e}get commonBrowserInfo(){const e=C().getPlatform(),t=C().getNetType()||"wifi";return this.netType=t,{device:e,netType:t,player:x()||void 0}}get isMobileNet(){return"wifi"!==this.netType&&"ethernet"!==this.netType}setupWindowListeners(e){const t=["iPad","iPhone"].indexOf(navigator.platform)>=0?"pagehide":"beforeunload",r=()=>{this.fetcher&&this.fetcher.postStatsWithBeacon(),this.p2pEnabled&&this.disableP2P(),window.removeEventListener(t,r)};e?window.removeEventListener(t,r):window.addEventListener(t,r)}destroy(){this.disableP2P(!0),this.removeAllListeners(),this.setupWindowListeners(!0)}enableP2P(){return this.p2pEnabled?null:(this.logger&&this.logger.info("enable P2P"),this.config.p2pEnabled=this.p2pEnabled=!0,this.browserInfo?(this._init(this.channel,this.browserInfo),this):null)}get version(){return $.version}static isSupported(){const e=f();return!(!e||void 0===e.RTCPeerConnection.prototype.createDataChannel)}static get TrackerZone(){return{CN:"cn",EU:"eu",HK:"hk",USA:"us"}}}$.version="2.7.4",$.protocolVersion=O.VERSION;const W=$;function K(e,t){let r;if(e&&("string"==typeof e?r=document.querySelector(e):e instanceof HTMLMediaElement&&(r=e)),!r){const e=[...document.getElementsByTagName("video"),...document.getElementsByTagName("audio")];1===e.length?r=e[0]:(t&&(r=e.find((e=>e.src===t))),r||(r=e.find((e=>e.currentTime>0))))}return r}let q={wsMaxRetries:10,p2pEnabled:!0,wifiOnly:!1,memoryCacheLimit:{pc:629145600,mobile:314572800},dcDownloadTimeout:25,logLevel:"error",tag:"",webRTCConfig:{},token:void 0,appName:void 0,appId:void 0,prefetchNum:5,showSlogan:!1,trickleICE:!0,announceLocation:"cn",trackerZone:void 0,geoIpPreflight:!0,getStats:function(e,t,r){},getPeerId:function(e){},getPeersInfo:function(e){}};const V={...q,httpLoadTime:3,sharePlaylist:!1,useHttpRange:!0,hlsjsInstance:null,proxyOnly:!1,p2pBlackList:["aac","mp3","vtt","webvtt","key"],live:!0,swFile:"./sw.js",swScope:"./",swAutoRegister:!0,mediaElem:void 0,httpStreamEnabled:!0,swStreamEnabled:!0,diskCacheLimit:{pc:262144e4,mobile:1572864e3},useDiskCache:!0,waitForPeer:!1,waitForPeerTimeout:4,strictSegmentId:!1},z="store not init";function Y(e){return new Promise(((t,r)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>r(e.error)}))}function X(e,t){return t?t("readonly",(t=>Y(t.get(e)))):Promise.reject(z)}function Q(e,t,r){return r?r("readwrite",(r=>(r.put(t,e),Y(r.transaction)))):Promise.reject(z)}function J(e,t){return t?t("readwrite",(t=>(t.delete(e),Y(t.transaction)))):Promise.reject(z)}function Z(e,t){return e.openCursor().onsuccess=function(){this.result&&(t(this.result),this.result.continue())},Y(e.transaction)}const ee="size";class te extends(n()){constructor(e,t){super(),this.name="SegmentStore",this.logger=t.logger,this.logger.info("use SegmentStore"),this.channel=e.channel;const r=e.browserInfo.device;this.isPC=r===C().device.PC_WEB||r===C().device.PC_NATIVE,this.maxBufSize=this.isPC?t.diskCacheLimit.pc:t.diskCacheLimit.mobile,this.overflowed=!1,this.loadingSN=0}async setupStore(){if(navigator.storage&&navigator.storage.estimate){const e=await navigator.storage.estimate(),t=Math.floor(e.quota-e.usage);t{if(this.isPC&&this.maxBufSize<629145600||!this.isPC&&this.maxBufSize<367001600)return void t("disk storage not enough");let r=function(e,t){const r=indexedDB.open(e);r.onupgradeneeded=()=>{const e=r.result;t.forEach((t=>{e.createObjectStore(t)}))};const i=Y(r);return t.map((e=>(t,r)=>i.then((i=>r(i.transaction(e,t).objectStore(e))))))}(this.channel,["segments","id2Sn","metadata"]);this.segmentsStore=r[0],this.id2SnStore=r[1],this.metaStore=r[2];const i=setTimeout((()=>{t("setupStore timeout")}),500);this._initMetaStore().then((()=>{clearTimeout(i),e()})).catch((e=>{t(e)}))}))}_initMetaStore(){return new Promise(((e,t)=>{X(ee,this.metaStore).then((t=>{t||(this.logger.info("init MetaStore size"),Q(ee,0,this.metaStore)),e()})).catch((e=>{t()}))}))}currBufSize(){return X(ee,this.metaStore)}async hasSegOfId(e){if(!e)return Promise.resolve(!1);const t=await X(e,this.id2SnStore);return new Promise(((r,i)=>{void 0!==t?X(t,this.segmentsStore).then((t=>{t&&t.length>0&&t.some((t=>t.segId===e))?r(!0):r(!1)})).catch((e=>{this.logger.error(e),r(!1)})):r(!1)}))}async getSegById(e){if(!e)return null;const t=await X(e,this.id2SnStore);return new Promise(((e,r)=>{void 0!==t?X(t,this.segmentsStore).then((t=>{if(t&&t.length>0){const r=t[0];if(!y(r.data))return this.logger.error(`getSegById ${r.sn} is not buffer`),void e(null);e(P.fromSegment(r))}else e(null)})).catch((t=>{this.logger.error(t),e(null)})):e(null)}))}getSegIdBySN(e){return new Promise(((t,r)=>{X(e,this.segmentsStore).then((e=>{e&&e.length>0?t(e[0].segId):t(null)})).catch((e=>{this.logger.error(e),t(null)}))}))}putSeg(t){const{logger:r}=this;y(t.data)?this._addSeg(t).then((t=>{this.emit(`${e.BM_ADDED_SN_}${t.sn}`,t),this.emit(e.BM_SEG_ADDED,t)})).catch((e=>{r.error(e),("QuotaExceededError"===e.name||e.inner&&"QuotaExceededError"===e.inner.name)&&this._trimDisk(!0)})):r.error(`putSeg ${t.sn} is not buffer`)}_addSeg(e){const{segId:t,sn:r}=e;return Q(t,r,this.id2SnStore),new Promise(((i,s)=>{X(r,this.segmentsStore).then((n=>{n?0===n.filter((e=>e.segId===t)).length&&(n.push(this._segmentToCache(e)),Q(r,n,this.segmentsStore).then((()=>{this._increaseBufSize(e.data.byteLength),i(e)})).catch((e=>{s(e)}))):Q(r,[this._segmentToCache(e)],this.segmentsStore).then((()=>{this._increaseBufSize(e.data.byteLength),i(e)})).catch((e=>{s(e)}))})).catch((e=>{s(e)}))}))}async _trimDisk(t=!1){let r=this.maxBufSize;const{logger:i}=this;let s=await this.currBufSize();var n;(t&&(r=s-52428800,r<0&&(r=0)),s{if(e.getAllKeys)return Y(e.getAllKeys());const t=[];return Z(e,(e=>t.push(e.key))).then((()=>t))})):Promise.reject(z)).then((async t=>{const n=t.sort(((e,t)=>e-t));let a=0;do{if(a++>10){console.error("too much loops in SegmentStore");break}const t=n.shift();if(void 0===t){i.error("lastSN not found");continue}if(t>=this.loadingSN){i.warn(`trimDisk failed, loadingSN ${this.loadingSN}`);break}const r=n[0],o=await X(t,this.segmentsStore);if(!o){i.warn("lastSeg not found");continue}let l=0;o.forEach((e=>{l+=e.data.byteLength})),J(t,this.segmentsStore).then((()=>{this._decreaseBufSize(parseInt(l))})),o.forEach((s=>{J(s.segId,this.id2SnStore),i.info(`pop seg ${s.segId} size ${s.data.byteLength}`),this.emit(e.BM_LOST,{sn:t,segId:s.segId,next:r,level:s.level})})),s-=l,i.info(`pop sn ${t} size ${l} currBufSize ${s}`),this.overflowed||(this.overflowed=!0)}while(s>=r)}))}_decreaseBufSize(e){X(ee,this.metaStore).then((t=>{t&&Q(ee,t-e,this.metaStore)})).catch((e=>{this.logger.error(e)}))}_increaseBufSize(e){X(ee,this.metaStore).then((t=>{Q(ee,t+e,this.metaStore),this._trimDisk()})).catch((e=>{this.logger.error(e)}))}_segmentToCache(e){return{data:e.data,level:e.level,segId:e.segId,sn:e.sn}}clear(){this.logger.warn("clear segment store");try{this._clearDisk()}catch(e){}}_clearDisk(e){return function(e){return new Promise(((t,r)=>{indexedDB.databases().then((i=>{const s=i.filter((t=>t.name!==e)).map((e=>new Promise(((t,r)=>{const i=indexedDB.deleteDatabase(e.name);i.onsuccess=t,i.onerror=r,i.onblocked=r}))));Promise.all(s).then(t).catch(r)})).catch(r)})).catch((e=>{}))}(e)}destroy(){this.clear(),this.removeAllListeners()}}const re=te;class ie extends(n()){constructor(e,t){super(),this.name="SegmentCache",this.logger=t.logger,this.logger.info("use SegmentCache");const r=e.browserInfo.device;if(this.maxBufSize=r===C().device.PC_WEB||r===C().device.PC_NATIVE?t.memoryCacheLimit.pc:t.memoryCacheLimit.mobile,t.live)this.maxBufSize=31457280;else{const e=function(){const{memory:e}=performance;return e?e.jsHeapSizeLimit-e.usedJSHeapSize:-1}();e>=0&&e{const i=this.id2Sn.get(e);this._segPool.has(i)?t(this._segPool.get(i).some((t=>t.segId===e))):t(!1)}))}getSegById(e){const t=this.id2Sn.get(e);return new Promise(((r,i)=>{if(!this._segPool.has(t))return void r(null);const s=this._segPool.get(t);for(let t of s)if(t.segId===e)return void r(t);r(null)}))}getSegIdBySN(e){return new Promise(((t,r)=>{if(this._segPool.has(e)){t(this._segPool.get(e)[0].segId)}else t(null)}))}_calSegPoolSize(){let e=0;return this._segPool.forEach((t=>{t.forEach((t=>{e+=t.size}))})),e}putSeg(e){this._currBufSize>=1.5*this.maxBufSize&&(this._currBufSize=this._calSegPoolSize(),this._currBufSize>=1.5*this.maxBufSize&&(this.clear(),this.overflowed=!1)),y(e.data)?this._addSeg(e):this.logger.error(`putSeg ${e.sn} is not buffer`)}_addSeg(t){const{logger:r}=this,{segId:i,sn:s,size:n}=t;if(this.id2Sn.set(i,s),this._segPool.has(s)){this._segPool.get(s).push(t)}else this._segPool.set(s,[t]);this._currBufSize+=parseInt(n);const a=this._segPool.size;if(this.emit(`${e.BM_ADDED_SN_}${t.sn}`,t),this.emit(e.BM_SEG_ADDED,t),this._currBufSizee-t));let l=0;do{if(l++>10){console.error("too much loops in SegmentCache");break}const t=o.shift();if(void 0===t){r.error("lastSN not found");continue}const i=o[0],s=this._segPool.get(t);if(!s){r.error("lastSeg not found");continue}let n=0;s.forEach((e=>{n+=e.size})),this._currBufSize-=parseInt(n),this._segPool.delete(t),s.forEach((r=>{this.id2Sn.delete(r.segId),this.emit(e.BM_LOST,{sn:t,segId:r.segId,next:i,level:r.level})})),r.info(`pop sn ${t} size ${n} currBufSize ${this._currBufSize}`),this.overflowed||(this.overflowed=!0)}while(this._currBufSize>=this.maxBufSize&&this._segPool.size>5)}clear(){this.logger.warn("clear segment cache"),this._segPool.clear(),this.id2Sn.clear(),this._currBufSize=0}destroy(){this.clear(),this.removeAllListeners()}}const se=ie;class ne extends W{constructor(e={}){super(e),e.validateSegment||(e.validateSegment=function(e,t){return!0}),this.config=Object.assign({},V,e),this.rangeTested=!1,this.lastLevel=0,this.multiBitrate=!1}setup(){let{token:e,channelId:t,segmentId:r,strictSegmentId:i}=this.config,s=e=>{const t=b().parseURL(e);return`${t.netLoc.substr(2)+t.path.substring(0,t.path.lastIndexOf("."))}`},n=i?(e,t,r,i)=>{let s=r.split("?")[0];return s.startsWith("http")&&(s=s.split("://")[1]),i?`${s}|${i}`:`${s}`}:(e,t)=>`${e}-${t}`;t&&(s=this.makeChannelId(e,t)),r||(this.config.segmentId=n);return{channelIdMaker:s,signalId:this.makeSignalId(),browserInfo:{...this.commonBrowserInfo,tag:this.config.tag||void 0}}}setupElectron(){this.browserInfo.device===R.device.PC_NATIVE&&(this.browserInfo={...this.browserInfo,app:this.config.appName,bundle:this.config.appId})}getExtraForStats(){const e=super.getExtraForStats();return!this.config.live&&this.media&&(e.pos=Math.round(this.media.currentTime)),this.multiBitrate&&this.currentLevel!==this.lastLevel&&(e.level=this.currentLevel+"",this.lastLevel=this.currentLevel),e}getExtraForPeersRequest(){const e=super.getExtraForPeersRequest();return this.multiBitrate&&(e.level=this.currentLevel+""),e}destroy(){super.destroy()}async initSegmentManager(){const{logger:e,config:t}=this;if(window.indexedDB&&t.useDiskCache&&!t.live){const r=new re(this,t);try{await r.setupStore(),this.bufMgr=r}catch(r){e.warn(r),this.bufMgr=new se(this,t)}}else this.bufMgr=new se(this,t);if(this.bufMgr.maxBufSize<=0)throw new Error("bufMgr state is invalid")}getTagForVod(){const e=`${(0,R.getBrowser)()}${p()?"s":""}`;return this.bufMgr?`${e}_${"SegmentStore"===this.bufMgr.name?"d":"m"}`:e}}class ae{constructor(){this.method=null,this.key=null,this.iv=null,this._uri=null}get uri(){return!this._uri&&this.reluri&&(this._uri=T.buildAbsoluteURL(this.baseuri,this.reluri,{alwaysNormalize:!0})),this._uri}}class oe{constructor(){this._url=null,this._byteRange=null,this._decryptdata=null,this.tagList=[],this.programDateTime=null,this.rawProgramDateTime=null,this._elementaryStreams={[oe.ElementaryStreamTypes.AUDIO]:!1,[oe.ElementaryStreamTypes.VIDEO]:!1}}static get ElementaryStreamTypes(){return{AUDIO:"audio",VIDEO:"video"}}get url(){return!this._url&&this.relurl&&(this._url=T.buildAbsoluteURL(this.baseurl,this.relurl,{alwaysNormalize:!0})),this._url}set url(e){this._url=e}get byteRange(){if(!this._byteRange&&!this.rawByteRange)return[];if(this._byteRange)return this._byteRange;let e=[];if(this.rawByteRange){const t=this.rawByteRange.split("@",2);if(1===t.length){const t=this.lastByteRangeEndOffset;e[0]=t||0}else e[0]=parseInt(t[1]);e[1]=parseInt(t[0])+e[0],this._byteRange=e}return e}get byteRangeStartOffset(){return this.byteRange[0]}get byteRangeEndOffset(){return this.byteRange[1]}get decryptdata(){return this._decryptdata||(this._decryptdata=this.fragmentDecryptdataFromLevelkey(this.levelkey,this.sn)),this._decryptdata}get endProgramDateTime(){if(!Number.isFinite(this.programDateTime))return null;let e=Number.isFinite(this.duration)?this.duration:0;return this.programDateTime+1e3*e}get encrypted(){return!(!this.decryptdata||null===this.decryptdata.uri||null!==this.decryptdata.key)}addElementaryStream(e){this._elementaryStreams[e]=!0}hasElementaryStream(e){return!0===this._elementaryStreams[e]}createInitializationVector(e){let t=new Uint8Array(16);for(let r=12;r<16;r++)t[r]=e>>8*(15-r)&255;return t}fragmentDecryptdataFromLevelkey(e,t){let r=e;return e&&e.method&&e.uri&&!e.iv&&(r=new ae,r.method=e.method,r.baseuri=e.baseuri,r.reluri=e.reluri,r.iv=this.createInitializationVector(t)),r}}class le{constructor(e){this.endCC=0,this.endSN=0,this.fragments=[],this.initSegment=null,this.live=!0,this.needSidxRanges=!1,this.startCC=0,this.startSN=0,this.startTimeOffset=null,this.targetduration=0,this.totalduration=0,this.type=null,this.url=e,this.version=null}get hasProgramDateTime(){return!(!this.fragments[0]||!Number.isFinite(this.fragments[0].programDateTime))}}const he=/^(\d+)x(\d+)$/,ue=/\s*(.+?)\s*=((?:\".*?\")|.*?)(?:,|$)/g;class ce{constructor(e){"string"==typeof e&&(e=ce.parseAttrList(e));for(let t in e)e.hasOwnProperty(t)&&(this[t]=e[t])}decimalInteger(e){const t=parseInt(this[e],10);return t>Number.MAX_SAFE_INTEGER?1/0:t}hexadecimalInteger(e){if(this[e]){let t=(this[e]||"0x").slice(2);t=(1&t.length?"0":"")+t;const r=new Uint8Array(t.length/2);for(let e=0;eNumber.MAX_SAFE_INTEGER?1/0:t}decimalFloatingPoint(e){return parseFloat(this[e])}enumeratedString(e){return this[e]}decimalResolution(e){const t=he.exec(this[e]);if(null!==t)return{width:parseInt(t[1],10),height:parseInt(t[2],10)}}static parseAttrList(e){let t,r={};for(ue.lastIndex=0;null!==(t=ue.exec(e));){let e=t[2],i='"';0===e.indexOf(i)&&e.lastIndexOf(i)===e.length-1&&(e=e.slice(1,-1)),r[t[1]]=e}return r}}const de=ce,fe={audio:{a3ds:!0,"ac-3":!0,"ac-4":!0,alac:!0,alaw:!0,dra1:!0,"dts+":!0,"dts-":!0,dtsc:!0,dtse:!0,dtsh:!0,"ec-3":!0,enca:!0,g719:!0,g726:!0,m4ae:!0,mha1:!0,mha2:!0,mhm1:!0,mhm2:!0,mlpa:!0,mp4a:!0,"raw ":!0,Opus:!0,samr:!0,sawb:!0,sawp:!0,sevc:!0,sqcp:!0,ssmv:!0,twos:!0,ulaw:!0},video:{avc1:!0,avc2:!0,avc3:!0,avc4:!0,avcp:!0,drac:!0,dvav:!0,dvhe:!0,encv:!0,hev1:!0,hvc1:!0,mjp2:!0,mp4v:!0,mvc1:!0,mvc2:!0,mvc3:!0,mvc4:!0,resv:!0,rv60:!0,s263:!0,svc1:!0,svc2:!0,"vc-1":!0,vp08:!0,vp09:!0}};const ge=/#EXT-X-STREAM-INF:([^\n\r]*)[\r\n]+([^\r\n]+)/g,pe=/#EXT-X-MEDIA:(.*)/g,ve=new RegExp([/#EXTINF:\s*(\d*(?:\.\d+)?)(?:,(.*)\s+)?/.source,/|(?!#)([\S+ ?]+)/.source,/|#EXT-X-BYTERANGE:*(.+)/.source,/|#EXT-X-PROGRAM-DATE-TIME:(.+)/.source,/|#.*/.source].join(""),"g"),me=/(?:(?:#(EXTM3U))|(?:#EXT-X-(PLAYLIST-TYPE):(.+))|(?:#EXT-X-(MEDIA-SEQUENCE): *(\d+))|(?:#EXT-X-(TARGETDURATION): *(\d+))|(?:#EXT-X-(KEY):(.+))|(?:#EXT-X-(START):(.+))|(?:#EXT-X-(ENDLIST))|(?:#EXT-X-(DISCONTINUITY-SEQ)UENCE:(\d+))|(?:#EXT-X-(DIS)CONTINUITY))|(?:#EXT-X-(VERSION):(\d+))|(?:#EXT-X-(MAP):(.+))|(?:(#)([^:]*):(.*))|(?:(#)(.*))(?:.*)\r?\n?/,ye=/\.(mp4|m4s|m4v|m4a)$/i;class Ee{static findGroup(e,t){if(!e)return null;let r=null;for(let i=0;i2?(t=r.shift()+".",t+=parseInt(r.shift()).toString(16),t+=("000"+parseInt(r.shift()).toString(16)).substr(-4)):t=e,t}static resolve(e,t){return T.buildAbsoluteURL(t,e,{alwaysNormalize:!0})}static parseMasterPlaylist(e,t){let r,i=[];function s(e,t){["video","audio"].forEach((r=>{const i=e.filter((e=>function(e,t){const r=fe[t];return!!r&&!0===r[e.slice(0,4)]}(e,r)));if(i.length){const s=i.filter((e=>0===e.lastIndexOf("avc1",0)||0===e.lastIndexOf("mp4a",0)));t[`${r}Codec`]=s.length>0?s[0]:i[0],e=e.filter((e=>-1===i.indexOf(e)))}})),t.unknownCodecs=e}for(ge.lastIndex=0;null!=(r=ge.exec(e));){const e={},n=e.attrs=new de(r[1]);e.url=Ee.resolve(r[2],t);const a=n.decimalResolution("RESOLUTION");a&&(e.width=a.width,e.height=a.height),e.bitrate=n.decimalInteger("AVERAGE-BANDWIDTH")||n.decimalInteger("BANDWIDTH"),e.name=n.NAME,s([].concat((n.CODECS||"").split(/[ ,]+/)),e),e.videoCodec&&-1!==e.videoCodec.indexOf("avc1")&&(e.videoCodec=Ee.convertAVC1ToAVCOTI(e.videoCodec)),i.push(e)}return i}static parseMasterPlaylistMedia(e,t,r,i=[]){let s,n=[],a=0;for(pe.lastIndex=0;null!==(s=pe.exec(e));){const e={},o=new de(s[1]);if(o.TYPE===r){if(e.groupId=o["GROUP-ID"],e.name=o.NAME,e.type=r,e.default="YES"===o.DEFAULT,e.autoselect="YES"===o.AUTOSELECT,e.forced="YES"===o.FORCED,o.URI&&(e.url=Ee.resolve(o.URI,t)),e.lang=o.LANGUAGE,e.name||(e.name=e.lang),i.length){const t=Ee.findGroup(i,e.groupId);e.audioCodec=t?t.codec:i[0].codec}e.id=a++,n.push(e)}}return n}static parseLevelPlaylist(e,t){let r,i,s=0,n=0,a=new le(t),o=new ae,l=0,h=null,u=new oe,c=null;for(ve.lastIndex=0;null!==(r=ve.exec(e));){const e=r[1];if(e){u.duration=parseFloat(e);const t=(" "+r[2]).slice(1);u.title=t||null,u.tagList.push(t?["INF",e,t]:["INF",e])}else if(r[3]){if(Number.isFinite(u.duration)){const e=s++;u.start=n,u.levelkey=o,u.sn=e,u.cc=l,u.baseurl=t,u.relurl=(" "+r[3]).slice(1),Se(u,h),a.fragments.push(u),h=u,n+=u.duration,u=new oe}}else if(r[4]){if(u.rawByteRange=(" "+r[4]).slice(1),h){const e=h.byteRangeEndOffset;e&&(u.lastByteRangeEndOffset=e)}}else if(r[5])u.rawProgramDateTime=(" "+r[5]).slice(1),u.tagList.push(["PROGRAM-DATE-TIME",u.rawProgramDateTime]),null===c&&(c=a.fragments.length);else{for(r=r[0].match(me),i=1;i=0&&(o.method=f,o.baseuri=t,o.reluri=g,o.key=null,o.iv=p));break;case"START":let i=new de(e).decimalFloatingPoint("TIME-OFFSET");Number.isFinite(i)&&(a.startTimeOffset=i);break;case"MAP":let h=new de(e);u.relurl=h.URI,u.rawByteRange=h.BYTERANGE,u.baseurl=t,u.sn="initSegment",a.initSegment=u,u=new oe,u.rawProgramDateTime=a.initSegment.rawProgramDateTime;break;default:console.warn(`line parsed but not handled: ${r}`)}}}return u=h,u&&!u.relurl&&(a.fragments.pop(),n-=u.duration),a.totalduration=n,a.averagetargetduration=n/a.fragments.length,a.endSN=s-1,a.startCC=a.fragments[0]?a.fragments[0].cc:0,a.endCC=l,!a.initSegment&&a.fragments.length&&a.fragments.every((e=>ye.test(e.relurl)))&&(console.warn("MP4 fragments found but no init segment (probably no MAP, incomplete M3U8), trying to fetch SIDX"),u=new oe,u.relurl=a.fragments[0].relurl,u.baseurl=t,u.level=id,u.sn="initSegment",a.initSegment=u,a.needSidxRanges=!0),c&&function(e,t){let r=e[t];for(let i=t-1;i>=0;i--){const t=e[i];t.programDateTime=r.programDateTime-1e3*t.duration,r=t}}(a.fragments,c),a}}function Se(e,t){e.rawProgramDateTime?e.programDateTime=Date.parse(e.rawProgramDateTime):t&&t.programDateTime&&(e.programDateTime=t.endProgramDateTime),Number.isFinite(e.programDateTime)||(e.programDateTime=null,e.rawProgramDateTime=null)}var Te=r(485),be=r.n(Te),_e=r(934),Le=r.n(_e);const Ae=e=>{const t=localStorage.getItem(e);try{const e=JSON.parse(t);return e.value?e.value:e}catch(e){return t}},De=(e,t,r)=>{((e,t)=>{"object"==typeof t&&(t=JSON.stringify(t)),localStorage.setItem(e,t)})(e,{value:t,duration:r,startTime:(new Date).getTime()})};class we{constructor(){this.p2p=0,this.share=0,this.http=0}recordP2p(e){this.p2p+=e}recordShare(e){this.share+=e}recordHttp(e){this.http+=e}resetTraffic(){this.p2p=0,this.share=0,this.http=0}get healthRatio(){if(0===this.http)return 1e3;let e=Math.round((this.p2p+this.share)/this.http*100);return e<=0&&(e=1),e}}const Ie="SW_GEOIP_KEY",Pe="TRACKER_EXPT",Re="IPAPI_ERROR",Ce="Y24u",ke="Y2Ru",Oe="Nvb",Me="YnllLm",xe="Q==",Fe="aGsuc3d",Ne="hcm1j",Be="bG91ZC",Ue="5uZXQ=",Ge=Symbol("httpDownloaded"),je=Symbol("p2pDownloaded"),He=Symbol("p2pUploaded");class $e extends(n()){constructor(e,t,r,i,s){let n;super(),this.config=e.config;let a=this.config.announceLocation;switch(this.config.trackerZone&&(a=this.config.trackerZone),a){case"cn":case"eu":n=Ce+ke+Me+Oe+xe;break;case"hk":n=Fe+Ne+Be+Ue;break;case"us":n="dXMuaGR0dmNsb3VkLmNvbQ=="}this.engine=e,this.key=t||void 0,this.baseUrl=i||`https://${window.atob(n)}/v1`,this.channelId=window.btoa(r),this.timestamp=u(),this.health=new we;const o=b().parseURL(this.baseUrl).netLoc;this.announce=o.replace(/\/\//,"");const l=function(e,t,r,i,s,n){let a=location.hostname;"localhost"===a&&n&&(a=`${n}.${a}`);function o(e,t,r,i,s,n){return be()(e+t+r+i+s,n)}const l=o(a,t,r,i,s,e);return l.substr(0,8)}(this.timestamp,"2.7.4",this.announce,this.channelId,s.type,this.key);this.native=!!s.bundle,this.announceInfo={...s,channel:this.channelId,ts:this.timestamp,version:"2.7.4",v:l,announce:this.announce,token:this.key},this.announceURL=`${this.baseUrl}/channel`,this.reportFails=0,this.statsRequesting=!1,this.forbidden=!1,this.failConns=0,this.totalHTTPDownloaded=0,this.totalP2PDownloaded=0,this.totalP2PUploaded=0,this[Ge]=0,this[je]=0,this[He]=0,this.speed=0,this.offline=!1,this.errsBufStalled=0,this.mediaRequests=0,this.errsInternalExpt=0}geoipRequest(){const{logger:e}=this.engine;return new Promise(((t,r)=>{if((e=>{const t=localStorage.getItem(e);try{const e=JSON.parse(t);return!(!e.duration||!e.startTime)&&(new Date).getTime()-e.startTimee.json())).then((e=>{if("success"===e.status){const r=e.mobile?432e5:2592e5;De(Ie,e,r),t(e)}else{const t=new Error(`preflight status ${e.status}`);r(Le()(t,Re))}})).catch((e=>{r(e)}))}))}btAnnouncePreflight(){const{logger:e}=this.engine;return this.announceInfo.asn?this.btAnnounce():(e.info("preflight ip-api"),Promise.race([this.geoipRequest(),new Promise(((e,t)=>{setTimeout((()=>{t(Le()(new Error("request timeout"),Re))}),600)}))]).then((e=>(this._parseGeoResponse(e),this.btAnnounce()))).catch((t=>{if(t.code!==Pe){const t=Ae(Ie);return t&&(e.info("use expired ipData"),this._parseGeoResponse(t)),this.btAnnounce()}throw t})))}_parseGeoResponse(e){const{lat:t,lon:r,isp:i,as:s,mobile:n,countryCode:a,continentCode:o}=e;n&&(this.announceInfo.netType="cellular");const l=s.split(" ")[0].substr(2);this.announceInfo.tag||(this.announceInfo.tag=`${o||""}-${(0,R.getBrowser)()}${p()?"s":""}`),this.announceInfo={...this.announceInfo,lat:t,lon:r,isp:i,asn:l,country:a}}btAnnounce(){const{logger:e}=this.engine;return this.announceInfo.tag||(this.announceInfo.tag=`${(0,R.getBrowser)()}${p()?"s":""}`),new Promise(((t,r)=>{fetch(this.announceURL,{headers:this._requestHeader,method:"POST",body:JSON.stringify(this.announceInfo)}).then((e=>{if(!e.ok){const t=e.status>=500&&e.status<600;r(Le()(new Error(`server response code is ${e.status}`),Pe,{retry:t}))}return e.json()})).then((e=>{this.engine||r(Le()(new Error("runtime error"),Pe,{retry:!1}));const i=e.data;if(i.f&&(this.forbidden=!0),-1===e.ret){const{code:t,msg:i}=e.data;r(Le()(new Error(i),Pe,{retry:t>=5e3}))}else i.info&&console.info(`${i.info}`),i.warn&&console.warn(`${i.warn}`),i.min_conns||(i.min_conns=8),(!i.rejected||i.rejected&&i.share_only)&&i.id&&i.report_interval&&i.peers?(this.peerId=this.id=i.id,i.report_interval<20&&(i.report_interval=20),this.btStats(i.report_interval),this.getPeersURL=`${this.baseUrl}/channel/${this.channelId}/node/${this.peerId}/peers`,this.statsURL=`${this.baseUrl}/channel/${this.channelId}/node/${this.peerId}/stats`,t(i)):(this.engine&&(this.engine.p2pEnabled=!1),r(Le()(new Error("msg not valid"),Pe,{retry:!1})))})).catch((t=>{e.error(`btAnnounce error ${t}`),r(Le()(t,Pe,{retry:!0}))}))}))}btStats(e=10){this.heartbeater=setInterval((()=>{this.postStats()}),1e3*e)}postStatsWithBeacon(){if(this.offline)return;this.offline=!0;let e={off:!0};this.statsRequesting||(e={...e,...this._makeStatsBody()}),navigator.sendBeacon(this.statsURL,JSON.stringify(e))}postStats(){const{logger:t}=this.engine;this.statsRequesting=!0,fetch(this.statsURL,{method:"POST",body:JSON.stringify(this._makeStatsBody())}).then((e=>(this.statsRequesting=!1,this.reportFails=0,e.text()))).then((r=>{let i;if(i=r?JSON.parse(r):{ret:0,data:{}},-1===i.ret)clearInterval(this.heartbeater),t.error(`${i.data.msg} code ${i.data.code}`),this.engine.emit(e.RESTART_P2P);else{const{http:e=0,p2p:t=0,share:r=0,failConns:i=0,rebuffers:s=0,requests:n=0,errsInternalExpt:a=0}=this.lastStats||{};this[Ge]>=e&&(this[Ge]-=e),this[je]>=t&&(this[je]-=t),this[He]>=r&&(this[He]-=r),this.failConns>=i&&(this.failConns-=i),this.errsBufStalled>=s&&(this.errsBufStalled-=s),this.mediaRequests>=n&&(this.mediaRequests-=n),this.errsInternalExpt>=a&&(this.errsInternalExpt-=a),this.exptMsg&&(this.exptMsg=void 0)}})).catch((e=>{t.error(`btStats error ${e}`),this.statsRequesting=!1,this.reportFails++,this.reportFails>=3&&clearInterval(this.heartbeater)}))}btGetPeers(e,t=!1){const{logger:r}=this.engine,{asn:i,country:s}=this.announceInfo;let n={exclusions:e,asn:i,country:s,ratio:this.health.healthRatio,urgent:t||void 0},a={};return this.engine.getExtraForPeersRequest&&(a=this.engine.getExtraForPeersRequest()),n=Object.assign({},n,a),new Promise(((e,t)=>{fetch(this.getPeersURL,{headers:this._requestHeader,method:"POST",body:JSON.stringify(n)}).then((e=>e.json())).then((r=>{-1===r.ret?t(new Error(r.data.msg)):e(r.data)})).catch((e=>{r.error(`btGetPeers error ${e}`),t(e)})).finally((()=>{this.health.resetTraffic()}))}))}increFailConns(){this.failConns++}increRebuffers(){this.errsBufStalled++}increMediaRequests(){this.mediaRequests++}reportFlow(e){const t=Math.round(e/1024);this[Ge]+=t,this.totalHTTPDownloaded+=t,this.health.recordHttp(t),this._emitStats()}reportDCTraffic(e,t){const r=Math.round(e/1024);this[je]+=r,this.totalP2PDownloaded+=r,this.health.recordP2p(r),this.speed=Math.round(t),this._emitStats()}reportUploaded(e=0){const t=Math.round(e/1024);this.totalP2PUploaded+=t,this.health.recordShare(t),this[He]+=t,this._emitStats()}destroy(){const{logger:e}=this.engine;e.warn("destroy fetcher"),this.removeAllListeners(),clearInterval(this.heartbeater)}_emitStats(){this.engine.emit("stats",{totalHTTPDownloaded:this.totalHTTPDownloaded,totalP2PDownloaded:this.totalP2PDownloaded,totalP2PUploaded:this.totalP2PUploaded,p2pDownloadSpeed:this.speed});const e=this.config.getStats;e&&"function"==typeof e&&e(this.totalP2PDownloaded,this.totalP2PUploaded,this.totalHTTPDownloaded,this.speed)}_makeStatsBody(){const{asn:e,country:t}=this.announceInfo;let r={totalConns:this.engine.tracker.totalConns,failConns:this.failConns,rebuffers:this.errsBufStalled||void 0,requests:this.mediaRequests||void 0,errsInternalExpt:this.errsInternalExpt,http:Math.round(this[Ge])||0,p2p:Math.round(this[je])||0,share:Math.round(this[He])||0,asn:e,country:t},i={};return this.engine.getExtraForStats&&(i=this.engine.getExtraForStats()),r=Object.assign({},r,i),this.lastStats=JSON.parse(JSON.stringify(r)),Object.keys(r).forEach((e=>{0===r[e]&&delete r[e]})),this.exptMsg&&(r.exptMsg="2.7.4 "+this.exptMsg),r}get _requestHeader(){let e={};return this.native&&(e={...e,token:this.key,"User-Agent":"electron",appid:this.announceInfo.bundle}),e}}const We=$e;const Ke=0,qe=1,Ve=2,ze=3,Ye=(e,t,r,i,s)=>e.filter((e=>e.bitset.hasWithId(r,i,s,t)));class Xe{constructor(e=!1,t){this.isLive=e,this.levelMap=new Map;for(let e in t){const r=Number(e);if(r<0)continue;const i=new Map;if(t[e])for(let r of t[e])i.set(r,{state:qe,segId:void 0});this.levelMap.set(r,i)}}totalLevels(){return this.levelMap.size}hasWithId(e,t,r,i=Ke){if(t<0)return!1;const s=this._createOrGetSet(t).get(e);return!!s&&((!r||!s.segId||s.segId===r)&&(i===Ke||s.state===i))}has(e,t,r=Ke){return this.hasWithId(e,t,void 0,r)}hasCompleteOr(e,t,r=qe){const i=this._createOrGetSet(t).get(e);return!!i&&(i.state===qe||i.state===r)}getObj(e,t){let r=this._createOrGetSet(t).get(e);return r||(r={}),r}getSegId(e,t){return this.getObj(e,t).segId}getState(e,t){return this.getObj(e,t).state}delete(e,t){const r=this._createOrGetSet(t);return-1===t?(this.levelMap.forEach((t=>{t.delete(e)})),!0):r.delete(e)}add(e,t,r,i){if("number"!=typeof(s=e)||s%1!=0)return;var s;this._createOrGetSet(t).set(e,{state:i,segId:r}),this.isLive&&this._trimBitset(e)}array(e){const t=this._createOrGetSet(e);return this._keysForStateComplete(t)}allArray(){let e={};return this.levelMap.forEach(((t,r)=>{e[r]=this._keysForStateComplete(t)})),e}clear(){this.levelMap.forEach((e=>{e.clear()}))}size(e){return this._createOrGetSet(e).size}_createOrGetSet(e){"number"!=typeof e&&(e=Number(e));let t=this.levelMap.get(e);return t||(t=new Map,this.levelMap.set(e,t)),t}_trimBitset(e){const t=e-20;t>0&&this.levelMap.forEach((e=>{e.delete(t)}))}_keysForStateComplete(e){const t=[];for(let[r,i]of e)i.state===qe&&t.push(r);return t}}class Qe{constructor(){this.levelMap=new Map}totalLevels(){return this.levelMap.size}has(e,t){return this._createOrGetMap(t).has(e)}delete(e,t){return this._createOrGetMap(t).delete(e)}decre(e,t){const r=this._createOrGetMap(t);if(r.has(e)){let t=r.get(e);1===t?r.delete(e):r.set(e,t-1)}}incre(e,t){const r=this._createOrGetMap(t);if(r.has(e)){let t=r.get(e);r.set(e,t+1)}else r.set(e,1)}clear(){this.levelMap.forEach((e=>{e.clear()}))}size(e){return this._createOrGetMap(e).size}_createOrGetMap(e){"number"!=typeof e&&(e=Number(e));let t=this.levelMap.get(e);return t||(t=new Map,this.levelMap.set(e,t)),t}}const Je=class{constructor(){this.peerMap=new Map}isEmpty(){return 0===this.peerMap.size}size(){return this.peerMap.size}clear(){this.peerMap.clear()}getPeers(){return[...this.peerMap.values()]}getPeerValues(){return this.peerMap.values()}hasPeer(e){return this.peerMap.has(e)}addPeer(e,t){this.peerMap.set(e,t)}getPeerIds(){return[...this.peerMap.keys()]}removePeer(e){this.peerMap.delete(e)}getPeersOrderByWeight(){const e=this.getAvailablePeers();return e.sort(((e,t)=>0===t.weight?1:0===e.weight?-1:t.weight-e.weight)),e}getPeer(e){return this.peerMap.get(e)}getAvailablePeers(){return this.getPeers().filter((e=>e.isAvailableUrgently))}},Ze=1,et=2,tt=3,rt=4;class it{constructor(e){this.generator=e,this.status=Ze,this.next=this.next.bind(this)}next(e){if(this.status===rt)return console.warn("status is canceled");if(this.status===et)return console.warn("status is waiting");const t=this.execute.bind(this,this.cb);this.nextInfo=this.generator(t),this.status=et,this.nextInfo.execute(e)}execute(e,t){this.status=tt,e.apply(t,[this.next])}cancel(){this.status=rt,this.nextInfo&&"function"==typeof this.nextInfo.cancel&&this.nextInfo.cancel()}start(e,t){if("function"!=typeof e)throw new SyntaxError("param cb must be a function");this.cb=e,this.next(t)}continue(e){this.status=Ze,this.next(e)}}const st=Symbol("shareOnly");class nt extends(n()){constructor(e,t){super(),this.engine=e,this.config=t,this.logger=e.logger,this.bufMgr=null,this.peerManager=new Je,this._setupEngine&&this._setupEngine(),this.startCheckConnsTimer(),this.dcDownloadTimeout=t.dcDownloadTimeout,this[st]=!1,this.downloadOnly=!1,this.loadedPeerNum=0}get isMobileNet(){return this.engine.isMobileNet}startCheckConnsTimer(){this.checkConnsTimer=setInterval((()=>{this.logger.info("start check conns");const e=this.getStatsForPeer();let t=this.peersNum;const r=u();this.getPeers().forEach((i=>{t>4&&(r-i.dataExchangeTs>150||r-i.gotStatsTs>=83)?(this.logger.warn(`close dead or different level peer ${i.remotePeerId} level ${i.currentLevel}`),i.close(!1),t--):i.connected&&i.sendMsgStats(t,e)}))}),4e4)}getStatsForPeer(){return{}}getNonactivePeers(){const e=u();return this.getPeers().filter((t=>e-t.dataExchangeTs>150)).sort(((e,t)=>e.dataExchangeTs-t.dataExchangeTs))}requestPeers(){this.logger.info("request peers from peer");const t={event:e.DC_GET_PEERS};for(let e of this.getPeers())e.mobileNet||e.super||e.sendJson(t)}chokePeerRequest(t){const r={event:e.DC_CHOKE};t?t.sendJson(r):this._broadcastToPeers(r)}unchokePeerRequest(t){const r={event:e.DC_UNCHOKE};t?t.sendJson(r):this._broadcastToPeers(r)}stopRequestFromPeers(){for(let e of this.getPeers())e.choked=!0}resumeRequestFromPeers(){for(let e of this.getPeers())e.choked=!1}setShareOnly(){this[st]=!0}deletePeer(e){this.peerManager.hasPeer(e.remotePeerId)&&this.peerManager.removePeer(e.remotePeerId),this._peersStats(this.peerManager.getPeerIds())}getPeers(){return[...this.peerManager.getPeerValues()]}addPeer(e){const{logger:t}=this;this.peerManager.addPeer(e.remotePeerId,e),this[st]&&(e.choked=!0);const r=this.peerManager.getPeerIds();this._peersStats(r),t.info(`add peer ${e.remotePeerId}, now has ${r.length} peers`),!e.mobileNet&&!this.waitForPeer&&e.isInitiator&&this.peersNum<=5&&e.peersConnected>1&&e.sendPeersRequest()}get hasPeers(){return this.peersNum>0}get peersNum(){return this.peerManager.size()}get hasIdlePeers(){const{logger:e}=this,t=this.getIdlePeer().length;if(e.info(`peers: ${this.peersNum} idle peers: ${t}`),te.downloading));e.warn(`downloading: ${r.length} choked: ${t.filter((e=>e.choked)).length}`);for(let t of r)e.warn(`${t.remotePeerId} loading ${t.segId} packets ${t.bufArr.length} total ${t.pieceMsg.attachments}`)}return t>0}getIdlePeer(){return this.peerManager.getAvailablePeers()}set bufferManager(t){this.bufMgr=t,t.on(e.BM_LOST,(({sn:t,segId:r,next:i,level:s})=>{this.config.live||this._broadcastToPeers({event:e.DC_LOST,sn:t,seg_id:r,level:s||void 0}),this.onBufferManagerLost(t,r,i,s)})).on(e.BM_SEG_ADDED,(e=>{this.onBufferManagerSegAdded(e)}))}onBufferManagerSegAdded(e){}destroy(){const{logger:e}=this;this.peersNum>0&&this.peerManager.clear(),this.removeAllListeners(),clearInterval(this.checkConnsTimer),this.checkTimer&&this.checkTimer.cancel(),e.warn("destroy BtScheduler")}notifyPeersLoaded(e){}_setupDC(t){const{logger:r}=this;t.on(e.DC_PIECE_ACK,(e=>{e.size&&(this.engine.fetcher.reportUploaded(e.size),r.info(`uploaded ${e.seg_id} size ${e.size} to ${t.remotePeerId}, canceled ${e.canceled||!1}`))})).on(e.DC_PIECE_ABORT,(e=>{r.warn(`peer ${t.remotePeerId} download aborted, reason ${e.reason}`),t.downloading&&this._handlePieceAborted&&this._handlePieceAborted(t.remotePeerId),t.downloading=!1})).on(e.DC_REQUEST,(()=>{})).on(e.DC_SEND_REQUEST,(()=>{}))}_broadcastToPeers(e){for(let t of this.getPeers())t.sendJson(e)}_peersStats(e){this.engine.emit("peers",e);const t=this.engine.config.getPeersInfo;t&&"function"==typeof t&&t(e)}startCheckPeersTimer(e=3e3){this.checkTimer=new it((function(e){let t;return{execute:function(r=1e3){t=setTimeout(e,r)},cancel:function(){clearTimeout(t)}}})),this.checkTimer.start((e=>{this.checkPeers();const t=1e3*(0===(r=this.loadedPeerNum)?3:.5*r+1.67);var r;this.logger.info(`loaded peers ${this.loadedPeerNum} nextDelay ${t}`),this.loadedPeerNum=0,e(t)}),e)}}const at=nt;class ot extends(n()){constructor(e){super(),this.internalMap=new Map,this.eventName=e}has(e,t){return this.internalMap.has(this._generateId(e,t))}set(e,t,r){const i=this._generateId(e,t);this.internalMap.set(i,r),this.emit(`${this.eventName}${e}-${t}`,r)}get(e,t){return this.internalMap.get(this._generateId(e,t))}delete(e,t){const r=this._generateId(e,t),i=this.internalMap.get(r);return!!i&&(i.destroy(),this.internalMap.delete(r),!0)}clear(){this.internalMap.clear(),this.removeAllListeners()}_generateId(e,t){return"number"!=typeof t&&(t=Number(t)),`${t}-${e}`}}const lt=0,ht=1,ut=2,ct=3;class dt extends(n()){constructor(e,r,i,s,n,a=!1,o){super(),this.coordinator=e,this.logger=r,this.rangeSupported=a,this.rangeStart=0,this.rangeEnd=0,this.httpLoadTime=2e3,this.allowLoadPartial=!1,this.pieceMsg={event:t.DC_PIECE,sn:i,level:s,seg_id:n},o&&this.setExtra(o),this.forwardPeer=null,this.reversePeer=null,this.bufArr=[],this.forwardBufList=[],this.reverseBufList=[],this.forwardOffset=-1,this.reverseOffset=1e4,this.timeStart=0,this.timeReceivePiece=0,this.timer=void 0,this.destroyed=!1,this.forwardStreamListeners=[],this.reverseStreamListeners=[],this.rangeRequesting=!1,this.waitingRemain=!1,this.httpLoaded=0,this.p2pLoaded=0,this.deadline=0,this.p2pCanceled=!1}get segId(){return this.pieceMsg.seg_id}isDownloading(){return this.timeReceivePiece>0}isAlmostDeadline(){return!!this.rangeRequesting||this.deadline>0&&this.deadline-performance.now()<400}hasPeer(e){return!!e&&(e===this.forwardPeer||e===this.reversePeer)}_notifyStreamListeners(e,t,r){const{sn:i,seg_id:s,attachments:n}=this.pieceMsg,a=e&&0===r||!e&&r===n-1,o=e?this.reverseStreamListeners:this.forwardStreamListeners;e?this.reverseBufList.push(t):this.forwardBufList.push(t),a&&(this.forwardBufList.push([...this.reverseBufList].reverse()),this.reverseBufList.push([...this.forwardBufList].reverse()));for(let e of o){const{handler:r}=e;r(i,s,!1,t,a)}a&&(o.length=0)}_notifyStreamListenersAbort(){const e=[...this.reverseStreamListeners,...this.forwardStreamListeners];for(let t of e){const{handler:e}=t;e(void 0,void 0,!0,"aborted by synthesizer")}e.length=0}_notifyStreamListenersRemain(){if(this.forwardStreamListeners.length>0){for(let e=this.forwardOffset+1;e0){for(let e=this.reverseOffset-1;e>=0;e--)this._notifyStreamListeners(!0,this.bufArr[e],e);this.reverseStreamListeners=[]}}addStreamListener(e,t,r){(e?this.reverseStreamListeners:this.forwardStreamListeners).push({handler:r,peerId:t})}removeStreamListener(e){const t=t=>t.filter((t=>t.peerId!==e||(t.handler(void 0,void 0,!0,"aborted by cancel"),!1)));this.forwardStreamListeners=t(this.forwardStreamListeners),this.reverseStreamListeners=t(this.reverseStreamListeners)}setTimeout(e=0){e<=0?setTimeout((()=>{this._handleTimeout(!1,!1)}),0):(this.deadline=performance.now()+e,this._startTimer(e))}setExtra(e={}){e.url&&(this.url=e.url),e.rangeStart&&(this.rangeStart=e.rangeStart),e.rangeEnd&&(this.rangeEnd=e.rangeEnd),e.httpLoadTime&&(this.httpLoadTime=e.httpLoadTime),e.allowLoadPartial&&(this.allowLoadPartial=!0),e.xhrSetup&&(this.xhrSetup=e.xhrSetup),e.headers&&(this.headers=e.headers),e.segId&&!this.pieceMsg.seg_id&&(this.pieceMsg.seg_id=e.segId)}hasForwardPeer(){return!!this.forwardPeer}hasReversePeer(){return!!this.reversePeer}hasPeerId(e){return this.forwardPeer&&this.forwardPeer.remotePeerId===e||this.reversePeer&&this.reversePeer.remotePeerId===e}isEmpty(){return null===this.forwardPeer&&null===this.reversePeer}isFull(){return this.forwardPeer&&this.reversePeer}setForwardPeer(e){this.forwardPeer=e,this.reversePeer&&this._print(),this._setupPeer(e,!1)}setReversePeer(e){this.reversePeer=e,this.forwardPeer&&this._print(),this._setupPeer(e,!0)}deletePeer(e,t=!1){const r=e===this.reversePeer;this._detachPeer(e),r?(this.reversePeer=null,t&&(this.reverseOffset=this.pieceMsg.attachments||1e4)):(this.forwardPeer=null,t&&(this.forwardOffset=-1)),this.isEmpty()&&this._handleTimeout(!1,!1)}terminate(){this._handleTimeout(!1,!1)}_emitPartialOrError(e){if(this.allowLoadPartial&&this.hasPartialBuffer()){const[e,r]=this.getPartialBuffer();this.emit(t.SYN_PARTIAL,this.pieceMsg,e,r)}else this.emit(t.SYN_ERROR,this.pieceMsg,e)}hasPartialBuffer(){return this.hasForwardBuffer()||this.hasReverseBuffer()}hasForwardBuffer(){return this.forwardOffset>=0}hasReverseBuffer(){return this.pieceMsg&&this.reverseOffset=0?a.l.concat(this.bufArr.slice(0,this.forwardOffset+1)):null,this.pieceMsg&&this.reverseOffset!!e)).forEach((i=>{i.cancelDownload(t,r,e)}))}destroy(){this.logger.info("destroy syn"),clearTimeout(this.timer),this._notifyStreamListenersAbort(),this._cancelP2p(),this.removeAllListeners(),this.destroyed=!0,this._detachPeer(this.forwardPeer),this.forwardPeer=null,this.forwardOffset=-1,this._detachPeer(this.reversePeer),this.reversePeer=null,this.reverseOffset=1e4,this.bufArr=[],this.forwardStreamListeners=[],this.reverseStreamListeners=[]}_detachPeer(e){if(!e)return;const r=e===this.reversePeer?this.reverseEvents:this.forwardEvents;e.off(t.DC_PIECE_DATA,r.onPieceData).off(t.DC_PIECE,r.onPiece).off(t.DC_PIECE_NOT_FOUND,r.onPieceNotFound).off(t.DC_PIECE_ABORT,r.onPieceAbort)}_receivePacket(e,r,i,s=!0){const{seg_id:n,sn:o,level:l,size:h}=this.pieceMsg,u=r-1;if(this.bufArr[u])return this.logger.warn(`syn bufArr ${this.pieceMsg.sn} already has ${u} size ${i.byteLength}`),!1;if(s?this.p2pLoaded+=i.byteLength:this.httpLoaded+=i.byteLength,this.bufArr[u]=i,e?this.reverseOffset=u:this.forwardOffset=u,this._notifyStreamListeners(e,i,u),this.forwardOffset!==this.reverseOffset-1)return!0;this.forwardPeer&&(this.forwardPeer.miss=0),this.reversePeer&&(this.reversePeer.miss=0),clearTimeout(this.timer),this._notifyStreamListenersRemain();const c=h/(performance.now()-this.timeStart);let d=a.l.concat(this.bufArr);const f=d.byteLength;if(f===h){let e=d.buffer;const r=new P(o,n,e,this.getFromPeerId(),l);this.emit(t.SYN_OUTPUT,r,{speed:c,p2p:this.p2pLoaded,http:this.httpLoaded})}else{this.logger.error(`${l}-${o} expectedSize ${h} != byteLength ${f} forward ${this.forwardOffset} reverse ${this.reverseOffset}`);for(let e=0;e{if(this.destroyed)return;if(!this._validateMsg(t,a.level,r))return void this.logger.warn(`onPieceData ${a.level}-${t} not match ${JSON.stringify(this.pieceMsg)} from ${e.remotePeerId}`);const{reverse:o}=a;this._receivePacket(o,s,i)&&!this.waitingRemain&&!this.rangeRequesting&&this.deadline>0&&this._shouldSwitch()&&(this.logger.warn("should switch to http"),clearTimeout(this.timer),this._handleTimeout(!1,!1))},s=r=>{if(this.destroyed)return;const{attachments:i,size:s,sn:n,level:a,seg_id:o}=r;return s&&this._validateMsg(n,a,o)?this.pieceMsg.size&&s!==this.pieceMsg.size?(this.logger.warn(`onPiece ${r.level}-${r.sn} size not match`),void this.emit(t.SYN_ERROR,this.pieceMsg,lt)):void(0===this.bufArr.length&&(this.pieceMsg={...this.pieceMsg,seg_id:o,size:s,attachments:i},this.reverseOffset=i,this.bufArr=new Array(i),this.timeReceivePiece=performance.now())):(this.logger.warn(`onPiece ${JSON.stringify(r)} not match ${JSON.stringify(this.pieceMsg)}`),void this.deletePeer(e))},n=t=>{this.destroyed||this.deletePeer(e)},a=()=>{this.destroyed||this.deletePeer(e)},o={onPieceData:i,onPiece:s,onPieceNotFound:n,onPieceAbort:a};r?this.reverseEvents=o:this.forwardEvents=o,e.on(t.DC_PIECE_DATA,i).once(t.DC_PIECE,s).once(t.DC_PIECE_NOT_FOUND,n).once(t.DC_PIECE_ABORT,a)}_validateMsg(e,t,r){return(!this.pieceMsg.seg_id||r===this.pieceMsg.seg_id)&&(e===this.pieceMsg.sn&&t===this.pieceMsg.level)}_shouldSwitch(){const e=this.pieceMsg.size-64e3*this.loadedPackets();return this.coordinator.shouldSwitchToHttp(e,this.deadline,this.p2pSpeed,64e3,this.httpLoadTime)}_startTimer(e,t=!0){this.timer=setTimeout(this._handleTimeout.bind(this,t),e)}loadedPackets(){return this.pieceMsg.attachments-(this.reverseOffset-this.forwardOffset-1)}_handleTimeout(e=!1,r=!0){if(this.destroyed)return;const{level:i,sn:s,size:n,attachments:a}=this.pieceMsg;if(!n||0===this.timeReceivePiece)return this.logger.warn(`syn load timeout ${i}-${s} url ${this.url}`),void this.emit(t.SYN_ERROR,this.pieceMsg,lt);if(e&&this.timeReceivePiece>0&&(this.logger.warn(`syn ${this.loadedPackets()} of ${a} packets loaded`),this.shouldWaitForRemain(this.httpLoadTime))){const e=this.httpLoadTime;return this.waitingRemain=!0,this.logger.info(`syn wait for remain ${e}`),void this._startTimer(e,!1)}if(r){const e=[this.forwardPeer,this.reversePeer].filter((e=>!!e)).sort(((e,t)=>e.currentLoadSpeed()-t.currentLoadSpeed())).shift();e&&e.loadtimeout()}if(this._cancelP2p(),this.rangeSupported&&this.url)return this._loadRemainBufferByHttp();this._notifyStreamListenersAbort(),this._emitPartialOrError(ct)}shouldWaitForRemain(e){if(e<=0||this.isEmpty())return!1;const t=performance.now()-this.timeStart;return t<500||t<1e3&&this.timeReceivePiece>0&&e>3e3||this.shouldWaitForRemainUrgent(e)}shouldWaitForRemainUrgent(e){if(0===this.timeReceivePiece||e<=0)return!1;const t=this.p2pSpeed;let r=0;[this.forwardPeer,this.reversePeer].forEach((e=>{e&&(r+=e.loadedBytes())}));const i=(this.pieceMsg.size-r)/e;return this.logger.info(`syn remainTime ${e} speed ${t} required ${i}`),t>=i}get p2pSpeed(){let e=0;return[this.forwardPeer,this.reversePeer].forEach((t=>{t&&(e+=t.currentLoadSpeed())})),e}getFromPeerId(){const{forwardPeer:e,reversePeer:t}=this;return this.isFull()&&e!==t?`${e.remotePeerId}:${t.remotePeerId}`:e?`${e.remotePeerId}`:t?`${t.remotePeerId}`:""}_loadRemainBufferByHttp(){if(this.rangeRequesting)return;const{size:e,sn:r,level:i}=this.pieceMsg,s=this.rangeEnd>0?this.rangeEnd-1:0,n=this.forwardOffset,l=function(e,t,r,i=0,s=0){const n=o;let a="bytes=",l=i,h=s||r-1;const u=Math.floor(r/n),c=r%n>0?u+1:u;e>=0&&(l+=(e+1)*n),a=`${a}${l}-`,t>=0&&t6e3&&(u=6e3),this.logger.info(`continue download ${i}-${r} from ${this.url} range: ${l} timeout ${u}`),this.rangeRequesting=!0,this.headers&&(this.xhrSetup=e=>{for(const t of Object.keys(this.headers))e.setRequestHeader(t,this.headers[t])}),d(this.url,l,this.xhrSetup,u).then((e=>{if(this.destroyed)return;if(this.rangeRequesting=!1,!e)return void this.emit(t.SYN_ERROR,this.pieceMsg,ht);let i=a.l.from(e);const s=i.byteLength/(performance.now()-h);this.coordinator.addHttpSpeed(s),i.byteLength===this.pieceMsg.size&&this.logger.warn(`syn range request ${r} resp whole ts`);const o=v(i,0);let l=n+1;for(let e=0;e{if(this.destroyed)return;this.rangeRequesting=!1,this.logger.error(`http partial download ${r} error ${e}`);const i="timeout"===e?ut:ht;this.emit(t.SYN_ERROR,this.pieceMsg,i)}))}_print(){const{level:e,sn:t}=this.pieceMsg;this.logger.info(`syn parallel loading ${e}-${t}`)}}class ft{constructor(){this.meanHttpSpeed=0}addHttpSpeed(e){this.meanHttpSpeed=.4*this.meanHttpSpeed+.6*e}shouldSwitchToHttp(e,t,r,i,s){if(this.meanHttpSpeed<=0)return!1;if(r>=this.meanHttpSpeed)return!1;if(this.meanHttpSpeed*s>=e)return!1;return((s+t-performance.now())*this.meanHttpSpeed-e)/(this.meanHttpSpeed-r)*r{if(e.bitset&&t.sn>=0){const{sn:r,level:i,complete:s,seg_id:n}=t;this._receiveDCHave(r,i,n);const a=s?qe:Ve;e.bitset.add(r,i,n,a),e.isAvailableUrgently&&this._handleDCHave(e,r,i,n,a)}})).on(t.DC_HAVE_REVERSE,(t=>{if(e.bitset&&t.sn>=0){const{sn:r,level:i,seg_id:s}=t;this._receiveDCHave(r,i,s),e.bitset.hasCompleteOr(r,i,ze)||e.bitset.add(r,i,s,ze),e.isAvailableUrgently&&this._handleDCHave(e,r,i,s,ze)}})).on(t.DC_LOST,(t=>{if(!e.bitset)return;const{sn:r,level:i}=t;e.bitset.has(r,i)&&(e.bitset.delete(r,i),this.bitCounts.decre(r,i))})).on(t.DC_PIECE,(e=>{e.ext&&e.ext.incompletes>=7||this.notifyAllPeers(e.sn,e.level,e.seg_id,e.reverse?ze:Ve)})).on(t.DC_PIECE_CANCEL,(t=>{const{sn:r,level:i}=t,s=this.requestingMap.get(r,i);if(s)return void s.removeStreamListener(e.remotePeerId);const n=this.segmentBuilderMap.get(r,i);n&&n.removeStreamListener(e.remotePeerId)})).on(t.DC_PIECE_NOT_FOUND,(t=>{const{sn:r,level:i}=t;e.bitset.delete(r,i),this.bitCounts.decre(r,i),e.checkIfNeedChoke(!0)})).on(t.DC_REQUEST,(async r=>{const{logger:i}=this,{sn:s,level:n,reverse:a}=r;this.isUploader=!0;let o=r.seg_id;o||(o=await this.bufMgr.getSegIdBySN(s));const l=this.requestingMap.get(s,n);let h=!1;l&&l.isDownloading()&&(h=!0);const u=await this.bufMgr.getSegById(o);if(u)i.info("found seg from bufMgr"),u.level===n?e.sendBuffer(u.sn,u.segId,u.data,{from:this.engine.swVersion?"SWCache":"Cache",level:u.level,reverse:a}):e.sendPieceNotFound(s,o,{level:n});else if(h){i.info(`syn had ${l.loadedPackets()} packets, wait remain from upstream ${l.getFromPeerId()}`);const t={...l.pieceMsg,reverse:a},r=a?l.reverseBufList:l.forwardBufList;e.sendPartialBuffer(t,r,{from:l.isFull()?"WaitPartialDouble":"WaitPartialSingle",incompletes:1}),r.length=this.loadingSN){let r;const l=l=>{this.segmentBuilderMap.off(`${t.BUILDER_MAP_HAVE}${s}-${n}`,r),l&&l.level===n?(i.info(`peer request notify seg ${l.sn}`),e.sendBuffer(l.sn,l.segId,l.data,{from:"NotifySegment",level:l.level,reverse:a})):e.sendPieceNotFound(s,o,{level:n})};r=r=>{this.bufMgr.off(`${t.BM_ADDED_SN_}${s}`,l),c(r,e)},i.info(`peer request ${s} wait from fragLoader`),this.segmentBuilderMap.once(`${t.BUILDER_MAP_HAVE}${s}-${n}`,r),this.bufMgr.once(`${t.BM_ADDED_SN_}${s}`,l)}else e.sendPieceNotFound(s,o,{level:n})}function c(e,t){t.sendPartialBuffer(e.pieceMsg,e.bufferList,{from:e.source,incompletes:1}),e.bufferList.length{i?t.sendMsgPieceAbort(s):t.send(s),n&&(t.uploading=!1)}))}}))}handleMetaData(e,t){if(t.field){e.bitset=new Xe(this.config.live,t.field);for(let e in t.field){const r=Number(e);if(r<0)continue;t.field[r].forEach((e=>{this.bitset.has(e,r)||this.bitCounts.incre(e,r)}))}this.addPeer(e),this.downloadOnly&&this.chokePeerRequest(e)}}peersHas(e,t){return this.bitCounts.has(e,t)}deletePeer(e){if(this.peerManager.hasPeer(e.remotePeerId)&&e.bitset){const t=e.bitset.allArray();for(let e in t){const r=Number(e),i=t[r];i&&i.forEach((e=>{this.bitCounts.decre(e,r)}))}}this.cleanRequestingMap(e.remotePeerId),super.deletePeer(e)}hasAndSetTargetPeer(e,t,r,i){const{logger:s,config:n}=this;this.waitForPeer&&(this.mBufferedDuration=i=n.waitForPeerTimeout+n.httpLoadTime);let a=1e3*(i-n.httpLoadTime);const o=n.httpLoadTime+1.5;if(s.info(`bufferedDuration ${i} remainLoadTime ${a}`),i<=o)return!1;if(this.requestingMap.has(e,t)){const l=this.requestingMap.get(e,t);if(!l)return this._searchAvailablePeers(e,t,r);const h=l.segId;if(h&&h!==r)return s.warn(`syn segId ${h} not match ${r}`),this.requestingMap.delete(e,t),this._searchAvailablePeers(e,t,r);if(!l.shouldWaitForRemain(a)){if(s.warn(`syn prefetch timeout at ${e}`),l.isFull())return!1;const a=this.peerManager.getPeersOrderByWeight(),h=Ye(a,qe,e,t,r);let u=Ye(a,Ve,e,t,r),c=Ye(a,ze,e,t,r);if(l.hasReversePeer()){if(u=h.concat(u),u.length>0)return this.targetPeers.forwardPeer=u[0],!0}else if(l.hasForwardPeer()){if(c=h.concat(c),c.length>0)return this.targetPeers.reversePeer=c[0],!0}else{if(h.length>0)return l.hasForwardBuffer()?this.targetPeers.reversePeer=h[0]:this.targetPeers.forwardPeer=h[0],!0;{let e=!1;if(u.length>0&&(this.targetPeers.forwardPeer=u[0],e=!0),c.length>0&&(this.targetPeers.reversePeer=c[0],e=!0),e)return!0}}return!l.isEmpty()&&n.httpRangeSupported&&i>o+1}return s.info(`prefetch ${e} wait for remain`),!0}return this._searchAvailablePeers(e,t,r)}_searchAvailablePeers(e,t,r){if(!this.hasIdlePeers||!this.peersHas(e,t))return!1;const i=this.peerManager.getPeersOrderByWeight(),[s,n]=((e,t,r,i)=>{const s=Ye(e,qe,t,r,i);if(s.length>=2)return[s[0],s[1]];if(1===s.length){const n=Ye(e,Ve,t,r,i);if(n.length>=1)return[n[0],s[0]];const a=Ye(e,ze,t,r,i);return a.length>=1?[s[0],a[0]]:0===c(0,1)?[null,s[0]]:[s[0],null]}const n=Ye(e,Ve,t,r,i);if(n.length>=1)return[n[0],null];const a=Ye(e,ze,t,r,i);return a.length>=1?[null,a[0]]:[null,null]})(i,e,t,r);return this.targetPeers={forwardPeer:s,reversePeer:n},[s,n].some((e=>!!e))}reportTraffic(e,t,r){const{fetcher:i}=this.engine;i?(e>0&&i.reportFlow(e),t>0&&i.reportDCTraffic(t,r)):this.logger.error("DC report failed")}notifyAllPeers(e,t,r,i=qe){if(!r)return void this.logger.error("segId is required");if(this.downloadOnly)return;const{live:s}=this.config;if(this.bitset.has(e,t,i))return;const n=((e,t,r)=>`${e}-${t}-${r}`)(e,t,i);let a;i!==ze&&(a=i===qe);const o=this.requestingMap.get(e,t);for(let l of this.getPeers())o&&o.hasPeer(l)||l.notifySet.has(n)||l.bitset.hasCompleteOr(e,t,i)||l.uploading||(l.sendMsgHave(e,r,{level:t,reverse:i===ze,complete:a}),l.notifySet.add(n),s&&m(l.notifySet,20))}checkPeers(){if(!this.hasPeers)return;const{logger:e,config:t,engine:r}=this,i=t.live,{currentLevel:s}=r;if(e.info(`currentLevel ${s}`),0===this.bitCounts.size(s))return;if(!i&&this.nextLostSN>=0&&this.nextLostSN>=this.currPlaySN-10)return;if(this.mBufferedDuration=l&&!this.bufMgr.overflowed)d=h;else{const e=Math.min(...n.filter((e=>e.endSN>=d)).map((e=>e?e.startSN:1/0)));if(!isFinite(e))return;dl)return;if(i&&d>this.loadingSN+2)return;if(this.bitset.has(d,s))d++;else{if(d!==this.loadingSN&&this.bitCounts.has(d,s)&&!this.requestingMap.has(d,s))for(let r of n)if(!a.includes(r)&&r.bitset.has(d,s)){const i=r.bitset.getState(d,s);let n;n=i===qe?0===c(0,1):i===ze,a.push(r);const o=r.bitset.getSegId(d,s),l=new dt(this.coordinator,this.logger,d,s,o,t.httpRangeSupported);this._setupSynthesizer(l),n?l.setReversePeer(r):l.setForwardPeer(r),this.requestingMap.set(d,s,l),r.requestDataBySN(d,!1,{level:s,reverse:n}),e.info(`request prefetch ${d} level ${s} from peer ${r.remotePeerId} downloadNum ${r.downloadNum} reverse ${n}`);break}u++,d++}}this.loadedPeerNum=a.length}onBufferManagerLost(e,t,r,i){this.currLostSN=e,r&&(this.nextLostSN=r),this.bitset.delete(e,i),this.bitCounts.delete(e,i)}cleanRequestingMap(e){const t=this.peerManager.getPeer(e);if(t)for(let[r,i]of this.requestingMap.internalMap){const s=r.split("-"),n=Number(s[1]),a=Number(s[0]);i.hasPeerId(e)&&(this.logger.info(`delete ${e} in synthesizer`),i.deletePeer(t),this.bitCounts.decre(n,a),t.bitset.delete(n,a))}}shouldWaitForNextSeg(){let e;return e=!this.isUploader&&(!!this.isReceiver||c(0,100)>20),this.isReceiver=this.isUploader=!1,e}updateLoaded(e,t,r){this.bitset.hasCompleteOr(e,t)||(this.bitset.add(e,t,r,qe),this.bitCounts.delete(e,t))}broadcastPlaylist(e,t){if(!this.config.live)return;const r=function(e){const t=e.split("\n");let r=0,i=0;for(let e of t){const t=/^#EXT-X-MEDIA-SEQUENCE:?(\-?[0-9.]*)?/.exec(e);if(t&&t[1]){r=parseInt(t[1],10);break}}for(let e of t)e.startsWith("#EXTINF")&&i++;return r+i-1}(t);if(!this.isMobileNet){let i=0;for(let s of this.getPeers())if(i++,s.sendMsgPlaylist(e,t,r),i>=5)break}this.playlistInfo.set(e,{seq:r})}getPlaylistFromPeer(e){if(!this.config.live)return null;const{seq:t}=this.playlistInfo.get(e);for(let r of this.getPeers()){const i=r.getLatestPlaylist(e,t);if(i)return i}return null}getBufferedDuration(){let{media:e,currentSrc:t}=this.engine;if(!e||e.src!==t&&0===e.currentTime){if(this.logger.info("try get video element"),e=K(this.config.mediaElem,t),!e)return 5;this.engine.media=e}let r=0,i=e.currentTime,s=e.buffered;for(let e=s.length-1;e>=0;e--)if(i>=s.start(e)&&i<=s.end(e)){r=s.end(e)-i;break}return this.mBufferedDuration=r,r>0?r:0}destroy(){super.destroy(),this.requestingMap.clear(),this.segmentBuilderMap.clear()}_notifySynthesizer(e,t,r,i,s,n=!0){const{logger:a}=this,o=this.requestingMap.get(r,i);if(!o)return;const l=o.segId;function h(s,n){n?e.requestDataById(t,r,!0,{level:i,reverse:s}):(a.info(`notify syn prefetch ${r}`),e.requestDataBySN(r,!1,{level:i,reverse:s}))}function u(){return s===Ve||s===qe}function c(){return s===ze||s===qe}t&&l&&t!==l?a.warn(`notifySynthesizer segId ${t} not match ${l}`):o.isFull()||(o.isAlmostDeadline()?a.info("almost deadline, ignored"):o.isEmpty()?o.hasForwardBuffer()&&c()?(o.setReversePeer(e),h(!0,n)):o.hasReverseBuffer()&&u()&&(o.setForwardPeer(e),h(!1,n)):!o.hasForwardPeer()&&u()?(o.setForwardPeer(e),h(!1,n)):!o.hasReversePeer()&&c()&&(o.setReversePeer(e),h(!0,n)))}_setupEngine(){}getStatsForPeer(){const{currentLevel:e,media:t}=this.engine,r={level:e};if(t&&!this.config.live){const{currentTime:e}=t;r.pos=Math.round(e)}return r}_handleSynError(e){switch(e){case ht:this.logger.warn("ERROR_SYN_RANGE_REQUEST"),this.httpRangeErrs++;break;case ut:this.logger.warn("ERROR_SYN_HTTP_TIMEOUT"),this.httpTimeouts+=3}this.httpRangeErrs>=5&&(this.config.httpLoadTime<=4.5&&(this.config.httpLoadTime+=.5),this.httpRangeErrs=0)}}class pt{constructor(t,r,i,s){this.bufferList=[],this.streamListeners=[],this.finished=!1,this.packetSize=o,this.attachments=s%this.packetSize==0?s/this.packetSize:Math.floor(s/this.packetSize)+1,this.pieceMsg={event:e.DC_PIECE,attachments:this.attachments,seg_id:i,sn:t,level:r,size:s,reverse:!1},this.sink=(0,a.l)(0),this.source="HttpStream"}receiveBytes(e,t){e.byteLength&&(this.sink=a.l.concat([this.sink,e]),this.bufferList.push(e),t&&(this.finished=!0),this._notifyStreamListeners(e))}getCompleteBuffer(){return this.sink.buffer}destroy(){this.finished||this._notifyStreamListenersAbort()}addStreamListener(e,t,r){this.streamListeners.push({handler:r,peerId:t})}removeStreamListener(e){this.streamListeners=this.streamListeners.filter((t=>t.peerId!==e||(t.handler(void 0,void 0,!0,"aborted by cancel"),!1)))}_notifyStreamListenersAbort(){for(let e of this.streamListeners){const{handler:t}=e;t(void 0,void 0,!0,"aborted by httpLoader")}this.streamListeners.length=0}_notifyStreamListeners(e){const{sn:t,seg_id:r}=this.pieceMsg;for(let i of this.streamListeners){const{handler:s}=i;s(t,r,!1,e,this.finished)}this.finished&&(this.streamListeners.length=0)}}const vt=class extends gt{constructor(e,t){super(e,t),this.server=t.fetcher,this.p2pEnabled=e.p2pEnabled,this.resolveMap=new Map,this.dcDownloadTimeout=t.live?5:9,this.segmentId=t.segmentId,this.segmentBypass="function"==typeof t.segmentBypass?t.segmentBypass:()=>!1}async handleGetMediaData(e,r){const{logger:i,engine:s}=this;let{url:n,range:a}=e;const o=this._getFrag(n,a);if(!o)return i.warn(`cannot get frag ${n}`),r.postMessage({action:t.SW_GET_MEDIA});if(this.segmentBypass(n,o.tagList))return i.info(`bypass frag ${n}`),r.postMessage({action:t.SW_GET_MEDIA});s.currentLevelIndex=o.level;const{sn:l,level:h}=o,u=this.segmentId(String(h),l,n,a),c=u===this.loadingSegId;c&&i.warn(`duplicate request ${u}`),this.loadingSN=l,s.bufMgr&&(s.bufMgr.loadingSN=l),this.loadingSegId=u;const d=await this.bufMgr.getSegById(u);if(d)return i.info(`bufMgr found seg sn ${l} segId ${u}`),o.loaded=d.data.byteLength,o.fromPeerId=d.fromPeerId,s.emit(t.FRAG_LOADED,{url:n,sn:l,level:h,segId:u,loaded:o.loaded,duration:o.duration,byP2p:!0,fromPeerId:d.fromPeerId}),this._onFragLoaded(n,o),r.postMessage({action:t.SW_GET_MEDIA,data:{url:n,buffer:d.data,incomplete:!1}});const f=this.getBufferedDuration();if(i.info(`handleGetMediaData sn ${l} bufferedDuration ${f}`),this.resolveMap.has(l)||c){let e=this.requestingMap.get(l,h);if(e||c){e&&(i.warn(`${l} is requesting, terminate syn wait for seg`),e.terminate());let s=1e3*(f-this.config.httpLoadTime)+1e3;s<0&&(s=0);let a=setTimeout((()=>{i.info(`notify seg ${l} timeout`),a=-1,r.postMessage({action:t.SW_GET_MEDIA})}),s);this.bufMgr.once(`${t.BM_ADDED_SN_}${l}`,(e=>{a<0||e&&e.level===h&&(clearTimeout(a),i.info(`notify seg ${e.sn}`),r.postMessage({action:t.SW_GET_MEDIA,data:{url:n,buffer:e.data,incomplete:!1}}))}))}else i.warn(`${l} is requesting, fallback`),r.postMessage({action:t.SW_GET_MEDIA})}else if(this.hasAndSetTargetPeer(l,h,u,f)){await this._loadFragByP2p(o,r,l,u,n,h)||r.postMessage({action:t.SW_GET_MEDIA})}else{const e=this.requestingMap.get(l,h);if(this.httpRangeSupported&&e&&e.segId===u&&e.hasPartialBuffer()){i.warn(`syn has partial buffer for ${u}`);const[s,a]=e.getPartialBuffer();r.postMessage({action:t.SW_GET_MEDIA,data:{url:n,bufferLeft:s,bufferRight:a,incomplete:!0,size:e.pieceMsg.size}},[s,a].filter((e=>!!e)).map((e=>e.buffer)))}else r.postMessage({action:t.SW_GET_MEDIA})}}async _loadFragByP2p(e,r,i,s,n,a){const{logger:o}=this;o.info(`p2p load sn ${i} segId ${s} level ${a}`);const l=await this.load(i,s,a);if(l&&(l.data||l.incomplete)){const{data:h,incomplete:u,fromPeerId:c,bufferLeft:d,bufferRight:f,size:g}=l;if(u)o.info(`p2p loaded partial segId ${s} level ${a} size ${g}`),e.loaded=(d?d.byteLength:0)+(f?f.byteLength:0);else{if(o.info(`p2p loaded segId ${s} level ${a} size ${h.byteLength} incomplete ${u}`),!await this.bufMgr.hasSegOfId(s)){const e=new P(i,s,h,c,a);o.info(`bufMgr putSeg ${i} level ${a}`),this.bufMgr.putSeg(e)}e.loaded=h.byteLength}return e.fromPeerId=c,this.engine.emit(t.FRAG_LOADED,{url:n,sn:i,level:a,segId:s,loaded:e.loaded,duration:e.duration,byP2p:!0,fromPeerId:c}),this._onFragLoaded(n,e),r.postMessage({action:t.SW_GET_MEDIA,data:{url:n,buffer:h,bufferLeft:d,bufferRight:f,incomplete:u,size:g}},[d,f].filter((e=>!!e)).map((e=>e.buffer))),!0}o.warn(`P2P timeout load segId ${s}`);const h=await this.bufMgr.getSegById(s);return!!h&&(o.info(`already loaded seg sn ${i} segId ${s}`),r.postMessage({action:t.SW_GET_MEDIA,data:{url:n,buffer:h.data,incomplete:!1}}),!0)}_processStream(e,t,r,i,s){const n=o,{segmentBuilderMap:l}=this,h=new pt(r,i,s,t);h.source="SWHttpStream",l.has(r,i)||l.set(r,i,h);const u=e.getReader();let c=0,d=0,f=(0,a.l)(0);return new Promise(((e,t)=>{const r=()=>{u.read().then((({value:t,done:i})=>{if(t&&(c+=t.length),i){if(f.byteLength>0)if(c<=n){const e=(0,a.l)(c);f.copy(e,0,d*n,f.byteLength),h.receiveBytes(e,!0)}else{const e=v(f,d*n);for(let t=0;t=n){c-=n;const e=(0,a.l)(n);f.copy(e,0,d*n,(d+1)*n),d++,h.receiveBytes(e,!1)}r()})).catch((e=>{t(e)}))};r()}))}async handleMediaData(e,r){r.postMessage({action:t.SW_MEDIA});const{logger:i,engine:s}=this;let{url:n,buffer:a,stream:o,range:l,p2p:h,httpSpeed:u,size:c}=e;if(s.rangeTestUrl===n)return void(s.rangeTestUrl="");i.info(`SW_MEDIA url ${n} size ${c} range ${l} speed ${u}`),u&&this.coordinator.addHttpSpeed(u);const d=this._getFrag(n,l);if(!d)return;if(this.segmentBypass(n,d.tagList))return;const{sn:f,level:g}=d,p=this.segmentId(String(g),f,n,l);if(o){i.info(`got stream ${f}`),this.isMobileNet||this.notifyAllPeers(f,g,p,Ve);try{a=await this._processStream(o,c,f,g,p)}catch(e){return void i.warn(e)}finally{this.segmentBuilderMap.delete(f,g)}}this._handleMediaData(f,g,p,n,d,h,a)}async _handleMediaData(e,r,i,s,n,a,o){if(this.notifyAllPeers(e,r,i),n.segId=i,n.loaded=o.byteLength,this.engine.emit(t.FRAG_LOADED,{url:s,sn:e,level:r,segId:i,loaded:n.loaded,duration:n.duration,byP2p:!1}),this._onFragLoaded(s,n),!await this.bufMgr.hasSegOfId(i)){const t=new P(e,i,o,"",r);this.bufMgr.putSeg(t),this.logger.info(`bufMgr putSeg ${i} level ${r}`);const s=a&&a>0?a:0,n=o.byteLength-s;this.reportTraffic(n,s,0)}}notifySWMessage(e,r,i){switch(e){case t.SW_MEDIA:this.handleMediaData(r,i);break;case t.SW_PRE_MEDIA:this.handlePreMedia(r,i);break;case t.SW_GET_MEDIA:this.server.increMediaRequests(),this.handleGetMediaData(r,i);break;case t.SW_STREAM:this.handleStream(r);break;default:this.logger.warn(`unknown action ${e}`)}}handlePreMedia(e,r){r.postMessage({action:t.SW_PRE_MEDIA})}_getFrag(e,t){return t&&(e=`${e}|${t}`),this.fragMap.get(e)}handleStream(e){const{logger:t,segmentBuilderMap:r}=this;let{url:i,range:s,begin:n,size:a,buffer:o,done:l,aborted:h}=e;const u=this._getFrag(i,s);if(!u)return void t.warn(`handleStream cannot get frag ${i} range ${s}`);const{sn:c,level:d}=u,f=this.segmentId(String(d),c,i,s);if(n){t.info(`got stream ${c}`),this.isMobileNet||this.notifyAllPeers(c,d,f,Ve);const e=new pt(c,d,f,a);e.source="SWStream",r.has(c,d)||r.set(c,d,e)}else{if(h)return void r.delete(c,d);const e=r.get(c,d);if(!e)return;if(e.receiveBytes(o,l),l){const t=e.getCompleteBuffer();this._handleMediaData(c,d,f,i,u,0,t)}}}destroy(){super.destroy(),this.logger.warn("destroy HlsSwScheduler")}_onFragLoaded(e,t){if(this.updateLoaded(t.sn,t.level,t.segId),!this.engine)return;const{media:r,targetDuration:i}=this.engine;!this.config.live&&r&&i&&(this.currPlaySN=Math.ceil(r.currentTime/i))}load(e,t,r){const{logger:i,config:s}=this;this.isReceiver=!0;let n=this.mBufferedDuration-this.config.httpLoadTime;n>this.dcDownloadTimeout&&(n=this.dcDownloadTimeout);const{forwardPeer:a,reversePeer:o}=this.targetPeers;a||o||(n-=1);let l=this.requestingMap.get(e,r),h={allowLoadPartial:this.httpRangeSupported,segId:t};l?l.setExtra(h):(l=new dt(this.coordinator,this.logger,e,r,t,this.httpRangeSupported,h),this._setupSynthesizer(l),this.requestingMap.set(e,r,l)),a&&(l.setForwardPeer(a),a.requestDataById(t,e,!0,{level:r})),o&&(l.setReversePeer(o),o.requestDataById(t,e,!0,{level:r,reverse:!0})),l.isEmpty()&&(n=0),i.info(`syn setTimeout ${n}`),l.setTimeout(1e3*n);const u=new Promise((i=>{const s={resolve:i,sn:e,level:r,segId:t,incomplete:!1};this.resolveMap.set(e,s)}));return this.targetPeers={},u}_setupSynthesizer(e){e.on(t.SYN_OUTPUT,((t,r)=>{const{config:i,logger:s}=this,{segId:n,sn:a,data:o,level:l}=t,{speed:h,http:u,p2p:c}=r;this.httpTimeouts>0&&this.httpTimeouts--;const d=this.resolveMap.has(a);if(i.validateSegment(n,new Uint8Array(o))){this.notifyAllPeers(a,l,n),this.bitset.has(a,l)||this.reportTraffic(u,c,h);const r=e.getFromPeerId();if(d){s.info(`receive criticalSeg seg_id ${n}`);const e=this.resolveMap.get(a);this.resolveMap.delete(a),e.resolve({data:o,fromPeerId:r})}else this.bitset.has(a,l)||(this.bufMgr.putSeg(t),this.updateLoaded(a,l,n))}else if(s.error(`segment ${n} validate failed`),d){const e=this.resolveMap.get(a);this.resolveMap.delete(a),e.resolve()}this.requestingMap.delete(a,l)})).on(t.SYN_PARTIAL,((t,r,i)=>{const{sn:s,level:n,size:a}=t;if(this.httpTimeouts++,this.resolveMap.has(s)){this.resolveMap.get(s).resolve({bufferLeft:r,bufferRight:i,fromPeerId:e.getFromPeerId(),incomplete:!0,size:a}),this.resolveMap.delete(s)}this.requestingMap.delete(s,n)})).on(t.SYN_ERROR,((t,r)=>{const{logger:i}=this,{sn:s,level:n}=t;if(this.resolveMap.has(s)){const e=this.resolveMap.get(s);this.resolveMap.delete(s),e.resolve()}r===ct&&e.hasPartialBuffer()?i.warn("syn abort with partial buffer"):this.requestingMap.delete(s,n)}))}_handleDCHave(e,t,r,i,s){const n=0!==this.resolveMap.size;this._notifySynthesizer(e,i,t,r,s),this.config.live&&!n&&L()((()=>{this.checkPeers()}))}};var mt=function(e,t){return mt=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},mt(e,t)};function yt(e,t){function r(){this.constructor=e}mt(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}function Et(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var i,s,n=r.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(i=n.next()).done;)a.push(i.value)}catch(e){s={error:e}}finally{try{i&&!i.done&&(r=n.return)&&r.call(n)}finally{if(s)throw s.error}}return a}function St(){for(var e=[],t=0;t=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}}(i),n=s.next();!n.done;n=s.next()){var a=n.value;this._callEventListener(e,a)}}catch(e){t={error:e}}finally{try{n&&!n.done&&(r=s.return)&&r.call(s)}finally{if(t)throw t.error}}return!0},e.prototype.removeEventListener=function(e,t){this._listeners[e]&&(this._listeners[e]=this._listeners[e].filter((function(e){return e!==t})))},e.prototype._debug=function(){for(var e=[],t=0;t"],e))},e.prototype._getNextDelay=function(){var e=this._options,t=e.reconnectionDelayGrowFactor,r=void 0===t?At.reconnectionDelayGrowFactor:t,i=e.minReconnectionDelay,s=void 0===i?At.minReconnectionDelay:i,n=e.maxReconnectionDelay,a=void 0===n?At.maxReconnectionDelay:n,o=0;return this._retryCount>0&&(o=s*Math.pow(r,this._retryCount-1))>a&&(o=a),this._debug("next delay",o),o},e.prototype._wait=function(){var e=this;return new Promise((function(t){setTimeout(t,e._getNextDelay())}))},e.prototype._getNextUrl=function(e){if("string"==typeof e)return Promise.resolve(e);if("function"==typeof e){var t=e();if("string"==typeof t)return Promise.resolve(t);if(t.then)return t}throw Error("Invalid URL")},e.prototype._connect=function(){var e=this;if(!this._connectLock&&this._shouldReconnect){this._connectLock=!0;var t=this._options,r=t.maxRetries,i=void 0===r?At.maxRetries:r,s=t.connectionTimeout,n=void 0===s?At.connectionTimeout:s,a=t.WebSocket,o=void 0===a?Lt():a;if(this._retryCount>=i)this._debug("max retries reached",this._retryCount,">=",i);else{if(this._retryCount++,this._debug("connect",this._retryCount),this._removeListeners(),void 0===(l=o)||!l||2!==l.CLOSING)throw Error("No valid WebSocket class provided");var l;this._wait().then((function(){return e._getNextUrl(e._url)})).then((function(t){e._closeCalled||(e._debug("connect",{url:t,protocols:e._protocols}),e._ws=e._protocols?new o(t,e._protocols):new o(t),e._ws.binaryType=e._binaryType,e._connectLock=!1,e._addListeners(),e._connectTimeout=setTimeout((function(){return e._handleTimeout()}),n))}))}}},e.prototype._handleTimeout=function(){this._debug("timeout event"),this._handleError(new bt(Error("TIMEOUT"),this))},e.prototype._disconnect=function(e,t){if(void 0===e&&(e=1e3),this._clearTimeouts(),this._ws){this._removeListeners();try{this._ws.close(e,t),this._handleClose(new _t(e,t,this))}catch(e){}}},e.prototype._acceptOpen=function(){this._debug("accept open"),this._retryCount=0},e.prototype._callEventListener=function(e,t){"handleEvent"in t?t.handleEvent(e):t(e)},e.prototype._removeListeners=function(){this._ws&&(this._debug("removeListeners"),this._ws.removeEventListener("open",this._handleOpen),this._ws.removeEventListener("close",this._handleClose),this._ws.removeEventListener("message",this._handleMessage),this._ws.removeEventListener("error",this._handleError))},e.prototype._addListeners=function(){this._ws&&(this._debug("addListeners"),this._ws.addEventListener("open",this._handleOpen),this._ws.addEventListener("close",this._handleClose),this._ws.addEventListener("message",this._handleMessage),this._ws.addEventListener("error",this._handleError))},e.prototype._clearTimeouts=function(){clearTimeout(this._connectTimeout),clearTimeout(this._uptimeTimeout)},e}();class wt extends(n()){constructor(e,t,r,i,s="main"){super(),this.logger=e,this.config=t,this.wsAddr=r,this.serverVersion=0,this.pingInterval=i||60,this._ws=this._init(),this.name=s}_init(){const e={maxRetries:this.config.wsMaxRetries,minReconnectionDelay:c(1e4,6e4),maxReconnectionDelay:6e5,maxEnqueuedMessages:20};let t=new Dt(this.wsAddr,void 0,e);return t.addEventListener("open",(()=>{this.logger.info(`signal ${this.name} ${this.wsAddr} connection opened`),this.onopen&&this.onopen(),this._startPing(this.pingInterval)})),t.push=t.send,t.send=e=>{let r=JSON.stringify(e);t.push(r)},t.addEventListener("message",(e=>{let t=e.data;const r=JSON.parse(t),i=r.action;if("pong"!==i){if("ver"!==i)return"close"===i?(this.logger.warn(`server close signal ${this.name} reason ${r.reason}`),void this.close()):void(this.onmessage&&this.onmessage(r,this.name));this.serverVersion=r.ver}else clearTimeout(this.pongTimer)})),t.addEventListener("close",(e=>{this.logger.warn(`signal ${this.name} ${this.wsAddr} closed ${e.code} ${e.reason}`),this.onclose&&this.onclose(),this._stopPing()})),t.addEventListener("error",(e=>{this.logger.error(`signal ${this.name} ${this.wsAddr} error`),this._stopPing(),this.onerror&&this.onerror(e)})),t}sendSignal(e,t){const r={action:"signal",to_peer_id:e,data:t};this._send(r)}sendReject(e,t,r){const i={action:"reject",to_peer_id:e,reason:t,fatal:r};this._send(i)}_send(e){this._ws&&this._ws.send(e)}_startPing(e=120){this.connected&&(this.pingTimer=setInterval((()=>{this._send({action:"ping"}),this.serverVersion>=22&&this._waitForPong()}),1e3*e))}_waitForPong(){this.pongTimer=setTimeout((()=>{this.logger.warn(`signal ${this.name} wait for pong timeout, reconnect`),this.close(),this.reconnect()}),15e3)}_resetPing(){this._stopPing(),this._startPing(this.pingInterval)}_stopPing(){clearInterval(this.pingTimer),clearTimeout(this.pongTimer),this.pingTimer=null,this.pongTimer=null}close(){this.logger.info(`close signal ${this.name}`),this._stopPing(),(()=>{this._ws&&this._ws.close(1e3,"normal close")})()}reconnect(){this._ws&&(this.logger.info(`reconnect signal ${this.name}`),this._ws.reconnect())}destroy(){this.close(),this._ws=null,this.removeAllListeners()}get connected(){return!!this._ws&&this._ws.readyState===Dt.OPEN}}const It=wt,Pt=class extends(n()){constructor(e,t,r,i){super(),this.logger=e,this.config=t,this.mainAddr=r,this.backupAddr=i,this.mainWS=this._init(r),this.backupTimer=setTimeout((()=>{this.destroyed||(this.backupWS=this._init(i,"backup"))}),900),this._connected=!1,this.destroyed=!1}_init(e,t){if(!e)return null;let r=new It(this.logger,this.config,e,270,t);return r.onopen=()=>{!this._connected&&this.onopen&&(this._connected=!0,this.onopen())},r.onmessage=e=>{this.onmessage&&this.onmessage(e,r.name)},r.onclose=()=>{this._connected&&!this.connected&&this.onclose&&(this._connected=!1,this.onclose())},r.onerror=e=>{this.onerror&&this.onerror(e)},r}sendSignal(e,t,r){if(r){const i=this._getWSByName(r);i&&i.sendSignal(e,t)}else this.mainConnected?this.mainWS.sendSignal(e,t):this.backupConnected?this.backupWS.sendSignal(e,t):this.logger.warn("no signal available")}sendReject(e,t,r,i){if(i){const s=this._getWSByName(i);if(s)return void s.sendReject(e,t,r)}this.mainConnected?this.mainWS.sendReject(e,t,r):this.backupConnected?this.backupWS.sendReject(e,t,r):this.logger.warn("no signal available, send reject failed")}close(){this.mainWS&&this.mainWS.close(),this.backupWS&&this.backupWS.close()}_getWSByName(e){return this.mainWS&&this.mainWS.name===e?this.mainWS:this.backupWS&&this.backupWS.name===e?this.backupWS:null}reconnect(){this.mainWS&&this.mainWS.reconnect(),this.backupWS&&this.backupWS.reconnect()}destroy(){this.close(),clearTimeout(this.backupTimer),this.mainWS=null,this.backupWS=null,this.removeAllListeners(),this.destroyed=!0}get connected(){return this.mainConnected||this.backupConnected}get mainConnected(){return this.mainWS&&this.mainWS.connected}get backupConnected(){return this.backupWS&&this.backupWS.connected}};const Rt=function(e,t,r=40){var i=null,s=!1,n=r;return function(r=!1){if(r)return clearTimeout(i),void(s=!1);s||(s=!0,i=setTimeout((function(){e.call(t,n),s=!1,i=null}),1e3*n),n*=1.1)}};class Ct{constructor(e,t,r=15){this.engine=e,this.config=t,this.trickle=t.waitForPeer,this.poolSize=r,this.pool=[];for(let e=0;e{this.destroy()}),2e4)}_createPeer(){return new O(this.engine,void 0,void 0,!0,this.config,{trickle:this.trickle})}get size(){return this.pool.length}getPeer(){return 0===this.size?this._createPeer():this.pool.shift()}destroy(){for(let e of this.pool)e.destroy(!0);this.pool=[],clearTimeout(this.timer)}}class kt extends(n()){constructor(e,t,r,i){super(),this.engine=e,this.logger=e.logger,this.config=i,this.connected=!1,this.scheduler=r,this.sequential=this.scheduler.sequential,this.DCMap=new Map,this.failedDCSet=new Set,this.notFoundDCSet=new Set;const s=C().isMobile();this.peerPool=new Ct(e,i,s?10:15),this.signalerWs=null,this.fetcher=t,this.peers=[],this.minConns=5,this.stuns=[],this.requestMorePeers=Rt(this._requestMorePeers,this),this.maxConns=s?13:22,this.maxConnsActive=s?8:12,this.peersIncrement=0,this.gotPeersFromTracker=!1,this.fuseRate=-1,this.overloaded=!1}get totalConns(){return this.scheduler.peersNum+1}resumeP2P(){if(!this.fetcher)return;const{engine:t,config:r,fetcher:i}=this,{btAnnounce:s,btAnnouncePreflight:n}=i,{wsSignalerAddr:a,wifiOnly:o,geoIpPreflight:l,getPeerId:h}=r;(l?n:s).call(i).then((e=>{if(!this.scheduler)return;t.peerId=this.peerId=e.id,this.minConns=e.min_conns;const r=e.peers;this.scheduler.notifyPeersLoaded(r.length),t.netType=i.announceInfo.netType,(e.wifi_only||o)&&t.isMobileNet&&(this.scheduler.downloadOnly=!0,this.logger.info("downloadOnly mode")),e.overload&&(this.overloaded=!0,this.logger.warn("server is overloaded, degrade"));const s=a.main;let n=a.backup;e.signal&&!e.signal2&&(n=void 0),this.signalerWs=this._initSignalerWs(e.signal||s,e.signal2||n,e.token,e.token2),0===r.length?this.requestMorePeers():this.peers=this._filterPeers(r),t.emit("peerId",this.peerId),h&&"function"==typeof h&&h(this.peerId),e.stun&&e.stun.length>0&&(this.stuns=e.stun),e.debug&&this.logger.enableDebug(),e.fuse_rate&&(this.fuseRate=e.fuse_rate),this.logger.info(`announce request response ${JSON.stringify(e,null,2)}`)})).catch((r=>{if("TRACKER_EXPT"===r.code&&t.emit(e.EXCEPTION,r),this.scheduler.notifyPeersLoaded(0),r.retry){const e=c(15e3,4e4);this.logger.warn(`announce retry after ${e}ms`),this.announceTimer=setTimeout((()=>{this.resumeP2P()}),e)}}))}stopP2P(){this.fetcher.postStatsWithBeacon(),this.fetcher.destroy(),this.fetcher=null,this.requestMorePeers(!0),this.scheduler.destroy(),this.scheduler=null,this.signalerWs&&(this.signalerWs.destroy(),this.signalerWs=null),this.peers=[];for(let e of this.DCMap.values())e.destroy(!0);this.DCMap.clear(),this.peerPool.destroy(),this.peerPool=null,this.failedDCSet.clear(),this.notFoundDCSet.clear(),this.logger.warn("tracker stop p2p")}destroy(){this.stopP2P(),this.removeAllListeners(),clearTimeout(this.announceTimer);const{config:e}=this;e.getStats=e.getPeerId=e.getPeersInfo=null,this.logger.warn("destroy tracker")}_filterPeers(e){const t=[],r=[...this.DCMap.keys(),...this.failedDCSet.keys(),this.peerId];return e.filter((e=>!r.includes(e.id))).forEach((e=>{t.push({id:e.id,intermediator:e.intermediator})})),t}_tryConnectToAllPeers(){if(0!==this.peers.length&&this.signalerWs.connected)for(this.logger.info(`try connect to ${this.peers.length} peers`);this.peers.length>0&&!(this.DCMap.size>=this.maxConnsActive);){let e=this.peers.shift();const t=e.intermediator;this.logger.debug(`new DataChannel ${e.id} intermediator ${t}`),this._createDatachannel(e.id,!0,t)}}_setupDC(t){t.on(e.DC_SIGNAL,((e,r)=>{const i=t.remotePeerId;if(t.intermediator){const r=this.DCMap.get(t.intermediator);if(r){if(r.sendMsgSignal(i,this.peerId,e))return;this.logger.warn(`intermediator ${t.intermediator} relay failed`)}}this.signalerWs.sendSignal(i,e,t.signalName)})).on(e.DC_PEER_SIGNAL,(e=>{const r=e.to_peer_id,i=e.from_peer_id,s=e.action;if(r&&i&&s)if(r!==this.peerId){this.logger.info(`relay signal for ${i}`);const n=this.DCMap.get(r);if(n){if("signal"!==s)return void n.sendMsgSignalReject(r,i,e.reason,e.fatal);if(n.sendMsgSignal(r,i,e.data))return}t.sendMsgSignal(i,r)}else"signal"===s?this._handleSignalMsg(i,e,t.remotePeerId):this._handSignalRejected(i,e)})).on(e.DC_GET_PEERS,(()=>{const e=u(),r=this.scheduler.getPeers().filter((e=>e.peersConnected<(e.mobileWeb?13:22)&&!e.super));if(r&&r.length>0){const i=[];r.forEach((r=>{if(r.remotePeerId===t.remotePeerId||r.remotePeerId===this.peerId)return;if(!this.config.live&&(r.currentPos-t.currentPos>600||r.currentPos50&&i.push({id:r.remotePeerId})})),this.logger.info(`send ${i.length} peers to ${t.remotePeerId}`),t.sendPeers(i)}})).on(e.DC_PEERS,(e=>{t.gotPeers=!0;const r=e.peers;if(r&&r.length>0&&this.scheduler.peersNum<10){const e=5;this.logger.info(`receive ${r.length} peers from ${t.remotePeerId}`),r.forEach((e=>{e.intermediator=t.remotePeerId})),this.peers=this._filterPeers(r).slice(0,e),this._tryConnectToAllPeers()}})).once(e.DC_ERROR,(e=>{this.logger.info(`datachannel ${t.channelId} failed fatal ${e}`),this.scheduler&&(this.scheduler.deletePeer(t),this._destroyAndDeletePeer(t.remotePeerId,e),this.requestMorePeers(),this.fetcher&&(t.connected||e&&this.fetcher.increFailConns(),e&&this.failedDCSet.add(t.remotePeerId),this._doSignalFusing(this.scheduler.peersNum),this._tryConnectToAllPeers()))})).once(e.DC_TIMEOUT,(()=>{this.notFoundDCSet.add(t.remotePeerId)})).once(e.DC_CLOSE,(e=>{this.logger.info(`datachannel ${t.channelId} closed fatal ${e}`),this.scheduler&&(this.scheduler.deletePeer(t),this._doSignalFusing(this.scheduler.peersNum)),this._destroyAndDeletePeer(t.remotePeerId,e),e&&this.failedDCSet.add(t.remotePeerId),this.requestMorePeers(),this._tryConnectToAllPeers()})).once(e.DC_OPEN,(()=>{t.isInitiator&&this.scheduler.handshakePeer(t)})).once(e.DC_METADATA,(e=>{const{scheduler:r}=this;t.isInitiator||r.handshakePeer(t),r.handleMetaData(t,e);const i=this.DCMap.size>=this.minConns+3;this.requestMorePeers(i),this.peersIncrement++,this._doSignalFusing(r.peersNum+1)}))}_doSignalFusing(e){if(this.fuseRate<=0)return;const t=this.signalerWs.connected;t&&e>=this.fuseRate+2?(this.logger.warn("reach fuseRate, report stats close signaler"),this.totalConns-1>0&&this.fetcher.postStats(),this.signalerWs.close()):!t&&e{let r=`${e}?id=${this.peerId}&p=web&v=2.7.4`;return t&&(r=`${r}&token=${t}`),r};let a,o=n(t,i);if(!this.overloaded&&r&&r!==t){let e=n(r,s);a=new Pt(this.logger,this.config,o,e)}else a=new It(this.logger,this.config,o,270);return a.onopen=()=>{this.connected=!0,this.engine.emit("serverConnected",!0),this._tryConnectToAllPeers()},a.onmessage=(e,t)=>{let r=e.action;const i=e.from_peer_id;switch(r){case"signal":this._handleSignalMsg(i,e,null,t);break;case"reject":this._handSignalRejected(i,e);break;default:this.logger.warn(`Signal websocket unknown action ${r}`)}},a.onclose=()=>{this.connected=!1,this.engine.emit("serverConnected",!1)},a.onerror=t=>{t.message&&this.engine.emit(e.EXCEPTION,Le()(t,"SIGNAL_EXPT"))},a}_handSignalRejected(e,t){this.logger.warn(`signaling ${e} rejected, reason ${t.reason}`);const r=this.DCMap.get(e);r&&!r.connected&&(r.destroy(t.fatal),this.DCMap.delete(e)),this.requestMorePeers(),t.fatal&&this.failedDCSet.add(e),this._tryConnectToAllPeers()}_handleSignalMsg(e,t,r,i){if(!this.scheduler)return;const{logger:s}=this;if(t.data){if(this.failedDCSet.has(e))return void this._sendSignalReject(e,`peer ${e} in blocked list`,r,i,!0);this._handleSignal(e,t.data,r,i)}else{const t=this.DCMap.get(e);if(!t)return;if(this.signalerWs.backupConnected&&t&&t.signalMsgs.length>0&&"main"===i&&!t.useBackupSignal){t.useBackupSignal=!0,t.signalName="backup",s.warn(`${e} not found from main, try backup signal`);for(let r of t.signalMsgs)this.signalerWs.sendSignal(e,r,"backup");return}if(t.useBackupSignal)return;this._destroyAndDeletePeer(e),s.info(`signaling ${e} not found`);const{scheduler:n}=this;n.waitForPeer&&(n.waitingPeers--,0===n.waitingPeers&&n.notifyPeersLoaded(0)),this.requestMorePeers(),this._tryConnectToAllPeers(),r||this.notFoundDCSet.add(e)}}_handleSignal(e,t,r,i){const s=t.type,{logger:n}=this;let a=this.DCMap.get(e);if(a){if(a.connected)return void n.info("datachannel had connected, signal ignored");if("offer"===s){if(!(this.peerId>e))return void n.warn(`signal type wrong ${s}, ignored`);this._destroyAndDeletePeer(e,!1),n.warn(`signal type wrong ${s}, convert to non initiator`),a=this._createDatachannel(e,!1,r)}}else{if("answer"===s){const t=`signal type wrong ${s}`;return n.warn(t),this._sendSignalReject(e,t,r,i),void this._destroyAndDeletePeer(e,!1)}n.debug(`receive node ${e} connection request`);const t=this.scheduler.peersNum;if(t>=this.maxConns){const s=this.scheduler.getNonactivePeers();if(!(s.length>0)){const t=`peers reach limit ${this.maxConns}`;return n.warn(t),void this._sendSignalReject(e,t,r,i)}{let e=t-this.maxConns+2;for(s.length0;){const t=s.shift();t&&(n.warn(`close inactive peer ${t.remotePeerId}`),t.close(!1)),e--}}}a=this._createDatachannel(e,!1,r)}i&&(a.signalName=i),a.receiveSignal(t)}_createDatachannel(e,t,r){let i;if(t&&this.peerPool.size>0)i=this.peerPool.getPeer(),this.logger.info(`get peer from pool, signal size ${i.signalMsgs.length}`),i.assignPeerId(this.peerId,e);else{let s=this.config.trickleICE;r||this.overloaded&&(s=!1),i=new O(this.engine,this.peerId,e,t,this.config,{stuns:this.stuns,intermediator:r,trickle:s})}return this.DCMap.set(e,i),this._setupDC(i),i}_sendSignalReject(e,t,r,i,s){if(r){const i=this.DCMap.get(r);if(i&&i.sendMsgSignalReject(e,this.peerId,t,s))return}this.signalerWs.sendReject(e,t,s,i)}_requestMorePeers(e){const{logger:t}=this;t.info(`requestMorePeers after delay ${e}`);const r=this.scheduler.peersNum,i=this.peersIncrement;this.peersIncrement=0,r>=this.minConns||(0===r||i<=3&&!this.gotPeersFromTracker&&!this.overloaded?(this.failedDCSet.size>50&&(this.failedDCSet=new Set([...this.failedDCSet].slice(-50))),this.notFoundDCSet.size>20&&(this.notFoundDCSet=new Set([...this.notFoundDCSet].slice(-20))),this.fetcher.btGetPeers([...this.DCMap.keys(),...this.failedDCSet.keys(),...this.notFoundDCSet.keys()],0===r).then((e=>{t.info(`requestMorePeers resp ${JSON.stringify(e,null,2)}`),this.peers=this._filterPeers(e.peers),this._tryConnectToAllPeers()})).catch((e=>{t.error(`requestMorePeers error ${e}`)})),this.gotPeersFromTracker=!0):r{const{config:n}=this,a=e.live;n.live=a,this.targetDuration=e.averagetargetduration,this.browserInfo={...s,live:a,abr:this.multiBitrate||void 0,type:"hls_sw"},this.channel=`${r(this.currentSrc)}|${i}[${O.VERSION}]`,this.setupElectron();const o=this.initLogger();o.info("use HlsSwP2pEngine"),o.info(`engine version: ${W.version} hls-proxy version: ${this.swVersion}`),o.info(`channel ${this.channel}`),a||(n.startSN=e.startSN,n.endSN=e.endSN,o.info(`startSN ${e.startSN} endSN ${e.endSN}`));const{controller:l}=navigator.serviceWorker;if(l){if(n.httpStreamEnabled)try{const e=new ReadableStream({start(e){e.enqueue({action:t.STREAM_DETECT})}});l.postMessage(e,[e])}catch(e){}else l.postMessage({action:t.STREAM_DISABLE});n.swStreamEnabled&&l.postMessage({action:t.SW_STREAM_ENABLE})}this._init(this.channel,this.browserInfo),this.off(t.LEVEL_LOADED,this.onLevelLoaded)},this.on(t.LEVEL_LOADED,this.onLevelLoaded),this.onManifestParsed=(e,r)=>{this.multiBitrate=e.length>1,this.currentSrc=r,this.off(t.MANIFEST_PARSED,this.onManifestParsed)},this.on(t.MANIFEST_PARSED,this.onManifestParsed),this.onFragLoaded=({url:e})=>{!this.rangeTested&&this.config.useHttpRange&&(this.rangeTestUrl=e,d(e).then((()=>{this.config.httpRangeSupported=!0,this.config.logger.info("http range is supported")})).catch((()=>{this.config.httpRangeSupported=!1,this.config.logger.warn("http range is not supported")})),this.rangeTested=!0),this.off(t.FRAG_LOADED,this.onFragLoaded)},this.once(t.FRAG_LOADED,this.onFragLoaded),this.swSupported&&(navigator.serviceWorker.onmessage=e=>{const{action:r,data:i}=e.data,s=e.ports[0];if(r!==t.SW_STREAM&&(this.logger&&this.logger.info(`engine onmessage action ${r}`),s.postMessage({action:r,pong:!0})),!this.p2pEnabled||!i)return s.postMessage({action:r});switch(r){case t.SW_PLAYLIST:this.handlePlaylist(i,s);break;case t.SW_GET_PLAYLIST:this.handleGetPlaylist(i,s);break;default:if(!this.config.scheduler)return s.postMessage({action:r});this.config.scheduler.notifySWMessage(r,i,s)}}),this.config.swAutoRegister&&this.registerServiceWorker().then((function(e){})).catch((e=>{console.warn("ServiceWorker registration failed ",e)}))}get currentLevel(){return this.currentLevelIndex}watchRebuffering(e){this.offEventRebuffer=function(e,t){let r=null;const i=()=>{r||(r=setTimeout((()=>{t()}),2500))},s=()=>{null!=r&&(clearTimeout(r),r=null)};return e.addEventListener("waiting",i),e.addEventListener("playing",s),()=>{e.removeEventListener("waiting",i),e.removeEventListener("playing",s)}}(e,(()=>{this.fetcher&&this.fetcher.increRebuffers()}))}handlePlaylist(e,r){const{config:i,logger:s}=this,{url:n,redirectedUrl:a,text:o,ver:l}=e;if(this.swVersion=l,0!==o.indexOf("#EXTM3U")||this.bypassLevels.indexOf(n)>=0)return console.warn("no EXTM3U delimiter or bypass audio track"),r.postMessage({action:t.SW_PLAYLIST});r.postMessage({action:t.SW_PLAYLIST,data:{active:!0,debug:s&&s.isDebugLevel,sharePlaylist:!!i.sharePlaylist}}),this._parsePlaylist(o,n.split("?")[0],a)}_parsePlaylist(e,r,i){const s=r;i&&(r=i);const{config:n,logger:a}=this;if(e.indexOf("#EXTINF:")>0||e.indexOf("#EXT-X-TARGETDURATION:")>0){let i=0;const a=Ee.parseLevelPlaylist(e,r);this.levels.length>1?(i=this.levels.indexOf(a.url),-1===i?(this.restartP2p(),this.currentSrc=s,i=0):this.currentLevelIndex=i):(""!==this.currentSrc&&s!==this.currentSrc&&this.restartP2p(),this.currentSrc=s,this.levels=[r]),this.emit(t.LEVEL_LOADED,a),n.live&&function(e,t){if(e.size<=t)return;const r=[...e.keys()];do{e.delete(r.shift())}while(e.size>t)}(this.fragMap,200),a.fragments.forEach((e=>{e.level=i;let t=b().buildAbsoluteURL(e.baseurl,e.relurl,{alwaysNormalize:!0});const r=e.byteRange;2===r.length&&(t=`${t}|bytes=${r[0]}-${r[1]-1}`),this.fragMap.set(t,e)})),n.sharePlaylist&&n.scheduler&&!n.scheduler.isMobileNet&&n.scheduler.broadcastPlaylist(r.split("?")[0],e)}else{const i=Ee.parseMasterPlaylist(e,r);if(""!==this.currentSrc&&this.restartP2p(),i.length>0){i.sort(((e,t)=>e.bitrate-t.bitrate)),this.levels=i.map((e=>e.url));const t=i.map((e=>({id:e.attrs.AUDIO,codec:e.audioCodec})));Ee.parseMasterPlaylistMedia(e,r,"AUDIO",t).forEach((e=>{e.url&&this.bypassLevels.push(e.url)}))}this.emit(t.MANIFEST_PARSED,i,s)}}handleGetPlaylist(e,r){const{config:i,logger:s}=this;if(!s)return r.postMessage({action:t.SW_GET_PLAYLIST});const{scheduler:n}=i;if(!n)return void s.warn("scheduler not found");const{url:a}=e,o=a.split("?")[0];if(n.playlistInfo.has(o)){const e=n.getPlaylistFromPeer(o);if(e&&e.data){const{data:i,seq:n}=e;return s.info(`got playlist from peer seq ${n}`),r.postMessage({action:t.SW_GET_PLAYLIST,data:{text:i}}),void this._parsePlaylist(i,a.split("?")[0])}}return r.postMessage({action:t.SW_GET_PLAYLIST})}async registerServiceWorker(){const{logger:e,config:t}=this;if(!this.swSupported){let e="sw is not supported";return p||(e="https is required when using ServiceWorker",console.warn(e)),Promise.reject(e)}this.media=K(t.mediaElem),this.media||e&&e.warn("no video element found");const{serviceWorker:r}=navigator;return r.getRegistration(t.swFile).then((e=>e||r.register(t.swFile,{scope:t.swScope}).then((e=>{const t=e.installing||e.waiting;return e.active?e:new Promise(((r,i)=>{const s=()=>{"activated"===t.state?(t.removeEventListener("statechange",s),r(e)):"redundant"===t.state&&i("sw is redundant")};t.addEventListener("statechange",s)}))}))))}unregisterServiceWorker(){const{config:e}=this,t="serviceWorker is not registered";return new Promise(((r,i)=>{const{serviceWorker:s}=navigator;s||i(t),s.getRegistration(e.swFile).then((e=>{e?e.unregister().then((()=>{r()})).catch((()=>{i(t)})):i(t)}))}))}async _init(e,t){if(!this.p2pEnabled)return;const{logger:r}=this;try{await this.initSegmentManager()}catch(e){return void(r&&r.error(e))}t.live||(t.tag=this.getTagForVod());let i=new We(this,this.config.token,encodeURIComponent(e),this.config.announce||"",t);this.fetcher=i,this.config.fetcher=i;const s=setInterval((()=>{this.media?(clearInterval(s),this.watchRebuffering(this.media)):this.media=K(this.config.mediaElem)}),3e3);let n=new vt(this,this.config);n.bufferManager=this.bufMgr,n.fragMap=this.fragMap,this.tracker=new Ot(this,i,n,this.config),this.config.scheduler=this.tracker.scheduler,this.p2pEnabled&&!this.tracker.connected&&this.tracker.resumeP2P(),this.setupWindowListeners()}restartP2p(){this.logger&&this.logger.warn("restart P2P"),this.disableP2P(),this.enableP2P(),this.on(t.LEVEL_LOADED,this.onLevelLoaded),this.on(t.MANIFEST_PARSED,this.onManifestParsed),this.on(t.FRAG_LOADED,this.onFragLoaded)}enableP2P(){return this.p2pEnabled?null:(this.logger&&this.logger.info("enable P2P"),this.config.p2pEnabled=this.p2pEnabled=!0,this)}disableP2P(){this.logger&&this.logger.warn("disable P2P"),this.offEventRebuffer&&this.offEventRebuffer(),this.p2pEnabled&&(this.config.p2pEnabled=this.p2pEnabled=!1,this.tracker&&this.tracker instanceof Ot&&(this.tracker.stopP2P(),this.tracker={},this.fetcher=null,this.bufMgr.destroy(),this.bufMgr=null)),this.levels=[],this.currentLevelIndex=0,this.lastLevel=0,this.multiBitrate=!1,this.rangeTested=!1,this.rangeTestUrl="",this.currentSrc="",this.media=void 0,this.config.live=!1,this.removeAllListeners(t.MANIFEST_PARSED),this.removeAllListeners(t.LEVEL_LOADED)}}const xt=Mt;function Ft(e,t,r="main"){const i=b().parseURL(e),s=i.path.substring(i.path.lastIndexOf(".")+1);return-1!==t.indexOf(s)||"main"!==r}function Nt(){const e=performance.now();return{trequest:e,tfirst:0,tload:0,aborted:!1,loaded:0,retry:0,total:0,chunkCount:0,bwEstimate:0,loading:{start:e,first:0,end:0},parsing:{start:0,end:0},buffering:{start:0,first:0,end:0}}}function Bt(e,t){let r,i,s,n,a;const o=performance.now();r=o-300,i=o-200,s=o,e.trequest=r,e.tfirst=i,e.tload=s,e.loading={first:r,start:i,end:s},n=a=t,e.loaded=n,e.total=a}class Ut extends(n()){constructor(){super(),this.UNSENT=0,this.OPENED=1,this.HEADERS_RECEIVED=2,this.LOADING=3,this.DONE=4,this.timeout=0,this.withCredentials=!1,this.status=0,this.readyState=this.UNSENT,this.headers=new Map,this.responseHeaders=null,this.on("load",(e=>{this.onload&&this.onload(e)})),this.on("abort",(e=>{this.onabort&&this.onabort(e)})),this.on("error",(e=>{this.onerror&&this.onerror(e)})),this.on("loadstart",(e=>{this.onloadstart&&this.onloadstart(e)})),this.on("progress",(e=>{this.onprogress&&this.onprogress(e)})),this.on("timeout",(e=>{this.ontimeout&&this.ontimeout(e)})),this.on("loadend",(e=>{this.onloadend&&this.onloadend(e)})),this.on("readystatechange",(()=>{this.onreadystatechange&&this.onreadystatechange()}))}setRequestHeader(e,t){this.headers.set(e,t)}addEventListener(e,t){this.addListener(e,t)}removeEventListener(e,t){this.removeListener(e,t)}overrideMimeType(){}getAllResponseHeaders(){if(!this.responseHeaders)return null;let e="";return this.responseHeaders.forEach(((t,r)=>{e+=`${r}: ${t}\n`})),e}getResponseHeader(e){return this.responseHeaders?this.responseHeaders.get(e):null}open(){this.readyState=this.OPENED,this.emit("loadstart")}abort(){this.readyState=this.DONE,this.status=0}send(){}_emitEvent(e){this.emit(e,new ProgressEvent(e))}}class Gt{constructor(e){this.fetchSetup=e.fetchSetup||jt,this.xhrSetup=e.xhrSetup,this.controller=new window.AbortController,this.stats=Nt(),this.packetSize=o,this.fakeXhr=new Ut}destroy(){this.loader=this.callbacks=null,this.abortInternal()}abortInternal(){const e=this.response;e&&e.ok||(this.stats.aborted=!0,this.callbacks&&this.callbacks.onUpdate&&this.callbacks.onUpdate(void 0,!1,!0),this.controller.abort())}abort(){this.abortInternal(),this.callbacks&&this.callbacks.onAbort&&this.callbacks.onAbort(this.stats,this.context,this.response)}load(e,t,r){const i=this.stats;i.trequest=i.loading.start=performance.now();let s=function(e,t){const r={method:"GET",mode:"cors",credentials:"same-origin",signal:t,headers:new window.Headers(Object.assign({},e.headers))};e.rangeEnd&&r.headers.set("Range","bytes="+e.rangeStart+"-"+String(e.rangeEnd-1));return r}(e,this.controller.signal);const n="arraybuffer"===e.responseType,a=n?"byteLength":"length",o=r.onUpdate,l=r.onBodyStart;this.context=e,this.config=t,this.callbacks=r,this.xhrSetup&&(this.xhrSetup(this.fakeXhr,e.url),s=function(e,t){e.withCredentials&&(t.credentials="include");for(let[r,i]of e.headers)t.headers.set(r,i);return t}(this.fakeXhr,s)),this.request=this.fetchSetup(e,s),clearTimeout(this.requestTimeout),this.requestTimeout=setTimeout((()=>{this.abortInternal(),this.fakeXhr._emitEvent("timeout"),this.fakeXhr._emitEvent("loadend"),r.onTimeout(i,e,this.response)}),this.fakeXhr.timeout||t.timeout);const{fakeXhr:h}=this;h.readyState=h.OPENED,h.emit("readystatechange"),h._emitEvent("loadstart"),fetch(this.request).then((t=>{if(this.response=this.loader=t,!t.ok){const{status:e,statusText:r}=t;throw o&&o(void 0,!1,!0),new Ht(r||"fetch, bad network response",e,t)}i.tfirst=i.loading.first=Math.max(performance.now(),i.loading.start),i.total=parseInt(t.headers.get("Content-Length")||"0");const{fakeXhr:r}=this;return r.readyState=r.HEADERS_RECEIVED,r.responseHeaders=t.headers,r.emit("readystatechange"),o&&"0"!==i.total?(l&&l(i.total),this.loadProgressively(t,i,e,o)):(r.emit("progress",new ProgressEvent("progress",{lengthComputable:!1})),n?t.arrayBuffer():t.text())})).then((t=>{const{response:s}=this;clearTimeout(this.requestTimeout),i.tload=i.loading.end=Math.max(performance.now(),i.loading.first),i.loaded=i.total=t[a];const n={url:s.url,data:t};r.onProgress(i,e,t,s),r.onSuccess(n,i,e,s)})).catch((t=>{if(clearTimeout(this.requestTimeout),i.aborted)return;o&&o(void 0,!1,!0);const s=t&&t.code||0,n=t?t.message:null;r.onError({code:s,text:n},e,t?t.details:null)}))}loadProgressively(e,t,r,i){const s=e.body.getReader();let n=0,o=0,l=(0,a.l)(0);const h=()=>s.read().then((({value:r,done:s})=>{const{fakeXhr:u}=this;if(u.readyState!==u.LOADING&&(u.readyState=u.LOADING,u.emit("readystatechange")),r&&(n+=r.length),s){if(l.byteLength>0)if(n<=this.packetSize){const e=(0,a.l)(n);l.copy(e,0,o*this.packetSize,l.byteLength),i(e,!0)}else{const e=v(l,o*this.packetSize);for(let t=0;t=this.packetSize){n-=this.packetSize;const e=(0,a.l)(this.packetSize);l.copy(e,0,o*this.packetSize,(o+1)*this.packetSize),o++,i(e,!1)}return h()})).catch((()=>(this.fakeXhr._emitEvent("abort"),this.fakeXhr._emitEvent("loadend"),Promise.reject())));return h()}}function jt(e,t){return new window.Request(e.url,t)}class Ht extends Error{constructor(e,t,r){super(e),this.code=t,this.details=r}}const $t=class extends gt{constructor(e,t){super(e,t),this.isHlsjs=!0,this.waitForPeer=t.waitForPeer||!1,this.waitForPeerTimeout=t.waitForPeerTimeout,this.waitingPeers=0,this.waitingSeg={}}startWaitPeerTimer(){this.waitForPeer&&(this.waitForPeerTimer=setTimeout((()=>{this.waitForPeer&&(this.waitForPeer=!1,this.emit(t.SCH_WAIT_PEER))}),1e3*(this.waitForPeerTimeout+0)))}updatePlaySN(e){this.currPlaySN=e}load(e,t,r){this.isReceiver=!0;const{logger:i,config:s}=this;this.context=e;const{rangeStart:n,rangeEnd:a,url:o}=e,l=e.frag,{segId:h,sn:u,level:c}=l;this.callbacks=r,this.stats=Nt(),this.criticalSeg={sn:u,level:c,segId:h};let d=this.mBufferedDuration-s.httpLoadTime;d>this.dcDownloadTimeout&&(d=this.dcDownloadTimeout);const{forwardPeer:f,reversePeer:g}=this.targetPeers;f||g||(d-=1);let p=this.requestingMap.get(u,c);const v={rangeStart:Number(n),rangeEnd:Number(a),url:o,httpLoadTime:1e3*s.httpLoadTime-500,xhrSetup:s.xhrSetup,segId:h};p?p.setExtra(v):(p=new dt(this.coordinator,this.logger,u,c,h,this.httpRangeSupported,v),this._setupSynthesizer(p),this.requestingMap.set(u,c,p)),f&&(p.setForwardPeer(f),f.requestDataById(h,u,!0,{level:c})),g&&(p.setReversePeer(g),g.requestDataById(h,u,!0,{level:c,reverse:!0})),p.isEmpty()&&(d=0),i.info(`syn setTimeout ${d}`),p.setTimeout(1e3*d),this.targetPeers={}}waitPeerNotifier(){return new Promise((e=>{this.waitForPeer||e(),setTimeout(e,1e3*this.waitForPeerTimeout),this.once(t.SCH_WAIT_PEER,e)}))}addPeer(e){if(super.addPeer(e),this.waitForPeer){const{level:r,sn:i}=this.waitingSeg,s=e.remotePeerId;e.bitset.has(i,r)?(this.logger.info(`found initial seg ${r}-${i} from peer ${s}`),this.emit(t.SCH_WAIT_PEER)):this.waitingPeers===this.peersNum&&this.emit(t.SCH_WAIT_PEER)}}notifyPeersLoaded(e){this.logger.info(`notifyPeersLoaded ${e}`),this.waitForPeer&&(0===e?(this.waitForPeer=!1,this.emit(t.SCH_WAIT_PEER)):this.waitingPeers=e)}destroy(){super.destroy(),this.logger.warn("destroy HlsjsScheduler"),clearTimeout(this.waitForPeerTimer)}_setupDC(e){super._setupDC(e)}_setupSynthesizer(e){e.on(t.SYN_OUTPUT,((t,r)=>{const{config:i,logger:s}=this,{segId:n,sn:a,data:o,level:l}=t,{speed:h,http:u,p2p:c}=r;u>0?this.httpTimeouts++:this.httpTimeouts>0&&this.httpTimeouts--;const d=this.criticalSeg&&this.criticalSeg.segId===n;if(i.validateSegment(n,new Uint8Array(o))){this.notifyAllPeers(a,l,n),this.bitset.has(a,l)||this.reportTraffic(u,c,h);const r=e.getFromPeerId();if(d){s.info(`receive criticalSeg seg_id ${n}`);let e=this.stats;e.tfirst=e.loading.first=Math.max(e.trequest,performance.now()),e.tload=e.loading.end=e.tfirst,e.loaded=e.total=o.byteLength,this.criticalSeg=null;const{frag:t}=this.context;t.fromPeerId=r,t.loadByP2P=!0,this.callbacks.onSuccess({data:o,url:this.context.url},e,this.context)}else this.bitset.has(a,l)||(this.bufMgr.putSeg(t),this.updateLoaded(a,l,n))}else s.error(`segment ${n} validate failed`),d&&this.callbacks.onTimeout(this.stats,this.context,null);this.requestingMap.delete(a,l),i.live&&!this.criticalSeg&&this.checkPeers()})).on(t.SYN_ERROR,((t,r)=>{const{logger:i}=this,{sn:s,level:n}=t;i.warn(`SYN_ERROR loading ${s} code ${r}`),this.criticalSeg&&this.criticalSeg.sn===s&&(this.criticalSeg=null,this.callbacks.onTimeout(this.stats,this.context,null)),r===ct&&e.hasPartialBuffer()?i.warn("syn abort with partial buffer"):(this.requestingMap.delete(s,n),this._handleSynError(r))}))}_setupEngine(){super._setupEngine(),this.engine.on(t.FRAG_LOADING,(({sn:e,segId:t,byHttp:r,level:i})=>{this.loadingSN=e,this.loadingSegId=t})).on(t.FRAG_LOADED,(({sn:e,segId:t,byP2p:r,level:i})=>{this.requestingMap.delete(e,i),this.updateLoaded(e,i,t)})).on(t.FRAG_CHANGED,(({sn:e})=>{this.updatePlaySN(e)}))}_handleDCHave(e,t,r,i,s){this._notifySynthesizer(e,i,t,r,s),this.config.live&&!this.criticalSeg&&L()((()=>{this.checkPeers()}))}};const Wt=class extends ne{static get name(){return"HlsjsP2pEngine"}constructor(e,t={}){if(super(t),!e)throw new TypeError("hlsjs instance is null");this.hlsjs=e,this.HLSEvents=e.constructor.Events,this.config.isHlsV0="0"===e.constructor.version.split(".")[0],this.config.xhrSetup=e.config.xhrSetup,!0===this.config.httpStreamEnabled&&(e.config.streamEnabled=function(){if(window.fetch&&window.AbortController&&window.ReadableStream&&window.Request)try{return new window.ReadableStream({}),!0}catch(e){}return!1}());const{channelIdMaker:r,signalId:i,browserInfo:s}=this.setup();e.config.segmentId=this.config.segmentId,this.config.waitForPeer&&this.config.sourceUrl?(this.config.trickleICE=!0,this.config.httpRangeSupported=!0,this._startEngine(this.config.sourceUrl,this.config.live,s,r,i)):this.config.waitForPeer=!1;const n=(t,a)=>{if(!a)return;const{config:o}=this,l=a.details,h=l.live;this.config.waitForPeer?this.tracker&&this.tracker.scheduler.startWaitPeerTimer():this._startEngine(this.hlsjs.url,h,s,r,i,l),o.waitForPeer&&this.logger.info("waitForPeer mode"),e.off(this.HLSEvents.LEVEL_LOADED,n)};e.on(this.HLSEvents.LEVEL_LOADED,n);const a=(t,r)=>{const i=r.levels.length;this.multiBitrate=i>1,e.off(this.HLSEvents.MANIFEST_PARSED,a)};e.on(this.HLSEvents.MANIFEST_PARSED,a),e.on(this.HLSEvents.DESTROYING,(()=>{this.destroy()}))}_startEngine(e,t,r,i,s,n={}){const{config:a}=this;a.live=this.hlsjs.config.live=t,this.browserInfo={...r,live:t,abr:this.multiBitrate||void 0,type:"hls"},this.channel=`${i(e)}|${s}[${O.VERSION}]`,this.setupElectron();const o=this.initLogger();o.info("use HlsjsP2pEngine"),this.logger=this.hlsjs.config.logger=o,o.info(`channel ${this.channel}`),t||(a.startSN=n.startSN,a.endSN=n.endSN,o.info(`startSN ${n.startSN} endSN ${n.endSN}`)),this.eventListened=!1,this._init(this.channel,this.browserInfo)}async _init(e,r){const{logger:i,config:s}=this;if(!this.p2pEnabled)return;this.hlsjs.config.p2pEnabled=this.p2pEnabled,this.hlsjs.config.sharePlaylist=s.sharePlaylist,r.live||(r.tag=this.getTagForVod()),this.media=this.hlsjs.media,this.media&&(this.currentSrc=this.media.src);let a=new We(this,s.token,encodeURIComponent(e),s.announce||"",r);this.fetcher=a;const o=new $t(this,s);this.tracker=new Ot(this,a,o,s);try{await this.initSegmentManager()}catch(e){return void i.error(e)}this.hlsjs.config.bufMgr=this.bufMgr,o.bufferManager=this.bufMgr,this.hlsjs.config.fLoader=function(e,r,i,s,a){return class extends(n()){constructor(t){super(),this.logger=t.logger,this.isHlsV0=s,this.bufMgr=t.bufMgr,this.streamEnabled=t.streamEnabled,this.httpLoader=this.streamEnabled?new Gt(t):new t.loader(t),this.p2pEnabled=t.p2pEnabled,this.isLive=t.live,this.scheduler=e,this.fetcher=r,this.segmentId=t.segmentId,this.blockTypes=i,this.forbidden=r.forbidden,this.stats=this.httpLoader.stats||Nt(),this.enableWorker=t.enableWorker,this.segmentBypass="function"==typeof a?a:()=>!1}destroy(){this.httpLoader.destroy()}abort(){this.httpLoader.abort()}async load(e,r,i){const{logger:s,scheduler:n}=this,a=e.frag;this.isHlsV0||(a.stats=this.stats);let o=e.frag.segId;if(!o){let t;e.rangeEnd&&(t="bytes="+e.rangeStart+"-"+(e.rangeEnd-1)),o=e.frag.segId=this.segmentId(String(a.level),a.sn,a.url,t)}if(!a.url||Ft(a.url,this.blockTypes,a.type)||this.segmentBypass(a.url,a.tagList))return s.info(`HTTP load blockType ${a.url}`),e.frag.loadByHTTP=!0,this.httpLoader.load(e,r,i);if(this.forbidden)return;this.fetcher.increMediaRequests(),r.maxRetry=2;const l=n.getBufferedDuration(),h=await this.bufMgr.getSegById(o);if(this.p2pEnabled&&h){s.info(`bufMgr found seg sn ${a.sn} segId ${o} level ${a.level}`);let t=g(h.data).buffer,r={url:e.url,data:t};return Bt(this.stats,h.size),a.loaded=h.size,a.loadByP2P=!0,e.frag.fromPeerId=h.fromPeerId,void L()((()=>{!this.isHlsV0&&i.onProgress&&i.onProgress(this.stats,e,r.data),i.onSuccess(r,this.stats,e)}))}if(this.p2pEnabled&&n.hasAndSetTargetPeer(a.sn,a.level,a.segId,l))this.loadFragByP2p(e,r,i,o);else if(n.waitForPeer&&(s.warn("waitPeerNotifier start"),n.waitingSeg={sn:a.sn,level:a.level},await n.waitPeerNotifier(),s.warn("waitPeerNotifier end"),this.p2pEnabled&&n.hasAndSetTargetPeer(a.sn,a.level,a.segId,l)))this.loadFragByP2p(e,r,i,o);else if(s.info(`fragLoader load ${o} at ${a.sn} level ${a.level} buffered ${1e3*l}`),this.isLive&&n.hasIdlePeers&&l>7&&n.shouldWaitForNextSeg()){let h=l-7;h>4.5&&(h=4.5);const u=s=>{s===o&&(n.off(t.SCH_DCHAVE,u),clearTimeout(this.waitTimer),n.hasAndSetTargetPeer(a.sn,a.level,a.segId,l)?this.loadFragByP2p(e,r,i,o):this.loadFragByHttp(e,r,i,o))};s.info(`wait peer have for ${h}s`),n.on(t.SCH_DCHAVE,u),this.waitTimer=setTimeout((()=>{this.loadFragByHttp(e,r,i,o),n.off(t.SCH_DCHAVE,u)}),1e3*h)}else{const t=n.requestingMap.get(a.sn,a.level);n.httpRangeSupported&&t&&t.segId===a.segId&&t.hasPartialBuffer()?(s.warn(`syn has partial buffer for ${a.segId}`),this.loadFragByP2p(e,r,i,o)):this.loadFragByHttp(e,r,i,o)}}loadFragByHttp(e,t,r,i){const{logger:s,scheduler:n}=this,{segmentBuilderMap:a}=n;n.isReceiver=!1;const o=e.frag,{sn:l,level:h}=o;if(this.streamEnabled){let e;n.isMobileNet||n.notifyAllPeers(l,h,i,Ve),r.onUpdate=(t,r,i)=>{i?a.delete(l,h):e&&e.receiveBytes(t,r)},r.onBodyStart=t=>{!e&&t>0&&(e=new pt(l,h,i,t),a.has(l,h)||a.set(l,h,e))}}const u=r.onSuccess;r.onSuccess=async(e,t,r)=>{if(!await this.bufMgr.hasSegOfId(i)){const t=g(e.data).buffer,r=new P(l,i,t,this.fetcher.peerId,h);this.bufMgr.putSeg(r)}a.delete(l,h),this.fetcher.reportFlow(t.total);let o=t.tload-t.trequest;s.info(`HTTP loaded ${i} time ${o}`),n.notifyAllPeers(l,h,i),u(e,t,r)};const c=r.onProgress;r.onProgress=(e,t,r)=>{o.loaded=e.total,c(e,t,r&&this.enableWorker?g(r).buffer:r)},e.frag.loadByHTTP=!0,this.httpLoader.load(e,t,r)}loadFragByP2p(e,t,r,i){const{logger:s}=this,n=e.frag;this.scheduler.load(e,t,r);const a=r.onSuccess,o=r.onTimeout;r.onTimeout=(e,l)=>{s.warn(`P2P timeout switched to HTTP load ${n.relurl} at ${n.sn}`),r.onSuccess=a,this.loadFragByHttp(l,t,r,i),r.onTimeout=o},r.onSuccess=async(e,t,o)=>{if(!await this.bufMgr.hasSegOfId(i)){const t=g(e.data).buffer,r=new P(n.sn,i,t,n.fromPeerId||this.fetcher.peerId,n.level);this.bufMgr.putSeg(r)}n.loadByP2P||this.fetcher.reportFlow(t.total),n.loaded=t.loaded,s.info(`${n.loadByP2P?"P2P":"HTTP"} loaded segment id ${i}`),!this.isHlsV0&&r.onProgress&&r.onProgress(t,o,e.data),a(e,t,o)}}}}(o,a,s.p2pBlackList,s.isHlsV0,s.segmentBypass),s.sharePlaylist&&(this.hlsjs.config.pLoader=function(e){return class extends(n()){constructor(t){super(),this.logger=t.logger,this.isHlsV0=t.isHlsV0,this.xhrLoader=new t.loader(t),this.p2pEnabled=t.p2pEnabled,this.scheduler=e,this.stats=this.xhrLoader.stats||Nt()}destroy(){this.xhrLoader.destroy()}abort(){this.xhrLoader.abort()}load(e,t,r){const{logger:i}=this,{url:s}=e,n=s.split("?")[0],a=r.onSuccess;if(r.onSuccess=(e,t,r)=>{this.scheduler&&this.scheduler.broadcastPlaylist(n,e.data),a(e,t,r)},this.scheduler&&this.scheduler.playlistInfo.has(n)){const t=this.scheduler.getPlaylistFromPeer(n);if(t&&t.data){const{data:n,seq:a}=t;i.info(`got playlist from peer seq ${a}`),Bt(this.stats,n.length);let o={url:s,data:n};return void L()((()=>{r.onSuccess(o,this.stats,e)}))}}this.xhrLoader.load(e,t,r)}}}(o)),this.trackerTried=!1,this.eventListened||(this.hlsjs.on(this.HLSEvents.FRAG_LOADING,this._onFragLoading.bind(this)),this.hlsjs.on(this.HLSEvents.FRAG_LOADED,this._onFragLoaded.bind(this)),this.hlsjs.on(this.HLSEvents.FRAG_CHANGED,this._onFragChanged.bind(this)),this.hlsjs.on(this.HLSEvents.ERROR,this._onHlsError.bind(this)),this.eventListened=!0),this.setupWindowListeners(),this.trackerTried||this.tracker.connected||!s.p2pEnabled||(this.tracker.resumeP2P(),this.trackerTried=!0)}_onFragLoading(e,r){const i=r.frag;let{sn:s,level:n,segId:a}=i;if(!Ft(i.url,this.config.p2pBlackList,i.type)){if(this.logger.debug("loading frag "+s),this.bufMgr&&(this.bufMgr.loadingSN=s),!a){let e;i._byteRange&&(e="bytes="+i._byteRange[0]+"-"+i._byteRange[1]);let t=i.url;a=i.segId=this.config.segmentId(String(n),i.sn,t,e)}this.emit(t.FRAG_LOADING,{sn:s,segId:a,byHttp:i.loadByHTTP,level:n})}}_onFragLoaded(e,r){const{frag:i}=r,{sn:s,segId:n,loaded:a,duration:o,level:l,fromPeerId:h,loadByP2P:u,url:c}=i,{config:f,logger:g}=this;Ft(i.url,f.p2pBlackList,i.type)||(this.emit(t.FRAG_LOADED,{url:c,sn:s,level:l,segId:n,loaded:a,duration:o,byP2p:!!u,fromPeerId:h}),!this.rangeTested&&f.useHttpRange&&(d(i.url,void 0,f.xhrSetup).then((()=>{f.httpRangeSupported=!0,g.info("http range is supported")})).catch((()=>{f.httpRangeSupported=!1,g.warn("http range is not supported")})),this.rangeTested=!0))}_onFragChanged(e,r){const{frag:i}=r;if(!Ft(i.url,this.config.p2pBlackList,i.type)){this.logger.debug("frag changed: "+i.sn);const{sn:e,duration:r}=i;this.emit(t.FRAG_CHANGED,{sn:e,duration:r})}}_onHlsError(e,r){if(!r)return;const{logger:i}=this,s=`${r.type} details ${r.details} reason ${r.reason}`;r.fatal?i.error(s):i.warn(s);const n=this.hlsjs.constructor.ErrorDetails;switch(r.details){case n.BUFFER_STALLED_ERROR:this.fetcher&&this.fetcher.increRebuffers();break;case n.INTERNAL_EXCEPTION:this.fetcher&&(this.fetcher.errsInternalExpt++,this.fetcher.exptMsg=`${r.err.message} event ${r.event} ua ${navigator.userAgent}`),i.error(`INTERNAL_EXCEPTION event ${r.event} err ${r.err.message}`),this.emit(t.EXCEPTION,Le()(r.err,"HLSJS_EXPT"))}}get currentLevel(){const{currentLevel:e}=this.hlsjs;return e>=0?e:0}disableP2P(){this.logger&&this.logger.warn("disable P2P"),this.p2pEnabled&&(this.p2pEnabled=!1,this.config.p2pEnabled=this.hlsjs.config.p2pEnabled=this.p2pEnabled,this.tracker&&(this.tracker.stopP2P(),this.tracker={},this.fetcher=null,this.bufMgr.destroy(),this.bufMgr=null,this.hlsjs.config.fLoader=this.hlsjs.config.pLoader=this.hlsjs.constructor.DefaultConfig.loader))}};function Kt(){const e=function(){if("undefined"!=typeof window)return window.MediaSource||window.WebKitMediaSource}(),t=window.SourceBuffer||window.WebKitSourceBuffer,r=e&&"function"==typeof e.isTypeSupported&&e.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"'),i=!t||t.prototype&&"function"==typeof t.prototype.appendBuffer&&"function"==typeof t.prototype.remove;return!!r&&!!i}class qt{static get Events(){return t}static get TrackerZone(){return W.TrackerZone}static isSupported(){return W.isSupported()&&(Kt()||xt.isServiceWorkerSupported())}static isServiceWorkerSupported(){return xt.isServiceWorkerSupported()}static isMSESupported(){return Kt()}static getBrowser(){return C().getBrowser()}static get ServiceWorkerEngine(){return xt}static get HlsjsEngine(){return Wt}constructor(e={}){const{hlsjsInstance:t}=e;delete e.hlsjsInstance,"1"!==h("_ios")&&!e.proxyOnly&&t&&Kt()?this._realEngine=new Wt(t,e):this._realEngine=new xt(e)}get realEngine(){return this._realEngine}get engineName(){return this._realEngine.constructor.name}once(e,t){return this._realEngine.once(e,t)}on(e,t){return this._realEngine.on(e,t)}off(e,t){return this._realEngine.off(e,t)}removeListener(e,t){return this._realEngine.removeListener(e,t)}removeAllListeners(e){return this._realEngine.removeAllListeners(e)}set p2pEnabled(e){this._realEngine.p2pEnabled=e}get p2pEnabled(){return this._realEngine.p2pEnabled}enableP2P(){this._realEngine.enableP2P()}disableP2P(){this._realEngine.disableP2P()}destroy(){this._realEngine.destroy()}registerServiceWorker(){return"function"==typeof this._realEngine.registerServiceWorker?this._realEngine.registerServiceWorker():Promise.reject("Not supported by this engine")}unregisterServiceWorker(){return"function"==typeof this._realEngine.unregisterServiceWorker?this._realEngine.unregisterServiceWorker():Promise.reject("Not supported by this engine")}get version(){return W.version}}qt.version=W.version,qt.protocolVersion=O.VERSION,window&&(window.P2PEngineHls=qt);const Vt=qt;var zt;zt=r(305);const Yt={maxBufferLength:12},Xt={maxBufferLength:40};class Qt extends zt{static get P2PEvents(){return Vt.Events}static get P2pEngine(){return Vt}constructor(e={}){let t=e.p2pConfig||{};const r=!1===t.live?Xt:Yt;let i=JSON.parse(JSON.stringify(r));i.liveSyncDurationCount=10,i.manifestLoadingMaxRetry=3,i.manifestLoadingRetryDelay=700,i.levelLoadingRetryDelay=700,i.maxBufferSize=0;for(let t in e)"p2pConfig"!==t&&(i[t]=e[t]);super(i),this._restartEvent=()=>{this.restartP2P()},Vt.isSupported()&&(this._p2pEngine=new Vt({...t,hlsjsInstance:this}),this._p2pEngine.on(Vt.Events.RESTART_P2P,this._restartEvent)),this.on(zt.Events.DESTROYING,(()=>{this._p2pEngine&&(this._p2pEngine.removeListener(Vt.Events.RESTART_P2P,this._restartEvent),this._p2pEngine.hlsjs=null,this._p2pEngine=null)}))}get p2pEngine(){return this._p2pEngine}enableP2P(){this._p2pEngine&&(this._p2pEngine=this._p2pEngine.enableP2P())}disableP2P(){this._p2pEngine&&this._p2pEngine.disableP2P()}restartP2P(){this._p2pEngine&&(this._p2pEngine.disableP2P(),setTimeout((()=>{this.enableP2P()}),2e3),this._p2pEngine.removeListener(Vt.Events.RESTART_P2P,this._restartEvent))}}Qt.engineVersion=Vt.version,Qt.protocolVersion=Vt.protocolVersion,Qt.WEBRTC_SUPPORT=Vt.isSupported();const Jt=Qt})(),i=i.default})())); \ No newline at end of file diff --git a/templates/player/p2phls/jquery.min.js b/templates/player/p2phls/jquery.min.js new file mode 100644 index 0000000..74cf83b --- /dev/null +++ b/templates/player/p2phls/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v1.8.2 jquery.com | jquery.org/license */ +(function(a,b){function G(a){var b=F[a]={};return p.each(a.split(s),function(a,c){b[c]=!0}),b}function J(a,c,d){if(d===b&&a.nodeType===1){var e="Data-"+c.replace(I,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:+d+""===d?+d:H.test(d)?p.parseJSON(d):d}catch(f){}p.data(a,c,d)}else d=b}return d}function K(a){var b;for(b in a){if(b==="Data"&&p.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function ba(){return!1}function bb(){return!0}function bh(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function bi(a,b){do a=a[b];while(a&&a.nodeType!==1);return a}function bj(a,b,c){b=b||0;if(p.isFunction(b))return p.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return p.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=p.grep(a,function(a){return a.nodeType===1});if(be.test(b))return p.filter(b,d,!c);b=p.filter(b,d)}return p.grep(a,function(a,d){return p.inArray(a,b)>=0===c})}function bk(a){var b=bl.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function bC(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d").appendTo(e.body),c=b.css("display");b.remove();if(c==="none"||c===""){bI=e.body.appendChild(bI||p.extend(e.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write(""),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,"display"),e.body.removeChild(bI)}return bS[a]=c,c}function ci(a,b,c,d){var e;if(p.isArray(b))p.each(b,function(b,e){c||ce.test(a)?d(a,e):ci(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&p.type(b)==="object")for(e in b)ci(a+"["+e+"]",b[e],c,d);else d(a,b)}function cz(a){return function(b,c){typeof b!="string"&&(c=b,b="*");var d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h)[^>]*$|#([\w\-]*)$)/,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,y=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,z=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,A=/^-ms-/,B=/-([\da-z])/gi,C=function(a,b){return(b+"").toUpperCase()},D=function(){e.addEventListener?(e.removeEventListener("DOMContentLoaded",D,!1),p.ready()):e.readyState==="complete"&&(e.detachEvent("onreadystatechange",D),p.ready())},E={};p.fn=p.prototype={constructor:p,init:function(a,c,d){var f,g,h,i;if(!a)return this;if(a.nodeType)return this.context=this[0]=a,this.length=1,this;if(typeof a=="string"){a.charAt(0)==="<"&&a.charAt(a.length-1)===">"&&a.length>=3?f=[null,a,null]:f=u.exec(a);if(f&&(f[1]||!c)){if(f[1])return c=c instanceof p?c[0]:c,i=c&&c.nodeType?c.ownerDocument||c:e,a=p.parseHTML(f[1],i,!0),v.test(f[1])&&p.isPlainObject(c)&&this.attr.call(a,c,!0),p.merge(this,a);g=e.getElementById(f[2]);if(g&&g.parentNode){if(g.id!==f[2])return d.find(a);this.length=1,this[0]=g}return this.context=e,this.selector=a,this}return!c||c.jquery?(c||d).find(a):this.constructor(c).find(a)}return p.isFunction(a)?d.ready(a):(a.selector!==b&&(this.selector=a.selector,this.context=a.context),p.makeArray(a,this))},selector:"",jquery:"1.8.2",length:0,size:function(){return this.length},toArray:function(){return k.call(this)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=p.merge(this.constructor(),a);return d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")"),d},each:function(a,b){return p.each(this,a,b)},ready:function(a){return p.ready.promise().done(a),this},eq:function(a){return a=+a,a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(k.apply(this,arguments),"slice",k.call(arguments).join(","))},map:function(a){return this.pushStack(p.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:j,sort:[].sort,splice:[].splice},p.fn.init.prototype=p.fn,p.extend=p.fn.extend=function(){var a,c,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;typeof h=="boolean"&&(k=h,h=arguments[1]||{},i=2),typeof h!="object"&&!p.isFunction(h)&&(h={}),j===i&&(h=this,--i);for(;i0)return;d.resolveWith(e,[p]),p.fn.trigger&&p(e).trigger("ready").off("ready")},isFunction:function(a){return p.type(a)==="function"},isArray:Array.isArray||function(a){return p.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):E[m.call(a)]||"object"},isPlainObject:function(a){if(!a||p.type(a)!=="object"||a.nodeType||p.isWindow(a))return!1;try{if(a.constructor&&!n.call(a,"constructor")&&!n.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||n.call(a,d)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},error:function(a){throw new Error(a)},parseHTML:function(a,b,c){var d;return!a||typeof a!="string"?null:(typeof b=="boolean"&&(c=b,b=0),b=b||e,(d=v.exec(a))?[b.createElement(d[1])]:(d=p.buildFragment([a],b,c?null:[]),p.merge([],(d.cacheable?p.clone(d.fragment):d.fragment).childNodes)))},parseJSON:function(b){if(!b||typeof b!="string")return null;b=p.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(w.test(b.replace(y,"@").replace(z,"]").replace(x,"")))return(new Function("return "+b))();p.error("Invalid JSON: "+b)},parseXML:function(c){var d,e;if(!c||typeof c!="string")return null;try{a.DOMParser?(e=new DOMParser,d=e.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(f){d=b}return(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&p.error("Invalid XML: "+c),d},noop:function(){},globalEval:function(b){b&&r.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(A,"ms-").replace(B,C)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,c,d){var e,f=0,g=a.length,h=g===b||p.isFunction(a);if(d){if(h){for(e in a)if(c.apply(a[e],d)===!1)break}else for(;f0&&a[0]&&a[i-1]||i===0||p.isArray(a));if(j)for(;h-1)i.splice(c,1),e&&(c<=g&&g--,c<=h&&h--)}),this},has:function(a){return p.inArray(a,i)>-1},empty:function(){return i=[],this},disable:function(){return i=j=c=b,this},disabled:function(){return!i},lock:function(){return j=b,c||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return b=b||[],b=[a,b.slice?b.slice():b],i&&(!d||j)&&(e?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!d}};return l},p.extend({Deferred:function(a){var b=[["resolve","done",p.Callbacks("once memory"),"resolved"],["reject","fail",p.Callbacks("once memory"),"rejected"],["notify","progress",p.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return p.Deferred(function(c){p.each(b,function(b,d){var f=d[0],g=a[b];e[d[1]](p.isFunction(g)?function(){var a=g.apply(this,arguments);a&&p.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f+"With"](this===e?c:this,[a])}:c[f])}),a=null}).promise()},promise:function(a){return a!=null?p.extend(a,d):d}},e={};return d.pipe=d.then,p.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[a^1][2].disable,b[2][2].lock),e[f[0]]=g.fire,e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=k.call(arguments),d=c.length,e=d!==1||a&&p.isFunction(a.promise)?d:0,f=e===1?a:p.Deferred(),g=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?k.call(arguments):d,c===h?f.notifyWith(b,c):--e||f.resolveWith(b,c)}},h,i,j;if(d>1){h=new Array(d),i=new Array(d),j=new Array(d);for(;b
a",c=n.getElementsByTagName("*"),d=n.getElementsByTagName("a")[0],d.style.cssText="top:1px;float:left;opacity:.5";if(!c||!c.length)return{};f=e.createElement("select"),g=f.appendChild(e.createElement("option")),h=n.getElementsByTagName("input")[0],b={leadingWhitespace:n.firstChild.nodeType===3,tbody:!n.getElementsByTagName("tbody").length,htmlSerialize:!!n.getElementsByTagName("link").length,style:/top/.test(d.getAttribute("style")),hrefNormalized:d.getAttribute("href")==="/a",opacity:/^0.5/.test(d.style.opacity),cssFloat:!!d.style.cssFloat,checkOn:h.value==="on",optSelected:g.selected,getSetAttribute:n.className!=="t",enctype:!!e.createElement("form").enctype,html5Clone:e.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",boxModel:e.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},h.checked=!0,b.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,b.optDisabled=!g.disabled;try{delete n.test}catch(o){b.deleteExpando=!1}!n.addEventListener&&n.attachEvent&&n.fireEvent&&(n.attachEvent("onclick",m=function(){b.noCloneEvent=!1}),n.cloneNode(!0).fireEvent("onclick"),n.detachEvent("onclick",m)),h=e.createElement("input"),h.value="t",h.setAttribute("type","radio"),b.radioValue=h.value==="t",h.setAttribute("checked","checked"),h.setAttribute("name","t"),n.appendChild(h),i=e.createDocumentFragment(),i.appendChild(n.lastChild),b.checkClone=i.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=h.checked,i.removeChild(h),i.appendChild(n);if(n.attachEvent)for(k in{submit:!0,change:!0,focusin:!0})j="on"+k,l=j in n,l||(n.setAttribute(j,"return;"),l=typeof n[j]=="function"),b[k+"Bubbles"]=l;return p(function(){var c,d,f,g,h="padding:0;margin:0;border:0;display:block;overflow:hidden;",i=e.getElementsByTagName("body")[0];if(!i)return;c=e.createElement("div"),c.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",i.insertBefore(c,i.firstChild),d=e.createElement("div"),c.appendChild(d),d.innerHTML="
t
",f=d.getElementsByTagName("td"),f[0].style.cssText="padding:0;margin:0;border:0;display:none",l=f[0].offsetHeight===0,f[0].style.display="",f[1].style.display="none",b.reliableHiddenOffsets=l&&f[0].offsetHeight===0,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",b.boxSizing=d.offsetWidth===4,b.doesNotIncludeMarginInBodyOffset=i.offsetTop!==1,a.getComputedStyle&&(b.pixelPosition=(a.getComputedStyle(d,null)||{}).top!=="1%",b.boxSizingReliable=(a.getComputedStyle(d,null)||{width:"4px"}).width==="4px",g=e.createElement("div"),g.style.cssText=d.style.cssText=h,g.style.marginRight=g.style.width="0",d.style.width="1px",d.appendChild(g),b.reliableMarginRight=!parseFloat((a.getComputedStyle(g,null)||{}).marginRight)),typeof d.style.zoom!="undefined"&&(d.innerHTML="",d.style.cssText=h+"width:1px;padding:1px;display:inline;zoom:1",b.inlineBlockNeedsLayout=d.offsetWidth===3,d.style.display="block",d.style.overflow="visible",d.innerHTML="
",d.firstChild.style.width="5px",b.shrinkWrapBlocks=d.offsetWidth!==3,c.style.zoom=1),i.removeChild(c),c=d=f=g=null}),i.removeChild(n),c=d=f=g=h=i=n=null,b}();var H=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,I=/([A-Z])/g;p.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(p.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){return a=a.nodeType?p.cache[a[p.expando]]:a[p.expando],!!a&&!K(a)},data:function(a,c,d,e){if(!p.acceptData(a))return;var f,g,h=p.expando,i=typeof c=="string",j=a.nodeType,k=j?p.cache:a,l=j?a[h]:a[h]&&h;if((!l||!k[l]||!e&&!k[l].data)&&i&&d===b)return;l||(j?a[h]=l=p.deletedIds.pop()||p.guid++:l=h),k[l]||(k[l]={},j||(k[l].toJSON=p.noop));if(typeof c=="object"||typeof c=="function")e?k[l]=p.extend(k[l],c):k[l].data=p.extend(k[l].data,c);return f=k[l],e||(f.data||(f.data={}),f=f.data),d!==b&&(f[p.camelCase(c)]=d),i?(g=f[c],g==null&&(g=f[p.camelCase(c)])):g=f,g},removeData:function(a,b,c){if(!p.acceptData(a))return;var d,e,f,g=a.nodeType,h=g?p.cache:a,i=g?a[p.expando]:p.expando;if(!h[i])return;if(b){d=c?h[i]:h[i].data;if(d){p.isArray(b)||(b in d?b=[b]:(b=p.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,f=b.length;e1,null,!1))},removeData:function(a){return this.each(function(){p.removeData(this,a)})}}),p.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=p._data(a,b),c&&(!d||p.isArray(c)?d=p._data(a,b,p.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=p.queue(a,b),d=c.length,e=c.shift(),f=p._queueHooks(a,b),g=function(){p.dequeue(a,b)};e==="inprogress"&&(e=c.shift(),d--),e&&(b==="fx"&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return p._data(a,c)||p._data(a,c,{empty:p.Callbacks("once memory").add(function(){p.removeData(a,b+"queue",!0),p.removeData(a,c,!0)})})}}),p.fn.extend({queue:function(a,c){var d=2;return typeof a!="string"&&(c=a,a="fx",d--),arguments.length1)},removeAttr:function(a){return this.each(function(){p.removeAttr(this,a)})},prop:function(a,b){return p.access(this,p.prop,a,b,arguments.length>1)},removeProp:function(a){return a=p.propFix[a]||a,this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,f,g,h;if(p.isFunction(a))return this.each(function(b){p(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(s);for(c=0,d=this.length;c=0)d=d.replace(" "+c[f]+" "," ");e.className=a?p.trim(d):""}}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";return p.isFunction(a)?this.each(function(c){p(this).toggleClass(a.call(this,c,this.className,b),b)}):this.each(function(){if(c==="string"){var e,f=0,g=p(this),h=b,i=a.split(s);while(e=i[f++])h=d?h:!g.hasClass(e),g[h?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&p._data(this,"__className__",this.className),this.className=this.className||a===!1?"":p._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c=0)return!0;return!1},val:function(a){var c,d,e,f=this[0];if(!arguments.length){if(f)return c=p.valHooks[f.type]||p.valHooks[f.nodeName.toLowerCase()],c&&"get"in c&&(d=c.get(f,"value"))!==b?d:(d=f.value,typeof d=="string"?d.replace(P,""):d==null?"":d);return}return e=p.isFunction(a),this.each(function(d){var f,g=p(this);if(this.nodeType!==1)return;e?f=a.call(this,d,g.val()):f=a,f==null?f="":typeof f=="number"?f+="":p.isArray(f)&&(f=p.map(f,function(a){return a==null?"":a+""})),c=p.valHooks[this.type]||p.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,f,"value")===b)this.value=f})}}),p.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,f=a.selectedIndex,g=[],h=a.options,i=a.type==="select-one";if(f<0)return null;c=i?f:0,d=i?f+1:h.length;for(;c=0}),c.length||(a.selectedIndex=-1),c}}},attrFn:{},attr:function(a,c,d,e){var f,g,h,i=a.nodeType;if(!a||i===3||i===8||i===2)return;if(e&&p.isFunction(p.fn[c]))return p(a)[c](d);if(typeof a.getAttribute=="undefined")return p.prop(a,c,d);h=i!==1||!p.isXMLDoc(a),h&&(c=c.toLowerCase(),g=p.attrHooks[c]||(T.test(c)?M:L));if(d!==b){if(d===null){p.removeAttr(a,c);return}return g&&"set"in g&&h&&(f=g.set(a,d,c))!==b?f:(a.setAttribute(c,d+""),d)}return g&&"get"in g&&h&&(f=g.get(a,c))!==null?f:(f=a.getAttribute(c),f===null?b:f)},removeAttr:function(a,b){var c,d,e,f,g=0;if(b&&a.nodeType===1){d=b.split(s);for(;g=0}})});var V=/^(?:textarea|input|select)$/i,W=/^([^\.]*|)(?:\.(.+)|)$/,X=/(?:^|\s)hover(\.\S+|)\b/,Y=/^key/,Z=/^(?:mouse|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=function(a){return p.event.special.hover?a:a.replace(X,"mouseenter$1 mouseleave$1")};p.event={add:function(a,c,d,e,f){var g,h,i,j,k,l,m,n,o,q,r;if(a.nodeType===3||a.nodeType===8||!c||!d||!(g=p._data(a)))return;d.handler&&(o=d,d=o.handler,f=o.selector),d.guid||(d.guid=p.guid++),i=g.events,i||(g.events=i={}),h=g.handle,h||(g.handle=h=function(a){return typeof p!="undefined"&&(!a||p.event.triggered!==a.type)?p.event.dispatch.apply(h.elem,arguments):b},h.elem=a),c=p.trim(_(c)).split(" ");for(j=0;j=0&&(s=s.slice(0,-1),i=!0),s.indexOf(".")>=0&&(t=s.split("."),s=t.shift(),t.sort());if((!f||p.event.customEvent[s])&&!p.event.global[s])return;c=typeof c=="object"?c[p.expando]?c:new p.Event(s,c):new p.Event(s),c.type=s,c.isTrigger=!0,c.exclusive=i,c.namespace=t.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+t.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,m=s.indexOf(":")<0?"on"+s:"";if(!f){h=p.cache;for(j in h)h[j].events&&h[j].events[s]&&p.event.trigger(c,d,h[j].handle.elem,!0);return}c.result=b,c.target||(c.target=f),d=d!=null?p.makeArray(d):[],d.unshift(c),n=p.event.special[s]||{};if(n.trigger&&n.trigger.apply(f,d)===!1)return;q=[[f,n.bindType||s]];if(!g&&!n.noBubble&&!p.isWindow(f)){r=n.delegateType||s,k=$.test(r+s)?f:f.parentNode;for(l=f;k;k=k.parentNode)q.push([k,r]),l=k;l===(f.ownerDocument||e)&&q.push([l.defaultView||l.parentWindow||a,r])}for(j=0;j=0:p.find(m,this,null,[f]).length),h[m]&&j.push(l);j.length&&u.push({elem:f,matches:j})}o.length>q&&u.push({elem:this,matches:o.slice(q)});for(d=0;d0?this.on(b,null,a,c):this.trigger(b)},Y.test(b)&&(p.event.fixHooks[b]=p.event.keyHooks),Z.test(b)&&(p.event.fixHooks[b]=p.event.mouseHooks)}),function(a,b){function bc(a,b,c,d){c=c||[],b=b||r;var e,f,i,j,k=b.nodeType;if(!a||typeof a!="string")return c;if(k!==1&&k!==9)return[];i=g(b);if(!i&&!d)if(e=P.exec(a))if(j=e[1]){if(k===9){f=b.getElementById(j);if(!f||!f.parentNode)return c;if(f.id===j)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(j))&&h(b,f)&&f.id===j)return c.push(f),c}else{if(e[2])return w.apply(c,x.call(b.getElementsByTagName(a),0)),c;if((j=e[3])&&_&&b.getElementsByClassName)return w.apply(c,x.call(b.getElementsByClassName(j),0)),c}return bp(a.replace(L,"$1"),b,c,d,i)}function bd(a){return function(b){var c=b.nodeName.toLowerCase();return c==="input"&&b.type===a}}function be(a){return function(b){var c=b.nodeName.toLowerCase();return(c==="input"||c==="button")&&b.type===a}}function bf(a){return z(function(b){return b=+b,z(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function bg(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}function bh(a,b){var c,d,f,g,h,i,j,k=C[o][a];if(k)return b?0:k.slice(0);h=a,i=[],j=e.preFilter;while(h){if(!c||(d=M.exec(h)))d&&(h=h.slice(d[0].length)),i.push(f=[]);c=!1;if(d=N.exec(h))f.push(c=new q(d.shift())),h=h.slice(c.length),c.type=d[0].replace(L," ");for(g in e.filter)(d=W[g].exec(h))&&(!j[g]||(d=j[g](d,r,!0)))&&(f.push(c=new q(d.shift())),h=h.slice(c.length),c.type=g,c.matches=d);if(!c)break}return b?h.length:h?bc.error(a):C(a,i).slice(0)}function bi(a,b,d){var e=b.dir,f=d&&b.dir==="parentNode",g=u++;return b.first?function(b,c,d){while(b=b[e])if(f||b.nodeType===1)return a(b,c,d)}:function(b,d,h){if(!h){var i,j=t+" "+g+" ",k=j+c;while(b=b[e])if(f||b.nodeType===1){if((i=b[o])===k)return b.sizset;if(typeof i=="string"&&i.indexOf(j)===0){if(b.sizset)return b}else{b[o]=k;if(a(b,d,h))return b.sizset=!0,b;b.sizset=!1}}}else while(b=b[e])if(f||b.nodeType===1)if(a(b,d,h))return b}}function bj(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function bk(a,b,c,d,e){var f,g=[],h=0,i=a.length,j=b!=null;for(;h-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==l)||((b=c).nodeType?j(a,c,d):k(a,c,d))}];for(;i1&&bj(m),i>1&&a.slice(0,i-1).join("").replace(L,"$1"),c,i0,f=a.length>0,g=function(h,i,j,k,m){var n,o,p,q=[],s=0,u="0",x=h&&[],y=m!=null,z=l,A=h||f&&e.find.TAG("*",m&&i.parentNode||i),B=t+=z==null?1:Math.E;y&&(l=i!==r&&i,c=g.el);for(;(n=A[u])!=null;u++){if(f&&n){for(o=0;p=a[o];o++)if(p(n,i,j)){k.push(n);break}y&&(t=B,c=++g.el)}d&&((n=!p&&n)&&s--,h&&x.push(n))}s+=u;if(d&&u!==s){for(o=0;p=b[o];o++)p(x,q,i,j);if(h){if(s>0)while(u--)!x[u]&&!q[u]&&(q[u]=v.call(k));q=bk(q)}w.apply(k,q),y&&!h&&q.length>0&&s+b.length>1&&bc.uniqueSort(k)}return y&&(t=B,l=z),x};return g.el=0,d?z(g):g}function bo(a,b,c,d){var e=0,f=b.length;for(;e2&&(j=h[0]).type==="ID"&&b.nodeType===9&&!f&&e.relative[h[1].type]){b=e.find.ID(j.matches[0].replace(V,""),b,f)[0];if(!b)return c;a=a.slice(h.shift().length)}for(g=W.POS.test(a)?-1:h.length-1;g>=0;g--){j=h[g];if(e.relative[k=j.type])break;if(l=e.find[k])if(d=l(j.matches[0].replace(V,""),R.test(h[0].type)&&b.parentNode||b,f)){h.splice(g,1),a=d.length&&h.join("");if(!a)return w.apply(c,x.call(d,0)),c;break}}}return i(a,m)(d,b,f,c,R.test(a)),c}function bq(){}var c,d,e,f,g,h,i,j,k,l,m=!0,n="undefined",o=("sizcache"+Math.random()).replace(".",""),q=String,r=a.document,s=r.documentElement,t=0,u=0,v=[].pop,w=[].push,x=[].slice,y=[].indexOf||function(a){var b=0,c=this.length;for(;be.cacheLength&&delete a[b.shift()],a[c]=d},a)},B=A(),C=A(),D=A(),E="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",G=F.replace("w","w#"),H="([*^$|!~]?=)",I="\\["+E+"*("+F+")"+E+"*(?:"+H+E+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+G+")|)|)"+E+"*\\]",J=":("+F+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+I+")|[^:]|\\\\.)*|.*))\\)|)",K=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+E+"*((?:-\\d)?\\d*)"+E+"*\\)|)(?=[^-]|$)",L=new RegExp("^"+E+"+|((?:^|[^\\\\])(?:\\\\.)*)"+E+"+$","g"),M=new RegExp("^"+E+"*,"+E+"*"),N=new RegExp("^"+E+"*([\\x20\\t\\r\\n\\f>+~])"+E+"*"),O=new RegExp(J),P=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,Q=/^:not/,R=/[\x20\t\r\n\f]*[+~]/,S=/:not\($/,T=/h\d/i,U=/input|select|textarea|button/i,V=/\\(?!\\)/g,W={ID:new RegExp("^#("+F+")"),CLASS:new RegExp("^\\.("+F+")"),NAME:new RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:new RegExp("^("+F.replace("w","w*")+")"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+J),POS:new RegExp(K,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+E+"*(even|odd|(([+-]|)(\\d*)n|)"+E+"*(?:([+-]|)"+E+"*(\\d+)|))"+E+"*\\)|)","i"),needsContext:new RegExp("^"+E+"*[>+~]|"+K,"i")},X=function(a){var b=r.createElement("div");try{return a(b)}catch(c){return!1}finally{b=null}},Y=X(function(a){return a.appendChild(r.createComment("")),!a.getElementsByTagName("*").length}),Z=X(function(a){return a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!==n&&a.firstChild.getAttribute("href")==="#"}),$=X(function(a){a.innerHTML="";var b=typeof a.lastChild.getAttribute("multiple");return b!=="boolean"&&b!=="string"}),_=X(function(a){return a.innerHTML="
",!a.getElementsByClassName||!a.getElementsByClassName("e").length?!1:(a.lastChild.className="e",a.getElementsByClassName("e").length===2)}),ba=X(function(a){a.id=o+0,a.innerHTML="
",s.insertBefore(a,s.firstChild);var b=r.getElementsByName&&r.getElementsByName(o).length===2+r.getElementsByName(o+0).length;return d=!r.getElementById(o),s.removeChild(a),b});try{x.call(s.childNodes,0)[0].nodeType}catch(bb){x=function(a){var b,c=[];for(;b=this[a];a++)c.push(b);return c}}bc.matches=function(a,b){return bc(a,null,null,b)},bc.matchesSelector=function(a,b){return bc(b,null,null,[a]).length>0},f=bc.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(e===1||e===9||e===11){if(typeof a.textContent=="string")return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=f(a)}else if(e===3||e===4)return a.nodeValue}else for(;b=a[d];d++)c+=f(b);return c},g=bc.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?b.nodeName!=="HTML":!1},h=bc.contains=s.contains?function(a,b){var c=a.nodeType===9?a.documentElement:a,d=b&&b.parentNode;return a===d||!!(d&&d.nodeType===1&&c.contains&&c.contains(d))}:s.compareDocumentPosition?function(a,b){return b&&!!(a.compareDocumentPosition(b)&16)}:function(a,b){while(b=b.parentNode)if(b===a)return!0;return!1},bc.attr=function(a,b){var c,d=g(a);return d||(b=b.toLowerCase()),(c=e.attrHandle[b])?c(a):d||$?a.getAttribute(b):(c=a.getAttributeNode(b),c?typeof a[b]=="boolean"?a[b]?b:null:c.specified?c.value:null:null)},e=bc.selectors={cacheLength:50,createPseudo:z,match:W,attrHandle:Z?{}:{href:function(a){return a.getAttribute("href",2)},type:function(a){return a.getAttribute("type")}},find:{ID:d?function(a,b,c){if(typeof b.getElementById!==n&&!c){var d=b.getElementById(a);return d&&d.parentNode?[d]:[]}}:function(a,c,d){if(typeof c.getElementById!==n&&!d){var e=c.getElementById(a);return e?e.id===a||typeof e.getAttributeNode!==n&&e.getAttributeNode("id").value===a?[e]:b:[]}},TAG:Y?function(a,b){if(typeof b.getElementsByTagName!==n)return b.getElementsByTagName(a)}:function(a,b){var c=b.getElementsByTagName(a);if(a==="*"){var d,e=[],f=0;for(;d=c[f];f++)d.nodeType===1&&e.push(d);return e}return c},NAME:ba&&function(a,b){if(typeof b.getElementsByName!==n)return b.getElementsByName(name)},CLASS:_&&function(a,b,c){if(typeof b.getElementsByClassName!==n&&!c)return b.getElementsByClassName(a)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(V,""),a[3]=(a[4]||a[5]||"").replace(V,""),a[2]==="~="&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),a[1]==="nth"?(a[2]||bc.error(a[0]),a[3]=+(a[3]?a[4]+(a[5]||1):2*(a[2]==="even"||a[2]==="odd")),a[4]=+(a[6]+a[7]||a[2]==="odd")):a[2]&&bc.error(a[0]),a},PSEUDO:function(a){var b,c;if(W.CHILD.test(a[0]))return null;if(a[3])a[2]=a[3];else if(b=a[4])O.test(b)&&(c=bh(b,!0))&&(c=b.indexOf(")",b.length-c)-b.length)&&(b=b.slice(0,c),a[0]=a[0].slice(0,c)),a[2]=b;return a.slice(0,3)}},filter:{ID:d?function(a){return a=a.replace(V,""),function(b){return b.getAttribute("id")===a}}:function(a){return a=a.replace(V,""),function(b){var c=typeof b.getAttributeNode!==n&&b.getAttributeNode("id");return c&&c.value===a}},TAG:function(a){return a==="*"?function(){return!0}:(a=a.replace(V,"").toLowerCase(),function(b){return b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var b=B[o][a];return b||(b=B(a,new RegExp("(^|"+E+")"+a+"("+E+"|$)"))),function(a){return b.test(a.className||typeof a.getAttribute!==n&&a.getAttribute("Tool")||"")}},ATTR:function(a,b,c){return function(d,e){var f=bc.attr(d,a);return f==null?b==="!=":b?(f+="",b==="="?f===c:b==="!="?f!==c:b==="^="?c&&f.indexOf(c)===0:b==="*="?c&&f.indexOf(c)>-1:b==="$="?c&&f.substr(f.length-c.length)===c:b==="~="?(" "+f+" ").indexOf(c)>-1:b==="|="?f===c||f.substr(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d){return a==="nth"?function(a){var b,e,f=a.parentNode;if(c===1&&d===0)return!0;if(f){e=0;for(b=f.firstChild;b;b=b.nextSibling)if(b.nodeType===1){e++;if(a===b)break}}return e-=d,e===c||e%c===0&&e/c>=0}:function(b){var c=b;switch(a){case"only":case"first":while(c=c.previousSibling)if(c.nodeType===1)return!1;if(a==="first")return!0;c=b;case"last":while(c=c.nextSibling)if(c.nodeType===1)return!1;return!0}}},PSEUDO:function(a,b){var c,d=e.pseudos[a]||e.setFilters[a.toLowerCase()]||bc.error("unsupported pseudo: "+a);return d[o]?d(b):d.length>1?(c=[a,a,"",b],e.setFilters.hasOwnProperty(a.toLowerCase())?z(function(a,c){var e,f=d(a,b),g=f.length;while(g--)e=y.call(a,f[g]),a[e]=!(c[e]=f[g])}):function(a){return d(a,0,c)}):d}},pseudos:{not:z(function(a){var b=[],c=[],d=i(a.replace(L,"$1"));return d[o]?z(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)if(f=g[h])a[h]=!(b[h]=f)}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:z(function(a){return function(b){return bc(a,b).length>0}}),contains:z(function(a){return function(b){return(b.textContent||b.innerText||f(b)).indexOf(a)>-1}}),enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&!!a.checked||b==="option"&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},parent:function(a){return!e.pseudos.empty(a)},empty:function(a){var b;a=a.firstChild;while(a){if(a.nodeName>"@"||(b=a.nodeType)===3||b===4)return!1;a=a.nextSibling}return!0},header:function(a){return T.test(a.nodeName)},text:function(a){var b,c;return a.nodeName.toLowerCase()==="input"&&(b=a.type)==="text"&&((c=a.getAttribute("type"))==null||c.toLowerCase()===b)},radio:bd("radio"),checkbox:bd("checkbox"),file:bd("file"),password:bd("password"),image:bd("image"),submit:be("submit"),reset:be("reset"),button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&a.type==="button"||b==="button"},input:function(a){return U.test(a.nodeName)},focus:function(a){var b=a.ownerDocument;return a===b.activeElement&&(!b.hasFocus||b.hasFocus())&&(!!a.type||!!a.href)},active:function(a){return a===a.ownerDocument.activeElement},first:bf(function(a,b,c){return[0]}),last:bf(function(a,b,c){return[b-1]}),eq:bf(function(a,b,c){return[c<0?c+b:c]}),even:bf(function(a,b,c){for(var d=0;d=0;)a.push(d);return a}),gt:bf(function(a,b,c){for(var d=c<0?c+b:c;++d",a.querySelectorAll("[selected]").length||e.push("\\["+E+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),a.querySelectorAll(":checked").length||e.push(":checked")}),X(function(a){a.innerHTML="

",a.querySelectorAll("[test^='']").length&&e.push("[*^$]="+E+"*(?:\"\"|'')"),a.innerHTML="",a.querySelectorAll(":enabled").length||e.push(":enabled",":disabled")}),e=new RegExp(e.join("|")),bp=function(a,d,f,g,h){if(!g&&!h&&(!e||!e.test(a))){var i,j,k=!0,l=o,m=d,n=d.nodeType===9&&a;if(d.nodeType===1&&d.nodeName.toLowerCase()!=="object"){i=bh(a),(k=d.getAttribute("id"))?l=k.replace(c,"\\$&"):d.setAttribute("id",l),l="[id='"+l+"'] ",j=i.length;while(j--)i[j]=l+i[j].join("");m=R.test(a)&&d.parentNode||d,n=i.join(",")}if(n)try{return w.apply(f,x.call(m.querySelectorAll(n),0)),f}catch(p){}finally{k||d.removeAttribute("id")}}return b(a,d,f,g,h)},h&&(X(function(b){a=h.call(b,"div");try{h.call(b,"[test!='']:sizzle"),f.push("!=",J)}catch(c){}}),f=new RegExp(f.join("|")),bc.matchesSelector=function(b,c){c=c.replace(d,"='$1']");if(!g(b)&&!f.test(c)&&(!e||!e.test(c)))try{var i=h.call(b,c);if(i||a||b.document&&b.document.nodeType!==11)return i}catch(j){}return bc(c,null,null,[b]).length>0})}(),e.pseudos.nth=e.pseudos.eq,e.filters=bq.prototype=e.pseudos,e.setFilters=new bq,bc.attr=p.attr,p.find=bc,p.expr=bc.selectors,p.expr[":"]=p.expr.pseudos,p.unique=bc.uniqueSort,p.text=bc.getText,p.isXMLDoc=bc.isXML,p.contains=bc.contains}(a);var bc=/Until$/,bd=/^(?:parents|prev(?:Until|All))/,be=/^.[^:#\[\.,]*$/,bf=p.expr.match.needsContext,bg={children:!0,contents:!0,next:!0,prev:!0};p.fn.extend({find:function(a){var b,c,d,e,f,g,h=this;if(typeof a!="string")return p(a).filter(function(){for(b=0,c=h.length;b0)for(e=d;e=0:p.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c,d=0,e=this.length,f=[],g=bf.test(a)||typeof a!="string"?p(a,b||this.context):0;for(;d-1:p.find.matchesSelector(c,a)){f.push(c);break}c=c.parentNode}}return f=f.length>1?p.unique(f):f,this.pushStack(f,"closest",a)},index:function(a){return a?typeof a=="string"?p.inArray(this[0],p(a)):p.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(a,b){var c=typeof a=="string"?p(a,b):p.makeArray(a&&a.nodeType?[a]:a),d=p.merge(this.get(),c);return this.pushStack(bh(c[0])||bh(d[0])?d:p.unique(d))},addBack:function(a){return this.add(a==null?this.prevObject:this.prevObject.filter(a))}}),p.fn.andSelf=p.fn.addBack,p.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return p.dir(a,"parentNode")},parentsUntil:function(a,b,c){return p.dir(a,"parentNode",c)},next:function(a){return bi(a,"nextSibling")},prev:function(a){return bi(a,"previousSibling")},nextAll:function(a){return p.dir(a,"nextSibling")},prevAll:function(a){return p.dir(a,"previousSibling")},nextUntil:function(a,b,c){return p.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return p.dir(a,"previousSibling",c)},siblings:function(a){return p.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return p.sibling(a.firstChild)},contents:function(a){return p.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:p.merge([],a.childNodes)}},function(a,b){p.fn[a]=function(c,d){var e=p.map(this,b,c);return bc.test(a)||(d=c),d&&typeof d=="string"&&(e=p.filter(d,e)),e=this.length>1&&!bg[a]?p.unique(e):e,this.length>1&&bd.test(a)&&(e=e.reverse()),this.pushStack(e,a,k.call(arguments).join(","))}}),p.extend({filter:function(a,b,c){return c&&(a=":not("+a+")"),b.length===1?p.find.matchesSelector(b[0],a)?[b[0]]:[]:p.find.matches(a,b)},dir:function(a,c,d){var e=[],f=a[c];while(f&&f.nodeType!==9&&(d===b||f.nodeType!==1||!p(f).is(d)))f.nodeType===1&&e.push(f),f=f[c];return e},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var bl="abbr|article|aside|audio|bdi|canvas|Data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",bm=/ jQuery\d+="(?:null|\d+)"/g,bn=/^\s+/,bo=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bp=/<([\w:]+)/,bq=/]","i"),bv=/^(?:checkbox|radio)$/,bw=/checked\s*(?:[^=]|=\s*.checked.)/i,bx=/\/(java|ecma)script/i,by=/^\s*\s*$/g,bz={option:[1,""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bA=bk(e),bB=bA.appendChild(e.createElement("div"));bz.optgroup=bz.option,bz.tbody=bz.tfoot=bz.colgroup=bz.caption=bz.thead,bz.th=bz.td,p.support.htmlSerialize||(bz._default=[1,"X
","
"]),p.fn.extend({text:function(a){return p.access(this,function(a){return a===b?p.text(this):this.empty().append((this[0]&&this[0].ownerDocument||e).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(p.isFunction(a))return this.each(function(b){p(this).wrapAll(a.call(this,b))});if(this[0]){var b=p(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return p.isFunction(a)?this.each(function(b){p(this).wrapInner(a.call(this,b))}):this.each(function(){var b=p(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=p.isFunction(a);return this.each(function(c){p(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){p.nodeName(this,"body")||p(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(a,this.firstChild)})},before:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(a,this),"before",this.selector)}},after:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(this,a),"after",this.selector)}},remove:function(a,b){var c,d=0;for(;(c=this[d])!=null;d++)if(!a||p.filter(a,[c]).length)!b&&c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),p.cleanData([c])),c.parentNode&&c.parentNode.removeChild(c);return this},empty:function(){var a,b=0;for(;(a=this[b])!=null;b++){a.nodeType===1&&p.cleanData(a.getElementsByTagName("*"));while(a.firstChild)a.removeChild(a.firstChild)}return this},clone:function(a,b){return a=a==null?!1:a,b=b==null?a:b,this.map(function(){return p.clone(this,a,b)})},html:function(a){return p.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(bm,""):b;if(typeof a=="string"&&!bs.test(a)&&(p.support.htmlSerialize||!bu.test(a))&&(p.support.leadingWhitespace||!bn.test(a))&&!bz[(bp.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(bo,"<$1>");try{for(;d1&&typeof j=="string"&&bw.test(j))return this.each(function(){p(this).domManip(a,c,d)});if(p.isFunction(j))return this.each(function(e){var f=p(this);a[0]=j.call(this,e,c?f.html():b),f.domManip(a,c,d)});if(this[0]){e=p.buildFragment(a,this,k),g=e.fragment,f=g.firstChild,g.childNodes.length===1&&(g=f);if(f){c=c&&p.nodeName(f,"tr");for(h=e.cacheable||l-1;i0?this.clone(!0):this).get(),p(g[e])[b](d),f=f.concat(d);return this.pushStack(f,a,g.selector)}}),p.extend({clone:function(a,b,c){var d,e,f,g;p.support.html5Clone||p.isXMLDoc(a)||!bu.test("<"+a.nodeName+">")?g=a.cloneNode(!0):(bB.innerHTML=a.outerHTML,bB.removeChild(g=bB.firstChild));if((!p.support.noCloneEvent||!p.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!p.isXMLDoc(a)){bE(a,g),d=bF(a),e=bF(g);for(f=0;d[f];++f)e[f]&&bE(d[f],e[f])}if(b){bD(a,g);if(c){d=bF(a),e=bF(g);for(f=0;d[f];++f)bD(d[f],e[f])}}return d=e=null,g},clean:function(a,b,c,d){var f,g,h,i,j,k,l,m,n,o,q,r,s=b===e&&bA,t=[];if(!b||typeof b.createDocumentFragment=="undefined")b=e;for(f=0;(h=a[f])!=null;f++){typeof h=="number"&&(h+="");if(!h)continue;if(typeof h=="string")if(!br.test(h))h=b.createTextNode(h);else{s=s||bk(b),l=b.createElement("div"),s.appendChild(l),h=h.replace(bo,"<$1>"),i=(bp.exec(h)||["",""])[1].toLowerCase(),j=bz[i]||bz._default,k=j[0],l.innerHTML=j[1]+h+j[2];while(k--)l=l.lastChild;if(!p.support.tbody){m=bq.test(h),n=i==="table"&&!m?l.firstChild&&l.firstChild.childNodes:j[1]===""&&!m?l.childNodes:[];for(g=n.length-1;g>=0;--g)p.nodeName(n[g],"tbody")&&!n[g].childNodes.length&&n[g].parentNode.removeChild(n[g])}!p.support.leadingWhitespace&&bn.test(h)&&l.insertBefore(b.createTextNode(bn.exec(h)[0]),l.firstChild),h=l.childNodes,l.parentNode.removeChild(l)}h.nodeType?t.push(h):p.merge(t,h)}l&&(h=l=s=null);if(!p.support.appendChecked)for(f=0;(h=t[f])!=null;f++)p.nodeName(h,"input")?bG(h):typeof h.getElementsByTagName!="undefined"&&p.grep(h.getElementsByTagName("input"),bG);if(c){q=function(a){if(!a.type||bx.test(a.type))return d?d.push(a.parentNode?a.parentNode.removeChild(a):a):c.appendChild(a)};for(f=0;(h=t[f])!=null;f++)if(!p.nodeName(h,"script")||!q(h))c.appendChild(h),typeof h.getElementsByTagName!="undefined"&&(r=p.grep(p.merge([],h.getElementsByTagName("script")),q),t.splice.apply(t,[f+1,0].concat(r)),f+=r.length)}return t},cleanData:function(a,b){var c,d,e,f,g=0,h=p.expando,i=p.cache,j=p.support.deleteExpando,k=p.event.special;for(;(e=a[g])!=null;g++)if(b||p.acceptData(e)){d=e[h],c=d&&i[d];if(c){if(c.events)for(f in c.events)k[f]?p.event.remove(e,f):p.removeEvent(e,f,c.handle);i[d]&&(delete i[d],j?delete e[h]:e.removeAttribute?e.removeAttribute(h):e[h]=null,p.deletedIds.push(d))}}}}),function(){var a,b;p.uaMatch=function(a){a=a.toLowerCase();var b=/(chrome)[ \/]([\w.]+)/.exec(a)||/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||a.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},a=p.uaMatch(g.userAgent),b={},a.browser&&(b[a.browser]=!0,b.version=a.version),b.chrome?b.webkit=!0:b.webkit&&(b.safari=!0),p.browser=b,p.sub=function(){function a(b,c){return new a.fn.init(b,c)}p.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function c(c,d){return d&&d instanceof p&&!(d instanceof a)&&(d=a(d)),p.fn.init.call(this,c,d,b)},a.fn.init.prototype=a.fn;var b=a(e);return a}}();var bH,bI,bJ,bK=/alpha\([^)]*\)/i,bL=/opacity=([^)]*)/,bM=/^(top|right|bottom|left)$/,bN=/^(none|table(?!-c[ea]).+)/,bO=/^margin/,bP=new RegExp("^("+q+")(.*)$","i"),bQ=new RegExp("^("+q+")(?!px)[a-z%]+$","i"),bR=new RegExp("^([-+])=("+q+")","i"),bS={},bT={position:"absolute",visibility:"hidden",display:"block"},bU={letterSpacing:0,fontWeight:400},bV=["Top","Right","Bottom","Left"],bW=["Webkit","O","Moz","ms"],bX=p.fn.toggle;p.fn.extend({css:function(a,c){return p.access(this,function(a,c,d){return d!==b?p.style(a,c,d):p.css(a,c)},a,c,arguments.length>1)},show:function(){return b$(this,!0)},hide:function(){return b$(this)},toggle:function(a,b){var c=typeof a=="boolean";return p.isFunction(a)&&p.isFunction(b)?bX.apply(this,arguments):this.each(function(){(c?a:bZ(this))?p(this).show():p(this).hide()})}}),p.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bH(a,"opacity");return c===""?"1":c}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":p.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!a||a.nodeType===3||a.nodeType===8||!a.style)return;var f,g,h,i=p.camelCase(c),j=a.style;c=p.cssProps[i]||(p.cssProps[i]=bY(j,i)),h=p.cssHooks[c]||p.cssHooks[i];if(d===b)return h&&"get"in h&&(f=h.get(a,!1,e))!==b?f:j[c];g=typeof d,g==="string"&&(f=bR.exec(d))&&(d=(f[1]+1)*f[2]+parseFloat(p.css(a,c)),g="number");if(d==null||g==="number"&&isNaN(d))return;g==="number"&&!p.cssNumber[i]&&(d+="px");if(!h||!("set"in h)||(d=h.set(a,d,e))!==b)try{j[c]=d}catch(k){}},css:function(a,c,d,e){var f,g,h,i=p.camelCase(c);return c=p.cssProps[i]||(p.cssProps[i]=bY(a.style,i)),h=p.cssHooks[c]||p.cssHooks[i],h&&"get"in h&&(f=h.get(a,!0,e)),f===b&&(f=bH(a,c)),f==="normal"&&c in bU&&(f=bU[c]),d||e!==b?(g=parseFloat(f),d||p.isNumeric(g)?g||0:f):f},swap:function(a,b,c){var d,e,f={};for(e in b)f[e]=a.style[e],a.style[e]=b[e];d=c.call(a);for(e in b)a.style[e]=f[e];return d}}),a.getComputedStyle?bH=function(b,c){var d,e,f,g,h=a.getComputedStyle(b,null),i=b.style;return h&&(d=h[c],d===""&&!p.contains(b.ownerDocument,b)&&(d=p.style(b,c)),bQ.test(d)&&bO.test(c)&&(e=i.width,f=i.minWidth,g=i.maxWidth,i.minWidth=i.maxWidth=i.width=d,d=h.width,i.width=e,i.minWidth=f,i.maxWidth=g)),d}:e.documentElement.currentStyle&&(bH=function(a,b){var c,d,e=a.currentStyle&&a.currentStyle[b],f=a.style;return e==null&&f&&f[b]&&(e=f[b]),bQ.test(e)&&!bM.test(b)&&(c=f.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":e,e=f.pixelLeft+"px",f.left=c,d&&(a.runtimeStyle.left=d)),e===""?"auto":e}),p.each(["height","width"],function(a,b){p.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth===0&&bN.test(bH(a,"display"))?p.swap(a,bT,function(){return cb(a,b,d)}):cb(a,b,d)},set:function(a,c,d){return b_(a,c,d?ca(a,b,d,p.support.boxSizing&&p.css(a,"boxSizing")==="border-box"):0)}}}),p.support.opacity||(p.cssHooks.opacity={get:function(a,b){return bL.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=p.isNumeric(b)?"alpha(opacity="+b*100+")":"",f=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&p.trim(f.replace(bK,""))===""&&c.removeAttribute){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bK.test(f)?f.replace(bK,e):f+" "+e}}),p(function(){p.support.reliableMarginRight||(p.cssHooks.marginRight={get:function(a,b){return p.swap(a,{display:"inline-block"},function(){if(b)return bH(a,"marginRight")})}}),!p.support.pixelPosition&&p.fn.position&&p.each(["top","left"],function(a,b){p.cssHooks[b]={get:function(a,c){if(c){var d=bH(a,b);return bQ.test(d)?p(a).position()[b]+"px":d}}}})}),p.expr&&p.expr.filters&&(p.expr.filters.hidden=function(a){return a.offsetWidth===0&&a.offsetHeight===0||!p.support.reliableHiddenOffsets&&(a.style&&a.style.display||bH(a,"display"))==="none"},p.expr.filters.visible=function(a){return!p.expr.filters.hidden(a)}),p.each({margin:"",padding:"",border:"Width"},function(a,b){p.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bV[d]+b]=e[d]||e[d-2]||e[0];return f}},bO.test(a)||(p.cssHooks[a+b].set=b_)});var cd=/%20/g,ce=/\[\]$/,cf=/\r?\n/g,cg=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,ch=/^(?:select|textarea)/i;p.fn.extend({serialize:function(){return p.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?p.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ch.test(this.nodeName)||cg.test(this.type))}).map(function(a,b){var c=p(this).val();return c==null?null:p.isArray(c)?p.map(c,function(a,c){return{name:b.name,value:a.replace(cf,"\r\n")}}):{name:b.name,value:c.replace(cf,"\r\n")}}).get()}}),p.param=function(a,c){var d,e=[],f=function(a,b){b=p.isFunction(b)?b():b==null?"":b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=p.ajaxSettings&&p.ajaxSettings.traditional);if(p.isArray(a)||a.jquery&&!p.isPlainObject(a))p.each(a,function(){f(this.name,this.value)});else for(d in a)ci(d,a[d],c,f);return e.join("&").replace(cd,"+")};var cj,ck,cl=/#.*$/,cm=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,cn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,co=/^(?:GET|HEAD)$/,cp=/^\/\//,cq=/\?/,cr=/)<[^<]*)*<\/script>/gi,cs=/([?&])_=[^&]*/,ct=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,cu=p.fn.load,cv={},cw={},cx=["*/"]+["*"];try{ck=f.href}catch(cy){ck=e.createElement("a"),ck.href="",ck=ck.href}cj=ct.exec(ck.toLowerCase())||[],p.fn.load=function(a,c,d){if(typeof a!="string"&&cu)return cu.apply(this,arguments);if(!this.length)return this;var e,f,g,h=this,i=a.indexOf(" ");return i>=0&&(e=a.slice(i,a.length),a=a.slice(0,i)),p.isFunction(c)?(d=c,c=b):c&&typeof c=="object"&&(f="POST"),p.ajax({url:a,type:f,dataType:"html",data:c,complete:function(a,b){d&&h.each(d,g||[a.responseText,b,a])}}).done(function(a){g=arguments,h.html(e?p("
").append(a.replace(cr,"")).find(e):a)}),this},p.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){p.fn[b]=function(a){return this.on(b,a)}}),p.each(["get","post"],function(a,c){p[c]=function(a,d,e,f){return p.isFunction(d)&&(f=f||e,e=d,d=b),p.ajax({type:c,url:a,data:d,success:e,dataType:f})}}),p.extend({getScript:function(a,c){return p.get(a,b,c,"script")},getJSON:function(a,b,c){return p.get(a,b,c,"json")},ajaxSetup:function(a,b){return b?cB(a,p.ajaxSettings):(b=a,a=p.ajaxSettings),cB(a,b),a},ajaxSettings:{url:ck,isLocal:cn.test(cj[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":cx},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":p.parseJSON,"text xml":p.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:cz(cv),ajaxTransport:cz(cw),ajax:function(a,c){function y(a,c,f,i){var k,s,t,u,w,y=c;if(v===2)return;v=2,h&&clearTimeout(h),g=b,e=i||"",x.readyState=a>0?4:0,f&&(u=cC(l,x,f));if(a>=200&&a<300||a===304)l.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(p.lastModified[d]=w),w=x.getResponseHeader("Etag"),w&&(p.etag[d]=w)),a===304?(y="notmodified",k=!0):(k=cD(l,u),y=k.state,s=k.data,t=k.error,k=!t);else{t=y;if(!y||a)y="error",a<0&&(a=0)}x.status=a,x.statusText=(c||y)+"",k?o.resolveWith(m,[s,y,x]):o.rejectWith(m,[x,y,t]),x.statusCode(r),r=b,j&&n.trigger("ajax"+(k?"Success":"Error"),[x,l,k?s:t]),q.fireWith(m,[x,y]),j&&(n.trigger("ajaxComplete",[x,l]),--p.active||p.event.trigger("ajaxStop"))}typeof a=="object"&&(c=a,a=b),c=c||{};var d,e,f,g,h,i,j,k,l=p.ajaxSetup({},c),m=l.context||l,n=m!==l&&(m.nodeType||m instanceof p)?p(m):p.event,o=p.Deferred(),q=p.Callbacks("once memory"),r=l.statusCode||{},t={},u={},v=0,w="canceled",x={readyState:0,setRequestHeader:function(a,b){if(!v){var c=a.toLowerCase();a=u[c]=u[c]||a,t[a]=b}return this},getAllResponseHeaders:function(){return v===2?e:null},getResponseHeader:function(a){var c;if(v===2){if(!f){f={};while(c=cm.exec(e))f[c[1].toLowerCase()]=c[2]}c=f[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){return v||(l.mimeType=a),this},abort:function(a){return a=a||w,g&&g.abort(a),y(0,a),this}};o.promise(x),x.success=x.done,x.error=x.fail,x.complete=q.add,x.statusCode=function(a){if(a){var b;if(v<2)for(b in a)r[b]=[r[b],a[b]];else b=a[x.status],x.always(b)}return this},l.url=((a||l.url)+"").replace(cl,"").replace(cp,cj[1]+"//"),l.dataTypes=p.trim(l.dataType||"*").toLowerCase().split(s),l.crossDomain==null&&(i=ct.exec(l.url.toLowerCase())||!1,l.crossDomain=i&&i.join(":")+(i[3]?"":i[1]==="http:"?80:443)!==cj.join(":")+(cj[3]?"":cj[1]==="http:"?80:443)),l.data&&l.processData&&typeof l.data!="string"&&(l.data=p.param(l.data,l.traditional)),cA(cv,l,c,x);if(v===2)return x;j=l.global,l.type=l.type.toUpperCase(),l.hasContent=!co.test(l.type),j&&p.active++===0&&p.event.trigger("ajaxStart");if(!l.hasContent){l.data&&(l.url+=(cq.test(l.url)?"&":"?")+l.data,delete l.data),d=l.url;if(l.cache===!1){var z=p.now(),A=l.url.replace(cs,"$1_="+z);l.url=A+(A===l.url?(cq.test(l.url)?"&":"?")+"_="+z:"")}}(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",l.contentType),l.ifModified&&(d=d||l.url,p.lastModified[d]&&x.setRequestHeader("If-Modified-Since",p.lastModified[d]),p.etag[d]&&x.setRequestHeader("If-None-Match",p.etag[d])),x.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+(l.dataTypes[0]!=="*"?", "+cx+"; q=0.01":""):l.accepts["*"]);for(k in l.headers)x.setRequestHeader(k,l.headers[k]);if(!l.beforeSend||l.beforeSend.call(m,x,l)!==!1&&v!==2){w="abort";for(k in{success:1,error:1,complete:1})x[k](l[k]);g=cA(cw,l,c,x);if(!g)y(-1,"No Transport");else{x.readyState=1,j&&n.trigger("ajaxSend",[x,l]),l.async&&l.timeout>0&&(h=setTimeout(function(){x.abort("timeout")},l.timeout));try{v=1,g.send(t,y)}catch(B){if(v<2)y(-1,B);else throw B}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var cE=[],cF=/\?/,cG=/(=)\?(?=&|$)|\?\?/,cH=p.now();p.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=cE.pop()||p.expando+"_"+cH++;return this[a]=!0,a}}),p.ajaxPrefilter("json jsonp",function(c,d,e){var f,g,h,i=c.data,j=c.url,k=c.jsonp!==!1,l=k&&cG.test(j),m=k&&!l&&typeof i=="string"&&!(c.contentType||"").indexOf("application/x-www-form-urlencoded")&&cG.test(i);if(c.dataTypes[0]==="jsonp"||l||m)return f=c.jsonpCallback=p.isFunction(c.jsonpCallback)?c.jsonpCallback():c.jsonpCallback,g=a[f],l?c.url=j.replace(cG,"$1"+f):m?c.data=i.replace(cG,"$1"+f):k&&(c.url+=(cF.test(j)?"&":"?")+c.jsonp+"="+f),c.converters["script json"]=function(){return h||p.error(f+" was not called"),h[0]},c.dataTypes[0]="json",a[f]=function(){h=arguments},e.always(function(){a[f]=g,c[f]&&(c.jsonpCallback=d.jsonpCallback,cE.push(f)),h&&p.isFunction(g)&&g(h[0]),h=g=b}),"script"}),p.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){return p.globalEval(a),a}}}),p.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),p.ajaxTransport("script",function(a){if(a.crossDomain){var c,d=e.head||e.getElementsByTagName("head")[0]||e.documentElement;return{send:function(f,g){c=e.createElement("script"),c.async="async",a.scriptCharset&&(c.charset=a.scriptCharset),c.src=a.url,c.onload=c.onreadystatechange=function(a,e){if(e||!c.readyState||/loaded|complete/.test(c.readyState))c.onload=c.onreadystatechange=null,d&&c.parentNode&&d.removeChild(c),c=b,e||g(200,"success")},d.insertBefore(c,d.firstChild)},abort:function(){c&&c.onload(0,1)}}}});var cI,cJ=a.ActiveXObject?function(){for(var a in cI)cI[a](0,1)}:!1,cK=0;p.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&cL()||cM()}:cL,function(a){p.extend(p.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(p.ajaxSettings.xhr()),p.support.ajax&&p.ajaxTransport(function(c){if(!c.crossDomain||p.support.cors){var d;return{send:function(e,f){var g,h,i=c.xhr();c.username?i.open(c.type,c.url,c.async,c.username,c.password):i.open(c.type,c.url,c.async);if(c.xhrFields)for(h in c.xhrFields)i[h]=c.xhrFields[h];c.mimeType&&i.overrideMimeType&&i.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(h in e)i.setRequestHeader(h,e[h])}catch(j){}i.send(c.hasContent&&c.data||null),d=function(a,e){var h,j,k,l,m;try{if(d&&(e||i.readyState===4)){d=b,g&&(i.onreadystatechange=p.noop,cJ&&delete cI[g]);if(e)i.readyState!==4&&i.abort();else{h=i.status,k=i.getAllResponseHeaders(),l={},m=i.responseXML,m&&m.documentElement&&(l.xml=m);try{l.text=i.responseText}catch(a){}try{j=i.statusText}catch(n){j=""}!h&&c.isLocal&&!c.crossDomain?h=l.text?200:404:h===1223&&(h=204)}}}catch(o){e||f(-1,o)}l&&f(h,j,l,k)},c.async?i.readyState===4?setTimeout(d,0):(g=++cK,cJ&&(cI||(cI={},p(a).unload(cJ)),cI[g]=d),i.onreadystatechange=d):d()},abort:function(){d&&d(0,1)}}}});var cN,cO,cP=/^(?:toggle|show|hide)$/,cQ=new RegExp("^(?:([-+])=|)("+q+")([a-z%]*)$","i"),cR=/queueHooks$/,cS=[cY],cT={"*":[function(a,b){var c,d,e=this.createTween(a,b),f=cQ.exec(b),g=e.cur(),h=+g||0,i=1,j=20;if(f){c=+f[2],d=f[3]||(p.cssNumber[a]?"":"px");if(d!=="px"&&h){h=p.css(e.elem,a,!0)||c||1;do i=i||".5",h=h/i,p.style(e.elem,a,h+d);while(i!==(i=e.cur()/g)&&i!==1&&--j)}e.unit=d,e.start=h,e.end=f[1]?h+(f[1]+1)*c:c}return e}]};p.Animation=p.extend(cW,{tweener:function(a,b){p.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");var c,d=0,e=a.length;for(;d-1,j={},k={},l,m;i?(k=e.position(),l=k.top,m=k.left):(l=parseFloat(g)||0,m=parseFloat(h)||0),p.isFunction(b)&&(b=b.call(a,c,f)),b.top!=null&&(j.top=b.top-f.top+l),b.left!=null&&(j.left=b.left-f.left+m),"using"in b?b.using.call(a,j):e.css(j)}},p.fn.extend({position:function(){if(!this[0])return;var a=this[0],b=this.offsetParent(),c=this.offset(),d=c_.test(b[0].nodeName)?{top:0,left:0}:b.offset();return c.top-=parseFloat(p.css(a,"marginTop"))||0,c.left-=parseFloat(p.css(a,"marginLeft"))||0,d.top+=parseFloat(p.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(p.css(b[0],"borderLeftWidth"))||0,{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||e.body;while(a&&!c_.test(a.nodeName)&&p.css(a,"position")==="static")a=a.offsetParent;return a||e.body})}}),p.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);p.fn[a]=function(e){return p.access(this,function(a,e,f){var g=da(a);if(f===b)return g?c in g?g[c]:g.document.documentElement[e]:a[e];g?g.scrollTo(d?p(g).scrollLeft():f,d?f:p(g).scrollTop()):a[e]=f},a,e,arguments.length,null)}}),p.each({Height:"height",Width:"width"},function(a,c){p.each({padding:"inner"+a,content:c,"":"outer"+a},function(d,e){p.fn[e]=function(e,f){var g=arguments.length&&(d||typeof e!="boolean"),h=d||(e===!0||f===!0?"margin":"border");return p.access(this,function(c,d,e){var f;return p.isWindow(c)?c.document.documentElement["client"+a]:c.nodeType===9?(f=c.documentElement,Math.max(c.body["scroll"+a],f["scroll"+a],c.body["offset"+a],f["offset"+a],f["client"+a])):e===b?p.css(c,d,e,h):p.style(c,d,e,h)},c,g?e:b,g,null)}})}),a.jQuery=a.$=p,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return p})})(window); \ No newline at end of file diff --git a/templates/player/p2phls/loading_pc.jpg b/templates/player/p2phls/loading_pc.jpg new file mode 100644 index 0000000..88cd8e7 Binary files /dev/null and b/templates/player/p2phls/loading_pc.jpg differ diff --git a/templates/player/p2phls/p2phls.html b/templates/player/p2phls/p2phls.html new file mode 100644 index 0000000..0f668f6 --- /dev/null +++ b/templates/player/p2phls/p2phls.html @@ -0,0 +1,174 @@ + + +
+
+
+

+
+
+ + + + diff --git a/templates/player/p2pplayer/DPlayer.min.css b/templates/player/p2pplayer/DPlayer.min.css new file mode 100644 index 0000000..1de3108 --- /dev/null +++ b/templates/player/p2pplayer/DPlayer.min.css @@ -0,0 +1,22 @@ +button[data-balloon]{overflow:visible}[data-balloon]{position:relative;cursor:pointer}[data-balloon]:after{font-family:sans-serif!important;font-weight:400!important;font-style:normal!important;text-shadow:none!important;font-size:12px!important;background:hsla(0,0%,7%,.9);border-radius:4px;color:#fff;content:attr(data-balloon);padding:.5em 1em;white-space:nowrap}[data-balloon]:after,[data-balloon]:before{filter:alpha(opactiy=0);-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";-moz-opacity:0;-khtml-opacity:0;opacity:0;pointer-events:none;transition:all .18s ease-out .18s;position:absolute;z-index:10}[data-balloon]:before{background:no-repeat url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='12'%3E%3Cpath fill='rgba(17, 17, 17, 0.9)' d='M2.658 0h32.004c-6 0-11.627 12.002-16.002 12.002C14.285 12.002 8.594 0 2.658 0z'/%3E%3C/svg%3E");background-size:100% auto;width:18px;height:6px;content:""}[data-balloon]:hover:after,[data-balloon]:hover:before,[data-balloon][data-balloon-visible]:after,[data-balloon][data-balloon-visible]:before{filter:alpha(opactiy=100);-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";-moz-opacity:1;-khtml-opacity:1;opacity:1;pointer-events:auto}[data-balloon].font-awesome:after{font-family:FontAwesome}[data-balloon][data-balloon-break]:after{white-space:pre}[data-balloon][data-balloon-blunt]:after,[data-balloon][data-balloon-blunt]:before{transition:none}[data-balloon][data-balloon-pos=up]:after{margin-bottom:11px}[data-balloon][data-balloon-pos=up]:after,[data-balloon][data-balloon-pos=up]:before{bottom:100%;left:50%;-webkit-transform:translate(-50%,10px);transform:translate(-50%,10px);-webkit-transform-origin:top;transform-origin:top}[data-balloon][data-balloon-pos=up]:before{margin-bottom:5px}[data-balloon][data-balloon-pos=up]:hover:after,[data-balloon][data-balloon-pos=up]:hover:before,[data-balloon][data-balloon-pos=up][data-balloon-visible]:after,[data-balloon][data-balloon-pos=up][data-balloon-visible]:before{-webkit-transform:translate(-50%);transform:translate(-50%)}[data-balloon][data-balloon-pos=up-left]:after{left:0;margin-bottom:11px}[data-balloon][data-balloon-pos=up-left]:after,[data-balloon][data-balloon-pos=up-left]:before{bottom:100%;-webkit-transform:translateY(10px);transform:translateY(10px);-webkit-transform-origin:top;transform-origin:top}[data-balloon][data-balloon-pos=up-left]:before{left:5px;margin-bottom:5px}[data-balloon][data-balloon-pos=up-left]:hover:after,[data-balloon][data-balloon-pos=up-left]:hover:before,[data-balloon][data-balloon-pos=up-left][data-balloon-visible]:after,[data-balloon][data-balloon-pos=up-left][data-balloon-visible]:before{-webkit-transform:translate(0);transform:translate(0)}[data-balloon][data-balloon-pos=up-right]:after{right:0;margin-bottom:11px}[data-balloon][data-balloon-pos=up-right]:after,[data-balloon][data-balloon-pos=up-right]:before{bottom:100%;-webkit-transform:translateY(10px);transform:translateY(10px);-webkit-transform-origin:top;transform-origin:top}[data-balloon][data-balloon-pos=up-right]:before{right:5px;margin-bottom:5px}[data-balloon][data-balloon-pos=up-right]:hover:after,[data-balloon][data-balloon-pos=up-right]:hover:before,[data-balloon][data-balloon-pos=up-right][data-balloon-visible]:after,[data-balloon][data-balloon-pos=up-right][data-balloon-visible]:before{-webkit-transform:translate(0);transform:translate(0)}[data-balloon][data-balloon-pos=down]:after{margin-top:11px}[data-balloon][data-balloon-pos=down]:after,[data-balloon][data-balloon-pos=down]:before{left:50%;top:100%;-webkit-transform:translate(-50%,-10px);transform:translate(-50%,-10px)}[data-balloon][data-balloon-pos=down]:before{background:no-repeat url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='12'%3E%3Cpath fill='rgba(17, 17, 17, 0.9)' d='M33.342 12H1.338c6 0 11.627-12.002 16.002-12.002C21.715-.002 27.406 12 33.342 12z'/%3E%3C/svg%3E");background-size:100% auto;width:18px;height:6px;margin-top:5px}[data-balloon][data-balloon-pos=down]:hover:after,[data-balloon][data-balloon-pos=down]:hover:before,[data-balloon][data-balloon-pos=down][data-balloon-visible]:after,[data-balloon][data-balloon-pos=down][data-balloon-visible]:before{-webkit-transform:translate(-50%);transform:translate(-50%)}[data-balloon][data-balloon-pos=down-left]:after{left:0;margin-top:11px;top:100%;-webkit-transform:translateY(-10px);transform:translateY(-10px)}[data-balloon][data-balloon-pos=down-left]:before{background:no-repeat url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='12'%3E%3Cpath fill='rgba(17, 17, 17, 0.9)' d='M33.342 12H1.338c6 0 11.627-12.002 16.002-12.002C21.715-.002 27.406 12 33.342 12z'/%3E%3C/svg%3E");background-size:100% auto;width:18px;height:6px;left:5px;margin-top:5px;top:100%;-webkit-transform:translateY(-10px);transform:translateY(-10px)}[data-balloon][data-balloon-pos=down-left]:hover:after,[data-balloon][data-balloon-pos=down-left]:hover:before,[data-balloon][data-balloon-pos=down-left][data-balloon-visible]:after,[data-balloon][data-balloon-pos=down-left][data-balloon-visible]:before{-webkit-transform:translate(0);transform:translate(0)}[data-balloon][data-balloon-pos=down-right]:after{right:0;margin-top:11px;top:100%;-webkit-transform:translateY(-10px);transform:translateY(-10px)}[data-balloon][data-balloon-pos=down-right]:before{background:no-repeat url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='12'%3E%3Cpath fill='rgba(17, 17, 17, 0.9)' d='M33.342 12H1.338c6 0 11.627-12.002 16.002-12.002C21.715-.002 27.406 12 33.342 12z'/%3E%3C/svg%3E");background-size:100% auto;width:18px;height:6px;right:5px;margin-top:5px;top:100%;-webkit-transform:translateY(-10px);transform:translateY(-10px)}[data-balloon][data-balloon-pos=down-right]:hover:after,[data-balloon][data-balloon-pos=down-right]:hover:before,[data-balloon][data-balloon-pos=down-right][data-balloon-visible]:after,[data-balloon][data-balloon-pos=down-right][data-balloon-visible]:before{-webkit-transform:translate(0);transform:translate(0)}[data-balloon][data-balloon-pos=left]:after{margin-right:11px;right:100%;top:50%;-webkit-transform:translate(10px,-50%);transform:translate(10px,-50%)}[data-balloon][data-balloon-pos=left]:before{background:no-repeat url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='36'%3E%3Cpath fill='rgba(17, 17, 17, 0.9)' d='M0 33.342V1.338c0 6 12.002 11.627 12.002 16.002C12.002 21.715 0 27.406 0 33.342z'/%3E%3C/svg%3E");background-size:100% auto;width:6px;height:18px;margin-right:5px;right:100%;top:50%;-webkit-transform:translate(10px,-50%);transform:translate(10px,-50%)}[data-balloon][data-balloon-pos=left]:hover:after,[data-balloon][data-balloon-pos=left]:hover:before,[data-balloon][data-balloon-pos=left][data-balloon-visible]:after,[data-balloon][data-balloon-pos=left][data-balloon-visible]:before{-webkit-transform:translateY(-50%);transform:translateY(-50%)}[data-balloon][data-balloon-pos=right]:after{left:100%;margin-left:11px;top:50%;-webkit-transform:translate(-10px,-50%);transform:translate(-10px,-50%)}[data-balloon][data-balloon-pos=right]:before{background:no-repeat url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='36'%3E%3Cpath fill='rgba(17, 17, 17, 0.9)' d='M12 2.658v32.004c0-6-12.002-11.627-12.002-16.002C-.002 14.285 12 8.594 12 2.658z'/%3E%3C/svg%3E");background-size:100% auto;width:6px;height:18px;left:100%;margin-left:5px;top:50%;-webkit-transform:translate(-10px,-50%);transform:translate(-10px,-50%)}[data-balloon][data-balloon-pos=right]:hover:after,[data-balloon][data-balloon-pos=right]:hover:before,[data-balloon][data-balloon-pos=right][data-balloon-visible]:after,[data-balloon][data-balloon-pos=right][data-balloon-visible]:before{-webkit-transform:translateY(-50%);transform:translateY(-50%)}[data-balloon][data-balloon-length=small]:after{white-space:normal;width:80px}[data-balloon][data-balloon-length=medium]:after{white-space:normal;width:150px}[data-balloon][data-balloon-length=large]:after{white-space:normal;width:260px}[data-balloon][data-balloon-length=xlarge]:after{white-space:normal;width:380px}@media screen and (max-width:768px){[data-balloon][data-balloon-length=xlarge]:after{white-space:normal;width:90vw}}[data-balloon][data-balloon-length=fit]:after{white-space:normal;width:100%} +@-webkit-keyframes my-face{2%{-webkit-transform:translateY(1.5px) rotate(1.5deg);transform:translateY(1.5px) rotate(1.5deg)}4%{-webkit-transform:translateY(-1.5px) rotate(-.5deg);transform:translateY(-1.5px) rotate(-.5deg)}6%{-webkit-transform:translateY(1.5px) rotate(-1.5deg);transform:translateY(1.5px) rotate(-1.5deg)}8%{-webkit-transform:translateY(-1.5px) rotate(-1.5deg);transform:translateY(-1.5px) rotate(-1.5deg)}10%{-webkit-transform:translateY(2.5px) rotate(1.5deg);transform:translateY(2.5px) rotate(1.5deg)}12%{-webkit-transform:translateY(-.5px) rotate(1.5deg);transform:translateY(-.5px) rotate(1.5deg)}14%{-webkit-transform:translateY(-1.5px) rotate(1.5deg);transform:translateY(-1.5px) rotate(1.5deg)}16%{-webkit-transform:translateY(-.5px) rotate(-1.5deg);transform:translateY(-.5px) rotate(-1.5deg)}18%{-webkit-transform:translateY(.5px) rotate(-1.5deg);transform:translateY(.5px) rotate(-1.5deg)}20%{-webkit-transform:translateY(-1.5px) rotate(2.5deg);transform:translateY(-1.5px) rotate(2.5deg)}22%{-webkit-transform:translateY(.5px) rotate(-1.5deg);transform:translateY(.5px) rotate(-1.5deg)}24%{-webkit-transform:translateY(1.5px) rotate(1.5deg);transform:translateY(1.5px) rotate(1.5deg)}26%{-webkit-transform:translateY(.5px) rotate(.5deg);transform:translateY(.5px) rotate(.5deg)}28%{-webkit-transform:translateY(.5px) rotate(1.5deg);transform:translateY(.5px) rotate(1.5deg)}30%{-webkit-transform:translateY(-.5px) rotate(2.5deg);transform:translateY(-.5px) rotate(2.5deg)}32%{-webkit-transform:translateY(1.5px) rotate(-.5deg);transform:translateY(1.5px) rotate(-.5deg)}34%{-webkit-transform:translateY(1.5px) rotate(-.5deg);transform:translateY(1.5px) rotate(-.5deg)}36%{-webkit-transform:translateY(-1.5px) rotate(2.5deg);transform:translateY(-1.5px) rotate(2.5deg)}38%{-webkit-transform:translateY(1.5px) rotate(-1.5deg);transform:translateY(1.5px) rotate(-1.5deg)}40%{-webkit-transform:translateY(-.5px) rotate(2.5deg);transform:translateY(-.5px) rotate(2.5deg)}42%{-webkit-transform:translateY(2.5px) rotate(-1.5deg);transform:translateY(2.5px) rotate(-1.5deg)}44%{-webkit-transform:translateY(1.5px) rotate(.5deg);transform:translateY(1.5px) rotate(.5deg)}46%{-webkit-transform:translateY(-1.5px) rotate(2.5deg);transform:translateY(-1.5px) rotate(2.5deg)}48%{-webkit-transform:translateY(-.5px) rotate(.5deg);transform:translateY(-.5px) rotate(.5deg)}50%{-webkit-transform:translateY(.5px) rotate(.5deg);transform:translateY(.5px) rotate(.5deg)}52%{-webkit-transform:translateY(2.5px) rotate(2.5deg);transform:translateY(2.5px) rotate(2.5deg)}54%{-webkit-transform:translateY(-1.5px) rotate(1.5deg);transform:translateY(-1.5px) rotate(1.5deg)}56%{-webkit-transform:translateY(2.5px) rotate(2.5deg);transform:translateY(2.5px) rotate(2.5deg)}58%{-webkit-transform:translateY(.5px) rotate(2.5deg);transform:translateY(.5px) rotate(2.5deg)}60%{-webkit-transform:translateY(2.5px) rotate(2.5deg);transform:translateY(2.5px) rotate(2.5deg)}62%{-webkit-transform:translateY(-.5px) rotate(2.5deg);transform:translateY(-.5px) rotate(2.5deg)}64%{-webkit-transform:translateY(-.5px) rotate(1.5deg);transform:translateY(-.5px) rotate(1.5deg)}66%{-webkit-transform:translateY(1.5px) rotate(-.5deg);transform:translateY(1.5px) rotate(-.5deg)}68%{-webkit-transform:translateY(-1.5px) rotate(-.5deg);transform:translateY(-1.5px) rotate(-.5deg)}70%{-webkit-transform:translateY(1.5px) rotate(.5deg);transform:translateY(1.5px) rotate(.5deg)}72%{-webkit-transform:translateY(2.5px) rotate(1.5deg);transform:translateY(2.5px) rotate(1.5deg)}74%{-webkit-transform:translateY(-.5px) rotate(.5deg);transform:translateY(-.5px) rotate(.5deg)}76%{-webkit-transform:translateY(-.5px) rotate(2.5deg);transform:translateY(-.5px) rotate(2.5deg)}78%{-webkit-transform:translateY(-.5px) rotate(1.5deg);transform:translateY(-.5px) rotate(1.5deg)}80%{-webkit-transform:translateY(1.5px) rotate(1.5deg);transform:translateY(1.5px) rotate(1.5deg)}82%{-webkit-transform:translateY(-.5px) rotate(.5deg);transform:translateY(-.5px) rotate(.5deg)}84%{-webkit-transform:translateY(1.5px) rotate(2.5deg);transform:translateY(1.5px) rotate(2.5deg)}86%{-webkit-transform:translateY(-1.5px) rotate(-1.5deg);transform:translateY(-1.5px) rotate(-1.5deg)}88%{-webkit-transform:translateY(-.5px) rotate(2.5deg);transform:translateY(-.5px) rotate(2.5deg)}90%{-webkit-transform:translateY(2.5px) rotate(-.5deg);transform:translateY(2.5px) rotate(-.5deg)}92%{-webkit-transform:translateY(.5px) rotate(-.5deg);transform:translateY(.5px) rotate(-.5deg)}94%{-webkit-transform:translateY(2.5px) rotate(.5deg);transform:translateY(2.5px) rotate(.5deg)}96%{-webkit-transform:translateY(-.5px) rotate(1.5deg);transform:translateY(-.5px) rotate(1.5deg)}98%{-webkit-transform:translateY(-1.5px) rotate(-.5deg);transform:translateY(-1.5px) rotate(-.5deg)}0%,to{-webkit-transform:translate(0) rotate(0deg);transform:translate(0) rotate(0deg)}}@keyframes my-face{2%{-webkit-transform:translateY(1.5px) rotate(1.5deg);transform:translateY(1.5px) rotate(1.5deg)}4%{-webkit-transform:translateY(-1.5px) rotate(-.5deg);transform:translateY(-1.5px) rotate(-.5deg)}6%{-webkit-transform:translateY(1.5px) rotate(-1.5deg);transform:translateY(1.5px) rotate(-1.5deg)}8%{-webkit-transform:translateY(-1.5px) rotate(-1.5deg);transform:translateY(-1.5px) rotate(-1.5deg)}10%{-webkit-transform:translateY(2.5px) rotate(1.5deg);transform:translateY(2.5px) rotate(1.5deg)}12%{-webkit-transform:translateY(-.5px) rotate(1.5deg);transform:translateY(-.5px) rotate(1.5deg)}14%{-webkit-transform:translateY(-1.5px) rotate(1.5deg);transform:translateY(-1.5px) rotate(1.5deg)}16%{-webkit-transform:translateY(-.5px) rotate(-1.5deg);transform:translateY(-.5px) rotate(-1.5deg)}18%{-webkit-transform:translateY(.5px) rotate(-1.5deg);transform:translateY(.5px) rotate(-1.5deg)}20%{-webkit-transform:translateY(-1.5px) rotate(2.5deg);transform:translateY(-1.5px) rotate(2.5deg)}22%{-webkit-transform:translateY(.5px) rotate(-1.5deg);transform:translateY(.5px) rotate(-1.5deg)}24%{-webkit-transform:translateY(1.5px) rotate(1.5deg);transform:translateY(1.5px) rotate(1.5deg)}26%{-webkit-transform:translateY(.5px) rotate(.5deg);transform:translateY(.5px) rotate(.5deg)}28%{-webkit-transform:translateY(.5px) rotate(1.5deg);transform:translateY(.5px) rotate(1.5deg)}30%{-webkit-transform:translateY(-.5px) rotate(2.5deg);transform:translateY(-.5px) rotate(2.5deg)}32%{-webkit-transform:translateY(1.5px) rotate(-.5deg);transform:translateY(1.5px) rotate(-.5deg)}34%{-webkit-transform:translateY(1.5px) rotate(-.5deg);transform:translateY(1.5px) rotate(-.5deg)}36%{-webkit-transform:translateY(-1.5px) rotate(2.5deg);transform:translateY(-1.5px) rotate(2.5deg)}38%{-webkit-transform:translateY(1.5px) rotate(-1.5deg);transform:translateY(1.5px) rotate(-1.5deg)}40%{-webkit-transform:translateY(-.5px) rotate(2.5deg);transform:translateY(-.5px) rotate(2.5deg)}42%{-webkit-transform:translateY(2.5px) rotate(-1.5deg);transform:translateY(2.5px) rotate(-1.5deg)}44%{-webkit-transform:translateY(1.5px) rotate(.5deg);transform:translateY(1.5px) rotate(.5deg)}46%{-webkit-transform:translateY(-1.5px) rotate(2.5deg);transform:translateY(-1.5px) rotate(2.5deg)}48%{-webkit-transform:translateY(-.5px) rotate(.5deg);transform:translateY(-.5px) rotate(.5deg)}50%{-webkit-transform:translateY(.5px) rotate(.5deg);transform:translateY(.5px) rotate(.5deg)}52%{-webkit-transform:translateY(2.5px) rotate(2.5deg);transform:translateY(2.5px) rotate(2.5deg)}54%{-webkit-transform:translateY(-1.5px) rotate(1.5deg);transform:translateY(-1.5px) rotate(1.5deg)}56%{-webkit-transform:translateY(2.5px) rotate(2.5deg);transform:translateY(2.5px) rotate(2.5deg)}58%{-webkit-transform:translateY(.5px) rotate(2.5deg);transform:translateY(.5px) rotate(2.5deg)}60%{-webkit-transform:translateY(2.5px) rotate(2.5deg);transform:translateY(2.5px) rotate(2.5deg)}62%{-webkit-transform:translateY(-.5px) rotate(2.5deg);transform:translateY(-.5px) rotate(2.5deg)}64%{-webkit-transform:translateY(-.5px) rotate(1.5deg);transform:translateY(-.5px) rotate(1.5deg)}66%{-webkit-transform:translateY(1.5px) rotate(-.5deg);transform:translateY(1.5px) rotate(-.5deg)}68%{-webkit-transform:translateY(-1.5px) rotate(-.5deg);transform:translateY(-1.5px) rotate(-.5deg)}70%{-webkit-transform:translateY(1.5px) rotate(.5deg);transform:translateY(1.5px) rotate(.5deg)}72%{-webkit-transform:translateY(2.5px) rotate(1.5deg);transform:translateY(2.5px) rotate(1.5deg)}74%{-webkit-transform:translateY(-.5px) rotate(.5deg);transform:translateY(-.5px) rotate(.5deg)}76%{-webkit-transform:translateY(-.5px) rotate(2.5deg);transform:translateY(-.5px) rotate(2.5deg)}78%{-webkit-transform:translateY(-.5px) rotate(1.5deg);transform:translateY(-.5px) rotate(1.5deg)}80%{-webkit-transform:translateY(1.5px) rotate(1.5deg);transform:translateY(1.5px) rotate(1.5deg)}82%{-webkit-transform:translateY(-.5px) rotate(.5deg);transform:translateY(-.5px) rotate(.5deg)}84%{-webkit-transform:translateY(1.5px) rotate(2.5deg);transform:translateY(1.5px) rotate(2.5deg)}86%{-webkit-transform:translateY(-1.5px) rotate(-1.5deg);transform:translateY(-1.5px) rotate(-1.5deg)}88%{-webkit-transform:translateY(-.5px) rotate(2.5deg);transform:translateY(-.5px) rotate(2.5deg)}90%{-webkit-transform:translateY(2.5px) rotate(-.5deg);transform:translateY(2.5px) rotate(-.5deg)}92%{-webkit-transform:translateY(.5px) rotate(-.5deg);transform:translateY(.5px) rotate(-.5deg)}94%{-webkit-transform:translateY(2.5px) rotate(.5deg);transform:translateY(2.5px) rotate(.5deg)}96%{-webkit-transform:translateY(-.5px) rotate(1.5deg);transform:translateY(-.5px) rotate(1.5deg)}98%{-webkit-transform:translateY(-1.5px) rotate(-.5deg);transform:translateY(-1.5px) rotate(-.5deg)}0%,to{-webkit-transform:translate(0) rotate(0deg);transform:translate(0) rotate(0deg)}}.dplayer{position:relative;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;line-height:1}.dplayer *{box-sizing:content-box}.dplayer svg{width:100%;height:100%}.dplayer svg circle,.dplayer svg path{fill:#fff}.dplayer:-webkit-full-screen{width:100%;height:100%;background:#000;position:fixed;z-index:100000;left:0;top:0;margin:0;padding:0;-webkit-transform:translate(0);transform:translate(0)}.dplayer:-webkit-full-screen .dplayer-danmaku .dplayer-danmaku-bottom.dplayer-danmaku-move,.dplayer:-webkit-full-screen .dplayer-danmaku .dplayer-danmaku-top.dplayer-danmaku-move{-webkit-animation:danmaku-center 6s linear;animation:danmaku-center 6s linear;-webkit-animation-play-state:inherit;animation-play-state:inherit}.dplayer:-webkit-full-screen .dplayer-danmaku .dplayer-danmaku-right.dplayer-danmaku-move{-webkit-animation:danmaku 8s linear;animation:danmaku 8s linear;-webkit-animation-play-state:inherit;animation-play-state:inherit}.dplayer.dplayer-live .dplayer-bar-wrap,.dplayer.dplayer-live.dplayer-no-danmaku .dplayer-setting,.dplayer.dplayer-live .dplayer-setting-loop,.dplayer.dplayer-live .dplayer-setting-speed,.dplayer.dplayer-live .dplayer-time,.dplayer.dplayer-no-danmaku .dplayer-controller .dplayer-icons .dplayer-comment,.dplayer.dplayer-no-danmaku .dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box .dplayer-setting-danmaku,.dplayer.dplayer-no-danmaku .dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box .dplayer-setting-danunlimit,.dplayer.dplayer-no-danmaku .dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box .dplayer-setting-showdan,.dplayer.dplayer-no-danmaku .dplayer-danmaku{display:none}.dplayer.dplayer-arrow .dplayer-danmaku{font-size:18px}.dplayer.dplayer-arrow .dplayer-icon{margin:0 -3px}.dplayer.dplayer-playing .dplayer-danmaku .dplayer-danmaku-move{-webkit-animation-play-state:running;animation-play-state:running}@media (min-width:900px){.dplayer.dplayer-playing .dplayer-controller,.dplayer.dplayer-playing .dplayer-controller-mask{opacity:0}.dplayer.dplayer-playing:hover .dplayer-controller,.dplayer.dplayer-playing:hover .dplayer-controller-mask{opacity:1}}.dplayer.dplayer-loading .dplayer-bezel .diplayer-loading-icon{display:block}.dplayer.dplayer-loading .dplayer-danmaku,.dplayer.dplayer-loading .dplayer-danmaku-move,.dplayer.dplayer-paused .dplayer-danmaku,.dplayer.dplayer-paused .dplayer-danmaku-move{-webkit-animation-play-state:paused;animation-play-state:paused}.dplayer.dplayer-hide-controller{cursor:none}.dplayer.dplayer-hide-controller .dplayer-controller,.dplayer.dplayer-hide-controller .dplayer-controller-mask{opacity:0;-webkit-transform:translateY(100%);transform:translateY(100%)}.dplayer.dplayer-show-controller .dplayer-controller,.dplayer.dplayer-show-controller .dplayer-controller-mask{opacity:1}.dplayer.dplayer-fulled{position:fixed;z-index:100000;left:0;top:0;width:100%;height:100%}.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-camera-icon,.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-volume{display:none}.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-full .dplayer-full-in-icon{position:static;display:inline-block}.dplayer.dplayer-mobile .dplayer-bar-time{display:none}.dplayer-web-fullscreen-fix{position:fixed;top:0;left:0;margin:0;padding:0}[data-balloon]:before{display:none}[data-balloon]:after{padding:.3em .7em;background:hsla(0,0%,7%,.7)}[data-balloon][data-balloon-pos=up]:after{margin-bottom:0}.dplayer-bezel{position:absolute;left:0;right:0;top:0;bottom:0;font-size:22px;color:#fff;pointer-events:none}.dplayer-bezel .dplayer-bezel-icon{position:absolute;top:50%;left:50%;margin:-26px 0 0 -26px;height:52px;width:52px;padding:12px;box-sizing:border-box;background:rgba(0,0,0,.5);border-radius:50%;opacity:0;pointer-events:none}.dplayer-bezel .dplayer-bezel-icon.dplayer-bezel-transition{-webkit-animation:bezel-hide .5s linear;animation:bezel-hide .5s linear}@-webkit-keyframes bezel-hide{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}to{opacity:0;-webkit-transform:scale(2);transform:scale(2)}}@keyframes bezel-hide{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}to{opacity:0;-webkit-transform:scale(2);transform:scale(2)}}.dplayer-bezel .dplayer-danloading{position:absolute;top:50%;margin-top:-7px;width:100%;text-align:center;font-size:14px;line-height:14px;-webkit-animation:my-face 5s infinite ease-in-out;animation:my-face 5s infinite ease-in-out}.dplayer-bezel .diplayer-loading-icon{display:none;position:absolute;top:50%;left:50%;margin:-18px 0 0 -18px;height:36px;width:36px;pointer-events:none}.dplayer-bezel .diplayer-loading-icon .diplayer-loading-hide{display:none}.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot{-webkit-animation:diplayer-loading-dot-fade .8s ease infinite;animation:diplayer-loading-dot-fade .8s ease infinite;opacity:0;-webkit-transform-origin:4px 4px;transform-origin:4px 4px}.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-7{-webkit-animation-delay:.7s;animation-delay:.7s}.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-6{-webkit-animation-delay:.6s;animation-delay:.6s}.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-5{-webkit-animation-delay:.5s;animation-delay:.5s}.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-4{-webkit-animation-delay:.4s;animation-delay:.4s}.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-3{-webkit-animation-delay:.3s;animation-delay:.3s}.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-2{-webkit-animation-delay:.2s;animation-delay:.2s}.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-1{-webkit-animation-delay:.1s;animation-delay:.1s}@-webkit-keyframes diplayer-loading-dot-fade{0%{opacity:.7;-webkit-transform:scale(1.2);transform:scale(1.2)}50%{opacity:.25;-webkit-transform:scale(.9);transform:scale(.9)}to{opacity:.25;-webkit-transform:scale(.85);transform:scale(.85)}}@keyframes diplayer-loading-dot-fade{0%{opacity:.7;-webkit-transform:scale(1.2);transform:scale(1.2)}50%{opacity:.25;-webkit-transform:scale(.9);transform:scale(.9)}to{opacity:.25;-webkit-transform:scale(.85); + + transform:scale(.85)}}.dplayer-controller-mask{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==) repeat-x bottom; + + + + + + height:98px;width:100%}.dplayer-controller,.dplayer-controller-mask{position:absolute;bottom:0;transition:all .3s ease}.dplayer-controller{left:0;right:0;height:41px;padding:0 20px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.dplayer-controller.dplayer-controller-comment .dplayer-icons{display:none}.dplayer-controller.dplayer-controller-comment .dplayer-icons.dplayer-comment-box{display:block}.dplayer-controller .dplayer-bar-wrap{padding:5px 0;cursor:pointer;position:absolute;bottom:33px;width:calc(100% - 40px);height:3px}.dplayer-controller .dplayer-bar-wrap:hover .dplayer-bar .dplayer-played .dplayer-thumb{-webkit-transform:scale(1);transform:scale(1)}.dplayer-controller .dplayer-bar-wrap:hover .dplayer-highlight{display:block;width:8px;-webkit-transform:translateX(-4px);transform:translateX(-4px);top:4px;height:40%}.dplayer-controller .dplayer-bar-wrap .dplayer-highlight{z-index:12;position:absolute;top:5px;width:6px;height:20%;border-radius:6px;background-color:#fff;text-align:center;-webkit-transform:translateX(-3px);transform:translateX(-3px);transition:all .2s ease-in-out}.dplayer-controller .dplayer-bar-wrap .dplayer-highlight:hover .dplayer-highlight-text{display:block}.dplayer-controller .dplayer-bar-wrap .dplayer-highlight:hover~.dplayer-bar-preview,.dplayer-controller .dplayer-bar-wrap .dplayer-highlight:hover~.dplayer-bar-time{opacity:0}.dplayer-controller .dplayer-bar-wrap .dplayer-highlight .dplayer-highlight-text{display:none;position:absolute;left:50%;top:-24px;padding:5px 8px;background-color:rgba(0,0,0,.62);color:#fff;border-radius:4px;font-size:12px;white-space:nowrap;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.dplayer-controller .dplayer-bar-wrap .dplayer-bar-preview{position:absolute;background:#fff;pointer-events:none;display:none;background-size:16000px 100%}.dplayer-controller .dplayer-bar-wrap .dplayer-bar-preview-canvas{position:absolute;width:100%;height:100%;z-index:1;pointer-events:none}.dplayer-controller .dplayer-bar-wrap .dplayer-bar-time{position:absolute;left:0;top:-20px;border-radius:4px;padding:5px 7px;background-color:rgba(0,0,0,.62);color:#fff;font-size:12px;text-align:center;opacity:1;transition:opacity .1s ease-in-out;word-wrap:normal;word-break:normal;z-index:2;pointer-events:none}.dplayer-controller .dplayer-bar-wrap .dplayer-bar-time.hidden{opacity:0}.dplayer-controller .dplayer-bar-wrap .dplayer-bar{position:relative;height:3px;width:100%;background:hsla(0,0%,100%,.2);cursor:pointer}.dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-loaded{background:hsla(0,0%,100%,.4);transition:all .5s ease}.dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-loaded,.dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-played{position:absolute;left:0;top:0;bottom:0;height:3px;will-change:width}.dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-played .dplayer-thumb{position:absolute;top:0;right:5px;margin-top:-4px;margin-right:-10px;height:11px;width:11px;border-radius:50%;cursor:pointer;transition:all .3s ease-in-out;-webkit-transform:scale(0);transform:scale(0)}.dplayer-controller .dplayer-icons{height:38px;position:absolute;bottom:0}.dplayer-controller .dplayer-icons.dplayer-comment-box{display:none;position:absolute;transition:all .3s ease-in-out;z-index:2;height:38px;bottom:0;left:20px;right:20px;color:#fff}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-icon{padding:7px}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-icon{position:absolute;left:0;top:0}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-send-icon{position:absolute;right:0;top:0}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box{position:absolute;background:rgba(28,28,28,.9);bottom:41px;left:0;box-shadow:0 0 25px rgba(0,0,0,.3);border-radius:4px;padding:10px 10px 16px;font-size:14px;width:204px;transition:all .3s ease-in-out;-webkit-transform:scale(0);transform:scale(0)}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box.dplayer-comment-setting-open{-webkit-transform:scale(1);transform:scale(1)}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box input[type=radio]{display:none}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box label{cursor:pointer}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-title{font-size:13px;color:#fff;line-height:30px}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type{font-size:0}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type .dplayer-comment-setting-title{margin-bottom:6px}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type label:nth-child(2) span{border-radius:4px 0 0 4px}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type label:nth-child(4) span{border-radius:0 4px 4px 0}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type span{width:33%;padding:4px 6px;line-height:16px;display:inline-block;font-size:12px;color:#fff;border:1px solid #fff;margin-right:-1px;box-sizing:border-box;text-align:center;cursor:pointer}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type input:checked+span{background:#e4e4e6;color:#1c1c1c}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-color{font-size:0}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-color label{font-size:0;padding:6px;display:inline-block}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-color span{width:22px;height:22px;display:inline-block;border-radius:50%;box-sizing:border-box;cursor:pointer}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-color span:hover{-webkit-animation:my-face 5s infinite ease-in-out;animation:my-face 5s infinite ease-in-out}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input{outline:none;border:none;padding:8px 31px;font-size:14px;line-height:18px;text-align:center;border-radius:4px;background:none;margin:0;height:100%;box-sizing:border-box;width:100%;color:#fff}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input::-webkit-input-placeholder{color:#fff;opacity:.8}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input:-ms-input-placeholder,.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input::-ms-input-placeholder{color:#fff;opacity:.8}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input::placeholder{color:#fff;opacity:.8}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input::-ms-clear{display:none}.dplayer-controller .dplayer-icons.dplayer-icons-left .dplayer-icon{padding:7px}.dplayer-controller .dplayer-icons.dplayer-icons-right{right:20px}.dplayer-controller .dplayer-icons.dplayer-icons-right .dplayer-icon{padding:8px}.dplayer-controller .dplayer-icons .dplayer-live-badge,.dplayer-controller .dplayer-icons .dplayer-time{line-height:38px;color:#eee;text-shadow:0 0 2px rgba(0,0,0,.5);vertical-align:middle;font-size:13px;cursor:default}.dplayer-controller .dplayer-icons .dplayer-live-dot{display:inline-block;width:6px;height:6px;vertical-align:4%;margin-right:5px;content:"";border-radius:6px}.dplayer-controller .dplayer-icons .dplayer-icon{width:40px;height:100%;border:none;background-color:transparent;outline:none;cursor:pointer;vertical-align:middle;box-sizing:border-box;display:inline-block}.dplayer-controller .dplayer-icons .dplayer-icon .dplayer-icon-content{transition:all .2s ease-in-out;opacity:.8}.dplayer-controller .dplayer-icons .dplayer-icon:hover .dplayer-icon-content{opacity:1}.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-quality-icon{color:#fff;width:auto;line-height:22px;font-size:14px}.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-comment-icon{padding:10px 9px 9px}.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-setting-icon{padding-top:8.5px}.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-volume-icon{width:43px}.dplayer-controller .dplayer-icons .dplayer-volume{position:relative;display:inline-block;cursor:pointer;height:100%}.dplayer-controller .dplayer-icons .dplayer-volume:hover .dplayer-volume-bar-wrap .dplayer-volume-bar{width:45px}.dplayer-controller .dplayer-icons .dplayer-volume:hover .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb{-webkit-transform:scale(1);transform:scale(1)}.dplayer-controller .dplayer-icons .dplayer-volume.dplayer-volume-active .dplayer-volume-bar-wrap .dplayer-volume-bar{width:45px}.dplayer-controller .dplayer-icons .dplayer-volume.dplayer-volume-active .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb{-webkit-transform:scale(1);transform:scale(1)}.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap{display:inline-block;margin:0 10px 0 -5px;vertical-align:middle;height:100%}.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap .dplayer-volume-bar{position:relative;top:17px;width:0;height:3px;background:#aaa;transition:all .3s ease-in-out}.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner{position:absolute;bottom:0;left:0;height:100%;transition:all .1s ease;will-change:width}.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb{position:absolute;top:0;right:5px;margin-top:-4px;margin-right:-10px;height:11px;width:11px;border-radius:50%;cursor:pointer;transition:all .3s ease-in-out;-webkit-transform:scale(0);transform:scale(0)}.dplayer-controller .dplayer-icons .dplayer-setting,.dplayer-controller .dplayer-icons .dplayer-subtitle-btn{display:inline-block;height:100%}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box{position:absolute;right:0;bottom:50px;-webkit-transform:scale(0);transform:scale(0);width:150px;border-radius:2px;background:rgba(28,28,28,.9);padding:7px 0;transition:all .3s ease-in-out;overflow:hidden;z-index:2}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box>div{display:none}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box>div.dplayer-setting-origin-panel{display:block}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box.dplayer-setting-box-open{-webkit-transform:scale(1);transform:scale(1)}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box.dplayer-setting-box-narrow{width:70px;height:180px;text-align:center}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box.dplayer-setting-box-speed .dplayer-setting-origin-panel{display:none}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box.dplayer-setting-box-speed .dplayer-setting-speed-panel{display:block}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-item,.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-speed-item{height:30px;padding:5px 10px;box-sizing:border-box;cursor:pointer;position:relative}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-item:hover,.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-speed-item:hover{background-color:hsla(0,0%,100%,.1)}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku{padding:5px 0}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku .dplayer-label{padding:0 10px;display:inline}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku:hover .dplayer-label{display:none}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku:hover .dplayer-danmaku-bar-wrap{display:inline-block}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku.dplayer-setting-danmaku-active .dplayer-label{display:none}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku.dplayer-setting-danmaku-active .dplayer-danmaku-bar-wrap{display:inline-block}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap{padding:0 10px;box-sizing:border-box;display:none;vertical-align:middle;height:100%;width:100%}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap .dplayer-danmaku-bar{position:relative;top:8.5px;width:100%;height:3px;background:#fff;transition:all .3s ease-in-out}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap .dplayer-danmaku-bar .dplayer-danmaku-bar-inner{position:absolute;bottom:0;left:0;height:100%;transition:all .1s ease;background:#aaa;will-change:width}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap .dplayer-danmaku-bar .dplayer-danmaku-bar-inner .dplayer-thumb{position:absolute;top:0;right:5px;margin-top:-4px;margin-right:-10px;height:11px;width:11px;border-radius:50%;cursor:pointer;transition:all .3s ease-in-out;background:#aaa}.dplayer-controller .dplayer-icons .dplayer-full{display:inline-block;height:100%;position:relative}.dplayer-controller .dplayer-icons .dplayer-full:hover .dplayer-full-in-icon{display:block}.dplayer-controller .dplayer-icons .dplayer-full .dplayer-full-in-icon{position:absolute;top:-30px;z-index:1;display:none}.dplayer-controller .dplayer-icons .dplayer-quality{position:relative;display:inline-block;height:100%;z-index:2}.dplayer-controller .dplayer-icons .dplayer-quality:hover .dplayer-quality-list,.dplayer-controller .dplayer-icons .dplayer-quality:hover .dplayer-quality-mask{display:block}.dplayer-controller .dplayer-icons .dplayer-quality .dplayer-quality-mask{display:none;position:absolute;bottom:38px;left:-18px;width:80px;padding-bottom:12px}.dplayer-controller .dplayer-icons .dplayer-quality .dplayer-quality-list{display:none;font-size:12px;width:80px;border-radius:2px;background:rgba(28,28,28,.9);padding:5px 0;transition:all .3s ease-in-out;overflow:hidden;color:#fff;text-align:center}.dplayer-controller .dplayer-icons .dplayer-quality .dplayer-quality-item{height:25px;box-sizing:border-box;cursor:pointer;line-height:25px}.dplayer-controller .dplayer-icons .dplayer-quality .dplayer-quality-item:hover{background-color:hsla(0,0%,100%,.1)}.dplayer-controller .dplayer-icons .dplayer-comment{display:inline-block;height:100%}.dplayer-controller .dplayer-icons .dplayer-label{color:#eee;font-size:13px;display:inline-block;vertical-align:middle;white-space:nowrap}.dplayer-controller .dplayer-icons .dplayer-toggle{width:32px;height:20px;text-align:center;font-size:0;vertical-align:middle;position:absolute;top:5px;right:10px}.dplayer-controller .dplayer-icons .dplayer-toggle input{max-height:0;max-width:0;display:none}.dplayer-controller .dplayer-icons .dplayer-toggle input+label{display:inline-block;position:relative;box-shadow:inset 0 0 0 0 #dfdfdf;border:1px solid #dfdfdf;height:20px;width:32px;border-radius:10px;box-sizing:border-box;cursor:pointer;transition:.2s ease-in-out}.dplayer-controller .dplayer-icons .dplayer-toggle input+label:after,.dplayer-controller .dplayer-icons .dplayer-toggle input+label:before{content:"";position:absolute;display:block;height:18px;width:18px;top:0;left:0;border-radius:15px;transition:.2s ease-in-out}.dplayer-controller .dplayer-icons .dplayer-toggle input+label:after{background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.4)}.dplayer-controller .dplayer-icons .dplayer-toggle input:checked+label{border-color:hsla(0,0%,100%,.5)}.dplayer-controller .dplayer-icons .dplayer-toggle input:checked+label:before{width:30px;background:hsla(0,0%,100%,.5)}.dplayer-controller .dplayer-icons .dplayer-toggle input:checked+label:after{left:12px}.dplayer-danmaku{position:absolute;left:0;right:0;top:0;bottom:0;font-size:22px;color:#fff}.dplayer-danmaku .dplayer-danmaku-item{display:inline-block;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default;white-space:nowrap;text-shadow:.5px .5px .5px rgba(0,0,0,.5)}.dplayer-danmaku .dplayer-danmaku-item--demo{position:absolute;visibility:hidden}.dplayer-danmaku .dplayer-danmaku-right{position:absolute;right:0;-webkit-transform:translateX(100%);transform:translateX(100%)}.dplayer-danmaku .dplayer-danmaku-right.dplayer-danmaku-move{will-change:transform;-webkit-animation:danmaku 5s linear;animation:danmaku 5s linear;-webkit-animation-play-state:paused;animation-play-state:paused}@-webkit-keyframes danmaku{0%{-webkit-transform:translateX(100%);transform:translateX(100%)}}@keyframes danmaku{0%{-webkit-transform:translateX(100%);transform:translateX(100%)}}.dplayer-danmaku .dplayer-danmaku-bottom,.dplayer-danmaku .dplayer-danmaku-top{position:absolute;width:100%;text-align:center;visibility:hidden}.dplayer-danmaku .dplayer-danmaku-bottom.dplayer-danmaku-move,.dplayer-danmaku .dplayer-danmaku-top.dplayer-danmaku-move{will-change:visibility;-webkit-animation:danmaku-center 4s linear;animation:danmaku-center 4s linear;-webkit-animation-play-state:paused;animation-play-state:paused}@-webkit-keyframes danmaku-center{0%{visibility:visible}to{visibility:visible}}@keyframes danmaku-center{0%{visibility:visible}to{visibility:visible}}.dplayer-logo{pointer-events:none;position:absolute;left:20px;top:20px;max-width:50px;max-height:50px}.dplayer-logo img{max-width:100%;max-height:100%;background:none}.dplayer-menu{position:absolute;width:170px;border-radius:2px;background:rgba(28,28,28,.85);padding:5px 0;overflow:hidden;z-index:3;display:none}.dplayer-menu.dplayer-menu-show{display:block}.dplayer-menu .dplayer-menu-item{height:30px;box-sizing:border-box;cursor:pointer}.dplayer-menu .dplayer-menu-item:hover{background-color:hsla(0,0%,100%,.1)}.dplayer-menu .dplayer-menu-item a{padding:0 10px;line-height:30px;color:#eee;font-size:13px;display:inline-block;vertical-align:middle;width:100%;box-sizing:border-box;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.dplayer-menu .dplayer-menu-item a:hover{text-decoration:none}.dplayer-notice{opacity:0;position:absolute;bottom:60px;left:20px;font-size:14px;border-radius:2px;background:rgba(28,28,28,.9);padding:7px 20px;transition:all .3s ease-in-out;overflow:hidden;color:#fff;pointer-events:none}.dplayer-subtitle{position:absolute;bottom:40px;width:90%;left:5%;text-align:center;color:#fff;text-shadow:.5px .5px .5px rgba(0,0,0,.5);font-size:20px}.dplayer-subtitle.dplayer-subtitle-hide{display:none}.dplayer-mask{position:absolute;top:0;bottom:0;left:0;right:0;z-index:1;display:none}.dplayer-mask.dplayer-mask-show{display:block}.dplayer-video-wrap{position:relative;background:#000;font-size:0;width:100%;height:100%}.dplayer-video-wrap .dplayer-video{width:100%;height:100%;display:none}.dplayer-video-wrap .dplayer-video-current{display:block}.dplayer-video-wrap .dplayer-video-prepare{display:none}.dplayer-info-panel{position:absolute;top:10px;left:10px;width:400px;background:rgba(28,28,28,.8);padding:10px;color:#fff;font-size:12px;border-radius:2px}.dplayer-info-panel-hide{display:none}.dplayer-info-panel .dplayer-info-panel-close{cursor:pointer;position:absolute;right:10px;top:10px}.dplayer-info-panel .dplayer-info-panel-item>span{display:inline-block;vertical-align:middle;line-height:15px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.dplayer-info-panel .dplayer-info-panel-item-title{width:100px;text-align:right;margin-right:10px}.dplayer-info-panel .dplayer-info-panel-item-data{width:260px} + .icon-sj{background: transparent url("/web/player/p2pplayer/images/pront.png") no-repeat scroll;top:7px;left:5px;} + .icon-xj{background: transparent url("/web/player/p2pplayer/images/next.png") no-repeat scroll ; top:7px;left:5px;} + .icon-line{background: transparent url("/web/player/p2pplayer/images/line.png") no-repeat scroll ; top:10px;right:-10px;} + .icon-list{background: transparent url("/web/player/p2pplayer/images/list.png") no-repeat scroll ; top:10px;right:-10px;} + a{text-decoration: none;} + + + + + + +/*# sourceMappingURL=DPlayer.min.css.map*/ \ No newline at end of file diff --git a/templates/player/p2pplayer/DPlayer.min.js b/templates/player/p2pplayer/DPlayer.min.js new file mode 100644 index 0000000..677889c --- /dev/null +++ b/templates/player/p2pplayer/DPlayer.min.js @@ -0,0 +1,2 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("DPlayer",[],t):"object"==typeof exports?exports.DPlayer=t():e.DPlayer=t()}(window,function(){return function(e){var t={};function n(i){if(t[i])return t[i].exports;var a=t[i]={i:i,l:!1,exports:{}};return e[i].call(a.exports,a,a.exports,n),a.l=!0,a.exports}return n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var a in e)n.d(i,a,function(t){return e[t]}.bind(null,a));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=78)}([function(e,t,n){"use strict";var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a=n(11),o=n(65),r=Object.prototype.toString;function s(e){return"[object Array]"===r.call(e)}function l(e){return null!==e&&"object"===(void 0===e?"undefined":i(e))}function c(e){return"[object Function]"===r.call(e)}function u(e,t){if(null!==e&&void 0!==e)if("object"!==(void 0===e?"undefined":i(e))&&(e=[e]),s(e))for(var n=0,a=e.length;n0?[t,n,i]:[n,i]).map(function(e){return e<10?"0"+e:""+e}).join(":")},getElementViewLeft:function(e){var t=e.offsetLeft,n=e.offsetParent,i=document.body.scrollLeft+document.documentElement.scrollLeft;if(document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement)for(;null!==n&&n!==e;)t+=n.offsetLeft,n=n.offsetParent;else for(;null!==n;)t+=n.offsetLeft,n=n.offsetParent;return t-i},getBoundingClientRectViewLeft:function(e){var t=document.documentElement.scrollTop;if(e.getBoundingClientRect){if("number"!=typeof this.getBoundingClientRectViewLeft.offset){var n=document.createElement("div");n.style.cssText="position:absolute;top:0;left:0;",document.body.appendChild(n),this.getBoundingClientRectViewLeft.offset=-n.getBoundingClientRect().top-t,document.body.removeChild(n),n=null}var i=e.getBoundingClientRect(),a=this.getBoundingClientRectViewLeft.offset;return i.left+a}return this.getElementViewLeft(e)},getScrollPosition:function(){return{left:window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0,top:window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0}},setScrollPosition:function(e){var t=e.left,n=void 0===t?0:t,i=e.top,a=void 0===i?0:i;this.isFirefox?(document.documentElement.scrollLeft=n,document.documentElement.scrollTop=a):window.scrollTo(n,a)},isMobile:i,isFirefox:/firefox/i.test(window.navigator.userAgent),isChrome:/chrome/i.test(window.navigator.userAgent),storage:{set:function(e,t){localStorage.setItem(e,t)},get:function(e){return localStorage.getItem(e)}},cumulativeOffset:function(e){var t=0,n=0;do{t+=e.offsetTop||0,n+=e.offsetLeft||0,e=e.offsetParent}while(e);return{top:t,left:n}},nameMap:{dragStart:i?"touchstart":"mousedown",dragMove:i?"touchmove":"mousemove",dragEnd:i?"touchend":"mouseup"},color2Number:function(e){return"#"===e[0]&&(e=e.substr(1)),3===e.length&&(e=""+e[0]+e[0]+e[1]+e[1]+e[2]+e[2]),parseInt(e,16)+0&16777215},number2Color:function(e){return"#"+("00000"+e.toString(16)).slice(-6)},number2Type:function(e){switch(e){case 0:return"right";case 1:return"top";case 2:return"bottom";default:return"right"}}};t.default=a},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=b(n(46)),a=b(n(45)),o=b(n(44)),r=b(n(43)),s=b(n(42)),l=b(n(41)),c=b(n(40)),u=b(n(39)),d=b(n(38)),p=b(n(37)),h=b(n(36)),f=b(n(35)),y=b(n(34)),m=b(n(33)),v=b(n(32)),g=b(n(31));function b(e){return e&&e.__esModule?e:{default:e}}var w={play:i.default,pause:a.default,volumeUp:o.default,volumeDown:r.default,volumeOff:s.default,full:l.default,fullWeb:c.default,setting:u.default,right:d.default,comment:p.default,commentOff:h.default,send:f.default,pallette:y.default,camera:m.default,subtitle:v.default,loading:g.default};t.default=w},function(e,t,n){"use strict";(function(t){var i=n(0),a=n(63),o={"Content-Type":"application/x-www-form-urlencoded"};function r(e,t){!i.isUndefined(e)&&i.isUndefined(e["Content-Type"])&&(e["Content-Type"]=t)}var s,l={adapter:("undefined"!=typeof XMLHttpRequest?s=n(10):void 0!==t&&(s=n(10)),s),transformRequest:[function(e,t){return a(t,"Content-Type"),i.isFormData(e)||i.isArrayBuffer(e)||i.isBuffer(e)||i.isStream(e)||i.isFile(e)||i.isBlob(e)?e:i.isArrayBufferView(e)?e.buffer:i.isURLSearchParams(e)?(r(t,"application/x-www-form-urlencoded;charset=utf-8"),e.toString()):i.isObject(e)?(r(t,"application/json;charset=utf-8"),JSON.stringify(e)):e}],transformResponse:[function(e){if("string"==typeof e)try{e=JSON.parse(e)}catch(e){}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,validateStatus:function(e){return e>=200&&e<300}};l.headers={common:{Accept:"application/json, text/plain, */*"}},i.forEach(["delete","get","head"],function(e){l.headers[e]={}}),i.forEach(["post","put","patch"],function(e){l.headers[e]=i.merge(o)}),e.exports=l}).call(this,n(12))},function(e,t,n){"use strict";var i,a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};i=function(){return this}();try{i=i||Function("return this")()||(0,eval)("this")}catch(e){"object"===("undefined"==typeof window?"undefined":a(window))&&(i=window)}e.exports=i},function(e,t,n){var i=n(6);e.exports=function(e){"use strict";var t="",n=(e=e||{}).enableSubtitle,a=e.subtitle,o=e.current,r=e.pic,s=i.$escape,l=e.screenshot,c=e.preload,u=e.url;n=a&&"webvtt"===a.type;return t+='\n\n ",n&&(t+='\n \n '),t+="\n"}},function(e,t,n){"use strict";e.exports=n(29)},function(e,t,n){"use strict";function i(e){this.message=e}i.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},i.prototype.__CANCEL__=!0,e.exports=i},function(e,t,n){"use strict";e.exports=function(e){return!(!e||!e.__CANCEL__)}},function(e,t,n){"use strict";var i=n(61);e.exports=function(e,t,n,a,o){var r=new Error(e);return i(r,t,n,a,o)}},function(e,t,n){"use strict";var i=n(0),a=n(62),o=n(60),r=n(59),s=n(58),l=n(9),c="undefined"!=typeof window&&window.btoa&&window.btoa.bind(window)||n(57);e.exports=function(e){return new Promise(function(t,u){var d=e.data,p=e.headers;i.isFormData(d)&&delete p["Content-Type"];var h=new XMLHttpRequest,f="onreadystatechange",y=!1;if("undefined"==typeof window||!window.XDomainRequest||"withCredentials"in h||s(e.url)||(h=new window.XDomainRequest,f="onload",y=!0,h.onprogress=function(){},h.ontimeout=function(){}),e.auth){var m=e.auth.username||"",v=e.auth.password||"";p.Authorization="Basic "+c(m+":"+v)}if(h.open(e.method.toUpperCase(),o(e.url,e.params,e.paramsSerializer),!0),h.timeout=e.timeout,h[f]=function(){if(h&&(4===h.readyState||y)&&(0!==h.status||h.responseURL&&0===h.responseURL.indexOf("file:"))){var n="getAllResponseHeaders"in h?r(h.getAllResponseHeaders()):null,i={data:e.responseType&&"text"!==e.responseType?h.response:h.responseText,status:1223===h.status?204:h.status,statusText:1223===h.status?"No Content":h.statusText,headers:n,config:e,request:h};a(t,u,i),h=null}},h.onerror=function(){u(l("Network Error",e,null,h)),h=null},h.ontimeout=function(){u(l("timeout of "+e.timeout+"ms exceeded",e,"ECONNABORTED",h)),h=null},i.isStandardBrowserEnv()){var g=n(56),b=(e.withCredentials||s(e.url))&&e.xsrfCookieName?g.read(e.xsrfCookieName):void 0;b&&(p[e.xsrfHeaderName]=b)}if("setRequestHeader"in h&&i.forEach(p,function(e,t){void 0===d&&"content-type"===t.toLowerCase()?delete p[t]:h.setRequestHeader(t,e)}),e.withCredentials&&(h.withCredentials=!0),e.responseType)try{h.responseType=e.responseType}catch(t){if("json"!==e.responseType)throw t}"function"==typeof e.onDownloadProgress&&h.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&h.upload&&h.upload.addEventListener("progress",e.onUploadProgress),e.cancelToken&&e.cancelToken.promise.then(function(e){h&&(h.abort(),u(e),h=null)}),void 0===d&&(d=null),h.send(d)})}},function(e,t,n){"use strict";e.exports=function(e,t){return function(){for(var n=new Array(arguments.length),i=0;i1)for(var n=1;n=n.width?(this.player.template.menu.style.right=n.width-e+"px",this.player.template.menu.style.left="initial"):(this.player.template.menu.style.left=e+"px",this.player.template.menu.style.right="initial"),t+this.player.template.menu.offsetHeight>=n.height?(this.player.template.menu.style.bottom=n.height-t+"px",this.player.template.menu.style.top="initial"):(this.player.template.menu.style.top=t+"px",this.player.template.menu.style.bottom="initial"),this.player.template.mask.classList.add("dplayer-mask-show"),this.shown=!0,this.player.events.trigger("contextmenu_show")}},{key:"hide",value:function(){this.player.template.mask.classList.remove("dplayer-mask-show"),this.player.template.menu.classList.remove("dplayer-menu-show"),this.shown=!1,this.player.events.trigger("contextmenu_hide")}}]),e}();t.default=a},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.default=function e(t){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),t.options.hotkey&&document.addEventListener("keydown",function(e){if(t.focus){var n=document.activeElement.tagName.toUpperCase(),i=document.activeElement.getAttribute("contenteditable");if("INPUT"!==n&&"TEXTAREA"!==n&&""!==i&&"true"!==i){var a=e||window.event,o=void 0;switch(a.keyCode){case 32:a.preventDefault(),t.toggle();break;case 37:a.preventDefault(),t.seek(t.video.currentTime-5),t.controller.setAutoHide();break;case 39:a.preventDefault(),t.seek(t.video.currentTime+5),t.controller.setAutoHide();break;case 38:a.preventDefault(),o=t.volume()+.1,t.volume(o);break;case 40:a.preventDefault(),o=t.volume()-.1,t.volume(o)}}}}),document.addEventListener("keydown",function(e){switch((e||window.event).keyCode){case 27:t.fullScreen.isFullScreen("web")&&t.fullScreen.cancel("web")}})}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i,a=function(){function e(e,t){for(var n=0;n'+e.player.options.highlight[n].text+"",e.player.template.playedBarWrap.insertBefore(i,e.player.template.playedBarTime)}}})}},{key:"initThumbnails",value:function(){var e=this;this.player.options.video.thumbnails&&(this.thumbnails=new o.default({container:this.player.template.barPreview,barWidth:this.player.template.barWrap.offsetWidth,url:this.player.options.video.thumbnails,events:this.player.events}),this.player.on("loadedmetadata",function(){e.thumbnails.resize(160,e.player.video.videoHeight/e.player.video.videoWidth*160)}))}},{key:"initPlayedBar",value:function(){var e=this,t=function(t){var n=((t.clientX||t.changedTouches[0].clientX)-a.default.getBoundingClientRectViewLeft(e.player.template.playedBarWrap))/e.player.template.playedBarWrap.clientWidth;n=Math.max(n,0),n=Math.min(n,1),e.player.bar.set("played",n,"width"),e.player.template.ptime.innerHTML=a.default.secondToTime(n*e.player.video.duration)},n=function n(i){document.removeEventListener(a.default.nameMap.dragEnd,n),document.removeEventListener(a.default.nameMap.dragMove,t);var o=((i.clientX||i.changedTouches[0].clientX)-a.default.getBoundingClientRectViewLeft(e.player.template.playedBarWrap))/e.player.template.playedBarWrap.clientWidth;o=Math.max(o,0),o=Math.min(o,1),e.player.bar.set("played",o,"width"),e.player.seek(e.player.bar.get("played")*e.player.video.duration),e.player.timer.enable("progress")};this.player.template.playedBarWrap.addEventListener(a.default.nameMap.dragStart,function(){e.player.timer.disable("progress"),document.addEventListener(a.default.nameMap.dragMove,t),document.addEventListener(a.default.nameMap.dragEnd,n)}),this.player.template.playedBarWrap.addEventListener(a.default.nameMap.dragMove,function(t){if(e.player.video.duration){var n=a.default.cumulativeOffset(e.player.template.playedBarWrap).left,i=(t.clientX||t.changedTouches[0].clientX)-n;if(i<0||i>e.player.template.playedBarWrap.offsetWidth)return;var o=e.player.video.duration*(i/e.player.template.playedBarWrap.offsetWidth);a.default.isMobile&&e.thumbnails&&e.thumbnails.show(),e.thumbnails&&e.thumbnails.move(i),e.player.template.playedBarTime.style.left=i-(o>=3600?25:20)+"px",e.player.template.playedBarTime.innerText=a.default.secondToTime(o),e.player.template.playedBarTime.classList.remove("hidden")}}),this.player.template.playedBarWrap.addEventListener(a.default.nameMap.dragEnd,function(){a.default.isMobile&&e.thumbnails&&e.thumbnails.hide()}),a.default.isMobile||(this.player.template.playedBarWrap.addEventListener("mouseenter",function(){e.player.video.duration&&(e.thumbnails&&e.thumbnails.show(),e.player.template.playedBarTime.classList.remove("hidden"))}),this.player.template.playedBarWrap.addEventListener("mouseleave",function(){e.player.video.duration&&(e.thumbnails&&e.thumbnails.hide(),e.player.template.playedBarTime.classList.add("hidden"))}))}},{key:"initFullButton",value:function(){var e=this;this.player.template.browserFullButton.addEventListener("click",function(){e.player.fullScreen.toggle("browser")}),this.player.template.webFullButton.addEventListener("click",function(){e.player.fullScreen.toggle("web")})}},{key:"initVolumeButton",value:function(){var e=this,t=function(t){var n=t||window.event,i=((n.clientX||n.changedTouches[0].clientX)-a.default.getBoundingClientRectViewLeft(e.player.template.volumeBarWrap)-5.5)/35;e.player.volume(i)},n=function n(){document.removeEventListener(a.default.nameMap.dragEnd,n),document.removeEventListener(a.default.nameMap.dragMove,t),e.player.template.volumeButton.classList.remove("dplayer-volume-active")};this.player.template.volumeBarWrapWrap.addEventListener("click",function(t){var n=t||window.event,i=((n.clientX||n.changedTouches[0].clientX)-a.default.getBoundingClientRectViewLeft(e.player.template.volumeBarWrap)-5.5)/35;e.player.volume(i)}),this.player.template.volumeBarWrapWrap.addEventListener(a.default.nameMap.dragStart,function(){document.addEventListener(a.default.nameMap.dragMove,t),document.addEventListener(a.default.nameMap.dragEnd,n),e.player.template.volumeButton.classList.add("dplayer-volume-active")}),this.player.template.volumeButtonIcon.addEventListener("click",function(){e.player.video.muted?(e.player.video.muted=!1,e.player.switchVolumeIcon(),e.player.bar.set("volume",e.player.volume(),"width")):(e.player.video.muted=!0,e.player.template.volumeIcon.innerHTML=r.default.volumeOff,e.player.bar.set("volume",0,"width"))})}},{key:"initQualityButton",value:function(){var e=this;this.player.options.video.quality&&this.player.template.qualityList.addEventListener("click",function(t){t.target.classList.contains("dplayer-quality-item")&&e.player.switchQuality(t.target.dataset.index)})}},{key:"initScreenshotButton",value:function(){var e=this;this.player.options.screenshot&&this.player.template.camareButton.addEventListener("click",function(){var t=document.createElement("canvas");t.width=e.player.video.videoWidth,t.height=e.player.video.videoHeight,t.getContext("2d").drawImage(e.player.video,0,0,t.width,t.height);var n=void 0;t.toBlob(function(e){n=URL.createObjectURL(e);var t=document.createElement("a");t.href=n,t.download="DPlayer.png",t.style.display="none",document.body.appendChild(t),t.click(),document.body.removeChild(t),URL.revokeObjectURL(n)}),e.player.events.trigger("screenshot",n)})}},{key:"initSubtitleButton",value:function(){var e=this;this.player.options.subtitle&&(this.player.events.on("subtitle_show",function(){e.player.template.subtitleButton.dataset.balloon=e.player.tran("Hide subtitle"),e.player.template.subtitleButtonInner.style.opacity="",e.player.user.set("subtitle",1)}),this.player.events.on("subtitle_hide",function(){e.player.template.subtitleButton.dataset.balloon=e.player.tran("Show subtitle"),e.player.template.subtitleButtonInner.style.opacity="0.4",e.player.user.set("subtitle",0)}),this.player.template.subtitleButton.addEventListener("click",function(){e.player.subtitle.toggle()}))}},{key:"setAutoHide",value:function(){var e=this;this.show(),clearTimeout(this.autoHideTimer),this.autoHideTimer=setTimeout(function(){!e.player.video.played.length||e.player.paused||e.disableAutoHide||e.hide()},3e3)}},{key:"show",value:function(){this.player.container.classList.remove("dplayer-hide-controller")}},{key:"hide",value:function(){this.player.container.classList.add("dplayer-hide-controller"),this.player.setting.hide(),this.player.comment&&this.player.comment.hide()}},{key:"isShow",value:function(){return!this.player.container.classList.contains("dplayer-hide-controller")}},{key:"toggle",value:function(){this.isShow()?this.hide():this.show()}},{key:"destroy",value:function(){clearTimeout(this.autoHideTimer)}}]),e}();t.default=l},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;nt&&!e.player.video.paused&&(e.player.container.classList.remove("dplayer-loading"),i=!1),t=n)},100)}},{key:"initfpsChecker",value:function(){var e=this;window.requestAnimationFrame(function(){if(e.enablefpsChecker)if(e.initfpsChecker(),e.fpsStart){e.fpsIndex++;var t=new Date;t-e.fpsStart>1e3&&(e.player.infoPanel.fps(e.fpsIndex/(t-e.fpsStart)*1e3),e.fpsStart=new Date,e.fpsIndex=0)}else e.fpsStart=new Date,e.fpsIndex=0;else e.fpsStart=0,e.fpsIndex=0})}},{key:"initinfoChecker",value:function(){var e=this;this.infoChecker=setInterval(function(){e.enableinfoChecker&&e.player.infoPanel.update()},1e3)}},{key:"enable",value:function(e){this["enable"+e+"Checker"]=!0,"fps"===e&&this.initfpsChecker()}},{key:"disable",value:function(e){this["enable"+e+"Checker"]=!1}},{key:"destroy",value:function(){var e=this;this.types.map(function(t){return e["enable"+t+"Checker"]=!1,e[t+"Checker"]&&clearInterval(e[t+"Checker"]),t})}}]),e}();t.default=a},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:"browser"){case"browser":return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement;case"web":return this.player.container.classList.contains("dplayer-fulled")}}},{key:"request",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"browser",t="browser"===e?"web":"browser",n=this.isFullScreen(t);switch(n||(this.lastScrollPosition=r.default.getScrollPosition()),e){case"browser":this.player.container.requestFullscreen?this.player.container.requestFullscreen():this.player.container.mozRequestFullScreen?this.player.container.mozRequestFullScreen():this.player.container.webkitRequestFullscreen?this.player.container.webkitRequestFullscreen():this.player.video.webkitEnterFullscreen?this.player.video.webkitEnterFullscreen():this.player.video.webkitEnterFullScreen?this.player.video.webkitEnterFullScreen():this.player.container.msRequestFullscreen&&this.player.container.msRequestFullscreen();break;case"web":this.player.container.classList.add("dplayer-fulled"),document.body.classList.add("dplayer-web-fullscreen-fix"),this.player.events.trigger("webfullscreen")}n&&this.cancel(t)}},{key:"cancel",value:function(){switch(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"browser"){case"browser":document.cancelFullScreen?document.cancelFullScreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.webkitCancelFullscreen?document.webkitCancelFullscreen():document.msCancelFullScreen?document.msCancelFullScreen():document.msExitFullscreen&&document.msExitFullscreen();break;case"web":this.player.container.classList.remove("dplayer-fulled"),document.body.classList.remove("dplayer-web-fullscreen-fix"),this.player.events.trigger("webfullscreen_cancel")}}},{key:"toggle",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"browser";this.isFullScreen(e)?this.cancel(e):this.request(e)}}]),e}();t.default=s},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;nparseFloat(t.time);)n.push(t),t=this.dan[++this.danIndex];this.draw(n)}window.requestAnimationFrame(function(){e.frame()})}},{key:"opacity",value:function(e){if(void 0!==e){for(var t=this.container.getElementsByClassName("dplayer-danmaku-item"),n=0;n'+e[a].text+"":o.innerHTML=e[a].text,o.style.opacity=t._opacity,o.style.color=s.default.number2Color(e[a].color),o.addEventListener("animationend",function(){t.container.removeChild(o)});var r=t._measure(e[a].text),l=void 0;switch(e[a].type){case"right":(l=u(o,e[a].type,r))>=0&&(o.style.width=r+1+"px",o.style.top=n*l+"px",o.style.transform="translateX(-"+i+"px)");break;case"top":(l=u(o,e[a].type))>=0&&(o.style.top=n*l+"px");break;case"bottom":(l=u(o,e[a].type))>=0&&(o.style.bottom=n*l+"px");break;default:console.error("Can't handled danmaku type: "+e[a].type)}l>=0&&(o.classList.add("dplayer-danmaku-move"),d.appendChild(o))},h=0;h=this.options.time()){this.danIndex=e;break}this.danIndex=this.dan.length}}},{key:"clear",value:function(){this.danTunnel={right:{},top:{},bottom:{}},this.danIndex=0,this.options.container.innerHTML="",this.events&&this.events.trigger("danmaku_clear")}},{key:"htmlEncode",value:function(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/")}},{key:"resize",value:function(){for(var e=this.container.offsetWidth,t=this.container.getElementsByClassName("dplayer-danmaku-item"),n=0;n]/;a.$escape=function(e){return function(e){var t=""+e,n=o.exec(t);if(!n)return e;var i="",a=void 0,r=void 0,s=void 0;for(a=n.index,r=0;a\n
\n '),a+='\n
\n
\n
\n
\n
\n \n ',r.danmaku&&(a+='\n ',a+=s(l("Danmaku is loading")),a+="\n "),a+='\n ',a+=c.loading,a+='\n
\n\n
\n
\n
\n \n
\n
\n
',a+=s(l("Set danmaku color")),a+='
\n \n \n \n \n \n \n
\n
\n
',a+=s(l("Set danmaku type")),a+='
\n \n \n \n
\n
\n \n ',a+=c.send,a+='\n \n
\n
\n \n \n
\n \n
\n
\n
\n \n
\n
\n
\n
\n \n 0:00 /\n 0:00\n \n ',r.live&&(a+='\n ',a+=s(l("Live")),a+="\n "),a+='\n
\n
\n ',r.video.quality&&(a+='\n
\n \n
\n
\n ',d(r.video.quality,function(e,t){a+='\n
',a+=s(e.name),a+="
\n "}),a+="\n
\n
\n
\n "),a+="\n ",r.screenshot&&(a+='\n
\n
\n "),a+='\n
\n \n
\n ",r.subtitle&&(a+='\n
\n \n
\n "),a+='\n \n
\n \n
\n
\n
\n ',a+=s(l("Speed")),a+='\n
',a+=c.right,a+='
\n
\n
\n ',a+=s(l("Loop")),a+='\n
\n \n \n
\n
\n
\n ',a+=s(l("Show danmaku")),a+='\n
\n \n \n
\n
\n
\n ',a+=s(l("Unlimited danmaku")),a+='\n
\n \n \n
\n
\n
\n ',a+=s(l("Opacity for danmaku")),a+='\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n 0.5\n
\n
\n 0.75\n
\n
\n ',a+=s(l("Normal")),a+='\n
\n
\n 1.25\n
\n
\n 1.5\n
\n
\n 2\n
\n
\n
\n
\n
\n \n \n
\n
\n
\n \n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
[x]
\n
\n Player version\n \n
\n
\n Player FPS\n \n
\n
\n Video type\n \n
\n
\n Video url\n \n
\n
\n Video resolution\n \n
\n
\n Video duration\n \n
\n ',r.danmaku&&(a+='\n
\n Danamku id\n \n
\n
\n Danamku api\n \n
\n
\n Danamku amount\n \n
\n '),a+='\n
\n
\n ',d(r.contextmenu,function(e,t){a+='\n
\n ',a+=s(l(e.text)),a+="\n
\n "}),a+='\n
\n
'}},function(e,t){e.exports=''},function(e,t){e.exports=''},function(e,t){e.exports=''},function(e,t){e.exports=''},function(e,t){e.exports=''},function(e,t){e.exports=''},function(e,t){e.exports=''},function(e,t){e.exports=''},function(e,t){e.exports=''},function(e,t){e.exports=''},function(e,t){e.exports=''},function(e,t){e.exports=''},function(e,t){e.exports=''},function(e,t){e.exports=''},function(e,t){e.exports=''},function(e,t){e.exports=''},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n>8-s%1*8)){if((n=o.charCodeAt(s+=.75))>255)throw new a;t=t<<8|n}return r}},function(e,t,n){"use strict";var i=n(0);e.exports=i.isStandardBrowserEnv()?function(){var e,t=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");function a(e){var i=e;return t&&(n.setAttribute("href",i),i=n.href),n.setAttribute("href",i),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:"/"===n.pathname.charAt(0)?n.pathname:"/"+n.pathname}}return e=a(window.location.href),function(t){var n=i.isString(t)?a(t):t;return n.protocol===e.protocol&&n.host===e.host}}():function(){return!0}},function(e,t,n){"use strict";var i=n(0),a=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,n,o,r={};return e?(i.forEach(e.split("\n"),function(e){if(o=e.indexOf(":"),t=i.trim(e.substr(0,o)).toLowerCase(),n=i.trim(e.substr(o+1)),t){if(r[t]&&a.indexOf(t)>=0)return;r[t]="set-cookie"===t?(r[t]?r[t]:[]).concat([n]):r[t]?r[t]+", "+n:n}}),r):r}},function(e,t,n){"use strict";var i=n(0);function a(e){return encodeURIComponent(e).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}e.exports=function(e,t,n){if(!t)return e;var o;if(n)o=n(t);else if(i.isURLSearchParams(t))o=t.toString();else{var r=[];i.forEach(t,function(e,t){null!==e&&void 0!==e&&(i.isArray(e)?t+="[]":e=[e],i.forEach(e,function(e){i.isDate(e)?e=e.toISOString():i.isObject(e)&&(e=JSON.stringify(e)),r.push(a(t)+"="+a(e))}))}),o=r.join("&")}return o&&(e+=(-1===e.indexOf("?")?"?":"&")+o),e}},function(e,t,n){"use strict";e.exports=function(e,t,n,i,a){return e.config=t,n&&(e.code=n),e.request=i,e.response=a,e}},function(e,t,n){"use strict";var i=n(9);e.exports=function(e,t,n){var a=n.config.validateStatus;n.status&&a&&!a(n.status)?t(i("Request failed with status code "+n.status,n.config,null,n.request,n)):e(n)}},function(e,t,n){"use strict";var i=n(0);e.exports=function(e,t){i.forEach(e,function(n,i){i!==t&&i.toUpperCase()===t.toUpperCase()&&(e[t]=n,delete e[i])})}},function(e,t,n){"use strict";var i=n(3),a=n(0),o=n(55),r=n(54);function s(e){this.defaults=e,this.interceptors={request:new o,response:new o}}s.prototype.request=function(e){"string"==typeof e&&(e=a.merge({url:arguments[0]},arguments[1])),(e=a.merge(i,{method:"get"},this.defaults,e)).method=e.method.toLowerCase();var t=[r,void 0],n=Promise.resolve(e);for(this.interceptors.request.forEach(function(e){t.unshift(e.fulfilled,e.rejected)}),this.interceptors.response.forEach(function(e){t.push(e.fulfilled,e.rejected)});t.length;)n=n.then(t.shift(),t.shift());return n},a.forEach(["delete","get","head","options"],function(e){s.prototype[e]=function(t,n){return this.request(a.merge(n||{},{method:e,url:t}))}}),a.forEach(["post","put","patch"],function(e){s.prototype[e]=function(t,n,i){return this.request(a.merge(i||{},{method:e,url:t,data:n}))}}),e.exports=s},function(e,t,n){"use strict";function i(e){return!!e.constructor&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}e.exports=function(e){return null!=e&&(i(e)||function(e){return"function"==typeof e.readFloatLE&&"function"==typeof e.slice&&i(e.slice(0,0))}(e)||!!e._isBuffer)}},function(e,t,n){"use strict";var i=n(0),a=n(11),o=n(64),r=n(3);function s(e){var t=new o(e),n=a(o.prototype.request,t);return i.extend(n,o.prototype,t),i.extend(n,t),n}var l=s(r);l.Axios=o,l.create=function(e){return s(i.merge(r,e))},l.Cancel=n(7),l.CancelToken=n(50),l.isCancel=n(8),l.all=function(e){return Promise.all(e)},l.spread=n(49),e.exports=l,e.exports.default=l},function(e,t,n){"use strict";e.exports=n(66)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i,a=n(67),o=(i=a)&&i.__esModule?i:{default:i};t.default={send:function(e){o.default.post(e.url,e.data).then(function(t){var n=t.data;n&&0===n.code?e.success&&e.success(n):e.error&&e.error(n&&n.msg)}).catch(function(t){console.error(t),e.error&&e.error()})},read:function(e){o.default.get(e.url).then(function(t){var n=t.data;n&&0===n.code?e.success&&e.success(n.data.map(function(e){return{time:e[0],type:e[1],color:e[2],author:e[3],text:e[4]}})):e.error&&e.error(n&&n.msg)}).catch(function(t){console.error(t),e.error&&e.error()})}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i,a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o=n(68),r=(i=o)&&i.__esModule?i:{default:i};t.default=function(e){var t={container:e.element||document.getElementsByClassName("dplayer")[0],live:!1,autoplay:!1,theme:"#b7daff",loop:!1,lang:(navigator.language||navigator.browserLanguage).toLowerCase(),screenshot:!1,hotkey:!0,preload:"metadata",volume:.7,apiBackend:r.default,video:{},contextmenu:[],mutex:!0};for(var n in t)t.hasOwnProperty(n)&&!e.hasOwnProperty(n)&&(e[n]=t[n]);return e.video&&!e.video.type&&(e.video.type="auto"),"object"===a(e.danmaku)&&e.danmaku&&!e.danmaku.user&&(e.danmaku.user="DIYgod"),e.subtitle&&(!e.subtitle.type&&(e.subtitle.type="webvtt"),!e.subtitle.fontSize&&(e.subtitle.fontSize="20px"),!e.subtitle.bottom&&(e.subtitle.bottom="40px"),!e.subtitle.color&&(e.subtitle.color="#fff")),e.video.quality&&(e.video.url=e.video.quality[e.video.defaultQuality].url),e.lang&&(e.lang=e.lang.toLowerCase()),e.contextmenu=e.contextmenu.concat([]),e}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=this.constructor;return this.then(function(n){return t.resolve(e()).then(function(){return n})},function(n){return t.resolve(e()).then(function(){return t.reject(n)})})}},function(e,t,n){"use strict";(function(e,t){!function(e,n){if(!e.setImmediate){var i,a,o,r,s,l=1,c={},u=!1,d=e.document,p=Object.getPrototypeOf&&Object.getPrototypeOf(e);p=p&&p.setTimeout?p:e,"[object process]"==={}.toString.call(e.process)?i=function(e){t.nextTick(function(){f(e)})}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=n,t}}()?e.MessageChannel?((o=new MessageChannel).port1.onmessage=function(e){f(e.data)},i=function(e){o.port2.postMessage(e)}):d&&"onreadystatechange"in d.createElement("script")?(a=d.documentElement,i=function(e){var t=d.createElement("script");t.onreadystatechange=function(){f(e),t.onreadystatechange=null,a.removeChild(t),t=null},a.appendChild(t)}):i=function(e){setTimeout(f,0,e)}:(r="setImmediate$"+Math.random()+"$",s=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(r)&&f(+t.data.slice(r.length))},e.addEventListener?e.addEventListener("message",s,!1):e.attachEvent("onmessage",s),i=function(t){e.postMessage(r+t,"*")}),p.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),n=0;n=0&&(e._idleTimeoutId=setTimeout(function(){e._onTimeout&&e._onTimeout()},t))},n(71),t.setImmediate=setImmediate,t.clearImmediate=clearImmediate},function(e,t,n){"use strict";(function(e){Object.defineProperty(t,"__esModule",{value:!0});var i,a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o=n(70),r=(i=o)&&i.__esModule?i:{default:i};var s=setTimeout;function l(){}function c(e){if(!(this instanceof c))throw new TypeError("Promises must be constructed via new");if("function"!=typeof e)throw new TypeError("not a function");this._state=0,this._handled=!1,this._value=void 0,this._deferreds=[],f(e,this)}function u(e,t){for(;3===e._state;)e=e._value;0!==e._state?(e._handled=!0,c._immediateFn(function(){var n=1===e._state?t.onFulfilled:t.onRejected;if(null!==n){var i;try{i=n(e._value)}catch(e){return void p(t.promise,e)}d(t.promise,i)}else(1===e._state?d:p)(t.promise,e._value)})):e._deferreds.push(t)}function d(e,t){try{if(t===e)throw new TypeError("A promise cannot be resolved with itself.");if(t&&("object"===(void 0===t?"undefined":a(t))||"function"==typeof t)){var n=t.then;if(t instanceof c)return e._state=3,e._value=t,void h(e);if("function"==typeof n)return void f((i=n,o=t,function(){i.apply(o,arguments)}),e)}e._state=1,e._value=t,h(e)}catch(t){p(e,t)}var i,o}function p(e,t){e._state=2,e._value=t,h(e)}function h(e){2===e._state&&0===e._deferreds.length&&c._immediateFn(function(){e._handled||c._unhandledRejectionFn(e._value)});for(var t=0,n=e._deferreds.length;te&&this.notice(this.tran("REW")+" "+(this.video.currentTime-e).toFixed(0)+" "+this.tran("s")),this.video.currentTime=e,this.danmaku&&this.danmaku.seek(),this.bar.set("played",e/this.video.duration,"width"),this.template.ptime.innerHTML=o.default.secondToTime(e)}},{key:"play",value:function(){var e=this;if(this.paused=!1,this.video.paused&&this.bezel.switch(c.default.play),this.template.playButton.innerHTML=c.default.pause,a.default.resolve(this.video.play()).catch(function(){e.pause()}).then(function(){}),this.timer.enable("loading"),this.container.classList.remove("dplayer-paused"),this.container.classList.add("dplayer-playing"),this.danmaku&&this.danmaku.play(),this.options.mutex)for(var t=0;t=.95?this.template.volumeIcon.innerHTML=c.default.volumeUp:this.volume()>0?this.template.volumeIcon.innerHTML=c.default.volumeDown:this.template.volumeIcon.innerHTML=c.default.volumeOff}},{key:"volume",value:function(e,t,n){if(e=parseFloat(e),!isNaN(e)){e=Math.max(e,0),e=Math.min(e,1),this.bar.set("volume",e,"width");var i=(100*e).toFixed(0)+"%";this.template.volumeBarWrapWrap.dataset.balloon=i,t||this.user.set("volume",e),n||this.notice(this.tran("Volume")+" "+(100*e).toFixed(0)+"%"),this.video.volume=e,this.video.muted&&(this.video.muted=!1),this.switchVolumeIcon()}return this.video.volume}},{key:"toggle",value:function(){this.video.paused?this.play():this.pause()}},{key:"on",value:function(e,t){this.events.on(e,t)}},{key:"switchVideo",value:function(e,t){this.pause(),this.video.poster=e.pic?e.pic:"",this.video.src=e.url,this.initMSE(this.video,e.type||"auto"),t&&(this.template.danmakuLoading.style.display="block",this.bar.set("played",0,"width"),this.bar.set("loaded",0,"width"),this.template.ptime.innerHTML="00:00",this.template.danmaku.innerHTML="",this.danmaku&&this.danmaku.reload({id:t.id,address:t.api,token:t.token,maximum:t.maximum,addition:t.addition,user:t.user}))}},{key:"initMSE",value:function(e,t){var n=this;if(this.type=t,this.options.video.customType&&this.options.video.customType[t])"[object Function]"===Object.prototype.toString.call(this.options.video.customType[t])?this.options.video.customType[t](this.video,this):console.error("Illegal customType: "+t);else switch("auto"===this.type&&(/m3u8(#|\?|$)/i.exec(e.src)?this.type="hls":/.flv(#|\?|$)/i.exec(e.src)?this.type="flv":/.mpd(#|\?|$)/i.exec(e.src)?this.type="dash":this.type="normal"),"hls"===this.type&&(e.canPlayType("application/x-mpegURL")||e.canPlayType("application/vnd.apple.mpegURL"))&&(this.type="normal"),this.type){case"hls":if(Hls)if(Hls.isSupported()){var i=new Hls;i.loadSource(e.src),i.attachMedia(e)}else this.notice("Error: Hls is not supported.");else this.notice("Error: Can't find Hls.");break;case"flv":if(flvjs&&flvjs.isSupported())if(flvjs.isSupported()){var a=flvjs.createPlayer({type:"flv",url:e.src});a.attachMediaElement(e),a.load()}else this.notice("Error: flvjs is not supported.");else this.notice("Error: Can't find flvjs.");break;case"dash":dashjs?dashjs.MediaPlayer().create().initialize(e,e.src,!1):this.notice("Error: Can't find dashjs.");break;case"webtorrent":if(WebTorrent)if(WebTorrent.WEBRTC_SUPPORT){this.container.classList.add("dplayer-loading");var o=new WebTorrent,r=e.src;o.add(r,function(e){e.files.find(function(e){return e.name.endsWith(".mp4")}).renderTo(n.video,{autoplay:n.options.autoplay},function(){n.container.classList.remove("dplayer-loading")})})}else this.notice("Error: Webtorrent is not supported.");else this.notice("Error: Can't find Webtorrent.")}}},{key:"initVideo",value:function(e,t){var n=this;this.initMSE(e,t),this.on("durationchange",function(){1!==e.duration&&e.duration!==1/0&&(n.template.dtime.innerHTML=o.default.secondToTime(e.duration))}),this.on("progress",function(){var t=e.buffered.length?e.buffered.end(e.buffered.length-1)/e.duration:0;n.bar.set("loaded",t,"width")}),this.on("error",function(){n.video.error&&n.tran&&n.notice&&(n.type,n.notice(n.tran("Video load failed"),-1))}),this.on("ended",function(){n.bar.set("played",1,"width"),n.setting.loop?(n.seek(0),n.play()):n.pause(),n.danmaku&&(n.danmaku.danIndex=0)}),this.on("play",function(){n.paused&&n.play()}),this.on("pause",function(){n.paused||n.pause()}),this.on("timeupdate",function(){n.bar.set("played",n.video.currentTime/n.video.duration,"width");var e=o.default.secondToTime(n.video.currentTime);n.template.ptime.innerHTML!==e&&(n.template.ptime.innerHTML=e)});for(var i=function(t){e.addEventListener(n.events.videoEvents[t],function(){n.events.trigger(n.events.videoEvents[t])})},a=0;a1&&void 0!==arguments[1]?arguments[1]:2e3,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:.8;this.template.notice.innerHTML=e,this.template.notice.style.opacity=i,this.noticeTime&&clearTimeout(this.noticeTime),this.events.trigger("notice_show",e),n>0&&(this.noticeTime=setTimeout(function(){t.template.notice.style.opacity=0,t.events.trigger("notice_hide")},n))}},{key:"resize",value:function(){this.danmaku&&this.danmaku.resize(),this.events.trigger("resize")}},{key:"speed",value:function(e){this.video.playbackRate=e}},{key:"destroy",value:function(){M.splice(M.indexOf(this),1),this.pause(),this.controller.destroy(),this.timer.destroy(),this.video.src="",this.container.innerHTML="",this.events.trigger("destroy")}}],[{key:"version",get:function(){return"1.25.0"}}]),e}();t.default=_},,,function(e,t,n){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),n(77);var i,a=n(74),o=(i=a)&&i.__esModule?i:{default:i};"",t.default=o.default}]).default}); +//# sourceMappingURL=DPlayer.min.js.map \ No newline at end of file diff --git a/templates/player/p2pplayer/images/line.png b/templates/player/p2pplayer/images/line.png new file mode 100644 index 0000000..ac6bee4 Binary files /dev/null and b/templates/player/p2pplayer/images/line.png differ diff --git a/templates/player/p2pplayer/images/list.png b/templates/player/p2pplayer/images/list.png new file mode 100644 index 0000000..818c27e Binary files /dev/null and b/templates/player/p2pplayer/images/list.png differ diff --git a/templates/player/p2pplayer/images/loading_pc.jpg b/templates/player/p2pplayer/images/loading_pc.jpg new file mode 100644 index 0000000..88cd8e7 Binary files /dev/null and b/templates/player/p2pplayer/images/loading_pc.jpg differ diff --git a/templates/player/p2pplayer/images/next.png b/templates/player/p2pplayer/images/next.png new file mode 100644 index 0000000..58c5035 Binary files /dev/null and b/templates/player/p2pplayer/images/next.png differ diff --git a/templates/player/p2pplayer/images/pront.png b/templates/player/p2pplayer/images/pront.png new file mode 100644 index 0000000..259c761 Binary files /dev/null and b/templates/player/p2pplayer/images/pront.png differ diff --git a/templates/player/p2pplayer/index.htm b/templates/player/p2pplayer/index.htm new file mode 100644 index 0000000..59f434f --- /dev/null +++ b/templates/player/p2pplayer/index.htm @@ -0,0 +1,61 @@ + + + + + + + M3U8-P2P云播 + + + + + + +
+
+
+

+
+
+ + + + + diff --git a/templates/player/p2pplayer/p2p.min.js b/templates/player/p2pplayer/p2p.min.js new file mode 100644 index 0000000..bdea850 --- /dev/null +++ b/templates/player/p2pplayer/p2p.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.P2PEngine=t():e.P2PEngine=t()}("undefined"!=typeof self?self:this,function(){return function(e){function t(n){if(r[n])return r[n].exports;var i=r[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var r={};return t.m=e,t.c=r,t.d=function(e,r,n){t.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=6)}([function(e,t){function r(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function n(e){return"function"==typeof e}function i(e){return"number"==typeof e}function a(e){return"object"==typeof e&&null!==e}function o(e){return void 0===e}e.exports=r,r.EventEmitter=r,r.prototype._events=void 0,r.prototype._maxListeners=void 0,r.defaultMaxListeners=10,r.prototype.setMaxListeners=function(e){if(!i(e)||e<0||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},r.prototype.emit=function(e){var t,r,i,s,u,l;if(this._events||(this._events={}),"error"===e&&(!this._events.error||a(this._events.error)&&!this._events.error.length)){if((t=arguments[1])instanceof Error)throw t;var c=new Error('Uncaught, unspecified "error" event. ('+t+")");throw c.context=t,c}if(r=this._events[e],o(r))return!1;if(n(r))switch(arguments.length){case 1:r.call(this);break;case 2:r.call(this,arguments[1]);break;case 3:r.call(this,arguments[1],arguments[2]);break;default:s=Array.prototype.slice.call(arguments,1),r.apply(this,s)}else if(a(r))for(s=Array.prototype.slice.call(arguments,1),l=r.slice(),i=l.length,u=0;u0&&this._events[e].length>i&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace()),this},r.prototype.on=r.prototype.addListener,r.prototype.once=function(e,t){function r(){this.removeListener(e,r),i||(i=!0,t.apply(this,arguments))}if(!n(t))throw TypeError("listener must be a function");var i=!1;return r.listener=t,this.on(e,r),this},r.prototype.removeListener=function(e,t){var r,i,o,s;if(!n(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(r=this._events[e],o=r.length,i=-1,r===t||n(r.listener)&&r.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(a(r)){for(s=o;s-- >0;)if(r[s]===t||r[s].listener&&r[s].listener===t){i=s;break}if(i<0)return this;1===r.length?(r.length=0,delete this._events[e]):r.splice(i,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},r.prototype.removeAllListeners=function(e){var t,r;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r=this._events[e],n(r))this.removeListener(e,r);else if(r)for(;r.length;)this.removeListener(e,r[r.length-1]);return delete this._events[e],this},r.prototype.listeners=function(e){return this._events&&this._events[e]?n(this._events[e])?[this._events[e]]:this._events[e].slice():[]},r.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(n(t))return 1;if(t)return t.length}return 0},r.listenerCount=function(e,t){return e.listenerCount(t)}},function(e,t,r){"use strict";(function(e){var r,n,i,a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};!function(o,s){"object"==a(t)&&"object"==a(e)?e.exports=s():(n=[],r=s,void 0!==(i="function"==typeof r?r.apply(t,n):r)&&(e.exports=i))}("undefined"!=typeof self&&self,function(){return function(e){function t(n){if(r[n])return r[n].exports;var i=r[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var r={};return t.m=e,t.c=r,t.d=function(e,r,n){t.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=18)}([function(e,t){var r;r=function(){return this}();try{r=r||Function("return this")()||(0,eval)("this")}catch(e){"object"==("undefined"==typeof window?"undefined":a(window))&&(r=window)}e.exports=r},function(e,t){function r(){throw new Error("setTimeout has not been defined")}function n(){throw new Error("clearTimeout has not been defined")}function i(e){if(c===setTimeout)return setTimeout(e,0);if((c===r||!c)&&setTimeout)return c=setTimeout,setTimeout(e,0);try{return c(e,0)}catch(t){try{return c.call(null,e,0)}catch(t){return c.call(this,e,0)}}}function a(e){if(d===clearTimeout)return clearTimeout(e);if((d===n||!d)&&clearTimeout)return d=clearTimeout,clearTimeout(e);try{return d(e)}catch(t){try{return d.call(null,e)}catch(t){return d.call(this,e)}}}function o(){g&&h&&(g=!1,h.length?p=h.concat(p):v=-1,p.length&&s())}function s(){if(!g){var e=i(o);g=!0;for(var t=p.length;t;){for(h=p,p=[];++v1)for(var r=1;r=n())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+n().toString(16)+" bytes");return 0|e}function g(e){return+e!=e&&(e=0),a.alloc(+e)}function v(e,t){if(a.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var r=e.length;if(0===r)return 0;for(var n=!1;;)switch(t){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":case void 0:return W(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return V(e).length;default:if(n)return W(e).length;t=(""+t).toLowerCase(),n=!0}}function y(e,t,r){var n=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if(r>>>=0,t>>>=0,r<=t)return"";for(e||(e="utf8");;)switch(e){case"hex":return P(this,t,r);case"utf8":case"utf-8":return C(this,t,r);case"ascii":return D(this,t,r);case"latin1":case"binary":return I(this,t,r);case"base64":return L(this,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return O(this,t,r);default:if(n)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),n=!0}}function m(e,t,r){var n=e[t];e[t]=e[r],e[r]=n}function b(e,t,r,n,i){if(0===e.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),r=+r,isNaN(r)&&(r=i?0:e.length-1),r<0&&(r=e.length+r),r>=e.length){if(i)return-1;r=e.length-1}else if(r<0){if(!i)return-1;r=0}if("string"==typeof t&&(t=a.from(t,n)),a.isBuffer(t))return 0===t.length?-1:_(e,t,r,n,i);if("number"==typeof t)return t&=255,a.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(e,t,r):Uint8Array.prototype.lastIndexOf.call(e,t,r):_(e,[t],r,n,i);throw new TypeError("val must be string, number or Buffer")}function _(e,t,r,n,i){function a(e,t){return 1===o?e[t]:e.readUInt16BE(t*o)}var o=1,s=e.length,u=t.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(e.length<2||t.length<2)return-1;o=2,s/=2,u/=2,r/=2}var l;if(i){var c=-1;for(l=r;ls&&(r=s-u),l=r;l>=0;l--){for(var d=!0,f=0;fi&&(n=i):n=i;var a=t.length;if(a%2!=0)throw new TypeError("Invalid hex string");n>a/2&&(n=a/2);for(var o=0;o239?4:a>223?3:a>191?2:1;if(i+s<=r){var u,l,c,d;switch(s){case 1:a<128&&(o=a);break;case 2:128==(192&(u=e[i+1]))&&(d=(31&a)<<6|63&u)>127&&(o=d);break;case 3:u=e[i+1],l=e[i+2],128==(192&u)&&128==(192&l)&&(d=(15&a)<<12|(63&u)<<6|63&l)>2047&&(d<55296||d>57343)&&(o=d);break;case 4:u=e[i+1],l=e[i+2],c=e[i+3],128==(192&u)&&128==(192&l)&&128==(192&c)&&(d=(15&a)<<18|(63&u)<<12|(63&l)<<6|63&c)>65535&&d<1114112&&(o=d)}}null===o?(o=65533,s=1):o>65535&&(o-=65536,n.push(o>>>10&1023|55296),o=56320|1023&o),n.push(o),i+=s}return k(n)}function k(e){var t=e.length;if(t<=Z)return String.fromCharCode.apply(String,e);for(var r="",n=0;nn)&&(r=n);for(var i="",a=t;ar)throw new RangeError("Trying to access beyond buffer length")}function M(e,t,r,n,i,o){if(!a.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>i||te.length)throw new RangeError("Index out of range")}function F(e,t,r,n){t<0&&(t=65535+t+1);for(var i=0,a=Math.min(e.length-r,2);i>>8*(n?i:1-i)}function N(e,t,r,n){t<0&&(t=4294967295+t+1);for(var i=0,a=Math.min(e.length-r,4);i>>8*(n?i:3-i)&255}function U(e,t,r,n,i,a){if(r+n>e.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function B(e,t,r,n,i){return i||U(e,t,r,4,3.4028234663852886e38,-3.4028234663852886e38),J.write(e,t,r,n,23,4),r+4}function G(e,t,r,n,i){return i||U(e,t,r,8,1.7976931348623157e308,-1.7976931348623157e308),J.write(e,t,r,n,52,8),r+8}function j(e){if(e=K(e).replace(ee,""),e.length<2)return"";for(;e.length%4!=0;)e+="=";return e}function K(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}function H(e){return e<16?"0"+e.toString(16):e.toString(16)}function W(e,t){t=t||1/0;for(var r,n=e.length,i=null,a=[],o=0;o55295&&r<57344){if(!i){if(r>56319){(t-=3)>-1&&a.push(239,191,189);continue}if(o+1===n){(t-=3)>-1&&a.push(239,191,189);continue}i=r;continue}if(r<56320){(t-=3)>-1&&a.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(t-=3)>-1&&a.push(239,191,189);if(i=null,r<128){if((t-=1)<0)break;a.push(r)}else if(r<2048){if((t-=2)<0)break;a.push(r>>6|192,63&r|128)}else if(r<65536){if((t-=3)<0)break;a.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;a.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return a}function Y(e){for(var t=[],r=0;r>8,i=r%256,a.push(i),a.push(n);return a}function V(e){return Q.toByteArray(j(e))}function z(e,t,r,n){for(var i=0;i=t.length||i>=e.length);++i)t[i+r]=e[i];return i}function X(e){return e!==e}var Q=r(21),J=r(22),$=r(9);t.Buffer=a,t.SlowBuffer=g,t.INSPECT_MAX_BYTES=50,a.TYPED_ARRAY_SUPPORT=void 0!==e.TYPED_ARRAY_SUPPORT?e.TYPED_ARRAY_SUPPORT:function(){try{var e=new Uint8Array(1);return e.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===e.foo()&&"function"==typeof e.subarray&&0===e.subarray(1,1).byteLength}catch(e){return!1}}(),t.kMaxLength=n(),a.poolSize=8192,a._augment=function(e){return e.__proto__=a.prototype,e},a.from=function(e,t,r){return o(null,e,t,r)},a.TYPED_ARRAY_SUPPORT&&(a.prototype.__proto__=Uint8Array.prototype,a.__proto__=Uint8Array,"undefined"!=typeof Symbol&&Symbol.species&&a[Symbol.species]===a&&Object.defineProperty(a,Symbol.species,{value:null,configurable:!0})),a.alloc=function(e,t,r){return u(null,e,t,r)},a.allocUnsafe=function(e){return l(null,e)},a.allocUnsafeSlow=function(e){return l(null,e)},a.isBuffer=function(e){return!(null==e||!e._isBuffer)},a.compare=function(e,t){if(!a.isBuffer(e)||!a.isBuffer(t))throw new TypeError("Arguments must be Buffers");if(e===t)return 0;for(var r=e.length,n=t.length,i=0,o=Math.min(r,n);i0&&(e=this.toString("hex",0,r).match(/.{2}/g).join(" "),this.length>r&&(e+=" ... ")),""},a.prototype.compare=function(e,t,r,n,i){if(!a.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===r&&(r=e?e.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),t<0||r>e.length||n<0||i>this.length)throw new RangeError("out of range index");if(n>=i&&t>=r)return 0;if(n>=i)return-1;if(t>=r)return 1;if(t>>>=0,r>>>=0,n>>>=0,i>>>=0,this===e)return 0;for(var o=i-n,s=r-t,u=Math.min(o,s),l=this.slice(n,i),c=e.slice(t,r),d=0;di)&&(r=i),e.length>0&&(r<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var a=!1;;)switch(n){case"hex":return E(this,e,t,r);case"utf8":case"utf-8":return w(this,e,t,r);case"ascii":return T(this,e,t,r);case"latin1":case"binary":return S(this,e,t,r);case"base64":return R(this,e,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return A(this,e,t,r);default:if(a)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),a=!0}},a.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var Z=4096;a.prototype.slice=function(e,t){var r=this.length;e=~~e,t=void 0===t?r:~~t,e<0?(e+=r)<0&&(e=0):e>r&&(e=r),t<0?(t+=r)<0&&(t=0):t>r&&(t=r),t0&&(i*=256);)n+=this[e+--t]*i;return n},a.prototype.readUInt8=function(e,t){return t||x(e,1,this.length),this[e]},a.prototype.readUInt16LE=function(e,t){return t||x(e,2,this.length),this[e]|this[e+1]<<8},a.prototype.readUInt16BE=function(e,t){return t||x(e,2,this.length),this[e]<<8|this[e+1]},a.prototype.readUInt32LE=function(e,t){return t||x(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},a.prototype.readUInt32BE=function(e,t){return t||x(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},a.prototype.readIntLE=function(e,t,r){e|=0,t|=0,r||x(e,t,this.length);for(var n=this[e],i=1,a=0;++a=i&&(n-=Math.pow(2,8*t)),n},a.prototype.readIntBE=function(e,t,r){e|=0,t|=0,r||x(e,t,this.length);for(var n=t,i=1,a=this[e+--n];n>0&&(i*=256);)a+=this[e+--n]*i;return i*=128,a>=i&&(a-=Math.pow(2,8*t)),a},a.prototype.readInt8=function(e,t){return t||x(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},a.prototype.readInt16LE=function(e,t){t||x(e,2,this.length);var r=this[e]|this[e+1]<<8;return 32768&r?4294901760|r:r},a.prototype.readInt16BE=function(e,t){t||x(e,2,this.length);var r=this[e+1]|this[e]<<8;return 32768&r?4294901760|r:r},a.prototype.readInt32LE=function(e,t){return t||x(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},a.prototype.readInt32BE=function(e,t){return t||x(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},a.prototype.readFloatLE=function(e,t){return t||x(e,4,this.length),J.read(this,e,!0,23,4)},a.prototype.readFloatBE=function(e,t){return t||x(e,4,this.length),J.read(this,e,!1,23,4)},a.prototype.readDoubleLE=function(e,t){return t||x(e,8,this.length),J.read(this,e,!0,52,8)},a.prototype.readDoubleBE=function(e,t){return t||x(e,8,this.length),J.read(this,e,!1,52,8)},a.prototype.writeUIntLE=function(e,t,r,n){e=+e,t|=0,r|=0,n||M(this,e,t,r,Math.pow(2,8*r)-1,0);var i=1,a=0;for(this[t]=255&e;++a=0&&(a*=256);)this[t+i]=e/a&255;return t+r},a.prototype.writeUInt8=function(e,t,r){return e=+e,t|=0,r||M(this,e,t,1,255,0),a.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},a.prototype.writeUInt16LE=function(e,t,r){return e=+e,t|=0,r||M(this,e,t,2,65535,0),a.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):F(this,e,t,!0),t+2},a.prototype.writeUInt16BE=function(e,t,r){return e=+e,t|=0,r||M(this,e,t,2,65535,0),a.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):F(this,e,t,!1),t+2},a.prototype.writeUInt32LE=function(e,t,r){return e=+e,t|=0,r||M(this,e,t,4,4294967295,0),a.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):N(this,e,t,!0),t+4},a.prototype.writeUInt32BE=function(e,t,r){return e=+e,t|=0,r||M(this,e,t,4,4294967295,0),a.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):N(this,e,t,!1),t+4},a.prototype.writeIntLE=function(e,t,r,n){if(e=+e,t|=0,!n){var i=Math.pow(2,8*r-1);M(this,e,t,r,i-1,-i)}var a=0,o=1,s=0;for(this[t]=255&e;++a>0)-s&255;return t+r},a.prototype.writeIntBE=function(e,t,r,n){if(e=+e,t|=0,!n){var i=Math.pow(2,8*r-1);M(this,e,t,r,i-1,-i)}var a=r-1,o=1,s=0;for(this[t+a]=255&e;--a>=0&&(o*=256);)e<0&&0===s&&0!==this[t+a+1]&&(s=1),this[t+a]=(e/o>>0)-s&255;return t+r},a.prototype.writeInt8=function(e,t,r){return e=+e,t|=0,r||M(this,e,t,1,127,-128),a.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},a.prototype.writeInt16LE=function(e,t,r){return e=+e,t|=0,r||M(this,e,t,2,32767,-32768),a.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):F(this,e,t,!0),t+2},a.prototype.writeInt16BE=function(e,t,r){return e=+e,t|=0,r||M(this,e,t,2,32767,-32768),a.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):F(this,e,t,!1),t+2},a.prototype.writeInt32LE=function(e,t,r){return e=+e,t|=0,r||M(this,e,t,4,2147483647,-2147483648),a.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):N(this,e,t,!0),t+4},a.prototype.writeInt32BE=function(e,t,r){return e=+e,t|=0,r||M(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),a.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):N(this,e,t,!1),t+4},a.prototype.writeFloatLE=function(e,t,r){return B(this,e,t,!0,r)},a.prototype.writeFloatBE=function(e,t,r){return B(this,e,t,!1,r)},a.prototype.writeDoubleLE=function(e,t,r){return G(this,e,t,!0,r)},a.prototype.writeDoubleBE=function(e,t,r){return G(this,e,t,!1,r)},a.prototype.copy=function(e,t,r,n){if(r||(r=0),n||0===n||(n=this.length),t>=e.length&&(t=e.length),t||(t=0),n>0&&n=this.length)throw new RangeError("sourceStart out of bounds");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),e.length-t=0;--i)e[i+t]=this[i+r];else if(o<1e3||!a.TYPED_ARRAY_SUPPORT)for(i=0;i>>=0,r=void 0===r?this.length:r>>>0,e||(e=0);var o;if("number"==typeof e)for(o=t;o0&&this._events[e].length>i&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace()),this},r.prototype.on=r.prototype.addListener,r.prototype.once=function(e,t){function r(){this.removeListener(e,r),i||(i=!0,t.apply(this,arguments))}if(!n(t))throw TypeError("listener must be a function");var i=!1;return r.listener=t,this.on(e,r),this},r.prototype.removeListener=function(e,t){var r,i,a,s;if(!n(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(r=this._events[e],a=r.length,i=-1,r===t||n(r.listener)&&r.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(o(r)){for(s=a;s-- >0;)if(r[s]===t||r[s].listener&&r[s].listener===t){i=s;break}if(i<0)return this;1===r.length?(r.length=0,delete this._events[e]):r.splice(i,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},r.prototype.removeAllListeners=function(e){var t,r;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r=this._events[e],n(r))this.removeListener(e,r);else if(r)for(;r.length;)this.removeListener(e,r[r.length-1]);return delete this._events[e],this},r.prototype.listeners=function(e){return this._events&&this._events[e]?n(this._events[e])?[this._events[e]]:this._events[e].slice():[]},r.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(n(t))return 1;if(t)return t.length}return 0},r.listenerCount=function(e,t){return e.listenerCount(t)}},function(e,t){var r={}.toString;e.exports=Array.isArray||function(e){return"[object Array]"==r.call(e)}},function(e,t){e.exports=function(){if("undefined"==typeof window)return null;var e={RTCPeerConnection:window.RTCPeerConnection||window.mozRTCPeerConnection||window.webkitRTCPeerConnection,RTCSessionDescription:window.RTCSessionDescription||window.mozRTCSessionDescription||window.webkitRTCSessionDescription,RTCIceCandidate:window.RTCIceCandidate||window.mozRTCIceCandidate||window.webkitRTCIceCandidate};return e.RTCPeerConnection?e:null}},function(e,t,r){(function(t,n){function i(e){return N.from(e)}function a(e){return N.isBuffer(e)||e instanceof U}function o(e,t,r){if("function"==typeof e.prependListener)return e.prependListener(t,r);e._events&&e._events[t]?x(e._events[t])?e._events[t].unshift(r):e._events[t]=[r,e._events[t]]:e.on(t,r)}function s(e,t){O=O||r(3),e=e||{};var n=t instanceof O;this.objectMode=!!e.objectMode,n&&(this.objectMode=this.objectMode||!!e.readableObjectMode);var i=e.highWaterMark,a=e.readableHighWaterMark,o=this.objectMode?16:16384;this.highWaterMark=i||0===i?i:n&&(a||0===a)?a:o,this.highWaterMark=Math.floor(this.highWaterMark),this.buffer=new H,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.destroyed=!1,this.defaultEncoding=e.defaultEncoding||"utf8",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,e.encoding&&(K||(K=r(15).StringDecoder),this.decoder=new K(e.encoding),this.encoding=e.encoding)}function u(e){if(O=O||r(3),!(this instanceof u))return new u(e);this._readableState=new s(e,this),this.readable=!0,e&&("function"==typeof e.read&&(this._read=e.read),"function"==typeof e.destroy&&(this._destroy=e.destroy)),F.call(this)}function l(e,t,r,n,a){var o=e._readableState;if(null===t)o.reading=!1,g(e,o);else{var s;a||(s=d(o,t)),s?e.emit("error",s):o.objectMode||t&&t.length>0?("string"==typeof t||o.objectMode||Object.getPrototypeOf(t)===N.prototype||(t=i(t)),n?o.endEmitted?e.emit("error",new Error("stream.unshift() after end event")):c(e,o,t,!0):o.ended?e.emit("error",new Error("stream.push() after EOF")):(o.reading=!1,o.decoder&&!r?(t=o.decoder.write(t),o.objectMode||0!==t.length?c(e,o,t,!1):m(e,o)):c(e,o,t,!1))):n||(o.reading=!1)}return f(o)}function c(e,t,r,n){t.flowing&&0===t.length&&!t.sync?(e.emit("data",r),e.read(0)):(t.length+=t.objectMode?1:r.length,n?t.buffer.unshift(r):t.buffer.push(r),t.needReadable&&v(e)),m(e,t)}function d(e,t){var r;return a(t)||"string"==typeof t||void 0===t||e.objectMode||(r=new TypeError("Invalid non-string/buffer chunk")),r}function f(e){return!e.ended&&(e.needReadable||e.length=q?e=q:(e--,e|=e>>>1,e|=e>>>2,e|=e>>>4,e|=e>>>8,e|=e>>>16,e++),e}function p(e,t){return e<=0||0===t.length&&t.ended?0:t.objectMode?1:e!==e?t.flowing&&t.length?t.buffer.head.data.length:t.length:(e>t.highWaterMark&&(t.highWaterMark=h(e)),e<=t.length?e:t.ended?t.length:(t.needReadable=!0,0))}function g(e,t){if(!t.ended){if(t.decoder){var r=t.decoder.end();r&&r.length&&(t.buffer.push(r),t.length+=t.objectMode?1:r.length)}t.ended=!0,v(e)}}function v(e){var t=e._readableState;t.needReadable=!1,t.emittedReadable||(j("emitReadable",t.flowing),t.emittedReadable=!0,t.sync?P.nextTick(y,e):y(e))}function y(e){j("emit readable"),e.emit("readable"),S(e)}function m(e,t){t.readingMore||(t.readingMore=!0,P.nextTick(b,e,t))}function b(e,t){for(var r=t.length;!t.reading&&!t.flowing&&!t.ended&&t.length=t.length?(r=t.decoder?t.buffer.join(""):1===t.buffer.length?t.buffer.head.data:t.buffer.concat(t.length),t.buffer.clear()):r=A(e,t.buffer,t.decoder),r}function A(e,t,r){var n;return ea.length?a.length:e;if(o===a.length?i+=a:i+=a.slice(0,e),0==(e-=o)){o===a.length?(++n,r.next?t.head=r.next:t.head=t.tail=null):(t.head=r,r.data=a.slice(o));break}++n}return t.length-=n,i}function C(e,t){var r=N.allocUnsafe(e),n=t.head,i=1;for(n.data.copy(r),e-=n.data.length;n=n.next;){var a=n.data,o=e>a.length?a.length:e;if(a.copy(r,r.length-e,0,o),0==(e-=o)){o===a.length?(++i,n.next?t.head=n.next:t.head=t.tail=null):(t.head=n,n.data=a.slice(o));break}++i}return t.length-=i,r}function k(e){var t=e._readableState;if(t.length>0)throw new Error('"endReadable()" called on non-empty stream');t.endEmitted||(t.ended=!0,P.nextTick(D,t,e))}function D(e,t){e.endEmitted||0!==e.length||(e.endEmitted=!0,t.readable=!1,t.emit("end"))}function I(e,t){for(var r=0,n=e.length;r=t.highWaterMark||t.ended))return j("read: emitReadable",t.length,t.ended),0===t.length&&t.ended?k(this):v(this),null;if(0===(e=p(e,t))&&t.ended)return 0===t.length&&k(this),null;var n=t.needReadable;j("need readable",n),(0===t.length||t.length-e0?R(e,t):null,null===i?(t.needReadable=!0,e=0):t.length-=e,0===t.length&&(t.ended||(t.needReadable=!0),r!==e&&t.ended&&k(this)),null!==i&&this.emit("data",i),i},u.prototype._read=function(e){this.emit("error",new Error("_read() is not implemented"))},u.prototype.pipe=function(e,t){function r(e,t){j("onunpipe"),e===f&&t&&!1===t.hasUnpiped&&(t.hasUnpiped=!0,a())}function i(){j("onend"),e.end()}function a(){j("cleanup"),e.removeListener("close",l),e.removeListener("finish",c),e.removeListener("drain",v),e.removeListener("error",u),e.removeListener("unpipe",r),f.removeListener("end",i),f.removeListener("end",d),f.removeListener("data",s),y=!0,!h.awaitDrain||e._writableState&&!e._writableState.needDrain||v()}function s(t){j("ondata"),m=!1,!1!==e.write(t)||m||((1===h.pipesCount&&h.pipes===e||h.pipesCount>1&&-1!==I(h.pipes,e))&&!y&&(j("false write response, pause",f._readableState.awaitDrain),f._readableState.awaitDrain++,m=!0),f.pause())}function u(t){j("onerror",t),d(),e.removeListener("error",u),0===M(e,"error")&&e.emit("error",t)}function l(){e.removeListener("finish",c),d()}function c(){j("onfinish"),e.removeListener("close",l),d()}function d(){j("unpipe"),f.unpipe(e)}var f=this,h=this._readableState;switch(h.pipesCount){case 0:h.pipes=e;break;case 1:h.pipes=[h.pipes,e];break;default:h.pipes.push(e)}h.pipesCount+=1,j("pipe count=%d opts=%j",h.pipesCount,t);var p=(!t||!1!==t.end)&&e!==n.stdout&&e!==n.stderr,g=p?i:d;h.endEmitted?P.nextTick(g):f.once("end",g),e.on("unpipe",r);var v=_(f);e.on("drain",v);var y=!1,m=!1;return f.on("data",s),o(e,"error",u),e.once("close",l),e.once("finish",c),e.emit("pipe",f),h.flowing||(j("pipe resume"),f.resume()),e},u.prototype.unpipe=function(e){var t=this._readableState,r={hasUnpiped:!1};if(0===t.pipesCount)return this;if(1===t.pipesCount)return e&&e!==t.pipes?this:(e||(e=t.pipes),t.pipes=null,t.pipesCount=0,t.flowing=!1,e&&e.emit("unpipe",this,r),this);if(!e){var n=t.pipes,i=t.pipesCount;t.pipes=null,t.pipesCount=0,t.flowing=!1;for(var a=0;a-1?n:C.nextTick;c.WritableState=l;var I=r(6);I.inherits=r(2);var P={deprecate:r(33)},O=r(12),x=r(5).Buffer,M=i.Uint8Array||function(){},F=r(13);I.inherits(c,O),l.prototype.getBuffer=function(){for(var e=this.bufferedRequest,t=[];e;)t.push(e),e=e.next;return t},function(){try{Object.defineProperty(l.prototype,"buffer",{get:P.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch(e){}}();var N;"function"==typeof Symbol&&Symbol.hasInstance&&"function"==typeof Function.prototype[Symbol.hasInstance]?(N=Function.prototype[Symbol.hasInstance],Object.defineProperty(c,Symbol.hasInstance,{value:function(e){return!!N.call(this,e)||this===c&&e&&e._writableState instanceof l}})):N=function(e){return e instanceof this},c.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe, not readable"))},c.prototype.write=function(e,t,r){var n=this._writableState,i=!1,a=!n.objectMode&&s(e);return a&&!x.isBuffer(e)&&(e=o(e)),"function"==typeof t&&(r=t,t=null),a?t="buffer":t||(t=n.defaultEncoding),"function"!=typeof r&&(r=u),n.ended?d(this,r):(a||f(this,n,e,r))&&(n.pendingcb++,i=p(this,n,a,e,t,r)),i},c.prototype.cork=function(){this._writableState.corked++},c.prototype.uncork=function(){var e=this._writableState;e.corked&&(e.corked--,e.writing||e.corked||e.finished||e.bufferProcessing||!e.bufferedRequest||E(this,e))},c.prototype.setDefaultEncoding=function(e){if("string"==typeof e&&(e=e.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((e+"").toLowerCase())>-1))throw new TypeError("Unknown encoding: "+e);return this._writableState.defaultEncoding=e,this},Object.defineProperty(c.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),c.prototype._write=function(e,t,r){r(new Error("_write() is not implemented"))},c.prototype._writev=null,c.prototype.end=function(e,t,r){var n=this._writableState;"function"==typeof e?(r=e,e=null,t=null):"function"==typeof t&&(r=t,t=null),null!==e&&void 0!==e&&this.write(e,t),n.corked&&(n.corked=1,this.uncork()),n.ending||n.finished||A(this,n,r)},Object.defineProperty(c.prototype,"destroyed",{get:function(){return void 0!==this._writableState&&this._writableState.destroyed},set:function(e){this._writableState&&(this._writableState.destroyed=e)}}),c.prototype.destroy=F.destroy,c.prototype._undestroy=F.undestroy,c.prototype._destroy=function(e,t){this.end(),t(e)}}).call(t,r(1),r(31).setImmediate,r(0))},function(e,t,r){function n(e){if(!e)return"utf8";for(var t;;)switch(e){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return e;default:if(t)return;e=(""+e).toLowerCase(),t=!0}}function i(e){var t=n(e);if("string"!=typeof t&&(m.isEncoding===b||!b(e)))throw new Error("Unknown encoding: "+e);return t||e}function a(e){this.encoding=i(e);var t;switch(this.encoding){case"utf16le":this.text=f,this.end=h,t=4;break;case"utf8":this.fillLast=l,t=4;break;case"base64":this.text=p,this.end=g,t=3;break;default:return this.write=v,void(this.end=y)}this.lastNeed=0,this.lastTotal=0,this.lastChar=m.allocUnsafe(t)}function o(e){return e<=127?0:e>>5==6?2:e>>4==14?3:e>>3==30?4:e>>6==2?-1:-2}function s(e,t,r){var n=t.length-1;if(n=0?(i>0&&(e.lastNeed=i-1),i):--n=0?(i>0&&(e.lastNeed=i-2),i):--n=0?(i>0&&(2===i?i=0:e.lastNeed=i-3),i):0)}function u(e,t,r){if(128!=(192&t[0]))return e.lastNeed=0,"�";if(e.lastNeed>1&&t.length>1){if(128!=(192&t[1]))return e.lastNeed=1,"�";if(e.lastNeed>2&&t.length>2&&128!=(192&t[2]))return e.lastNeed=2,"�"}}function l(e){var t=this.lastTotal-this.lastNeed,r=u(this,e,t);return void 0!==r?r:this.lastNeed<=e.length?(e.copy(this.lastChar,t,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):(e.copy(this.lastChar,t,0,e.length),void(this.lastNeed-=e.length))}function c(e,t){var r=s(this,e,t);if(!this.lastNeed)return e.toString("utf8",t);this.lastTotal=r;var n=e.length-(r-this.lastNeed);return e.copy(this.lastChar,0,n),e.toString("utf8",t,n)}function d(e){var t=e&&e.length?this.write(e):"";return this.lastNeed?t+"�":t}function f(e,t){if((e.length-t)%2==0){var r=e.toString("utf16le",t);if(r){var n=r.charCodeAt(r.length-1);if(n>=55296&&n<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1],r.slice(0,-1)}return r}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=e[e.length-1],e.toString("utf16le",t,e.length-1)}function h(e){var t=e&&e.length?this.write(e):"";if(this.lastNeed){var r=this.lastTotal-this.lastNeed;return t+this.lastChar.toString("utf16le",0,r)}return t}function p(e,t){var r=(e.length-t)%3;return 0===r?e.toString("base64",t):(this.lastNeed=3-r,this.lastTotal=3,1===r?this.lastChar[0]=e[e.length-1]:(this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1]),e.toString("base64",t,e.length-r))}function g(e){var t=e&&e.length?this.write(e):"";return this.lastNeed?t+this.lastChar.toString("base64",0,3-this.lastNeed):t}function v(e){return e.toString(this.encoding)}function y(e){return e&&e.length?this.write(e):""}var m=r(5).Buffer,b=m.isEncoding||function(e){switch((e=""+e)&&e.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};t.StringDecoder=a,a.prototype.write=function(e){if(0===e.length)return"";var t,r;if(this.lastNeed){if(void 0===(t=this.fillLast(e)))return"";r=this.lastNeed,this.lastNeed=0}else r=0;return r0;){var e=t.msgQueue.shift();t.emit(e.event,e)}};e.once("connect",n),e.on("data",function(e){if("string"==typeof e){var r=JSON.parse(e);if(!t.connected)return void t.msgQueue.push(r);switch(r.event){case g.default.DC_PONG:t._handlePongMsg();break;case g.default.DC_PING:t.sendJson({event:g.default.DC_PONG});break;case g.default.DC_PIECE:t._prepareForBinary(r.attachments,r.url,r.sn,r.size),t.emit(r.event,r);break;case g.default.DC_PIECE_NOT_FOUND:window.clearTimeout(t.requestTimeout),t.requestTimeout=null,t.emit(r.event,r);break;case g.default.DC_REQUEST:t._handleRequestMsg(r);break;case g.default.DC_PIECE_ACK:t._handlePieceAck(),t.emit(r.event,r);break;default:t.emit(r.event,r)}}else t.bufArr.push(e),0==--t.remainAttachments&&(window.clearTimeout(t.requestTimeout),t.requestTimeout=null,t.sendJson({event:g.default.DC_PIECE_ACK,sn:t.bufSN,url:t.bufUrl,size:t.expectedSize}),t._handleBinaryData())}),e.once("close",function(){t.emit(g.default.DC_CLOSE)})}},{key:"sendJson",value:function(e){this.send(JSON.stringify(e))}},{key:"send",value:function(e){this._datachannel&&this._datachannel.connected&&this._datachannel.send(e)}},{key:"sendBitField",value:function(e){this.sendJson({event:g.default.DC_BITFIELD,field:e})}},{key:"sendBuffer",value:function(e,t,r){this.uploading=!0,this.uploadTimeout=window.setTimeout(this._uploadtimeout.bind(this),1e3*this.config.dcUploadTimeout);var n=r.byteLength,i=this.config.packetSize,a=0,o=0;n%i==0?o=n/i:(o=Math.floor(n/i)+1,a=n%i);var s={event:g.default.DC_PIECE,attachments:o,url:t,sn:e,size:n};this.sendJson(s);for(var l=u(r,i,o,a),c=0;c1&&void 0!==arguments[1]&&arguments[1],r={event:g.default.DC_REQUEST,url:e,urgent:t};this.downloading=!0,this.sendJson(r),t&&(this.requestTimeout=window.setTimeout(this._loadtimeout.bind(this),1e3*this.config.dcRequestTimeout))}},{key:"requestDataBySN",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r={event:g.default.DC_REQUEST,sn:e,urgent:t};this.downloading=!0,this.sendJson(r),t&&(this.requestTimeout=window.setTimeout(this._loadtimeout.bind(this),1e3*this.config.dcRequestTimeout))}},{key:"close",value:function(){this.destroy()}},{key:"receiveSignal",value:function(e){this._datachannel.signal(e)}},{key:"destroy",value:function(){window.clearInterval(this.adjustSRInterval),window.clearInterval(this.pinger),this._datachannel.removeAllListeners(),this.removeAllListeners(),this._datachannel.destroy()}},{key:"_handleRequestMsg",value:function(e){this.rcvdReqQueue.length>0?e.urgent?this.rcvdReqQueue.push(e.sn):this.rcvdReqQueue.unshift(e.sn):this.emit(g.default.DC_REQUEST,e)}},{key:"_handlePieceAck",value:function(){if(this.uploading=!1,window.clearTimeout(this.uploadTimeout),this.uploadTimeout=null,this.rcvdReqQueue.length>0){var e=this.rcvdReqQueue.pop();this.emit(g.default.DC_REQUEST,{sn:e})}}},{key:"_prepareForBinary",value:function(e,t,r,n){this.bufArr=[],this.remainAttachments=e,this.bufUrl=t,this.bufSN=r,this.expectedSize=n}},{key:"_handleBinaryData",value:function(){var e=v.concat(this.bufArr);e.byteLength==this.expectedSize&&this.emit(g.default.DC_RESPONSE,{url:this.bufUrl,sn:this.bufSN,data:e}),this.bufUrl="",this.bufArr=[],this.expectedSize=-1,this.downloading=!1}},{key:"_adjustStreamingRate",value:function(e){var t=this,r=0;return this.adjustSRInterval=window.setInterval(function(){t.streamingRate=Math.round(8*r/e),r=0},1e3*e),function(e){r+=e}}},{key:"_loadtimeout",value:function(){var e=this.engine.logger;if(e.warn("datachannel timeout while downloading from "+this.remotePeerId),this.emit(g.default.DC_TIMEOUT),this.requestTimeout=null,this.downloading=!1,++this.miss>=this.config.dcTolerance){var t={event:g.default.DC_CLOSE};this.sendJson(t),e.warn("datachannel download miss reach dcTolerance, close "+this.remotePeerId),this.emit(g.default.DC_ERROR)}}},{key:"_uploadtimeout",value:function(){this.engine.logger.warn("datachannel timeout while uploading to "+this.remotePeerId),this.uploading=!1,this.rcvdReqQueue=[]}},{key:"_sendPing",value:function(){var e=this;this.ping=performance.now();for(var t=0;t0){var t=0,r=!0,n=!1,i=void 0;try{for(var a,o=e.delays[Symbol.iterator]();!(r=(a=o.next()).done);r=!0)t+=a.value}catch(e){n=!0,i=e}finally{try{!r&&o.return&&o.return()}finally{if(n)throw i}}e.delay=t/e.delays.length,e.delays=[]}},100)}},{key:"_handlePongMsg",value:function(){var e=performance.now()-this.ping;this.delays.push(e)}},{key:"setupStats",value:function(){var e=this,t=this.engine.logger;setInterval(function(){e._datachannel.getStats(function(e,r){t.warn("reports: "+JSON.stringify(r,null,1))})},1e4)}},{key:"isAvailable",get:function(){this.engine.logger;return!1===this.downloading&&!1===this.choked}}]),t}(h.default);t.default=y,e.exports=t.default},function(e,t,r){(function(t){function n(e){var t=this;if(!(t instanceof n))return new n(e);if(t._id=c(4).toString("hex").slice(0,7),t._debug("new peer %o",e),e=Object.assign({allowHalfOpen:!1},e),d.Duplex.call(t,e),t.channelName=e.initiator?e.channelName||c(20).toString("hex"):null,t._isChromium="undefined"!=typeof window&&!!window.webkitRTCPeerConnection,t.initiator=e.initiator||!1,t.channelConfig=e.channelConfig||n.channelConfig,t.config=e.config||n.config,t.constraints=t._transformConstraints(e.constraints||n.constraints),t.offerConstraints=t._transformConstraints(e.offerConstraints||{}),t.answerConstraints=t._transformConstraints(e.answerConstraints||{}),t.reconnectTimer=e.reconnectTimer||!1,t.sdpTransform=e.sdpTransform||function(e){return e},t.stream=e.stream||!1,t.trickle=void 0===e.trickle||e.trickle,t.destroyed=!1,t.connected=!1,t.remoteAddress=void 0,t.remoteFamily=void 0,t.remotePort=void 0,t.localAddress=void 0,t.localPort=void 0,t._wrtc=e.wrtc&&"object"===o(e.wrtc)?e.wrtc:u(),!t._wrtc)throw"undefined"==typeof window?new Error("No WebRTC support: Specify `opts.wrtc` option in this environment"):new Error("No WebRTC support: Not a supported browser");if(t._pcReady=!1,t._channelReady=!1,t._iceComplete=!1,t._channel=null,t._pendingCandidates=[],t._previousStreams=[],t._chunk=null,t._cb=null,t._interval=null,t._reconnectTimeout=null,t._pc=new t._wrtc.RTCPeerConnection(t.config,t.constraints),t._isWrtc=Array.isArray(t._pc.RTCIceConnectionStates),t._isReactNativeWebrtc="number"==typeof t._pc._peerConnectionId,t._pc.oniceconnectionstatechange=function(){t._onIceStateChange()},t._pc.onicegatheringstatechange=function(){t._onIceStateChange()},t._pc.onsignalingstatechange=function(){t._onSignalingStateChange()},t._pc.onicecandidate=function(e){t._onIceCandidate(e)},t.initiator){var r=!1;t._pc.onnegotiationneeded=function(){r||t._createOffer(),r=!0},t._setupData({channel:t._pc.createDataChannel(t.channelName,t.channelConfig)})}else t._pc.ondatachannel=function(e){t._setupData(e)};"addTrack"in t._pc?(t.stream&&t.stream.getTracks().forEach(function(e){t._pc.addTrack(e,t.stream)}),t._pc.ontrack=function(e){t._onTrack(e)}):(t.stream&&t._pc.addStream(t.stream),t._pc.onaddstream=function(e){t._onAddStream(e)}),t.initiator&&t._isWrtc&&t._pc.onnegotiationneeded(),t._onFinishBound=function(){t._onFinish()},t.once("finish",t._onFinishBound)}function i(){}var o="function"==typeof Symbol&&"symbol"==a(Symbol.iterator)?function(e){return void 0===e?"undefined":a(e)}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":void 0===e?"undefined":a(e)};e.exports=n;var s=r(23)("simple-channel"),u=r(10),l=r(2),c=r(26),d=r(27);l(n,d.Duplex),n.WEBRTC_SUPPORT=!!u(),n.config={iceServers:[{urls:"stun:stun.l.google.com:19302"}]},n.constraints={},n.channelConfig={},Object.defineProperty(n.prototype,"bufferSize",{get:function(){var e=this;return e._channel&&e._channel.bufferedAmount||0}}),n.prototype.address=function(){var e=this;return{port:e.localPort,family:"IPv4",address:e.localAddress}},n.prototype.signal=function(e){var t=this;if(t.destroyed)throw new Error("cannot signal after peer is destroyed");if("string"==typeof e)try{e=JSON.parse(e)}catch(t){e={}}t._debug("signal()"),e.candidate&&(t._pc.remoteDescription&&t._pc.remoteDescription.type?t._addIceCandidate(e.candidate):t._pendingCandidates.push(e.candidate)),e.sdp&&t._pc.setRemoteDescription(new t._wrtc.RTCSessionDescription(e),function(){t.destroyed||(t._pendingCandidates.forEach(function(e){t._addIceCandidate(e)}),t._pendingCandidates=[],"offer"===t._pc.remoteDescription.type&&t._createAnswer())},function(e){t.destroy(e)}),e.sdp||e.candidate||t.destroy(new Error("signal() called with invalid signal data"))},n.prototype._addIceCandidate=function(e){var t=this;try{t._pc.addIceCandidate(new t._wrtc.RTCIceCandidate(e),i,function(e){t.destroy(e)})}catch(e){t.destroy(new Error("error adding candidate: "+e.message))}},n.prototype.send=function(e){this._channel.send(e)},n.prototype.destroy=function(e){this._destroy(e,function(){})},n.prototype._destroy=function(e,t){var r=this;if(!r.destroyed){if(r._debug("destroy (error: %s)",e&&(e.message||e)),r.readable=r.writable=!1,r._readableState.ended||r.push(null),r._writableState.finished||r.end(),r.destroyed=!0,r.connected=!1,r._pcReady=!1,r._channelReady=!1,r._previousStreams=null,clearInterval(r._interval),clearTimeout(r._reconnectTimeout),r._interval=null,r._reconnectTimeout=null,r._chunk=null,r._cb=null,r._onFinishBound&&r.removeListener("finish",r._onFinishBound),r._onFinishBound=null,r._pc){try{r._pc.close()}catch(e){}r._pc.oniceconnectionstatechange=null,r._pc.onicegatheringstatechange=null,r._pc.onsignalingstatechange=null,r._pc.onicecandidate=null,"addTrack"in r._pc?r._pc.ontrack=null:r._pc.onaddstream=null,r._pc.onnegotiationneeded=null,r._pc.ondatachannel=null}if(r._channel){try{r._channel.close()}catch(e){}r._channel.onmessage=null,r._channel.onopen=null,r._channel.onclose=null,r._channel.onerror=null}r._pc=null,r._channel=null,e&&r.emit("error",e),r.emit("close"),t()}},n.prototype._setupData=function(e){var t=this;if(!e.channel)return t.destroy(new Error("Data channel event is missing `channel` property"));t._channel=e.channel,t._channel.binaryType="arraybuffer","number"==typeof t._channel.bufferedAmountLowThreshold&&(t._channel.bufferedAmountLowThreshold=65536),t.channelName=t._channel.label,t._channel.onmessage=function(e){t._onChannelMessage(e)},t._channel.onbufferedamountlow=function(){t._onChannelBufferedAmountLow()},t._channel.onopen=function(){t._onChannelOpen()},t._channel.onclose=function(){t._onChannelClose()},t._channel.onerror=function(e){t.destroy(e)}},n.prototype._read=function(){},n.prototype._write=function(e,t,r){var n=this;if(n.destroyed)return r(new Error("cannot write after peer is destroyed"));if(n.connected){try{n.send(e)}catch(e){return n.destroy(e)}n._channel.bufferedAmount>65536?(n._debug("start backpressure: bufferedAmount %d",n._channel.bufferedAmount),n._cb=r):r(null)}else n._debug("write before connect"),n._chunk=e,n._cb=r},n.prototype._onFinish=function(){function e(){setTimeout(function(){t.destroy()},1e3)}var t=this;t.destroyed||(t.connected?e():t.once("connect",e))},n.prototype._createOffer=function(){var e=this;e.destroyed||e._pc.createOffer(function(t){function r(){e.destroyed||(e.trickle||e._iceComplete?i():e.once("_iceComplete",i))}function n(t){e.destroy(t)}function i(){var r=e._pc.localDescription||t;e._debug("signal"),e.emit("signal",{type:r.type,sdp:r.sdp})}e.destroyed||(t.sdp=e.sdpTransform(t.sdp),e._pc.setLocalDescription(t,r,n))},function(t){e.destroy(t)},e.offerConstraints)},n.prototype._createAnswer=function(){var e=this;e.destroyed||e._pc.createAnswer(function(t){function r(){e.destroyed||(e.trickle||e._iceComplete?i():e.once("_iceComplete",i))}function n(t){e.destroy(t)}function i(){var r=e._pc.localDescription||t;e._debug("signal"),e.emit("signal",{type:r.type,sdp:r.sdp})}e.destroyed||(t.sdp=e.sdpTransform(t.sdp),e._pc.setLocalDescription(t,r,n))},function(t){e.destroy(t)},e.answerConstraints)},n.prototype._onIceStateChange=function(){var e=this;if(!e.destroyed){var t=e._pc.iceConnectionState,r=e._pc.iceGatheringState;e._debug("iceStateChange (connection: %s) (gathering: %s)",t,r),e.emit("iceStateChange",t,r),"connected"!==t&&"completed"!==t||(clearTimeout(e._reconnectTimeout),e._pcReady=!0,e._maybeReady()),"disconnected"===t&&(e.reconnectTimer?(clearTimeout(e._reconnectTimeout),e._reconnectTimeout=setTimeout(function(){e.destroy()},e.reconnectTimer)):e.destroy()),"failed"===t&&e.destroy(new Error("Ice connection failed.")),"closed"===t&&e.destroy()}},n.prototype.getStats=function(e){var t=this;0===t._pc.getStats.length?t._pc.getStats().then(function(t){var r=[];t.forEach(function(e){r.push(e)}),e(null,r)},function(t){e(t)}):t._isReactNativeWebrtc?t._pc.getStats(null,function(t){var r=[];t.forEach(function(e){r.push(e)}),e(null,r)},function(t){e(t)}):t._pc.getStats.length>0?t._pc.getStats(function(r){if(!t.destroyed){var n=[];r.result().forEach(function(e){var t={};e.names().forEach(function(r){t[r]=e.stat(r)}),t.id=e.id,t.type=e.type,t.timestamp=e.timestamp,n.push(t)}),e(null,n)}},function(t){e(t)}):e(null,[])},n.prototype._maybeReady=function(){function e(){t.destroyed||t.getStats(function(r,n){function i(e){u=!0;var r=o[e.localCandidateId];r&&r.ip?(t.localAddress=r.ip,t.localPort=Number(r.port)):r&&r.ipAddress?(t.localAddress=r.ipAddress,t.localPort=Number(r.portNumber)):"string"==typeof e.googLocalAddress&&(r=e.googLocalAddress.split(":"),t.localAddress=r[0],t.localPort=Number(r[1]));var n=a[e.remoteCandidateId];n&&n.ip?(t.remoteAddress=n.ip,t.remotePort=Number(n.port)):n&&n.ipAddress?(t.remoteAddress=n.ipAddress,t.remotePort=Number(n.portNumber)):"string"==typeof e.googRemoteAddress&&(n=e.googRemoteAddress.split(":"),t.remoteAddress=n[0],t.remotePort=Number(n[1])),t.remoteFamily="IPv4",t._debug("connect local: %s:%s remote: %s:%s",t.localAddress,t.localPort,t.remoteAddress,t.remotePort)}if(!t.destroyed){r&&(n=[]);var a={},o={},s={},u=!1;if(n.forEach(function(e){"remotecandidate"!==e.type&&"remote-candidate"!==e.type||(a[e.id]=e),"localcandidate"!==e.type&&"local-candidate"!==e.type||(o[e.id]=e),"candidatepair"!==e.type&&"candidate-pair"!==e.type||(s[e.id]=e)}),n.forEach(function(e){"transport"===e.type&&i(s[e.selectedCandidatePairId]),("googCandidatePair"===e.type&&"true"===e.googActiveConnection||("candidatepair"===e.type||"candidate-pair"===e.type)&&e.selected)&&i(e)}),!(u||Object.keys(s).length&&!Object.keys(o).length))return void setTimeout(e,100);if(t._connecting=!1,t.connected=!0,t._chunk){try{t.send(t._chunk)}catch(r){return t.destroy(r)}t._chunk=null,t._debug('sent chunk from "write before connect"');var l=t._cb;t._cb=null,l(null)}"number"!=typeof t._channel.bufferedAmountLowThreshold&&(t._interval=setInterval(function(){t._onInterval()},150),t._interval.unref&&t._interval.unref()),t._debug("connect"),t.emit("connect")}})}var t=this;t._debug("maybeReady pc %s channel %s",t._pcReady,t._channelReady),!t.connected&&!t._connecting&&t._pcReady&&t._channelReady&&(t._connecting=!0,e())},n.prototype._onInterval=function(){var e=this;!e._cb||!e._channel||e._channel.bufferedAmount>65536||e._onChannelBufferedAmountLow()},n.prototype._onSignalingStateChange=function(){var e=this;e.destroyed||(e._debug("signalingStateChange %s",e._pc.signalingState),e.emit("signalingStateChange",e._pc.signalingState))},n.prototype._onIceCandidate=function(e){var t=this;t.destroyed||(e.candidate&&t.trickle?t.emit("signal",{candidate:{candidate:e.candidate.candidate,sdpMLineIndex:e.candidate.sdpMLineIndex,sdpMid:e.candidate.sdpMid}}):e.candidate||(t._iceComplete=!0,t.emit("_iceComplete")))},n.prototype._onChannelMessage=function(e){var r=this;if(!r.destroyed){var n=e.data;n instanceof ArrayBuffer&&(n=t.from(n)),r.push(n)}},n.prototype._onChannelBufferedAmountLow=function(){var e=this;if(!e.destroyed&&e._cb){e._debug("ending backpressure: bufferedAmount %d",e._channel.bufferedAmount);var t=e._cb;e._cb=null,t(null)}},n.prototype._onChannelOpen=function(){var e=this;e.connected||e.destroyed||(e._debug("on channel open"),e._channelReady=!0,e._maybeReady())},n.prototype._onChannelClose=function(){var e=this;e.destroyed||(e._debug("on channel close"),e.destroy())},n.prototype._onAddStream=function(e){var t=this;t.destroyed||(t._debug("on add stream"),t.emit("stream",e.stream))},n.prototype._onTrack=function(e){var t=this;if(!t.destroyed){t._debug("on track");var r=e.streams[0].id;-1===t._previousStreams.indexOf(r)&&(t._previousStreams.push(r),t.emit("stream",e.streams[0]))}},n.prototype._debug=function(){var e=this,t=[].slice.call(arguments);t[0]="["+e._id+"] "+t[0],s.apply(null,t)},n.prototype._transformConstraints=function(e){var t=this;if(0===Object.keys(e).length)return e;if((e.mandatory||e.optional)&&!t._isChromium){var r=Object.assign({},e.optional,e.mandatory);return void 0!==r.OfferToReceiveVideo&&(r.offerToReceiveVideo=r.OfferToReceiveVideo,delete r.OfferToReceiveVideo),void 0!==r.OfferToReceiveAudio&&(r.offerToReceiveAudio=r.OfferToReceiveAudio,delete r.OfferToReceiveAudio),r}return e.mandatory||e.optional||!t._isChromium?e:(void 0!==e.offerToReceiveVideo&&(e.OfferToReceiveVideo=e.offerToReceiveVideo,delete e.offerToReceiveVideo),void 0!==e.offerToReceiveAudio&&(e.OfferToReceiveAudio=e.offerToReceiveAudio,delete e.offerToReceiveAudio),{mandatory:e})}}).call(t,r(4).Buffer)},function(e,t,r){function n(e){var t=e.length;if(t%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var r=e.indexOf("=");return-1===r&&(r=t),[r,r===t?0:4-r%4]}function i(e){var t=n(e),r=t[0],i=t[1];return 3*(r+i)/4-i}function a(e,t,r){return 3*(t+r)/4-r}function o(e){for(var t,r=n(e),i=r[0],o=r[1],s=new f(a(e,i,o)),u=0,l=o>0?i-4:i,c=0;c>16&255,s[u++]=t>>8&255,s[u++]=255&t;return 2===o&&(t=d[e.charCodeAt(c)]<<2|d[e.charCodeAt(c+1)]>>4,s[u++]=255&t),1===o&&(t=d[e.charCodeAt(c)]<<10|d[e.charCodeAt(c+1)]<<4|d[e.charCodeAt(c+2)]>>2,s[u++]=t>>8&255,s[u++]=255&t),s}function s(e){return c[e>>18&63]+c[e>>12&63]+c[e>>6&63]+c[63&e]}function u(e,t,r){for(var n,i=[],a=t;ao?o:a+16383));return 1===n?(t=e[r-1],i.push(c[t>>2]+c[t<<4&63]+"==")):2===n&&(t=(e[r-2]<<8)+e[r-1],i.push(c[t>>10]+c[t>>4&63]+c[t<<2&63]+"=")),i.join("")}t.byteLength=i,t.toByteArray=o,t.fromByteArray=l;for(var c=[],d=[],f="undefined"!=typeof Uint8Array?Uint8Array:Array,h="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",p=0,g=h.length;p>1,c=-7,d=r?i-1:0,f=r?-1:1,h=e[t+d];for(d+=f,a=h&(1<<-c)-1,h>>=-c,c+=s;c>0;a=256*a+e[t+d],d+=f,c-=8);for(o=a&(1<<-c)-1,a>>=-c,c+=n;c>0;o=256*o+e[t+d],d+=f,c-=8);if(0===a)a=1-l;else{if(a===u)return o?NaN:1/0*(h?-1:1);o+=Math.pow(2,n),a-=l}return(h?-1:1)*o*Math.pow(2,a-n)},t.write=function(e,t,r,n,i,a){var o,s,u,l=8*a-i-1,c=(1<>1,f=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,h=n?0:a-1,p=n?1:-1,g=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(s=isNaN(t)?1:0,o=c):(o=Math.floor(Math.log(t)/Math.LN2),t*(u=Math.pow(2,-o))<1&&(o--,u*=2),t+=o+d>=1?f/u:f*Math.pow(2,1-d),t*u>=2&&(o++,u/=2),o+d>=c?(s=0,o=c):o+d>=1?(s=(t*u-1)*Math.pow(2,i),o+=d):(s=t*Math.pow(2,d-1)*Math.pow(2,i),o=0));i>=8;e[r+h]=255&s,h+=p,s/=256,i-=8);for(o=o<0;e[r+h]=255&o,h+=p,o/=256,l-=8);e[r+h-p]|=128*g}},function(e,t,r){(function(n){function i(){return!("undefined"==typeof window||!window.process||"renderer"!==window.process.type)||("undefined"==typeof navigator||!navigator.userAgent||!navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))&&("undefined"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/))}function o(e){var r=this.useColors;if(e[0]=(r?"%c":"")+this.namespace+(r?" %c":" ")+e[0]+(r?"%c ":" ")+"+"+t.humanize(this.diff),r){var n="color: "+this.color;e.splice(1,0,n,"color: inherit");var i=0,a=0;e[0].replace(/%[a-zA-Z%]/g,function(e){"%%"!==e&&(i++,"%c"===e&&(a=i))}),e.splice(a,0,n)}}function s(){return"object"==("undefined"==typeof console?"undefined":a(console))&&console.log&&Function.prototype.apply.call(console.log,console,arguments)}function u(e){try{null==e?t.storage.removeItem("debug"):t.storage.debug=e}catch(e){}}function l(){var e;try{e=t.storage.debug}catch(e){}return!e&&void 0!==n&&"env"in n&&(e=n.env.DEBUG),e}t=e.exports=r(24),t.log=s,t.formatArgs=o,t.save=u,t.load=l,t.useColors=i,t.storage="undefined"!=typeof chrome&&void 0!==chrome.storage?chrome.storage.local:function(){try{return window.localStorage}catch(e){}}(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],t.formatters.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}},t.enable(l())}).call(t,r(1))},function(e,t,r){function n(e){var r,n=0;for(r in e)n=(n<<5)-n+e.charCodeAt(r),n|=0;return t.colors[Math.abs(n)%t.colors.length]}function i(e){function r(){if(r.enabled){var e=r,n=+new Date,a=n-(i||n);e.diff=a,e.prev=i,e.curr=n,i=n;for(var o=new Array(arguments.length),s=0;s100)){var t=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(e);if(t){var r=parseFloat(t[1]);switch((t[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return r*d;case"days":case"day":case"d":return r*c;case"hours":case"hour":case"hrs":case"hr":case"h":return r*l;case"minutes":case"minute":case"mins":case"min":case"m":return r*u;case"seconds":case"second":case"secs":case"sec":case"s":return r*s;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return r;default:return}}}}function n(e){return e>=c?Math.round(e/c)+"d":e>=l?Math.round(e/l)+"h":e>=u?Math.round(e/u)+"m":e>=s?Math.round(e/s)+"s":e+"ms"}function i(e){return o(e,c,"day")||o(e,l,"hour")||o(e,u,"minute")||o(e,s,"second")||e+" ms"}function o(e,t,r){if(!(e0)return r(e);if("number"===o&&!1===isNaN(e))return t.long?i(e):n(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))}},function(e,t,r){(function(t,n){function i(){throw new Error("Secure random number generation is not supported by this browser.\nUse Chrome, Firefox or Internet Explorer 11")}function a(e,r){if(e>65536)throw new Error("requested too many random bytes");var i=new t.Uint8Array(e);e>0&&s.getRandomValues(i);var a=o.from(i.buffer);return"function"==typeof r?n.nextTick(function(){r(null,a)}):a}var o=r(5).Buffer,s=t.crypto||t.msCrypto;s&&s.getRandomValues?e.exports=a:e.exports=i}).call(t,r(0),r(1))},function(e,t,r){t=e.exports=r(11),t.Stream=t,t.Readable=t,t.Writable=r(14),t.Duplex=r(3),t.Transform=r(16),t.PassThrough=r(34)},function(e,t){},function(e,t,r){function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t,r){e.copy(t,r)}var a=r(5).Buffer,o=r(30);e.exports=function(){function e(){n(this,e),this.head=null,this.tail=null,this.length=0}return e.prototype.push=function(e){var t={data:e,next:null};this.length>0?this.tail.next=t:this.head=t,this.tail=t,++this.length},e.prototype.unshift=function(e){var t={data:e,next:this.head};0===this.length&&(this.tail=t),this.head=t,++this.length},e.prototype.shift=function(){if(0!==this.length){var e=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,e}},e.prototype.clear=function(){this.head=this.tail=null,this.length=0},e.prototype.join=function(e){if(0===this.length)return"";for(var t=this.head,r=""+t.data;t=t.next;)r+=e+t.data;return r},e.prototype.concat=function(e){if(0===this.length)return a.alloc(0);if(1===this.length)return this.head.data;for(var t=a.allocUnsafe(e>>>0),r=this.head,n=0;r;)i(r.data,t,n),n+=r.data.length,r=r.next;return t},e}(),o&&o.inspect&&o.inspect.custom&&(e.exports.prototype[o.inspect.custom]=function(){var e=o.inspect({length:this.length});return this.constructor.name+" "+e})},function(e,t){},function(e,t,r){(function(e){function n(e,t){this._id=e,this._clearFn=t}var i=void 0!==e&&e||"undefined"!=typeof self&&self||window,a=Function.prototype.apply;t.setTimeout=function(){return new n(a.call(setTimeout,i,arguments),clearTimeout)},t.setInterval=function(){return new n(a.call(setInterval,i,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},n.prototype.unref=n.prototype.ref=function(){},n.prototype.close=function(){this._clearFn.call(i,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout(function(){e._onTimeout&&e._onTimeout()},t))},r(32),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(t,r(0))},function(e,t,r){(function(e,t){!function(e,r){function n(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),r=0;r0&&void 0!==arguments[0]?arguments[0]:10,r=this.engine.logger;this.heartbeater=window.setInterval(function(){fetch(e.statsURL,{headers:e._requestHeader,method:"POST",body:JSON.stringify(e._makeStatsBody())}).then(function(t){t.ok&&(r.info("sucessfully report stats"),e.httpDownloaded=0,e.p2pDownloaded=0,e.conns=0,e.failConns=0,e.errsFragLoad=0,e.errsBufStalled=0,e.errsInternalExpt=0)}).catch(function(e){r.error("btStats error "+e)})},1e3*t)}},{key:"btGetPeers",value:function(){var e=this,t=this.engine.logger;return new Promise(function(r,n){fetch(e.getPeersURL,{headers:e._requestHeader,method:"POST"}).then(function(e){return e.json()}).then(function(e){-1===e.ret?n(e.data.msg):r(e.data)}).catch(function(e){t.error("btGetPeers error "+e),n(e)})})}},{key:"increConns",value:function(){this.conns++}},{key:"decreConns",value:function(){this.conns--}},{key:"increFailConns",value:function(){this.failConns++}},{key:"reportFlow",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],r=Math.round(e.total/1024);t?(this.p2pDownloaded+=r,this.totalP2PDownloaded+=r):(this.httpDownloaded+=r,this.totalHTTPDownloaded+=r),this._emitStats()}},{key:"reportUploaded",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;this.totalP2PUploaded+=Math.round(e/1024),this._emitStats()}},{key:"destroy",value:function(){window.clearInterval(this.heartbeater)}},{key:"_emitStats",value:function(){this.engine.emit("stats",{totalHTTPDownloaded:this.totalHTTPDownloaded,totalP2PDownloaded:this.totalP2PDownloaded,totalP2PUploaded:this.totalP2PUploaded})}},{key:"_makeStatsBody",value:function(){var e={conns:this.conns,failConns:this.failConns,errsFragLoad:this.errsFragLoad,errsBufStalled:this.errsBufStalled,errsInternalExpt:this.errsInternalExpt,http:Math.round(this.httpDownloaded),p2p:Math.round(this.p2pDownloaded)};return Object.keys(e).forEach(function(t){0===e[t]&&delete e[t]}),e}},{key:"_requestHeader",get:function(){return{}}}]),e}();t.default=u,e.exports=t.default},function(e,t,r){var n;"function"==typeof Symbol&&Symbol.iterator,function(i){function a(e,t){var r=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(r>>16)<<16|65535&r}function o(e,t){return e<>>32-t}function s(e,t,r,n,i,s){return a(o(a(a(t,e),a(n,s)),i),r)}function u(e,t,r,n,i,a,o){return s(t&r|~t&n,e,t,i,a,o)}function l(e,t,r,n,i,a,o){return s(t&n|r&~n,e,t,i,a,o)}function c(e,t,r,n,i,a,o){return s(t^r^n,e,t,i,a,o)}function d(e,t,r,n,i,a,o){return s(r^(t|~n),e,t,i,a,o)}function f(e,t){e[t>>5]|=128<>>9<<4)]=t;var r,n,i,o,s,f=1732584193,h=-271733879,p=-1732584194,g=271733878;for(r=0;r>5]>>>t%32&255);return r}function p(e){var t,r=[];for(r[(e.length>>2)-1]=void 0,t=0;t>5]|=(255&e.charCodeAt(t/8))<16&&(i=f(i,8*e.length)),r=0;r<16;r+=1)a[r]=909522486^i[r],o[r]=1549556828^i[r];return n=f(a.concat(p(t)),512+8*t.length),h(f(o.concat(n),640))}function y(e){var t,r,n="0123456789abcdef",i="";for(r=0;r>>4&15)+n.charAt(15&t);return i}function m(e){return unescape(encodeURIComponent(e))}function b(e){return g(m(e))}function _(e){return y(b(e))}function E(e,t){return v(m(e),m(t))}function w(e,t){return y(E(e,t))}function T(e,t,r){return t?r?E(t,e):w(t,e):r?b(e):_(e)}void 0!==(n=function(){return T}.call(t,r,t,e))&&(e.exports=n)}()},function(e,t,r){function n(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:20,n=null,i=!1;return function(){if(arguments.length>0&&void 0!==arguments[0]&&arguments[0])return void window.clearTimeout(n);i||(i=!0,n=setTimeout(function(){e.call(t),i=!1,n=null},1e3*r))}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=n,e.exports=t.default}])})}).call(t,r(10)(e))},function(e,t,r){"use strict";function n(e){return arguments.length>1&&void 0!==arguments[1]&&arguments[1]?e:e.split("?")[0]}function i(e){arguments.length>1&&void 0!==arguments[1]&&arguments[1];return""+u.default.parseURL(e).path.split(".")[0]}function a(){var e=-1,t="";return function(r,n){n=n.split("?")[0];var i=!0;return e!==r&&t===n&&(i=!1),e=r,t=n,i}}function o(){return!0}Object.defineProperty(t,"__esModule",{value:!0}),t.handleTSUrl=n,t.defaultChannelId=i,t.tsPathChecker=a,t.noop=o;var s=r(4),u=function(e){return e&&e.__esModule?e:{default:e}}(s)},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.config=t.FragLoader=t.Tracker=void 0;var i=r(8),a=n(i),o=r(12),s=n(o),u={announce:"https://api.cdnbye.com/v1",urgentOffset:3};t.Tracker=a.default,t.FragLoader=s.default,t.config=u},function(e,t,r){!function(t){var r=/^((?:[a-zA-Z0-9+\-.]+:)?)(\/\/[^\/\;?#]*)?(.*?)??(;.*?)?(\?.*?)?(#.*?)?$/,n=/^([^\/;?#]*)(.*)$/,i=/(?:\/|^)\.(?=\/)/g,a=/(?:\/|^)\.\.\/(?!\.\.\/).*?(?=\/)/g,o={buildAbsoluteURL:function(e,t,r){if(r=r||{},e=e.trim(),!(t=t.trim())){if(!r.alwaysNormalize)return e;var i=o.parseURL(e);if(!i)throw new Error("Error trying to parse base URL.");return i.path=o.normalizePath(i.path),o.buildURLFromParts(i)}var a=o.parseURL(t);if(!a)throw new Error("Error trying to parse relative URL.");if(a.scheme)return r.alwaysNormalize?(a.path=o.normalizePath(a.path),o.buildURLFromParts(a)):t;var s=o.parseURL(e);if(!s)throw new Error("Error trying to parse base URL.");if(!s.netLoc&&s.path&&"/"!==s.path[0]){var u=n.exec(s.path);s.netLoc=u[1],s.path=u[2]}s.netLoc&&!s.path&&(s.path="/");var l={scheme:s.scheme,netLoc:a.netLoc,path:null,params:a.params,query:a.query,fragment:a.fragment};if(!a.netLoc&&(l.netLoc=s.netLoc,"/"!==a.path[0]))if(a.path){var c=s.path,d=c.substring(0,c.lastIndexOf("/")+1)+a.path;l.path=o.normalizePath(d)}else l.path=s.path,a.params||(l.params=s.params,a.query||(l.query=s.query));return null===l.path&&(l.path=r.alwaysNormalize?o.normalizePath(a.path):a.path),o.buildURLFromParts(l)},parseURL:function(e){var t=r.exec(e);return t?{scheme:t[1]||"",netLoc:t[2]||"",path:t[3]||"",params:t[4]||"",query:t[5]||"",fragment:t[6]||""}:null},normalizePath:function(e){for(e=e.split("").reverse().join("").replace(i,"");e.length!==(e=e.replace(a,"")).length;);return e.split("").reverse().join("")},buildURLFromParts:function(e){return e.scheme+e.netLoc+e.path+e.params+e.query+e.fragment}};e.exports=o}()},function(e,t,r){"use strict";var n=function(e){return e&&2===e.CLOSING},i=function(){return"undefined"!=typeof WebSocket&&n(WebSocket)},a=function(){return{constructor:i()?WebSocket:null,maxReconnectionDelay:1e4,minReconnectionDelay:1500,reconnectionDelayGrowFactor:1.3,connectionTimeout:4e3,maxRetries:1/0,debug:!1}},o=function(e,t,r){Object.defineProperty(t,r,{get:function(){return e[r]},set:function(t){e[r]=t},enumerable:!0,configurable:!0})},s=function(e){return e.minReconnectionDelay+Math.random()*e.minReconnectionDelay},u=function(e,t){var r=t*e.reconnectionDelayGrowFactor;return r>e.maxReconnectionDelay?e.maxReconnectionDelay:r},l=["onopen","onclose","onmessage","onerror"],c=function(e,t,r){Object.keys(r).forEach(function(t){r[t].forEach(function(r){var n=r[0],i=r[1];e.addEventListener(t,n,i)})}),t&&l.forEach(function(r){e[r]=t[r]})},d=function(e,t,r){var i=this;void 0===r&&(r={});var l,f,h=0,p=0,g=!0,v=null,y={};if(!(this instanceof d))throw new TypeError("Failed to construct 'ReconnectingWebSocket': Please use the 'new' operator");var m=a();if(Object.keys(m).filter(function(e){return r.hasOwnProperty(e)}).forEach(function(e){return m[e]=r[e]}),!n(m.constructor))throw new TypeError("Invalid WebSocket constructor. Set `options.constructor`");var b=m.debug?function(){for(var e=[],t=0;tm.maxRetries)return void _("EHOSTDOWN","Too many failed connection attempts");h=h?u(m,h):s(m),b("handleClose - reconnectDelay:",h),g&&setTimeout(w,h)},w=function(){if(g){b("connect");var r=l,n="function"==typeof e?e():e;l=new m.constructor(n,t),f=setTimeout(function(){b("timeout"),l.close(),_("ETIMEDOUT","Connection timeout")},m.connectionTimeout),b("bypass properties");for(var a in l)["addEventListener","removeEventListener","close","send"].indexOf(a)<0&&o(l,i,a);l.addEventListener("open",function(){clearTimeout(f),b("open"),h=s(m),b("reconnectDelay:",h),p=0}),l.addEventListener("close",E),c(l,r,y),l.onclose=l.onclose||v,v=null}};b("init"),w(),this.close=function(e,t,r){void 0===e&&(e=1e3),void 0===t&&(t="");var n=void 0===r?{}:r,i=n.keepClosed,a=void 0!==i&&i,o=n.fastClose,s=void 0===o||o,u=n.delay,c=void 0===u?0:u;if(b("close - params:",{reason:t,keepClosed:a,fastClose:s,delay:c,retriesCount:p,maxRetries:m.maxRetries}),g=!a&&p<=m.maxRetries,c&&(h=c),l.close(e,t),s){var d={code:e,reason:t,wasClean:!0};E(),l.removeEventListener("close",E),Array.isArray(y.close)&&y.close.forEach(function(e){var t=e[0],r=e[1];t(d),l.removeEventListener("close",t,r)}),l.onclose&&(v=l.onclose,l.onclose(d),l.onclose=null)}},this.send=function(e){l.send(e)},this.addEventListener=function(e,t,r){Array.isArray(y[e])?y[e].some(function(e){return e[0]===t})||y[e].push([t,r]):y[e]=[[t,r]],l.addEventListener(e,t,r)},this.removeEventListener=function(e,t,r){Array.isArray(y[e])&&(y[e]=y[e].filter(function(e){return e[0]!==t})),l.removeEventListener(e,t,r)}};e.exports=d},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},u=Object.assign||function(e){for(var t=1;t0){var t={event:c.Events.DC_HAVE,sn:e};this._broadcastToPeers(t)}}},{key:"updateLoadingSN",value:function(e){this.loadingSN=e}},{key:"updatePlaySN",value:function(e){var t=this.engine.logger;if(!this.config.live&&this.hasPeers)for(var r=[],n=e+1;n<=e+this.config.urgentOffset+1;n++)if(!this.bitset.has(n)&&n!==this.loadingSN&&this.bitCounts.has(n)){var i=!0,a=!1,o=void 0;try{for(var s,u=this.peerMap.values()[Symbol.iterator]();!(i=(s=u.next()).done);i=!0){var l=s.value;if(l.isAvailable&&l.bitset.has(n)){l.requestDataBySN(n,!0),t.debug("request urgent "+n+" from peer "+l.remotePeerId),r.push(n);break}}}catch(e){a=!0,o=e}finally{try{!i&&u.return&&u.return()}finally{if(a)throw o}}}}},{key:"deletePeer",value:function(e){var t=this;this.peerMap.has(e.remotePeerId)&&(e.bitset.forEach(function(e){t._decreBitCounts(e)}),this.peerMap.delete(e.remotePeerId)),this.engine.emit("peers",[].concat(n(this.peerMap.keys())))}},{key:"handshakePeer",value:function(e){this._setupDC(e),e.sendBitField(Array.from(this.bitset))}},{key:"addPeer",value:function(e){this.engine.logger.info("add peer "+e.remotePeerId),this.peerMap.set(e.remotePeerId,e),this.engine.emit("peers",[].concat(n(this.peerMap.keys())))}},{key:"peersHasSN",value:function(e){return this.bitCounts.has(e)}},{key:"hasAndSetTargetPeer",value:function(e){var t=this.engine.logger;if(!this.hasIdlePeers||!this.peersHasSN(e))return!1;var r=!0,n=!1,i=void 0;try{for(var a,o=this.peerMap.values()[Symbol.iterator]();!(r=(a=o.next()).done);r=!0){var s=a.value;if(s.isAvailable&&s.bitset.has(e))return t.info("found sn "+e+" from peer "+s.remotePeerId),this.targetPeer=s,!0}}catch(e){n=!0,i=e}finally{try{!r&&o.return&&o.return()}finally{if(n)throw i}}return t.warn("idle peers hasn't sn "+e),!1}},{key:"load",value:function(e,t,r){var n=this.engine.logger;this.context=e;var i=e.frag,a=(0,d.handleTSUrl)(i.relurl,this.config.tsStrictMatched);this.callbacks=r,this.stats={trequest:performance.now(),retry:0,tfirst:0,tload:0,loaded:0},this.criticalSeg={sn:i.sn,relurl:a},this.targetPeer.requestDataByURL(a,!0),n.info("request criticalSeg url "+i.relurl+" at "+i.sn),this.criticaltimeouter=window.setTimeout(this._criticaltimeout.bind(this),1e3*this.config.loadTimeout)}},{key:"_setupDC",value:function(e){var t=this,r=this.engine.logger;e.on(c.Events.DC_BITFIELD,function(r){if(r.field){var n=new Set(r.field);e.bitset=n,r.field.forEach(function(e){t.bitset.has(e)||t._increBitCounts(e)}),t.addPeer(e)}}).on(c.Events.DC_HAVE,function(r){if(r.sn&&e.bitset){var n=r.sn;e.bitset.add(n),t.bitset.has(n)||t._increBitCounts(n)}}).on(c.Events.DC_LOST,function(r){if(r.sn&&e.bitset){var n=r.sn;e.bitset.delete(n),t._decreBitCounts(n)}}).on(c.Events.DC_PIECE_ACK,function(e){e.size&&t.engine.fetcher.reportUploaded(e.size)}).on(c.Events.DC_PIECE,function(e){t.criticalSeg&&t.criticalSeg.relurl===e.url&&(t.stats.tfirst=Math.max(performance.now(),t.stats.trequest))}).on(c.Events.DC_PIECE_NOT_FOUND,function(e){t.criticalSeg&&t.criticalSeg.relurl===e.url&&(window.clearTimeout(t.criticaltimeouter),r.info("DC_PIECE_NOT_FOUND"),t._criticaltimeout())}).on(c.Events.DC_RESPONSE,function(n){if(t.criticalSeg&&t.criticalSeg.relurl===n.url&&t.criticaltimeouter){r.info("receive criticalSeg url "+n.url),window.clearTimeout(t.criticaltimeouter),t.criticaltimeouter=null;var i=t.stats;i.tload=Math.max(i.tfirst,performance.now()),i.loaded=i.total=n.data.byteLength,t.criticalSeg=null,t.context.frag.fromPeerId=e.remotePeerId,t.callbacks.onSuccess(n,i,t.context)}else t.bufMgr.addBuffer(n.sn,n.url,n.data,e.remotePeerId);t.updateLoadedSN(n.sn)}).on(c.Events.DC_REQUEST,function(r){var n="";if((n=r.url?r.url:t.bufMgr.getURLbySN(r.sn))&&t.bufMgr.hasSegOfURL(n)){var i=t.bufMgr.getSegByURL(n);e.sendBuffer(r.sn,i.relurl,i.data)}else e.sendJson({event:c.Events.DC_PIECE_NOT_FOUND,url:n,sn:r.sn})}).on(c.Events.DC_TIMEOUT,function(){r.warn("DC_TIMEOUT"),t.criticaltimeouter&&(window.clearTimeout(t.criticaltimeouter),t._criticaltimeout())})}},{key:"_broadcastToPeers",value:function(e){var t=!0,r=!1,n=void 0;try{for(var i,a=this.peerMap.values()[Symbol.iterator]();!(t=(i=a.next()).done);t=!0){i.value.sendJson(e)}}catch(e){r=!0,n=e}finally{try{!t&&a.return&&a.return()}finally{if(r)throw n}}}},{key:"_getIdlePeer",value:function(){return[].concat(n(this.peerMap.values())).filter(function(e){return e.isAvailable})}},{key:"_decreBitCounts",value:function(e){if(this.bitCounts.has(e)){var t=this.bitCounts.get(e);1===t?this.bitCounts.delete(e):this.bitCounts.set(e,t-1)}}},{key:"_increBitCounts",value:function(e){if(this.bitCounts.has(e)){var t=this.bitCounts.get(e);this.bitCounts.set(e,t+1)}else this.bitCounts.set(e,1)}},{key:"_criticaltimeout",value:function(){this.engine.logger.warn("critical request timeout"),this.criticalSeg=null,this.criticaltimeouter=null,this.callbacks.onTimeout(this.stats,this.context,null)}},{key:"hasPeers",get:function(){return this.peerMap.size>0}},{key:"peersNum",get:function(){return this.peerMap.size}},{key:"hasIdlePeers",get:function(){var e=this.engine.logger,t=this._getIdlePeer().length;return e.info("peers: "+this.peerMap.size+" idle peers: "+t),t>0}},{key:"bufferManager",set:function(e){var t=this;this.bufMgr=e,e.on(c.Events.BM_LOST,function(e){t._broadcastToPeers({event:c.Events.DC_LOST,sn:e}),t.bitset.delete(e)})}}]),t}(l.default);t.default=f,e.exports=t.default},function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var s=function(){function e(e,t){for(var r=0;r0&&(r.warn("resend all cached msg"),t.msgQueue.forEach(function(e){t._ws.send(e)}),t.msgQueue=[]),t.onopen&&t.onopen()},a.push=a.send,a.send=function(t){var r=JSON.stringify(Object.assign({peer_id:e},t));a.push(r)},a.onmessage=function(e){t.onmessage&&t.onmessage(e)},a.onclose=function(){r.warn("Signaler websocket closed"),t.onclose&&t.onclose(),t.connected=!1},a}},{key:"sendSignal",value:function(e,t){var r={action:"signal",peer_id:this.peerId,to_peer_id:e,data:t};this._send(r)}},{key:"_send",value:function(e){var t=this.engine.logger;this.connected?this._ws.send(e):(t.warn("signaler closed, msg is cached"),this.msgQueue.push(e))}},{key:"close",value:function(){this._ws.close(),this._ws=null}}]),t}(l.default);t.default=f,e.exports=t.default},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var s=function(){function e(e,t){for(var r=0;r3&&void 0!==arguments[3]?arguments[3]:"",i=(0,d.handleTSUrl)(t,this.config.tsStrictMatched),a=c.Buffer.from(e),o=a.byteLength,s=new c.Buffer(o);a.copy(s);var u={sn:r,relurl:i,data:s,size:o,fromPeerId:n};this.addSeg(u),this.sn2Url.set(r,i)}},{key:"addBuffer",value:function(e,t,r){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"",i=(0,d.handleTSUrl)(t,this.config.tsStrictMatched),a={sn:e,relurl:i,data:r,size:r.byteLength,fromPeerId:n};this.addSeg(a),this.sn2Url.set(e,i)}},{key:"addSeg",value:function(e){var t=this.engine.logger;for(t.info("push seg "+e.sn+" "+e.size),this._segPool.set(e.relurl,e),this._currBufSize+=parseInt(e.size),t.debug("seg.size "+e.size+" _currBufSize "+this._currBufSize+" maxBufSize "+this.config.maxBufSize);this._currBufSize>this.config.maxBufSize;){var r=[].concat(n(this._segPool.values())).shift();t.info("pop seg "+r.relurl+" at "+r.sn),this._segPool.delete(r.relurl),this.sn2Url.delete(r.sn),this._currBufSize-=parseInt(r.size),this.overflowed||(this.overflowed=!0),this.emit(c.Events.BM_LOST,r.sn)}}},{key:"getSegByURL",value:function(e){return this._segPool.get(e)}},{key:"getURLbySN",value:function(e){return this.sn2Url.get(e)}},{key:"clear",value:function(){this._segPool.clear(),this.sn2Url.clear(),this._currBufSize=0}},{key:"currBufSize",get:function(){return this._currBufSize}}]),t}(l.default);t.default=f,e.exports=t.default},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(){}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t){for(var r=0;r "+e,this._uploadLog(e)}},{key:"_infoU",value:function(e){e="["+this.identifier+" info] > "+e,this._uploadLog(e)}},{key:"_warnU",value:function(e){e="["+this.identifier+" warn] > "+e,this._uploadLog(e)}},{key:"_errorU",value:function(e){e="["+this.identifier+" error] > "+e,this._uploadLog(e)}},{key:"_uploadLog",value:function(e){this.connected&&this._ws.send(e)}},{key:"_initWs",value:function(e){var t=this,r={maxRetries:this.config.wsMaxRetries,minReconnectionDelay:1e3*this.config.wsReconnectInterval},n=new s.default(this.config.logUploadAddr+"?info_hash="+window.encodeURIComponent(e),void 0,r);return n.onopen=function(){t.debug("Log websocket connection opened"),t.connected=!0},n.onclose=function(){t.warn("Log websocket closed"),t.connected=!1},n}}]),e}();t.default=d,e.exports=t.default},function(e,t,r){"use strict";function n(){return navigator.userAgent.toLowerCase()}function i(e){return""+(new RegExp(e+"(\\d+((\\.|_)\\d+)*)").exec(n())||[,0])[1]||void 0}function a(e){return parseFloat((e||"").replace(/\_/g,"."))||0}var o={getNetType:function(){return(new RegExp("nettype\\/(\\w*)").exec(n())||[,""])[1].toLowerCase()},getPlatform:function(){return o.isAndroid()?"android":o.isIOS()?"iOS":"PC"},isX5:function(){return this.isAndroid()&&/\s(TBS|X5Core)\/[\w\.\-]+/i.test(n())},isPC:function(){return!a(i("os "))&&!a(i("android[/ ]"))},isIOS:function(){return a(i("os "))},isAndroid:function(){return a(i("android[/ ]"))},isSafari:function(){return this.isIOS()&&/^((?!chrome|android).)*safari/i.test(n())}};e.exports=o},function(e,t,r){!function(t,r){e.exports=r()}(0,function(){return function(e){function t(n){if(r[n])return r[n].exports;var i=r[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var r={};return t.m=e,t.c=r,t.d=function(e,r,n){t.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="/dist/",t(t.s=10)}([function(e,t,r){"use strict";function n(){}function i(e,t){return t="["+e+"] > "+t}function a(e){var t=d.console[e];return t?function(){for(var r=arguments.length,n=Array(r),a=0;a1?t-1:0),n=1;n0)return t.subarray(n,n+i)},e._readSize=function(e,t){var r=0;return r=(127&e[t])<<21,r|=(127&e[t+1])<<14,r|=(127&e[t+2])<<7,r|=127&e[t+3]},e.getTimeStamp=function(t){for(var r=e.getID3Frames(t),n=0;n1&&void 0!==arguments[1]&&arguments[1],r=e.length,n=void 0,i=void 0,a=void 0,o="",s=0;s>4){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:o+=String.fromCharCode(n);break;case 12:case 13:i=e[s++],o+=String.fromCharCode((31&n)<<6|63&i);break;case 14:i=e[s++],a=e[s++],o+=String.fromCharCode((15&n)<<12|(63&i)<<6|(63&a)<<0)}}return o},e}(),a=i._utf8ArrayToStr;t.a=i},function(e,t){function r(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function n(e){return"function"==typeof e}function i(e){return"number"==typeof e}function a(e){return"object"==typeof e&&null!==e}function o(e){return void 0===e}e.exports=r,r.EventEmitter=r,r.prototype._events=void 0,r.prototype._maxListeners=void 0,r.defaultMaxListeners=10,r.prototype.setMaxListeners=function(e){if(!i(e)||e<0||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},r.prototype.emit=function(e){var t,r,i,s,u,l;if(this._events||(this._events={}),"error"===e&&(!this._events.error||a(this._events.error)&&!this._events.error.length)){if((t=arguments[1])instanceof Error)throw t;var c=new Error('Uncaught, unspecified "error" event. ('+t+")");throw c.context=t,c}if(r=this._events[e],o(r))return!1;if(n(r))switch(arguments.length){case 1:r.call(this);break;case 2:r.call(this,arguments[1]);break;case 3:r.call(this,arguments[1],arguments[2]);break;default:s=Array.prototype.slice.call(arguments,1),r.apply(this,s)}else if(a(r))for(s=Array.prototype.slice.call(arguments,1),l=r.slice(),i=l.length,u=0;u0&&this._events[e].length>i&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace()),this},r.prototype.on=r.prototype.addListener,r.prototype.once=function(e,t){function r(){this.removeListener(e,r),i||(i=!0,t.apply(this,arguments))}if(!n(t))throw TypeError("listener must be a function");var i=!1;return r.listener=t,this.on(e,r),this},r.prototype.removeListener=function(e,t){var r,i,o,s;if(!n(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(r=this._events[e],o=r.length,i=-1,r===t||n(r.listener)&&r.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(a(r)){for(s=o;s-- >0;)if(r[s]===t||r[s].listener&&r[s].listener===t){i=s;break}if(i<0)return this;1===r.length?(r.length=0,delete this._events[e]):r.splice(i,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},r.prototype.removeAllListeners=function(e){var t,r;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r=this._events[e],n(r))this.removeListener(e,r);else if(r)for(;r.length;)this.removeListener(e,r[r.length-1]);return delete this._events[e],this},r.prototype.listeners=function(e){return this._events&&this._events[e]?n(this._events[e])?[this._events[e]]:this._events[e].slice():[]},r.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(n(t))return 1;if(t)return t.length}return 0},r.listenerCount=function(e,t){return e.listenerCount(t)}},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e){var t=e.byteLength,r=t&&new DataView(e).getUint8(t-1);return r?e.slice(0,t-r):e}function s(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var u=function(){function e(t,r){n(this,e),this.subtle=t,this.aesIV=r}return e.prototype.decrypt=function(e,t){return this.subtle.decrypt({name:"AES-CBC",iv:this.aesIV},t,e)},e}(),l=u,c=function(){function e(t,r){i(this,e),this.subtle=t,this.key=r}return e.prototype.expandKey=function(){return this.subtle.importKey("raw",this.key,{name:"AES-CBC"},!1,["encrypt","decrypt"])},e}(),d=c,f=function(){function e(){a(this,e),this.rcon=[0,1,2,4,8,16,32,64,128,27,54],this.subMix=[new Uint32Array(256),new Uint32Array(256),new Uint32Array(256),new Uint32Array(256)],this.invSubMix=[new Uint32Array(256),new Uint32Array(256),new Uint32Array(256),new Uint32Array(256)],this.sBox=new Uint32Array(256),this.invSBox=new Uint32Array(256),this.key=new Uint32Array(0),this.initTable()}return e.prototype.uint8ArrayToUint32Array_=function(e){for(var t=new DataView(e),r=new Uint32Array(4),n=0;n<4;n++)r[n]=t.getUint32(4*n);return r},e.prototype.initTable=function(){var e=this.sBox,t=this.invSBox,r=this.subMix,n=r[0],i=r[1],a=r[2],o=r[3],s=this.invSubMix,u=s[0],l=s[1],c=s[2],d=s[3],f=new Uint32Array(256),h=0,p=0,g=0;for(g=0;g<256;g++)f[g]=g<128?g<<1:g<<1^283;for(g=0;g<256;g++){var v=p^p<<1^p<<2^p<<3^p<<4;v=v>>>8^255&v^99,e[h]=v,t[v]=h;var y=f[h],m=f[y],b=f[m],_=257*f[v]^16843008*v;n[h]=_<<24|_>>>8,i[h]=_<<16|_>>>16,a[h]=_<<8|_>>>24,o[h]=_,_=16843009*b^65537*m^257*y^16843008*h,u[v]=_<<24|_>>>8,l[v]=_<<16|_>>>16,c[v]=_<<8|_>>>24,d[v]=_,h?(h=y^f[f[f[b^y]]],p^=f[f[p]]):h=p=1}},e.prototype.expandKey=function(e){for(var t=this.uint8ArrayToUint32Array_(e),r=!0,n=0;n0},e.bin2str=function(e){return String.fromCharCode.apply(null,e)},e.readUint16=function(e,t){e.data&&(t+=e.start,e=e.data);var r=e[t]<<8|e[t+1];return r<0?65536+r:r},e.readUint32=function(e,t){e.data&&(t+=e.start,e=e.data);var r=e[t]<<24|e[t+1]<<16|e[t+2]<<8|e[t+3];return r<0?4294967296+r:r},e.writeUint32=function(e,t,r){e.data&&(t+=e.start,e=e.data),e[t]=r>>24,e[t+1]=r>>16&255,e[t+2]=r>>8&255,e[t+3]=255&r},e.findBox=function(t,r){var n=[],i=void 0,a=void 0,o=void 0,s=void 0,u=void 0,l=void 0,c=void 0;if(t.data?(l=t.start,s=t.end,t=t.data):(l=0,s=t.byteLength),!r.length)return null;for(i=l;i1?i+a:s,o===r[0]&&(1===r.length?n.push({data:t,start:i+8,end:c}):(u=e.findBox({data:t,start:i+8,end:c},r.slice(1)),u.length&&(n=n.concat(u)))),i=c;return n},e.parseSegmentIndex=function(t){var r=e.findBox(t,["moov"])[0],n=r?r.end:null,i=0,a=e.findBox(t,["sidx"]),o=void 0;if(!a||!a[0])return null;o=[],a=a[0];var s=a.data[0];i=0===s?8:16;var u=e.readUint32(a,i);i+=4;i+=0===s?8:16,i+=2;var l=a.end+0,c=e.readUint16(a,i);i+=2;for(var d=0;d>>31)return void console.warn("SIDX has hierarchical references (not supported)");var g=e.readUint32(a,f);f+=4,o.push({referenceSize:p,subsegmentDuration:g,info:{duration:g/u,start:l,end:l+p-1}}),l+=p,f+=4,i=f}return{earliestPresentationTime:0,timescale:u,version:s,referencesCount:c,references:o,moovEndOffset:n}},e.parseInitSegment=function(t){var r=[];return e.findBox(t,["moov","trak"]).forEach(function(t){var n=e.findBox(t,["tkhd"])[0];if(n){var a=n.data[n.start],o=0===a?12:20,s=e.readUint32(n,o),u=e.findBox(t,["mdia","mdhd"])[0];if(u){a=u.data[u.start],o=0===a?12:20;var l=e.readUint32(u,o),c=e.findBox(t,["mdia","hdlr"])[0];if(c){var d=e.bin2str(c.data.subarray(c.start+8,c.start+12)),f={soun:"audio",vide:"video"}[d];if(f){var h=e.findBox(t,["mdia","minf","stbl","stsd"]);if(h.length){h=h[0];var p=e.bin2str(h.data.subarray(h.start+12,h.start+16));i.b.log("MP4Demuxer:"+f+":"+p+" found")}r[s]={timescale:l,type:f},r[f]={timescale:l,id:s}}}}}}),r},e.getStartDTS=function(t,r){var n=void 0,i=void 0,a=void 0;return n=e.findBox(r,["moof","traf"]),i=[].concat.apply([],n.map(function(r){return e.findBox(r,["tfhd"]).map(function(n){var i=void 0,a=void 0;return i=e.readUint32(n,4),a=t[i].timescale||9e4,e.findBox(r,["tfdt"]).map(function(t){var r=void 0,n=void 0;return r=t.data[t.start],n=e.readUint32(t,4),1===r&&(n*=Math.pow(2,32),n+=e.readUint32(t,8)),n})[0]/a})})),a=Math.min.apply(null,i),isFinite(a)?a:0},e.offsetStartDTS=function(t,r,n){e.findBox(r,["moof","traf"]).map(function(r){return e.findBox(r,["tfhd"]).map(function(i){var a=e.readUint32(i,4),s=t[a].timescale||9e4;e.findBox(r,["tfdt"]).map(function(t){var r=t.data[t.start],i=e.readUint32(t,4);if(0===r)e.writeUint32(t,4,i-n*s);else{i*=Math.pow(2,32),i+=e.readUint32(t,8),i-=n*s,i=Math.max(i,0);var a=Math.floor(i/(o+1)),u=Math.floor(i%(o+1));e.writeUint32(t,4,a),e.writeUint32(t,8,u)}})})})},e.prototype.append=function(t,r,n,i){var o=this.initData;o||(this.resetInitSegment(t,this.audioCodec,this.videoCodec,!1),o=this.initData);var s=void 0,u=this.initPTS;if(void 0===u){var l=e.getStartDTS(o,t);this.initPTS=u=l-r,this.observer.trigger(a.a.INIT_PTS_FOUND,{initPTS:u})}e.offsetStartDTS(o,t,u),s=e.getStartDTS(o,t),this.remuxer.remux(o.audio,o.video,null,null,s,n,i,t)},e.prototype.destroy=function(){},e}();t.a=s},function(e,t,r){"use strict";function n(e,t,r,n){var i=void 0,a=void 0,o=void 0,s=void 0,u=void 0,l=navigator.userAgent.toLowerCase(),c=n,d=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350];return i=1+((192&t[r+2])>>>6),(a=(60&t[r+2])>>>2)>d.length-1?void e.trigger(T.a.ERROR,{type:S.b.MEDIA_ERROR,details:S.a.FRAG_PARSING_ERROR,fatal:!0,reason:"invalid ADTS sampling index:"+a}):(s=(1&t[r+2])<<2,s|=(192&t[r+3])>>>6,A.b.log("manifest codec:"+n+",ADTS data:type:"+i+",sampleingIndex:"+a+"["+d[a]+"Hz],channelConfig:"+s),/firefox/i.test(l)?a>=6?(i=5,u=new Array(4),o=a-3):(i=2,u=new Array(2),o=a):-1!==l.indexOf("android")?(i=2,u=new Array(2),o=a):(i=5,u=new Array(4),n&&(-1!==n.indexOf("mp4a.40.29")||-1!==n.indexOf("mp4a.40.5"))||!n&&a>=6?o=a-3:((n&&-1!==n.indexOf("mp4a.40.2")&&(a>=6&&1===s||/vivaldi/i.test(l))||!n&&1===s)&&(i=2,u=new Array(2)),o=a)),u[0]=i<<3,u[0]|=(14&a)>>1,u[1]|=(1&a)<<7,u[1]|=s<<3,5===i&&(u[1]|=(14&o)>>1,u[2]=(1&o)<<7,u[2]|=8,u[3]=0),{config:u,samplerate:d[a],channelCount:s,codec:"mp4a.40."+i,manifestCodec:c})}function i(e,t){return 255===e[t]&&240==(246&e[t+1])}function a(e,t){return 1&e[t+1]?7:9}function o(e,t){return(3&e[t+3])<<11|e[t+4]<<3|(224&e[t+5])>>>5}function s(e,t){return!!(t+10&&t+s+u<=c)return l=r+n*i,{headerLength:s,frameLength:u,stamp:l}}function f(e,t,r,n,i){var a=c(e.samplerate),o=d(t,r,n,i,a);if(o){var s=o.stamp,u=o.headerLength,l=o.frameLength,f={unit:t.subarray(r+u,r+u+l),pts:s,dts:s};return e.samples.push(f),e.len+=l,{sample:f,length:l+u}}}function h(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function p(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function g(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function v(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function y(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function m(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function b(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function E(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function w(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var T=r(1),S=r(2),R=r(7),A=r(0),L=r(3),C=r(5),k=function(){function e(t,r,n){h(this,e),this.observer=t,this.config=n,this.remuxer=r}return e.prototype.resetInitSegment=function(e,t,r,n){this._audioTrack={container:"audio/adts",type:"audio",id:0,sequenceNumber:0,isAAC:!0,samples:[],len:0,manifestCodec:t,duration:n,inputTimeScale:9e4}},e.prototype.resetTimeStamp=function(){},e.probe=function(e){if(!e)return!1;for(var t=C.a.getID3Data(e,0)||[],r=t.length,n=e.length;rt.length)){var a=this.parseHeader(t,r);if(a&&r+a.frameLength<=t.length){var o=9e4*a.samplesPerFrame/a.sampleRate,s=n+i*o,u={unit:t.subarray(r,r+a.frameLength),pts:s,dts:s};return e.config=[],e.channelCount=a.channelCount,e.samplerate=a.sampleRate,e.samples.push(u),e.len+=a.frameLength,{sample:u,length:a.frameLength}}}},parseHeader:function(e,t){var r=e[t+1]>>3&3,n=e[t+1]>>1&3,i=e[t+2]>>4&15,a=e[t+2]>>2&3,o=e[t+2]>>1&1;if(1!==r&&0!==i&&15!==i&&3!==a){var s=3===r?3-n:3===n?3:4,u=1e3*P.BitratesMap[14*s+i-1],l=3===r?0:2===r?1:2,c=P.SamplingRateMap[3*l+a],d=e[t+3]>>6==3?1:2,f=P.SamplesCoefficients[r][n],h=P.BytesInSlot[n],p=8*f*h;return{sampleRate:c,channelCount:d,frameLength:parseInt(f*u/c+o,10)*h,samplesPerFrame:p}}},isHeaderPattern:function(e,t){return 255===e[t]&&224==(224&e[t+1])&&0!=(6&e[t+1])},isHeader:function(e,t){return!!(t+1e?(this.word<<=e,this.bitsAvailable-=e):(e-=this.bitsAvailable,t=e>>3,e-=t>>3,this.bytesAvailable-=t,this.loadWord(),this.word<<=e,this.bitsAvailable-=e)},e.prototype.readBits=function(e){var t=Math.min(this.bitsAvailable,e),r=this.word>>>32-t;return e>32&&A.b.error("Cannot read more than 32 bits at a time"),this.bitsAvailable-=t,this.bitsAvailable>0?this.word<<=t:this.bytesAvailable>0&&this.loadWord(),t=e-t,t>0&&this.bitsAvailable?r<>>e))return this.word<<=e,this.bitsAvailable-=e,e;return this.loadWord(),e+this.skipLZ()},e.prototype.skipUEG=function(){this.skipBits(1+this.skipLZ())},e.prototype.skipEG=function(){this.skipBits(1+this.skipLZ())},e.prototype.readUEG=function(){var e=this.skipLZ();return this.readBits(e+1)-1},e.prototype.readEG=function(){var e=this.readUEG();return 1&e?1+e>>>1:-1*(e>>>1)},e.prototype.readBoolean=function(){return 1===this.readBits(1)},e.prototype.readUByte=function(){return this.readBits(8)},e.prototype.readUShort=function(){return this.readBits(16)},e.prototype.readUInt=function(){return this.readBits(32)},e.prototype.skipScalingList=function(e){var t=8,r=8,n=void 0,i=void 0;for(n=0;n=e.length)return void r();if(!(e[t].unit.length<32)){var n=this.decrypter.isSync();if(this.decryptAacSample(e,t,r,n),!n)return}}},e.prototype.getAvcEncryptedData=function(e){for(var t=16*Math.floor((e.length-48)/160)+16,r=new Int8Array(t),n=0,i=32;i<=e.length-16;i+=160,n+=16)r.set(e.subarray(i,i+16),n);return r},e.prototype.getAvcDecryptedUnit=function(e,t){t=new Uint8Array(t);for(var r=0,n=32;n<=e.length-16;n+=160,r+=16)e.set(t.subarray(r,r+16),n);return e},e.prototype.decryptAvcSample=function(e,t,r,n,i,a){var o=this.discardEPB(i.data),s=this.getAvcEncryptedData(o),u=this;this.decryptBuffer(s.buffer,function(s){i.data=u.getAvcDecryptedUnit(o,s),a||u.decryptAvcSamples(e,t,r+1,n)})},e.prototype.decryptAvcSamples=function(e,t,r,n){for(;;t++,r=0){if(t>=e.length)return void n();for(var i=e[t].units;!(r>=i.length);r++){var a=i[r];if(!(a.length<=48||1!==a.type&&5!==a.type)){var o=this.decrypter.isSync();if(this.decryptAvcSample(e,t,r,n,a,o),!o)return}}}},e}(),N=F,U={video:1,audio:2,id3:3,text:4},B=function(){function e(t,r,n,i){v(this,e),this.observer=t,this.config=n,this.typeSupported=i,this.remuxer=r,this.sampleAes=null}return e.prototype.setDecryptData=function(e){null!=e&&null!=e.key&&"SAMPLE-AES"===e.method?this.sampleAes=new N(this.observer,this.config,e,this.discardEPB):this.sampleAes=null},e.probe=function(t){var r=e._syncOffset(t);return!(r<0)&&(r&&A.b.warn("MPEG2-TS detected but first sync word found @ offset "+r+", junk ahead ?"),!0)},e._syncOffset=function(e){for(var t=Math.min(1e3,e.length-564),r=0;r>4>1){if((l=a+5+t[a+4])===a+188)continue}else l=a+4;switch(u){case v:s&&(_&&(c=C(_))&&void 0!==c.pts&&k(c,!1),_={data:[],size:0}),_&&(_.data.push(t.subarray(l,a+188)),_.size+=a+188-l);break;case y:s&&(E&&(c=C(E))&&void 0!==c.pts&&(p.isAAC?D(c):I(c)),E={data:[],size:0}),E&&(E.data.push(t.subarray(l,a+188)),E.size+=a+188-l);break;case m:s&&(w&&(c=C(w))&&void 0!==c.pts&&P(c),w={data:[],size:0}),w&&(w.data.push(t.subarray(l,a+188)),w.size+=a+188-l);break;case 0:s&&(l+=t[l]+1),b=this._pmtId=R(t,l);break;case b:s&&(l+=t[l]+1);var x=L(t,l,!0===this.typeSupported.mpeg||!0===this.typeSupported.mp3,null!=this.sampleAes);v=x.avc,v>0&&(h.pid=v),y=x.audio,y>0&&(p.pid=y,p.isAAC=x.isAAC),m=x.id3,m>0&&(g.pid=m),d&&!f&&(A.b.log("reparse from beginning"),d=!1,a=O-188),f=this.pmtParsed=!0;break;case 17:case 8191:break;default:d=!0}}else this.observer.trigger(T.a.ERROR,{type:S.b.MEDIA_ERROR,details:S.a.FRAG_PARSING_ERROR,fatal:!1,reason:"TS packet did not start with 0x47"});_&&(c=C(_))&&void 0!==c.pts?(k(c,!0),h.pesData=null):h.pesData=_,E&&(c=C(E))&&void 0!==c.pts?(p.isAAC?D(c):I(c),p.pesData=null):(E&&E.size&&A.b.log("last AAC PES packet truncated,might overlap between fragments"),p.pesData=E),w&&(c=C(w))&&void 0!==c.pts?(P(c),g.pesData=null):g.pesData=w,null==this.sampleAes?this.remuxer.remux(p,h,g,this._txtTrack,r,n,i):this.decryptAndRemux(p,h,g,this._txtTrack,r,n,i)},e.prototype.decryptAndRemux=function(e,t,r,n,i,a,o){if(e.samples&&e.isAAC){var s=this;this.sampleAes.decryptAacSamples(e.samples,0,function(){s.decryptAndRemuxAvc(e,t,r,n,i,a,o)})}else this.decryptAndRemuxAvc(e,t,r,n,i,a,o)},e.prototype.decryptAndRemuxAvc=function(e,t,r,n,i,a,o){if(t.samples){var s=this;this.sampleAes.decryptAvcSamples(t.samples,0,0,function(){s.remuxer.remux(e,t,r,n,i,a,o)})}else this.remuxer.remux(e,t,r,n,i,a,o)},e.prototype.destroy=function(){this._initPTS=this._initDTS=void 0,this._duration=0},e.prototype._parsePAT=function(e,t){return(31&e[t+10])<<8|e[t+11]},e.prototype._parsePMT=function(e,t,r,n){var i=void 0,a=void 0,o=void 0,s=void 0,u={audio:-1,avc:-1,id3:-1,isAAC:!0};for(i=(15&e[t+1])<<8|e[t+2],a=t+3+i-4,o=(15&e[t+10])<<8|e[t+11],t+=12+o;t1;){var d=new Uint8Array(c[0].length+c[1].length);d.set(c[0]),d.set(c[1],c[0].length),c[0]=d,c.splice(1,1)}if(r=c[0],1===(r[0]<<16)+(r[1]<<8)+r[2]){if((i=(r[4]<<8)+r[5])&&i>e.size-6)return null;n=r[7],192&n&&(s=536870912*(14&r[9])+4194304*(255&r[10])+16384*(254&r[11])+128*(255&r[12])+(254&r[13])/2,s>4294967295&&(s-=8589934592),64&n?(u=536870912*(14&r[14])+4194304*(255&r[15])+16384*(254&r[16])+128*(255&r[17])+(254&r[18])/2,u>4294967295&&(u-=8589934592),s-u>54e5&&(A.b.warn(Math.round((s-u)/9e4)+"s delta between PTS and DTS, align them"),s=u)):u=s),a=r[8],l=a+9,e.size-=l,o=new Uint8Array(e.size);for(var f=0,h=c.length;fp){l-=p;continue}r=r.subarray(l),p-=l,l=0}o.set(r,t),t+=p}return i&&(i-=a+3),{data:o,pts:s,dts:u,len:i}}return null},e.prototype.pushAccesUnit=function(e,t){if(e.units.length&&e.frame){var r=t.samples,n=r.length;!this.config.forceKeyFrameOnDiscontinuity||!0===e.key||t.sps&&(n||this.contiguous)?(e.id=n,r.push(e)):t.dropped++}e.debug.length&&A.b.log(e.pts+"/"+e.dts+":"+e.debug)},e.prototype._parseAVCPES=function(e,t){var r=this,n=this._avcTrack,i=this._parseAVCNALu(e.data),a=void 0,o=this.avcSample,s=void 0,u=!1,l=void 0,c=this.pushAccesUnit.bind(this),d=function(e,t,r,n){return{key:e,pts:t,dts:r,units:[],debug:n}};e.data=null,o&&i.length&&!n.audFound&&(c(o,n),o=this.avcSample=d(!1,e.pts,e.dts,"")),i.forEach(function(t){switch(t.type){case 1:s=!0,o||(o=r.avcSample=d(!0,e.pts,e.dts,"")),o.frame=!0;var i=t.data;if(u&&i.length>4){var f=new M(i).readSliceType();2!==f&&4!==f&&7!==f&&9!==f||(o.key=!0)}break;case 5:s=!0,o||(o=r.avcSample=d(!0,e.pts,e.dts,"")),o.key=!0,o.frame=!0;break;case 6:s=!0,a=new M(r.discardEPB(t.data)),a.readUByte();for(var h=0,p=0,g=!1,v=0;!g&&a.bytesAvailable>1;){h=0;do{v=a.readUByte(),h+=v}while(255===v);p=0;do{v=a.readUByte(),p+=v}while(255===v);if(4===h&&0!==a.bytesAvailable){g=!0;if(181===a.readUByte()){if(49===a.readUShort()){if(1195456820===a.readUInt()){if(3===a.readUByte()){var y=a.readUByte(),m=a.readUByte(),b=31&y,_=[y,m];for(l=0;l0){if(t.pts>=e[r-1].pts)e.push(t);else for(var n=r-1;n>=0;n--)if(t.pts=0)l={data:e.subarray(d,t-o-1),type:f},u.push(l);else{var h=this._getLastNalUnit();if(h&&(s&&t<=4-s&&h.state&&(h.data=h.data.subarray(0,h.data.byteLength-s)),(i=t-o-1)>0)){var p=new Uint8Array(h.data.byteLength+i);p.set(h.data,0),p.set(e.subarray(0,i),h.data.byteLength),h.data=p}}t=0&&o>=0&&(l={data:e.subarray(d,r),type:f,state:o},u.push(l)),0===u.length){var g=this._getLastNalUnit();if(g){var v=new Uint8Array(g.data.byteLength+e.byteLength);v.set(g.data,0),v.set(e,g.data.byteLength),g.data=v}}return a.naluState=o,u},e.prototype.discardEPB=function(e){for(var t=e.byteLength,r=[],n=1,i=void 0,a=void 0;n1&&(A.b.log("AAC: align PTS for overlapping frames by "+Math.round((m-n)/90)),n=m)}for(;d>24&255,a[1]=r>>16&255,a[2]=r>>8&255,a[3]=255&r,a.set(e,4),n=0,r=8;n>24&255,t>>16&255,t>>8&255,255&t,n>>24,n>>16&255,n>>8&255,255&n,i>>24,i>>16&255,i>>8&255,255&i,85,196,0,0]))},e.mdia=function(t){return e.box(e.types.mdia,e.mdhd(t.timescale,t.duration),e.hdlr(t.type),e.minf(t))},e.mfhd=function(t){return e.box(e.types.mfhd,new Uint8Array([0,0,0,0,t>>24,t>>16&255,t>>8&255,255&t]))},e.minf=function(t){return"audio"===t.type?e.box(e.types.minf,e.box(e.types.smhd,e.SMHD),e.DINF,e.stbl(t)):e.box(e.types.minf,e.box(e.types.vmhd,e.VMHD),e.DINF,e.stbl(t))},e.moof=function(t,r,n){return e.box(e.types.moof,e.mfhd(t),e.traf(n,r))},e.moov=function(t){for(var r=t.length,n=[];r--;)n[r]=e.trak(t[r]);return e.box.apply(null,[e.types.moov,e.mvhd(t[0].timescale,t[0].duration)].concat(n).concat(e.mvex(t)))},e.mvex=function(t){for(var r=t.length,n=[];r--;)n[r]=e.trex(t[r]);return e.box.apply(null,[e.types.mvex].concat(n))},e.mvhd=function(t,r){r*=t;var n=Math.floor(r/(Y+1)),i=Math.floor(r%(Y+1)),a=new Uint8Array([1,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,3,t>>24&255,t>>16&255,t>>8&255,255&t,n>>24,n>>16&255,n>>8&255,255&n,i>>24,i>>16&255,i>>8&255,255&i,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255]);return e.box(e.types.mvhd,a)},e.sdtp=function(t){var r=t.samples||[],n=new Uint8Array(4+r.length),i=void 0,a=void 0;for(a=0;a>>8&255),r.push(255&o),r=r.concat(Array.prototype.slice.call(a));for(i=0;i>>8&255),n.push(255&o),n=n.concat(Array.prototype.slice.call(a));var s=e.box(e.types.avcC,new Uint8Array([1,r[3],r[4],r[5],255,224|t.sps.length].concat(r).concat([t.pps.length]).concat(n))),u=t.width,l=t.height,c=t.pixelRatio[0],d=t.pixelRatio[1];return e.box(e.types.avc1,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,u>>8&255,255&u,l>>8&255,255&l,0,72,0,0,0,72,0,0,0,0,0,0,0,1,18,100,97,105,108,121,109,111,116,105,111,110,47,104,108,115,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,17,17]),s,e.box(e.types.btrt,new Uint8Array([0,28,156,128,0,45,198,192,0,45,198,192])),e.box(e.types.pasp,new Uint8Array([c>>24,c>>16&255,c>>8&255,255&c,d>>24,d>>16&255,d>>8&255,255&d])))},e.esds=function(e){var t=e.config.length;return new Uint8Array([0,0,0,0,3,23+t,0,1,0,4,15+t,64,21,0,0,0,0,0,0,0,0,0,0,0,5].concat([t]).concat(e.config).concat([6,1,2]))},e.mp4a=function(t){var r=t.samplerate;return e.box(e.types.mp4a,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,t.channelCount,0,16,0,0,0,0,r>>8&255,255&r,0,0]),e.box(e.types.esds,e.esds(t)))},e.mp3=function(t){var r=t.samplerate;return e.box(e.types[".mp3"],new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,t.channelCount,0,16,0,0,0,0,r>>8&255,255&r,0,0]))},e.stsd=function(t){return"audio"===t.type?t.isAAC||"mp3"!==t.codec?e.box(e.types.stsd,e.STSD,e.mp4a(t)):e.box(e.types.stsd,e.STSD,e.mp3(t)):e.box(e.types.stsd,e.STSD,e.avc1(t))},e.tkhd=function(t){var r=t.id,n=t.duration*t.timescale,i=t.width,a=t.height,o=Math.floor(n/(Y+1)),s=Math.floor(n%(Y+1));return e.box(e.types.tkhd,new Uint8Array([1,0,0,7,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,3,r>>24&255,r>>16&255,r>>8&255,255&r,0,0,0,0,o>>24,o>>16&255,o>>8&255,255&o,s>>24,s>>16&255,s>>8&255,255&s,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,i>>8&255,255&i,0,0,a>>8&255,255&a,0,0]))},e.traf=function(t,r){var n=e.sdtp(t),i=t.id,a=Math.floor(r/(Y+1)),o=Math.floor(r%(Y+1));return e.box(e.types.traf,e.box(e.types.tfhd,new Uint8Array([0,0,0,0,i>>24,i>>16&255,i>>8&255,255&i])),e.box(e.types.tfdt,new Uint8Array([1,0,0,0,a>>24,a>>16&255,a>>8&255,255&a,o>>24,o>>16&255,o>>8&255,255&o])),e.trun(t,n.length+16+20+8+16+8+8),n)},e.trak=function(t){return t.duration=t.duration||4294967295,e.box(e.types.trak,e.tkhd(t),e.mdia(t))},e.trex=function(t){var r=t.id;return e.box(e.types.trex,new Uint8Array([0,0,0,0,r>>24,r>>16&255,r>>8&255,255&r,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1]))},e.trun=function(t,r){var n=t.samples||[],i=n.length,a=12+16*i,o=new Uint8Array(a),s=void 0,u=void 0,l=void 0,c=void 0,d=void 0,f=void 0;for(r+=8+a,o.set([0,0,15,1,i>>>24&255,i>>>16&255,i>>>8&255,255&i,r>>>24&255,r>>>16&255,r>>>8&255,255&r],0),s=0;s>>24&255,l>>>16&255,l>>>8&255,255&l,c>>>24&255,c>>>16&255,c>>>8&255,255&c,d.isLeading<<2|d.dependsOn,d.isDependedOn<<6|d.hasRedundancy<<4|d.paddingValue<<1|d.isNonSync,61440&d.degradPrio,15&d.degradPrio,f>>>24&255,f>>>16&255,f>>>8&255,255&f],12+16*s);return e.box(e.types.trun,o)},e.initSegment=function(t){e.types||e.init();var r=e.moov(t),n=void 0;return n=new Uint8Array(e.FTYP.byteLength+r.byteLength),n.set(e.FTYP),n.set(r,e.FTYP.byteLength),n},e}(),V=q,z=function(){function e(t,r,n,i){_(this,e),this.observer=t,this.config=r,this.typeSupported=n;var a=navigator.userAgent;this.isSafari=i&&i.indexOf("Apple")>-1&&a&&!a.match("CriOS"),this.ISGenerated=!1}return e.prototype.destroy=function(){},e.prototype.resetTimeStamp=function(e){this._initPTS=this._initDTS=e},e.prototype.resetInitSegment=function(){this.ISGenerated=!1},e.prototype.remux=function(e,t,r,n,i,a,o){if(this.ISGenerated||this.generateIS(e,t,i),this.ISGenerated){var s=e.samples.length,u=t.samples.length,l=i,c=i;if(s&&u){var d=(e.samples[0].dts-t.samples[0].dts)/t.inputTimeScale;l+=Math.max(0,d),c+=Math.max(0,-d)}if(s){e.timescale||(A.b.warn("regenerate InitSegment as audio detected"),this.generateIS(e,t,i));var f=this.remuxAudio(e,l,a,o);if(u){var h=void 0;f&&(h=f.endPTS-f.startPTS),t.timescale||(A.b.warn("regenerate InitSegment as video detected"),this.generateIS(e,t,i)),this.remuxVideo(t,c,a,h,o)}}else if(u){var p=this.remuxVideo(t,c,a,0,o);p&&e.codec&&this.remuxEmptyAudio(e,l,a,p)}}r.samples.length&&this.remuxID3(r,i),n.samples.length&&this.remuxText(n,i),this.observer.trigger(T.a.FRAG_PARSED)},e.prototype.generateIS=function(e,t,r){var n=this.observer,i=e.samples,a=t.samples,o=this.typeSupported,s="audio/mp4",u={},l={tracks:u},c=void 0===this._initPTS,d=void 0,f=void 0;if(c&&(d=f=1/0),e.config&&i.length&&(e.timescale=e.samplerate,A.b.log("audio sampling rate : "+e.samplerate),e.isAAC||(o.mpeg?(s="audio/mpeg",e.codec=""):o.mp3&&(e.codec="mp3")),u.audio={container:s,codec:e.codec,initSegment:!e.isAAC&&o.mpeg?new Uint8Array:V.initSegment([e]),metadata:{channelCount:e.channelCount}},c&&(d=f=i[0].pts-e.inputTimeScale*r)),t.sps&&t.pps&&a.length){var h=t.inputTimeScale;t.timescale=h,u.video={container:"video/mp4",codec:t.codec,initSegment:V.initSegment([t]),metadata:{width:t.width,height:t.height}},c&&(d=Math.min(d,a[0].pts-h*r),f=Math.min(f,a[0].dts-h*r),this.observer.trigger(T.a.INIT_PTS_FOUND,{initPTS:d}))}Object.keys(u).length?(n.trigger(T.a.FRAG_PARSING_INIT_SEGMENT,l),this.ISGenerated=!0,c&&(this._initPTS=d,this._initDTS=f)):n.trigger(T.a.ERROR,{type:S.b.MEDIA_ERROR,details:S.a.FRAG_PARSING_ERROR,fatal:!1,reason:"no audio/video samples found"})},e.prototype.remuxVideo=function(e,t,r,n,i){var a=8,o=e.timescale,s=void 0,u=void 0,l=void 0,c=void 0,d=void 0,f=void 0,h=void 0,p=e.samples,g=[],v=p.length,y=this._PTSNormalize,m=this._initDTS,b=this.nextAvcDts,_=this.isSafari;if(0!==v){_&&(r|=p.length&&b&&(i&&Math.abs(t-b/o)<.1||Math.abs(p[0].pts-b-m)1?A.b.log("AVC:"+L+" ms hole between fragments detected,filling it"):L<-1&&A.b.log("AVC:"+-L+" ms overlapping between fragments detected"),d=b,p[0].dts=d,c=Math.max(c-L,b),p[0].pts=c,A.b.log("Video/PTS/DTS adjusted: "+Math.round(c/90)+"/"+Math.round(d/90)+",delta:"+L+" ms")),d,R=p[p.length-1],h=Math.max(R.dts,0),f=Math.max(R.pts,0,h),_&&(s=Math.round((h-d)/(p.length-1)));for(var C=0,k=0,D=0;D0?U-1:U].dts;if(X.stretchShortVideoTrack){var J=X.maxBufferHole,$=Math.floor(J*o),Z=(n?c+n*o:this.nextAudioPts)-B.pts;Z>$?(s=Z-Q,s<0&&(s=Q),A.b.log("It is approximately "+Z/90+" ms to the next segment; using duration "+s/90+" ms for the last video frame.")):s=Q}else s=Q}K=Math.round(B.pts-B.dts)}g.push({size:j,duration:s,cts:K,flags:{isLeading:0,isDependedOn:0,hasRedundancy:0,degradPrio:0,dependsOn:B.key?2:1,isNonSync:B.key?0:1}})}this.nextAvcDts=h+s;var ee=e.dropped;if(e.len=0,e.nbNalu=0,e.dropped=0,g.length&&navigator.userAgent.toLowerCase().indexOf("chrome")>-1){var te=g[0].flags;te.dependsOn=2,te.isNonSync=0}e.samples=g,l=V.moof(e.sequenceNumber++,d,e),e.samples=[];var re={data1:l,data2:u,startPTS:c/o,endPTS:(f+s)/o,startDTS:d/o,endDTS:this.nextAvcDts/o,type:"video",hasAudio:!1,hasVideo:!0,nb:g.length,dropped:ee};return this.observer.trigger(T.a.FRAG_PARSING_DATA,re),re}},e.prototype.remuxAudio=function(e,t,r,n){var i=e.inputTimeScale,a=e.timescale,o=i/a,s=e.isAAC?1024:1152,u=s*o,l=this._PTSNormalize,c=this._initDTS,d=!e.isAAC&&this.typeSupported.mpeg,f=void 0,h=void 0,p=void 0,g=void 0,v=void 0,y=void 0,m=void 0,b=e.samples,_=[],E=this.nextAudioPts;if(r|=b.length&&E&&(n&&Math.abs(t-E/i)<.1||Math.abs(b[0].pts-E-c)<20*u),b.forEach(function(e){e.pts=e.dts=l(e.pts-c,t*i)}),b=b.filter(function(e){return e.pts>=0}),0!==b.length){if(r||(E=n?t*i:b[0].pts),e.isAAC)for(var w=this.config.maxAudioFramesDrift,R=0,L=E;R=w*u&&I<1e4&&L){var P=Math.round(C/u);A.b.warn("Injecting "+P+" audio frame @ "+(L/i).toFixed(3)+"s due to "+Math.round(1e3*C/i)+" ms gap.");for(var O=0;O0&&G<1e4)j=Math.round((B-E)/u),A.b.log(G+" ms hole between AAC samples detected,filling it"),j>0&&(p=W.getSilentFrame(e.manifestCodec||e.codec,e.channelCount),p||(p=U.subarray()),e.len+=j*p.length);else if(G<-12){A.b.log("drop overlapping AAC sample, expected/parsed/delta:"+(E/i).toFixed(3)+"s/"+(B/i).toFixed(3)+"s/"+-G+"ms"),e.len-=U.byteLength;continue}B=E}if(y=B,!(e.len>0))return;var K=d?e.len:e.len+8;f=d?0:8;try{g=new Uint8Array(K)}catch(e){return void this.observer.trigger(T.a.ERROR,{type:S.b.MUX_ERROR,details:S.a.REMUX_ALLOC_ERROR,fatal:!1,bytes:K,reason:"fail allocating audio mdat "+K})}if(!d){new DataView(g.buffer).setUint32(0,K),g.set(V.types.mdat,4)}for(var H=0;H=2&&(q=_[z-2].duration,h.duration=q),z){this.nextAudioPts=E=m+o*q,e.len=0,e.samples=_,v=d?new Uint8Array:V.moof(e.sequenceNumber++,y/o,e),e.samples=[];var X=y/i,Q=E/i,J={data1:v,data2:g,startPTS:X,endPTS:Q,startDTS:X,endDTS:Q,type:"audio",hasAudio:!0,hasVideo:!1,nb:z};return this.observer.trigger(T.a.FRAG_PARSING_DATA,J),J}return null}},e.prototype.remuxEmptyAudio=function(e,t,r,n){var i=e.inputTimeScale,a=e.samplerate?e.samplerate:i,o=i/a,s=this.nextAudioPts,u=(void 0!==s?s:n.startDTS*i)+this._initDTS,l=n.endDTS*i+this._initDTS,c=1024*o,d=Math.ceil((l-u)/c),f=W.getSilentFrame(e.manifestCodec||e.codec,e.channelCount);if(A.b.warn("remux empty Audio"),!f)return void A.b.trace("Unable to remuxEmptyAudio since we were unable to get a silent frame for given audio codec!");for(var h=[],p=0;p4294967296;)e+=r;return e},e}(),X=z,Q=function(){function e(t){E(this,e),this.observer=t}return e.prototype.destroy=function(){},e.prototype.resetTimeStamp=function(){},e.prototype.resetInitSegment=function(){},e.prototype.remux=function(e,t,r,n,i,a,o,s){var u=this.observer,l="";e&&(l+="audio"),t&&(l+="video"),u.trigger(T.a.FRAG_PARSING_DATA,{data1:s,startPTS:i,startDTS:i,type:l,hasAudio:!!e,hasVideo:!!t,nb:1,dropped:0}),u.trigger(T.a.FRAG_PARSED)},e}(),J=Q,$=Object(L.a)(),Z=$,ee=function(){function e(t,r,n,i){w(this,e),this.observer=t,this.typeSupported=r,this.config=n,this.vendor=i}return e.prototype.destroy=function(){var e=this.demuxer;e&&e.destroy()},e.prototype.push=function(e,t,r,n,i,a,o,s,u,l,c,d){if(e.byteLength>0&&null!=t&&null!=t.key&&"AES-128"===t.method){var f=this.decrypter;null==f&&(f=this.decrypter=new R.a(this.observer,this.config));var h=this,p=void 0;try{p=Z.now()}catch(e){p=Date.now()}f.decrypt(e,t.key.buffer,t.iv.buffer,function(e){var f=void 0;try{f=Z.now()}catch(e){f=Date.now()}h.observer.trigger(T.a.FRAG_DECRYPTED,{stats:{tstart:p,tdecrypt:f}}),h.pushDecrypted(new Uint8Array(e),t,new Uint8Array(r),n,i,a,o,s,u,l,c,d)})}else this.pushDecrypted(new Uint8Array(e),t,new Uint8Array(r),n,i,a,o,s,u,l,c,d)},e.prototype.pushDecrypted=function(e,t,r,n,i,a,o,s,u,l,c,d){var f=this.demuxer;if(!f||(o||s)&&!this.probe(e)){for(var h=this.observer,p=this.typeSupported,g=this.config,v=[{demux:G,remux:X},{demux:I.a,remux:J},{demux:D,remux:X},{demux:K,remux:X}],y=0,m=v.length;yt?n.start+n.duration:Math.max(n.start-i.duration,0):r>t?(n.duration=a-n.start,n.duration<0&&Je.b.warn("negative duration computed for frag "+n.sn+",level "+n.level+", there should be some duration drift between playlist and fragment!")):(i.duration=n.start-a,i.duration<0&&Je.b.warn("negative duration computed for frag "+i.sn+",level "+i.level+", there should be some duration drift between playlist and fragment!"))}function L(e,t,r,n,i,a){var o=r;if(!isNaN(t.startPTS)){var s=Math.abs(t.startPTS-r);isNaN(t.deltaPTS)?t.deltaPTS=s:t.deltaPTS=Math.max(s,t.deltaPTS),o=Math.max(r,t.startPTS),r=Math.min(r,t.startPTS),n=Math.max(n,t.endPTS),i=Math.min(i,t.startDTS),a=Math.max(a,t.endDTS)}var u=r-t.start;t.start=t.startPTS=r,t.maxStartPTS=o,t.endPTS=n,t.startDTS=i,t.endDTS=a,t.duration=n-r;var l=t.sn;if(!e||le.endSN)return 0;var c=void 0,d=void 0,f=void 0;for(c=l-e.startSN,d=e.fragments,d[c]=t,f=c;f>0;f--)A(d,f,f-1);for(f=c;f=0&&it?-1:0})}function I(e,t,r){var n=!1;return t&&t.details&&r&&(r.endCC>r.startCC||e&&e.cc0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=arguments[2],n=0;if(r.programDateTime){var i=Date.parse(r.programDateTime);isNaN(i)||(n=1e3*t+i-1e3*e)}return n}function B(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if(!Array.isArray(e)||!e.length||null===t)return null;if(t=e[e.length-1].endPdt)return null;for(var r=0;r2&&void 0!==arguments[2]?arguments[2]:0,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,a=void 0,o=e?t[e.sn-t[0].sn+1]:null;return rn-i&&(i=0),a=o&&!j(r,i,o)?o:Mt.search(t,j.bind(null,r,i))),a}function j(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=arguments[2],n=Math.min(t,r.duration+(r.deltaPTS?r.deltaPTS:0));return r.start+r.duration-n<=e?1:r.start-n>e&&r.start?-1:0}function K(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function H(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function W(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function Y(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function q(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function V(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function z(e,t){var r=null;try{r=new window.Event("addtrack")}catch(e){r=document.createEvent("Event"),r.initEvent("addtrack",!1,!1)}r.track=e,t.dispatchEvent(r)}function X(e){if(e&&e.cues)for(;e.cues.length>0;)e.removeCue(e.cues[0])}function Q(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function J(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function $(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function Z(){var e=T(),t=window.SourceBuffer||window.WebKitSourceBuffer,r=e&&"function"==typeof e.isTypeSupported&&e.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"'),n=!t||t.prototype&&"function"==typeof t.prototype.appendBuffer&&"function"==typeof t.prototype.remove;return!!r&&!!n}function ee(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function te(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function re(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function ne(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function ie(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function ae(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function oe(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function se(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function ue(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function le(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function ce(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function de(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function fe(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function he(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function pe(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function ge(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function ve(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function ye(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function me(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function be(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _e(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function Ee(){this.window=window,this.state="INITIAL",this.buffer="",this.decoder=new Wr,this.regionList=[]}function we(e){function t(e,t,r,n){return 3600*(0|e)+60*(0|t)+(0|r)+(0|n)/1e3}var r=e.match(/^(\d+):(\d{2})(:\d{2})?\.(\d{3})/);return r?r[3]?t(r[1],r[2],r[3].replace(":",""),r[4]):r[1]>59?t(r[1],r[2],0,r[4]):t(0,r[1],r[2],r[4]):null}function Te(){this.values=Object.create(null)}function Se(e,t,r,n){var i=n?e.split(n):[e];for(var a in i)if("string"==typeof i[a]){var o=i[a].split(r);if(2===o.length){var s=o[0],u=o[1];t(s,u)}}}function Re(e,t,r){function n(){var t=we(e);if(null===t)throw new Error("Malformed timestamp: "+a);return e=e.replace(/^[^\sa-zA-Z-]+/,""),t}function i(){e=e.replace(/^\s+/,"")}var a=e;if(i(),t.startTime=n(),i(),"--\x3e"!==e.substr(0,3))throw new Error("Malformed time stamp (time stamps must be separated by '--\x3e'): "+a);e=e.substr(3),i(),t.endTime=n(),i(),function(e,t){var n=new Te;Se(e,function(e,t){switch(e){case"region":for(var i=r.length-1;i>=0;i--)if(r[i].id===t){n.set(e,r[i].region);break}break;case"vertical":n.alt(e,t,["rl","lr"]);break;case"line":var a=t.split(","),o=a[0];n.integer(e,o),n.percent(e,o)&&n.set("snapToLines",!1),n.alt(e,o,["auto"]),2===a.length&&n.alt("lineAlign",a[1],["start",qr,"end"]);break;case"position":a=t.split(","),n.percent(e,a[0]),2===a.length&&n.alt("positionAlign",a[1],["start",qr,"end","line-left","line-right","auto"]);break;case"size":n.percent(e,t);break;case"align":n.alt(e,t,["start",qr,"end","left","right"])}},/:/,/\s/),t.region=n.get("region",null),t.vertical=n.get("vertical","");var i=n.get("line","auto");"auto"===i&&-1===Yr.line&&(i=-1),t.line=i,t.lineAlign=n.get("lineAlign","start"),t.snapToLines=n.get("snapToLines",!0),t.size=n.get("size",100),t.align=n.get("align",qr);var a=n.get("position","auto");"auto"===a&&50===Yr.position&&(a="start"===t.align||"left"===t.align?0:"end"===t.align||"right"===t.align?100:50),t.position=a}(e,t)}function Ae(e){return e.replace(//gi,"\n")}function Le(e,t,r,n){for(var i=void 0,a=void 0,o=void 0,s=void 0,u=void 0,l=window.VTTCue||window.TextTrackCue,c=0;c=16?s--:s++,navigator.userAgent.match(/Firefox\//)?a.line=c+1:a.line=c>7?c-2:c+1,a.align="left",a.position=Math.max(0,Math.min(100,s/32*100+(navigator.userAgent.match(/Firefox\//)?50:0))),e.addCue(a)}}function Ce(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function ke(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function De(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Ie(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function Pe(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function Oe(e,t){return e&&e.label===t.name&&!(e.textTrack1||e.textTrack2)}function xe(e,t,r,n){return Math.min(t,n)-Math.max(e,r)}function Me(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Fe(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function Ne(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function Ue(e){for(var t=[],r=0;r1?r-1:0),a=1;a>8*(15-r)&255;return t},e.prototype.fragmentDecryptdataFromLevelkey=function(e,t){var r=e;return e&&e.method&&e.uri&&!e.iv&&(r=new at,r.method=e.method,r.baseuri=e.baseuri,r.reluri=e.reluri,r.iv=this.createInitializationVector(t)),r},ot(e,[{key:"url",get:function(){return!this._url&&this.relurl&&(this._url=ze.a.buildAbsoluteURL(this.baseurl,this.relurl,{alwaysNormalize:!0})),this._url},set:function(e){this._url=e}},{key:"programDateTime",get:function(){return!this._programDateTime&&this.rawProgramDateTime&&(this._programDateTime=new Date(Date.parse(this.rawProgramDateTime))),this._programDateTime}},{key:"byteRange",get:function(){if(!this._byteRange&&!this.rawByteRange)return[];if(this._byteRange)return this._byteRange;var e=[];if(this.rawByteRange){var t=this.rawByteRange.split("@",2);if(1===t.length){var r=this.lastByteRangeEndOffset;e[0]=r||0}else e[0]=parseInt(t[1]);e[1]=parseInt(t[0])+e[0],this._byteRange=e}return e}},{key:"byteRangeStartOffset",get:function(){return this.byteRange[0]}},{key:"byteRangeEndOffset",get:function(){return this.byteRange[1]}},{key:"decryptdata",get:function(){return this._decryptdata||(this._decryptdata=this.fragmentDecryptdataFromLevelkey(this.levelkey,this.sn)),this._decryptdata}},{key:"encrypted",get:function(){return!(!this.decryptdata||null===this.decryptdata.uri||null!==this.decryptdata.key)}}],[{key:"ElementaryStreamTypes",get:function(){return{AUDIO:"audio",VIDEO:"video"}}}]),e}(),ut=st,lt=/^(\d+)x(\d+)$/,ct=/\s*(.+?)\s*=((?:\".*?\")|.*?)(?:,|$)/g,dt=function(){function e(t){o(this,e),"string"==typeof t&&(t=e.parseAttrList(t));for(var r in t)t.hasOwnProperty(r)&&(this[r]=t[r])}return e.prototype.decimalInteger=function(e){var t=parseInt(this[e],10);return t>Number.MAX_SAFE_INTEGER?1/0:t},e.prototype.hexadecimalInteger=function(e){if(this[e]){var t=(this[e]||"0x").slice(2);t=(1&t.length?"0":"")+t;for(var r=new Uint8Array(t.length/2),n=0;nNumber.MAX_SAFE_INTEGER?1/0:t},e.prototype.decimalFloatingPoint=function(e){return parseFloat(this[e])},e.prototype.enumeratedString=function(e){return this[e]},e.prototype.decimalResolution=function(e){var t=lt.exec(this[e]);if(null!==t)return{width:parseInt(t[1],10),height:parseInt(t[2],10)}},e.parseAttrList=function(e){var t=void 0,r={};for(ct.lastIndex=0;null!==(t=ct.exec(e));){var n=t[2];0===n.indexOf('"')&&n.lastIndexOf('"')===n.length-1&&(n=n.slice(1,-1)),r[t[1]]=n}return r},e}(),ft=dt,ht={audio:{a3ds:!0,"ac-3":!0,"ac-4":!0,alac:!0,alaw:!0,dra1:!0,"dts+":!0,"dts-":!0,dtsc:!0,dtse:!0,dtsh:!0,"ec-3":!0,enca:!0,g719:!0,g726:!0,m4ae:!0,mha1:!0,mha2:!0,mhm1:!0,mhm2:!0,mlpa:!0,mp4a:!0,"raw ":!0,Opus:!0,samr:!0,sawb:!0,sawp:!0,sevc:!0,sqcp:!0,ssmv:!0,twos:!0,ulaw:!0},video:{avc1:!0,avc2:!0,avc3:!0,avc4:!0,avcp:!0,drac:!0,dvav:!0,dvhe:!0,encv:!0,hev1:!0,hvc1:!0,mjp2:!0,mp4v:!0,mvc1:!0,mvc2:!0,mvc3:!0,mvc4:!0,resv:!0,rv60:!0,s263:!0,svc1:!0,svc2:!0,"vc-1":!0,vp08:!0,vp09:!0}},pt=/#EXT-X-STREAM-INF:([^\n\r]*)[\r\n]+([^\r\n]+)/g,gt=/#EXT-X-MEDIA:(.*)/g,vt=new RegExp([/#EXTINF:\s*(\d*(?:\.\d+)?)(?:,(.*)\s+)?/.source,/|(?!#)(\S+)/.source,/|#EXT-X-BYTERANGE:*(.+)/.source,/|#EXT-X-PROGRAM-DATE-TIME:(.+)/.source,/|#.*/.source].join(""),"g"),yt=/(?:(?:#(EXTM3U))|(?:#EXT-X-(PLAYLIST-TYPE):(.+))|(?:#EXT-X-(MEDIA-SEQUENCE): *(\d+))|(?:#EXT-X-(TARGETDURATION): *(\d+))|(?:#EXT-X-(KEY):(.+))|(?:#EXT-X-(START):(.+))|(?:#EXT-X-(ENDLIST))|(?:#EXT-X-(DISCONTINUITY-SEQ)UENCE:(\d+))|(?:#EXT-X-(DIS)CONTINUITY))|(?:#EXT-X-(VERSION):(\d+))|(?:#EXT-X-(MAP):(.+))|(?:(#)(.*):(.*))|(?:(#)(.*))(?:.*)\r?\n?/,mt=/\.(mp4|m4s|m4v|m4a)$/i,bt=function(){function e(){l(this,e)}return e.findGroup=function(e,t){if(!e)return null;for(var r=null,n=0;n2?(t=r.shift()+".",t+=parseInt(r.shift()).toString(16),t+=("000"+parseInt(r.shift()).toString(16)).substr(-4)):t=e,t},e.resolve=function(e,t){return ze.a.buildAbsoluteURL(t,e,{alwaysNormalize:!0})},e.parseMasterPlaylist=function(t,r){var n=[],i=void 0;for(pt.lastIndex=0;null!=(i=pt.exec(t));){var a={},o=a.attrs=new ft(i[1]);a.url=e.resolve(i[2],r);var u=o.decimalResolution("RESOLUTION");u&&(a.width=u.width,a.height=u.height),a.bitrate=o.decimalInteger("AVERAGE-BANDWIDTH")||o.decimalInteger("BANDWIDTH"),a.name=o.NAME,function(e,t){["video","audio"].forEach(function(r){var n=e.filter(function(e){return s(e,r)});if(n.length){var i=n.filter(function(e){return 0===e.lastIndexOf("avc1",0)||0===e.lastIndexOf("mp4a",0)});t[r+"Codec"]=i.length>0?i[0]:n[0],e=e.filter(function(e){return-1===n.indexOf(e)})}}),t.unknownCodecs=e}([].concat((o.CODECS||"").split(/[ ,]+/)),a),a.videoCodec&&-1!==a.videoCodec.indexOf("avc1")&&(a.videoCodec=e.convertAVC1ToAVCOTI(a.videoCodec)),n.push(a)}return n},e.parseMasterPlaylistMedia=function(t,r,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],a=void 0,o=[],s=0;for(gt.lastIndex=0;null!==(a=gt.exec(t));){var u={},l=new ft(a[1]);if(l.TYPE===n){if(u.groupId=l["GROUP-ID"],u.name=l.NAME,u.type=n,u.default="YES"===l.DEFAULT,u.autoselect="YES"===l.AUTOSELECT,u.forced="YES"===l.FORCED,l.URI&&(u.url=e.resolve(l.URI,r)),u.lang=l.LANGUAGE,u.name||(u.name=u.lang),i.length){var c=e.findGroup(i,u.groupId);u.audioCodec=c?c.codec:i[0].codec}u.id=s++,o.push(u)}}return o},e.parseLevelPlaylist=function(e,t,r,n,i){var a=0,o=0,s={type:null,version:null,url:t,fragments:[],live:!0,startSN:0},u=new at,l=0,c=null,d=new ut,f=void 0,h=void 0;for(vt.lastIndex=0;null!==(f=vt.exec(e));){var p=f[1];if(p){d.duration=parseFloat(p);var g=(" "+f[2]).slice(1);d.title=g||null,d.tagList.push(g?["INF",p,g]:["INF",p])}else if(f[3]){if(!isNaN(d.duration)){var v=a++;d.type=n,d.start=o,d.levelkey=u,d.sn=v,d.level=r,d.cc=l,d.urlId=i,d.baseurl=t,d.relurl=(" "+f[3]).slice(1),s.programDateTime&&(c?d.rawProgramDateTime?d.pdt=Date.parse(d.rawProgramDateTime):d.pdt=c.pdt+1e3*c.duration:d.pdt=Date.parse(s.programDateTime),d.endPdt=d.pdt+1e3*d.duration),s.fragments.push(d),c=d,o+=d.duration,d=new ut}}else if(f[4]){if(d.rawByteRange=(" "+f[4]).slice(1),c){var y=c.byteRangeEndOffset;y&&(d.lastByteRangeEndOffset=y)}}else if(f[5])d.rawProgramDateTime=(" "+f[5]).slice(1),d.tagList.push(["PROGRAM-DATE-TIME",d.rawProgramDateTime]),void 0===s.programDateTime&&(s.programDateTime=new Date(new Date(Date.parse(f[5]))-1e3*o));else{for(f=f[0].match(yt),h=1;h=0&&(u.method=w,u.baseuri=t,u.reluri=T,u.key=null,u.iv=S));break;case"START":var R=m,A=new ft(R),L=A.decimalFloatingPoint("TIME-OFFSET");isNaN(L)||(s.startTimeOffset=L);break;case"MAP":var C=new ft(m);d.relurl=C.URI,d.rawByteRange=C.BYTERANGE,d.baseurl=t,d.level=r,d.type=n,d.sn="initSegment",s.initSegment=d,d=new ut;break;default:Je.b.warn("line parsed but not handled: "+f)}}}return d=c,d&&!d.relurl&&(s.fragments.pop(),o-=d.duration),s.totalduration=o,s.averagetargetduration=o/s.fragments.length,s.endSN=a-1,s.startCC=s.fragments[0]?s.fragments[0].cc:0,s.endCC=l,!s.initSegment&&s.fragments.length&&s.fragments.every(function(e){return mt.test(e.relurl)})&&(Je.b.warn("MP4 fragments found but no init segment (probably no MAP, incomplete M3U8), trying to fetch SIDX"),d=new ut,d.relurl=s.fragments[0].relurl,d.baseurl=t,d.level=r,d.type=n,d.sn="initSegment",s.initSegment=d,s.needSidxRanges=!0),s},e}(),_t=bt,Et=function(){function e(e,t){for(var r=0;r3&&void 0!==arguments[3]?arguments[3]:null;if(r.isSidxRequest)return this._handleSidxRequest(e,r),void this._handlePlaylistLoaded(e,t,r,n);this.resetInternalLoader(r.type);var i=e.data;if(t.tload=Tt.now(),0!==i.indexOf("#EXTM3U"))return void this._handleManifestParsingError(e,r,"no EXTM3U delimiter",n);i.indexOf("#EXTINF:")>0||i.indexOf("#EXT-X-TARGETDURATION:")>0?this._handleTrackOrLevelPlaylist(e,t,r,n):this._handleMasterPlaylist(e,t,r,n)},t.prototype.loaderror=function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;this._handleNetworkError(t,r)},t.prototype.loadtimeout=function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;this._handleNetworkError(t,r,!0)},t.prototype._handleMasterPlaylist=function(e,r,n,i){var a=this.hls,o=e.data,s=t.getResponseUrl(e,n),u=_t.parseMasterPlaylist(o,s);if(!u.length)return void this._handleManifestParsingError(e,n,"no level found in manifest",i);var l=u.map(function(e){return{id:e.attrs.AUDIO,codec:e.audioCodec}}),c=_t.parseMasterPlaylistMedia(o,s,"AUDIO",l),d=_t.parseMasterPlaylistMedia(o,s,"SUBTITLES");if(c.length){var f=!1;c.forEach(function(e){e.url||(f=!0)}),!1===f&&u[0].audioCodec&&!u[0].attrs.AUDIO&&(Je.b.log("audio codec signaled in quality level, but no embedded audio track signaled, create one"),c.unshift({type:"main",name:"main"}))}a.trigger(Qe.a.MANIFEST_LOADED,{levels:u,audioTracks:c,subtitles:d,url:s,stats:r,networkDetails:i})},t.prototype._handleTrackOrLevelPlaylist=function(e,r,n,i){var a=this.hls,o=n.id,s=n.level,u=n.type,l=t.getResponseUrl(e,n),c=isNaN(o)?0:o,d=isNaN(s)?c:s,f=t.mapContextToLevelType(n),h=_t.parseLevelPlaylist(e.data,l,d,f,c);if(h.tload=r.tload,u===St.MANIFEST){var p={url:l,details:h};a.trigger(Qe.a.MANIFEST_LOADED,{levels:[p],audioTracks:[],url:l,stats:r,networkDetails:i})}if(r.tparsed=Tt.now(),h.needSidxRanges){var g=h.initSegment.url;return void this.load(g,{isSidxRequest:!0,type:u,level:s,levelDetails:h,id:o,rangeStart:0,rangeEnd:2048,responseType:"arraybuffer"})}n.levelDetails=h,this._handlePlaylistLoaded(e,r,n,i)},t.prototype._handleSidxRequest=function(e,t){var r=rt.a.parseSegmentIndex(new Uint8Array(e.data));r.references.forEach(function(e,r){var n=e.info,i=t.levelDetails.fragments[r];0===i.byteRange.length&&(i.rawByteRange=String(1+n.end-n.start)+"@"+String(n.start))}),t.levelDetails.initSegment.rawByteRange=String(r.moovEndOffset)+"@0"},t.prototype._handleManifestParsingError=function(e,t,r,n){this.hls.trigger(Qe.a.ERROR,{type:Xe.b.NETWORK_ERROR,details:Xe.a.MANIFEST_PARSING_ERROR,fatal:!0,url:e.url,reason:r,networkDetails:n})},t.prototype._handleNetworkError=function(e,t){var r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];Je.b.info("A network error occured while loading a "+e.type+"-type playlist");var n=void 0,i=void 0,a=this.getInternalLoader(e);switch(e.type){case St.MANIFEST:n=r?Xe.a.MANIFEST_LOAD_TIMEOUT:Xe.a.MANIFEST_LOAD_ERROR,i=!0;break;case St.LEVEL:n=r?Xe.a.LEVEL_LOAD_TIMEOUT:Xe.a.LEVEL_LOAD_ERROR,i=!1;break;case St.AUDIO_TRACK:n=r?Xe.a.AUDIO_TRACK_LOAD_TIMEOUT:Xe.a.AUDIO_TRACK_LOAD_ERROR,i=!1;break;default:i=!1}a&&(a.abort(),this.resetInternalLoader(e.type)),this.hls.trigger(Qe.a.ERROR,{type:Xe.b.NETWORK_ERROR,details:n,fatal:i,url:a.url,loader:a,context:e,networkDetails:t})},t.prototype._handlePlaylistLoaded=function(e,r,n,i){var a=n.type,o=n.level,s=n.id,u=n.levelDetails;if(!u.targetduration)return void this._handleManifestParsingError(e,n,"invalid target duration",i);if(t.canHaveQualityLevels(n.type))this.hls.trigger(Qe.a.LEVEL_LOADED,{details:u,level:o||0,id:s||0,stats:r,networkDetails:i});else switch(a){case St.AUDIO_TRACK:this.hls.trigger(Qe.a.AUDIO_TRACK_LOADED,{details:u,id:s,stats:r,networkDetails:i});break;case St.SUBTITLE_TRACK:this.hls.trigger(Qe.a.SUBTITLE_TRACK_LOADED,{details:u,id:s,stats:r,networkDetails:i})}},Et(t,null,[{key:"ContextType",get:function(){return St}},{key:"LevelType",get:function(){return Rt}}]),t}(tt),Lt=At,Ct=function(e){function t(r){h(this,t);var n=p(this,e.call(this,r,Qe.a.FRAG_LOADING));return n.loaders={},n}return g(t,e),t.prototype.destroy=function(){var t=this.loaders;for(var r in t){var n=t[r];n&&n.destroy()}this.loaders={},e.prototype.destroy.call(this)},t.prototype.onFragLoading=function(e){var t=e.frag,r=t.type,n=this.loaders,i=this.hls.config,a=i.fLoader,o=i.loader;t.loaded=0;var s=n[r];s&&(Je.b.warn("abort previous fragment loader for type: "+r),s.abort()),s=n[r]=t.loader=i.fLoader?new a(i):new o(i);var u=void 0,l=void 0,c=void 0;u={url:t.url,frag:t,responseType:"arraybuffer",progressData:!1};var d=t.byteRangeStartOffset,f=t.byteRangeEndOffset;isNaN(d)||isNaN(f)||(u.rangeStart=d,u.rangeEnd=f),l={timeout:i.fragLoadingTimeOut,maxRetry:0,retryDelay:0,maxRetryDelay:i.fragLoadingMaxRetryTimeout},c={onSuccess:this.loadsuccess.bind(this),onError:this.loaderror.bind(this),onTimeout:this.loadtimeout.bind(this),onProgress:this.loadprogress.bind(this)},s.load(u,l,c)},t.prototype.loadsuccess=function(e,t,r){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null,i=e.data,a=r.frag;a.loader=void 0,this.loaders[a.type]=void 0,this.hls.trigger(Qe.a.FRAG_LOADED,{payload:i,frag:a,stats:t,networkDetails:n})},t.prototype.loaderror=function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,n=t.loader;n&&n.abort(),this.loaders[t.type]=void 0,this.hls.trigger(Qe.a.ERROR,{type:Xe.b.NETWORK_ERROR,details:Xe.a.FRAG_LOAD_ERROR,fatal:!1,frag:t.frag,response:e,networkDetails:r})},t.prototype.loadtimeout=function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,n=t.loader;n&&n.abort(),this.loaders[t.type]=void 0,this.hls.trigger(Qe.a.ERROR,{type:Xe.b.NETWORK_ERROR,details:Xe.a.FRAG_LOAD_TIMEOUT,fatal:!1,frag:t.frag,networkDetails:r})},t.prototype.loadprogress=function(e,t,r){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null,i=t.frag;i.loaded=e.loaded,this.hls.trigger(Qe.a.FRAG_LOAD_PROGRESS,{frag:i,stats:e,networkDetails:n})},t}(tt),kt=Ct,Dt=function(e){function t(r){v(this,t);var n=y(this,e.call(this,r,Qe.a.KEY_LOADING));return n.loaders={},n.decryptkey=null,n.decrypturl=null,n}return m(t,e),t.prototype.destroy=function(){for(var e in this.loaders){var t=this.loaders[e];t&&t.destroy()}this.loaders={},tt.prototype.destroy.call(this)},t.prototype.onKeyLoading=function(e){var t=e.frag,r=t.type,n=this.loaders[r],i=t.decryptdata,a=i.uri;if(a!==this.decrypturl||null===this.decryptkey){var o=this.hls.config;n&&(Je.b.warn("abort previous key loader for type:"+r),n.abort()),t.loader=this.loaders[r]=new o.loader(o),this.decrypturl=a,this.decryptkey=null;var s=void 0,u=void 0,l=void 0;s={url:a,frag:t,responseType:"arraybuffer"},u={timeout:o.fragLoadingTimeOut,maxRetry:o.fragLoadingMaxRetry,retryDelay:o.fragLoadingRetryDelay,maxRetryDelay:o.fragLoadingMaxRetryTimeout},l={onSuccess:this.loadsuccess.bind(this),onError:this.loaderror.bind(this),onTimeout:this.loadtimeout.bind(this)},t.loader.load(s,u,l)}else this.decryptkey&&(i.key=this.decryptkey,this.hls.trigger(Qe.a.KEY_LOADED,{frag:t}))},t.prototype.loadsuccess=function(e,t,r){var n=r.frag;this.decryptkey=n.decryptdata.key=new Uint8Array(e.data),n.loader=void 0,this.loaders[n.type]=void 0,this.hls.trigger(Qe.a.KEY_LOADED,{frag:n})},t.prototype.loaderror=function(e,t){var r=t.frag,n=r.loader;n&&n.abort(),this.loaders[t.type]=void 0,this.hls.trigger(Qe.a.ERROR,{type:Xe.b.NETWORK_ERROR,details:Xe.a.KEY_LOAD_ERROR,fatal:!1,frag:r,response:e})},t.prototype.loadtimeout=function(e,t){var r=t.frag,n=r.loader;n&&n.abort(),this.loaders[t.type]=void 0,this.hls.trigger(Qe.a.ERROR,{type:Xe.b.NETWORK_ERROR,details:Xe.a.KEY_LOAD_TIMEOUT,fatal:!1,frag:r})},t}(tt),It=Dt,Pt={NOT_LOADED:"NOT_LOADED",APPENDING:"APPENDING",PARTIAL:"PARTIAL",OK:"OK"},Ot=function(e){function t(r){b(this,t);var n=_(this,e.call(this,r,Qe.a.BUFFER_APPENDED,Qe.a.FRAG_BUFFERED,Qe.a.FRAG_LOADED));return n.bufferPadding=.2,n.fragments=Object.create(null),n.timeRanges=Object.create(null),n.config=r.config,n}return E(t,e),t.prototype.destroy=function(){this.fragments=null,this.timeRanges=null,this.config=null,tt.prototype.destroy.call(this),e.prototype.destroy.call(this)},t.prototype.getBufferedFrag=function(e,t){var r=this.fragments,n=Object.keys(r).filter(function(n){var i=r[n];if(i.body.type!==t)return!1;if(!i.buffered)return!1;var a=i.body;return a.startPTS<=e&&e<=a.endPTS});if(0===n.length)return null;var i=n.pop();return r[i].body},t.prototype.detectEvictedFragments=function(e,t){var r=this,n=void 0,i=void 0;Object.keys(this.fragments).forEach(function(a){var o=r.fragments[a];if(!0===o.buffered){var s=o.range[e];if(s){n=s.time;for(var u=0;u=i&&t<=a){n.push({startPTS:Math.max(e,r.start(s)),endPTS:Math.min(t,r.end(s))});break}if(ei)n.push({startPTS:Math.max(e,r.start(s)),endPTS:Math.min(t,r.end(s))}),o=!0;else if(t<=i)break}return{time:n,partial:o}},t.prototype.getFragmentKey=function(e){return e.type+"_"+e.level+"_"+e.urlId+"_"+e.sn},t.prototype.getPartialFragment=function(e){var t=this,r=void 0,n=void 0,i=void 0,a=null,o=0;return Object.keys(this.fragments).forEach(function(s){var u=t.fragments[s];t.isPartial(u)&&(n=u.body.startPTS-t.bufferPadding,i=u.body.endPTS+t.bufferPadding,e>=n&&e<=i&&(r=Math.min(e-n,i-e),o<=r&&(a=u.body,o=r)))}),a},t.prototype.getState=function(e){var t=this.getFragmentKey(e),r=this.fragments[t],n=Pt.NOT_LOADED;return void 0!==r&&(n=r.buffered?!0===this.isPartial(r)?Pt.PARTIAL:Pt.OK:Pt.APPENDING),n},t.prototype.isPartial=function(e){return!0===e.buffered&&(void 0!==e.range.video&&!0===e.range.video.partial||void 0!==e.range.audio&&!0===e.range.audio.partial)},t.prototype.isTimeBuffered=function(e,t,r){for(var n=void 0,i=void 0,a=0;a=n&&t<=i)return!0;if(t<=n)return!1}return!1},t.prototype.onFragLoaded=function(e){var t=e.frag;if(!isNaN(t.sn)&&!t.bitrateTest){var r=this.getFragmentKey(t),n={body:t,range:Object.create(null),buffered:!1};this.fragments[r]=n}},t.prototype.onBufferAppended=function(e){var t=this;this.timeRanges=e.timeRanges,Object.keys(this.timeRanges).forEach(function(e){var r=t.timeRanges[e];t.detectEvictedFragments(e,r)})},t.prototype.onFragBuffered=function(e){this.detectPartialFragments(e.frag)},t.prototype.hasFragment=function(e){var t=this.getFragmentKey(e);return void 0!==this.fragments[t]},t.prototype.removeFragment=function(e){var t=this.getFragmentKey(e);delete this.fragments[t]},t.prototype.removeAllFragments=function(){this.fragments=Object.create(null)},t}(tt),xt={search:function(e,t){for(var r=0,n=e.length-1,i=null,a=null;r<=n;){i=(r+n)/2|0,a=e[i];var o=t(a);if(o>0)r=i+1;else{if(!(o<0))return a;n=i-1}}return null}},Mt=xt,Ft=function(){function e(){w(this,e)}return e.isBuffered=function(e,t){try{if(e)for(var r=e.buffered,n=0;n=r.start(n)&&t<=r.end(n))return!0}catch(e){}return!1},e.bufferInfo=function(e,t,r){try{if(e){var n=e.buffered,i=[],a=void 0;for(a=0;ac&&(n[l-1].end=e[u].end):n.push(e[u])}else n.push(e[u])}for(u=0,i=0,a=o=t;u=d&&t1?t-1:0),i=1;i1?t-1:0),i=1;i1?n-1:0),a=1;a1&&(this.clearNextTick(),this._tickTimer=setTimeout(this._boundTick,0)),this._tickCallCount=0)},t.prototype.doTick=function(){},t}(tt),Qt=Xt,Jt=function(){function e(e,t){for(var r=0;r0&&-1===e&&(Je.b.log("override startPosition with lastCurrentTime @"+t.toFixed(3)),e=t),this.state=$t.IDLE,this.nextLoadPosition=this.startPosition=this.lastCurrentTime=e,this.tick()}else this.forceStartLoad=!0,this.state=$t.STOPPED},t.prototype.stopLoad=function(){var e=this.fragCurrent;e&&(e.loader&&e.loader.abort(),this.fragmentTracker.removeFragment(e),this.fragCurrent=null),this.fragPrevious=null,this.demuxer&&(this.demuxer.destroy(),this.demuxer=null),this.clearInterval(),this.state=$t.STOPPED,this.forceStartLoad=!1},t.prototype.doTick=function(){switch(this.state){case $t.BUFFER_FLUSHING:this.fragLoadError=0;break;case $t.IDLE:this._doTickIdle();break;case $t.WAITING_LEVEL:var e=this.levels[this.level];e&&e.details&&(this.state=$t.IDLE);break;case $t.FRAG_LOADING_WAITING_RETRY:var t=window.performance.now(),r=this.retryDate;(!r||t>=r||this.media&&this.media.seeking)&&(Je.b.log("mediaController: retryDate reached, switch back to IDLE state"),this.state=$t.IDLE);break;case $t.ERROR:case $t.STOPPED:case $t.FRAG_LOADING:case $t.PARSING:case $t.PARSED:case $t.ENDED:}this._checkBuffer(),this._checkFragmentChanged()},t.prototype._doTickIdle=function(){var e=this.hls,t=e.config,r=this.media;if(void 0!==this.levelLastLoaded&&(r||!this.startFragRequested&&t.startFragPrefetch)){var n=void 0;n=this.loadedmetadata?r.currentTime:this.nextLoadPosition;var i=e.nextLoadLevel,a=this.levels[i];if(a){var o=a.bitrate,s=void 0;s=o?Math.max(8*t.maxBufferSize/o,t.maxBufferLength):t.maxBufferLength,s=Math.min(s,t.maxMaxBufferLength);var u=Ft.bufferInfo(this.mediaBuffer?this.mediaBuffer:r,n,t.maxBufferHole),l=u.len;if(!(l>=s)){Je.b.trace("buffer length of "+l.toFixed(3)+" is below max of "+s.toFixed(3)+". checking for more payload ..."),this.level=e.nextLoadLevel=i;var c=a.details;if(!c||c.live&&this.levelLastLoaded!==i)return void(this.state=$t.WAITING_LEVEL);var d=this.fragPrevious;if(!c.live&&d&&!d.backtracked&&d.sn===c.endSN&&!u.nextStart){if(Math.min(r.duration,d.start+d.duration)-Math.max(u.end,d.start)<=Math.max(.2,d.duration)){var f={};return this.altAudio&&(f.type="video"),this.hls.trigger(Qe.a.BUFFER_EOS,f),void(this.state=$t.ENDED)}}this._fetchPayloadOrEos(n,u,c)}}}},t.prototype._fetchPayloadOrEos=function(e,t,r){var n=this.fragPrevious,i=this.level,a=r.fragments,o=a.length;if(0!==o){var s=a[0].start,u=a[o-1].start+a[o-1].duration,l=t.end,c=void 0;if(r.initSegment&&!r.initSegment.data)c=r.initSegment;else if(r.live){var d=this.config.initialLiveManifestSize;if(od&&(u.currentTime=d),this.nextLoadPosition=d}if(e.PTSKnown&&t>n&&u&&u.readyState)return null;if(this.startFragRequested&&!e.PTSKnown){if(i)if(e.programDateTime)l=B(a,i.endPdt+1);else{var f=i.sn+1;if(f>=e.startSN&&f<=e.endSN){var h=a[f-e.startSN];i.cc===h.cc&&(l=h,Je.b.log("live playlist, switching playlist, load frag with next SN: "+l.sn))}l||(l=Mt.search(a,function(e){return i.cc-e.cc}))&&Je.b.log("live playlist, switching playlist, load frag with same CC: "+l.sn)}l||(l=a[Math.min(o-1,Math.round(o/2))],Je.b.log("live playlist, switching playlist, unknown, load middle frag : "+l.sn))}return l},t.prototype._findFragment=function(e,t,r,n,i,a,o){var s=this.hls.config,u=void 0,l=void 0;if(is.maxBufferHole&&t.dropped&&c?(u=f,Je.b.warn("SN just loaded, with large PTS gap between audio and video, maybe frag is not starting with a keyframe ? load previous one to try to overcome this")):(u=h,Je.b.log("SN just loaded, load next one: "+u.sn))}else u=null;else u.backtracked&&(h&&h.backtracked?(Je.b.warn("Already backtracked from fragment "+h.sn+", will not backtrack to fragment "+u.sn+". Loading fragment "+h.sn),u=h):(Je.b.warn("Loaded fragment with dropped frames, backtracking 1 segment to find a keyframe"),u.dropped=0,f?(u=f,u.backtracked=!0):c&&(u=null)))}return u},t.prototype._loadKey=function(e){this.state=$t.KEY_LOADING,this.hls.trigger(Qe.a.KEY_LOADING,{frag:e})},t.prototype._loadFragment=function(e){var t=this.fragmentTracker.getState(e);this.fragCurrent=e,this.startFragRequested=!0,isNaN(e.sn)||e.bitrateTest||(this.nextLoadPosition=e.start+e.duration),e.backtracked||t===Pt.NOT_LOADED||t===Pt.PARTIAL?(e.autoLevel=this.hls.autoLevelEnabled,e.bitrateTest=this.bitrateTest,this.hls.trigger(Qe.a.FRAG_LOADING,{frag:e}),this.demuxer||(this.demuxer=new qt(this.hls,"main")),this.state=$t.FRAG_LOADING):t===Pt.APPENDING&&this._reduceMaxBufferLength(e.duration)&&this.fragmentTracker.removeFragment(e)},t.prototype.getBufferedFrag=function(e){return this.fragmentTracker.getBufferedFrag(e,Lt.LevelType.MAIN)},t.prototype.followingBufferedFrag=function(e){return e?this.getBufferedFrag(e.endPTS+.5):null},t.prototype._checkFragmentChanged=function(){var e=void 0,t=void 0,r=this.media;if(r&&r.readyState&&!1===r.seeking&&(t=r.currentTime,t>this.lastCurrentTime&&(this.lastCurrentTime=t),Ft.isBuffered(r,t)?e=this.getBufferedFrag(t):Ft.isBuffered(r,t+.1)&&(e=this.getBufferedFrag(t+.1)),e)){var n=e;if(n!==this.fragPlaying){this.hls.trigger(Qe.a.FRAG_CHANGED,{frag:n});var i=n.level;this.fragPlaying&&this.fragPlaying.level===i||this.hls.trigger(Qe.a.LEVEL_SWITCHED,{level:i}),this.fragPlaying=n}}},t.prototype.immediateLevelSwitch=function(){if(Je.b.log("immediateLevelSwitch"),!this.immediateSwitch){this.immediateSwitch=!0;var e=this.media,t=void 0;e?(t=e.paused,e.pause()):t=!0,this.previouslyPaused=t}var r=this.fragCurrent;r&&r.loader&&r.loader.abort(),this.fragCurrent=null,this.flushMainBuffer(0,Number.POSITIVE_INFINITY)},t.prototype.immediateLevelSwitchEnd=function(){var e=this.media;e&&e.buffered.length&&(this.immediateSwitch=!1,Ft.isBuffered(e,e.currentTime)&&(e.currentTime-=1e-4),this.previouslyPaused||e.play())},t.prototype.nextLevelSwitch=function(){var e=this.media;if(e&&e.readyState){var t=void 0,r=void 0,n=void 0;if(r=this.getBufferedFrag(e.currentTime),r&&r.startPTS>1&&this.flushMainBuffer(0,r.startPTS-1),e.paused)t=0;else{var i=this.hls.nextLoadLevel,a=this.levels[i],o=this.fragLastKbps;t=o&&this.fragCurrent?this.fragCurrent.duration*a.bitrate/(1e3*o)+1:0}if((n=this.getBufferedFrag(e.currentTime+t))&&(n=this.followingBufferedFrag(n))){var s=this.fragCurrent;s&&s.loader&&s.loader.abort(),this.fragCurrent=null,this.flushMainBuffer(n.maxStartPTS,Number.POSITIVE_INFINITY)}}},t.prototype.flushMainBuffer=function(e,t){this.state=$t.BUFFER_FLUSHING;var r={startOffset:e,endOffset:t};this.altAudio&&(r.type="video"),this.hls.trigger(Qe.a.BUFFER_FLUSHING,r)},t.prototype.onMediaAttached=function(e){var t=this.media=this.mediaBuffer=e.media;this.onvseeking=this.onMediaSeeking.bind(this),this.onvseeked=this.onMediaSeeked.bind(this),this.onvended=this.onMediaEnded.bind(this),t.addEventListener("seeking",this.onvseeking),t.addEventListener("seeked",this.onvseeked),t.addEventListener("ended",this.onvended);var r=this.config;this.levels&&r.autoStartLoad&&this.hls.startLoad(r.startPosition)},t.prototype.onMediaDetaching=function(){var e=this.media;e&&e.ended&&(Je.b.log("MSE detaching and video ended, reset startPosition"),this.startPosition=this.lastCurrentTime=0);var t=this.levels;t&&t.forEach(function(e){e.details&&e.details.fragments.forEach(function(e){e.backtracked=void 0})}),e&&(e.removeEventListener("seeking",this.onvseeking),e.removeEventListener("seeked",this.onvseeked),e.removeEventListener("ended",this.onvended),this.onvseeking=this.onvseeked=this.onvended=null),this.media=this.mediaBuffer=null,this.loadedmetadata=!1,this.stopLoad()},t.prototype.onMediaSeeking=function(){var e=this.media,t=e?e.currentTime:void 0,r=this.config;isNaN(t)||Je.b.log("media seeking to "+t.toFixed(3));var n=this.mediaBuffer?this.mediaBuffer:e,i=Ft.bufferInfo(n,t,this.config.maxBufferHole);if(this.state===$t.FRAG_LOADING){var a=this.fragCurrent;if(0===i.len&&a){var o=r.maxFragLookUpTolerance,s=a.start-o,u=a.start+a.duration+o;tu?(a.loader&&(Je.b.log("seeking outside of buffer while fragment load in progress, cancel fragment load"),a.loader.abort()),this.fragCurrent=null,this.fragPrevious=null,this.state=$t.IDLE):Je.b.log("seeking outside of buffer but within currently loaded fragment range")}}else this.state===$t.ENDED&&(0===i.len&&(this.fragPrevious=0),this.state=$t.IDLE);e&&(this.lastCurrentTime=t),this.loadedmetadata||(this.nextLoadPosition=this.startPosition=t),this.tick()},t.prototype.onMediaSeeked=function(){var e=this.media,t=e?e.currentTime:void 0;isNaN(t)||Je.b.log("media seeked to "+t.toFixed(3)),this.tick()},t.prototype.onMediaEnded=function(){Je.b.log("media ended"),this.startPosition=this.lastCurrentTime=0},t.prototype.onManifestLoading=function(){Je.b.log("trigger BUFFER_RESET"),this.hls.trigger(Qe.a.BUFFER_RESET),this.fragmentTracker.removeAllFragments(),this.stalled=!1,this.startPosition=this.lastCurrentTime=0},t.prototype.onManifestParsed=function(e){var t=!1,r=!1,n=void 0;e.levels.forEach(function(e){(n=e.audioCodec)&&(-1!==n.indexOf("mp4a.40.2")&&(t=!0),-1!==n.indexOf("mp4a.40.5")&&(r=!0))}),this.audioCodecSwitch=t&&r,this.audioCodecSwitch&&Je.b.log("both AAC/HE-AAC audio found in levels; declaring level codec as HE-AAC"),this.levels=e.levels,this.startFragRequested=!1;var i=this.config;(i.autoStartLoad||this.forceStartLoad)&&this.hls.startLoad(i.startPosition)},t.prototype.onLevelLoaded=function(e){var t=e.details,r=e.level,n=this.levels[this.levelLastLoaded],i=this.levels[r],a=t.totalduration,o=0;if(Je.b.log("level "+r+" loaded ["+t.startSN+","+t.endSN+"],duration:"+a),t.live){var s=i.details;s&&t.fragments.length>0?(C(s,t),o=t.fragments[0].start,this.liveSyncPosition=this.computeLivePosition(o,s),t.PTSKnown&&!isNaN(o)?Je.b.log("live playlist sliding:"+o.toFixed(3)):(Je.b.log("live playlist - outdated PTS, unknown sliding"),x(this.fragPrevious,n,t))):(Je.b.log("live playlist - first load, unknown sliding"),t.PTSKnown=!1,x(this.fragPrevious,n,t))}else t.PTSKnown=!1;if(i.details=t,this.levelLastLoaded=r,this.hls.trigger(Qe.a.LEVEL_UPDATED,{details:t,level:r}),!1===this.startFragRequested){if(-1===this.startPosition||-1===this.lastCurrentTime){var u=t.startTimeOffset;isNaN(u)?t.live?(this.startPosition=this.computeLivePosition(o,t),Je.b.log("configure startPosition to "+this.startPosition)):this.startPosition=0:(u<0&&(Je.b.log("negative start time offset "+u+", count from end of last fragment"),u=o+a+u),Je.b.log("start time offset found in playlist, adjust startPosition to "+u),this.startPosition=u),this.lastCurrentTime=this.startPosition}this.nextLoadPosition=this.startPosition}this.state===$t.WAITING_LEVEL&&(this.state=$t.IDLE),this.tick()},t.prototype.onKeyLoaded=function(){this.state===$t.KEY_LOADING&&(this.state=$t.IDLE,this.tick())},t.prototype.onFragLoaded=function(e){var t=this.fragCurrent,r=e.frag;if(this.state===$t.FRAG_LOADING&&t&&"main"===r.type&&r.level===t.level&&r.sn===t.sn){var n=e.stats,i=this.levels[t.level],a=i.details;if(Je.b.log("Loaded "+t.sn+" of ["+a.startSN+" ,"+a.endSN+"],level "+t.level),this.bitrateTest=!1,this.stats=n,!0===r.bitrateTest&&this.hls.nextLoadLevel)this.state=$t.IDLE,this.startFragRequested=!1,n.tparsed=n.tbuffered=window.performance.now(),this.hls.trigger(Qe.a.FRAG_BUFFERED,{stats:n,frag:t,id:"main"}),this.tick();else if("initSegment"===r.sn)this.state=$t.IDLE,n.tparsed=n.tbuffered=window.performance.now(),a.initSegment.data=e.payload,this.hls.trigger(Qe.a.FRAG_BUFFERED,{stats:n,frag:t,id:"main"}),this.tick();else{this.state=$t.PARSING;var o=a.totalduration,s=t.level,u=t.sn,l=this.config.defaultAudioCodec||i.audioCodec;this.audioCodecSwap&&(Je.b.log("swapping playlist audio codec"),void 0===l&&(l=this.lastAudioCodec),l&&(l=-1!==l.indexOf("mp4a.40.5")?"mp4a.40.2":"mp4a.40.5")),this.pendingBuffering=!0,this.appended=!1,Je.b.log("Parsing "+u+" of ["+a.startSN+" ,"+a.endSN+"],level "+s+", cc "+t.cc);var c=this.demuxer;c||(c=this.demuxer=new qt(this.hls,"main"));var d=this.media,f=d&&d.seeking,h=!f&&(a.PTSKnown||!a.live),p=a.initSegment?a.initSegment.data:[];c.push(e.payload,p,l,i.videoCodec,t,o,h,void 0)}}this.fragLoadError=0},t.prototype.onFragParsingInitSegment=function(e){var t=this.fragCurrent,r=e.frag;if(t&&"main"===e.id&&r.sn===t.sn&&r.level===t.level&&this.state===$t.PARSING){var n=e.tracks,i=void 0,a=void 0;if(n.audio&&this.altAudio&&delete n.audio,a=n.audio){var o=this.levels[this.level].audioCodec,s=navigator.userAgent.toLowerCase();o&&this.audioCodecSwap&&(Je.b.log("swapping playlist audio codec"),o=-1!==o.indexOf("mp4a.40.5")?"mp4a.40.2":"mp4a.40.5"),this.audioCodecSwitch&&1!==a.metadata.channelCount&&-1===s.indexOf("firefox")&&(o="mp4a.40.5"),-1!==s.indexOf("android")&&"audio/mpeg"!==a.container&&(o="mp4a.40.2",Je.b.log("Android: force audio codec to "+o)),a.levelCodec=o,a.id=e.id}a=n.video,a&&(a.levelCodec=this.levels[this.level].videoCodec,a.id=e.id),this.hls.trigger(Qe.a.BUFFER_CODECS,n);for(i in n){a=n[i],Je.b.log("main track:"+i+",container:"+a.container+",codecs[level/parsed]=["+a.levelCodec+"/"+a.codec+"]");var u=a.initSegment;u&&(this.appended=!0,this.pendingBuffering=!0,this.hls.trigger(Qe.a.BUFFER_APPENDING,{type:i,data:u,parent:"main",content:"initSegment"}))}this.tick()}},t.prototype.onFragParsingData=function(e){var t=this,r=this.fragCurrent,n=e.frag;if(r&&"main"===e.id&&n.sn===r.sn&&n.level===r.level&&("audio"!==e.type||!this.altAudio)&&this.state===$t.PARSING){var i=this.levels[this.level],a=r;if(isNaN(e.endPTS)&&(e.endPTS=e.startPTS+r.duration,e.endDTS=e.startDTS+r.duration),!0===e.hasAudio&&a.addElementaryStream(ut.ElementaryStreamTypes.AUDIO),!0===e.hasVideo&&a.addElementaryStream(ut.ElementaryStreamTypes.VIDEO),Je.b.log("Parsed "+e.type+",PTS:["+e.startPTS.toFixed(3)+","+e.endPTS.toFixed(3)+"],DTS:["+e.startDTS.toFixed(3)+"/"+e.endDTS.toFixed(3)+"],nb:"+e.nb+",dropped:"+(e.dropped||0)),"video"===e.type)if(a.dropped=e.dropped,a.dropped)if(a.backtracked)Je.b.warn("Already backtracked on this fragment, appending with the gap",a.sn);else{var o=i.details;if(!o||a.sn!==o.startSN)return Je.b.warn("missing video frame(s), backtracking fragment",a.sn),this.fragmentTracker.removeFragment(a),a.backtracked=!0,this.nextLoadPosition=e.startPTS,this.state=$t.IDLE,this.fragPrevious=a,void this.tick();Je.b.warn("missing video frame(s) on first frag, appending with gap",a.sn)}else a.backtracked=!1;var s=L(i.details,a,e.startPTS,e.endPTS,e.startDTS,e.endDTS),u=this.hls;u.trigger(Qe.a.LEVEL_PTS_UPDATED,{details:i.details,level:this.level,drift:s,type:e.type,start:e.startPTS,end:e.endPTS}),[e.data1,e.data2].forEach(function(r){r&&r.length&&t.state===$t.PARSING&&(t.appended=!0,t.pendingBuffering=!0,u.trigger(Qe.a.BUFFER_APPENDING,{type:e.type,data:r,parent:"main",content:"data"}))}),this.tick()}},t.prototype.onFragParsed=function(e){var t=this.fragCurrent,r=e.frag;t&&"main"===e.id&&r.sn===t.sn&&r.level===t.level&&this.state===$t.PARSING&&(this.stats.tparsed=window.performance.now(),this.state=$t.PARSED,this._checkAppendedParsed())},t.prototype.onAudioTrackSwitching=function(e){var t=!!e.url,r=e.id;if(!t){if(this.mediaBuffer!==this.media){Je.b.log("switching on main audio, use media.buffered to schedule main fragment loading"),this.mediaBuffer=this.media;var n=this.fragCurrent;n.loader&&(Je.b.log("switching to main audio track, cancel main fragment load"),n.loader.abort()),this.fragCurrent=null,this.fragPrevious=null,this.demuxer&&(this.demuxer.destroy(),this.demuxer=null),this.state=$t.IDLE}var i=this.hls;i.trigger(Qe.a.BUFFER_FLUSHING,{startOffset:0,endOffset:Number.POSITIVE_INFINITY,type:"audio"}),i.trigger(Qe.a.AUDIO_TRACK_SWITCHED,{id:r}),this.altAudio=!1}},t.prototype.onAudioTrackSwitched=function(e){var t=e.id,r=!!this.hls.audioTracks[t].url;if(r){var n=this.videoBuffer;n&&this.mediaBuffer!==n&&(Je.b.log("switching on alternate audio, use video.buffered to schedule main fragment loading"),this.mediaBuffer=n)}this.altAudio=r,this.tick()},t.prototype.onBufferCreated=function(e){var t=e.tracks,r=void 0,n=void 0,i=!1;for(var a in t){var o=t[a];"main"===o.id?(n=a,r=o,"video"===a&&(this.videoBuffer=t[a].buffer)):i=!0}i&&r?(Je.b.log("alternate track found, use "+n+".buffered to schedule main fragment loading"),this.mediaBuffer=r.buffer):this.mediaBuffer=this.media},t.prototype.onBufferAppended=function(e){if("main"===e.parent){var t=this.state;t!==$t.PARSING&&t!==$t.PARSED||(this.pendingBuffering=e.pending>0,this._checkAppendedParsed())}},t.prototype._checkAppendedParsed=function(){if(!(this.state!==$t.PARSED||this.appended&&this.pendingBuffering)){var e=this.fragCurrent;if(e){var t=this.mediaBuffer?this.mediaBuffer:this.media;Je.b.log("main buffered : "+zt.toString(t.buffered)),this.fragPrevious=e;var r=this.stats;r.tbuffered=window.performance.now(),this.fragLastKbps=Math.round(8*r.total/(r.tbuffered-r.tfirst)),this.hls.trigger(Qe.a.FRAG_BUFFERED,{stats:r,frag:e,id:"main"}),this.state=$t.IDLE}this.tick()}},t.prototype.onError=function(e){var t=e.frag||this.fragCurrent;if(!t||"main"===t.type){var r=!!this.media&&Ft.isBuffered(this.media,this.media.currentTime)&&Ft.isBuffered(this.media,this.media.currentTime+.5);switch(e.details){case Xe.a.FRAG_LOAD_ERROR:case Xe.a.FRAG_LOAD_TIMEOUT:case Xe.a.KEY_LOAD_ERROR:case Xe.a.KEY_LOAD_TIMEOUT:if(!e.fatal)if(this.fragLoadError+1<=this.config.fragLoadingMaxRetry){var n=Math.min(Math.pow(2,this.fragLoadError)*this.config.fragLoadingRetryDelay,this.config.fragLoadingMaxRetryTimeout);Je.b.warn("mediaController: frag loading failed, retry in "+n+" ms"),this.retryDate=window.performance.now()+n,this.loadedmetadata||(this.startFragRequested=!1,this.nextLoadPosition=this.startPosition),this.fragLoadError++,this.state=$t.FRAG_LOADING_WAITING_RETRY}else Je.b.error("mediaController: "+e.details+" reaches max retry, redispatch as fatal ..."),e.fatal=!0,this.state=$t.ERROR;break;case Xe.a.LEVEL_LOAD_ERROR:case Xe.a.LEVEL_LOAD_TIMEOUT:this.state!==$t.ERROR&&(e.fatal?(this.state=$t.ERROR,Je.b.warn("streamController: "+e.details+",switch to "+this.state+" state ...")):e.levelRetry||this.state!==$t.WAITING_LEVEL||(this.state=$t.IDLE));break;case Xe.a.BUFFER_FULL_ERROR:"main"!==e.parent||this.state!==$t.PARSING&&this.state!==$t.PARSED||(r?(this._reduceMaxBufferLength(this.config.maxBufferLength),this.state=$t.IDLE):(Je.b.warn("buffer full error also media.currentTime is not buffered, flush everything"),this.fragCurrent=null,this.flushMainBuffer(0,Number.POSITIVE_INFINITY)))}}},t.prototype._reduceMaxBufferLength=function(e){var t=this.config;return t.maxMaxBufferLength>=e&&(t.maxMaxBufferLength/=2,Je.b.warn("main:reduce max buffer length to "+t.maxMaxBufferLength+"s"),!0)},t.prototype._checkBuffer=function(){var e=this.config,t=this.media;if(t&&0!==t.readyState){var r=t.currentTime,n=this.mediaBuffer?this.mediaBuffer:t,i=n.buffered;if(!this.loadedmetadata&&i.length)this.loadedmetadata=!0,this._seekToStartPos();else if(this.immediateSwitch)this.immediateLevelSwitchEnd();else{var a=!(t.paused&&t.readyState>1||t.ended||0===t.buffered.length),o=window.performance.now();if(r!==this.lastCurrentTime)this.stallReported&&(Je.b.warn("playback not stuck anymore @"+r+", after "+Math.round(o-this.stalled)+"ms"),this.stallReported=!1),this.stalled=null,this.nudgeRetry=0;else if(a){var s=o-this.stalled,u=Ft.bufferInfo(t,r,e.maxBufferHole);if(!this.stalled)return void(this.stalled=o);s>=1e3&&this._reportStall(u.len),this._tryFixBufferStall(u,s)}}}},t.prototype.onFragLoadEmergencyAborted=function(){this.state=$t.IDLE,this.loadedmetadata||(this.startFragRequested=!1,this.nextLoadPosition=this.startPosition),this.tick()},t.prototype.onBufferFlushed=function(){var e=this.mediaBuffer?this.mediaBuffer:this.media;e&&this.fragmentTracker.detectEvictedFragments(ut.ElementaryStreamTypes.VIDEO,e.buffered),this.state=$t.IDLE,this.fragPrevious=null},t.prototype.swapAudioCodec=function(){this.audioCodecSwap=!this.audioCodecSwap},t.prototype.computeLivePosition=function(e,t){var r=void 0!==this.config.liveSyncDuration?this.config.liveSyncDuration:this.config.liveSyncDurationCount*t.targetduration;return e+Math.max(0,t.totalduration-r)},t.prototype._tryFixBufferStall=function(e,t){var r=this.config,n=this.media,i=n.currentTime,a=this.fragmentTracker.getPartialFragment(i);a&&this._trySkipBufferHole(a),e.len>.5&&t>1e3*r.highBufferWatchdogPeriod&&(this.stalled=null,this._tryNudgeBuffer())},t.prototype._reportStall=function(e){var t=this.hls,r=this.media;this.stallReported||(this.stallReported=!0,Je.b.warn("Playback stalling at @"+r.currentTime+" due to low buffer"),t.trigger(Qe.a.ERROR,{type:Xe.b.MEDIA_ERROR,details:Xe.a.BUFFER_STALLED_ERROR,fatal:!1,buffer:e}))},t.prototype._trySkipBufferHole=function(e){for(var t=this.hls,r=this.media,n=r.currentTime,i=0,a=0;a=i&&n"+e),this.hls.trigger(Qe.a.STREAM_STATE_TRANSITION,{previousState:t,nextState:e})}},get:function(){return this._state}},{key:"currentLevel",get:function(){var e=this.media;if(e){var t=this.getBufferedFrag(e.currentTime);if(t)return t.level}return-1}},{key:"nextBufferedFrag",get:function(){var e=this.media;return e?this.followingBufferedFrag(this.getBufferedFrag(e.currentTime)):null}},{key:"nextLevel",get:function(){var e=this.nextBufferedFrag;return e?e.level:-1}},{key:"liveSyncPosition",get:function(){return this._liveSyncPosition},set:function(e){this._liveSyncPosition=e}}]),t}(Qt),er=Zt,tr="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},rr=function(){function e(e,t){for(var r=0;r0){r=t[0].bitrate,t.sort(function(e,t){return e.bitrate-t.bitrate}),this._levels=t;for(var c=0;c0&&a})}else this.hls.trigger(Qe.a.ERROR,{type:Xe.b.MEDIA_ERROR,details:Xe.a.MANIFEST_INCOMPATIBLE_CODECS_ERROR,fatal:!0,url:this.hls.url,reason:"no level with compatible codecs found in manifest"})},t.prototype.setLevelInternal=function(e){var t=this._levels,r=this.hls;if(e>=0&&e1&&s.loadError0){var t=this.currentLevelIndex,r=e.urlId,n=e.url[r];Je.b.log("Attempt loading level index "+t+" with URL-id "+r),this.hls.trigger(Qe.a.LEVEL_LOADING,{url:n,level:t,id:r})}}},rr(t,[{key:"levels",get:function(){return this._levels}},{key:"level",get:function(){return this.currentLevelIndex},set:function(e){var t=this._levels;t&&(e=Math.min(e,t.length-1),this.currentLevelIndex===e&&t[e].details||this.setLevelInternal(e))}},{key:"manualLevel",get:function(){return this.manualLevelIndex},set:function(e){this.manualLevelIndex=e,void 0===this._startLevel&&(this._startLevel=e),-1!==e&&(this.level=e)}},{key:"firstLevel",get:function(){return this._firstLevel},set:function(e){this._firstLevel=e}},{key:"startLevel",get:function(){if(void 0===this._startLevel){var e=this.hls.config.startLevel;return void 0!==e?e:this._firstLevel}return this._startLevel},set:function(e){this._startLevel=e}},{key:"nextLoadLevel",get:function(){return-1!==this.manualLevelIndex?this.manualLevelIndex:this.hls.nextAutoLevel},set:function(e){this.level=e,-1===this.manualLevelIndex&&(this.hls.nextAutoLevel=e)}}]),t}(tt),or=ar,sr=r(5),ur=function(e){function t(r){Q(this,t);var n=J(this,e.call(this,r,Qe.a.MEDIA_ATTACHED,Qe.a.MEDIA_DETACHING,Qe.a.FRAG_PARSING_METADATA));return n.id3Track=void 0,n.media=void 0,n}return $(t,e),t.prototype.destroy=function(){tt.prototype.destroy.call(this)},t.prototype.onMediaAttached=function(e){this.media=e.media,this.media},t.prototype.onMediaDetaching=function(){X(this.id3Track),this.id3Track=void 0,this.media=void 0},t.prototype.getID3Track=function(e){for(var t=0;t=this.minWeight_},e.prototype.getEstimate=function(){return this.canEstimate()?Math.min(this.fast_.getEstimate(),this.slow_.getEstimate()):this.defaultEstimate_},e.prototype.destroy=function(){},e}(),hr=fr,pr=function(){function e(e,t){for(var r=0;r500*r.duration/s){var u=e.levels,l=Math.max(1,a.bw?a.bw/8:1e3*a.loaded/o),c=u[r.level],d=c.realBitrate?Math.max(c.realBitrate,c.bitrate):c.bitrate,f=a.total?a.total:Math.max(a.loaded,Math.round(r.duration*d/8)),h=t.currentTime,p=(f-a.loaded)/l,g=(Ft.bufferInfo(t,h,e.config.maxBufferHole).end-h)/s;if(g<2*r.duration/s&&p>g){var v=void 0,y=void 0;for(y=r.level-1;y>i;y--){var m=u[y].realBitrate?Math.max(u[y].realBitrate,u[y].bitrate):u[y].bitrate;if((v=r.duration*m/(6.4*l))=n;l--){var c=u[l],d=c.details,f=d?d.totalduration/d.fragments.length:t,h=!!d&&d.live,p=void 0;p=l<=e?o*r:s*r;var g=u[l].realBitrate?Math.max(u[l].realBitrate,u[l].bitrate):u[l].bitrate,v=g*f/p;if(Je.b.trace("level/adjustedbw/bitrate/avgDuration/maxFetchDuration/fetchDuration: "+l+"/"+Math.round(p)+"/"+g+"/"+f+"/"+a+"/"+v),p>g&&(!v||h&&!this.bitrateTestDelay||v=0)return f;Je.b.trace("rebuffering expected to happen, lets try to find a quality level minimizing the rebuffering");var h=s?Math.min(s,n.maxStarvationDelay):n.maxStarvationDelay,p=n.abrBandWidthFactor,g=n.abrBandWidthUpFactor;if(0===d){var v=this.bitrateTestDelay;if(v){h=(s?Math.min(s,n.maxLoadingDelay):n.maxLoadingDelay)-v,Je.b.trace("bitrate test took "+Math.round(1e3*v)+"ms, set first fragment max fetchDuration to "+Math.round(1e3*h)+" ms"),p=g=1}}return f=this._findBestLevel(o,s,c,i,t,d+h,p,g,r),Math.max(f,0)}}]),t}(tt),mr=yr,br=T(),_r=function(e){function t(r){ae(this,t);var n=oe(this,e.call(this,r,Qe.a.MEDIA_ATTACHING,Qe.a.MEDIA_DETACHING,Qe.a.MANIFEST_PARSED,Qe.a.BUFFER_RESET,Qe.a.BUFFER_APPENDING,Qe.a.BUFFER_CODECS,Qe.a.BUFFER_EOS,Qe.a.BUFFER_FLUSHING,Qe.a.LEVEL_PTS_UPDATED,Qe.a.LEVEL_UPDATED));return n._msDuration=null,n._levelDuration=null,n._live=null,n._objectUrl=null,n.onsbue=n.onSBUpdateEnd.bind(n),n.onsbe=n.onSBUpdateError.bind(n),n.pendingTracks={},n.tracks={},n}return se(t,e),t.prototype.destroy=function(){tt.prototype.destroy.call(this)},t.prototype.onLevelPtsUpdated=function(e){var t=e.type,r=this.tracks.audio;if("audio"===t&&r&&"audio/mpeg"===r.container){var n=this.sourceBuffer.audio;if(Math.abs(n.timestampOffset-e.start)>.1){var i=n.updating;try{n.abort()}catch(e){i=!0,Je.b.warn("can not abort audio buffer: "+e)}i?this.audioTimestampOffset=e.start:(Je.b.warn("change mpeg audio timestamp offset from "+n.timestampOffset+" to "+e.start),n.timestampOffset=e.start)}}},t.prototype.onManifestParsed=function(e){var t=e.audio,r=e.video||e.levels.length&&e.altAudio,n=0;e.altAudio&&(t||r)&&(n=(t?1:0)+(r?1:0),Je.b.log(n+" sourceBuffer(s) expected")),this.sourceBufferNb=n},t.prototype.onMediaAttaching=function(e){var t=this.media=e.media;if(t){var r=this.mediaSource=new br;this.onmso=this.onMediaSourceOpen.bind(this),this.onmse=this.onMediaSourceEnded.bind(this),this.onmsc=this.onMediaSourceClose.bind(this),r.addEventListener("sourceopen",this.onmso),r.addEventListener("sourceended",this.onmse),r.addEventListener("sourceclose",this.onmsc),t.src=window.URL.createObjectURL(r),this._objectUrl=t.src}},t.prototype.onMediaDetaching=function(){Je.b.log("media source detaching");var e=this.mediaSource;if(e){if("open"===e.readyState)try{e.endOfStream()}catch(e){Je.b.warn("onMediaDetaching:"+e.message+" while calling endOfStream")}e.removeEventListener("sourceopen",this.onmso),e.removeEventListener("sourceended",this.onmse),e.removeEventListener("sourceclose",this.onmsc),this.media&&(window.URL.revokeObjectURL(this._objectUrl),this.media.src===this._objectUrl?(this.media.removeAttribute("src"),this.media.load()):Je.b.warn("media.src was changed by a third party - skip cleanup")),this.mediaSource=null,this.media=null,this._objectUrl=null,this.pendingTracks={},this.tracks={},this.sourceBuffer={},this.flushRange=[],this.segments=[],this.appended=0}this.onmso=this.onmse=this.onmsc=null,this.hls.trigger(Qe.a.MEDIA_DETACHED)},t.prototype.onMediaSourceOpen=function(){Je.b.log("media source opened"),this.hls.trigger(Qe.a.MEDIA_ATTACHED,{media:this.media});var e=this.mediaSource;e&&e.removeEventListener("sourceopen",this.onmso),this.checkPendingTracks()},t.prototype.checkPendingTracks=function(){var e=this.pendingTracks,t=Object.keys(e).length;t&&(this.sourceBufferNb<=t||0===this.sourceBufferNb)&&(this.createSourceBuffers(e),this.pendingTracks={},this.doAppending())},t.prototype.onMediaSourceClose=function(){Je.b.log("media source closed")},t.prototype.onMediaSourceEnded=function(){Je.b.log("media source ended")},t.prototype.onSBUpdateEnd=function(){if(this.audioTimestampOffset){var e=this.sourceBuffer.audio;Je.b.warn("change mpeg audio timestamp offset from "+e.timestampOffset+" to "+this.audioTimestampOffset),e.timestampOffset=this.audioTimestampOffset,delete this.audioTimestampOffset}this._needsFlush&&this.doFlush(),this._needsEos&&this.checkEos(),this.appending=!1;var t=this.parent,r=this.segments.reduce(function(e,r){return r.parent===t?e+1:e},0),n={},i=this.sourceBuffer;for(var a in i)n[a]=i[a].buffered;this.hls.trigger(Qe.a.BUFFER_APPENDED,{parent:t,pending:r,timeRanges:n}),this._needsFlush||this.doAppending(),this.updateMediaElementDuration()},t.prototype.onSBUpdateError=function(e){Je.b.error("sourceBuffer error:",e),this.hls.trigger(Qe.a.ERROR,{type:Xe.b.MEDIA_ERROR,details:Xe.a.BUFFER_APPENDING_ERROR,fatal:!1})},t.prototype.onBufferReset=function(){var e=this.sourceBuffer;for(var t in e){var r=e[t];try{this.mediaSource.removeSourceBuffer(r),r.removeEventListener("updateend",this.onsbue),r.removeEventListener("error",this.onsbe)}catch(e){}}this.sourceBuffer={},this.flushRange=[],this.segments=[],this.appended=0},t.prototype.onBufferCodecs=function(e){if(0===Object.keys(this.sourceBuffer).length){for(var t in e)this.pendingTracks[t]=e[t];var r=this.mediaSource;r&&"open"===r.readyState&&this.checkPendingTracks()}},t.prototype.createSourceBuffers=function(e){var t=this.sourceBuffer,r=this.mediaSource;for(var n in e)if(!t[n]){var i=e[n],a=i.levelCodec||i.codec,o=i.container+";codecs="+a;Je.b.log("creating sourceBuffer("+o+")");try{var s=t[n]=r.addSourceBuffer(o);s.addEventListener("updateend",this.onsbue),s.addEventListener("error",this.onsbe),this.tracks[n]={codec:a,container:i.container},i.buffer=s}catch(e){Je.b.error("error while trying to add sourceBuffer:"+e.message),this.hls.trigger(Qe.a.ERROR,{type:Xe.b.MEDIA_ERROR,details:Xe.a.BUFFER_ADD_CODEC_ERROR,fatal:!1,err:e,mimeType:o})}}this.hls.trigger(Qe.a.BUFFER_CREATED,{tracks:e})},t.prototype.onBufferAppending=function(e){this._needsFlush||(this.segments?this.segments.push(e):this.segments=[e],this.doAppending())},t.prototype.onBufferAppendFail=function(e){Je.b.error("sourceBuffer error:",e.event),this.hls.trigger(Qe.a.ERROR,{type:Xe.b.MEDIA_ERROR,details:Xe.a.BUFFER_APPENDING_ERROR,fatal:!1})},t.prototype.onBufferEos=function(e){var t=this.sourceBuffer,r=e.type;for(var n in t)r&&n!==r||t[n].ended||(t[n].ended=!0,Je.b.log(n+" sourceBuffer now EOS"));this.checkEos()},t.prototype.checkEos=function(){var e=this.sourceBuffer,t=this.mediaSource;if(!t||"open"!==t.readyState)return void(this._needsEos=!1);for(var r in e){var n=e[r];if(!n.ended)return;if(n.updating)return void(this._needsEos=!0)}Je.b.log("all media data available, signal endOfStream() to MediaSource and stop loading fragment");try{t.endOfStream()}catch(e){Je.b.warn("exception while calling mediaSource.endOfStream()")}this._needsEos=!1},t.prototype.onBufferFlushing=function(e){this.flushRange.push({start:e.startOffset,end:e.endOffset,type:e.type}),this.flushBufferCounter=0,this.doFlush()},t.prototype.onLevelUpdated=function(e){var t=e.details;t.fragments.length>0&&(this._levelDuration=t.totalduration+t.fragments[0].start,this._live=t.live,this.updateMediaElementDuration())},t.prototype.updateMediaElementDuration=function(){var e=this.hls.config,t=void 0;if(null!==this._levelDuration&&this.media&&this.mediaSource&&this.sourceBuffer&&0!==this.media.readyState&&"open"===this.mediaSource.readyState){for(var r in this.sourceBuffer)if(!0===this.sourceBuffer[r].updating)return;t=this.media.duration,null===this._msDuration&&(this._msDuration=this.mediaSource.duration),!0===this._live&&!0===e.liveDurationInfinity?(Je.b.log("Media Source duration is set to Infinity"),this._msDuration=this.mediaSource.duration=1/0):(this._levelDuration>this._msDuration&&this._levelDuration>t||t===1/0||isNaN(t))&&(Je.b.log("Updating Media Source duration to "+this._levelDuration.toFixed(3)),this._msDuration=this.mediaSource.duration=this._levelDuration)}},t.prototype.doFlush=function(){for(;this.flushRange.length;){var e=this.flushRange[0];if(!this.flushBuffer(e.start,e.end,e.type))return void(this._needsFlush=!0);this.flushRange.shift(),this.flushBufferCounter=0}if(0===this.flushRange.length){this._needsFlush=!1;var t=0,r=this.sourceBuffer;try{for(var n in r)t+=r[n].buffered.length}catch(e){Je.b.error("error while accessing sourceBuffer.buffered")}this.appended=t,this.hls.trigger(Qe.a.BUFFER_FLUSHED)}},t.prototype.doAppending=function(){var e=this.hls,t=this.sourceBuffer,r=this.segments;if(Object.keys(t).length){if(this.media.error)return this.segments=[],void Je.b.error("trying to append although a media error occured, flush segment and abort");if(this.appending)return;if(r&&r.length){var n=r.shift();try{var i=n.type,a=t[i];a?a.updating?r.unshift(n):(a.ended=!1,this.parent=n.parent,a.appendBuffer(n.data),this.appendError=0,this.appended++,this.appending=!0):this.onSBUpdateEnd()}catch(t){Je.b.error("error while trying to append buffer:"+t.message),r.unshift(n);var o={type:Xe.b.MEDIA_ERROR,parent:n.parent};22!==t.code?(this.appendError?this.appendError++:this.appendError=1,o.details=Xe.a.BUFFER_APPEND_ERROR,this.appendError>e.config.appendErrorMaxRetry?(Je.b.log("fail "+e.config.appendErrorMaxRetry+" times to append segment in sourceBuffer"),r=[],o.fatal=!0,e.trigger(Qe.a.ERROR,o)):(o.fatal=!1,e.trigger(Qe.a.ERROR,o))):(this.segments=[],o.details=Xe.a.BUFFER_FULL_ERROR,o.fatal=!1,e.trigger(Qe.a.ERROR,o))}}}},t.prototype.flushBuffer=function(e,t,r){var n=void 0,i=void 0,a=void 0,o=void 0,s=void 0,u=void 0,l=this.sourceBuffer;if(Object.keys(l).length){if(Je.b.log("flushBuffer,pos/start/end: "+this.media.currentTime.toFixed(3)+"/"+e+"/"+t),this.flushBufferCounter.5)return this.flushBufferCounter++,Je.b.log("flush "+c+" ["+s+","+u+"], of ["+a+","+o+"], pos:"+this.media.currentTime),n.remove(s,u),!1}catch(e){Je.b.warn("exception while accessing sourcebuffer, it might have been removed from MediaSource")}}}else Je.b.warn("abort flushing too many retries");Je.b.log("buffer flushed")}return!0},t}(tt),Er=_r,wr=function(){function e(e,t){for(var r=0;rthis.autoLevelCapping&&t.streamController.nextLevelSwitch(),this.autoLevelCapping=t.autoLevelCapping}}},t.prototype.getMaxLevel=function(e){var r=this;if(!this.levels)return-1;var n=this.levels.filter(function(n,i){return t.isLevelAllowed(i,r.restrictedLevels)&&i<=e});return t.getMaxLevelByMediaSize(n,this.mediaWidth,this.mediaHeight)},t.prototype._startCapping=function(){this.timer||(this.autoLevelCapping=Number.POSITIVE_INFINITY,this.hls.firstLevel=this.getMaxLevel(this.firstLevel),clearInterval(this.timer),this.timer=setInterval(this.detectPlayerSize.bind(this),1e3),this.detectPlayerSize())},t.prototype._stopCapping=function(){this.restrictedLevels=[],this.firstLevel=null,this.autoLevelCapping=Number.POSITIVE_INFINITY,this.timer&&(this.timer=clearInterval(this.timer),this.timer=null)},t.isLevelAllowed=function(e){return-1===(arguments.length>1&&void 0!==arguments[1]?arguments[1]:[]).indexOf(e)},t.getMaxLevelByMediaSize=function(e,t,r){if(!e||e&&!e.length)return-1;for(var n=e.length-1,i=0;i=t||a.height>=r)&&function(e,t){return!t||(e.width!==t.width||e.height!==t.height)}(a,e[i+1])){n=i;break}}return n},wr(t,[{key:"mediaWidth",get:function(){var e=void 0,r=this.media;return r&&(e=r.width||r.clientWidth||r.offsetWidth,e*=t.contentScaleFactor),e}},{key:"mediaHeight",get:function(){var e=void 0,r=this.media;return r&&(e=r.height||r.clientHeight||r.offsetHeight,e*=t.contentScaleFactor),e}}],[{key:"contentScaleFactor",get:function(){var e=1;try{e=window.devicePixelRatio}catch(e){}return e}}]),t}(tt),Sr=Tr,Rr=window,Ar=Rr.performance,Lr=function(e){function t(r){return de(this,t),fe(this,e.call(this,r,Qe.a.MEDIA_ATTACHING))}return he(t,e),t.prototype.destroy=function(){this.timer&&clearInterval(this.timer),this.isVideoPlaybackQualityAvailable=!1},t.prototype.onMediaAttaching=function(e){var t=this.hls.config;if(t.capLevelOnFPSDrop){"function"==typeof(this.video=e.media instanceof window.HTMLVideoElement?e.media:null).getVideoPlaybackQuality&&(this.isVideoPlaybackQualityAvailable=!0),clearInterval(this.timer),this.timer=setInterval(this.checkFPSInterval.bind(this),t.fpsDroppedMonitoringPeriod)}},t.prototype.checkFPS=function(e,t,r){var n=Ar.now();if(t){if(this.lastTime){var i=n-this.lastTime,a=r-this.lastDroppedFrames,o=t-this.lastDecodedFrames,s=1e3*a/i,u=this.hls;if(u.trigger(Qe.a.FPS_DROP,{currentDropped:a,currentDecoded:o,totalDroppedFrames:r}),s>0&&a>u.config.fpsDroppedMonitoringThreshold*o){var l=u.currentLevel;Je.b.warn("drop FPS ratio greater than max allowed value for currentLevel: "+l),l>0&&(-1===u.autoLevelCapping||u.autoLevelCapping>=l)&&(l-=1,u.trigger(Qe.a.FPS_DROP_LEVEL_CAPPING,{level:l,droppedLevel:u.currentLevel}),u.autoLevelCapping=l,u.streamController.nextLevelSwitch())}}this.lastTime=n,this.lastDroppedFrames=r,this.lastDecodedFrames=t}},t.prototype.checkFPSInterval=function(){var e=this.video;if(e)if(this.isVideoPlaybackQualityAvailable){var t=e.getVideoPlaybackQuality();this.checkFPS(e,t.totalVideoFrames,t.droppedVideoFrames)}else this.checkFPS(e,e.webkitDecodedFrameCount,e.webkitDroppedFrameCount)},t}(tt),Cr=Lr,kr=window,Dr=kr.performance,Ir=kr.XMLHttpRequest,Pr=function(){function e(t){pe(this,e),t&&t.xhrSetup&&(this.xhrSetup=t.xhrSetup)}return e.prototype.destroy=function(){this.abort(),this.loader=null},e.prototype.abort=function(){var e=this.loader;e&&4!==e.readyState&&(this.stats.aborted=!0,e.abort()),window.clearTimeout(this.requestTimeout),this.requestTimeout=null,window.clearTimeout(this.retryTimeout),this.retryTimeout=null},e.prototype.load=function(e,t,r){this.context=e,this.config=t,this.callbacks=r,this.stats={trequest:Dr.now(),retry:0},this.retryDelay=t.retryDelay,this.loadInternal()},e.prototype.loadInternal=function(){var e=void 0,t=this.context;e=this.loader=new Ir;var r=this.stats;r.tfirst=0,r.loaded=0;var n=this.xhrSetup;try{if(n)try{n(e,t.url)}catch(r){e.open("GET",t.url,!0),n(e,t.url)}e.readyState||e.open("GET",t.url,!0)}catch(r){return void this.callbacks.onError({code:e.status,text:r.message},t,e)}t.rangeEnd&&e.setRequestHeader("Range","bytes="+t.rangeStart+"-"+(t.rangeEnd-1)),e.onreadystatechange=this.readystatechange.bind(this),e.onprogress=this.loadprogress.bind(this),e.responseType=t.responseType,this.requestTimeout=window.setTimeout(this.loadtimeout.bind(this),this.config.timeout),e.send()},e.prototype.readystatechange=function(e){var t=e.currentTarget,r=t.readyState,n=this.stats,i=this.context,a=this.config;if(!n.aborted&&r>=2)if(window.clearTimeout(this.requestTimeout),0===n.tfirst&&(n.tfirst=Math.max(Dr.now(),n.trequest)),4===r){var o=t.status;if(o>=200&&o<300){n.tload=Math.max(n.tfirst,Dr.now());var s=void 0,u=void 0;"arraybuffer"===i.responseType?(s=t.response,u=s.byteLength):(s=t.responseText,u=s.length),n.loaded=n.total=u;var l={url:t.responseURL,data:s};this.callbacks.onSuccess(l,n,i,t)}else n.retry>=a.maxRetry||o>=400&&o<499?(Je.b.error(o+" while loading "+i.url),this.callbacks.onError({code:o,text:t.statusText},i,t)):(Je.b.warn(o+" while loading "+i.url+", retrying in "+this.retryDelay+"..."),this.destroy(),this.retryTimeout=window.setTimeout(this.loadInternal.bind(this),this.retryDelay),this.retryDelay=Math.min(2*this.retryDelay,a.maxRetryDelay),n.retry++)}else this.requestTimeout=window.setTimeout(this.loadtimeout.bind(this),a.timeout)},e.prototype.loadtimeout=function(){Je.b.warn("timeout while loading "+this.context.url),this.callbacks.onTimeout(this.stats,this.context,null)},e.prototype.loadprogress=function(e){var t=e.currentTarget,r=this.stats;r.loaded=e.loaded,e.lengthComputable&&(r.total=e.total);var n=this.callbacks.onProgress;n&&n(r,this.context,null,t)},e}(),Or=Pr,xr=function(){function e(e,t){for(var r=0;r=this.tracks.length)return void Je.b.warn("Invalid audio track id:",e.id);if(Je.b.log("audioTrack "+e.id+" loaded"),this.tracks[e.id].details=e.details,e.details.live&&!this.hasInterval()){var t=1e3*e.details.targetduration;this.setInterval(t)}!e.details.live&&this.hasInterval()&&this.clearInterval()},t.prototype.onAudioTrackSwitched=function(e){var t=this.tracks[e.id].groupId;t&&this.audioGroupId!==t&&(this.audioGroupId=t)},t.prototype.onLevelLoaded=function(e){var t=this.hls.levels[e.level];if(t.audioGroupIds){var r=t.audioGroupIds[t.urlId];this.audioGroupId!==r&&(this.audioGroupId=r,this._selectInitialAudioTrack())}},t.prototype.onError=function(e){e.type===Xe.b.NETWORK_ERROR&&(e.fatal&&this.clearInterval(),e.details===Xe.a.AUDIO_TRACK_LOAD_ERROR&&(Je.b.warn("Network failure on audio-track id:",e.context.id),this._handleLoadError()))},t.prototype.doTick=function(){this._updateTrack(this.trackId)},t.prototype._selectInitialAudioTrack=function(){var e=this,t=this.tracks;if(t.length){var r=this.tracks[this.trackId],n=null;r&&(n=r.name);var i=t.filter(function(e){return e.default});i.length?t=i:Je.b.warn("No default audio tracks defined");var a=!1,o=function(){t.forEach(function(t){a||e.audioGroupId&&t.groupId!==e.audioGroupId||n&&n!==t.name||(e.audioTrack=t.id,a=!0)})};o(),a||(n=null,o()),a||(Je.b.error("No track found for running audio group-ID: "+this.audioGroupId),this.hls.trigger(Qe.a.ERROR,{type:Xe.b.MEDIA_ERROR,details:Xe.a.AUDIO_TRACK_LOAD_ERROR,fatal:!0}))}},t.prototype._needsTrackLoading=function(e){var t=e.details;return!t||(!!t.live||void 0)},t.prototype._loadTrackDetailsIfNeeded=function(e){if(this._needsTrackLoading(e)){var t=e.url,r=e.id;Je.b.log("loading audio-track playlist for id: "+r),this.hls.trigger(Qe.a.AUDIO_TRACK_LOADING,{url:t,id:r})}},t.prototype._updateTrack=function(e){if(!(e<0||e>=this.tracks.length)){this.clearInterval(),this.trackId=e,Je.b.log("trying to update audio-track "+e);var t=this.tracks[e];this._loadTrackDetailsIfNeeded(t)}},t.prototype._handleLoadError=function(){this.trackIdBlacklist[this.trackId]=!0;var e=this.trackId,t=this.tracks[e],r=t.name,n=t.language,i=t.groupId;Je.b.warn("Loading failed on audio track id: "+e+", group-id: "+i+', name/language: "'+r+'" / "'+n+'"');for(var a=e,o=0;o no-op");if(e<0||e>=this.tracks.length)return void Je.b.warn("Invalid id passed to audio-track controller");var t=this.tracks[e];Je.b.log("Now switching to audio-track index "+e),this.clearInterval(),this.trackId=e;var r=t.url,n=t.type,i=t.id;this.hls.trigger(Qe.a.AUDIO_TRACK_SWITCHING,{id:i,type:n,url:r}),this._loadTrackDetailsIfNeeded(t)}}]),t}(Qt),Fr=Mr,Nr=function(){function e(e,t){for(var r=0;r0&&-1===e?(Je.b.log("audio:override startPosition with lastCurrentTime @"+t.toFixed(3)),this.state=Gr.IDLE):(this.lastCurrentTime=this.startPosition?this.startPosition:e,this.state=Gr.STARTING),this.nextLoadPosition=this.startPosition=this.lastCurrentTime,this.tick()}else this.startPosition=e,this.state=Gr.STOPPED},t.prototype.stopLoad=function(){var e=this.fragCurrent;e&&(e.loader&&e.loader.abort(),this.fragmentTracker.removeFragment(e),this.fragCurrent=null),this.fragPrevious=null,this.demuxer&&(this.demuxer.destroy(),this.demuxer=null),this.state=Gr.STOPPED},t.prototype.doTick=function(){var e=void 0,t=void 0,r=void 0,n=this.hls,i=n.config;switch(this.state){case Gr.ERROR:case Gr.PAUSED:case Gr.BUFFER_FLUSHING:break;case Gr.STARTING:this.state=Gr.WAITING_TRACK,this.loadedmetadata=!1;break;case Gr.IDLE:var a=this.tracks;if(!a)break;if(!this.media&&(this.startFragRequested||!i.startFragPrefetch))break;if(this.loadedmetadata)e=this.media.currentTime;else if(void 0===(e=this.nextLoadPosition))break;var o=this.mediaBuffer?this.mediaBuffer:this.media,s=this.videoBuffer?this.videoBuffer:this.media,u=Ft.bufferInfo(o,e,i.maxBufferHole),l=Ft.bufferInfo(s,e,i.maxBufferHole),c=u.len,d=u.end,f=this.fragPrevious,h=Math.min(i.maxBufferLength,i.maxMaxBufferLength),p=Math.max(h,l.len),g=this.audioSwitch,v=this.trackId;if((cb||u.nextStart))return;Je.b.log("alt audio track ahead of main track, seek to start of alt audio track"),this.media.currentTime=b+.05}if(r.initSegment&&!r.initSegment.data)E=r.initSegment;else if(d<=b){if(E=y[0],null!==this.videoTrackCC&&E.cc!==this.videoTrackCC&&(E=D(y,this.videoTrackCC)),r.live&&E.loadIdx&&E.loadIdx===this.fragLoadIdx){var w=u.nextStart?u.nextStart:b;return Je.b.log("no alt audio available @currentTime:"+this.media.currentTime+", seeking @"+(w+.05)),void(this.media.currentTime=w+.05)}}else{var T=void 0,S=i.maxFragLookUpTolerance,R=f?y[f.sn-y[0].sn+1]:void 0,A=function(e){var t=Math.min(S,e.duration);return e.start+e.duration-t<=d?1:e.start-t>d&&e.start?-1:0};d<_?(d>_-S&&(S=0),T=R&&!A(R)?R:Mt.search(y,A)):T=y[m-1],T&&(E=T,b=T.start,f&&E.level===f.level&&E.sn===f.sn&&(E.sn=C||k)&&(Je.b.log("audioStreamController: retryDate reached, switch back to IDLE state"),this.state=Gr.IDLE);break;case Gr.WAITING_INIT_PTS:var I=this.videoTrackCC;if(void 0===this.initPTS[I])break;var P=this.waitingFragment;if(P){var O=P.frag.cc;I!==O?(t=this.tracks[this.trackId],t.details&&t.details.live&&(Je.b.warn("Waiting fragment CC ("+O+") does not match video track CC ("+I+")"),this.waitingFragment=null,this.state=Gr.IDLE)):(this.state=Gr.FRAG_LOADING,this.onFragLoaded(this.waitingFragment),this.waitingFragment=null)}else this.state=Gr.IDLE;break;case Gr.STOPPED:case Gr.FRAG_LOADING:case Gr.PARSING:case Gr.PARSED:case Gr.ENDED:}},t.prototype.onMediaAttached=function(e){var t=this.media=this.mediaBuffer=e.media;this.onvseeking=this.onMediaSeeking.bind(this),this.onvended=this.onMediaEnded.bind(this),t.addEventListener("seeking",this.onvseeking),t.addEventListener("ended",this.onvended);var r=this.config;this.tracks&&r.autoStartLoad&&this.startLoad(r.startPosition)},t.prototype.onMediaDetaching=function(){var e=this.media;e&&e.ended&&(Je.b.log("MSE detaching and video ended, reset startPosition"),this.startPosition=this.lastCurrentTime=0),e&&(e.removeEventListener("seeking",this.onvseeking),e.removeEventListener("ended",this.onvended),this.onvseeking=this.onvseeked=this.onvended=null),this.media=this.mediaBuffer=this.videoBuffer=null,this.loadedmetadata=!1,this.stopLoad()},t.prototype.onMediaSeeking=function(){this.state===Gr.ENDED&&(this.state=Gr.IDLE),this.media&&(this.lastCurrentTime=this.media.currentTime),this.tick()},t.prototype.onMediaEnded=function(){this.startPosition=this.lastCurrentTime=0},t.prototype.onAudioTracksUpdated=function(e){Je.b.log("audio tracks updated"),this.tracks=e.audioTracks},t.prototype.onAudioTrackSwitching=function(e){var t=!!e.url;this.trackId=e.id,this.fragCurrent=null,this.state=Gr.PAUSED,this.waitingFragment=null,t?this.setInterval(100):this.demuxer&&(this.demuxer.destroy(),this.demuxer=null),t&&(this.audioSwitch=!0,this.state=Gr.IDLE),this.tick()},t.prototype.onAudioTrackLoaded=function(e){var t=e.details,r=e.id,n=this.tracks[r],i=t.totalduration,a=0;if(Je.b.log("track "+r+" loaded ["+t.startSN+","+t.endSN+"],duration:"+i),t.live){var o=n.details;o&&t.fragments.length>0?(C(o,t),a=t.fragments[0].start,t.PTSKnown?Je.b.log("live audio playlist sliding:"+a.toFixed(3)):Je.b.log("live audio playlist - outdated PTS, unknown sliding")):(t.PTSKnown=!1,Je.b.log("live audio playlist - first load, unknown sliding"))}else t.PTSKnown=!1;if(n.details=t,!this.startFragRequested){if(-1===this.startPosition){var s=t.startTimeOffset;isNaN(s)?this.startPosition=0:(Je.b.log("start time offset found in playlist, adjust startPosition to "+s),this.startPosition=s)}this.nextLoadPosition=this.startPosition}this.state===Gr.WAITING_TRACK&&(this.state=Gr.IDLE),this.tick()},t.prototype.onKeyLoaded=function(){this.state===Gr.KEY_LOADING&&(this.state=Gr.IDLE,this.tick())},t.prototype.onFragLoaded=function(e){var t=this.fragCurrent,r=e.frag;if(this.state===Gr.FRAG_LOADING&&t&&"audio"===r.type&&r.level===t.level&&r.sn===t.sn){var n=this.tracks[this.trackId],i=n.details,a=i.totalduration,o=t.level,s=t.sn,u=t.cc,l=this.config.defaultAudioCodec||n.audioCodec||"mp4a.40.2",c=this.stats=e.stats;if("initSegment"===s)this.state=Gr.IDLE,c.tparsed=c.tbuffered=Br.now(),i.initSegment.data=e.payload,this.hls.trigger(Qe.a.FRAG_BUFFERED,{stats:c,frag:t,id:"audio"}),this.tick();else{this.state=Gr.PARSING,this.appended=!1,this.demuxer||(this.demuxer=new qt(this.hls,"audio"));var d=this.initPTS[u],f=i.initSegment?i.initSegment.data:[];if(i.initSegment||void 0!==d){this.pendingBuffering=!0,Je.b.log("Demuxing "+s+" of ["+i.startSN+" ,"+i.endSN+"],track "+o);this.demuxer.push(e.payload,f,l,null,t,a,!1,d)}else Je.b.log("unknown video PTS for continuity counter "+u+", waiting for video PTS before demuxing audio frag "+s+" of ["+i.startSN+" ,"+i.endSN+"],track "+o),this.waitingFragment=e,this.state=Gr.WAITING_INIT_PTS}}this.fragLoadError=0},t.prototype.onFragParsingInitSegment=function(e){var t=this.fragCurrent,r=e.frag;if(t&&"audio"===e.id&&r.sn===t.sn&&r.level===t.level&&this.state===Gr.PARSING){var n=e.tracks,i=void 0;if(n.video&&delete n.video,i=n.audio){i.levelCodec=i.codec,i.id=e.id,this.hls.trigger(Qe.a.BUFFER_CODECS,n),Je.b.log("audio track:audio,container:"+i.container+",codecs[level/parsed]=["+i.levelCodec+"/"+i.codec+"]");var a=i.initSegment;if(a){var o={type:"audio",data:a,parent:"audio",content:"initSegment"};this.audioSwitch?this.pendingData=[o]:(this.appended=!0,this.pendingBuffering=!0,this.hls.trigger(Qe.a.BUFFER_APPENDING,o))}this.tick()}}},t.prototype.onFragParsingData=function(e){var t=this,r=this.fragCurrent,n=e.frag;if(r&&"audio"===e.id&&"audio"===e.type&&n.sn===r.sn&&n.level===r.level&&this.state===Gr.PARSING){var i=this.trackId,a=this.tracks[i],o=this.hls;isNaN(e.endPTS)&&(e.endPTS=e.startPTS+r.duration,e.endDTS=e.startDTS+r.duration),r.addElementaryStream(ut.ElementaryStreamTypes.AUDIO),Je.b.log("parsed "+e.type+",PTS:["+e.startPTS.toFixed(3)+","+e.endPTS.toFixed(3)+"],DTS:["+e.startDTS.toFixed(3)+"/"+e.endDTS.toFixed(3)+"],nb:"+e.nb),L(a.details,r,e.startPTS,e.endPTS);var s=this.audioSwitch,u=this.media,l=!1;if(s&&u)if(u.readyState){var c=u.currentTime;Je.b.log("switching audio track : currentTime:"+c),c>=e.startPTS&&(Je.b.log("switching audio track : flushing all audio"),this.state=Gr.BUFFER_FLUSHING,o.trigger(Qe.a.BUFFER_FLUSHING,{startOffset:0,endOffset:Number.POSITIVE_INFINITY,type:"audio"}),l=!0,this.audioSwitch=!1,o.trigger(Qe.a.AUDIO_TRACK_SWITCHED,{id:i}))}else this.audioSwitch=!1,o.trigger(Qe.a.AUDIO_TRACK_SWITCHED,{id:i});var d=this.pendingData;if(!d)return Je.b.warn("Apparently attempt to enqueue media payload without codec initialization data upfront"),void o.trigger(Qe.a.ERROR,{type:Xe.b.MEDIA_ERROR,details:null,fatal:!0});this.audioSwitch||([e.data1,e.data2].forEach(function(t){t&&t.length&&d.push({type:e.type,data:t,parent:"audio",content:"data"})}),!l&&d.length&&(d.forEach(function(e){t.state===Gr.PARSING&&(t.pendingBuffering=!0,t.hls.trigger(Qe.a.BUFFER_APPENDING,e))}),this.pendingData=[],this.appended=!0)),this.tick()}},t.prototype.onFragParsed=function(e){var t=this.fragCurrent,r=e.frag;t&&"audio"===e.id&&r.sn===t.sn&&r.level===t.level&&this.state===Gr.PARSING&&(this.stats.tparsed=Br.now(),this.state=Gr.PARSED,this._checkAppendedParsed())},t.prototype.onBufferReset=function(){this.mediaBuffer=this.videoBuffer=null,this.loadedmetadata=!1},t.prototype.onBufferCreated=function(e){var t=e.tracks.audio;t&&(this.mediaBuffer=t.buffer,this.loadedmetadata=!0),e.tracks.video&&(this.videoBuffer=e.tracks.video.buffer)},t.prototype.onBufferAppended=function(e){if("audio"===e.parent){var t=this.state;t!==Gr.PARSING&&t!==Gr.PARSED||(this.pendingBuffering=e.pending>0,this._checkAppendedParsed())}},t.prototype._checkAppendedParsed=function(){if(!(this.state!==Gr.PARSED||this.appended&&this.pendingBuffering)){var e=this.fragCurrent,t=this.stats,r=this.hls;if(e){this.fragPrevious=e,t.tbuffered=Br.now(),r.trigger(Qe.a.FRAG_BUFFERED,{stats:t,frag:e,id:"audio"});var n=this.mediaBuffer?this.mediaBuffer:this.media;Je.b.log("audio buffered : "+zt.toString(n.buffered)),this.audioSwitch&&this.appended&&(this.audioSwitch=!1,r.trigger(Qe.a.AUDIO_TRACK_SWITCHED,{id:this.trackId})),this.state=Gr.IDLE}this.tick()}},t.prototype.onError=function(e){var t=e.frag;if(!t||"audio"===t.type)switch(e.details){case Xe.a.FRAG_LOAD_ERROR:case Xe.a.FRAG_LOAD_TIMEOUT:var r=e.frag;if(r&&"audio"!==r.type)break;if(!e.fatal){var n=this.fragLoadError;n?n++:n=1;var i=this.config;if(n<=i.fragLoadingMaxRetry){this.fragLoadError=n;var a=Math.min(Math.pow(2,n-1)*i.fragLoadingRetryDelay,i.fragLoadingMaxRetryTimeout);Je.b.warn("AudioStreamController: frag loading failed, retry in "+a+" ms"),this.retryDate=Br.now()+a,this.state=Gr.FRAG_LOADING_WAITING_RETRY}else Je.b.error("AudioStreamController: "+e.details+" reaches max retry, redispatch as fatal ..."),e.fatal=!0,this.state=Gr.ERROR}break;case Xe.a.AUDIO_TRACK_LOAD_ERROR:case Xe.a.AUDIO_TRACK_LOAD_TIMEOUT:case Xe.a.KEY_LOAD_ERROR:case Xe.a.KEY_LOAD_TIMEOUT:this.state!==Gr.ERROR&&(this.state=e.fatal?Gr.ERROR:Gr.IDLE,Je.b.warn("AudioStreamController: "+e.details+" while loading frag, now switching to "+this.state+" state ..."));break;case Xe.a.BUFFER_FULL_ERROR:if("audio"===e.parent&&(this.state===Gr.PARSING||this.state===Gr.PARSED)){var o=this.mediaBuffer,s=this.media.currentTime;if(o&&Ft.isBuffered(o,s)&&Ft.isBuffered(o,s+.5)){var u=this.config;u.maxMaxBufferLength>=u.maxBufferLength&&(u.maxMaxBufferLength/=2,Je.b.warn("AudioStreamController: reduce max buffer length to "+u.maxMaxBufferLength+"s")),this.state=Gr.IDLE}else Je.b.warn("AudioStreamController: buffer full error also media.currentTime is not buffered, flush audio buffer"),this.fragCurrent=null,this.state=Gr.BUFFER_FLUSHING,this.hls.trigger(Qe.a.BUFFER_FLUSHING,{startOffset:0,endOffset:Number.POSITIVE_INFINITY,type:"audio"})}}},t.prototype.onBufferFlushed=function(){var e=this,t=this.pendingData;t&&t.length?(Je.b.log("AudioStreamController: appending pending audio data after buffer flushed"),t.forEach(function(t){e.hls.trigger(Qe.a.BUFFER_APPENDING,t)}),this.appended=!0,this.pendingData=[],this.state=Gr.PARSED):(this.state=Gr.IDLE,this.fragPrevious=null,this.tick())},Nr(t,[{key:"state",set:function(e){if(this.state!==e){var t=this.state;this._state=e,Je.b.log("audio stream:"+t+"->"+e)}},get:function(){return this._state}}]),t}(Qt),Kr=jr,Hr=function(){function e(e){return"string"==typeof e&&(!!a[e.toLowerCase()]&&e.toLowerCase())}function t(e){return"string"==typeof e&&(!!o[e.toLowerCase()]&&e.toLowerCase())}function r(e){for(var t=1;t100)throw new Error("Position must be between 0 and 100.");_=e,this.hasBeenReset=!0}})),Object.defineProperty(s,"positionAlign",r({},l,{get:function(){return E},set:function(e){var r=t(e);if(!r)throw new SyntaxError("An invalid or illegal string was specified.");E=r,this.hasBeenReset=!0}})),Object.defineProperty(s,"size",r({},l,{get:function(){return w},set:function(e){if(e<0||e>100)throw new Error("Size must be between 0 and 100.");w=e,this.hasBeenReset=!0}})),Object.defineProperty(s,"align",r({},l,{get:function(){return T},set:function(e){var r=t(e);if(!r)throw new SyntaxError("An invalid or illegal string was specified.");T=r,this.hasBeenReset=!0}})),s.displayState=void 0,u)return s}if("undefined"!=typeof window&&window.VTTCue)return window.VTTCue;var i="auto",a={"":!0,lr:!0,rl:!0},o={start:!0,middle:!0,end:!0,left:!0,right:!0};return n.prototype.getCueAsHTML=function(){return window.WebVTT.convertCueToDOMTree(window,this.text)},n}(),Wr=function(){return{decode:function(e){if(!e)return"";if("string"!=typeof e)throw new Error("Error - expected string data.");return decodeURIComponent(encodeURIComponent(e))}}};Te.prototype={set:function(e,t){this.get(e)||""===t||(this.values[e]=t)},get:function(e,t,r){return r?this.has(e)?this.values[e]:t[r]:this.has(e)?this.values[e]:t},has:function(e){return e in this.values},alt:function(e,t,r){for(var n=0;n=0&&t<=100)&&(this.set(e,t),!0)}};var Yr=new Hr(0,0,0),qr="middle"===Yr.align?"middle":"center";Ee.prototype={parse:function(e){function t(){var e=r.buffer,t=0;for(e=Ae(e);tJr&&(nn.log("ERROR","Too large cursor position "+this.pos),this.pos=Jr)},e.prototype.moveCursor=function(e){var t=this.pos+e;if(e>1)for(var r=this.pos+1;r=144&&this.backSpace();var t=Xr(e);if(this.pos>=Jr)return void nn.log("ERROR","Cannot insert "+e.toString(16)+" ("+t+") at position "+this.pos+". Skipping it!");this.chars[this.pos].setChar(t,this.currPenState),this.moveCursor(1)},e.prototype.clearFromPos=function(e){var t=void 0;for(t=e;t0&&(r=e?"["+t.join(" | ")+"]":t.join("\n")),r},e.prototype.getTextAndFormat=function(){return this.rows},e}(),cn=function(){function e(t,r){Ce(this,e),this.chNr=t,this.outputFilter=r,this.mode=null,this.verbose=0,this.displayedMemory=new ln,this.nonDisplayedMemory=new ln,this.lastOutputScreen=new ln,this.currRollUpRow=this.displayedMemory.rows[Qr-1],this.writeScreen=this.displayedMemory,this.mode=null,this.cueStartTime=null}return e.prototype.reset=function(){this.mode=null,this.displayedMemory.reset(),this.nonDisplayedMemory.reset(),this.lastOutputScreen.reset(),this.currRollUpRow=this.displayedMemory.rows[Qr-1],this.writeScreen=this.displayedMemory,this.mode=null,this.cueStartTime=null,this.lastCueEndTime=null},e.prototype.getHandler=function(){return this.outputFilter},e.prototype.setHandler=function(e){this.outputFilter=e},e.prototype.setPAC=function(e){this.writeScreen.setPAC(e)},e.prototype.setBkgData=function(e){this.writeScreen.setBkgData(e)},e.prototype.setMode=function(e){e!==this.mode&&(this.mode=e,nn.log("INFO","MODE="+e),"MODE_POP-ON"===this.mode?this.writeScreen=this.nonDisplayedMemory:(this.writeScreen=this.displayedMemory,this.writeScreen.reset()),"MODE_ROLL-UP"!==this.mode&&(this.displayedMemory.nrRollUpRows=null,this.nonDisplayedMemory.nrRollUpRows=null),this.mode=e)},e.prototype.insertChars=function(e){for(var t=0;t=46,t.italics)t.foreground="white";else{var r=Math.floor(e/2)-16,n=["white","green","blue","cyan","red","yellow","magenta"];t.foreground=n[r]}nn.log("INFO","MIDROW: "+JSON.stringify(t)),this.writeScreen.setPen(t)},e.prototype.outputDataUpdate=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=nn.time;null!==t&&this.outputFilter&&(null!==this.cueStartTime||this.displayedMemory.isEmpty()?this.displayedMemory.equals(this.lastOutputScreen)||(this.outputFilter.newCue&&(this.outputFilter.newCue(this.cueStartTime,t,this.lastOutputScreen),!0===e&&this.outputFilter.dispatchCue&&this.outputFilter.dispatchCue()),this.cueStartTime=this.displayedMemory.isEmpty()?null:t):this.cueStartTime=t,this.lastOutputScreen.copy(this.displayedMemory))},e.prototype.cueSplitAtTime=function(e){this.outputFilter&&(this.displayedMemory.isEmpty()||(this.outputFilter.newCue&&this.outputFilter.newCue(this.cueStartTime,e,this.displayedMemory),this.cueStartTime=e))},e}(),dn=function(){function e(t,r,n){Ce(this,e),this.field=t||1,this.outputs=[r,n],this.channels=[new cn(1,r),new cn(2,n)],this.currChNr=-1,this.lastCmdA=null,this.lastCmdB=null,this.bufferedData=[],this.startTime=null,this.lastTime=null,this.dataCounters={padding:0,char:0,cmd:0,other:0}}return e.prototype.getHandler=function(e){return this.channels[e].getHandler()},e.prototype.setHandler=function(e,t){this.channels[e].setHandler(t)},e.prototype.addData=function(e,t){var r=void 0,n=void 0,i=void 0,a=!1;this.lastTime=e,nn.setTime(e);for(var o=0;o ("+an([n,i])+")"),r=this.parseCmd(n,i),r||(r=this.parseMidrow(n,i)),r||(r=this.parsePAC(n,i)),r||(r=this.parseBackgroundAttributes(n,i)),!r&&(a=this.parseChars(n,i)))if(this.currChNr&&this.currChNr>=0){var s=this.channels[this.currChNr-1];s.insertChars(a)}else nn.log("WARNING","No channel found yet. TEXT-MODE?");r?this.dataCounters.cmd+=2:a?this.dataCounters.char+=2:(this.dataCounters.other+=2,nn.log("WARNING","Couldn't parse cleaned data "+an([n,i])+" orig: "+an([t[o],t[o+1]])))}else this.dataCounters.padding+=2},e.prototype.parseCmd=function(e,t){var r=null,n=(20===e||28===e)&&t>=32&&t<=47,i=(23===e||31===e)&&t>=33&&t<=35;if(!n&&!i)return!1;if(e===this.lastCmdA&&t===this.lastCmdB)return this.lastCmdA=null,this.lastCmdB=null,nn.log("DEBUG","Repeated command ("+an([e,t])+") is dropped"),!0;r=20===e||23===e?1:2;var a=this.channels[r-1];return 20===e||28===e?32===t?a.ccRCL():33===t?a.ccBS():34===t?a.ccAOF():35===t?a.ccAON():36===t?a.ccDER():37===t?a.ccRU(2):38===t?a.ccRU(3):39===t?a.ccRU(4):40===t?a.ccFON():41===t?a.ccRDC():42===t?a.ccTR():43===t?a.ccRTD():44===t?a.ccEDM():45===t?a.ccCR():46===t?a.ccENM():47===t&&a.ccEOC():a.ccTO(t-32),this.lastCmdA=e,this.lastCmdB=t,this.currChNr=r,!0},e.prototype.parseMidrow=function(e,t){var r=null;if((17===e||25===e)&&t>=32&&t<=47){if((r=17===e?1:2)!==this.currChNr)return nn.log("ERROR","Mismatch channel in midrow parsing"),!1;return this.channels[r-1].ccMIDROW(t),nn.log("DEBUG","MIDROW ("+an([e,t])+")"),!0}return!1},e.prototype.parsePAC=function(e,t){var r=null,n=null,i=(e>=17&&e<=23||e>=25&&e<=31)&&t>=64&&t<=127,a=(16===e||24===e)&&t>=64&&t<=95;if(!i&&!a)return!1;if(e===this.lastCmdA&&t===this.lastCmdB)return this.lastCmdA=null,this.lastCmdB=null,!0;r=e<=23?1:2,n=t>=64&&t<=95?1===r?$r[e]:en[e]:1===r?Zr[e]:tn[e];var o=this.interpretPAC(n,t);return this.channels[r-1].setPAC(o),this.lastCmdA=e,this.lastCmdB=t,this.currChNr=r,!0},e.prototype.interpretPAC=function(e,t){var r=t,n={color:null,italics:!1,indent:null,underline:!1,row:e};return r=t>95?t-96:t-64,n.underline=1==(1&r),r<=13?n.color=["white","green","blue","cyan","red","yellow","magenta","white"][Math.floor(r/2)]:r<=15?(n.italics=!0,n.color="white"):n.indent=4*Math.floor((r-16)/2),n},e.prototype.parseChars=function(e,t){var r=null,n=null,i=null;if(e>=25?(r=2,i=e-8):(r=1,i=e),i>=17&&i<=19){var a=t;a=17===i?t+80:18===i?t+112:t+144,nn.log("INFO","Special char '"+Xr(a)+"' in channel "+r),n=[a]}else e>=32&&e<=127&&(n=0===t?[e]:[e,t]);if(n){var o=an(n);nn.log("DEBUG","Char codes = "+o.join(",")),this.lastCmdA=null,this.lastCmdB=null}return n},e.prototype.parseBackgroundAttributes=function(e,t){var r=void 0,n=void 0,i=void 0,a=void 0,o=(16===e||24===e)&&t>=32&&t<=47,s=(23===e||31===e)&&t>=45&&t<=47;return!(!o&&!s)&&(r={},16===e||24===e?(n=Math.floor((t-32)/2),r.background=rn[n],t%2==1&&(r.background=r.background+"_semi")):45===t?r.background="transparent":(r.foreground="black",47===t&&(r.underline=!0)),i=e<24?1:2,a=this.channels[i-1],a.setBkgData(r),this.lastCmdA=null,this.lastCmdB=null,!0)},e.prototype.reset=function(){for(var e=0;ee)&&(this.startTime=e),this.endTime=t,this.screen=r,this.timelineController.createCaptionsTrack(this.trackName)},e}(),pn=hn,gn=function(e,t,r){return e.substr(r||0,t.length)===t},vn=function(e){var t=parseInt(e.substr(-3)),r=parseInt(e.substr(-6,2)),n=parseInt(e.substr(-9,2)),i=e.length>9?parseInt(e.substr(0,e.indexOf(":"))):0;return isNaN(t)||isNaN(r)||isNaN(n)||isNaN(i)?-1:(t+=1e3*r,t+=6e4*n,t+=36e5*i)},yn=function(e){for(var t=5381,r=e.length;r;)t=33*t^e.charCodeAt(--r);return(t>>>0).toString()},mn=function(e,t,r){var n=e[t],i=e[n.prevCC];if(!i||!i.new&&n.new)return e.ccOffset=e.presentationOffset=n.start,void(n.new=!1);for(;i&&i.new;)e.ccOffset+=n.start-i.start,n.new=!1,n=i,i=e[n.prevCC];e.presentationOffset=r},bn={parse:function(e,t,r,n,i,a){var o=/\r\n|\n\r|\n|\r/g,s=Object(sr.b)(new Uint8Array(e)).trim().replace(o,"\n").split("\n"),u="00:00.000",l=0,c=0,d=0,f=[],h=void 0,p=!0,g=new Vr;g.oncue=function(e){var t=r[n],i=r.ccOffset;t&&t.new&&(void 0!==c?i=r.ccOffset=t.start:mn(r,n,d)),d&&(i=d+r.ccOffset-r.presentationOffset),e.startTime+=i-c,e.endTime+=i-c,e.id=yn(e.startTime.toString())+yn(e.endTime.toString())+yn(e.text),e.text=decodeURIComponent(encodeURIComponent(e.text)),e.endTime>0&&f.push(e)},g.onparsingerror=function(e){h=e},g.onflush=function(){if(h&&a)return void a(h);i(f)},s.forEach(function(e){if(p){if(gn(e,"X-TIMESTAMP-MAP=")){p=!1,e.substr(16).split(",").forEach(function(e){gn(e,"LOCAL:")?u=e.substr(6):gn(e,"MPEGTS:")&&(l=parseInt(e.substr(7)))});try{t=t<0?t+8589934592:t,l-=t,c=vn(u)/1e3,d=l/9e4,-1===c&&(h=new Error("Malformed X-TIMESTAMP-MAP: "+e))}catch(t){h=new Error("Malformed X-TIMESTAMP-MAP: "+e)}return}""===e&&(p=!1)}g.parse(e+"\n")}),g.flush()}},_n=bn,En=function(e){function t(r){De(this,t);var n=Ie(this,e.call(this,r,Qe.a.MEDIA_ATTACHING,Qe.a.MEDIA_DETACHING,Qe.a.FRAG_PARSING_USERDATA,Qe.a.FRAG_DECRYPTED,Qe.a.MANIFEST_LOADING,Qe.a.MANIFEST_LOADED,Qe.a.FRAG_LOADED,Qe.a.LEVEL_SWITCHING,Qe.a.INIT_PTS_FOUND));if(n.hls=r,n.config=r.config,n.enabled=!0,n.Cues=r.config.cueHandler,n.textTracks=[],n.tracks=[],n.unparsedVttFrags=[],n.initPTS=void 0,n.cueRanges=[],n.captionsTracks={},n.captionsProperties={textTrack1:{label:n.config.captionsTextTrack1Label,languageCode:n.config.captionsTextTrack1LanguageCode},textTrack2:{label:n.config.captionsTextTrack2Label,languageCode:n.config.captionsTextTrack2LanguageCode}},n.config.enableCEA708Captions){var i=new pn(n,"textTrack1"),a=new pn(n,"textTrack2");n.cea608Parser=new fn(0,i,a)}return n}return Pe(t,e),t.prototype.addCues=function(e,t,r,n){for(var i=this.cueRanges,a=!1,o=i.length;o--;){var s=i[o],u=xe(s[0],s[1],t,r);if(u>=0&&(s[0]=Math.min(s[0],t),s[1]=Math.max(s[1],r),a=!0,u/(r-t)>.5))return}a||i.push([t,r]),this.Cues.newCue(this.captionsTracks[e],t,r,n)},t.prototype.onInitPtsFound=function(e){var t=this;void 0===this.initPTS&&(this.initPTS=e.initPTS),this.unparsedVttFrags.length&&(this.unparsedVttFrags.forEach(function(e){t.onFragLoaded(e)}),this.unparsedVttFrags=[])},t.prototype.getExistingTrack=function(e){var t=this.media;if(t)for(var r=0;r=r.length)&&(this._stopTimer(),this.trackId=e,Je.b.log("switching to subtitle track "+e),t.trigger(Qe.a.SUBTITLE_TRACK_SWITCH,{id:e}),-1!==e)){var n=r[e],i=n.details;i&&!i.live||(Je.b.log("(re)loading playlist for subtitle track "+e),t.trigger(Qe.a.SUBTITLE_TRACK_LOADING,{url:n.url,id:e}))}},t.prototype._stopTimer=function(){this.timer&&(clearInterval(this.timer),this.timer=null)},t.prototype._toggleTrackModes=function(e){var t=this.media,r=this.subtitleDisplay,n=this.trackId;if(t){var i=Ue(t.textTracks);if(-1===e)[].slice.call(i).forEach(function(e){e.mode="disabled"});else{var a=i[n];a&&(a.mode="disabled")}var o=i[e];o&&(o.mode=r?"showing":"hidden")}},Tn(t,[{key:"subtitleTracks",get:function(){return this.tracks}},{key:"subtitleTrack",get:function(){return this.trackId},set:function(e){this.trackId!==e&&(this._toggleTrackModes(e),this.setSubtitleTrackInternal(e))}}]),t}(tt),Rn=Sn,An=r(7),Ln=window,Cn=Ln.performance,kn={STOPPED:"STOPPED",IDLE:"IDLE",KEY_LOADING:"KEY_LOADING",FRAG_LOADING:"FRAG_LOADING"},Dn=function(e){function t(r){Be(this,t);var n=Ge(this,e.call(this,r,Qe.a.MEDIA_ATTACHED,Qe.a.ERROR,Qe.a.KEY_LOADED,Qe.a.FRAG_LOADED,Qe.a.SUBTITLE_TRACKS_UPDATED,Qe.a.SUBTITLE_TRACK_SWITCH,Qe.a.SUBTITLE_TRACK_LOADED,Qe.a.SUBTITLE_FRAG_PROCESSED));return n.config=r.config,n.vttFragSNsProcessed={},n.vttFragQueues=void 0,n.currentlyProcessing=null,n.state=kn.STOPPED,n.currentTrackId=-1,n.decrypter=new An.a(r.observer,r.config),n}return je(t,e),t.prototype.onHandlerDestroyed=function(){this.state=kn.STOPPED},t.prototype.clearVttFragQueues=function(){var e=this;this.vttFragQueues={},this.tracks.forEach(function(t){e.vttFragQueues[t.id]=[]})},t.prototype.nextFrag=function(){if(null===this.currentlyProcessing&&this.currentTrackId>-1&&this.vttFragQueues[this.currentTrackId].length){var e=this.currentlyProcessing=this.vttFragQueues[this.currentTrackId].shift();this.fragCurrent=e,this.hls.trigger(Qe.a.FRAG_LOADING,{frag:e}),this.state=kn.FRAG_LOADING}},t.prototype.onSubtitleFragProcessed=function(e){e.success&&this.vttFragSNsProcessed[e.frag.trackId].push(e.frag.sn),this.currentlyProcessing=null,this.state=kn.IDLE,this.nextFrag()},t.prototype.onMediaAttached=function(){this.state=kn.IDLE},t.prototype.onError=function(e){var t=e.frag;t&&"subtitle"!==t.type||this.currentlyProcessing&&(this.currentlyProcessing=null,this.nextFrag())},t.prototype.doTick=function(){var e=this;switch(this.state){case kn.IDLE:var t=this.tracks,r=this.currentTrackId,n=this.vttFragSNsProcessed[r],i=this.vttFragQueues[r],a=this.currentlyProcessing?this.currentlyProcessing.sn:-1,o=function(e){return n.indexOf(e.sn)>-1},s=function(e){return i.some(function(t){return t.sn===e.sn})};if(!t)break;var u;if(r0&&null!=r&&null!=r.key&&"AES-128"===r.method){var a=void 0;try{a=Cn.now()}catch(e){a=Date.now()}this.decrypter.decrypt(e.payload,r.key.buffer,r.iv.buffer,function(e){var t=void 0;try{t=Cn.now()}catch(e){t=Date.now()}i.trigger(Qe.a.FRAG_DECRYPTED,{frag:n,payload:e,stats:{tstart:a,tdecrypt:t}})})}},t}(Qt),In=Dn,Pn=function(){function e(e,t){for(var r=0;r0&&void 0!==arguments[0]?arguments[0]:{};Ye(this,e);var n=e.DefaultConfig;if((r.liveSyncDurationCount||r.liveMaxLatencyDurationCount)&&(r.liveSyncDuration||r.liveMaxLatencyDuration))throw new Error("Illegal hls.js config: don't mix up liveSyncDurationCount/liveMaxLatencyDurationCount and liveSyncDuration/liveMaxLatencyDuration");for(var i in n)i in r||(r[i]=n[i]);if(void 0!==r.liveMaxLatencyDurationCount&&r.liveMaxLatencyDurationCount<=r.liveSyncDurationCount)throw new Error('Illegal hls.js config: "liveMaxLatencyDurationCount" must be gt "liveSyncDurationCount"');if(void 0!==r.liveMaxLatencyDuration&&(r.liveMaxLatencyDuration<=r.liveSyncDuration||void 0===r.liveSyncDuration))throw new Error('Illegal hls.js config: "liveMaxLatencyDuration" must be gt "liveSyncDuration"');Object(Je.a)(r.debug),this.config=r,this._autoLevelCapping=-1;var a=this.observer=new Ut.a;a.trigger=function(e){for(var t=arguments.length,r=Array(t>1?t-1:0),n=1;n1?t-1:0),n=1;n0&&void 0!==arguments[0]?arguments[0]:-1;Je.b.log("startLoad("+e+")"),this.networkControllers.forEach(function(t){t.startLoad(e)})},e.prototype.stopLoad=function(){Je.b.log("stopLoad"),this.networkControllers.forEach(function(e){e.stopLoad()})},e.prototype.swapAudioCodec=function(){Je.b.log("swapAudioCodec"),this.streamController.swapAudioCodec()},e.prototype.recoverMediaError=function(){Je.b.log("recoverMediaError");var e=this.media;this.detachMedia(),this.attachMedia(e)},Kn(e,[{key:"levels",get:function(){return this.levelController.levels}},{key:"currentLevel",get:function(){return this.streamController.currentLevel},set:function(e){Je.b.log("set currentLevel:"+e),this.loadLevel=e,this.streamController.immediateLevelSwitch()}},{key:"nextLevel",get:function(){return this.streamController.nextLevel},set:function(e){Je.b.log("set nextLevel:"+e),this.levelController.manualLevel=e,this.streamController.nextLevelSwitch()}},{key:"loadLevel",get:function(){return this.levelController.level},set:function(e){Je.b.log("set loadLevel:"+e),this.levelController.manualLevel=e}},{key:"nextLoadLevel",get:function(){return this.levelController.nextLoadLevel},set:function(e){this.levelController.nextLoadLevel=e}},{key:"firstLevel",get:function(){return Math.max(this.levelController.firstLevel,this.minAutoLevel)},set:function(e){Je.b.log("set firstLevel:"+e),this.levelController.firstLevel=e}},{key:"startLevel",get:function(){return this.levelController.startLevel},set:function(e){Je.b.log("set startLevel:"+e);var t=this;-1!==e&&(e=Math.max(e,t.minAutoLevel)),t.levelController.startLevel=e}},{key:"autoLevelCapping",get:function(){return this._autoLevelCapping},set:function(e){Je.b.log("set autoLevelCapping:"+e),this._autoLevelCapping=e}},{key:"autoLevelEnabled",get:function(){return-1===this.levelController.manualLevel}},{key:"manualLevel",get:function(){return this.levelController.manualLevel}},{key:"minAutoLevel",get:function(){for(var e=this,t=e.levels,r=e.config.minAutoBitrate,n=t?t.length:0,i=0;ir)return i}return 0}},{key:"maxAutoLevel",get:function(){var e=this,t=e.levels,r=e.autoLevelCapping;return-1===r&&t&&t.length?t.length-1:r}},{key:"nextAutoLevel",get:function(){var e=this;return Math.min(Math.max(e.abrController.nextAutoLevel,e.minAutoLevel),e.maxAutoLevel)},set:function(e){var t=this;t.abrController.nextAutoLevel=Math.max(t.minAutoLevel,e)}},{key:"audioTracks",get:function(){var e=this.audioTrackController;return e?e.audioTracks:[]}},{key:"audioTrack",get:function(){var e=this.audioTrackController;return e?e.audioTrack:-1},set:function(e){var t=this.audioTrackController;t&&(t.audioTrack=e)}},{key:"liveSyncPosition",get:function(){return this.streamController.liveSyncPosition}},{key:"subtitleTracks",get:function(){var e=this.subtitleTrackController;return e?e.subtitleTracks:[]}},{key:"subtitleTrack",get:function(){var e=this.subtitleTrackController;return e?e.subtitleTrack:-1},set:function(e){var t=this.subtitleTrackController;t&&(t.subtitleTrack=e)}},{key:"subtitleDisplay",get:function(){var e=this.subtitleTrackController;return!!e&&e.subtitleDisplay},set:function(e){var t=this.subtitleTrackController;t&&(t.subtitleDisplay=e)}}]),e}();t.default=Hn},function(e,t,r){function n(e){function t(n){if(r[n])return r[n].exports;var i=r[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var r={};t.m=e,t.c=r,t.i=function(e){return e},t.d=function(e,r,n){t.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="/",t.oe=function(e){throw console.error(e),e};var n=t(t.s=ENTRY_MODULE);return n.default||n}function i(e){return(e+"").replace(/[.?*+^$[\]\\(){}|-]/g,"\\$&")}function a(e,t,n){var a={};a[n]=[];var o=t.toString(),s=o.match(/^function\s?\(\w+,\s*\w+,\s*(\w+)\)/);if(!s)return a;for(var c,d=s[1],f=new RegExp("(\\\\n|\\W)"+i(d)+l,"g");c=f.exec(o);)"dll-reference"!==c[3]&&a[n].push(c[3]);for(f=new RegExp("\\("+i(d)+'\\("(dll-reference\\s('+u+'))"\\)\\)'+l,"g");c=f.exec(o);)e[c[2]]||(a[n].push(c[1]),e[c[2]]=r(c[1]).m),a[c[2]]=a[c[2]]||[],a[c[2]].push(c[4]);return a}function o(e){return Object.keys(e).reduce(function(t,r){return t||e[r].length>0},!1)}function s(e,t){for(var r={main:[t]},n={main:[]},i={main:{}};o(r);)for(var s=Object.keys(r),u=0;u1?r-1:0),i=1;i1?r-1:0),i=1;i1){var s=arguments[1];void 0!==s&&(o=s?Number(s):0)!=o&&(o=0)}var u=Math.min(Math.max(o,0),n),l=u-a;if(l<0)return!1;for(var c=-1;++c