diff --git a/FGBLH/py/每日大赛.py b/FGBLH/py/每日大赛.py
new file mode 100644
index 00000000..65ca1cc3
--- /dev/null
+++ b/FGBLH/py/每日大赛.py
@@ -0,0 +1,463 @@
+import json
+import re
+import sys
+import hashlib
+from base64 import b64decode, b64encode
+from urllib.parse import urlparse
+
+import requests
+from Crypto.Cipher import AES
+from Crypto.Util.Padding import unpad
+from pyquery import PyQuery as pq
+sys.path.append('..')
+from base.spider import Spider as BaseSpider
+
+img_cache = {}
+
+class Spider(BaseSpider):
+
+ def init(self, extend=""):
+ try:
+ self.proxies = json.loads(extend)
+ except:
+ self.proxies = {}
+ self.headers = {
+ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
+ 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8',
+ 'Accept-Language': 'zh-CN,zh;q=0.9',
+ 'Connection': 'keep-alive',
+ 'Cache-Control': 'no-cache',
+ }
+ self.host = self.get_working_host()
+ self.headers.update({'Origin': self.host, 'Referer': f"{self.host}/"})
+ print(f"使用站点: {self.host}")
+
+ def getName(self):
+ return "🌈 每日大赛|终极完美版"
+
+ def isVideoFormat(self, url):
+ return any(ext in (url or '') for ext in ['.m3u8', '.mp4', '.ts'])
+
+ def manualVideoCheck(self):
+ return False
+
+ def destroy(self):
+ global img_cache
+ img_cache.clear()
+
+ def get_working_host(self):
+ dynamic_urls = [
+ 'https://www.mrds66.com/',
+ 'https://mrdsa2.com/',
+ 'https://mrdsa1.com/',
+ 'https://mrdsk.com/',
+ ]
+ for url in dynamic_urls:
+ try:
+ response = requests.get(
+ url,
+ headers=self.headers,
+ proxies=self.proxies,
+ timeout=6,
+ verify=False,
+ allow_redirects=True
+ )
+ if response.status_code == 200:
+ return response.url.rstrip('/')
+ except Exception:
+ continue
+ return 'https://www.mrds66.com'
+
+ def homeContent(self, filter):
+ try:
+ response = requests.get(self.host, headers=self.headers, proxies=self.proxies, timeout=15)
+ if response.status_code != 200:
+ return {'class': [], 'list': []}
+ data = self.getpq(response.text)
+
+ classes = []
+ category_selectors = ['.category-list ul li', '.nav-menu li', '.menu li', 'nav ul li']
+ for selector in category_selectors:
+ for k in data(selector).items():
+ link = k('a')
+ href = (link.attr('href') or '').strip()
+ name = (link.text() or '').strip()
+ if not href or href == '#' or not name or href == '/':
+ continue
+ if not href.startswith('http'):
+ href = href if href.startswith('/') else f"/{href}"
+ classes.append({'type_name': name, 'type_id': href})
+ if classes:
+ break
+
+ if not classes:
+ classes = [
+ {'type_name': '每日大赛', 'type_id': '/category/mrds/'},
+ ]
+
+ return {
+ 'class': classes,
+ 'list': self.getlist(data('#index article, article'))
+ }
+ except Exception:
+ return {'class': [], 'list': []}
+
+ def homeVideoContent(self):
+ try:
+ response = requests.get(self.host, headers=self.headers, proxies=self.proxies, timeout=15)
+ if response.status_code != 200:
+ return {'list': []}
+ data = self.getpq(response.text)
+ return {'list': self.getlist(data('#index article, article'))}
+ except Exception:
+ return {'list': []}
+
+ def categoryContent(self, tid, pg, filter, extend):
+ try:
+ if '@folder' in tid:
+ v = self.getfod(tid.replace('@folder', ''))
+ return {'list': v, 'page': 1, 'pagecount': 1, 'limit': 90, 'total': len(v)}
+
+ pg = int(pg) if pg else 1
+
+ if tid.startswith('http'):
+ base_url = tid.rstrip('/')
+ else:
+ path = tid if tid.startswith('/') else f"/{tid}"
+ base_url = f"{self.host}{path}".rstrip('/')
+
+ if pg == 1:
+ url = f"{base_url}/"
+ else:
+ host_no_slash = self.host.rstrip('/')
+ if base_url == host_no_slash:
+ url = f"{host_no_slash}/page/{pg}/"
+ elif '/category/' in base_url or '/tag/' in base_url:
+ url = f"{base_url}/{pg}/"
+ else:
+ if '/page/' in base_url:
+ url = f"{base_url}/{pg}/"
+ else:
+ url = f"{base_url}/page/{pg}/"
+
+ response = requests.get(url, headers=self.headers, proxies=self.proxies, timeout=15)
+ if response.status_code != 200:
+ return {
+ 'list': [],
+ 'page': pg,
+ 'pagecount': 9999,
+ 'limit': 90,
+ 'total': 0
+ }
+
+ data = self.getpq(response.text)
+ videos = self.getlist(data('#archive article, #index article, article'), tid)
+
+ return {'list': videos, 'page': pg, 'pagecount': 9999, 'limit': 90, 'total': 999999}
+ except Exception:
+ return {'list': [], 'page': pg, 'pagecount': 9999, 'limit': 90, 'total': 0}
+
+ def detailContent(self, ids):
+ try:
+ url = ids[0] if ids[0].startswith('http') else f"{self.host}{ids[0]}"
+ response = requests.get(url, headers=self.headers, proxies=self.proxies, timeout=15)
+ data = self.getpq(response.text)
+
+ plist = []
+ used_names = set()
+
+ # 策略1: 提取 DPlayer 配置
+ if data('.dplayer'):
+ for c, k in enumerate(data('.dplayer').items(), start=1):
+ try:
+ config_attr = k.attr('data-config')
+ if config_attr:
+ config = json.loads(config_attr)
+ video_url = config.get('video', {}).get('url', '')
+
+ if video_url:
+ ep_name = ''
+ parent = k.parents().eq(0)
+ for _ in range(4):
+ if not parent: break
+ heading = parent.find('h2, h3, h4').eq(0).text().strip()
+ if heading:
+ ep_name = heading
+ break
+ parent = parent.parents().eq(0)
+
+ base_name = ep_name if ep_name else f"视频{c}"
+ name = base_name
+ count = 2
+ while name in used_names:
+ name = f"{base_name} {count}"
+ count += 1
+ used_names.add(name)
+
+ plist.append(f"{name}${video_url}")
+ except:
+ continue
+
+ # 策略2: 提取正文中的文本链接
+ if not plist:
+ content_area = data('.post-content, article')
+ for i, link in enumerate(content_area('a').items(), start=1):
+ link_text = link.text().strip()
+ link_href = link.attr('href')
+
+ if link_href and any(kw in link_text for kw in ['点击观看', '观看', '播放', '视频', '第一弹']):
+ ep_name = link_text.replace('点击观看:', '').replace('点击观看', '').strip()
+ if not ep_name:
+ ep_name = f"视频{i}"
+
+ if not link_href.startswith('http'):
+ link_href = f"{self.host}{link_href}" if link_href.startswith('/') else f"{self.host}/{link_href}"
+
+ plist.append(f"{ep_name}${link_href}")
+
+ play_url = '#'.join(plist) if plist else f"未找到视频源,请访问网页${url}"
+
+ # ★★★ 标签点击功能修复核心区域 ★★★
+ # 采用 reference 代码中的 [a=cr:...] 格式
+ vod_content = ''
+ try:
+ tags = []
+ seen_names = set()
+ seen_ids = set()
+
+ # 每日大赛的标签选择器
+ tag_links = data('.post-tags a, .tags a, .keywords a')
+
+ candidates = []
+ for k in tag_links.items():
+ title = k.text().strip()
+ href = k.attr('href')
+ if title and href:
+ # 修正相对链接为绝对链接
+ if not href.startswith('http'):
+ href = f"{self.host}{href}" if href.startswith('/') else f"{self.host}/{href}"
+ candidates.append({'name': title, 'id': href})
+
+ # 按长度排序,与参考代码保持一致
+ candidates.sort(key=lambda x: len(x['name']), reverse=True)
+
+ for item in candidates:
+ name = item['name']
+ id_ = item['id']
+
+ if id_ in seen_ids: continue
+ # 简单的去重逻辑
+ is_duplicate = False
+ for seen in seen_names:
+ if name in seen:
+ is_duplicate = True
+ break
+ if is_duplicate and name not in seen_names: pass # 允许完全匹配的标签
+ elif is_duplicate: pass
+
+ # 生成播放器专用跳转代码:[a=cr:{json}/]名称[/a]
+ target = json.dumps({'id': id_, 'name': name})
+ tags.append(f'[a=cr:{target}/]{name}[/a]')
+
+ seen_names.add(name)
+ seen_ids.add(id_)
+
+ # 如果有标签,拼接显示
+ if tags:
+ # 参考代码只显示标签,这里为了体验更好,我加上了正文摘要
+ tags_str = ' '.join(tags)
+ summary = data('.post-content').text() or ''
+ summary = summary[:150] + '...' if len(summary) > 150 else summary
+ vod_content = f"{tags_str}\n\n{summary}"
+ else:
+ vod_content = data('.post-title').text() or data('h1').text()
+
+ except Exception:
+ vod_content = '每日大赛'
+
+ if not vod_content:
+ vod_content = '每日大赛'
+
+ return {'list': [{
+ 'vod_play_from': '每日大赛',
+ 'vod_play_url': play_url,
+ 'vod_content': vod_content
+ }]}
+ except:
+ return {'list': [{'vod_play_from': '每日大赛', 'vod_play_url': '获取失败'}]}
+
+ def searchContent(self, key, quick, pg="1"):
+ try:
+ pg = int(pg) if pg else 1
+
+ if pg == 1:
+ url = f"{self.host}/search/{key}/"
+ else:
+ url = f"{self.host}/search/{key}/{pg}/"
+
+ response = requests.get(url, headers=self.headers, proxies=self.proxies, timeout=15)
+ return {'list': self.getlist(self.getpq(response.text)('article')), 'page': pg, 'pagecount': 9999}
+ except:
+ return {'list': [], 'page': pg, 'pagecount': 9999}
+
+ def playerContent(self, flag, id, vipFlags):
+ parse = 0 if self.isVideoFormat(id) else 1
+ url = self.proxy(id) if '.m3u8' in id else id
+ return {'parse': parse, 'url': url, 'header': self.headers}
+
+ def localProxy(self, param):
+ try:
+ type_ = param.get('type')
+ url = param.get('url')
+ if type_ == 'cache':
+ key = param.get('key')
+ if content := img_cache.get(key):
+ return [200, 'image/jpeg', content]
+ return [404, 'text/plain', b'Expired']
+ elif type_ == 'img':
+ real_url = self.d64(url) if not url.startswith('http') else url
+ res = requests.get(real_url, headers=self.headers, proxies=self.proxies, timeout=10)
+ content = self.aesimg(res.content)
+ return [200, 'image/jpeg', content]
+ elif type_ == 'm3u8':
+ return self.m3Proxy(url)
+ else:
+ return self.tsProxy(url)
+ except:
+ return [404, 'text/plain', b'']
+
+ def proxy(self, data, type='m3u8'):
+ if data and self.proxies: return f"{self.getProxyUrl()}&url={self.e64(data)}&type={type}"
+ return data
+
+ def m3Proxy(self, url):
+ url = self.d64(url)
+ res = requests.get(url, headers=self.headers, proxies=self.proxies)
+ data = res.text
+ base = res.url.rsplit('/', 1)[0]
+ lines = []
+ for line in data.split('\n'):
+ if '#EXT' not in line and line.strip():
+ if not line.startswith('http'):
+ line = f"{base}/{line}"
+ lines.append(self.proxy(line, 'ts'))
+ else:
+ lines.append(line)
+ return [200, "application/vnd.apple.mpegurl", '\n'.join(lines)]
+
+ def tsProxy(self, url):
+ return [200, 'video/mp2t', requests.get(self.d64(url), headers=self.headers, proxies=self.proxies).content]
+
+ def e64(self, text):
+ return b64encode(str(text).encode()).decode()
+
+ def d64(self, text):
+ return b64decode(str(text).encode()).decode()
+
+ def aesimg(self, data):
+ if len(data) < 16: return data
+ keys = [(b'f5d965df75336270', b'97b60394abc2fbe1'), (b'75336270f5d965df', b'abc2fbe197b60394')]
+ for k, v in keys:
+ try:
+ dec = unpad(AES.new(k, AES.MODE_CBC, v).decrypt(data), 16)
+ if dec.startswith(b'\xff\xd8') or dec.startswith(b'\x89PNG'): return dec
+ except: pass
+ try:
+ dec = unpad(AES.new(k, AES.MODE_ECB).decrypt(data), 16)
+ if dec.startswith(b'\xff\xd8'): return dec
+ except: pass
+ return data
+
+ def getlist(self, data, tid=''):
+ videos = []
+ is_folder = '/mrdg' in (tid or '')
+ for k in data.items():
+ card_html = k.outer_html() if hasattr(k, 'outer_html') else str(k)
+ a = k if k.is_('a') else k('a').eq(0)
+ href = a.attr('href')
+ title = k('h2').text() or k('.entry-title').text() or k('.post-title').text()
+ if not title and k.is_('a'): title = k.text()
+
+ if href and title:
+ img = self.getimg(k('script').text(), k, card_html)
+
+ remarks = k('time').text()
+ if not remarks:
+ full_text = k.text()
+ m = re.search(r'(\d{4}\s*年\s*\d{1,2}\s*月\s*\d{1,2}\s*日)', full_text)
+ if m:
+ remarks = m.group(1)
+ else:
+ m2 = re.search(r'(\d{4}-\d{1,2}-\d{1,2})', full_text)
+ if m2:
+ remarks = m2.group(1)
+
+ videos.append({
+ 'vod_id': f"{href}{'@folder' if is_folder else ''}",
+ 'vod_name': title.strip(),
+ 'vod_pic': img,
+ 'vod_remarks': remarks.strip() if remarks else '',
+ 'vod_tag': 'folder' if is_folder else '',
+ 'style': {"type": "rect", "ratio": 1.33}
+ })
+ return videos
+
+ def getfod(self, id):
+ url = f"{self.host}{id}"
+ data = self.getpq(requests.get(url, headers=self.headers, proxies=self.proxies).text)
+ videos = []
+ for i, h2 in enumerate(data('.post-content h2').items()):
+ p_txt = data('.post-content p').eq(i * 2)
+ p_img = data('.post-content p').eq(i * 2 + 1)
+ p_html = p_img.outer_html() if hasattr(p_img, 'outer_html') else str(p_img)
+ videos.append({
+ 'vod_id': p_txt('a').attr('href'),
+ 'vod_name': p_txt.text().strip(),
+ 'vod_pic': self.getimg('', p_img, p_html),
+ 'vod_remarks': h2.text().strip()
+ })
+ return videos
+
+ def getimg(self, text, elem=None, html_content=None):
+ if m := re.search(r"loadBannerDirect\('([^']+)'", text or ''):
+ return self._proc_url(m.group(1))
+
+ if html_content is None and elem is not None:
+ html_content = elem.outer_html() if hasattr(elem, 'outer_html') else str(elem)
+ if not html_content: return ''
+
+ html_content = html_content.replace('"', '"').replace(''', "'").replace('&', '&')
+
+ if 'data:image' in html_content:
+ m = re.search(r'(data:image/[a-zA-Z0-9+/=;,]+)', html_content)
+ if m: return self._proc_url(m.group(1))
+
+ m = re.search(r'(https?://[^"\'\s)]+\.(?:jpg|png|jpeg|webp))', html_content, re.I)
+ if m: return self._proc_url(m.group(1))
+
+ if 'url(' in html_content:
+ m = re.search(r'url\s*\(\s*[\'"]?([^"\'\)]+)[\'"]?\s*\)', html_content, re.I)
+ if m: return self._proc_url(m.group(1))
+
+ return ''
+
+ def _proc_url(self, url):
+ if not url: return ''
+ url = url.strip('\'" ')
+ if url.startswith('data:'):
+ try:
+ _, b64_str = url.split(',', 1)
+ raw = b64decode(b64_str)
+ if not (raw.startswith(b'\xff\xd8') or raw.startswith(b'\x89PNG') or raw.startswith(b'GIF8')):
+ raw = self.aesimg(raw)
+ key = hashlib.md5(raw).hexdigest()
+ img_cache[key] = raw
+ return f"{self.getProxyUrl()}&type=cache&key={key}"
+ except: return ""
+ if not url.startswith('http'):
+ url = f"{self.host}{url}" if url.startswith('/') else f"{self.host}/{url}"
+ return f"{self.getProxyUrl()}&url={self.e64(url)}&type=img"
+
+ def getpq(self, data):
+ try: return pq(data)
+ except: return pq(data.encode('utf-8'))
diff --git a/FGBLH/海豚666.json b/FGBLH/海豚666.json
index 7d0d648f..ae94244f 100644
--- a/FGBLH/海豚666.json
+++ b/FGBLH/海豚666.json
@@ -524,6 +524,12 @@
"type": 3,
"api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/91吃瓜中心.py"
},
+ {
+ "key": "mrds",
+ "name": "🐬每日大赛.py|🔞",
+ "type": 3,
+ "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/每日大赛.py"
+ },
{
"key": "xmzb",
"name": "🐬熊猫视频.py|🔞",
diff --git a/FGBLH/海豚py.json b/FGBLH/海豚py.json
new file mode 100644
index 00000000..136e2136
--- /dev/null
+++ b/FGBLH/海豚py.json
@@ -0,0 +1,719 @@
+{
+ "spider": "./tvbox.jar",
+ "logo": "https://img.freepik.com/free-vector/cute-dolphin-swimming-cartoon-vector-icon-illustration-animal-nature-icon-isolated-flat-vector_138676-12582.jpg?semt=ais_hybrid&w=740&q=80",
+ "wallpaper":"http://tool.teyonds.com/api",
+ "warningText": "注意:如果别人倒卖海豚影视接口收费的都是骗子,没有qq群微信群,只有tg官方交流群 TG:@hshsjk",
+ "sites": [
+ {
+ "key": "MGtv",
+ "name": "🐬芒果TV.py",
+ "type": 3,
+ "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/芒果TV.py"
+ },
+ {
+ "key": "ppx",
+ "name": "🐬皮皮虾.py",
+ "type": 3,
+ "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/皮皮虾.py",
+ "ext": "http://43.248.117.123:4680"
+ },
+ {
+ "key": "fY",
+ "name": "🐬枫叶影院(关梯子使用)",
+ "type": 3,
+ "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/枫叶影院.py"
+ },
+ {
+ "key": "rb",
+ "name": "🐬热播APP.py",
+ "type": 3,
+ "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/热播APP.py"
+ },
+ {
+ "key": "JP",
+ "name": "🐬金牌APP.py",
+ "type": 3,
+ "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/金牌APP.py"
+ },
+ {
+ "key": "GZ",
+ "name": "🐬瓜子APP.py",
+ "type": 3,
+ "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/瓜子APP.py"
+ },
+ {
+ "key": "nmvm",
+ "name": "🐬农民影视.py",
+ "type": 3,
+ "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/农民影视.py"
+ },
+ {
+ "key": "xc",
+ "name": "🐬星辰影院.py(关梯)",
+ "type": 3,
+ "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/星辰影院.py"
+ },
+ {
+ "key": "hstv",
+ "name": "🐬华数TV.py(关梯)",
+ "type": 3,
+ "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/华数TV.py"
+ },
+ {
+ "key": "dttv",
+ "name": "🐬蛋挞TV.py",
+ "type": 3,
+ "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/蛋挞TV.py"
+ },
+ {
+ "key": "dsys",
+ "name": "🐬毒舌影视.py(关梯)",
+ "type": 3,
+ "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/毒舌影视.py"
+ },
+ {
+ "key": "qw",
+ "name": "🐬七味.py(关梯)",
+ "type": 3,
+ "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/七味.py"
+ },
+ {
+ "key": "kf",
+ "name": "🐬咖啡体育直播.py",
+ "type": 3,
+ "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/咖啡直播.py"
+ },
+ {
+ "key": "sm",
+ "name": "🐬熊猫直播",
+ "type": 3,
+ "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/熊猫直播.py"
+ },
+ {
+ "key": "blzb",
+ "name": "🐬哔哩直播.py",
+ "type": 3,
+ "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/哔哩直播.py"
+ },
+ {
+ "key": "jhzb",
+ "name": "🐬聚合直播.py",
+ "type": 3,
+ "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/聚合直播.py"
+ },
+ {
+ "key": "MiFun",
+ "name": "🐬MiFun动漫.py",
+ "type": 3,
+ "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/MiFun动漫.py"
+ },
+ {
+ "key": "smdj",
+ "name": "🐬星芽短剧.py",
+ "type": 3,
+ "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/星芽短剧.py"
+ },
+ {
+ "key": "hmjc",
+ "name": "🐬河马剧场.py",
+ "type": 3,
+ "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/河马剧场.py"
+ },
+ {
+ "key": "hgdj",
+ "name": "🐬红果短剧.py",
+ "type": 3,
+ "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/红果短剧.py"
+ },
+ {
+ "key": "网易云音|音乐",
+ "name": "🐬网易云音.py",
+ "type": 3,
+ "api": "https://xn--fjq53n.xyz/Ting/yinyue/网易云音乐.py"
+ },
+ {
+ "key": "网易云音乐1",
+ "name": "🐬网易云1.py",
+ "type": 3,
+ "api": "https://xn--fjq53n.xyz/Ting/yinyue/网易云音乐1.py"
+ }
+ ],
+ "parses": [
+ {
+ "name": "盘古",
+ "type": 0,
+ "url": "https://www.playm3u8.cn/jiexi.php?url=",
+ "ext": {
+ "header": {
+ "user-agent": "Mozilla/5.0 (Linux; Android 13; V2049A Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36"
+ }
+ }
+ },
+ {
+ "name": "极速",
+ "type": 0,
+ "url": "https://jiexi.789jiexi.net:4433/?url="
+ },
+ {
+ "name": "虾米解析",
+ "type": 0,
+ "url": "https://jx.xmflv.com/?url="
+ },
+ {
+ "name": "淘片解析",
+ "type": 0,
+ "url": "https://jx.yparse.com/index.php?url="
+ },
+ {
+ "name": "解析1",
+ "type": 0,
+ "url": "https://huayong.net/999/?v="
+ },
+ {
+ "name": "解析2",
+ "type": 0,
+ "url": "https://jx.m3u8.tv/jiexi/?url="
+ },
+ {
+ "name": "解析3",
+ "type": 0,
+ "url": "https://t2.qlplayer.cyou/player/analysis.php?v="
+ },
+
+ {
+ "name": "解析4",
+ "type": 0,
+ "url": "https://www.ckplayer.vip/jiexi/?url="
+ },
+ {
+ "name": "解析5",
+ "type": 0,
+ "url": "https://nm.xxxc137.top/static/player/artplayer.html?url="
+ },
+ {
+ "name": "解析6",
+ "type": 0,
+ "url": "https://www.yemu.xyz/?url="
+ },
+ {
+ "name": "冰豆",
+ "type": 0,
+ "url": "https://bd.jx.cn/?url="
+ },
+ {
+ "name":"爱酷",
+ "type":0,
+ "url":"https://jx.zhanlangbu.com/?url="
+ },
+ {"name":"云解析","type":0,"url":"https://jx.yparse.com/index.php?url=","ext":{"header":{"user-agent":"Mozilla/5.0 (Linux; Android 13; V2049A Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36"}}},
+ {"name":"777","type":0,"url":"https://jx.jsonplayer.com/player/?url=","ext":{"header":{"user-agent":"Mozilla/5.0 (Linux; Android 13; V2049A Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36"}}},
+ {"name":"-剖云-","type":0,"url":"https://www.kkvip2022.com/vip/jiexi1/?url=","ext":{"header":{"user-agent":"Mozilla/5.0 (Linux; Android 13; V2049A Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36"}}},
+ {"name":"-全看-","type":0,"url":"https://jx.quankan.app/?url=","ext":{"header":{"user-agent":"Mozilla/5.0 (Linux; Android 13; V2049A Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36"}}}
+ ],
+ "doh": [
+ {
+ "name": "Google",
+ "url": "https://dns.google/dns-query",
+ "ips": [
+ "8.8.4.4",
+ "8.8.8.8"
+ ]
+ },
+ {
+ "name": "Cloudflare",
+ "url": "https://cloudflare-dns.com/dns-query",
+ "ips": [
+ "1.1.1.1",
+ "1.0.0.1",
+ "2606:4700:4700::1111",
+ "2606:4700:4700::1001"
+ ]
+ },
+ {
+ "name": "AdGuard",
+ "url": "https://dns.adguard.com/dns-query",
+ "ips": [
+ "94.140.14.140",
+ "94.140.14.141"
+ ]
+ },
+ {
+ "name": "DNSWatch",
+ "url": "https://resolver2.dns.watch/dns-query",
+ "ips": [
+ "84.200.69.80",
+ "84.200.70.40"
+ ]
+ },
+ {
+ "name": "Quad9",
+ "url": "https://dns.quad9.net/dns-quer",
+ "ips": [
+ "9.9.9.9",
+ "149.112.112.112"
+ ]
+ }
+ ],
+ "ads": [
+ "mozai.4gtv.tv",
+ "static-mozai.4gtv.tv"
+ ],
+ "lives": [
+ {
+ "name": "🐬各大源合集 海豚影视永久免费如有收费的都是骗子",
+ "type": 0,
+ "ua": "okhttp/5.3.2",
+ "url": "https://gh-proxy.org/https://raw.githubusercontent.com/807080747/zv/refs/heads/main/sese.txt"
+ },
+ {
+ "name": "🐬综合直播 海豚影视交流群 TG:@hshsjk9",
+ "type": 0,
+ "playerType": 2,
+ "ua": "okhttp",
+ "url": "https://raw.githubusercontent.com/fleung49/star/refs/heads/main/mit"
+ },
+ {
+ "name": "🐬电视家",
+ "type": 0,
+ "playerType": 2,
+ "ua": "okhttp",
+ "url": "https://gh-proxy.org/https://github.com/bang359/dsj/raw/main/dsjcs.txt"
+ },
+ {
+ "name": "🐬地方直播",
+ "type": 0,
+ "ua": "okhttp/5.3.2",
+ "url": "https://ghfast.top/https://raw.githubusercontent.com/develop202/migu_video/refs/heads/main/interface.txt"
+ },
+ {
+ "name": "🐬地方直播2",
+ "type": 0,
+ "ua": "okhttp/5.3.2",
+ "url": "https://raw.githubusercontent.com/Guovin/iptv-api/gd/output/ipv4/result.m3u"
+ },
+ {
+ "name": "🐬海燕直播",
+ "type": 0,
+ "ua": "okhttp/5.3.2",
+ "url": "https://gh-proxy.org/https://raw.githubusercontent.com/wujiangliu/live-sources/refs/heads/main/haiyan.txt"
+ },
+ {
+ "name": "🐬薄荷直播",
+ "type": 0,
+ "ua": "okhttp/5.3.2",
+ "url": "https://gh-proxy.org/https://raw.githubusercontent.com/wujiangliu/live-sources/refs/heads/main/bhmb.m3u"
+ },
+ {
+ "name": "🐬湘西直播",
+ "type": 0,
+ "ua": "okhttp/5.3.2",
+ "url": "https://hub.glowp.xyz/https://raw.githubusercontent.com/wujiangliu/live-sources/refs/heads/main/xiangxi.txt"
+ },
+ {
+ "name": "🐬全球直播",
+ "type": 0,
+ "ua": "okhttp/5.3.2",
+ "url": "https://gh-proxy.org/https://raw.githubusercontent.com/wujiangliu/live-sources/refs/heads/main/%E5%85%A8%E7%90%83%E7%9B%B4%E6%92%AD.m3u"
+ },
+ {
+ "name": "🐬咪咕直播",
+ "type": 0,
+ "ua": "okhttp/5.3.2",
+ "url": "http://www.52top.com.cn:678/downloads/migu.txt"
+ },
+ {
+ "name": "🐬iptv直播",
+ "type": 0,
+ "ua": "okhttp/5.3.2",
+ "url": "https://wget.la/https://raw.githubusercontent.com/vinkerq/iptv-api/refs/heads/master/iptv.txt"
+ },
+ {
+ "name": "🐬小新TV",
+ "type": 0,
+ "ua": "okhttp/5.3.2",
+ "url": "https://d.kstore.dev/download/9565/小新TV.txt"
+ },
+ {
+ "name": "🐬北美长城源",
+ "type": 0,
+ "ua": "okhttp",
+ "url": "https://ha.msbot.dpdns.org/wall.php"
+ },
+ {
+ "name": "🐬港台",
+ "type": 0,
+ "ua": "okhttp",
+ "url": "https://feer-cdn-bp.xpnb.qzz.io/xnkl.txt"
+ },
+ {
+ "name": "🐬台湾台",
+ "type": 0,
+ "ua": "okhttp",
+ "url": "https://epg.pw/test_channels_taiwan.m3u"
+ },
+ {
+ "name": "🐬体育台",
+ "type": 0,
+ "ua": "okhttp",
+ "url": "http://82.156.243.185:33389/fwc.m3u"
+ },
+ {
+ "name": "🐬国际TV",
+ "type": 0,
+ "ua": "okhttp",
+ "url": "https://raw.githubusercontent.com/xJEYDAin/iptv/main/output/all_merged.m3u"
+ },
+ {
+ "name": "🐬UnifiTV(马来节点)",
+ "type": 0,
+ "ua": "okhttp",
+ "url": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/unifi.txt"
+ },
+ {
+ "name": "🐬裤佬TV",
+ "type": 0,
+ "ua": "okhttp",
+ "url": "https://gh-proxy.org/https://raw.githubusercontent.com/Jsnzkpg/Jsnzkpg/Jsnzkpg/Jsnzkpg1.m3u"
+ },
+ {
+ "name": "🐬Gather",
+ "type": 0,
+ "ua": "okhttp",
+ "url": "https://iptv.yang-1989.eu.org/m3u/Gather.m3u"
+ },
+ {
+ "name": "🐬Mytv",
+ "type": 0,
+ "ua": "okhttp",
+ "url": "https://cdn.qd.je/live.m3u"
+ },
+ {
+ "name": "🐬新加坡(梯子)",
+ "type": 0,
+ "ua": "okhttp",
+ "url": "http://xtvantsc.xyz/新加坡.m3u"
+ },
+ {
+ "name": "🐬黄蚂蚁先锋推流源",
+ "type": 0,
+ "ua": "okhttp",
+ "url": "http://ge.html-5.me//ii/黄蚂蚁先锋推流源.txt"
+ },
+ {
+ "name": "🐬风云源",
+ "type": 0,
+ "ua": "okhttp",
+ "url": "http://iptv.4666888.xyz/FYTV.txt"
+ },
+ {
+ "name": "🐬飞扬源",
+ "type": 0,
+ "ua": "okhttp",
+ "url": "https://www.985pan.com/down.php/bf5e9607ff407fcdd71f63928ea5bc79.txt"
+ },
+ {
+ "name": "🐬港奥台国际",
+ "type": 0,
+ "ua": "okhttp",
+ "url": "http://tv123.vvvv.ee/tv.m3u"
+ },
+ {
+ "name": "🐬中港台直播源",
+ "type": 0,
+ "ua": "okhttp",
+ "url": "https://t.freetv.fun/m3u/playlist_all.txt"
+ },
+ {
+ "name": "🐬4GTV(梯子台湾节点)720p",
+ "type": 0,
+ "ua": "okhttp",
+ "url": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/4gtv.txt"
+ },
+ {
+ "name": "🐬4GTV怡淳酒店(梯子台湾节点)720p",
+ "type": 0,
+ "ua": "okhttp",
+ "url": "http://xtvantsc.xyz/4gtv.txt"
+ },
+ {
+ "name": "🐬4GTV(梯子任何节点)1080p",
+ "type": 0,
+ "ua": "okhttp",
+ "url": "https://ha.msbot.dpdns.org/4gtv_api.php"
+ },
+ {
+ "name": "🐬jackTV(梯子)",
+ "type": 0,
+ "ua": "okhttp",
+ "url": "https://php.946985.filegear-sg.me/jackTV.m3u"
+ }
+ ],
+ "ijk": [
+ {
+ "group": "软解码",
+ "options": [
+ {
+ "category": 4,
+ "name": "opensles",
+ "value": "0"
+ },
+ {
+ "category": 4,
+ "name": "overlay-format",
+ "value": "842225234"
+ },
+ {
+ "category": 4,
+ "name": "framedrop",
+ "value": "1"
+ },
+ {
+ "category": 4,
+ "name": "soundtouch",
+ "value": "1"
+ },
+ {
+ "category": 4,
+ "name": "start-on-prepared",
+ "value": "1"
+ },
+ {
+ "category": 1,
+ "name": "http-detect-range-support",
+ "value": "0"
+ },
+ {
+ "category": 1,
+ "name": "fflags",
+ "value": "fastseek"
+ },
+ {
+ "category": 2,
+ "name": "skip_loop_filter",
+ "value": "48"
+ },
+ {
+ "category": 4,
+ "name": "reconnect",
+ "value": "1"
+ },
+ {
+ "category": 4,
+ "name": "enable-accurate-seek",
+ "value": "0"
+ },
+ {
+ "category": 4,
+ "name": "mediacodec",
+ "value": "0"
+ },
+ {
+ "category": 4,
+ "name": "mediacodec-auto-rotate",
+ "value": "0"
+ },
+ {
+ "category": 4,
+ "name": "mediacodec-handle-resolution-change",
+ "value": "0"
+ },
+ {
+ "category": 4,
+ "name": "mediacodec-hevc",
+ "value": "0"
+ },
+ {
+ "category": 1,
+ "name": "dns_cache_timeout",
+ "value": "600000000"
+ }
+ ]
+ },
+ {
+ "group": "硬解码",
+ "options": [
+ {
+ "category": 4,
+ "name": "opensles",
+ "value": "0"
+ },
+ {
+ "category": 4,
+ "name": "overlay-format",
+ "value": "842225234"
+ },
+ {
+ "category": 4,
+ "name": "framedrop",
+ "value": "1"
+ },
+ {
+ "category": 4,
+ "name": "soundtouch",
+ "value": "1"
+ },
+ {
+ "category": 4,
+ "name": "start-on-prepared",
+ "value": "1"
+ },
+ {
+ "category": 1,
+ "name": "http-detect-range-support",
+ "value": "0"
+ },
+ {
+ "category": 1,
+ "name": "fflags",
+ "value": "fastseek"
+ },
+ {
+ "category": 2,
+ "name": "skip_loop_filter",
+ "value": "48"
+ },
+ {
+ "category": 4,
+ "name": "reconnect",
+ "value": "1"
+ },
+ {
+ "category": 4,
+ "name": "enable-accurate-seek",
+ "value": "0"
+ },
+ {
+ "category": 4,
+ "name": "mediacodec",
+ "value": "1"
+ },
+ {
+ "category": 4,
+ "name": "mediacodec-auto-rotate",
+ "value": "1"
+ },
+ {
+ "category": 4,
+ "name": "mediacodec-handle-resolution-change",
+ "value": "1"
+ },
+ {
+ "category": 4,
+ "name": "mediacodec-hevc",
+ "value": "1"
+ },
+ {
+ "category": 1,
+ "name": "dns_cache_timeout",
+ "value": "600000000"
+ }
+ ]
+ }
+],
+"proxy": [
+ "file://TV/proxy.json"
+ ],
+ "rules": [
+ {
+ "name": "cl",
+ "hosts": [
+ "magnet"
+ ],
+ "regex": [
+ "最 新",
+ "直 播",
+ "更 新"
+ ]
+ },
+ {
+ "name": "火山嗅探",
+ "hosts": [
+ "huoshan.com"
+ ],
+ "regex": [
+ "item_id="
+ ]
+ },
+ {
+ "name": "抖音嗅探",
+ "hosts": [
+ "douyin.com"
+ ],
+ "regex": [
+ "is_play_url="
+ ]
+ },
+ {
+ "name": "农民嗅探",
+ "hosts": [
+ "toutiaovod.com"
+ ],
+ "regex": [
+ "video/tos/cn"
+ ]
+ },
+ {
+ "name": "七新嗅探",
+ "hosts": [
+ "api.52wyb.com"
+ ],
+ "regex": [
+ "m3u8?pt=m3u8"
+ ]
+ },
+ {
+ "name": "夜市",
+ "hosts": [
+ "yeslivetv.com"
+ ],
+ "script": [
+ "document.getElementsByClassName('vjs-big-play-button')[0].click()"
+ ]
+ },
+ {
+ "name": "毛驴",
+ "hosts": [
+ "www.maolvys.com"
+ ],
+ "script": [
+ "document.getElementsByClassName('swal-button swal-button--confirm')[0].click()"
+ ]
+ },
+ {
+ "name": "czzy",
+ "hosts": [
+ "10086.cn"
+ ],
+ "regex": [
+ "/storageWeb/servlet/downloadServlet"
+ ]
+ },
+ {
+ "name": "bdys",
+ "hosts": [
+ "bytetos.com",
+ "byteimg.com",
+ "bytednsdoc.com",
+ "pstatp.com"
+ ],
+ "regex": [
+ "/tos-cn"
+ ],
+ "exclude": [
+ ".m3u8"
+ ]
+ },
+ {
+ "name": "bdys10",
+ "hosts": [
+ "bdys10.com"
+ ],
+ "regex": [
+ "/obj/"
+ ],
+ "exclude": [
+ ".m3u8"
+ ]
+ }
+ ]
+}
diff --git a/FGBLH/鱼壳海豚.json b/FGBLH/鱼壳海豚.json
index 65e5a66d..9074b9da 100644
--- a/FGBLH/鱼壳海豚.json
+++ b/FGBLH/鱼壳海豚.json
@@ -608,6 +608,12 @@
"type": 3,
"api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/91吃瓜中心.py"
},
+ {
+ "key": "mrds",
+ "name": "🐬每日大赛.py|🔞[成人]",
+ "type": 3,
+ "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/每日大赛.py"
+ },
{
"key": "xmzb",
"name": "🐬熊猫视频.py|🔞[成人]",
diff --git a/cpu_iy/天神IY.json b/cpu_iy/天神IY.json
index 8e4f0b9e..da5a3cfe 100644
Binary files a/cpu_iy/天神IY.json and b/cpu_iy/天神IY.json differ
diff --git a/cpu_iy3/lib/XBPQ.png b/cpu_iy3/lib/XBPQ.png
index 482eea01..194e701e 100644
Binary files a/cpu_iy3/lib/XBPQ.png and b/cpu_iy3/lib/XBPQ.png differ
diff --git a/cpu_iy3/lib/bddj.js b/cpu_iy3/lib/bddj.js
new file mode 100644
index 00000000..0a56d801
--- /dev/null
+++ b/cpu_iy3/lib/bddj.js
@@ -0,0 +1,436 @@
+/*
+@header({
+ searchable: 1,
+ filterable: 0,
+ quickSearch: 1,
+ title: '百度短剧',
+ lang: 'cat'
+})
+*/
+import { Crypto as CryptoJS } from 'assets://js/lib/cat.js';
+
+let key = '百度短剧';
+let siteName = '';
+let siteKey = '';
+let siteType = 0;
+let shuaCache = [];
+
+let UA = "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36";
+let clarity_order = {'蓝光': 1, '超清': 2, '标清': 3};
+
+// ==================== URL配置集中管理 ====================
+let rule = {
+ host: 'https://mbd.baidu.com',
+ detailHost: 'https://sv.baidu.com',
+ listUrl: '/feedapi/v1/videoserver/playlets/list?service=bdbox',
+ searchUrl: '/feedapi/v1/videoserver/playlets/search?service=bdbox',
+ detailUrl: '/haokan/ui-video/playlet/rec/detail?log=vhk&tn=1020970b&ctn=1008350n&blur=1',
+ playUrl: '/appui/api?cmd=video/relate&log=vhk&tn=1020970b&ctn=1008350n&blur=1',
+};
+
+function init(cfg) {
+ siteName = (cfg.skey?.split('_')[1] || cfg.skey) || (cfg.key?.split('_')[1] || cfg.key) || '未知';
+ siteKey = cfg.skey;
+ siteType = cfg.stype;
+}
+
+function home(filter) {
+ let he = ["全部", "新剧", "限时免费", "精选", "独播"];
+ let ticailist = [
+ "神医", "连续剧", "都市", "现代言情", "异能", "逆袭", "甜宠", "总裁", "萌宝", "战神", "宫斗宅斗", "神豪",
+ "虐恋", "闪婚", "玄幻", "穿越重生", "年代", "家庭伦理", "古代言情", "武侠武打", "赘婿", "单元剧", "青春校园",
+ "历史架空", "王妃", "鉴宝", "科幻", "军旅战争", "种田"
+ ];
+
+ let classes = he.map(name => ({
+ type_id: name,
+ type_name: name
+ }));
+
+ classes = classes.concat(ticailist.map(name => ({
+ type_id: name === "全部" ? "全部题材" : name,
+ type_name: name
+ })));
+
+ return JSON.stringify({
+ class: classes,
+ filters: {}
+ });
+}
+
+async function homeVod() {
+ const categoryResult = await category('新剧', 1, {}, {});
+ const categoryList = JSON.parse(categoryResult).list;
+
+ return JSON.stringify({
+ list: [
+ {
+ vod_id: 'shua',
+ vod_name: '发现精彩',
+ vod_pic: 'https://t8.baidu.com/it/u=615012979,225344800&fm=193'
+ },
+ ...categoryList
+ ]
+ });
+}
+
+/**
+ * 合并请求函数 - 统一处理 data 和 body,支持 form-urlencoded 和 JSON
+ */
+async function request(url, options = {}) {
+ try {
+ console.log(`【${siteName}】${options.method || 'GET'} ${url.split('?')[0]}`);
+
+ // 准备基础配置
+ let requestConfig = {
+ method: options.method || 'GET',
+ headers: { "User-Agent": UA, ...options.headers }
+ };
+
+ // 获取内容类型
+ let contentType = requestConfig.headers['Content-Type'] || '';
+
+ // 辅助函数:将对象转换为字符串
+ function stringifyData(data, format) {
+ if (format.includes('json')) {
+ return JSON.stringify(data);
+ } else {
+ // 默认 form-urlencoded
+ const parts = [];
+ for (let key in data) {
+ let value = data[key];
+ if (typeof value === 'object' && value !== null) {
+ value = JSON.stringify(value);
+ }
+ parts.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));
+ }
+ return parts.join('&');
+ }
+ }
+
+ // 处理数据 - 无论 data 还是 body,统一处理
+ let requestData = options.data || options.body;
+
+ if (requestData) {
+ if (typeof requestData === 'string') {
+ // 已经是字符串,直接使用
+ requestConfig.body = requestData;
+ } else if (typeof requestData === 'object') {
+ // 对象,根据内容类型转换
+ if (!contentType) {
+ // 没有指定内容类型,默认 form-urlencoded
+ contentType = 'application/x-www-form-urlencoded';
+ requestConfig.headers['Content-Type'] = contentType;
+ }
+ requestConfig.body = stringifyData(requestData, contentType);
+ }
+ }
+
+ const res = await req(url, requestConfig);
+ return res.content || '';
+ } catch (e) {
+ console.log(`【${siteName}】请求失败: ${e.message}`);
+ return '';
+ }
+}
+
+async function category(tid, pg, filter, extend) {
+ pg = pg <= 0 ? 1 : pg;
+ let sub = ["新剧", "限时免费", "精选", "独播"].includes(tid) ? tid : "新剧";
+ let tcsub = tid === "全部" || tid === "全部题材" ? "" : tid;
+
+ let t = Math.floor(Date.now() / 1000);
+ let version = await md5(t + "v2");
+
+ // 直接传对象
+ let postData = {
+ 'data': {
+ "data": {
+ "extRequest": { "flow_tabid": "13" },
+ "from": "feed",
+ "page": "channel_video_landing",
+ "pd": "feed",
+ "refreshIndex": pg,
+ "cursor": "",
+ "theme": "",
+ "timestamp": t,
+ "version": version,
+ "themes": [
+ { "kind": "综合", "names": [sub] },
+ { "kind": "题材", "names": [tcsub] }
+ ]
+ }
+ }
+ };
+
+ let html = await request(`${rule.host}${rule.listUrl}`, {
+ method: 'POST',
+ headers: {
+ "Connection": "Keep-Alive",
+ 'Content-Type': 'application/x-www-form-urlencoded'
+ },
+ data: postData // 可以用 data
+ });
+
+ let res = JSON.parse(html);
+ let items = res.data.items;
+
+ let videos = items.map(it => ({
+ vod_id: it.collId,
+ vod_name: it.title,
+ vod_pic: it.img,
+ vod_remarks: it.updateStatus,
+ vod_content: it.description
+ }));
+
+ return JSON.stringify({
+ page: pg,
+ pagecount: pg + 1,
+ limit: 20,
+ total: items.length * (pg + 1),
+ list: videos
+ });
+}
+
+async function detail(id) {
+ if (id === 'shua') {
+ return JSON.stringify({
+ list: [{
+ vod_id: 'shua',
+ vod_name: '发现精彩',
+ vod_pic: 'https://t8.baidu.com/it/u=615012979,225344800&fm=193',
+ vod_play_from: '百度短剧',
+ vod_play_url: '刷刷看$shua',
+ vod_tag: '[SHUA][JUMP][V]'
+ }]
+ });
+ }
+
+ // 也可以用 body
+ let html = await request(`${rule.detailHost}${rule.detailUrl}`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded'
+ },
+ body: { // body 传对象也会自动处理
+ playlet_id: id,
+ vid: "undefined"
+ }
+ });
+
+ let res = JSON.parse(html);
+ let dthtml = res.data;
+ let vids = dthtml.vid_list;
+ let playArr = vids.map((vid, index) => `第${index + 1}集$${vid}`);
+
+ const vod = {
+ vod_id: id,
+ vod_name: dthtml.playlet_title,
+ vod_pic: dthtml.playlet_poster,
+ vod_content: dthtml.description,
+ vod_remarks: `共${vids.length}集 热度值:${dthtml.hot_value} 集数:${dthtml.episodes_num}`,
+ vod_director: dthtml.tag_text,
+ vod_year: dthtml.create_time,
+ vod_play_from: "百度短剧",
+ vod_play_url: playArr.join('#')
+ };
+
+ return JSON.stringify({ list: [vod] });
+}
+
+async function play(flag, id, flags) {
+ if (id == 'shua') {
+ if (shuaCache.length == 0) {
+ const randomPage = getRnd(1, 20);
+ const categories = ["新剧", "限时免费", "精选", "独播"];
+ const randomCate = categories[Math.floor(Math.random() * categories.length)];
+
+ const categoryResult = await category(randomCate, randomPage, {}, {});
+ const res = JSON.parse(categoryResult);
+ const videos = [];
+
+ for (const it of res.list.slice(0, 10)) {
+ const detailResult = await detail(it.vod_id);
+ const detailObj = JSON.parse(detailResult);
+ const vod = detailObj.list[0];
+
+ const match = vod.vod_remarks.match(/(\d+)/);
+ const episodeCount = match[1];
+
+ videos.push({
+ parse: 0,
+ url: it.vod_id,
+ shuaTitle: vod.vod_name,
+ shuaDes: '共' + episodeCount + '集 | ' + vod.vod_content.replace(/\s/g, ''),
+ shuaActions: { play: it.vod_id },
+ errorPlayNext: true
+ });
+ }
+ shuaCache.push(...videos);
+ }
+
+ const cache = shuaCache.shift();
+ const detailResult = await detail(cache.url);
+ const detailObj = JSON.parse(detailResult);
+ const vod = detailObj.list[0];
+
+ const playUrls = vod.vod_play_url.split('#');
+ const firstEpisode = playUrls[0];
+ const vid = firstEpisode.split('$')[1];
+
+ const playHtml = await request(`${rule.detailHost}${rule.playUrl}`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded'
+ },
+ data: { // 用 data 或 body 都可以
+ method: "post",
+ vid: vid
+ }
+ });
+
+ const playRes = JSON.parse(playHtml);
+ const playJson = playRes["video/relate"].data.cur_video;
+ const urls = [];
+
+ for (const item of playJson.clarityUrl) {
+ urls.push({
+ title: item.title,
+ url: item.url,
+ order: clarity_order[item.title] || 999
+ });
+ }
+ urls.sort(function (a, b) { return a.order - b.order; });
+ cache.url = urls[0].url;
+
+ return JSON.stringify(cache);
+ }
+
+ const html = await request(`${rule.detailHost}${rule.playUrl}`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded'
+ },
+ body: { // body 传对象
+ method: "post",
+ vid: id
+ }
+ });
+
+ const res = JSON.parse(html);
+ const json = res["video/relate"].data.cur_video;
+ const urls = [];
+
+ for (const item of json.clarityUrl) {
+ urls.push({
+ title: item.title,
+ url: item.url,
+ order: clarity_order[item.title] || 999
+ });
+ }
+ urls.sort(function (a, b) { return a.order - b.order; });
+
+ const flat = [];
+ for (const item of urls) {
+ flat.push(item.title);
+ flat.push(item.url);
+ }
+
+ return JSON.stringify({
+ parse: 0,
+ url: flat,
+ header: {
+ 'User-Agent': UA,
+ 'Referer': rule.host
+ }
+ });
+}
+
+async function search(wd, quick, pg) {
+ pg = pg <= 0 ? 1 : pg;
+
+ let postData = {
+ 'data': {
+ "data": {
+ "query": wd,
+ "page": pg,
+ "attribute": ["title"],
+ "fe_page_type": "search",
+ "extra": {
+ "tab_id": "216",
+ "flow_tabid": "13",
+ "shortplay_source": "feed",
+ "from": "feed",
+ "tab_type": "搜索",
+ "sub_template": "playlet_search_result"
+ }
+ }
+ }
+ };
+
+ let html = await request(`${rule.host}${rule.searchUrl}`, {
+ method: 'POST',
+ headers: {
+ "Connection": "Keep-Alive",
+ "Accept-Encoding": "gzip",
+ 'Content-Type': 'application/x-www-form-urlencoded'
+ },
+ data: postData // 用 data
+ });
+
+ let res = JSON.parse(html);
+ let items = res.data.itemList;
+
+ let videos = items.map(it => ({
+ vod_id: it.nid.split("_")[1],
+ vod_name: it.title,
+ vod_pic: it.img,
+ vod_remarks: it.collNum + '集',
+ vod_content: it.description
+ }));
+
+ return JSON.stringify({
+ page: pg,
+ pagecount: pg + 1,
+ limit: 20,
+ total: items.length * (pg + 1),
+ list: videos
+ });
+}
+
+function getRnd(min, max, hexNum, isUpper) {
+ var r = parseInt(Math.random() * (max - min + 1) + min, 10);
+ if (hexNum) {
+ r = isUpper ? r.toString(hexNum).toUpperCase() : r.toString(hexNum);
+ }
+ return r;
+}
+
+async function md5(str) {
+ return CryptoJS.MD5(str).toString(CryptoJS.enc.Hex).toLowerCase();
+}
+
+async function action(action, value) {
+ if (action === 'shuaPlay') {
+ return JSON.stringify({
+ action: {
+ actionId: '__detail__',
+ ids: value,
+ keep: true
+ }
+ });
+ }
+}
+
+export function __jsEvalReturn() {
+ return {
+ init: init,
+ home: home,
+ homeVod: homeVod,
+ category: category,
+ detail: detail,
+ play: play,
+ search: search,
+ action: action
+ };
+}
\ No newline at end of file
diff --git a/cpu_iy3/lib/ds.png b/cpu_iy3/lib/ds.png
index 79e9affa..81d13959 100644
--- a/cpu_iy3/lib/ds.png
+++ b/cpu_iy3/lib/ds.png
@@ -66,1211 +66,6 @@ CCTV 怀旧剧场频道,http://43.226.38.166:89/dglive/ysp.php?id=cctvhjjc
-
-
-央卫频道2,#genre#
-CCTV1,http://emby.xlangnan.cn:10316/rtp/239.254.200.45:8008
-CCTV1,http://wangfei.uno:9999/rtp/225.1.2.47:10276
-CCTV1,http://hiliu.myds.me:18088/rtp/239.254.96.96:8550
-CCTV1,http://b.xiongnas.top:8888/rtp/239.3.1.129:8008
-CCTV1,http://www.sclvip.top:5566/rtp/239.49.8.19:9614
-CCTV1,http://youngx.top:4022/rtp/233.18.204.52:5140
-CCTV1,http://home.scanflove.com:7788/rtp/235.254.198.51:1480
-CCTV1,http://www.maomizi.cn:9530/rtp/239.77.0.86:5146
-CCTV1,http://z.d4p.cn:8000/rtp/239.49.8.19:9614
-CCTV1,http://liuwenxiaokevin.top:14044/rtp/233.18.204.52:5140
-CCTV1,http://hongzhijiaoyu.net:8188/rtp/239.77.0.86:5146
-CCTV1,http://www.negative.top:50000/rtp/233.50.201.118:5140
-CCTV1,http://nas.lyfkai.cn:19999/rtp/239.254.96.96:8550
-CCTV1,http://pr.19760929.xyz:9688/rtp/239.77.0.86:5146
-CCTV1,http://www.wjyu.top:4022/rtp/233.18.204.52:5140
-CCTV1,http://vp.maomizi.cc:9530/rtp/239.77.0.86:5146
-CCTV1,http://ds3622.guangyuan.site:8188/rtp/239.77.0.86:5146
-CCTV1,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.86:5146
-CCTV1,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.47:10276
-CCTV1,http://marcvision.xyz:8000/rtp/238.1.78.166:7200
-CCTV1,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.86:5146
-CCTV1,http://www.syy3.top:3861/rtp/239.77.0.86:5146
-CCTV1,http://alist.guangyuan.site:8188/rtp/239.77.0.86:5146
-CCTV1,http://www.marcvision.xyz:8000/rtp/238.1.78.166:7200
-CCTV1,http://esxi.juzhijian.com:8822/rtp/239.16.20.1:10010
-CCTV1,http://0000505.xyz:8888/rtp/239.76.253.151:9000
-CCTV1,http://sdray.gicp.net:8822/rtp/239.16.20.1:10010
-CCTV1,http://nas.yzzdxc.cn:16666/rtp/239.37.0.254:5540
-CCTV1,http://www.yyf1991.top:9999/rtp/233.18.204.52:5140
-CCTV1,http://xu3791vg3503.vicp.fun:8808/rtp/239.254.96.96:8550
-CCTV1,http://server.juzhijian.com:8822/rtp/239.16.20.1:10010
-CCTV1,http://zhangkx717.cn:9999/rtp/239.254.96.96:8550
-CCTV1,http://a.xiongnas.top:8888/rtp/239.3.1.129:8008
-CCTV1,http://nas.iszbd.com:4022/rtp/225.0.4.74:7980
-CCTV1,http://www.rongrong.me:14022/rtp/233.18.204.52:5140
-CCTV1,http://wmh.wmh.ink:6633/rtp/239.77.0.86:5146
-CCTV1,http://x1x.bid:5146/rtp/239.3.1.129:8008
-CCTV1,http://iptv.xxika.net:8188/rtp/239.77.0.86:5146
-CCTV2,http://emby.xlangnan.cn:10316/rtp/239.254.200.158:6000
-CCTV2,http://wangfei.uno:9999/rtp/225.1.2.78:10462
-CCTV2,http://hiliu.myds.me:18088/rtp/239.69.1.102:10250
-CCTV2,http://b.xiongnas.top:8888/rtp/239.3.1.60:8084
-CCTV2,http://www.sclvip.top:5566/rtp/239.49.8.50:9802
-CCTV2,http://youngx.top:4022/rtp/233.18.204.68:5140
-CCTV2,http://home.scanflove.com:7788/rtp/235.254.198.52:1484
-CCTV2,http://liuwenxiaokevin.top:14044/rtp/233.18.204.68:5140
-CCTV2,http://hongzhijiaoyu.net:8188/rtp/239.77.0.137:5146
-CCTV2,http://www.negative.top:50000/rtp/233.50.201.119:5140
-CCTV2,http://nas.lyfkai.cn:19999/rtp/239.69.1.102:10250
-CCTV2,http://pr.19760929.xyz:9688/rtp/239.77.0.137:5146
-CCTV2,http://www.wjyu.top:4022/rtp/233.18.204.68:5140
-CCTV2,http://ds3622.guangyuan.site:8188/rtp/239.77.0.137:5146
-CCTV2,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.137:5146
-CCTV2,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.78:10462
-CCTV2,http://marcvision.xyz:8000/rtp/238.1.78.235:7752
-CCTV2,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.137:5146
-CCTV2,http://www.syy3.top:3861/rtp/239.77.0.137:5146
-CCTV2,http://alist.guangyuan.site:8188/rtp/239.77.0.137:5146
-CCTV2,http://www.marcvision.xyz:8000/rtp/238.1.78.235:7752
-CCTV2,http://esxi.juzhijian.com:8822/rtp/239.16.20.2:10020
-CCTV2,http://0000505.xyz:8888/rtp/239.76.253.152:9000
-CCTV2,http://0000505.xyz:8888/rtp/239.76.246.152:1234
-CCTV2,http://sdray.gicp.net:8822/rtp/239.16.20.2:10020
-CCTV2,http://nas.yzzdxc.cn:16666/rtp/239.37.0.003:5540
-CCTV2,http://www.yyf1991.top:9999/rtp/233.18.204.68:5140
-CCTV2,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.102:10250
-CCTV2,http://server.juzhijian.com:8822/rtp/239.16.20.2:10020
-CCTV2,http://zhangkx717.cn:9999/rtp/239.69.1.102:10250
-CCTV2,http://a.xiongnas.top:8888/rtp/239.3.1.60:8084
-CCTV2,http://nas.iszbd.com:4022/rtp/225.0.4.132:7980
-CCTV2,http://www.rongrong.me:14022/rtp/233.18.204.68:5140
-CCTV2,http://wmh.wmh.ink:6633/rtp/239.77.0.137:5146
-CCTV3,http://emby.xlangnan.cn:10316/rtp/239.254.201.152:7205
-CCTV3,http://wangfei.uno:9999/rtp/225.1.2.141:10864
-CCTV3,http://hiliu.myds.me:18088/rtp/239.69.1.122:10370
-CCTV3,http://b.xiongnas.top:8888/rtp/239.3.1.172:8001
-CCTV3,http://www.sclvip.top:5566/rtp/239.49.8.74:8000
-CCTV3,http://youngx.top:4022/rtp/233.18.204.69:5140
-CCTV3,http://home.scanflove.com:7788/rtp/235.254.198.53:1488
-CCTV3,http://www.maomizi.cn:9530/rtp/239.77.0.169:5146
-CCTV3,http://z.d4p.cn:8000/rtp/239.49.8.74:8000
-CCTV3,http://liuwenxiaokevin.top:14044/rtp/233.18.204.69:5140
-CCTV3,http://hongzhijiaoyu.net:8188/rtp/239.77.0.169:5146
-CCTV3,http://www.negative.top:50000/rtp/233.50.201.196:5140
-CCTV3,http://nas.lyfkai.cn:19999/rtp/239.69.1.122:10370
-CCTV3,http://pr.19760929.xyz:9688/rtp/239.77.0.169:5146
-CCTV3,http://www.wjyu.top:4022/rtp/233.18.204.69:5140
-CCTV3,http://vp.maomizi.cc:9530/rtp/239.77.0.169:5146
-CCTV3,http://ds3622.guangyuan.site:8188/rtp/239.77.0.169:5146
-CCTV3,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.169:5146
-CCTV3,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.141:10864
-CCTV3,http://marcvision.xyz:8000/rtp/238.1.78.170:7232
-CCTV3,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.169:5146
-CCTV3,http://www.syy3.top:3861/rtp/239.77.0.169:5146
-CCTV3,http://alist.guangyuan.site:8188/rtp/239.77.0.169:5146
-CCTV3,http://www.marcvision.xyz:8000/rtp/238.1.78.170:7232
-CCTV3,http://esxi.juzhijian.com:8822/rtp/239.16.20.3:10030
-CCTV3,http://0000505.xyz:8888/rtp/239.76.253.153:9000
-CCTV3,http://0000505.xyz:8888/rtp/239.76.246.153:1234
-CCTV3,http://sdray.gicp.net:8822/rtp/239.16.20.3:10030
-CCTV3,http://nas.yzzdxc.cn:16666/rtp/239.37.0.231:5540
-CCTV3,http://www.yyf1991.top:9999/rtp/233.18.204.69:5140
-CCTV3,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.122:10370
-CCTV3,http://server.juzhijian.com:8822/rtp/239.16.20.3:10030
-CCTV3,http://zhangkx717.cn:9999/rtp/239.69.1.122:10370
-CCTV3,http://a.xiongnas.top:8888/rtp/239.3.1.172:8001
-CCTV3,http://www.rongrong.me:14022/rtp/233.18.204.69:5140
-CCTV3,http://wmh.wmh.ink:6633/rtp/239.77.0.169:5146
-CCTV4,http://emby.xlangnan.cn:10316/rtp/239.254.200.190:6307
-CCTV4,http://wangfei.uno:9999/rtp/225.1.2.197:11806
-CCTV4,http://hiliu.myds.me:18088/rtp/239.69.1.138:10466
-CCTV4,http://b.xiongnas.top:8888/rtp/239.3.1.105:8092
-CCTV4,http://www.sclvip.top:5566/rtp/239.49.8.51:9806
-CCTV4,http://youngx.top:4022/rtp/233.18.204.70:5140
-CCTV4,http://home.scanflove.com:7788/rtp/235.254.198.183:7980
-CCTV4,http://www.maomizi.cn:9530/rtp/239.77.0.78:5146
-CCTV4,http://liuwenxiaokevin.top:14044/rtp/233.18.204.70:5140
-CCTV4,http://hongzhijiaoyu.net:8188/rtp/239.77.0.78:5146
-CCTV4,http://www.negative.top:50000/rtp/233.50.200.101:5140
-CCTV4,http://nas.lyfkai.cn:19999/rtp/239.69.1.138:10466
-CCTV4,http://pr.19760929.xyz:9688/rtp/239.77.0.78:5146
-CCTV4,http://www.wjyu.top:4022/rtp/233.18.204.70:5140
-CCTV4,http://vp.maomizi.cc:9530/rtp/239.77.0.78:5146
-CCTV4,http://ds3622.guangyuan.site:8188/rtp/239.77.0.78:5146
-CCTV4,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.78:5146
-CCTV4,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.197:11806
-CCTV4,http://marcvision.xyz:8000/rtp/238.1.78.236:7760
-CCTV4,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.78:5146
-CCTV4,http://www.syy3.top:3861/rtp/239.77.0.78:5146
-CCTV4,http://alist.guangyuan.site:8188/rtp/239.77.0.78:5146
-CCTV4,http://www.marcvision.xyz:8000/rtp/238.1.78.236:7760
-CCTV4,http://esxi.juzhijian.com:8822/rtp/239.16.20.4:10040
-CCTV4,http://0000505.xyz:8888/rtp/239.76.245.195:1234
-CCTV4,http://0000505.xyz:8888/rtp/239.76.246.154:1234
-CCTV4,http://sdray.gicp.net:8822/rtp/239.16.20.4:10040
-CCTV4,http://www.yyf1991.top:9999/rtp/233.18.204.70:5140
-CCTV4,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.138:10466
-CCTV4,http://server.juzhijian.com:8822/rtp/239.16.20.4:10040
-CCTV4,http://zhangkx717.cn:9999/rtp/239.69.1.138:10466
-CCTV4,http://a.xiongnas.top:8888/rtp/239.3.1.105:8092
-CCTV4,http://nas.iszbd.com:4022/rtp/225.0.4.176:7980
-CCTV5,http://emby.xlangnan.cn:10316/rtp/239.254.201.153:7206
-CCTV5,http://wangfei.uno:9999/rtp/225.1.2.48:10282
-CCTV5,http://hiliu.myds.me:18088/rtp/239.69.1.123:10376
-CCTV5,http://b.xiongnas.top:8888/rtp/239.3.1.173:8001
-CCTV5,http://www.sclvip.top:5566/rtp/239.49.8.75:8000
-CCTV5,http://youngx.top:4022/rtp/233.18.204.71:5140
-CCTV5,http://home.scanflove.com:7788/rtp/235.254.198.54:1492
-CCTV5,http://www.maomizi.cn:9530/rtp/239.77.0.170:5146
-CCTV5,http://liuwenxiaokevin.top:14044/rtp/233.18.204.71:5140
-CCTV5,http://hongzhijiaoyu.net:8188/rtp/239.77.0.170:5146
-CCTV5,http://www.negative.top:50000/rtp/233.50.200.108:5140
-CCTV5,http://www.negative.top:50000/rtp/233.50.201.194:5140
-CCTV5,http://nas.lyfkai.cn:19999/rtp/239.69.1.123:10376
-CCTV5,http://pr.19760929.xyz:9688/rtp/239.77.0.170:5146
-CCTV5,http://www.wjyu.top:4022/rtp/233.18.204.71:5140
-CCTV5,http://vp.maomizi.cc:9530/rtp/239.77.0.170:5146
-CCTV5,http://ds3622.guangyuan.site:8188/rtp/239.77.0.170:5146
-CCTV5,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.170:5146
-CCTV5,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.48:10282
-CCTV5,http://marcvision.xyz:8000/rtp/238.1.78.171:7240
-CCTV5,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.170:5146
-CCTV5,http://www.syy3.top:3861/rtp/239.77.0.170:5146
-CCTV5,http://alist.guangyuan.site:8188/rtp/239.77.0.170:5146
-CCTV5,http://www.marcvision.xyz:8000/rtp/238.1.78.171:7240
-CCTV5,http://esxi.juzhijian.com:8822/rtp/239.16.20.53:10530
-CCTV5,http://0000505.xyz:8888/rtp/239.76.253.155:9000
-CCTV5,http://0000505.xyz:8888/rtp/239.76.246.155:1234
-CCTV5,http://sdray.gicp.net:8822/rtp/239.16.20.53:10530
-CCTV5,http://nas.yzzdxc.cn:16666/rtp/239.37.0.232:5540
-CCTV5,http://www.yyf1991.top:9999/rtp/233.18.204.71:5140
-CCTV5,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.123:10376
-CCTV5,http://server.juzhijian.com:8822/rtp/239.16.20.53:10530
-CCTV5,http://zhangkx717.cn:9999/rtp/239.69.1.123:10376
-CCTV5,http://a.xiongnas.top:8888/rtp/239.3.1.173:8001
-CCTV5+,http://emby.xlangnan.cn:10316/rtp/239.254.200.46:8004
-CCTV5+,http://hiliu.myds.me:18088/rtp/239.254.96.234:9484
-CCTV5+,http://b.xiongnas.top:8888/rtp/239.3.1.130:8004
-CCTV5+,http://www.sclvip.top:5566/rtp/239.49.8.18:9610
-CCTV5+,http://youngx.top:4022/rtp/233.18.204.67:5140
-CCTV5+,http://home.scanflove.com:7788/rtp/235.254.198.122:1764
-CCTV5+,http://www.maomizi.cn:9530/rtp/239.77.0.87:5146
-CCTV5+,http://liuwenxiaokevin.top:14044/rtp/233.18.204.67:5140
-CCTV5+,http://hongzhijiaoyu.net:8188/rtp/239.77.0.87:5146
-CCTV5+,http://www.negative.top:50000/rtp/233.50.201.220:5140
-CCTV5+,http://nas.lyfkai.cn:19999/rtp/239.254.96.234:9484
-CCTV5+,http://pr.19760929.xyz:9688/rtp/239.77.0.87:5146
-CCTV5+,http://www.wjyu.top:4022/rtp/233.18.204.67:5140
-CCTV5+,http://vp.maomizi.cc:9530/rtp/239.77.0.87:5146
-CCTV5+,http://ds3622.guangyuan.site:8188/rtp/239.77.0.87:5146
-CCTV5+,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.87:5146
-CCTV5+,http://marcvision.xyz:8000/rtp/238.1.78.237:7768
-CCTV5+,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.87:5146
-CCTV5+,http://www.syy3.top:3861/rtp/239.77.0.87:5146
-CCTV5+,http://alist.guangyuan.site:8188/rtp/239.77.0.87:5146
-CCTV5+,http://www.marcvision.xyz:8000/rtp/238.1.78.237:7768
-CCTV5+,http://esxi.juzhijian.com:8822/rtp/239.16.20.5:10050
-CCTV5+,http://0000505.xyz:8888/rtp/239.76.246.168:1234
-CCTV5+,http://0000505.xyz:8888/rtp/239.76.254.215:9000
-CCTV5+,http://sdray.gicp.net:8822/rtp/239.16.20.5:10050
-CCTV5+,http://nas.yzzdxc.cn:16666/rtp/239.37.0.121:5540
-CCTV5+,http://www.yyf1991.top:9999/rtp/233.18.204.67:5140
-CCTV5+,http://xu3791vg3503.vicp.fun:8808/rtp/239.254.96.234:9484
-CCTV5+,http://server.juzhijian.com:8822/rtp/239.16.20.5:10050
-CCTV5+,http://zhangkx717.cn:9999/rtp/239.254.96.234:9484
-CCTV5+,http://a.xiongnas.top:8888/rtp/239.3.1.130:8004
-CCTV5+,http://nas.iszbd.com:4022/rtp/225.0.4.73:7980
-CCTV5+,http://www.rongrong.me:14022/rtp/233.18.204.67:5140
-CCTV5+,http://wmh.wmh.ink:6633/rtp/239.77.0.87:5146
-CCTV5+,http://iptv.xxika.net:8188/rtp/239.77.0.87:5146
-CCTV5+,http://www.taoli.website:23234/rtp/239.3.1.130:8004
-CCTV5+,http://yanshifen.top:8889/rtp/239.77.0.87:5146
-CCTV6,http://emby.xlangnan.cn:10316/rtp/239.254.201.154:7207
-CCTV6,http://wangfei.uno:9999/rtp/225.1.2.143:10876
-CCTV6,http://hiliu.myds.me:18088/rtp/239.69.1.124:10382
-CCTV6,http://b.xiongnas.top:8888/rtp/239.3.1.174:8001
-CCTV6,http://www.sclvip.top:5566/rtp/239.49.8.76:8000
-CCTV6,http://youngx.top:4022/rtp/233.18.204.72:5140
-CCTV6,http://home.scanflove.com:7788/rtp/235.254.198.55:1496
-CCTV6,http://www.maomizi.cn:9530/rtp/239.77.0.171:5146
-CCTV6,http://liuwenxiaokevin.top:14044/rtp/233.18.204.72:5140
-CCTV6,http://hongzhijiaoyu.net:8188/rtp/239.77.0.171:5146
-CCTV6,http://www.negative.top:50000/rtp/233.50.200.109:5140
-CCTV6,http://nas.lyfkai.cn:19999/rtp/239.69.1.124:10382
-CCTV6,http://pr.19760929.xyz:9688/rtp/239.77.0.171:5146
-CCTV6,http://www.wjyu.top:4022/rtp/233.18.204.72:5140
-CCTV6,http://vp.maomizi.cc:9530/rtp/239.77.0.171:5146
-CCTV6,http://ds3622.guangyuan.site:8188/rtp/239.77.0.171:5146
-CCTV6,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.171:5146
-CCTV6,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.143:10876
-CCTV6,http://marcvision.xyz:8000/rtp/238.1.78.172:7248
-CCTV6,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.171:5146
-CCTV6,http://www.syy3.top:3861/rtp/239.77.0.171:5146
-CCTV6,http://alist.guangyuan.site:8188/rtp/239.77.0.171:5146
-CCTV6,http://www.marcvision.xyz:8000/rtp/238.1.78.172:7248
-CCTV6,http://esxi.juzhijian.com:8822/rtp/239.16.20.6:10060
-CCTV6,http://0000505.xyz:8888/rtp/239.76.253.156:9000
-CCTV6,http://sdray.gicp.net:8822/rtp/239.16.20.6:10060
-CCTV6,http://nas.yzzdxc.cn:16666/rtp/239.37.0.233:5540
-CCTV6,http://www.yyf1991.top:9999/rtp/233.18.204.72:5140
-CCTV6,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.124:10382
-CCTV6,http://server.juzhijian.com:8822/rtp/239.16.20.6:10060
-CCTV6,http://zhangkx717.cn:9999/rtp/239.69.1.124:10382
-CCTV6,http://a.xiongnas.top:8888/rtp/239.3.1.174:8001
-CCTV6,http://nas.iszbd.com:4022/rtp/225.0.4.144:7980
-CCTV6,http://www.rongrong.me:14022/rtp/233.18.204.72:5140
-CCTV6,http://wmh.wmh.ink:6633/rtp/239.77.0.171:5146
-CCTV7,http://emby.xlangnan.cn:10316/rtp/239.254.200.159:6000
-CCTV7,http://wangfei.uno:9999/rtp/225.1.2.79:10468
-CCTV7,http://hiliu.myds.me:18088/rtp/239.69.1.103:10256
-CCTV7,http://b.xiongnas.top:8888/rtp/239.3.1.61:8104
-CCTV7,http://www.sclvip.top:5566/rtp/239.49.0.126:8000
-CCTV7,http://youngx.top:4022/rtp/233.18.204.73:5140
-CCTV7,http://home.scanflove.com:7788/rtp/235.254.198.56:1500
-CCTV7,http://www.maomizi.cn:9530/rtp/239.77.0.138:5146
-CCTV7,http://z.d4p.cn:8000/rtp/239.49.0.126:8000
-CCTV7,http://liuwenxiaokevin.top:14044/rtp/233.18.204.73:5140
-CCTV7,http://hongzhijiaoyu.net:8188/rtp/239.77.0.138:5146
-CCTV7,http://www.negative.top:50000/rtp/233.50.200.102:5140
-CCTV7,http://nas.lyfkai.cn:19999/rtp/239.69.1.103:10256
-CCTV7,http://pr.19760929.xyz:9688/rtp/239.77.0.138:5146
-CCTV7,http://www.wjyu.top:4022/rtp/233.18.204.73:5140
-CCTV7,http://vp.maomizi.cc:9530/rtp/239.77.0.138:5146
-CCTV7,http://ds3622.guangyuan.site:8188/rtp/239.77.0.138:5146
-CCTV7,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.138:5146
-CCTV7,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.79:10468
-CCTV7,http://marcvision.xyz:8000/rtp/238.1.78.239:7784
-CCTV7,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.138:5146
-CCTV7,http://www.syy3.top:3861/rtp/239.77.0.138:5146
-CCTV7,http://alist.guangyuan.site:8188/rtp/239.77.0.138:5146
-CCTV7,http://www.marcvision.xyz:8000/rtp/238.1.78.239:7784
-CCTV7,http://esxi.juzhijian.com:8822/rtp/239.16.20.51:10510
-CCTV7,http://0000505.xyz:8888/rtp/239.76.253.157:9000
-CCTV7,http://0000505.xyz:8888/rtp/239.76.246.157:1234
-CCTV7,http://sdray.gicp.net:8822/rtp/239.16.20.51:10510
-CCTV7,http://www.yyf1991.top:9999/rtp/233.18.204.73:5140
-CCTV7,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.103:10256
-CCTV7,http://server.juzhijian.com:8822/rtp/239.16.20.51:10510
-CCTV7,http://zhangkx717.cn:9999/rtp/239.69.1.103:10256
-CCTV7,http://a.xiongnas.top:8888/rtp/239.3.1.61:8104
-CCTV7,http://nas.iszbd.com:4022/rtp/225.0.4.127:7980
-CCTV7,http://www.rongrong.me:14022/rtp/233.18.204.73:5140
-CCTV7,http://wmh.wmh.ink:6633/rtp/239.77.0.138:5146
-CCTV7,http://x1x.bid:5146/rtp/239.3.1.61:8104
-CCTV7,http://iptv.xxika.net:8188/rtp/239.77.0.138:5146
-CCTV8,http://emby.xlangnan.cn:10316/rtp/239.254.201.155:7208
-CCTV8,http://wangfei.uno:9999/rtp/225.1.2.144:10882
-CCTV8,http://hiliu.myds.me:18088/rtp/239.69.1.125:10388
-CCTV8,http://b.xiongnas.top:8888/rtp/239.3.1.175:8001
-CCTV8,http://www.sclvip.top:5566/rtp/239.49.8.77:8000
-CCTV8,http://youngx.top:4022/rtp/233.18.204.74:5140
-CCTV8,http://home.scanflove.com:7788/rtp/235.254.198.57:1504
-CCTV8,http://www.maomizi.cn:9530/rtp/239.77.0.172:5146
-CCTV8,http://z.d4p.cn:8000/rtp/239.49.8.77:8000
-CCTV8,http://liuwenxiaokevin.top:14044/rtp/233.18.204.74:5140
-CCTV8,http://hongzhijiaoyu.net:8188/rtp/239.77.0.172:5146
-CCTV8,http://nas.lyfkai.cn:19999/rtp/239.69.1.125:10388
-CCTV8,http://pr.19760929.xyz:9688/rtp/239.77.0.172:5146
-CCTV8,http://www.wjyu.top:4022/rtp/233.18.204.74:5140
-CCTV8,http://vp.maomizi.cc:9530/rtp/239.77.0.172:5146
-CCTV8,http://ds3622.guangyuan.site:8188/rtp/239.77.0.172:5146
-CCTV8,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.172:5146
-CCTV8,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.144:10882
-CCTV8,http://marcvision.xyz:8000/rtp/238.1.78.173:7256
-CCTV8,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.172:5146
-CCTV8,http://www.syy3.top:3861/rtp/239.77.0.172:5146
-CCTV8,http://alist.guangyuan.site:8188/rtp/239.77.0.172:5146
-CCTV8,http://www.marcvision.xyz:8000/rtp/238.1.78.173:7256
-CCTV8,http://esxi.juzhijian.com:8822/rtp/239.16.20.8:10080
-CCTV8,http://0000505.xyz:8888/rtp/239.76.253.158:9000
-CCTV8,http://0000505.xyz:8888/rtp/239.76.246.158:1234
-CCTV8,http://sdray.gicp.net:8822/rtp/239.16.20.8:10080
-CCTV8,http://nas.yzzdxc.cn:16666/rtp/239.37.0.234:5540
-CCTV8,http://www.yyf1991.top:9999/rtp/233.18.204.74:5140
-CCTV8,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.125:10388
-CCTV8,http://server.juzhijian.com:8822/rtp/239.16.20.8:10080
-CCTV8,http://zhangkx717.cn:9999/rtp/239.69.1.125:10388
-CCTV8,http://a.xiongnas.top:8888/rtp/239.3.1.175:8001
-CCTV8,http://nas.iszbd.com:4022/rtp/225.0.4.137:7980
-CCTV8,http://www.rongrong.me:14022/rtp/233.18.204.74:5140
-CCTV8,http://wmh.wmh.ink:6633/rtp/239.77.0.172:5146
-CCTV9,http://emby.xlangnan.cn:10316/rtp/239.254.200.59:8112
-CCTV9,http://wangfei.uno:9999/rtp/225.1.2.80:10474
-CCTV9,http://hiliu.myds.me:18088/rtp/239.69.1.104:10262
-CCTV9,http://b.xiongnas.top:8888/rtp/239.3.1.62:8112
-CCTV9,http://www.sclvip.top:5566/rtp/239.49.8.53:9814
-CCTV9,http://youngx.top:4022/rtp/233.18.204.75:5140
-CCTV9,http://www.maomizi.cn:9530/rtp/239.77.0.135:5146
-CCTV9,http://z.d4p.cn:8000/rtp/239.49.8.53:9814
-CCTV9,http://liuwenxiaokevin.top:14044/rtp/233.18.204.75:5140
-CCTV9,http://hongzhijiaoyu.net:8188/rtp/239.77.0.135:5146
-CCTV9,http://www.negative.top:50000/rtp/233.50.200.23:5140
-CCTV9,http://nas.lyfkai.cn:19999/rtp/239.69.1.104:10262
-CCTV9,http://pr.19760929.xyz:9688/rtp/239.77.0.135:5146
-CCTV9,http://www.wjyu.top:4022/rtp/233.18.204.75:5140
-CCTV9,http://ds3622.guangyuan.site:8188/rtp/239.77.0.135:5146
-CCTV9,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.135:5146
-CCTV9,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.80:10474
-CCTV9,http://marcvision.xyz:8000/rtp/238.1.78.240:7792
-CCTV9,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.135:5146
-CCTV9,http://www.syy3.top:3861/rtp/239.77.0.135:5146
-CCTV9,http://alist.guangyuan.site:8188/rtp/239.77.0.135:5146
-CCTV9,http://www.marcvision.xyz:8000/rtp/238.1.78.240:7792
-CCTV9,http://esxi.juzhijian.com:8822/rtp/239.16.20.9:10090
-CCTV9,http://0000505.xyz:8888/rtp/239.76.246.159:1234
-CCTV9,http://0000505.xyz:8888/rtp/239.76.253.159:9000
-CCTV9,http://sdray.gicp.net:8822/rtp/239.16.20.9:10090
-CCTV9,http://nas.yzzdxc.cn:16666/rtp/239.37.0.001:5540
-CCTV9,http://www.yyf1991.top:9999/rtp/233.18.204.75:5140
-CCTV9,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.104:10262
-CCTV9,http://server.juzhijian.com:8822/rtp/239.16.20.9:10090
-CCTV9,http://zhangkx717.cn:9999/rtp/239.69.1.104:10262
-CCTV9,http://a.xiongnas.top:8888/rtp/239.3.1.62:8112
-CCTV9,http://nas.iszbd.com:4022/rtp/225.0.4.131:7980
-CCTV9,http://www.rongrong.me:14022/rtp/233.18.204.75:5140
-CCTV9,http://wmh.wmh.ink:6633/rtp/239.77.0.135:5146
-CCTV10,http://emby.xlangnan.cn:10316/rtp/239.254.200.160:6000
-CCTV10,http://wangfei.uno:9999/rtp/225.1.2.81:10480
-CCTV10,http://hiliu.myds.me:18088/rtp/239.69.1.105:10268
-CCTV10,http://b.xiongnas.top:8888/rtp/239.3.1.63:8116
-CCTV10,http://www.sclvip.top:5566/rtp/239.49.8.54:9818
-CCTV10,http://youngx.top:4022/rtp/233.18.204.76:5140
-CCTV10,http://home.scanflove.com:7788/rtp/235.254.198.59:1512
-CCTV10,http://z.d4p.cn:8000/rtp/239.49.8.54:9818
-CCTV10,http://liuwenxiaokevin.top:14044/rtp/233.18.204.76:5140
-CCTV10,http://hongzhijiaoyu.net:8188/rtp/239.77.0.134:5146
-CCTV10,http://www.negative.top:50000/rtp/233.50.200.22:5140
-CCTV10,http://nas.lyfkai.cn:19999/rtp/239.69.1.105:10268
-CCTV10,http://pr.19760929.xyz:9688/rtp/239.77.0.134:5146
-CCTV10,http://www.wjyu.top:4022/rtp/233.18.204.76:5140
-CCTV10,http://vp.maomizi.cc:9530/rtp/239.77.0.134:5146
-CCTV10,http://ds3622.guangyuan.site:8188/rtp/239.77.0.134:5146
-CCTV10,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.134:5146
-CCTV10,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.81:10480
-CCTV10,http://marcvision.xyz:8000/rtp/238.1.78.241:7800
-CCTV10,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.134:5146
-CCTV10,http://www.syy3.top:3861/rtp/239.77.0.134:5146
-CCTV10,http://alist.guangyuan.site:8188/rtp/239.77.0.134:5146
-CCTV10,http://www.marcvision.xyz:8000/rtp/238.1.78.241:7800
-CCTV10,http://esxi.juzhijian.com:8822/rtp/239.16.20.10:10100
-CCTV10,http://0000505.xyz:8888/rtp/239.76.253.160:9000
-CCTV10,http://0000505.xyz:8888/rtp/239.76.246.160:1234
-CCTV10,http://sdray.gicp.net:8822/rtp/239.16.20.10:10100
-CCTV10,http://nas.yzzdxc.cn:16666/rtp/239.37.0.007:5540
-CCTV10,http://www.yyf1991.top:9999/rtp/233.18.204.76:5140
-CCTV10,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.105:10268
-CCTV10,http://server.juzhijian.com:8822/rtp/239.16.20.10:10100
-CCTV10,http://zhangkx717.cn:9999/rtp/239.69.1.105:10268
-CCTV10,http://a.xiongnas.top:8888/rtp/239.3.1.63:8116
-CCTV10,http://nas.iszbd.com:4022/rtp/225.0.4.130:7980
-CCTV10,http://www.rongrong.me:14022/rtp/233.18.204.76:5140
-CCTV10,http://wmh.wmh.ink:6633/rtp/239.77.0.134:5146
-CCTV11,http://emby.xlangnan.cn:10316/rtp/239.254.201.123:8120
-CCTV11,http://wangfei.uno:9999/rtp/225.1.2.220:11434
-CCTV11,http://b.xiongnas.top:8888/rtp/239.3.1.152:8120
-CCTV11,http://www.sclvip.top:5566/rtp/239.49.0.127:8000
-CCTV11,http://youngx.top:4022/rtp/233.18.204.77:5140
-CCTV11,http://home.scanflove.com:7788/rtp/235.254.198.7:1304
-CCTV11,http://z.d4p.cn:8000/rtp/239.49.0.127:8000
-CCTV11,http://liuwenxiaokevin.top:14044/rtp/233.18.204.77:5140
-CCTV11,http://hongzhijiaoyu.net:8188/rtp/239.77.1.108:5146
-CCTV11,http://www.negative.top:50000/rtp/233.50.200.132:5140
-CCTV11,http://nas.lyfkai.cn:19999/rtp/239.69.1.154:10560
-CCTV11,http://pr.19760929.xyz:9688/rtp/239.77.1.108:5146
-CCTV11,http://www.wjyu.top:4022/rtp/233.18.204.77:5140
-CCTV11,http://ds3622.guangyuan.site:8188/rtp/239.77.1.108:5146
-CCTV11,http://lbyjlt.vv5678.cn:8880/rtp/239.77.1.108:5146
-CCTV11,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.220:11434
-CCTV11,http://marcvision.xyz:8000/rtp/238.1.78.206:7502
-CCTV11,http://www.hongzhijiaoyu.net:8188/rtp/239.77.1.108:5146
-CCTV11,http://www.syy3.top:3861/rtp/239.77.1.108:5146
-CCTV11,http://alist.guangyuan.site:8188/rtp/239.77.1.108:5146
-CCTV11,http://www.marcvision.xyz:8000/rtp/238.1.78.206:7502
-CCTV11,http://esxi.juzhijian.com:8822/rtp/239.16.20.11:10110
-CCTV11,http://0000505.xyz:8888/rtp/239.76.245.251:1234
-CCTV11,http://0000505.xyz:8888/rtp/239.76.252.251:9000
-CCTV11,http://sdray.gicp.net:8822/rtp/239.16.20.11:10110
-CCTV11,http://www.yyf1991.top:9999/rtp/233.18.204.77:5140
-CCTV11,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.154:10560
-CCTV11,http://server.juzhijian.com:8822/rtp/239.16.20.11:10110
-CCTV11,http://zhangkx717.cn:9999/rtp/239.69.1.154:10560
-CCTV11,http://a.xiongnas.top:8888/rtp/239.3.1.152:8120
-CCTV11,http://nas.iszbd.com:4022/rtp/225.0.4.218:7980
-CCTV11,http://www.rongrong.me:14022/rtp/233.18.204.77:5140
-CCTV11,http://wmh.wmh.ink:6633/rtp/239.77.1.108:5146
-CCTV11,http://x1x.bid:5146/rtp/239.3.1.152:8120
-CCTV12,http://emby.xlangnan.cn:10316/rtp/239.254.200.161:6000
-CCTV12,http://wangfei.uno:9999/rtp/225.1.2.82:10486
-CCTV12,http://b.xiongnas.top:8888/rtp/239.3.1.64:8124
-CCTV12,http://www.sclvip.top:5566/rtp/239.49.8.55:9822
-CCTV12,http://youngx.top:4022/rtp/233.18.204.78:5140
-CCTV12,http://home.scanflove.com:7788/rtp/235.254.198.60:1516
-CCTV12,http://liuwenxiaokevin.top:14044/rtp/233.18.204.78:5140
-CCTV12,http://hongzhijiaoyu.net:8188/rtp/239.77.0.136:5146
-CCTV12,http://www.negative.top:50000/rtp/233.50.200.21:5140
-CCTV12,http://nas.lyfkai.cn:19999/rtp/239.69.1.106:10274
-CCTV12,http://pr.19760929.xyz:9688/rtp/239.77.0.136:5146
-CCTV12,http://www.wjyu.top:4022/rtp/233.18.204.78:5140
-CCTV12,http://ds3622.guangyuan.site:8188/rtp/239.77.0.136:5146
-CCTV12,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.136:5146
-CCTV12,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.82:10486
-CCTV12,http://marcvision.xyz:8000/rtp/238.1.78.242:7808
-CCTV12,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.136:5146
-CCTV12,http://www.syy3.top:3861/rtp/239.77.0.136:5146
-CCTV12,http://alist.guangyuan.site:8188/rtp/239.77.0.136:5146
-CCTV12,http://www.marcvision.xyz:8000/rtp/238.1.78.242:7808
-CCTV12,http://esxi.juzhijian.com:8822/rtp/239.16.20.12:10120
-CCTV12,http://0000505.xyz:8888/rtp/239.76.246.162:1234
-CCTV12,http://0000505.xyz:8888/rtp/239.76.253.162:9000
-CCTV12,http://sdray.gicp.net:8822/rtp/239.16.20.12:10120
-CCTV12,http://nas.yzzdxc.cn:16666/rtp/239.37.0.006:5540
-CCTV12,http://www.yyf1991.top:9999/rtp/233.18.204.78:5140
-CCTV12,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.106:10274
-CCTV12,http://server.juzhijian.com:8822/rtp/239.16.20.12:10120
-CCTV12,http://zhangkx717.cn:9999/rtp/239.69.1.106:10274
-CCTV12,http://a.xiongnas.top:8888/rtp/239.3.1.64:8124
-CCTV12,http://nas.iszbd.com:4022/rtp/225.0.4.129:7980
-CCTV12,http://www.rongrong.me:14022/rtp/233.18.204.78:5140
-CCTV12,http://wmh.wmh.ink:6633/rtp/239.77.0.136:5146
-CCTV13,http://emby.xlangnan.cn:10316/rtp/239.254.200.9:8264
-CCTV13,http://wangfei.uno:9999/rtp/225.1.2.74:11584
-CCTV13,http://b.xiongnas.top:8888/rtp/239.3.1.124:8128
-CCTV13,http://www.sclvip.top:5566/rtp/239.49.8.109:8000
-CCTV13,http://youngx.top:4022/rtp/233.18.204.79:5140
-CCTV13,http://home.scanflove.com:7788/rtp/235.254.198.9:1312
-CCTV13,http://www.maomizi.cn:9530/rtp/239.253.43.196:5146
-CCTV13,http://z.d4p.cn:8000/rtp/239.49.8.109:8000
-CCTV13,http://liuwenxiaokevin.top:14044/rtp/233.18.204.79:5140
-CCTV13,http://hongzhijiaoyu.net:8188/rtp/239.253.43.196:5146
-CCTV13,http://www.negative.top:50000/rtp/233.50.200.97:5140
-CCTV13,http://nas.lyfkai.cn:19999/rtp/239.254.96.161:9040
-CCTV13,http://pr.19760929.xyz:9688/rtp/239.253.43.196:5146
-CCTV13,http://www.wjyu.top:4022/rtp/233.18.204.79:5140
-CCTV13,http://vp.maomizi.cc:9530/rtp/239.253.43.196:5146
-CCTV13,http://ds3622.guangyuan.site:8188/rtp/239.253.43.196:5146
-CCTV13,http://lbyjlt.vv5678.cn:8880/rtp/239.253.43.196:5146
-CCTV13,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.74:11584
-CCTV13,http://marcvision.xyz:8000/rtp/238.1.79.35:4392
-CCTV13,http://www.hongzhijiaoyu.net:8188/rtp/239.253.43.196:5146
-CCTV13,http://www.syy3.top:3861/rtp/239.253.43.196:5146
-CCTV13,http://alist.guangyuan.site:8188/rtp/239.253.43.196:5146
-CCTV13,http://www.marcvision.xyz:8000/rtp/238.1.79.35:4392
-CCTV13,http://esxi.juzhijian.com:8822/rtp/239.16.20.13:10130
-CCTV13,http://0000505.xyz:8888/rtp/239.76.253.93:9000
-CCTV13,http://0000505.xyz:8888/rtp/239.76.246.93:1234
-CCTV13,http://sdray.gicp.net:8822/rtp/239.16.20.13:10130
-CCTV13,http://www.yyf1991.top:9999/rtp/233.18.204.79:5140
-CCTV13,http://xu3791vg3503.vicp.fun:8808/rtp/239.254.96.161:9040
-CCTV13,http://server.juzhijian.com:8822/rtp/239.16.20.13:10130
-CCTV13,http://zhangkx717.cn:9999/rtp/239.254.96.161:9040
-CCTV13,http://a.xiongnas.top:8888/rtp/239.3.1.124:8128
-CCTV13,http://nas.iszbd.com:4022/rtp/225.0.4.219:7980
-CCTV13,http://www.rongrong.me:14022/rtp/233.18.204.79:5140
-CCTV13,http://wmh.wmh.ink:6633/rtp/239.253.43.196:5146
-CCTV14,http://emby.xlangnan.cn:10316/rtp/239.254.200.162:6000
-CCTV14,http://wangfei.uno:9999/rtp/225.1.2.83:10492
-CCTV14,http://b.xiongnas.top:8888/rtp/239.3.1.65:8132
-CCTV14,http://www.sclvip.top:5566/rtp/239.49.8.56:9826
-CCTV14,http://youngx.top:4022/rtp/233.18.204.80:5140
-CCTV14,http://home.scanflove.com:7788/rtp/235.254.198.61:1520
-CCTV14,http://www.maomizi.cn:9530/rtp/239.77.0.133:5146
-CCTV14,http://z.d4p.cn:8000/rtp/239.49.8.56:9826
-CCTV14,http://liuwenxiaokevin.top:14044/rtp/233.18.204.80:5140
-CCTV14,http://hongzhijiaoyu.net:8188/rtp/239.77.0.133:5146
-CCTV14,http://www.negative.top:50000/rtp/233.50.200.103:5140
-CCTV14,http://nas.lyfkai.cn:19999/rtp/239.69.1.107:10280
-CCTV14,http://pr.19760929.xyz:9688/rtp/239.77.0.133:5146
-CCTV14,http://www.wjyu.top:4022/rtp/233.18.204.80:5140
-CCTV14,http://vp.maomizi.cc:9530/rtp/239.77.0.133:5146
-CCTV14,http://ds3622.guangyuan.site:8188/rtp/239.77.0.133:5146
-CCTV14,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.133:5146
-CCTV14,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.83:10492
-CCTV14,http://marcvision.xyz:8000/rtp/238.1.78.243:7816
-CCTV14,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.133:5146
-CCTV14,http://www.syy3.top:3861/rtp/239.77.0.133:5146
-CCTV14,http://alist.guangyuan.site:8188/rtp/239.77.0.133:5146
-CCTV14,http://www.marcvision.xyz:8000/rtp/238.1.78.243:7816
-CCTV14,http://esxi.juzhijian.com:8822/rtp/239.16.20.14:10140
-CCTV14,http://0000505.xyz:8888/rtp/239.76.246.164:1234
-CCTV14,http://0000505.xyz:8888/rtp/239.76.253.164:9000
-CCTV14,http://sdray.gicp.net:8822/rtp/239.16.20.14:10140
-CCTV14,http://nas.yzzdxc.cn:16666/rtp/239.37.0.005:5540
-CCTV14,http://www.yyf1991.top:9999/rtp/233.18.204.80:5140
-CCTV14,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.107:10280
-CCTV14,http://server.juzhijian.com:8822/rtp/239.16.20.14:10140
-CCTV14,http://zhangkx717.cn:9999/rtp/239.69.1.107:10280
-CCTV14,http://a.xiongnas.top:8888/rtp/239.3.1.65:8132
-CCTV14,http://nas.iszbd.com:4022/rtp/225.0.4.128:7980
-CCTV14,http://www.rongrong.me:14022/rtp/233.18.204.80:5140
-CCTV14,http://wmh.wmh.ink:6633/rtp/239.77.0.133:5146
-CCTV15,http://emby.xlangnan.cn:10316/rtp/239.254.201.124:8136
-CCTV15,http://wangfei.uno:9999/rtp/225.1.2.221:11440
-CCTV15,http://b.xiongnas.top:8888/rtp/239.3.1.153:8136
-CCTV15,http://www.sclvip.top:5566/rtp/239.49.0.128:8000
-CCTV15,http://youngx.top:4022/rtp/233.18.204.81:5140
-CCTV15,http://home.scanflove.com:7788/rtp/235.254.198.11:1320
-CCTV15,http://www.maomizi.cn:9530/rtp/239.77.1.239:5146
-CCTV15,http://z.d4p.cn:8000/rtp/239.49.0.128:8000
-CCTV15,http://liuwenxiaokevin.top:14044/rtp/233.18.204.81:5140
-CCTV15,http://hongzhijiaoyu.net:8188/rtp/239.77.1.239:5146
-CCTV15,http://www.negative.top:50000/rtp/233.50.200.133:5140
-CCTV15,http://nas.lyfkai.cn:19999/rtp/239.69.1.155:10566
-CCTV15,http://pr.19760929.xyz:9688/rtp/239.77.1.239:5146
-CCTV15,http://www.wjyu.top:4022/rtp/233.18.204.81:5140
-CCTV15,http://vp.maomizi.cc:9530/rtp/239.77.1.239:5146
-CCTV15,http://ds3622.guangyuan.site:8188/rtp/239.77.1.239:5146
-CCTV15,http://lbyjlt.vv5678.cn:8880/rtp/239.77.1.239:5146
-CCTV15,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.221:11440
-CCTV15,http://marcvision.xyz:8000/rtp/238.1.78.222:7648
-CCTV15,http://www.hongzhijiaoyu.net:8188/rtp/239.77.1.239:5146
-CCTV15,http://www.syy3.top:3861/rtp/239.77.1.239:5146
-CCTV15,http://alist.guangyuan.site:8188/rtp/239.77.1.239:5146
-CCTV15,http://www.marcvision.xyz:8000/rtp/238.1.78.222:7648
-CCTV15,http://esxi.juzhijian.com:8822/rtp/239.16.20.15:10150
-CCTV15,http://0000505.xyz:8888/rtp/239.76.252.252:9000
-CCTV15,http://0000505.xyz:8888/rtp/239.76.245.252:1234
-CCTV15,http://sdray.gicp.net:8822/rtp/239.16.20.15:10150
-CCTV15,http://www.yyf1991.top:9999/rtp/233.18.204.81:5140
-CCTV15,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.155:10566
-CCTV15,http://server.juzhijian.com:8822/rtp/239.16.20.15:10150
-CCTV15,http://zhangkx717.cn:9999/rtp/239.69.1.155:10566
-CCTV15,http://a.xiongnas.top:8888/rtp/239.3.1.153:8136
-CCTV15,http://nas.iszbd.com:4022/rtp/225.0.4.220:7980
-CCTV15,http://www.rongrong.me:14022/rtp/233.18.204.81:5140
-CCTV15,http://wmh.wmh.ink:6633/rtp/239.77.1.239:5146
-CCTV15,http://x1x.bid:5146/rtp/239.3.1.153:8136
-CCTV15,http://iptv.xxika.net:8188/rtp/239.77.1.239:5146
-CCTV16,http://emby.xlangnan.cn:10316/rtp/239.254.200.61:6344
-CCTV16,http://b.xiongnas.top:8888/rtp/239.3.1.184:8001
-CCTV16,http://www.sclvip.top:5566/rtp/239.49.8.31:8000
-CCTV16,http://youngx.top:4022/rtp/233.18.204.82:5140
-CCTV16,http://youngx.top:4022/rtp/233.18.204.114:5140
-CCTV16,http://youngx.top:4022/rtp/233.18.204.215:5140
-CCTV16,http://www.maomizi.cn:9530/rtp/239.77.0.165:5146
-CCTV16,http://z.d4p.cn:8000/rtp/239.49.8.31:8000
-CCTV16,http://liuwenxiaokevin.top:14044/rtp/233.18.204.82:5140
-CCTV16,http://liuwenxiaokevin.top:14044/rtp/233.18.204.114:5140
-CCTV16,http://liuwenxiaokevin.top:14044/rtp/233.18.204.215:5140
-CCTV16,http://hongzhijiaoyu.net:8188/rtp/239.77.0.165:5146
-CCTV16,http://www.negative.top:50000/rtp/233.50.201.192:5140
-CCTV16,http://nas.lyfkai.cn:19999/rtp/239.69.1.247:11124
-CCTV16,http://pr.19760929.xyz:9688/rtp/239.77.0.165:5146
-CCTV16,http://www.wjyu.top:4022/rtp/233.18.204.82:5140
-CCTV16,http://www.wjyu.top:4022/rtp/233.18.204.114:5140
-CCTV16,http://www.wjyu.top:4022/rtp/233.18.204.215:5140
-CCTV16,http://vp.maomizi.cc:9530/rtp/239.77.0.165:5146
-CCTV16,http://ds3622.guangyuan.site:8188/rtp/239.77.0.165:5146
-CCTV16,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.165:5146
-CCTV16,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.165:5146
-CCTV16,http://www.syy3.top:3861/rtp/239.77.0.165:5146
-CCTV16,http://alist.guangyuan.site:8188/rtp/239.77.0.165:5146
-CCTV16,http://0000505.xyz:8888/rtp/239.76.253.98:9000
-CCTV16,http://0000505.xyz:8888/rtp/239.76.246.98:1234
-CCTV16,http://www.yyf1991.top:9999/rtp/233.18.204.82:5140
-CCTV16,http://www.yyf1991.top:9999/rtp/233.18.204.114:5140
-CCTV16,http://www.yyf1991.top:9999/rtp/233.18.204.215:5140
-CCTV16,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.247:11124
-CCTV16,http://zhangkx717.cn:9999/rtp/239.69.1.247:11124
-CCTV16,http://a.xiongnas.top:8888/rtp/239.3.1.184:8001
-CCTV17,http://emby.xlangnan.cn:10316/rtp/239.254.201.120:8144
-CCTV17,http://wangfei.uno:9999/rtp/225.1.2.53:10312
-CCTV17,http://b.xiongnas.top:8888/rtp/239.3.1.151:8144
-CCTV17,http://www.sclvip.top:5566/rtp/239.49.8.52:9810
-CCTV17,http://youngx.top:4022/rtp/233.18.204.83:5140
-CCTV17,http://www.maomizi.cn:9530/rtp/239.77.0.198:5146
-CCTV17,http://liuwenxiaokevin.top:14044/rtp/233.18.204.83:5140
-CCTV17,http://hongzhijiaoyu.net:8188/rtp/239.77.0.198:5146
-CCTV17,http://www.negative.top:50000/rtp/233.50.200.113:5140
-CCTV17,http://nas.lyfkai.cn:19999/rtp/239.69.1.152:10548
-CCTV17,http://pr.19760929.xyz:9688/rtp/239.77.0.198:5146
-CCTV17,http://www.wjyu.top:4022/rtp/233.18.204.83:5140
-CCTV17,http://vp.maomizi.cc:9530/rtp/239.77.0.198:5146
-CCTV17,http://ds3622.guangyuan.site:8188/rtp/239.77.0.198:5146
-CCTV17,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.198:5146
-CCTV17,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.53:10312
-CCTV17,http://marcvision.xyz:8000/rtp/238.1.78.178:7296
-CCTV17,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.198:5146
-CCTV17,http://www.syy3.top:3861/rtp/239.77.0.198:5146
-CCTV17,http://alist.guangyuan.site:8188/rtp/239.77.0.198:5146
-CCTV17,http://www.marcvision.xyz:8000/rtp/238.1.78.178:7296
-CCTV17,http://esxi.juzhijian.com:8822/rtp/239.16.20.7:10070
-CCTV17,http://0000505.xyz:8888/rtp/239.76.252.238:9000
-CCTV17,http://0000505.xyz:8888/rtp/239.76.245.238:1234
-CCTV17,http://sdray.gicp.net:8822/rtp/239.16.20.7:10070
-CCTV17,http://nas.yzzdxc.cn:16666/rtp/239.37.0.002:5540
-CCTV17,http://www.yyf1991.top:9999/rtp/233.18.204.83:5140
-CCTV17,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.152:10548
-CCTV17,http://server.juzhijian.com:8822/rtp/239.16.20.7:10070
-CCTV17,http://zhangkx717.cn:9999/rtp/239.69.1.152:10548
-CCTV17,http://a.xiongnas.top:8888/rtp/239.3.1.151:8144
-CCTV17,http://nas.iszbd.com:4022/rtp/225.0.4.179:7980
-CCTV17,http://www.rongrong.me:14022/rtp/233.18.204.83:5140
-CCTV17,http://wmh.wmh.ink:6633/rtp/239.77.0.198:5146
-CCTV17,http://x1x.bid:5146/rtp/239.3.1.151:8144
-北京卫视,http://emby.xlangnan.cn:10316/rtp/239.254.200.47:8024
-北京卫视,http://wangfei.uno:9999/rtp/225.1.2.49:10288
-北京卫视,http://b.xiongnas.top:8888/rtp/239.3.1.241:8000
-北京卫视,http://www.sclvip.top:5566/rtp/239.49.8.11:9414
-北京卫视,http://youngx.top:4022/rtp/233.18.204.87:5140
-北京卫视,http://home.scanflove.com:7788/rtp/235.254.198.66:1540
-北京卫视,http://www.maomizi.cn:9530/rtp/239.77.0.91:5146
-北京卫视,http://liuwenxiaokevin.top:14044/rtp/233.18.204.87:5140
-北京卫视,http://hongzhijiaoyu.net:8188/rtp/239.77.0.91:5146
-北京卫视,http://www.negative.top:50000/rtp/233.50.201.107:5140
-北京卫视,http://nas.lyfkai.cn:19999/rtp/239.254.96.141:8920
-北京卫视,http://pr.19760929.xyz:9688/rtp/239.77.0.91:5146
-北京卫视,http://www.wjyu.top:4022/rtp/233.18.204.87:5140
-北京卫视,http://vp.maomizi.cc:9530/rtp/239.77.0.91:5146
-北京卫视,http://ds3622.guangyuan.site:8188/rtp/239.77.0.91:5146
-北京卫视,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.91:5146
-北京卫视,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.49:10288
-北京卫视,http://marcvision.xyz:8000/rtp/238.1.78.162:7168
-北京卫视,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.91:5146
-北京卫视,http://www.syy3.top:3861/rtp/239.77.0.91:5146
-北京卫视,http://alist.guangyuan.site:8188/rtp/239.77.0.91:5146
-北京卫视,http://www.marcvision.xyz:8000/rtp/238.1.78.162:7168
-北京卫视,http://esxi.juzhijian.com:8822/rtp/239.16.20.76:10760
-北京卫视,http://0000505.xyz:8888/rtp/239.76.246.184:1234
-北京卫视,http://0000505.xyz:8888/rtp/239.76.253.184:9000
-北京卫视,http://sdray.gicp.net:8822/rtp/239.16.20.76:10760
-北京卫视,http://nas.yzzdxc.cn:16666/rtp/239.37.0.050:5540
-北京卫视,http://www.yyf1991.top:9999/rtp/233.18.204.87:5140
-北京卫视,http://xu3791vg3503.vicp.fun:8808/rtp/239.254.96.141:8920
-北京卫视,http://server.juzhijian.com:8822/rtp/239.16.20.76:10760
-北京卫视,http://zhangkx717.cn:9999/rtp/239.254.96.141:8920
-北京卫视,http://a.xiongnas.top:8888/rtp/239.3.1.241:8000
-北京卫视,http://nas.iszbd.com:4022/rtp/225.0.4.78:7980
-北京卫视,http://www.rongrong.me:14022/rtp/233.18.204.87:5140
-北京卫视,http://wmh.wmh.ink:6633/rtp/239.77.0.91:5146
-浙江卫视,http://emby.xlangnan.cn:10316/rtp/239.254.200.53:8036
-浙江卫视,http://wangfei.uno:9999/rtp/225.1.2.85:10504
-浙江卫视,http://b.xiongnas.top:8888/rtp/239.3.1.137:8036
-浙江卫视,http://www.sclvip.top:5566/rtp/239.49.8.20:9618
-浙江卫视,http://youngx.top:4022/rtp/233.18.204.84:5140
-浙江卫视,http://home.scanflove.com:7788/rtp/235.254.198.63:1528
-浙江卫视,http://www.maomizi.cn:9530/rtp/239.77.0.89:5146
-浙江卫视,http://z.d4p.cn:8000/rtp/239.49.8.20:9618
-浙江卫视,http://liuwenxiaokevin.top:14044/rtp/233.18.204.84:5140
-浙江卫视,http://hongzhijiaoyu.net:8188/rtp/239.77.0.89:5146
-浙江卫视,http://www.negative.top:50000/rtp/233.50.201.100:5140
-浙江卫视,http://nas.lyfkai.cn:19999/rtp/239.254.96.143:8932
-浙江卫视,http://pr.19760929.xyz:9688/rtp/239.77.0.89:5146
-浙江卫视,http://www.wjyu.top:4022/rtp/233.18.204.84:5140
-浙江卫视,http://vp.maomizi.cc:9530/rtp/239.77.0.89:5146
-浙江卫视,http://ds3622.guangyuan.site:8188/rtp/239.77.0.89:5146
-浙江卫视,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.89:5146
-浙江卫视,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.85:10504
-浙江卫视,http://marcvision.xyz:8000/rtp/238.1.78.164:7184
-浙江卫视,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.89:5146
-浙江卫视,http://www.syy3.top:3861/rtp/239.77.0.89:5146
-浙江卫视,http://alist.guangyuan.site:8188/rtp/239.77.0.89:5146
-浙江卫视,http://www.marcvision.xyz:8000/rtp/238.1.78.164:7184
-浙江卫视,http://esxi.juzhijian.com:8822/rtp/239.16.20.71:10710
-浙江卫视,http://0000505.xyz:8888/rtp/239.76.246.182:1234
-浙江卫视,http://0000505.xyz:8888/rtp/239.76.253.182:9000
-浙江卫视,http://sdray.gicp.net:8822/rtp/239.16.20.71:10710
-浙江卫视,http://nas.yzzdxc.cn:16666/rtp/239.37.0.037:5540
-浙江卫视,http://www.yyf1991.top:9999/rtp/233.18.204.84:5140
-浙江卫视,http://xu3791vg3503.vicp.fun:8808/rtp/239.254.96.143:8932
-浙江卫视,http://server.juzhijian.com:8822/rtp/239.16.20.71:10710
-浙江卫视,http://zhangkx717.cn:9999/rtp/239.254.96.143:8932
-浙江卫视,http://a.xiongnas.top:8888/rtp/239.3.1.137:8036
-浙江卫视,http://nas.iszbd.com:4022/rtp/225.0.4.81:7980
-浙江卫视,http://www.rongrong.me:14022/rtp/233.18.204.84:5140
-浙江卫视,http://wmh.wmh.ink:6633/rtp/239.77.0.89:5146
-东方卫视,http://emby.xlangnan.cn:10316/rtp/239.254.200.52:8032
-东方卫视,http://wangfei.uno:9999/rtp/225.1.2.86:10510
-东方卫视,http://b.xiongnas.top:8888/rtp/239.3.1.136:8032
-东方卫视,http://youngx.top:4022/rtp/233.18.204.51:5140
-东方卫视,http://home.scanflove.com:7788/rtp/235.254.198.73:1568
-东方卫视,http://www.maomizi.cn:9530/rtp/239.77.1.218:5146
-东方卫视,http://z.d4p.cn:8000/rtp/239.49.8.17:9606
-东方卫视,http://liuwenxiaokevin.top:14044/rtp/233.18.204.51:5140
-东方卫视,http://hongzhijiaoyu.net:8188/rtp/239.77.1.218:5146
-东方卫视,http://www.negative.top:50000/rtp/233.50.201.125:5140
-东方卫视,http://nas.lyfkai.cn:19999/rtp/239.254.96.142:8926
-东方卫视,http://pr.19760929.xyz:9688/rtp/239.77.1.218:5146
-东方卫视,http://www.wjyu.top:4022/rtp/233.18.204.51:5140
-东方卫视,http://vp.maomizi.cc:9530/rtp/239.77.1.218:5146
-东方卫视,http://ds3622.guangyuan.site:8188/rtp/239.77.1.218:5146
-东方卫视,http://lbyjlt.vv5678.cn:8880/rtp/239.77.1.218:5146
-东方卫视,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.86:10510
-东方卫视,http://marcvision.xyz:8000/rtp/238.1.78.163:7176
-东方卫视,http://www.hongzhijiaoyu.net:8188/rtp/239.77.1.218:5146
-东方卫视,http://www.syy3.top:3861/rtp/239.77.1.218:5146
-东方卫视,http://alist.guangyuan.site:8188/rtp/239.77.1.218:5146
-东方卫视,http://www.marcvision.xyz:8000/rtp/238.1.78.163:7176
-东方卫视,http://esxi.juzhijian.com:8822/rtp/239.16.20.73:10730
-东方卫视,http://0000505.xyz:8888/rtp/239.76.246.186:1234
-东方卫视,http://0000505.xyz:8888/rtp/239.76.253.186:9000
-东方卫视,http://sdray.gicp.net:8822/rtp/239.16.20.73:10730
-东方卫视,http://www.yyf1991.top:9999/rtp/233.18.204.51:5140
-东方卫视,http://xu3791vg3503.vicp.fun:8808/rtp/239.254.96.142:8926
-东方卫视,http://server.juzhijian.com:8822/rtp/239.16.20.73:10730
-东方卫视,http://zhangkx717.cn:9999/rtp/239.254.96.142:8926
-东方卫视,http://a.xiongnas.top:8888/rtp/239.3.1.136:8032
-东方卫视,http://nas.iszbd.com:4022/rtp/225.0.4.80:7980
-东方卫视,http://www.rongrong.me:14022/rtp/233.18.204.51:5140
-东方卫视,http://wmh.wmh.ink:6633/rtp/239.77.1.218:5146
-
-湖南卫视,http://emby.xlangnan.cn:10316/rtp/239.254.200.48:8012
-湖南卫视,http://wangfei.uno:9999/rtp/225.1.2.50:10294
-湖南卫视,http://b.xiongnas.top:8888/rtp/239.3.1.132:8012
-湖南卫视,http://www.sclvip.top:5566/rtp/239.49.8.12:9418
-湖南卫视,http://youngx.top:4022/rtp/233.18.204.86:5140
-湖南卫视,http://home.scanflove.com:7788/rtp/235.254.198.62:1524
-湖南卫视,http://www.maomizi.cn:9530/rtp/239.77.1.5:5146
-湖南卫视,http://liuwenxiaokevin.top:14044/rtp/233.18.204.86:5140
-湖南卫视,http://hongzhijiaoyu.net:8188/rtp/239.77.1.5:5146
-湖南卫视,http://www.negative.top:50000/rtp/233.50.201.103:5140
-湖南卫视,http://nas.lyfkai.cn:19999/rtp/239.254.96.139:8908
-湖南卫视,http://pr.19760929.xyz:9688/rtp/239.77.1.5:5146
-湖南卫视,http://www.wjyu.top:4022/rtp/233.18.204.86:5140
-湖南卫视,http://vp.maomizi.cc:9530/rtp/239.77.1.5:5146
-湖南卫视,http://ds3622.guangyuan.site:8188/rtp/239.77.1.5:5146
-湖南卫视,http://lbyjlt.vv5678.cn:8880/rtp/239.77.1.5:5146
-湖南卫视,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.50:10294
-湖南卫视,http://marcvision.xyz:8000/rtp/238.1.78.160:7152
-湖南卫视,http://www.hongzhijiaoyu.net:8188/rtp/239.77.1.5:5146
-湖南卫视,http://www.syy3.top:3861/rtp/239.77.1.5:5146
-湖南卫视,http://alist.guangyuan.site:8188/rtp/239.77.1.5:5146
-湖南卫视,http://www.marcvision.xyz:8000/rtp/238.1.78.160:7152
-湖南卫视,http://esxi.juzhijian.com:8822/rtp/239.16.20.72:10720
-湖南卫视,http://0000505.xyz:8888/rtp/239.76.245.115:1234
-湖南卫视,http://0000505.xyz:8888/rtp/239.76.246.101:1234
-湖南卫视,http://0000505.xyz:8888/rtp/239.76.253.101:9000
-湖南卫视,http://sdray.gicp.net:8822/rtp/239.16.20.72:10720
-湖南卫视,http://nas.yzzdxc.cn:16666/rtp/239.37.0.038:5540
-湖南卫视,http://www.yyf1991.top:9999/rtp/233.18.204.86:5140
-湖南卫视,http://xu3791vg3503.vicp.fun:8808/rtp/239.254.96.139:8908
-湖南卫视,http://server.juzhijian.com:8822/rtp/239.16.20.72:10720
-湖南卫视,http://zhangkx717.cn:9999/rtp/239.254.96.139:8908
-湖南卫视,http://a.xiongnas.top:8888/rtp/239.3.1.132:8012
-
-江苏卫视,http://emby.xlangnan.cn:10316/rtp/239.254.200.51:8028
-江苏卫视,http://wangfei.uno:9999/rtp/225.1.2.84:10498
-江苏卫视,http://b.xiongnas.top:8888/rtp/239.3.1.135:8028
-江苏卫视,http://www.sclvip.top:5566/rtp/239.49.8.16:9602
-江苏卫视,http://youngx.top:4022/rtp/233.18.204.85:5140
-江苏卫视,http://home.scanflove.com:7788/rtp/235.254.198.64:1532
-江苏卫视,http://www.maomizi.cn:9530/rtp/239.77.1.18:5146
-江苏卫视,http://liuwenxiaokevin.top:14044/rtp/233.18.204.85:5140
-江苏卫视,http://hongzhijiaoyu.net:8188/rtp/239.77.1.18:5146
-江苏卫视,http://www.negative.top:50000/rtp/233.50.201.106:5140
-江苏卫视,http://nas.lyfkai.cn:19999/rtp/239.254.96.144:8938
-江苏卫视,http://pr.19760929.xyz:9688/rtp/239.77.1.18:5146
-江苏卫视,http://www.wjyu.top:4022/rtp/233.18.204.85:5140
-江苏卫视,http://vp.maomizi.cc:9530/rtp/239.77.1.18:5146
-江苏卫视,http://ds3622.guangyuan.site:8188/rtp/239.77.1.18:5146
-江苏卫视,http://lbyjlt.vv5678.cn:8880/rtp/239.77.1.18:5146
-江苏卫视,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.84:10498
-江苏卫视,http://marcvision.xyz:8000/rtp/238.1.78.165:7192
-江苏卫视,http://www.hongzhijiaoyu.net:8188/rtp/239.77.1.18:5146
-江苏卫视,http://www.syy3.top:3861/rtp/239.77.1.18:5146
-江苏卫视,http://alist.guangyuan.site:8188/rtp/239.77.1.18:5146
-江苏卫视,http://www.marcvision.xyz:8000/rtp/238.1.78.165:7192
-江苏卫视,http://esxi.juzhijian.com:8822/rtp/239.16.20.74:10740
-江苏卫视,http://0000505.xyz:8888/rtp/239.76.253.181:9000
-江苏卫视,http://0000505.xyz:8888/rtp/239.76.246.181:1234
-江苏卫视,http://sdray.gicp.net:8822/rtp/239.16.20.74:10740
-江苏卫视,http://nas.yzzdxc.cn:16666/rtp/239.37.0.055:5540
-江苏卫视,http://www.yyf1991.top:9999/rtp/233.18.204.85:5140
-江苏卫视,http://xu3791vg3503.vicp.fun:8808/rtp/239.254.96.144:8938
-江苏卫视,http://server.juzhijian.com:8822/rtp/239.16.20.74:10740
-江苏卫视,http://zhangkx717.cn:9999/rtp/239.254.96.144:8938
-江苏卫视,http://a.xiongnas.top:8888/rtp/239.3.1.135:8028
-江苏卫视,http://nas.iszbd.com:4022/rtp/225.0.4.79:7980
-江苏卫视,http://www.rongrong.me:14022/rtp/233.18.204.85:5140
-江苏卫视,http://wmh.wmh.ink:6633/rtp/239.77.1.18:5146
-深圳卫视,http://emby.xlangnan.cn:10316/rtp/239.254.200.50:8020
-深圳卫视,http://wangfei.uno:9999/rtp/225.1.2.91:10540
-深圳卫视,http://b.xiongnas.top:8888/rtp/239.3.1.134:8020
-深圳卫视,http://www.sclvip.top:5566/rtp/239.49.8.15:9430
-深圳卫视,http://youngx.top:4022/rtp/233.18.204.89:5140
-深圳卫视,http://home.scanflove.com:7788/rtp/235.254.198.71:1560
-深圳卫视,http://www.maomizi.cn:9530/rtp/239.77.0.92:5146
-深圳卫视,http://liuwenxiaokevin.top:14044/rtp/233.18.204.89:5140
-深圳卫视,http://hongzhijiaoyu.net:8188/rtp/239.77.0.92:5146
-深圳卫视,http://nas.lyfkai.cn:19999/rtp/239.254.96.137:8896
-深圳卫视,http://pr.19760929.xyz:9688/rtp/239.77.0.92:5146
-深圳卫视,http://www.wjyu.top:4022/rtp/233.18.204.89:5140
-深圳卫视,http://vp.maomizi.cc:9530/rtp/239.77.0.92:5146
-深圳卫视,http://ds3622.guangyuan.site:8188/rtp/239.77.0.92:5146
-深圳卫视,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.92:5146
-深圳卫视,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.91:10540
-深圳卫视,http://marcvision.xyz:8000/rtp/238.1.78.156:7120
-深圳卫视,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.92:5146
-深圳卫视,http://www.syy3.top:3861/rtp/239.77.0.92:5146
-深圳卫视,http://alist.guangyuan.site:8188/rtp/239.77.0.92:5146
-深圳卫视,http://www.marcvision.xyz:8000/rtp/238.1.78.156:7120
-深圳卫视,http://esxi.juzhijian.com:8822/rtp/239.16.20.77:10770
-深圳卫视,http://0000505.xyz:8888/rtp/239.76.246.188:1234
-深圳卫视,http://sdray.gicp.net:8822/rtp/239.16.20.77:10770
-深圳卫视,http://nas.yzzdxc.cn:16666/rtp/239.37.0.047:5540
-深圳卫视,http://www.yyf1991.top:9999/rtp/233.18.204.89:5140
-深圳卫视,http://xu3791vg3503.vicp.fun:8808/rtp/239.254.96.137:8896
-深圳卫视,http://server.juzhijian.com:8822/rtp/239.16.20.77:10770
-深圳卫视,http://zhangkx717.cn:9999/rtp/239.254.96.137:8896
-深圳卫视,http://a.xiongnas.top:8888/rtp/239.3.1.134:8020
-深圳卫视,http://nas.iszbd.com:4022/rtp/225.0.4.202:7980
-深圳卫视,http://www.rongrong.me:14022/rtp/233.18.204.89:5140
-深圳卫视,http://wmh.wmh.ink:6633/rtp/239.77.0.92:5146
-
-广东卫视,http://emby.xlangnan.cn:10316/rtp/239.254.200.56:8048
-广东卫视,http://wangfei.uno:9999/rtp/225.1.2.151:10924
-广东卫视,http://b.xiongnas.top:8888/rtp/239.3.1.142:8048
-广东卫视,http://www.sclvip.top:5566/rtp/239.49.8.13:9422
-广东卫视,http://youngx.top:4022/rtp/233.18.204.88:5140
-广东卫视,http://home.scanflove.com:7788/rtp/235.254.196.204:1088
-广东卫视,http://www.maomizi.cn:9530/rtp/239.77.0.84:5146
-广东卫视,http://liuwenxiaokevin.top:14044/rtp/233.18.204.88:5140
-广东卫视,http://hongzhijiaoyu.net:8188/rtp/239.77.0.84:5146
-广东卫视,http://nas.lyfkai.cn:19999/rtp/239.254.96.140:8914
-广东卫视,http://pr.19760929.xyz:9688/rtp/239.77.0.84:5146
-广东卫视,http://www.wjyu.top:4022/rtp/233.18.204.88:5140
-广东卫视,http://vp.maomizi.cc:9530/rtp/239.77.0.84:5146
-广东卫视,http://ds3622.guangyuan.site:8188/rtp/239.77.0.84:5146
-广东卫视,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.84:5146
-广东卫视,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.151:10924
-广东卫视,http://marcvision.xyz:8000/rtp/238.1.78.161:7160
-广东卫视,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.84:5146
-广东卫视,http://www.syy3.top:3861/rtp/239.77.0.84:5146
-广东卫视,http://alist.guangyuan.site:8188/rtp/239.77.0.84:5146
-广东卫视,http://www.marcvision.xyz:8000/rtp/238.1.78.161:7160
-广东卫视,http://esxi.juzhijian.com:8822/rtp/239.16.20.98:10980
-广东卫视,http://0000505.xyz:8888/rtp/239.76.252.189:9000
-广东卫视,http://0000505.xyz:8888/rtp/239.76.245.189:1234
-广东卫视,http://sdray.gicp.net:8822/rtp/239.16.20.98:10980
-广东卫视,http://nas.yzzdxc.cn:16666/rtp/239.37.0.033:5540
-广东卫视,http://www.yyf1991.top:9999/rtp/233.18.204.88:5140
-广东卫视,http://xu3791vg3503.vicp.fun:8808/rtp/239.254.96.140:8914
-广东卫视,http://server.juzhijian.com:8822/rtp/239.16.20.98:10980
-广东卫视,http://zhangkx717.cn:9999/rtp/239.254.96.140:8914
-广东卫视,http://a.xiongnas.top:8888/rtp/239.3.1.142:8048
-广东卫视,http://nas.iszbd.com:4022/rtp/225.0.4.84:7980
-广东卫视,http://www.rongrong.me:14022/rtp/233.18.204.88:5140
-广东卫视,http://wmh.wmh.ink:6633/rtp/239.77.0.84:5146
-广西卫视,http://emby.xlangnan.cn:10316/rtp/239.254.200.80:8300
-广西卫视,http://wangfei.uno:9999/rtp/225.1.2.34:10198
-广西卫视,http://b.xiongnas.top:8888/rtp/239.3.1.39:8300
-广西卫视,http://www.sclvip.top:5566/rtp/239.49.8.10:8000
-广西卫视,http://youngx.top:4022/rtp/233.18.204.107:5140
-广西卫视,http://home.scanflove.com:7788/rtp/235.254.198.38:1428
-广西卫视,http://www.maomizi.cn:9530/rtp/239.77.0.139:5146
-广西卫视,http://z.d4p.cn:8000/rtp/239.49.8.10:8000
-广西卫视,http://liuwenxiaokevin.top:14044/rtp/233.18.204.107:5140
-广西卫视,http://hongzhijiaoyu.net:8188/rtp/239.77.0.139:5146
-广西卫视,http://www.negative.top:50000/rtp/233.50.200.136:5140
-广西卫视,http://nas.lyfkai.cn:19999/rtp/239.69.1.191:10788
-广西卫视,http://pr.19760929.xyz:9688/rtp/239.77.0.139:5146
-广西卫视,http://www.wjyu.top:4022/rtp/233.18.204.107:5140
-广西卫视,http://vp.maomizi.cc:9530/rtp/239.77.0.139:5146
-广西卫视,http://ds3622.guangyuan.site:8188/rtp/239.77.0.139:5146
-广西卫视,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.139:5146
-广西卫视,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.34:10198
-广西卫视,http://marcvision.xyz:8000/rtp/238.1.78.70:6432
-广西卫视,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.139:5146
-广西卫视,http://www.syy3.top:3861/rtp/239.77.0.139:5146
-广西卫视,http://alist.guangyuan.site:8188/rtp/239.77.0.139:5146
-广西卫视,http://www.marcvision.xyz:8000/rtp/238.1.78.70:6432
-广西卫视,http://esxi.juzhijian.com:8822/rtp/239.16.20.84:10840
-广西卫视,http://0000505.xyz:8888/rtp/239.76.254.54:9000
-广西卫视,http://sdray.gicp.net:8822/rtp/239.16.20.84:10840
-广西卫视,http://nas.yzzdxc.cn:16666/rtp/239.37.0.051:5540
-广西卫视,http://www.yyf1991.top:9999/rtp/233.18.204.107:5140
-广西卫视,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.191:10788
-广西卫视,http://server.juzhijian.com:8822/rtp/239.16.20.84:10840
-广西卫视,http://zhangkx717.cn:9999/rtp/239.69.1.191:10788
-广西卫视,http://a.xiongnas.top:8888/rtp/239.3.1.39:8300
-广西卫视,http://www.rongrong.me:14022/rtp/233.18.204.107:5140
-广西卫视,http://wmh.wmh.ink:6633/rtp/239.77.0.139:5146
-广西卫视,http://x1x.bid:5146/rtp/239.3.1.39:8300
-广西卫视,http://www.taoli.website:23234/rtp/239.3.1.39:8300
-东南卫视,http://emby.xlangnan.cn:10316/rtp/239.254.201.13:6291
-东南卫视,http://wangfei.uno:9999/rtp/225.1.2.226:11470
-东南卫视,http://b.xiongnas.top:8888/rtp/239.3.1.156:8148
-东南卫视,http://www.sclvip.top:5566/rtp/239.49.8.112:8000
-东南卫视,http://youngx.top:4022/rtp/233.18.204.94:5140
-东南卫视,http://home.scanflove.com:7788/rtp/235.254.198.129:7980
-东南卫视,http://www.maomizi.cn:9530/rtp/239.77.0.146:5146
-东南卫视,http://z.d4p.cn:8000/rtp/239.49.8.112:8000
-东南卫视,http://liuwenxiaokevin.top:14044/rtp/233.18.204.94:5140
-东南卫视,http://hongzhijiaoyu.net:8188/rtp/239.77.0.146:5146
-东南卫视,http://nas.lyfkai.cn:19999/rtp/239.69.1.108:10286
-东南卫视,http://pr.19760929.xyz:9688/rtp/239.77.0.146:5146
-东南卫视,http://www.wjyu.top:4022/rtp/233.18.204.94:5140
-东南卫视,http://vp.maomizi.cc:9530/rtp/239.77.0.146:5146
-东南卫视,http://ds3622.guangyuan.site:8188/rtp/239.77.0.146:5146
-东南卫视,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.146:5146
-东南卫视,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.226:11470
-东南卫视,http://marcvision.xyz:8000/rtp/238.1.78.22:6104
-东南卫视,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.146:5146
-东南卫视,http://www.syy3.top:3861/rtp/239.77.0.146:5146
-东南卫视,http://alist.guangyuan.site:8188/rtp/239.77.0.146:5146
-东南卫视,http://www.marcvision.xyz:8000/rtp/238.1.78.22:6104
-东南卫视,http://esxi.juzhijian.com:8822/rtp/239.16.20.82:10820
-东南卫视,http://0000505.xyz:8888/rtp/239.76.245.190:1234
-东南卫视,http://0000505.xyz:8888/rtp/239.76.252.190:9000
-东南卫视,http://sdray.gicp.net:8822/rtp/239.16.20.82:10820
-东南卫视,http://nas.yzzdxc.cn:16666/rtp/239.37.0.042:5540
-东南卫视,http://www.yyf1991.top:9999/rtp/233.18.204.94:5140
-东南卫视,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.108:10286
-东南卫视,http://server.juzhijian.com:8822/rtp/239.16.20.82:10820
-东南卫视,http://zhangkx717.cn:9999/rtp/239.69.1.108:10286
-东南卫视,http://a.xiongnas.top:8888/rtp/239.3.1.156:8148
-东南卫视,http://nas.iszbd.com:4022/rtp/225.0.4.200:7980
-东南卫视,http://wmh.wmh.ink:6633/rtp/239.77.0.146:5146
-海南卫视,http://emby.xlangnan.cn:10316/rtp/239.254.201.125:6288
-海南卫视,http://wangfei.uno:9999/rtp/225.1.2.107:11620
-海南卫视,http://b.xiongnas.top:8888/rtp/239.3.1.45:8304
-海南卫视,http://www.sclvip.top:5566/rtp/239.49.8.83:8000
-海南卫视,http://home.scanflove.com:7788/rtp/235.254.198.44:1452
-海南卫视,http://www.maomizi.cn:9530/rtp/239.253.43.35:5146
-海南卫视,http://hongzhijiaoyu.net:8188/rtp/239.253.43.35:5146
-海南卫视,http://www.negative.top:50000/rtp/233.50.200.165:5140
-海南卫视,http://nas.lyfkai.cn:19999/rtp/239.69.1.151:10542
-海南卫视,http://pr.19760929.xyz:9688/rtp/239.253.43.35:5146
-海南卫视,http://vp.maomizi.cc:9530/rtp/239.253.43.35:5146
-海南卫视,http://ds3622.guangyuan.site:8188/rtp/239.253.43.35:5146
-海南卫视,http://lbyjlt.vv5678.cn:8880/rtp/239.253.43.35:5146
-海南卫视,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.107:11620
-海南卫视,http://marcvision.xyz:8000/rtp/238.1.79.49:4504
-海南卫视,http://www.hongzhijiaoyu.net:8188/rtp/239.253.43.35:5146
-海南卫视,http://www.syy3.top:3861/rtp/239.253.43.35:5146
-海南卫视,http://alist.guangyuan.site:8188/rtp/239.253.43.35:5146
-海南卫视,http://www.marcvision.xyz:8000/rtp/238.1.79.49:4504
-海南卫视,http://esxi.juzhijian.com:8822/rtp/239.16.20.97:10970
-海南卫视,http://sdray.gicp.net:8822/rtp/239.16.20.97:10970
-海南卫视,http://nas.yzzdxc.cn:16666/rtp/239.37.0.035:5540
-海南卫视,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.151:10542
-海南卫视,http://server.juzhijian.com:8822/rtp/239.16.20.97:10970
-海南卫视,http://zhangkx717.cn:9999/rtp/239.69.1.151:10542
-海南卫视,http://a.xiongnas.top:8888/rtp/239.3.1.45:8304
-海南卫视,http://wmh.wmh.ink:6633/rtp/239.253.43.35:5146
-海南卫视,http://iptv.xxika.net:8188/rtp/239.253.43.35:5146
-
-河北卫视,http://emby.xlangnan.cn:10316/rtp/239.254.200.174:6000
-河北卫视,http://wangfei.uno:9999/rtp/225.1.2.106:11614
-河北卫视,http://b.xiongnas.top:8888/rtp/239.3.1.148:8072
-河北卫视,http://www.sclvip.top:5566/rtp/239.49.8.114:8000
-河北卫视,http://youngx.top:4022/rtp/233.18.204.103:5140
-河北卫视,http://home.scanflove.com:7788/rtp/235.254.198.184:7980
-河北卫视,http://www.maomizi.cn:9530/rtp/239.77.1.214:5146
-河北卫视,http://liuwenxiaokevin.top:14044/rtp/233.18.204.103:5140
-河北卫视,http://hongzhijiaoyu.net:8188/rtp/239.77.1.214:5146
-河北卫视,http://www.negative.top:50000/rtp/233.50.201.140:5140
-河北卫视,http://nas.lyfkai.cn:19999/rtp/239.254.96.113:9616
-河北卫视,http://pr.19760929.xyz:9688/rtp/239.77.1.214:5146
-河北卫视,http://www.wjyu.top:4022/rtp/233.18.204.103:5140
-河北卫视,http://vp.maomizi.cc:9530/rtp/239.77.1.214:5146
-河北卫视,http://ds3622.guangyuan.site:8188/rtp/239.77.1.214:5146
-河北卫视,http://lbyjlt.vv5678.cn:8880/rtp/239.77.1.214:5146
-河北卫视,http://marcvision.xyz:8000/rtp/238.1.78.245:7832
-河北卫视,http://www.hongzhijiaoyu.net:8188/rtp/239.77.1.214:5146
-河北卫视,http://www.syy3.top:3861/rtp/239.77.1.214:5146
-河北卫视,http://alist.guangyuan.site:8188/rtp/239.77.1.214:5146
-河北卫视,http://www.marcvision.xyz:8000/rtp/238.1.78.245:7832
-河北卫视,http://esxi.juzhijian.com:8822/rtp/239.16.20.88:10880
-河北卫视,http://0000505.xyz:8888/rtp/239.76.245.199:1234
-河北卫视,http://0000505.xyz:8888/rtp/239.76.252.199:9000
-河北卫视,http://sdray.gicp.net:8822/rtp/239.16.20.88:10880
-河北卫视,http://nas.yzzdxc.cn:16666/rtp/239.37.0.052:5540
-河北卫视,http://www.yyf1991.top:9999/rtp/233.18.204.103:5140
-河北卫视,http://xu3791vg3503.vicp.fun:8808/rtp/239.254.96.113:9616
-河北卫视,http://server.juzhijian.com:8822/rtp/239.16.20.88:10880
-河北卫视,http://zhangkx717.cn:9999/rtp/239.254.96.113:9616
-河北卫视,http://a.xiongnas.top:8888/rtp/239.3.1.148:8072
-河北卫视,http://nas.iszbd.com:4022/rtp/225.0.4.174:7980
-河北卫视,http://www.rongrong.me:14022/rtp/233.18.204.103:5140
-河北卫视,http://wmh.wmh.ink:6633/rtp/239.77.1.214:5146
-
-河南卫视,http://emby.xlangnan.cn:10316/rtp/239.254.201.16:7174
-河南卫视,http://wangfei.uno:9999/rtp/225.1.2.99:10588
-河南卫视,http://b.xiongnas.top:8888/rtp/239.3.1.50:8184
-河南卫视,http://www.sclvip.top:5566/rtp/239.49.8.29:8000
-河南卫视,http://youngx.top:4022/rtp/233.18.204.105:5140
-河南卫视,http://home.scanflove.com:7788/rtp/235.254.198.26:1380
-河南卫视,http://www.maomizi.cn:9530/rtp/239.77.0.17:5146
-河南卫视,http://z.d4p.cn:8000/rtp/239.49.8.29:8000
-河南卫视,http://liuwenxiaokevin.top:14044/rtp/233.18.204.105:5140
-河南卫视,http://hongzhijiaoyu.net:8188/rtp/239.77.0.17:5146
-河南卫视,http://www.negative.top:50000/rtp/233.50.201.144:5140
-河南卫视,http://nas.lyfkai.cn:19999/rtp/239.69.1.168:10644
-河南卫视,http://pr.19760929.xyz:9688/rtp/239.77.0.17:5146
-河南卫视,http://www.wjyu.top:4022/rtp/233.18.204.105:5140
-河南卫视,http://vp.maomizi.cc:9530/rtp/239.77.0.17:5146
-河南卫视,http://ds3622.guangyuan.site:8188/rtp/239.77.0.17:5146
-河南卫视,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.17:5146
-河南卫视,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.99:10588
-河南卫视,http://marcvision.xyz:8000/rtp/238.1.79.65:4632
-河南卫视,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.17:5146
-河南卫视,http://www.syy3.top:3861/rtp/239.77.0.17:5146
-河南卫视,http://alist.guangyuan.site:8188/rtp/239.77.0.17:5146
-河南卫视,http://www.marcvision.xyz:8000/rtp/238.1.79.65:4632
-河南卫视,http://esxi.juzhijian.com:8822/rtp/239.16.20.21:10210
-河南卫视,http://0000505.xyz:8888/rtp/239.76.253.202:9000
-河南卫视,http://0000505.xyz:8888/rtp/239.76.246.202:1234
-河南卫视,http://sdray.gicp.net:8822/rtp/239.16.20.21:10210
-河南卫视,http://nas.yzzdxc.cn:16666/rtp/239.37.0.056:5540
-河南卫视,http://www.yyf1991.top:9999/rtp/233.18.204.105:5140
-河南卫视,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.168:10644
-河南卫视,http://server.juzhijian.com:8822/rtp/239.16.20.21:10210
-湖北卫视,http://emby.xlangnan.cn:10316/rtp/239.254.200.164:6000
-湖北卫视,http://wangfei.uno:9999/rtp/225.1.2.90:10534
-湖北卫视,http://b.xiongnas.top:8888/rtp/239.3.1.138:8044
-湖北卫视,http://www.sclvip.top:5566/rtp/239.49.8.8:9632
-湖北卫视,http://youngx.top:4022/rtp/233.18.204.92:5140
-湖北卫视,http://home.scanflove.com:7788/rtp/235.254.198.72:1564
-湖北卫视,http://www.maomizi.cn:9530/rtp/239.77.0.95:5146
-湖北卫视,http://liuwenxiaokevin.top:14044/rtp/233.18.204.92:5140
-湖北卫视,http://hongzhijiaoyu.net:8188/rtp/239.77.0.95:5146
-湖北卫视,http://www.negative.top:50000/rtp/233.50.201.114:5140
-湖北卫视,http://nas.lyfkai.cn:19999/rtp/239.254.96.115:8664
-湖北卫视,http://pr.19760929.xyz:9688/rtp/239.77.0.95:5146
-湖北卫视,http://www.wjyu.top:4022/rtp/233.18.204.92:5140
-湖北卫视,http://vp.maomizi.cc:9530/rtp/239.77.0.95:5146
-湖北卫视,http://ds3622.guangyuan.site:8188/rtp/239.77.0.95:5146
-湖北卫视,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.95:5146
-湖北卫视,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.90:10534
-湖北卫视,http://marcvision.xyz:8000/rtp/238.1.78.168:7216
-湖北卫视,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.95:5146
-湖北卫视,http://www.syy3.top:3861/rtp/239.77.0.95:5146
-湖北卫视,http://alist.guangyuan.site:8188/rtp/239.77.0.95:5146
-湖北卫视,http://www.marcvision.xyz:8000/rtp/238.1.78.168:7216
-湖北卫视,http://esxi.juzhijian.com:8822/rtp/239.16.20.87:10870
-湖北卫视,http://0000505.xyz:8888/rtp/239.76.246.193:1234
-湖北卫视,http://0000505.xyz:8888/rtp/239.76.253.193:9000
-湖北卫视,http://sdray.gicp.net:8822/rtp/239.16.20.87:10870
-湖北卫视,http://nas.yzzdxc.cn:16666/rtp/239.37.0.040:5540
-湖北卫视,http://www.yyf1991.top:9999/rtp/233.18.204.92:5140
-湖北卫视,http://xu3791vg3503.vicp.fun:8808/rtp/239.254.96.115:8664
-湖北卫视,http://server.juzhijian.com:8822/rtp/239.16.20.87:10870
-湖北卫视,http://zhangkx717.cn:9999/rtp/239.254.96.115:8664
-湖北卫视,http://a.xiongnas.top:8888/rtp/239.3.1.138:8044
-湖北卫视,http://nas.iszbd.com:4022/rtp/225.0.4.217:7980
-湖北卫视,http://www.rongrong.me:14022/rtp/233.18.204.92:5140
-湖北卫视,http://wmh.wmh.ink:6633/rtp/239.77.0.95:5146
-
-江西卫视,http://emby.xlangnan.cn:10316/rtp/239.254.201.12:6290
-江西卫视,http://wangfei.uno:9999/rtp/225.1.2.77:11602
-江西卫视,http://b.xiongnas.top:8888/rtp/239.3.1.123:8164
-江西卫视,http://www.sclvip.top:5566/rtp/239.49.8.111:8000
-江西卫视,http://youngx.top:4022/rtp/233.18.204.95:5140
-江西卫视,http://home.scanflove.com:7788/rtp/235.254.198.29:1392
-江西卫视,http://www.maomizi.cn:9530/rtp/239.77.1.219:5146
-江西卫视,http://liuwenxiaokevin.top:14044/rtp/233.18.204.95:5140
-江西卫视,http://hongzhijiaoyu.net:8188/rtp/239.77.1.219:5146
-江西卫视,http://www.negative.top:50000/rtp/233.50.201.145:5140
-江西卫视,http://nas.lyfkai.cn:19999/rtp/239.69.1.126:10394
-江西卫视,http://pr.19760929.xyz:9688/rtp/239.77.1.219:5146
-江西卫视,http://www.wjyu.top:4022/rtp/233.18.204.95:5140
-江西卫视,http://vp.maomizi.cc:9530/rtp/239.77.1.219:5146
-江西卫视,http://ds3622.guangyuan.site:8188/rtp/239.77.1.219:5146
-江西卫视,http://lbyjlt.vv5678.cn:8880/rtp/239.77.1.219:5146
-江西卫视,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.77:11602
-江西卫视,http://marcvision.xyz:8000/rtp/238.1.78.26:6136
-江西卫视,http://www.hongzhijiaoyu.net:8188/rtp/239.77.1.219:5146
-江西卫视,http://www.syy3.top:3861/rtp/239.77.1.219:5146
-江西卫视,http://alist.guangyuan.site:8188/rtp/239.77.1.219:5146
-江西卫视,http://www.marcvision.xyz:8000/rtp/238.1.78.26:6136
-江西卫视,http://esxi.juzhijian.com:8822/rtp/239.16.20.89:10890
-江西卫视,http://0000505.xyz:8888/rtp/239.76.245.225:1234
-江西卫视,http://sdray.gicp.net:8822/rtp/239.16.20.89:10890
-江西卫视,http://www.yyf1991.top:9999/rtp/233.18.204.95:5140
-江西卫视,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.126:10394
-江西卫视,http://server.juzhijian.com:8822/rtp/239.16.20.89:10890
-江西卫视,http://zhangkx717.cn:9999/rtp/239.69.1.126:10394
-江西卫视,http://a.xiongnas.top:8888/rtp/239.3.1.123:8164
-江西卫视,http://nas.iszbd.com:4022/rtp/225.0.4.203:7980
-江西卫视,http://www.rongrong.me:14022/rtp/233.18.204.95:5140
-江西卫视,http://wmh.wmh.ink:6633/rtp/239.77.1.219:5146
-
-四川卫视,http://emby.xlangnan.cn:10316/rtp/239.254.200.202:6325
-四川卫视,http://wangfei.uno:9999/rtp/225.1.2.108:11626
-四川卫视,http://b.xiongnas.top:8888/rtp/239.3.1.29:8288
-四川卫视,http://www.sclvip.top:5566/rtp/239.49.8.110:8000
-四川卫视,http://home.scanflove.com:7788/rtp/235.254.198.175:7980
-四川卫视,http://www.maomizi.cn:9530/rtp/239.77.0.159:5146
-四川卫视,http://z.d4p.cn:8000/rtp/239.49.8.110:8000
-四川卫视,http://hongzhijiaoyu.net:8188/rtp/239.77.0.159:5146
-四川卫视,http://www.negative.top:50000/rtp/233.50.201.139:5140
-四川卫视,http://nas.lyfkai.cn:19999/rtp/239.69.1.169:10650
-四川卫视,http://pr.19760929.xyz:9688/rtp/239.77.0.159:5146
-四川卫视,http://vp.maomizi.cc:9530/rtp/239.77.0.159:5146
-四川卫视,http://ds3622.guangyuan.site:8188/rtp/239.77.0.159:5146
-四川卫视,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.159:5146
-四川卫视,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.108:11626
-四川卫视,http://marcvision.xyz:8000/rtp/238.1.78.30:6168
-四川卫视,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.159:5146
-四川卫视,http://www.syy3.top:3861/rtp/239.77.0.159:5146
-四川卫视,http://alist.guangyuan.site:8188/rtp/239.77.0.159:5146
-四川卫视,http://www.marcvision.xyz:8000/rtp/238.1.78.30:6168
-四川卫视,http://esxi.juzhijian.com:8822/rtp/239.16.20.86:10860
-四川卫视,http://0000505.xyz:8888/rtp/239.76.253.91:9000
-四川卫视,http://0000505.xyz:8888/rtp/239.76.246.91:1234
-四川卫视,http://sdray.gicp.net:8822/rtp/239.16.20.86:10860
-四川卫视,http://nas.yzzdxc.cn:16666/rtp/239.37.0.041:5540
-四川卫视,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.169:10650
-四川卫视,http://server.juzhijian.com:8822/rtp/239.16.20.86:10860
-四川卫视,http://zhangkx717.cn:9999/rtp/239.69.1.169:10650
-四川卫视,http://a.xiongnas.top:8888/rtp/239.3.1.29:8288
-四川卫视,http://nas.iszbd.com:4022/rtp/225.0.4.204:7980
-四川卫视,http://wmh.wmh.ink:6633/rtp/239.77.0.159:5146
-四川卫视,http://x1x.bid:5146/rtp/239.3.1.29:8288
-四川卫视,http://iptv.xxika.net:8188/rtp/239.77.0.159:5146
-四川卫视,http://www.taoli.website:23234/rtp/239.3.1.29:8288
-四川卫视,http://yanshifen.top:8889/rtp/239.77.0.159:5146
-
-重庆卫视,http://emby.xlangnan.cn:10316/rtp/239.254.200.203:6323
-重庆卫视,http://wangfei.uno:9999/rtp/225.1.2.75:11590
-重庆卫视,http://hiliu.myds.me:18088/rtp/239.69.1.149:10530
-重庆卫视,http://b.xiongnas.top:8888/rtp/239.3.1.122:8160
-重庆卫视,http://www.sclvip.top:5566/rtp/239.49.8.57:9830
-重庆卫视,http://youngx.top:4022/rtp/233.18.204.100:5140
-
-
-
-
-
-
-央卫频道3,#genre#
-CCTV1,http://39.165.39.49:19901/tsfile/live/1001_1.m3u8?key=txiptv&playlive=0&authid=0
-CCTV2,http://39.165.39.49:19901/tsfile/live/1002_1.m3u8?key=txiptv&playlive=0&authid=0
-CCTV3,http://39.165.39.49:19901/tsfile/live/1003_1.m3u8?key=txiptv&playlive=0&authid=0
-CCTV4,http://39.165.39.49:19901/tsfile/live/1004_1.m3u8?key=txiptv&playlive=0&authid=0
-CCTV5,http://39.165.39.49:19901/tsfile/live/1005_1.m3u8?key=txiptv&playlive=0&authid=0
-CCTV6,http://39.165.39.49:19901/tsfile/live/1006_1.m3u8?key=txiptv&playlive=0&authid=0
-CCTV7,http://39.165.39.49:19901/tsfile/live/1007_1.m3u8?key=txiptv&playlive=0&authid=0
-CCTV8,http://39.165.39.49:19901/tsfile/live/1008_1.m3u8?key=txiptv&playlive=0&authid=0
-CCTV9,http://39.165.39.49:19901/tsfile/live/1009_1.m3u8?key=txiptv&playlive=0&authid=0
-CCTV10,http://39.165.39.49:19901/tsfile/live/1010_1.m3u8?key=txiptv&playlive=0&authid=0
-CCTV11,http://39.165.39.49:19901/tsfile/live/1011_1.m3u8?key=txiptv&playlive=0&authid=0
-CCTV12,http://39.165.39.49:19901/tsfile/live/1000_1.m3u8?key=txiptv&playlive=0&authid=0
-CCTV13,http://39.165.39.49:19901/tsfile/live/1084_1.m3u8?key=txiptv&playlive=0&authid=0
-CCTV14,http://39.165.39.49:19901/tsfile/live/1085_1.m3u8?key=txiptv&playlive=0&authid=0
-CCTV15,http://39.165.39.49:19901/tsfile/live/1086_1.m3u8?key=txiptv&playlive=0&authid=0
-CCTV17,http://39.165.39.49:19901/tsfile/live/1088_1.m3u8?key=txiptv&playlive=0&authid=0
-CCTV5+,http://39.165.39.49:19901/tsfile/live/1089_1.m3u8?key=txiptv&playlive=0&authid=0
-中国教育,http://39.165.39.49:19901/tsfile/live/1090_1.m3u8?key=txiptv&playlive=0&authid=0
-河南卫视,http://39.165.39.49:19901/tsfile/live/1105_1.m3u8?key=txiptv&playlive=0&authid=0
-浙江卫视,http://39.165.39.49:19901/tsfile/live/1127_1.m3u8?key=txiptv&playlive=0&authid=0
-东方卫视,http://39.165.39.49:19901/tsfile/live/1128_1.m3u8?key=txiptv&playlive=0&authid=0
-江苏卫视,http://39.165.39.49:19901/tsfile/live/1129_1.m3u8?key=txiptv&playlive=0&authid=0
-北京卫视,http://39.165.39.49:19901/tsfile/live/1130_1.m3u8?key=txiptv&playlive=0&authid=0
-广东卫视,http://39.165.39.49:19901/tsfile/live/1131_1.m3u8?key=txiptv&playlive=0&authid=0
-山东卫视,http://39.165.39.49:19901/tsfile/live/1133_1.m3u8?key=txiptv&playlive=0&authid=0
-安徽卫视,http://39.165.39.49:19901/tsfile/live/1134_1.m3u8?key=txiptv&playlive=0&authid=0
-湖南卫视,http://39.165.39.49:19901/tsfile/live/1140_1.m3u8?key=txiptv&playlive=0&authid=0
-深圳卫视,http://39.165.39.49:19901/tsfile/live/1141_1.m3u8?key=txiptv&playlive=0&authid=0
-湖北卫视,http://39.165.39.49:19901/tsfile/live/1143_1.m3u8?key=txiptv&playlive=0&authid=0
-东南卫视,http://39.165.39.49:19901/tsfile/live/1149_1.m3u8?key=txiptv&playlive=0&authid=0
-金鹰卡通,http://39.165.39.49:19901/tsfile/live/1156_1.m3u8?key=txiptv&playlive=0&authid=0
-嘉佳卡通,http://39.165.39.49:19901/tsfile/live/1157_1.m3u8?key=txiptv&playlive=0&authid=0
-卡酷动画,http://39.165.39.49:19901/tsfile/live/1158_1.m3u8?key=txiptv&playlive=0&authid=0
-炫动卡通,http://39.165.39.49:19901/tsfile/live/1159_1.m3u8?key=txiptv&playlive=0&authid=0
-优漫卡通,http://39.165.39.49:19901/tsfile/live/1092_1.m3u8?key=txiptv&playlive=0&authid=0
-文体旅游,http://39.165.39.49:19901/tsfile/live/1094_1.m3u8?key=txiptv&playlive=0&authid=0
-
-
-
-
-
咪咕标清,#genre#
CCTV-01咪咕,http://rihou.cc:555/tv/[mg]CCTV-01
CCTV-02咪咕,http://rihou.cc:555/tv/[mg]CCTV-02
@@ -1314,138 +109,6 @@ CGTN-法咪咕,http://rihou.cc:555/tv/[mg]CGTN-法
-咪咕标清2,#genre#
-CCTV1综合,http://wfenf.x3322.net:7788/608807420
-CCTV2财经,http://wfenf.x3322.net:7788/631780532
-CCTV3综艺,http://wfenf.x3322.net:7788/624878271
-CCTV4中文国际,http://wfenf.x3322.net:7788/631780421
-CCTV5体育,http://wfenf.x3322.net:7788/641886683
-CCTV5+体育赛事,http://wfenf.x3322.net:7788/641886773
-CCTV6电影,http://wfenf.x3322.net:7788/624878396
-CCTV7国防军事,http://wfenf.x3322.net:7788/673168121
-CCTV8电视剧,http://wfenf.x3322.net:7788/624878356
-CCTV9纪录,http://wfenf.x3322.net:7788/673168140
-CCTV10科教,http://wfenf.x3322.net:7788/624878405
-CCTV11戏曲,http://wfenf.x3322.net:7788/667987558
-CCTV12社会与法,http://wfenf.x3322.net:7788/673168185
-CCTV13新闻,http://wfenf.x3322.net:7788/608807423
-CCTV14少儿,http://wfenf.x3322.net:7788/624878440
-CCTV15音乐,http://wfenf.x3322.net:7788/673168223
-CCTV17农业农村,http://wfenf.x3322.net:7788/673168256
-CCTV4欧洲,http://wfenf.x3322.net:7788/608807419
-CCTV4美洲,http://wfenf.x3322.net:7788/608807416
-CGTN外语纪录,http://wfenf.x3322.net:7788/609006487
-CGTN阿拉伯语,http://wfenf.x3322.net:7788/609154345
-CGTN西班牙语,http://wfenf.x3322.net:7788/609006450
-CGTN法语,http://wfenf.x3322.net:7788/609006476
-CGTN俄语,http://wfenf.x3322.net:7788/609006446
-老故事,http://wfenf.x3322.net:7788/884121956
-发现之旅,http://wfenf.x3322.net:7788/624878970
-中学生,http://wfenf.x3322.net:7788/708869532
-CGTN,http://wfenf.x3322.net:7788/609017205
-
-东方卫视,http://wfenf.x3322.net:7788/651632648
-江苏卫视,http://wfenf.x3322.net:7788/623899368
-广东卫视,http://wfenf.x3322.net:7788/608831231
-北京卫视,http://wfenf.x3322.net:7788/630287636
-辽宁卫视,http://wfenf.x3322.net:7788/630291707
-河北卫视,http://wfenf.x3322.net:7788/962042070
-江西卫视,http://wfenf.x3322.net:7788/783847495
-河南卫视,http://wfenf.x3322.net:7788/790187291
-陕西卫视,http://wfenf.x3322.net:7788/738910838
-大湾区卫视,http://wfenf.x3322.net:7788/608917627
-湖北卫视,http://wfenf.x3322.net:7788/947472496
-吉林卫视,http://wfenf.x3322.net:7788/947472500
-青海卫视,http://wfenf.x3322.net:7788/947472506
-东南卫视,http://wfenf.x3322.net:7788/849116810
-海南卫视,http://wfenf.x3322.net:7788/947472502
-海峡卫视,http://wfenf.x3322.net:7788/849119120
-中国农林卫视,http://wfenf.x3322.net:7788/956904896
-兵团卫视,http://wfenf.x3322.net:7788/956923145
-宁夏卫视,http://wfenf.x3322.net:7788/738910535
-重庆卫视,http://wfenf.x3322.net:7788/738910914
-三沙卫视,http://wfenf.x3322.net:7788/961023778
-
-上海新闻综合,http://wfenf.x3322.net:7788/651632657
-上视东方影视,http://wfenf.x3322.net:7788/617290047
-上海第一财经,http://wfenf.x3322.net:7788/608780988
-南京新闻综合频道,http://wfenf.x3322.net:7788/838109047
-南京教科频道,http://wfenf.x3322.net:7788/838153729
-南京十八频道,http://wfenf.x3322.net:7788/838151753
-体育休闲频道,http://wfenf.x3322.net:7788/626064707
-江苏城市频道,http://wfenf.x3322.net:7788/626064714
-江苏国际,http://wfenf.x3322.net:7788/626064674
-江苏教育,http://wfenf.x3322.net:7788/628008321
-江苏影视频道,http://wfenf.x3322.net:7788/626064697
-江苏综艺频道,http://wfenf.x3322.net:7788/626065193
-公共新闻频道,http://wfenf.x3322.net:7788/626064693
-盐城新闻综合,http://wfenf.x3322.net:7788/639731825
-淮安新闻综合,http://wfenf.x3322.net:7788/639731826
-泰州新闻综合,http://wfenf.x3322.net:7788/639731818
-连云港新闻综合,http://wfenf.x3322.net:7788/639731715
-宿迁新闻综合,http://wfenf.x3322.net:7788/639731832
-徐州新闻综合,http://wfenf.x3322.net:7788/639731747
-优漫卡通频道,http://wfenf.x3322.net:7788/626064703
-江阴新闻综合,http://wfenf.x3322.net:7788/955227979
-南通新闻综合,http://wfenf.x3322.net:7788/955227985
-宜兴新闻综合,http://wfenf.x3322.net:7788/955227996
-溧水新闻综合,http://wfenf.x3322.net:7788/639737327
-陕西银龄频道,http://wfenf.x3322.net:7788/956909362
-陕西都市青春频道,http://wfenf.x3322.net:7788/956909358
-陕西秦腔频道,http://wfenf.x3322.net:7788/956909303
-陕西新闻资讯频道,http://wfenf.x3322.net:7788/956909289
-财富天下,http://wfenf.x3322.net:7788/956923159
-镇江新闻综合,http://wfenf.x3322.net:7788/639731783
-海南广播电视总台新闻频道,http://wfenf.x3322.net:7788/962067517
-海南广播电视总台自贸频道,http://wfenf.x3322.net:7788/962045226
-海南广播电视总台社会与法频道,http://wfenf.x3322.net:7788/962045223
-海南广播电视总台文旅频道,http://wfenf.x3322.net:7788/962067526
-海南广播电视总台少儿频道,http://wfenf.x3322.net:7788/962067523
-
-赛事最经典,http://wfenf.x3322.net:7788/646596895
-体坛名栏汇,http://wfenf.x3322.net:7788/629943305
-四海钓鱼,http://wfenf.x3322.net:7788/637444975
-陕西体育休闲频道,http://wfenf.x3322.net:7788/956909356
-24小时城市联赛轮播台,http://wfenf.x3322.net:7788/915512915
-武术世界,http://wfenf.x3322.net:7788/958475359
-快乐垂钓,http://wfenf.x3322.net:7788/961930263
-建党105周年巡礼,http://wfenf.x3322.net:7788/713600957
-经典香港电影,http://wfenf.x3322.net:7788/625703337
-新片放映厅,http://wfenf.x3322.net:7788/619495952
-CHC影迷电影,http://wfenf.x3322.net:7788/952383261
-CHC动作电影,http://wfenf.x3322.net:7788/644368714
-CHC家庭影院,http://wfenf.x3322.net:7788/644368373
-和美乡途轮播台,http://wfenf.x3322.net:7788/713591450
-南方影视,http://wfenf.x3322.net:7788/614961829
-中国天气,http://wfenf.x3322.net:7788/959986621
-CETV1,http://wfenf.x3322.net:7788/923287154
-CETV2,http://wfenf.x3322.net:7788/923287211
-CETV4,http://wfenf.x3322.net:7788/923287339
-山东教育,http://wfenf.x3322.net:7788/609154353
-熊猫频道01高清,http://wfenf.x3322.net:7788/609158151
-熊猫频道1,http://wfenf.x3322.net:7788/608933610
-熊猫频道2,http://wfenf.x3322.net:7788/608933640
-熊猫频道3,http://wfenf.x3322.net:7788/608934619
-熊猫频道4,http://wfenf.x3322.net:7788/608934721
-熊猫频道5,http://wfenf.x3322.net:7788/608935104
-熊猫频道6,http://wfenf.x3322.net:7788/608935797
-熊猫频道7,http://wfenf.x3322.net:7788/609169286
-熊猫频道8,http://wfenf.x3322.net:7788/609169287
-熊猫频道9,http://wfenf.x3322.net:7788/609169226
-熊猫频道10,http://wfenf.x3322.net:7788/609169285
-最强综艺趴,http://wfenf.x3322.net:7788/629942228
-嘉佳卡通,http://wfenf.x3322.net:7788/614952364
-经典动画大集合,http://wfenf.x3322.net:7788/629942219
-新动漫,http://wfenf.x3322.net:7788/961930269
-新动力量创一流,http://wfenf.x3322.net:7788/713589837
-中华特产,http://wfenf.x3322.net:7788/959986618
-环球旅游,http://wfenf.x3322.net:7788/958475356
-
-
-
-
-
-
央卫视频,#genre#
CCTV-1HD,http://38.75.136.137:98/gslb/dsdqpub/cctv1hd.m3u8?auth=testpub
diff --git a/cpu_iy3/lib/jd4k.js b/cpu_iy3/lib/jd4k.js
new file mode 100644
index 00000000..b251c368
--- /dev/null
+++ b/cpu_iy3/lib/jd4k.js
@@ -0,0 +1,1729 @@
+const _0x24a000 = _0x3bf3;
+(function (_0x4af1bf, _0x354faf) {
+ const _0x10067b = _0x3bf3, _0x4787fe = _0x4af1bf();
+ while (!![]) {
+ try {
+ const _0x4356d7 = -parseInt(_0x10067b(0x35d)) / (0x869 * -0x1 + -0x2509 * 0x1 + 0x2d73) * (parseInt(_0x10067b(0x24d)) / (0x112 * 0xe + -0x1d * 0x89 + 0x8b * 0x1)) + -parseInt(_0x10067b(0x3bd)) / (0x3f * -0x5e + 0x1596 + 0x18f) + -parseInt(_0x10067b(0x2f5)) / (0x22aa + -0x255e + -0x57 * -0x8) * (parseInt(_0x10067b(0x1e5)) / (0x1c5d + 0x769 + -0x23c1)) + -parseInt(_0x10067b(0x3c1)) / (0x1 * -0xcff + -0x1e62 + -0x29 * -0x10f) * (parseInt(_0x10067b(0x3ad)) / (0x1b46 * -0x1 + 0xf85 + 0xbc8)) + -parseInt(_0x10067b(0x34a)) / (-0x2576 + -0x1f4d + -0x44cb * -0x1) * (-parseInt(_0x10067b(0x295)) / (-0x2 * 0x7d1 + 0x1 * 0x13d5 + 0x1 * -0x42a)) + parseInt(_0x10067b(0x246)) / (0x43 * 0x59 + -0x2638 + 0x1 * 0xef7) + -parseInt(_0x10067b(0x234)) / (0x2 * 0x11dc + -0x1e02 + 0x1 * -0x5ab) * (-parseInt(_0x10067b(0x21f)) / (0x1 * -0xa75 + 0x119 * 0x15 + -0xc8c));
+ if (_0x4356d7 === _0x354faf)
+ break;
+ else
+ _0x4787fe['push'](_0x4787fe['shift']());
+ } catch (_0x531b5c) {
+ _0x4787fe['push'](_0x4787fe['shift']());
+ }
+ }
+}(_0x30bd, -0x1 * -0x192eb + -0xa95 * -0x1a7 + -0x7b329));
+import {
+ Crypto,
+ _
+} from 'assets://js/lib/cat.js';
+let host = '', header = { 'User-Agent': _0x24a000(0x269) + _0x24a000(0x2e1) }, siteKey = '', siteType = '', siteJx = '';
+const urlPattern1 = /api\.php\/.*?\/vod/, urlPattern2 = /api\.php\/.+?\.vod/, parsePattern = /\/.+\\?.+=/, parsePattern1 = /.*(url|v|vid|php\?id)=/, parsePattern2 = /https?:\/\/[^\/]*/, htmlVideoKeyMatch = [
+ /player=new/,
+ /
_0x50fda5;
+ },
+ 'AEWJN': function (_0x34e794, _0x24610e, _0x529315, _0x31bacd) {
+ return _0x34e794(_0x24610e, _0x529315, _0x31bacd);
+ },
+ 'Knznh': function (_0x4f4e7d, _0x5a0aac) {
+ return _0x4f4e7d !== _0x5a0aac;
+ },
+ 'ViinS': function (_0x595f7e, _0x159136) {
+ return _0x595f7e(_0x159136);
+ }
+ };
+ try {
+ let _0xabb5ea = siteJx[_0x314f8e];
+ !_0xabb5ea && (siteJx[_0x5ed43f(0x3b3) + _0x5ed43f(0x2f2)]('*') ? _0xabb5ea = siteJx['*'] : _0xabb5ea = []);
+ _0x46895d[_0x5ed43f(0x28d)](_0xabb5ea[_0x5ed43f(0x2d3)], 0x6 * -0x2c7 + 0xf * -0x1a5 + 0xdc7 * 0x3) && (_0xabb5ea = [_0x46895d[_0x5ed43f(0x27e)]]);
+ if (_0x46895d[_0x5ed43f(0x24b)](_0xabb5ea[_0x5ed43f(0x2d3)], -0xf * 0x73 + 0x13df + -0xd22 * 0x1)) {
+ const _0xc1b189 = await _0x46895d[_0x5ed43f(0x285)](getFinalVideo, _0x314f8e, _0xabb5ea, _0x533915);
+ if (_0x46895d[_0x5ed43f(0x3c2)](_0xc1b189, null))
+ return JSON[_0x5ed43f(0x3a2)](_0xc1b189);
+ }
+ if (_0x46895d[_0x5ed43f(0x334)](isVideoFormat, _0x533915)) {
+ const _0x2016c3 = {
+ 'parse': 0x1,
+ 'playUrl': '',
+ 'url': _0x533915
+ };
+ return JSON[_0x5ed43f(0x3a2)](_0x2016c3);
+ } else {
+ const _0x59b4d5 = {
+ 'parse': 0x1,
+ 'jx': '1',
+ 'url': _0x533915
+ };
+ return JSON[_0x5ed43f(0x3a2)](_0x59b4d5);
+ }
+ } catch (_0x15f170) {
+ SpiderDebug[_0x5ed43f(0x24a)](_0x15f170);
+ }
+ return '';
+}
+async function search(_0x15b8fa, _0x588e3d) {
+ const _0xc070a9 = _0x24a000, _0x24ff97 = {
+ 'rAAqR': _0xc070a9(0x288),
+ 'gHEas': _0xc070a9(0x2cf) + 'od',
+ 'PPjsc': function (_0x4c022d, _0x4ebd2b) {
+ return _0x4c022d(_0x4ebd2b);
+ },
+ 'nAAlp': function (_0x1196f9, _0x523142, _0x215206) {
+ return _0x1196f9(_0x523142, _0x215206);
+ },
+ 'Yoody': function (_0x40a0f3, _0x527133, _0x5f956b) {
+ return _0x40a0f3(_0x527133, _0x5f956b);
+ },
+ 'Qzbyi': function (_0xf70d91, _0x5d6ade) {
+ return _0xf70d91(_0x5d6ade);
+ },
+ 'AhyMI': function (_0x42d25e, _0x371898) {
+ return _0x42d25e instanceof _0x371898;
+ },
+ 'raJIH': function (_0x2a22fd, _0x2de3f5) {
+ return _0x2a22fd instanceof _0x2de3f5;
+ },
+ 'bfaLF': function (_0x8207e7, _0x21fb6c) {
+ return _0x8207e7 !== _0x21fb6c;
+ }
+ };
+ try {
+ if (host[_0xc070a9(0x39f)](_0x24ff97[_0xc070a9(0x26f)]) || host[_0xc070a9(0x39f)](_0x24ff97[_0xc070a9(0x28c)])) {
+ const _0x26ec58 = host + (_0xc070a9(0x324) + _0xc070a9(0x28e)) + _0x24ff97[_0xc070a9(0x294)](encodeURIComponent, _0x15b8fa) + _0xc070a9(0x237), _0x1c1ca8 = await _0x24ff97[_0xc070a9(0x247)](request, _0x26ec58, _0x24ff97[_0xc070a9(0x294)](getHeaders, _0x26ec58)), _0xc6c488 = JSON[_0xc070a9(0x213)](_0x1c1ca8), _0x1ead5c = [];
+ if (_0xc6c488[_0xc070a9(0x394)] && Array[_0xc070a9(0x315)](_0xc6c488[_0xc070a9(0x394)]))
+ for (const _0x284ed3 of _0xc6c488[_0xc070a9(0x394)]) {
+ _0x1ead5c[_0xc070a9(0x332)]({
+ 'vod_id': _0x284ed3[_0xc070a9(0x3c3)],
+ 'vod_name': _0x284ed3[_0xc070a9(0x2b8)],
+ 'vod_pic': _0x284ed3[_0xc070a9(0x290)] || '',
+ 'vod_remarks': _0x284ed3[_0xc070a9(0x346) + 's'] || ''
+ });
+ }
+ return JSON[_0xc070a9(0x3a2)]({ 'list': _0x1ead5c });
+ } else {
+ const _0x4c1fc9 = host, _0x3631b2 = _0x24ff97[_0xc070a9(0x247)](getSearchUrl, _0x4c1fc9, _0x24ff97[_0xc070a9(0x294)](encodeURIComponent, _0x15b8fa)), _0x15e390 = await _0x24ff97[_0xc070a9(0x369)](request, _0x3631b2, _0x24ff97[_0xc070a9(0x2a1)](getHeaders, _0x3631b2)), _0x59d1cc = JSON[_0xc070a9(0x213)](_0x15e390);
+ let _0x136112 = null;
+ const _0x1337a6 = [];
+ if (_0x24ff97[_0xc070a9(0x3ac)](_0x59d1cc[_0xc070a9(0x394)], Array))
+ _0x136112 = _0x59d1cc[_0xc070a9(0x394)];
+ else {
+ if (_0x24ff97[_0xc070a9(0x2bc)](_0x59d1cc[_0xc070a9(0x339)], Object) && _0x24ff97[_0xc070a9(0x3ac)](_0x59d1cc[_0xc070a9(0x339)][_0xc070a9(0x394)], Array))
+ _0x136112 = _0x59d1cc[_0xc070a9(0x339)][_0xc070a9(0x394)];
+ else
+ _0x24ff97[_0xc070a9(0x2bc)](_0x59d1cc[_0xc070a9(0x339)], Array) && (_0x136112 = _0x59d1cc[_0xc070a9(0x339)]);
+ }
+ if (_0x24ff97[_0xc070a9(0x2ee)](_0x136112, null))
+ for (const _0x152e86 of _0x136112) {
+ if (_0x152e86[_0xc070a9(0x3c3)]) {
+ const _0x49ee8a = {
+ 'vod_id': _0x152e86[_0xc070a9(0x3c3)],
+ 'vod_name': _0x152e86[_0xc070a9(0x2b8)],
+ 'vod_pic': _0x152e86[_0xc070a9(0x290)],
+ 'vod_remarks': _0x152e86[_0xc070a9(0x346) + 's']
+ };
+ _0x1337a6[_0xc070a9(0x332)](_0x49ee8a);
+ } else {
+ const _0x467d07 = {
+ 'vod_id': _0x152e86[_0xc070a9(0x3b6)],
+ 'vod_name': _0x152e86[_0xc070a9(0x1e9)],
+ 'vod_pic': _0x152e86[_0xc070a9(0x3ba)],
+ 'vod_remarks': _0x152e86[_0xc070a9(0x258)]
+ };
+ _0x1337a6[_0xc070a9(0x332)](_0x467d07);
+ }
+ }
+ const _0x1e4c19 = { 'list': _0x1337a6 };
+ return JSON[_0xc070a9(0x3a2)](_0x1e4c19);
+ }
+ } catch (_0x334adf) {
+ SpiderDebug[_0xc070a9(0x24a)](_0x334adf);
+ }
+ return '';
+}
+async function getFinalVideo(_0x356707, _0x398327, _0x2ef122) {
+ const _0x12dc27 = _0x24a000, _0x44bf01 = {
+ 'KPgHF': function (_0x55b24f, _0x2ecff3) {
+ return _0x55b24f === _0x2ecff3;
+ },
+ 'WCCoT': function (_0x2ce219, _0x446505) {
+ return _0x2ce219 === _0x446505;
+ },
+ 'QIbLN': _0x12dc27(0x1fb),
+ 'XjiyL': function (_0x451dd4, _0x2b6510) {
+ return _0x451dd4 + _0x2b6510;
+ },
+ 'eFJbi': function (_0xe7aa93, _0x51184b, _0x539572, _0x540f7d) {
+ return _0xe7aa93(_0x51184b, _0x539572, _0x540f7d);
+ },
+ 'cchWu': function (_0x5d7821, _0x2a0a3c, _0x143221) {
+ return _0x5d7821(_0x2a0a3c, _0x143221);
+ },
+ 'emPiw': function (_0x242abc, _0x178c18) {
+ return _0x242abc !== _0x178c18;
+ },
+ 'HHlAe': _0x12dc27(0x366),
+ 'snexY': _0x12dc27(0x2e3),
+ 'oRses': _0x12dc27(0x352)
+ };
+ let _0xcd3790 = '';
+ for (const _0x5cb301 of _0x398327) {
+ if (_0x44bf01[_0x12dc27(0x200)](_0x5cb301, '') || _0x44bf01[_0x12dc27(0x205)](_0x5cb301, _0x44bf01[_0x12dc27(0x2a5)]))
+ continue;
+ const _0x2f83f6 = _0x44bf01[_0x12dc27(0x30c)](_0x5cb301, _0x2ef122), _0x4b7b47 = await _0x44bf01[_0x12dc27(0x219)](request, _0x2f83f6, null, -0x3 * 0x13f + -0x1 * 0x4d12 + 0x243 * 0x35);
+ let _0x5e80c0 = null;
+ try {
+ _0x5e80c0 = _0x44bf01[_0x12dc27(0x2c1)](jsonParse, _0x2ef122, _0x4b7b47);
+ } catch (_0x684857) {
+ }
+ if (_0x44bf01[_0x12dc27(0x2a3)](_0x5e80c0, null) && _0x5e80c0[_0x12dc27(0x3b3) + _0x12dc27(0x2f2)](_0x44bf01[_0x12dc27(0x364)]) && _0x5e80c0[_0x12dc27(0x3b3) + _0x12dc27(0x2f2)](_0x44bf01[_0x12dc27(0x3a7)]))
+ return _0x5e80c0[_0x12dc27(0x2e3)] = JSON[_0x12dc27(0x3a2)](_0x5e80c0[_0x12dc27(0x2e3)]), _0x5e80c0;
+ if (_0x4b7b47[_0x12dc27(0x39f)](_0x44bf01[_0x12dc27(0x2df)])) {
+ let _0x259a20 = ![];
+ for (const _0x4410e4 of htmlVideoKeyMatch) {
+ if (_0x4410e4[_0x12dc27(0x36e)](_0x4b7b47)) {
+ _0x259a20 = !![];
+ break;
+ }
+ }
+ _0x259a20 && (_0xcd3790 = _0x5cb301);
+ }
+ }
+ if (_0x44bf01[_0x12dc27(0x2a3)](_0xcd3790, '')) {
+ const _0x425204 = {
+ 'parse': 0x0,
+ 'playUrl': '',
+ 'url': _0x2ef122
+ };
+ return JSON[_0x12dc27(0x3a2)](_0x425204);
+ }
+ return null;
+}
+function genPlayList(_0x2a68f0, _0x17eead, _0x2951b7, _0x47b9eb, _0x800257) {
+ const _0x1d5b05 = _0x24a000, _0x37e1eb = {
+ 'qFCgy': _0x1d5b05(0x288),
+ 'muyni': _0x1d5b05(0x2cf) + 'od',
+ 'VdBFp': _0x1d5b05(0x27c) + 'p',
+ 'fuavN': _0x1d5b05(0x25c),
+ 'nqoHH': _0x1d5b05(0x343),
+ 'TVfJB': function (_0x46f089, _0x2a240f) {
+ return _0x46f089 > _0x2a240f;
+ },
+ 'Xavsg': _0x1d5b05(0x2c8)
+ }, _0x15a66c = [], _0x182550 = [];
+ if (_0x2a68f0[_0x1d5b05(0x39f)](_0x37e1eb[_0x1d5b05(0x37c)]) || _0x2a68f0[_0x1d5b05(0x39f)](_0x37e1eb[_0x1d5b05(0x383)])) {
+ const _0x40de27 = _0x17eead[_0x1d5b05(0x394)] && _0x17eead[_0x1d5b05(0x394)][-0x635 + 0x50e * -0x4 + -0x8cf * -0x3] ? _0x17eead[_0x1d5b05(0x394)][0x2 * 0x901 + -0x2382 + 0x1180] : {};
+ _0x47b9eb[_0x1d5b05(0x3c3)] = _0x40de27[_0x1d5b05(0x3c3)] || _0x800257, _0x47b9eb[_0x1d5b05(0x2b8)] = _0x40de27[_0x1d5b05(0x2b8)] || '', _0x47b9eb[_0x1d5b05(0x290)] = _0x40de27[_0x1d5b05(0x290)] || '', _0x47b9eb[_0x1d5b05(0x37d)] = _0x40de27[_0x1d5b05(0x37d)] || '', _0x47b9eb[_0x1d5b05(0x32c)] = _0x40de27[_0x1d5b05(0x32c)] || '', _0x47b9eb[_0x1d5b05(0x228)] = _0x40de27[_0x1d5b05(0x228)] || '', _0x47b9eb[_0x1d5b05(0x346) + 's'] = _0x40de27[_0x1d5b05(0x346) + 's'] || '', _0x47b9eb[_0x1d5b05(0x23d)] = _0x40de27[_0x1d5b05(0x23d)] || '', _0x47b9eb[_0x1d5b05(0x2cd) + 'or'] = _0x40de27[_0x1d5b05(0x2cd) + 'or'] || '', _0x47b9eb[_0x1d5b05(0x227) + 't'] = _0x40de27[_0x1d5b05(0x227) + 't'] || '', _0x47b9eb[_0x1d5b05(0x34d) + _0x1d5b05(0x3bf)] = _0x40de27[_0x1d5b05(0x34d) + _0x1d5b05(0x3bf)] || '', _0x47b9eb[_0x1d5b05(0x3a0) + 'rl'] = _0x40de27[_0x1d5b05(0x3a0) + 'rl'] || '';
+ return;
+ }
+ if (_0x2a68f0[_0x1d5b05(0x39f)](_0x37e1eb[_0x1d5b05(0x3a8)]) || _0x2a68f0[_0x1d5b05(0x39f)](_0x37e1eb[_0x1d5b05(0x238)])) {
+ const _0x249ca8 = _0x17eead[_0x1d5b05(0x339)] || {};
+ _0x47b9eb[_0x1d5b05(0x3c3)] = _0x249ca8[_0x1d5b05(0x3c3)] || _0x800257, _0x47b9eb[_0x1d5b05(0x2b8)] = _0x249ca8[_0x1d5b05(0x2b8)] || '', _0x47b9eb[_0x1d5b05(0x290)] = _0x249ca8[_0x1d5b05(0x290)] || '', _0x47b9eb[_0x1d5b05(0x37d)] = _0x249ca8[_0x1d5b05(0x311)] || '', _0x47b9eb[_0x1d5b05(0x32c)] = _0x249ca8[_0x1d5b05(0x32c)] || '', _0x47b9eb[_0x1d5b05(0x228)] = _0x249ca8[_0x1d5b05(0x228)] || '', _0x47b9eb[_0x1d5b05(0x346) + 's'] = _0x249ca8[_0x1d5b05(0x346) + 's'] || '', _0x47b9eb[_0x1d5b05(0x23d)] = _0x249ca8[_0x1d5b05(0x23d)] || '', _0x47b9eb[_0x1d5b05(0x2cd) + 'or'] = _0x249ca8[_0x1d5b05(0x2cd) + 'or'] || '', _0x47b9eb[_0x1d5b05(0x227) + 't'] = _0x249ca8[_0x1d5b05(0x227) + 't'] || '';
+ if (_0x249ca8[_0x1d5b05(0x225) + _0x1d5b05(0x251)] && Array[_0x1d5b05(0x315)](_0x249ca8[_0x1d5b05(0x225) + _0x1d5b05(0x251)]))
+ for (const _0x39d1e3 of _0x249ca8[_0x1d5b05(0x225) + _0x1d5b05(0x251)]) {
+ let _0x2f80cc = _0x39d1e3[_0x1d5b05(0x330)]?.[_0x1d5b05(0x314)]() || _0x39d1e3[_0x1d5b05(0x214)]?.[_0x1d5b05(0x314)]() || '';
+ if (!_0x2f80cc)
+ continue;
+ _0x182550[_0x1d5b05(0x332)](_0x2f80cc), _0x15a66c[_0x1d5b05(0x332)](_0x39d1e3[_0x1d5b05(0x366)] || '');
+ if (_0x39d1e3[_0x1d5b05(0x20d)]) {
+ const _0x2ff516 = parseUrlMap[_0x1d5b05(0x24f)](_0x2f80cc) || [];
+ !_0x2ff516[_0x1d5b05(0x39f)](_0x39d1e3[_0x1d5b05(0x20d)]) && _0x2ff516[_0x1d5b05(0x332)](_0x39d1e3[_0x1d5b05(0x20d)]), parseUrlMap[_0x1d5b05(0x396)](_0x2f80cc, _0x2ff516);
+ }
+ }
+ } else {
+ if (_0x2a68f0[_0x1d5b05(0x39f)](_0x37e1eb[_0x1d5b05(0x222)])) {
+ const _0x37e2c6 = _0x17eead[_0x1d5b05(0x339)] || {};
+ _0x47b9eb[_0x1d5b05(0x3c3)] = _0x37e2c6[_0x1d5b05(0x3c3)] || _0x800257, _0x47b9eb[_0x1d5b05(0x2b8)] = _0x37e2c6[_0x1d5b05(0x2b8)] || '', _0x47b9eb[_0x1d5b05(0x290)] = _0x37e2c6[_0x1d5b05(0x290)] || '', _0x47b9eb[_0x1d5b05(0x37d)] = _0x37e2c6[_0x1d5b05(0x311)] || '', _0x47b9eb[_0x1d5b05(0x32c)] = _0x37e2c6[_0x1d5b05(0x32c)] || '', _0x47b9eb[_0x1d5b05(0x228)] = _0x37e2c6[_0x1d5b05(0x228)] || '', _0x47b9eb[_0x1d5b05(0x346) + 's'] = _0x37e2c6[_0x1d5b05(0x346) + 's'] || '', _0x47b9eb[_0x1d5b05(0x23d)] = _0x37e2c6[_0x1d5b05(0x23d)] || '', _0x47b9eb[_0x1d5b05(0x2cd) + 'or'] = _0x37e2c6[_0x1d5b05(0x2cd) + 'or'] || '', _0x47b9eb[_0x1d5b05(0x227) + 't'] = _0x37e2c6[_0x1d5b05(0x227) + 't'] || '';
+ if (_0x37e2c6[_0x1d5b05(0x2f7) + _0x1d5b05(0x3a1)] && Array[_0x1d5b05(0x315)](_0x37e2c6[_0x1d5b05(0x2f7) + _0x1d5b05(0x3a1)]))
+ for (const _0x1f9806 of _0x37e2c6[_0x1d5b05(0x2f7) + _0x1d5b05(0x3a1)]) {
+ let _0x292c57 = _0x1f9806[_0x1d5b05(0x377) + 'o']?.[_0x1d5b05(0x3cb)]?.[_0x1d5b05(0x314)]() || _0x1f9806[_0x1d5b05(0x377) + 'o']?.[_0x1d5b05(0x211)]?.[_0x1d5b05(0x314)]() || '';
+ if (!_0x292c57)
+ continue;
+ _0x182550[_0x1d5b05(0x332)](_0x292c57), _0x15a66c[_0x1d5b05(0x332)](_0x1f9806[_0x1d5b05(0x366)] || '');
+ try {
+ const _0x4a4bc9 = parseUrlMap[_0x1d5b05(0x24f)](_0x292c57) || [];
+ if (_0x1f9806[_0x1d5b05(0x377) + 'o']?.[_0x1d5b05(0x213)]) {
+ const _0x3dac95 = _0x1f9806[_0x1d5b05(0x377) + 'o'][_0x1d5b05(0x213)][_0x1d5b05(0x265)](',');
+ _0x3dac95[_0x1d5b05(0x1e6)](_0x4dc07e => {
+ const _0x404f67 = _0x1d5b05;
+ _0x4dc07e && !_0x4a4bc9[_0x404f67(0x39f)](_0x4dc07e) && _0x4a4bc9[_0x404f67(0x332)](_0x4dc07e);
+ });
+ }
+ if (_0x1f9806[_0x1d5b05(0x377) + 'o']?.[_0x1d5b05(0x32d)]) {
+ const _0x57c8f0 = _0x1f9806[_0x1d5b05(0x377) + 'o'][_0x1d5b05(0x32d)][_0x1d5b05(0x265)](',');
+ _0x57c8f0[_0x1d5b05(0x1e6)](_0x522ba3 => {
+ const _0x5f1935 = _0x1d5b05;
+ _0x522ba3 && !_0x4a4bc9[_0x5f1935(0x39f)](_0x522ba3) && _0x4a4bc9[_0x5f1935(0x332)](_0x522ba3);
+ });
+ }
+ parseUrlMap[_0x1d5b05(0x396)](_0x292c57, _0x4a4bc9);
+ } catch (_0x35c48f) {
+ SpiderDebug[_0x1d5b05(0x24a)](_0x35c48f);
+ }
+ }
+ } else {
+ if (urlPattern1[_0x1d5b05(0x36e)](_0x2a68f0)) {
+ const _0x6e5bc5 = _0x17eead[_0x1d5b05(0x394)] && _0x17eead[_0x1d5b05(0x394)][0x1448 + -0x19fc + -0x1 * -0x5b4] ? _0x17eead[_0x1d5b05(0x394)][-0x704 * -0x5 + 0x29 * -0xb5 + -0x617 * 0x1] : {};
+ _0x47b9eb[_0x1d5b05(0x3c3)] = _0x6e5bc5[_0x1d5b05(0x3c3)] || _0x800257, _0x47b9eb[_0x1d5b05(0x2b8)] = _0x6e5bc5[_0x1d5b05(0x2b8)] || '', _0x47b9eb[_0x1d5b05(0x290)] = _0x6e5bc5[_0x1d5b05(0x290)] || '', _0x47b9eb[_0x1d5b05(0x37d)] = _0x6e5bc5[_0x1d5b05(0x37d)] || '', _0x47b9eb[_0x1d5b05(0x32c)] = _0x6e5bc5[_0x1d5b05(0x32c)] || '', _0x47b9eb[_0x1d5b05(0x228)] = _0x6e5bc5[_0x1d5b05(0x228)] || '', _0x47b9eb[_0x1d5b05(0x346) + 's'] = _0x6e5bc5[_0x1d5b05(0x346) + 's'] || '', _0x47b9eb[_0x1d5b05(0x23d)] = _0x6e5bc5[_0x1d5b05(0x23d)] || '', _0x47b9eb[_0x1d5b05(0x2cd) + 'or'] = _0x6e5bc5[_0x1d5b05(0x2cd) + 'or'] || '', _0x47b9eb[_0x1d5b05(0x227) + 't'] = _0x6e5bc5[_0x1d5b05(0x227) + 't'] || '', _0x47b9eb[_0x1d5b05(0x34d) + _0x1d5b05(0x3bf)] = _0x6e5bc5[_0x1d5b05(0x34d) + _0x1d5b05(0x3bf)] || '', _0x47b9eb[_0x1d5b05(0x3a0) + 'rl'] = _0x6e5bc5[_0x1d5b05(0x3a0) + 'rl'] || '';
+ }
+ }
+ }
+ _0x37e1eb[_0x1d5b05(0x30d)](_0x182550[_0x1d5b05(0x2d3)], -0x417 * 0x9 + -0x2472 + 0x186b * 0x3) && _0x37e1eb[_0x1d5b05(0x30d)](_0x15a66c[_0x1d5b05(0x2d3)], -0x1bc * 0x15 + -0x26b8 + 0x4b24) && (_0x47b9eb[_0x1d5b05(0x34d) + _0x1d5b05(0x3bf)] = _0x182550[_0x1d5b05(0x365)](_0x37e1eb[_0x1d5b05(0x2be)]), _0x47b9eb[_0x1d5b05(0x3a0) + 'rl'] = _0x15a66c[_0x1d5b05(0x365)](_0x37e1eb[_0x1d5b05(0x2be)]));
+}
+function jsonParse(_0x2bcad8, _0x2e7bc8) {
+ const _0x4a9b6b = _0x24a000, _0x54fefc = {
+ 'glzca': _0x4a9b6b(0x339),
+ 'SXiUp': function (_0x5d899b, _0x8ff4ce) {
+ return _0x5d899b === _0x8ff4ce;
+ },
+ 'mqFNW': _0x4a9b6b(0x345),
+ 'hXQXU': _0x4a9b6b(0x366),
+ 'qaLZN': function (_0x304f89, _0x4f96a0) {
+ return _0x304f89 + _0x4f96a0;
+ },
+ 'SyFuQ': _0x4a9b6b(0x1fd),
+ 'wWTGM': _0x4a9b6b(0x292),
+ 'opiXu': function (_0x16486e, _0x45288d) {
+ return _0x16486e(_0x45288d);
+ },
+ 'GMucY': function (_0x55cf35, _0x5b1ec7, _0x56a7e3) {
+ return _0x55cf35(_0x5b1ec7, _0x56a7e3);
+ },
+ 'VVWwW': _0x4a9b6b(0x2e3),
+ 'zMWEf': _0x4a9b6b(0x310),
+ 'fuDvD': _0x4a9b6b(0x255),
+ 'AAtXX': _0x4a9b6b(0x39e),
+ 'Ojjqt': _0x4a9b6b(0x2cb),
+ 'rrjLd': _0x4a9b6b(0x261),
+ 'xjYPA': function (_0x138833, _0x134ff4) {
+ return _0x138833 > _0x134ff4;
+ },
+ 'UZCOD': _0x4a9b6b(0x2e4),
+ 'PeDZZ': _0x4a9b6b(0x287),
+ 'cCmOD': function (_0xe7c3fe, _0x6c71de) {
+ return _0xe7c3fe > _0x6c71de;
+ },
+ 'clYHp': function (_0x34da34, _0x278ac6) {
+ return _0x34da34 + _0x278ac6;
+ },
+ 'ZrFqI': function (_0x57a7fe, _0x1920c9, _0x45bdb2, _0x4ed88c) {
+ return _0x57a7fe(_0x1920c9, _0x45bdb2, _0x4ed88c);
+ }
+ };
+ try {
+ let _0x654842 = JSON[_0x4a9b6b(0x213)](_0x2e7bc8);
+ _0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x32f)]) && _0x54fefc[_0x4a9b6b(0x27d)](typeof _0x654842[_0x4a9b6b(0x339)], _0x54fefc[_0x4a9b6b(0x325)]) && !_0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x1e8)]) && (_0x654842 = _0x654842[_0x4a9b6b(0x339)]);
+ let _0x100c47 = _0x654842[_0x4a9b6b(0x366)];
+ _0x100c47[_0x4a9b6b(0x2c6)]('//') && (_0x100c47 = _0x54fefc[_0x4a9b6b(0x2eb)](_0x54fefc[_0x4a9b6b(0x245)], _0x100c47));
+ if (!_0x100c47[_0x4a9b6b(0x314)]()[_0x4a9b6b(0x2c6)](_0x54fefc[_0x4a9b6b(0x322)]))
+ return null;
+ if (_0x54fefc[_0x4a9b6b(0x27d)](_0x100c47, _0x2bcad8)) {
+ if (_0x54fefc[_0x4a9b6b(0x3b8)](isVip, _0x100c47) || !_0x54fefc[_0x4a9b6b(0x3b8)](isVideoFormat, _0x100c47))
+ return null;
+ }
+ if (_0x54fefc[_0x4a9b6b(0x22e)](isBlackVodUrl, _0x2bcad8, _0x100c47))
+ return null;
+ let _0xcda3cd = {};
+ if (_0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x224)]))
+ _0xcda3cd = _0x654842[_0x4a9b6b(0x2e3)];
+ else {
+ if (_0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x29e)]))
+ _0xcda3cd = _0x654842[_0x4a9b6b(0x310)];
+ else {
+ if (_0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x3ca)]))
+ _0xcda3cd = _0x654842[_0x4a9b6b(0x255)];
+ else
+ _0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x39a)]) && (_0xcda3cd = _0x654842[_0x4a9b6b(0x39e)]);
+ }
+ }
+ let _0x2e9070 = '';
+ if (_0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x3b9)]))
+ _0x2e9070 = _0x654842[_0x54fefc[_0x4a9b6b(0x3b9)]];
+ else
+ _0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x2a4)]) && (_0x2e9070 = _0x654842[_0x54fefc[_0x4a9b6b(0x2a4)]]);
+ _0x54fefc[_0x4a9b6b(0x25a)](_0x2e9070[_0x4a9b6b(0x314)]()[_0x4a9b6b(0x2d3)], -0x60f * 0x1 + 0x12 * -0x164 + 0x7 * 0x471) && (_0xcda3cd[_0x54fefc[_0x4a9b6b(0x2a4)]] = _0x54fefc[_0x4a9b6b(0x2eb)]('\x20', _0x2e9070));
+ let _0x530de6 = '';
+ if (_0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x297)]))
+ _0x530de6 = _0x654842[_0x4a9b6b(0x2e4)];
+ else
+ _0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x207)]) && (_0x530de6 = _0x654842[_0x4a9b6b(0x287)]);
+ _0x54fefc[_0x4a9b6b(0x281)](_0x530de6[_0x4a9b6b(0x314)]()[_0x4a9b6b(0x2d3)], 0x18ce + -0x22ae + 0x9e0) && (_0xcda3cd[_0x54fefc[_0x4a9b6b(0x207)]] = _0x54fefc[_0x4a9b6b(0x1f4)]('\x20', _0x530de6));
+ _0xcda3cd = _0x54fefc[_0x4a9b6b(0x243)](fixJsonVodHeader, _0xcda3cd, _0x2bcad8, _0x100c47);
+ const _0x27e9a5 = {
+ 'header': _0xcda3cd,
+ 'url': _0x100c47,
+ 'parse': '0'
+ };
+ return _0x27e9a5;
+ } catch (_0x174821) {
+ SpiderDebug[_0x4a9b6b(0x24a)](_0x174821);
+ }
+ return null;
+}
+function isVip(_0x12df4f) {
+ const _0x1cd01d = _0x24a000, _0x2ec382 = {
+ 'updKI': _0x1cd01d(0x2c9),
+ 'XOpkJ': _0x1cd01d(0x3a6),
+ 'iOaGQ': _0x1cd01d(0x306),
+ 'uIZrh': _0x1cd01d(0x2f6),
+ 'maOml': _0x1cd01d(0x21e),
+ 'kJixo': _0x1cd01d(0x2a6),
+ 'UgQzk': _0x1cd01d(0x31d),
+ 'zyeHF': _0x1cd01d(0x22c),
+ 'GPmSe': _0x1cd01d(0x282) + 'om',
+ 'HIEhJ': _0x1cd01d(0x318) + 'm',
+ 'SvZuD': _0x1cd01d(0x2fe),
+ 'SaoFF': function (_0x49391c, _0x475da1) {
+ return _0x49391c < _0x475da1;
+ },
+ 'dhhxf': function (_0x4f647c, _0x40da9b) {
+ return _0x4f647c === _0x40da9b;
+ },
+ 'SSpmn': _0x1cd01d(0x3c9) + 'a_',
+ 'SajNK': _0x1cd01d(0x3c9) + 'w_',
+ 'IKQGq': _0x1cd01d(0x3c9) + 'v_'
+ };
+ try {
+ let _0x59a0c5 = ![];
+ const _0x472579 = new URL(_0x12df4f)[_0x1cd01d(0x3b4)], _0x39662c = [
+ _0x2ec382[_0x1cd01d(0x21c)],
+ _0x2ec382[_0x1cd01d(0x385)],
+ _0x2ec382[_0x1cd01d(0x38b)],
+ _0x2ec382[_0x1cd01d(0x34b)],
+ _0x2ec382[_0x1cd01d(0x2c0)],
+ _0x2ec382[_0x1cd01d(0x1f8)],
+ _0x2ec382[_0x1cd01d(0x26c)],
+ _0x2ec382[_0x1cd01d(0x2c3)],
+ _0x2ec382[_0x1cd01d(0x3c7)],
+ _0x2ec382[_0x1cd01d(0x2dd)],
+ _0x2ec382[_0x1cd01d(0x391)]
+ ];
+ for (let _0x587e2f = 0x1168 * -0x1 + -0x2 * -0xffa + -0xe8c; _0x2ec382[_0x1cd01d(0x29f)](_0x587e2f, _0x39662c[_0x1cd01d(0x2d3)]); _0x587e2f++) {
+ if (_0x472579[_0x1cd01d(0x39f)](_0x39662c[_0x587e2f])) {
+ if (_0x2ec382[_0x1cd01d(0x358)](_0x39662c[_0x587e2f], _0x2ec382[_0x1cd01d(0x21c)])) {
+ if (_0x12df4f[_0x1cd01d(0x39f)](_0x2ec382[_0x1cd01d(0x267)]) || _0x12df4f[_0x1cd01d(0x39f)](_0x2ec382[_0x1cd01d(0x33a)]) || _0x12df4f[_0x1cd01d(0x39f)](_0x2ec382[_0x1cd01d(0x333)])) {
+ _0x59a0c5 = !![];
+ break;
+ }
+ } else {
+ _0x59a0c5 = !![];
+ break;
+ }
+ }
+ }
+ return _0x59a0c5;
+ } catch (_0x576cf8) {
+ SpiderDebug[_0x1cd01d(0x24a)](_0x576cf8);
+ }
+ return ![];
+}
+function isBlackVodUrl(_0x307605, _0x697c5d) {
+ const _0x4a2c61 = _0x24a000, _0x27d7bc = {
+ 'gudMv': _0x4a2c61(0x2ad),
+ 'FRrZt': _0x4a2c61(0x3be)
+ };
+ return _0x697c5d[_0x4a2c61(0x39f)](_0x27d7bc[_0x4a2c61(0x34c)]) || _0x697c5d[_0x4a2c61(0x39f)](_0x27d7bc[_0x4a2c61(0x210)]);
+}
+function fixJsonVodHeader(_0x194079, _0x3e179a, _0x56db4f) {
+ const _0x555e90 = _0x24a000, _0x3e9dd1 = {
+ 'GlESc': function (_0x2d4a85, _0x14b753) {
+ return _0x2d4a85 === _0x14b753;
+ },
+ 'dixTK': _0x555e90(0x2b1) + 'om',
+ 'owLGb': _0x555e90(0x287),
+ 'UKmVu': _0x555e90(0x261),
+ 'wLZlp': _0x555e90(0x1fe) + '.0',
+ 'yLRcH': _0x555e90(0x342),
+ 'hhBdZ': _0x555e90(0x2f4),
+ 'jIZRt': _0x555e90(0x2fb) + _0x555e90(0x2d6) + _0x555e90(0x22f),
+ 'AQtGT': function (_0x35b12f, _0x2200a0) {
+ return _0x35b12f + _0x2200a0;
+ },
+ 'tVGhB': _0x555e90(0x3b0) + _0x555e90(0x21d) + _0x555e90(0x2ae) + _0x555e90(0x26d) + _0x555e90(0x24e) + _0x555e90(0x37a) + _0x555e90(0x206) + _0x555e90(0x3c4) + _0x555e90(0x20e) + _0x555e90(0x360) + _0x555e90(0x38c) + _0x555e90(0x2e7)
+ };
+ _0x3e9dd1[_0x555e90(0x326)](_0x194079, null) && (_0x194079 = {});
+ if (_0x3e179a[_0x555e90(0x39f)](_0x3e9dd1[_0x555e90(0x260)]))
+ _0x194079[_0x3e9dd1[_0x555e90(0x1fc)]] = '\x20', _0x194079[_0x3e9dd1[_0x555e90(0x232)]] = _0x3e9dd1[_0x555e90(0x29b)];
+ else {
+ if (_0x56db4f[_0x555e90(0x39f)](_0x3e9dd1[_0x555e90(0x30b)]))
+ _0x194079[_0x3e9dd1[_0x555e90(0x1fc)]] = '\x20', _0x194079[_0x3e9dd1[_0x555e90(0x232)]] = _0x3e9dd1[_0x555e90(0x29b)];
+ else
+ _0x3e179a[_0x555e90(0x39f)](_0x3e9dd1[_0x555e90(0x27a)]) && (_0x194079[_0x3e9dd1[_0x555e90(0x1fc)]] = _0x3e9dd1[_0x555e90(0x209)], _0x194079[_0x3e9dd1[_0x555e90(0x232)]] = _0x3e9dd1[_0x555e90(0x335)]('\x20', _0x3e9dd1[_0x555e90(0x363)]));
+ }
+ return _0x194079;
+}
+const snifferMatch = /http((?!http).){26,}?\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg)\?.*|http((?!http).){26,}\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg)|http((?!http).){26,}\/m3u8\?pt=m3u8.*|http((?!http).)*?default\.ixigua\.com\/.*|http((?!http).)*?cdn-tos[^\?]*|http((?!http).)*?\/obj\/tos[^\?]*|http.*?\/player\/m3u8play\.php\?url=.*|http.*?\/player\/.*?[pP]lay\.php\?url=.*|http.*?\/playlist\/m3u8\/\?vid=.*|http.*?\.php\?type=m3u8&.*|http.*?\/download.aspx\?.*|http.*?\/api\/up_api.php\?.*|https.*?\.66yk\.cn.*|http((?!http).)*?netease\.com\/file\/.*/;
+function isVideoFormat(_0x5515b3) {
+ const _0xf7bf44 = _0x24a000, _0x2fce53 = {
+ 'HdgCs': _0xf7bf44(0x3b7),
+ 'iPFTd': _0xf7bf44(0x1ef)
+ };
+ if (snifferMatch[_0xf7bf44(0x36e)](_0x5515b3))
+ return !_0x5515b3[_0xf7bf44(0x39f)](_0x2fce53[_0xf7bf44(0x309)]) || !_0x5515b3[_0xf7bf44(0x39f)](_0x2fce53[_0xf7bf44(0x1ee)]);
+ return ![];
+}
+function isVideo(_0x507319) {
+ const _0x1fc38a = _0x24a000, _0x2030df = {
+ 'zjKSG': _0x1fc38a(0x350),
+ 'omoGP': _0x1fc38a(0x35c)
+ };
+ return !_0x507319[_0x1fc38a(0x39f)](_0x2030df[_0x1fc38a(0x357)]) && !_0x507319[_0x1fc38a(0x39f)](_0x2030df[_0x1fc38a(0x248)]);
+}
+function UA(_0x59c882) {
+ const _0x1c26ca = _0x24a000, _0x800c4e = {
+ 'KVRHH': _0x1c26ca(0x343),
+ 'FVRLu': _0x1c26ca(0x286) + '.0',
+ 'dZwJv': _0x1c26ca(0x3b0) + _0x1c26ca(0x21d) + _0x1c26ca(0x2ae) + _0x1c26ca(0x26d) + _0x1c26ca(0x24e) + _0x1c26ca(0x37a) + _0x1c26ca(0x206) + _0x1c26ca(0x3c4) + _0x1c26ca(0x20e) + _0x1c26ca(0x360) + _0x1c26ca(0x38c) + _0x1c26ca(0x2e7)
+ };
+ if (_0x59c882[_0x1c26ca(0x39f)](_0x800c4e[_0x1c26ca(0x289)]))
+ return _0x800c4e[_0x1c26ca(0x39c)];
+ return _0x800c4e[_0x1c26ca(0x305)];
+}
+function getCateUrl(_0x23db0c) {
+ const _0x49974e = _0x24a000, _0x37953d = {
+ 'ECjej': _0x49974e(0x27c) + 'p',
+ 'sFIgg': _0x49974e(0x25c),
+ 'TJcyc': function (_0xdc8f68, _0x11b1f5) {
+ return _0xdc8f68 + _0x11b1f5;
+ },
+ 'BxtWY': _0x49974e(0x2c4),
+ 'tMugk': _0x49974e(0x343),
+ 'YouNd': function (_0x4b91da, _0x11cfe1) {
+ return _0x4b91da + _0x11cfe1;
+ },
+ 'GRdgl': _0x49974e(0x367)
+ };
+ if (_0x23db0c[_0x49974e(0x39f)](_0x37953d[_0x49974e(0x2d0)]) || _0x23db0c[_0x49974e(0x39f)](_0x37953d[_0x49974e(0x29c)]))
+ return _0x37953d[_0x49974e(0x235)](_0x23db0c, _0x37953d[_0x49974e(0x33c)]);
+ else
+ return _0x23db0c[_0x49974e(0x39f)](_0x37953d[_0x49974e(0x32e)]) ? _0x37953d[_0x49974e(0x236)](_0x23db0c, _0x37953d[_0x49974e(0x381)]) : '';
+}
+function getPlayUrlPrefix(_0x5ee424) {
+ const _0x1bf8f8 = _0x24a000, _0x598264 = {
+ 'FSokj': _0x1bf8f8(0x27c) + 'p',
+ 'FPdLA': _0x1bf8f8(0x25c),
+ 'JQGUp': function (_0xdfc607, _0x448366) {
+ return _0xdfc607 + _0x448366;
+ },
+ 'ToKis': _0x1bf8f8(0x348) + _0x1bf8f8(0x2a7),
+ 'NaZIK': _0x1bf8f8(0x343),
+ 'hggTv': function (_0x4737db, _0x8a0e91) {
+ return _0x4737db + _0x8a0e91;
+ },
+ 'rcDwJ': _0x1bf8f8(0x30f) + _0x1bf8f8(0x22b)
+ };
+ if (_0x5ee424[_0x1bf8f8(0x39f)](_0x598264[_0x1bf8f8(0x323)]) || _0x5ee424[_0x1bf8f8(0x39f)](_0x598264[_0x1bf8f8(0x2a2)]))
+ return _0x598264[_0x1bf8f8(0x299)](_0x5ee424, _0x598264[_0x1bf8f8(0x3b5)]);
+ else
+ return _0x5ee424[_0x1bf8f8(0x39f)](_0x598264[_0x1bf8f8(0x21b)]) ? _0x598264[_0x1bf8f8(0x2de)](_0x5ee424, _0x598264[_0x1bf8f8(0x398)]) : '';
+}
+function getRecommendUrl(_0x80e8f1) {
+ const _0x43bed3 = _0x24a000, _0x5b36fd = {
+ 'TOllB': _0x43bed3(0x27c) + 'p',
+ 'PVTeb': _0x43bed3(0x25c),
+ 'zyflE': function (_0x5b4b9d, _0x36c3c2) {
+ return _0x5b4b9d + _0x36c3c2;
+ },
+ 'ijImY': _0x43bed3(0x268) + _0x43bed3(0x31b),
+ 'EfLao': _0x43bed3(0x343),
+ 'Sebfw': function (_0x1c1df5, _0x470f1b) {
+ return _0x1c1df5 + _0x470f1b;
+ },
+ 'SdUcg': _0x43bed3(0x291)
+ };
+ if (_0x80e8f1[_0x43bed3(0x39f)](_0x5b36fd[_0x43bed3(0x354)]) || _0x80e8f1[_0x43bed3(0x39f)](_0x5b36fd[_0x43bed3(0x2ca)]))
+ return _0x5b36fd[_0x43bed3(0x2b0)](_0x80e8f1, _0x5b36fd[_0x43bed3(0x336)]);
+ else
+ return _0x80e8f1[_0x43bed3(0x39f)](_0x5b36fd[_0x43bed3(0x23b)]) ? _0x5b36fd[_0x43bed3(0x3b1)](_0x80e8f1, _0x5b36fd[_0x43bed3(0x2b4)]) : '';
+}
+function _0x30bd() {
+ const _0x2b0aa4 = [
+ 'Rhngk',
+ '0\x20(Macinto',
+ 'nqoHH',
+ 'Udbgi',
+ 'VVWwW',
+ 'vod_url_wi',
+ 'comic+4K=m',
+ 'vod_conten',
+ 'vod_area',
+ 'bkKAx',
+ '分类+全部=+电影=',
+ 'd_id=',
+ 'acfun.cn',
+ '分类接口错误:',
+ 'GMucY',
+ 'i.com/',
+ '?ac=detail',
+ 'hQLKD',
+ 'UKmVu',
+ 'Uqurg',
+ '11bSKqkq',
+ 'TJcyc',
+ 'YouNd',
+ '&pg=1',
+ 'fuavN',
+ 'Zelfl',
+ '+2008+2007',
+ 'EfLao',
+ 'limit',
+ 'vod_actor',
+ 'XhjKd',
+ 'ist&t=',
+ 'gINFD',
+ '?ac=list&z',
+ '匪+犯罪+动画+奇幻',
+ 'ZrFqI',
+ 'sh;\x20Intel\x20',
+ 'SyFuQ',
+ '6057730KXKKrO',
+ 'nAAlp',
+ 'omoGP',
+ '+2024+2023',
+ 'log',
+ 'zlCKO',
+ '?type=',
+ '10ifJwJp',
+ ')\x20AppleWeb',
+ 'get',
+ '?wd=',
+ 'th_player',
+ 'nDVeB',
+ 'MJeua',
+ 'nFrDW',
+ 'headers',
+ 'area',
+ 'tvplay+综艺=',
+ 'state',
+ 'indexOf',
+ 'xjYPA',
+ 'lass=',
+ 'xgapp',
+ 'search?tex',
+ 'mWrNJ',
+ 'axNZh',
+ 'dixTK',
+ 'User-Agent',
+ 'eXwPu',
+ 'pg=#PN#',
+ 'ome/91.0.4',
+ 'split',
+ 'AdIkD',
+ 'SSpmn',
+ 'index_vide',
+ 'okhttp/3.1',
+ '+2016+2015',
+ '&page=#PN#',
+ 'UgQzk',
+ 'Win64;\x20x64',
+ 'RZVZb',
+ 'rAAqR',
+ 'FMcfW',
+ 'qhbab',
+ 'qvaVO',
+ 'fBrnR',
+ 'ts+评分=scor',
+ 'vqyhb',
+ 'uUBbz',
+ 'SKgeb',
+ 'tvshow+动漫=',
+ 'FEuLQ',
+ 'hhBdZ',
+ 'lang',
+ 'api.php/ap',
+ 'SXiUp',
+ 'rQSdz',
+ 'OdHdL',
+ 'bkfnv',
+ 'cCmOD',
+ 'bilibili.c',
+ 'uzruO',
+ '+2006+2005',
+ 'AEWJN',
+ 'okhttp/4.1',
+ 'Referer',
+ '/vod',
+ 'KVRHH',
+ '大+其他\x0a筛选yea',
+ 'fcPwA',
+ 'gHEas',
+ 'rfYvZ',
+ 'ist&wd=',
+ 'KqkGD',
+ 'vod_pic',
+ '/vodPhbAll',
+ 'http',
+ 'UlRrv',
+ 'PPjsc',
+ '9IUFsEu',
+ '+2012+2011',
+ 'UZCOD',
+ 'xVjfI',
+ 'JQGUp',
+ 'WodPN',
+ 'wLZlp',
+ 'sFIgg',
+ '+大陆+香港+台湾+',
+ 'zMWEf',
+ 'SaoFF',
+ 'qrmQn',
+ 'Qzbyi',
+ 'FPdLA',
+ 'emPiw',
+ 'rrjLd',
+ 'QIbLN',
+ 'mgtv.com',
+ 'il?id=',
+ 'ovie_4k+体育',
+ 'HHuLq',
+ '+农村+惊悚+惊悚+',
+ '=tiyu\x0a筛选cl',
+ 'vod_list',
+ '973973.xyz',
+ '\x20NT\x2010.0;\x20',
+ '=1&area=&t',
+ 'zyflE',
+ 'www.mgtv.c',
+ '+2000',
+ 'IWfGL',
+ 'SdUcg',
+ '科幻+剧情+战争+警',
+ 'umjti',
+ '+2018+2017',
+ 'vod_name',
+ 'eCaVc',
+ 'nvSRb',
+ 'fkHDy',
+ 'raJIH',
+ '&pg=',
+ 'Xavsg',
+ 'xaxYD',
+ 'maOml',
+ 'cchWu',
+ 'class&star',
+ 'zyeHF',
+ 'nav?token=',
+ 'wovvt',
+ 'startsWith',
+ 'VeDky',
+ '$$$',
+ 'iqiyi.com',
+ 'PVTeb',
+ 'user-agent',
+ 'lpEGG',
+ 'vod_direct',
+ 'pagecount',
+ '/provide/v',
+ 'ECjej',
+ 'https://ji',
+ 'OIKvw',
+ 'length',
+ 'vlist',
+ 'fari/537.3',
+ 'ww.bilibil',
+ 'ea&type=筛选',
+ 'Mac\x20OS\x20X\x201',
+ 'QDURc',
+ '伦理+情色+福利+三',
+ 'y=c87681c9',
+ '筛选area&lan',
+ 'HIEhJ',
+ 'hggTv',
+ 'oRses',
+ '+爱情+恐怖+动作+',
+ '2.11',
+ 'jIVVu',
+ 'header',
+ 'referer',
+ 'replace',
+ 'video?tid=',
+ '37.36',
+ 'YTcha',
+ 'type_exten',
+ '筛选area+全部=',
+ 'qaLZN',
+ '3d5e430cac',
+ 'znjdK',
+ 'bfaLF',
+ 'IKCWR',
+ 'g=筛选lang&y',
+ 'QZvys',
+ 'erty',
+ 'fIzpG',
+ 'bilibili',
+ '4oTuTQS',
+ 'le.com',
+ 'vod_play_l',
+ 'zMZmQ',
+ 'class',
+ '472.114\x20Sa',
+ '\x20https://w',
+ 'it=18&page',
+ 'PzBoQ',
+ 'pptv.com',
+ 'JpyoV',
+ 'GGHOc',
+ 'OvREh',
+ 'AsjQf',
+ 'UwOqb',
+ '1aa5&url=',
+ 'dZwJv',
+ 'youku.com',
+ 'ofHAn',
+ 'ulXQF',
+ 'HdgCs',
+ 'HUsMa',
+ 'yLRcH',
+ 'XjiyL',
+ 'TVfJB',
+ 'zFyTh',
+ '/detail?vo',
+ 'Header',
+ 'vod_class',
+ '+2010+2009',
+ 'IFEDw',
+ 'trim',
+ 'isArray',
+ 'eXDqH',
+ 'TmtUN',
+ 'baofeng.co',
+ 'KRVeJ',
+ '537.36\x20(KH',
+ 'o?token=',
+ 'IpeiC',
+ 'sohu.com',
+ 'wpdZs',
+ '+2014+2013',
+ 'rDTqC',
+ 'WNSZb',
+ 'wWTGM',
+ 'FSokj',
+ '?ac=videol',
+ 'mqFNW',
+ 'GlESc',
+ 'EsiSO',
+ 'fUjyK',
+ '+2002+2001',
+ 'ghVBe',
+ 'mEBLG',
+ 'vod_year',
+ 'parse2',
+ 'tMugk',
+ 'glzca',
+ 'code',
+ '+2022+2021',
+ 'push',
+ 'IKQGq',
+ 'ViinS',
+ 'AQtGT',
+ 'ijImY',
+ 'host',
+ 'ext',
+ 'data',
+ 'SajNK',
+ 'MAPTF',
+ 'BxtWY',
+ 'floor',
+ 'xIeyb',
+ 'fmHZd',
+ 'ear=筛选year',
+ 'exi.jdyx.p',
+ 'titan.mgtv',
+ '.vod',
+ 'hPgPi',
+ 'object',
+ 'vod_remark',
+ 'MWcjN',
+ 'video_deta',
+ 'ro/api/?ke',
+ '11069064LnYXCB',
+ 'uIZrh',
+ 'gudMv',
+ 'vod_play_f',
+ 'VoCNI',
+ '美国+英国+法国+日',
+ '.mp4',
+ 'stype',
+ ' {
+ const _0x53867c = _0x4dd129, _0x8beb43 = {
+ 'TSUgZ': function (_0x52410f, _0x64397c) {
+ const _0x2a0b08 = _0x3bf3;
+ return _0x1bb544[_0x2a0b08(0x275)](_0x52410f, _0x64397c);
+ },
+ 'FMcfW': _0x1bb544[_0x53867c(0x303)],
+ 'OvREh': function (_0x17e635, _0x1e79bc) {
+ const _0x2b8dff = _0x53867c;
+ return _0x1bb544[_0x2b8dff(0x3aa)](_0x17e635, _0x1e79bc);
+ },
+ 'RZVZb': function (_0x2aff9c, _0x16add9, _0x39fb37, _0x56dec0) {
+ const _0x399614 = _0x53867c;
+ return _0x1bb544[_0x399614(0x380)](_0x2aff9c, _0x16add9, _0x39fb37, _0x56dec0);
+ }
+ };
+ try {
+ const _0x5b9b85 = _0x2c154b[_0x4410f9];
+ _0x1bb544[_0x53867c(0x20f)](_0x4410f9, _0x4dc412) && Array[_0x53867c(0x315)](_0x5b9b85) && _0xe7aee[_0x53867c(0x332)](_0x5b9b85), _0x1bb544[_0x53867c(0x20f)](typeof _0x5b9b85, _0x1bb544[_0x53867c(0x303)]) && _0x1bb544[_0x53867c(0x1f0)](_0x5b9b85, null) && (Array[_0x53867c(0x315)](_0x5b9b85) ? _0x5b9b85[_0x53867c(0x1e6)](_0xce021c => {
+ const _0x7a8860 = _0x53867c;
+ _0x8beb43[_0x7a8860(0x3bc)](typeof _0xce021c, _0x8beb43[_0x7a8860(0x270)]) && _0x8beb43[_0x7a8860(0x301)](_0xce021c, null) && _0x8beb43[_0x7a8860(0x26e)](findJsonArray, _0xce021c, _0x4dc412, _0xe7aee);
+ }) : _0x1bb544[_0x53867c(0x380)](findJsonArray, _0x5b9b85, _0x4dc412, _0xe7aee));
+ } catch (_0x161cd2) {
+ SpiderDebug[_0x53867c(0x24a)](_0x161cd2);
+ }
+ });
+}
+function jsonArr2Str(_0x2ac5a3) {
+ const _0x171e1b = _0x24a000, _0x3f6d96 = {
+ 'IFEDw': function (_0x584b3a, _0x1079df) {
+ return _0x584b3a < _0x1079df;
+ }
+ }, _0x36becd = [];
+ for (let _0x29367c = -0x1 * -0x1987 + 0x1 * -0x1323 + -0x664; _0x3f6d96[_0x171e1b(0x313)](_0x29367c, _0x2ac5a3[_0x171e1b(0x2d3)]); _0x29367c++) {
+ try {
+ _0x36becd[_0x171e1b(0x332)](_0x2ac5a3[_0x29367c]);
+ } catch (_0x3e4b7e) {
+ SpiderDebug[_0x171e1b(0x24a)](_0x3e4b7e);
+ }
+ }
+ return _0x36becd[_0x171e1b(0x365)](',');
+}
+function getHeaders(_0x2dbbbb) {
+ const _0x690d7 = _0x24a000, _0x11947b = {
+ 'OdHdL': _0x690d7(0x261),
+ 'VeDky': function (_0x4325bb, _0x1c5140) {
+ return _0x4325bb(_0x1c5140);
+ }
+ }, _0x24e5fe = {};
+ return _0x24e5fe[_0x11947b[_0x690d7(0x27f)]] = _0x11947b[_0x690d7(0x2c7)](UA, _0x2dbbbb), _0x24e5fe;
+}
+function isJsonString(_0x52901c) {
+ const _0x44dab5 = _0x24a000;
+ try {
+ JSON[_0x44dab5(0x213)](_0x52901c);
+ } catch (_0x568d34) {
+ return ![];
+ }
+ return !![];
+}
+export function __jsEvalReturn() {
+ return {
+ 'init': init,
+ 'home': home,
+ 'homeVod': homeVod,
+ 'category': category,
+ 'detail': detail,
+ 'play': play,
+ 'search': search
+ };
+}
\ No newline at end of file
diff --git a/cpu_iy3/lib/jhdj.js b/cpu_iy3/lib/jhdj.js
new file mode 100644
index 00000000..0ad0959d
--- /dev/null
+++ b/cpu_iy3/lib/jhdj.js
@@ -0,0 +1,1669 @@
+/*
+@header({
+ searchable: 1,
+ filterable: 1,
+ quickSearch: 1,
+ title: '聚合短剧',
+ lang: 'cat'
+})
+*/
+
+import { Crypto as CryptoJS } from 'assets://js/lib/cat.js';
+
+let debug = 1;
+let siteName = '聚合短剧';
+let xingya_headers = {};
+let niuniu_headers = {};
+let niuniu_token = '';
+let niuniu_access_token = '';
+let hema_headers = {};
+
+// 搜索缓存
+const searchCache = new Map();
+const CACHE_TTL = 5 * 60 * 1000;
+
+// 分类排除规则
+const cate_remove = ['分类排除', '软鸭', '碎片', '锦鲤', '番茄', '甜圈'];
+const UA = "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36";
+
+const aggConfig = {
+ keys: 'd3dGiJc651gSQ8w1',
+ searchLimit: 20,
+ searchTimeout: 8000,
+ charMap: {
+ '+': 'P', '/': 'X', '0': 'M', '1': 'U', '2': 'l', '3': 'E', '4': 'r', '5': 'Y', '6': 'W', '7': 'b', '8': 'd', '9': 'J',
+ 'A': '9', 'B': 's', 'C': 'a', 'D': 'I', 'E': '0', 'F': 'o', 'G': 'y', 'H': '_', 'I': 'H', 'J': 'G', 'K': 'i', 'L': 't',
+ 'M': 'g', 'N': 'N', 'O': 'A', 'P': '8', 'Q': 'F', 'R': 'k', 'S': '3', 'T': 'h', 'U': 'f', 'V': 'R', 'W': 'q', 'X': 'C',
+ 'Y': '4', 'Z': 'p', 'a': 'm', 'b': 'B', 'c': 'O', 'd': 'u', 'e': 'c', 'f': '6', 'g': 'K', 'h': 'x', 'i': '5', 'j': 'T',
+ 'k': '-', 'l': '2', 'm': 'z', 'n': 'S', 'o': 'Z', 'p': '1', 'q': 'V', 'r': 'v', 's': 'j', 't': 'Q', 'u': '7', 'v': 'D',
+ 'w': 'w', 'x': 'n', 'y': 'L', 'z': 'e'
+ },
+ headers: {
+ json: { 'User-Agent': 'okhttp/4.10.0', 'Content-Type': 'application/json' },
+ form: { 'User-Agent': 'okhttp/4.10.0', 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8' },
+ niuniu: { 'Cache-Control': 'no-cache', 'Content-Type': 'application/json;charset=UTF-8', 'User-Agent': 'okhttp/4.12.0' },
+ baidu: { 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': UA },
+ hema: {
+ 'datas': 'e5f22c6e2c82fe001738cb9ce4696eab0556d064a55aef402e0fbe6b29a083f6538e4567de38e67de2071a49d9751526bfba45314e1fd4702b11c76ab9a3b5f873262854ba66e6715ed51364dbc6ee62c7180e047fcbcdbfd49874fc8f28674b16d90ca71a02de76c70598e0b75e647c37c2c19287e49be5f2a259d727dfc4df3d28802388bf3c356576b342e17e30a2ab74859263dba4d1c8eba79990d22d60d60927fdacb2addf2f0eaadd8887585ca2eb87f603faf0c207dda18cf67dc25b2199d303baff9e6605b3314a7d2631f62864f48619daceb9452f2b7b0667773553741856df030cca68af3c57810f983d452bb428ef5fc32206aef4865ae06c629bee7f5135547304acc7ef4e7c6df887308f2e79c493fd2ee03488722861b5bb51b09cb8911dfc92c288d94e601c066d2f9d612ad2c8d4eeb4920b1d44aff3e13fd75229b857f64925df1cf12f75a00d438c422ec1726462b915903f1dd1f4bb7cdf82cc15a6d507f80c789903e710f39a62aef073f3f93a6c681e75d295428aa290d7e98f82e7e9ad6e2b23d9086dfe8c63c5d8550b13fd61a77291473a8bdd43c7c2639f264be69d9d07f0585de4342a399275a64e7d1d4400b8ed4421a2f289f622e40cdd1cfc916a0b9ce747c924ac33e32d24b91ed5d64772d6ad6896412f52724006eabf12aaecfd6e81dad432c7b3800bbf793a1c375e3e7b4fb3b097724b5fc88a8c9bcf3dbc10cbdb252965',
+ 'Content-Type': 'text/plain'
+ },
+ haokan: {
+ 'User-Agent': UA,
+ 'Talos-Module-Name': 'shortDrama',
+ 'Talos-Module-Version': '1.0.71.1',
+ 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8',
+ 'Cookie': 'BAIDUCUID=giHCu0azv80G8SfQ0avU8gaaH8jfiv86ju2MugiR2i8-k3a35avAa1_mA'
+ }
+ }
+};
+
+// ==================== URL配置 ====================
+const rule = {
+ 百度: {
+ host: 'https://mbd.baidu.com',
+ detailHost: 'https://sv.baidu.com',
+ list: '/feedapi/v1/videoserver/playlets/list?service=bdbox',
+ search: '/feedapi/v1/videoserver/playlets/search?service=bdbox',
+ detail: '/haokan/ui-video/playlet/rec/detail?log=vhk&tn=1020970b&ctn=1008350n&blur=1',
+ play: '/appui/api?cmd=video/relate&log=vhk&tn=1020970b&ctn=1008350n&blur=1'
+ },
+ 七猫: {
+ host: 'https://api-store.qmplaylet.com',
+ list: '/api/v1/playlet/index',
+ detail: 'https://api-read.qmplaylet.com/player/api/v1/playlet/info',
+ search: '/api/v1/playlet/search'
+ },
+ 星芽: {
+ host: 'https://app.whjzjx.cn',
+ list: '/cloud/v2/theater/home_page?theater_class_id',
+ detail: '/v2/theater_parent/detail',
+ search: '/v3/search',
+ login: 'https://u.shytkjgs.com/user/v1/account/login'
+ },
+ 西饭: {
+ host: 'https://xifan-api-cn.youlishipin.com',
+ list: '/xifan/drama/portalPage',
+ detail: '/xifan/drama/getDuanjuInfo',
+ search: '/xifan/search/getSearchList'
+ },
+ 牛牛: {
+ host: 'https://new.tianjinzhitongdaohe.com',
+ list: '/api/v1/app/screen/screenMovie',
+ detail: '/api/v1/app/play/movieDetails',
+ search: '/api/v1/app/search/searchMovie',
+ desc: '/api/v1/app/play/movieDesc',
+ visitor: '/api/v1/app/user/visitorInfo',
+ login: 'https://csj-sp.csjdeveloper.com/csj_sp/api/v1/user/login?siteid=5627189',
+ detail2: 'https://csj-sp.csjdeveloper.com/csj_sp/api/v1/shortplay/detail?siteid=5627189',
+ unlock: 'https://csj-sp.csjdeveloper.com/csj_sp/api/v1/pay/ad_unlock?siteid=5627189'
+ },
+ 围观: {
+ host: 'https://api.drama.9ddm.com',
+ list: '/drama/home/shortVideoTags?version_code=1500&os_type=1',
+ detail: '/drama/home/shortVideoDetail?version_code=1500&os_type=1',
+ search: '/drama/home/search?version_code=1500&os_type=1'
+ },
+ 河马: {
+ host: 'https://freevideo.zqqds.cn',
+ list: '/free-video-portal/portal/1121',
+ detail: '/free-video-portal/portal/1131',
+ episode: '/free-video-portal/portal/1132',
+ play: '/free-video-portal/portal/1133',
+ search: '/free-video-portal/portal/1803'
+ },
+ 星星: {
+ host: 'http://read.api.duodutek.com',
+ list: '/novel-api/app/pageModel/getResourceById',
+ detail: '/novel-api/basedata/book/getChapterList'
+ },
+ 好看: {
+ host: 'https://sv.baidu.com',
+ list: '/haokan/ui-feed/playletTagsFeed?osbranch=a0',
+ home: '/haokan/ui-feed/playletShelfFeed?osbranch=a0',
+ detail_list: '/appui/api?osbranch=a0',
+ detail: '/haokan/ui-video/playlet/rec/detail?osbranch=a0',
+ play: '/appui/api?osbranch=a0',
+ search: '/haokan/ui-interact/playlet/search/sugs?osbranch=a0'
+ }
+};
+
+const platformList = [
+ { name: '百度短剧', id: '百度' },
+ { name: '七猫短剧', id: '七猫' },
+ { name: '星芽短剧', id: '星芽' },
+ { name: '西饭短剧', id: '西饭' },
+ { name: '牛牛短剧', id: '牛牛' },
+ { name: '围观短剧', id: '围观' },
+ { name: '河马短剧', id: '河马' },
+ { name: '星星短剧', id: '星星' },
+ { name: '好看短剧', id: '好看' }
+];
+
+const ruleFilterDef = {
+ 百度: { area: '新剧' },
+ 七猫: { area: '0' },
+ 星芽: { area: '1' },
+ 西饭: { area: '68@都市' },
+ 牛牛: { area: '现言' },
+ 围观: { area: '' },
+ 河马: { area: '308' },
+ 星星: { area: '1287' },
+ 好看: { area: '1' }
+};
+
+// ==================== 筛选配置 ====================
+const filterOptions = {
+ "七猫": [{
+ "key": "area",
+ "name": "分类",
+ "value": [
+ { "n": "全部", "v": "" },
+ { "n": "推荐", "v": "0" },
+ { "n": "新剧", "v": "-1" },
+ { "n": "都市情感", "v": "1273" },
+ { "n": "古装", "v": "1272" },
+ { "n": "都市", "v": "571" },
+ { "n": "玄幻仙侠", "v": "1286" },
+ { "n": "奇幻", "v": "570" },
+ { "n": "乡村", "v": "590" },
+ { "n": "民国", "v": "573" },
+ { "n": "年代", "v": "572" },
+ { "n": "青春校园", "v": "1288" },
+ { "n": "武侠", "v": "371" },
+ { "n": "科幻", "v": "594" },
+ { "n": "末世", "v": "556" },
+ { "n": "二次元", "v": "1289" },
+ { "n": "逆袭", "v": "400" },
+ { "n": "穿越", "v": "373" },
+ { "n": "复仇", "v": "795" },
+ { "n": "系统", "v": "787" },
+ { "n": "权谋", "v": "790" },
+ { "n": "重生", "v": "784" },
+ { "n": "女性成长", "v": "1294" },
+ { "n": "打脸虐渣", "v": "716" },
+ { "n": "闪婚", "v": "480" },
+ { "n": "强者回归", "v": "402" },
+ { "n": "追妻火葬场", "v": "715" },
+ { "n": "家庭", "v": "670" },
+ { "n": "马甲", "v": "558" },
+ { "n": "职场", "v": "724" },
+ { "n": "宫斗", "v": "343" },
+ { "n": "高手下山", "v": "1299" },
+ { "n": "娱乐明星", "v": "1295" },
+ { "n": "异能", "v": "727" },
+ { "n": "宅斗", "v": "342" },
+ { "n": "替身", "v": "712" },
+ { "n": "穿书", "v": "338" },
+ { "n": "商战", "v": "723" },
+ { "n": "种田经商", "v": "1291" },
+ { "n": "伦理", "v": "1293" },
+ { "n": "社会话题", "v": "1290" },
+ { "n": "致富", "v": "492" },
+ { "n": "偷听心声", "v": "1258" },
+ { "n": "脑洞", "v": "526" },
+ { "n": "豪门总裁", "v": "624" },
+ { "n": "萌宝", "v": "356" },
+ { "n": "战神", "v": "527" },
+ { "n": "真假千金", "v": "812" },
+ { "n": "赘婿", "v": "36" },
+ { "n": "神医", "v": "1269" },
+ { "n": "神豪", "v": "37" },
+ { "n": "小人物", "v": "1296" },
+ { "n": "团宠", "v": "545" },
+ { "n": "欢喜冤家", "v": "464" },
+ { "n": "女帝", "v": "617" },
+ { "n": "银发", "v": "1297" },
+ { "n": "兵王", "v": "28" },
+ { "n": "虐恋", "v": "16" },
+ { "n": "甜宠", "v": "21" },
+ { "n": "悬疑", "v": "27" },
+ { "n": "搞笑", "v": "793" },
+ { "n": "灵异", "v": "1287" }
+ ]
+ }],
+ "牛牛": [{
+ "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": "古装" },
+ { "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": "二次元" },
+ { "n": "未来", "v": "未来" },
+ { "n": "快速穿越", "v": "快速穿越" },
+ { "n": "烧脑", "v": "烧脑" },
+ { "n": "治愈", "v": "治愈" },
+ { "n": "其他剧情", "v": "其他剧情" }
+ ]
+ }],
+ "百度": [{
+ "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": "总裁" },
+ { "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": "赘婿" },
+ { "n": "单元剧", "v": "单元剧" },
+ { "n": "青春校园", "v": "青春校园" },
+ { "n": "历史架空", "v": "历史架空" },
+ { "n": "王妃", "v": "王妃" },
+ { "n": "鉴宝", "v": "鉴宝" },
+ { "n": "科幻", "v": "科幻" },
+ { "n": "军旅战争", "v": "军旅战争" },
+ { "n": "种田", "v": "种田" }
+ ]
+ }],
+ "围观": [{
+ "key": "area",
+ "name": "分类",
+ "value": [{ "n": "全部", "v": "" }]
+ }],
+ "星芽": [{
+ "key": "area",
+ "name": "分类",
+ "value": [
+ { "n": "剧场", "v": "1" },
+ { "n": "热播剧", "v": "2" },
+ { "n": "会员专享", "v": "8" },
+ { "n": "星选好剧", "v": "7" },
+ { "n": "新剧", "v": "3" },
+ { "n": "阳光剧场", "v": "5" }
+ ]
+ }],
+ "西饭": [{
+ "key": "area",
+ "name": "分类",
+ "value": [
+ { "n": "都市", "v": "68@都市" },
+ { "n": "青春", "v": "68@青春" },
+ { "n": "现代言情", "v": "81@现代言情" },
+ { "n": "豪门", "v": "81@豪门" },
+ { "n": "大女主", "v": "80@大女主" },
+ { "n": "逆袭", "v": "79@逆袭" },
+ { "n": "打脸虐渣", "v": "79@打脸虐渣" },
+ { "n": "穿越", "v": "81@穿越" }
+ ]
+ }],
+ "河马": [{
+ "key": "area",
+ "name": "分类",
+ "value": [
+ { "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" },
+ { "n": "传承觉醒", "v": "321" },
+ { "n": "神豪", "v": "322" },
+ { "n": "民国", "v": "323" }
+ ]
+ }],
+ "星星": [{
+ "key": "area",
+ "name": "分类",
+ "value": [
+ { "n": "甜宠", "v": "1287" },
+ { "n": "逆袭", "v": "1288" },
+ { "n": "热血", "v": "1289" },
+ { "n": "现代", "v": "1290" },
+ { "n": "古代", "v": "1291" }
+ ]
+ }],
+ "好看": [{
+ "key": "area",
+ "name": "分类",
+ "value": [
+ { "n": "热播剧", "v": "1" },
+ { "n": "新剧", "v": "2" },
+ { "n": "战神", "v": "1001" },
+ { "n": "神豪", "v": "2001" },
+ { "n": "神医", "v": "1002" },
+ { "n": "甜宠", "v": "1007" },
+ { "n": "赘婿", "v": "1003" },
+ { "n": "穿越重生", "v": "2004" },
+ { "n": "异能", "v": "2005" },
+ { "n": "虐恋", "v": "1006" },
+ { "n": "宫斗宅斗", "v": "2006" },
+ { "n": "玄幻", "v": "2009" }
+ ]
+ }]
+};
+
+// 河马分类标签映射
+const hemaTagIds = {
+ "308": "", "309": "", "310": "417,473,474,464", "311": "462,466", "312": "476",
+ "313": "585,616", "314": "444,468", "315": "417,439,464,465", "316": "589",
+ "317": "416,439,463,465", "318": "438", "319": "417,474,464", "320": "439,442,443,445,465,470",
+ "321": "417,473,474,464", "322": "472,475,585", "323": "590"
+};
+
+// 西饭搜索固定session参数
+const XIFAN_SESSION_PARAMS = 'session=eyJpbmZvIjp7InVpZCI6IiIsInJ0IjoiMTc0MDY2ODk4NiIsInVuIjoiT1BHX2U5ODQ4NTgzZmM4ZjQzZTJhZjc5ZTcxNjRmZTE5Y2JjIiwiZnQiOiIxNzQwNjY4OTg2In19&feedssession=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1dHlwIjowLCJidWlkIjoxNjM0MDU3ODE4OTgxNDk5OTA0LCJhdWQiOiJkcmFtYSIsInZlciI6MiwicmF0IjoxNzQwNjY4OTg2LCJ1bm0iOiJPUEdfZTk4NDg1ODNmYzhmNDNlMmFmNzllNzE2NGZlMTljYmMiLCJpZCI6ImVhZGE1NmEyZWEzYTE0YmMwMzE3ZDc2ZmVjODJjNzc3IiwiZXhwIjoxNzQxMjczNzg2LCJkYyI6ImJqaHQifQ.IwuI0gK077RF4G10JRxgxx4GCG502vR8Z0W9EV4kd-c';
+
+// ==================== 日志函数 ====================
+function log(level, tag, msg) {
+ if (!debug) return;
+ const prefix = { 0: '🔍', 1: '✅', 2: '⚠️', 3: '❌' }[level] || '📝';
+ console.log(`${prefix}【${tag}】 ${msg}`);
+}
+
+function logTime(start, label) {
+ if (!debug) return;
+ console.log(`⏱️【${label}】耗时: ${Date.now() - start}ms`);
+}
+
+// ==================== 七猫公共函数 ====================
+async function getQmParamsAndSign() {
+ let sessionId = Math.floor(Date.now()).toString();
+ let data = {
+ "static_score": "0.8",
+ "uuid": "00000000-7fc7-08dc-0000-000000000000",
+ "device-id": "20250220125449b9b8cac84c2dd3d035c9052a2572f7dd0122edde3cc42a70",
+ "mac": "",
+ "sourceuid": "aa7de295aad621a6",
+ "refresh-type": "0",
+ "model": "22021211RC",
+ "wlb-imei": "",
+ "client-id": "aa7de295aad621a6",
+ "brand": "Redmi",
+ "oaid": "",
+ "oaid-no-cache": "",
+ "sys-ver": "12",
+ "trusted-id": "",
+ "phone-level": "H",
+ "imei": "",
+ "wlb-uid": "aa7de295aad621a6",
+ "session-id": sessionId
+ };
+ let jsonStr = JSON.stringify(data);
+ let base64Str = base64Encode(jsonStr).replace(/[\r\n\s]/g, '');
+ let qmParams = '';
+ for (let c of base64Str) qmParams += aggConfig.charMap[c] || c;
+ let paramsStr = `AUTHORIZATION=app-version=10001application-id=com.duoduo.readchannel=unknownis-white=net-env=5platform=androidqm-params=${qmParams}reg=${aggConfig.keys}`;
+ let sign = await md5(paramsStr);
+ log(0, '七猫', `qmParams生成成功`);
+ return { qmParams, sign };
+}
+
+async function getQiMaoHeaders() {
+ let { qmParams, sign } = await getQmParamsAndSign();
+ return {
+ 'net-env': '5', 'reg': '', 'channel': 'unknown', 'is-white': '',
+ 'platform': 'android', 'application-id': 'com.duoduo.read', 'AUTHORIZATION': '',
+ 'app-version': '10001', 'user-agent': 'okhttp/4.10.0',
+ 'qm-params': qmParams, 'sign': sign, 'Content-Type': 'application/json'
+ };
+}
+
+// ==================== 缓存管理 ====================
+const loginCache = new Map();
+const LOGIN_CACHE_TTL = 24 * 60 * 60 * 1000;
+
+function generateDeviceId() {
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
+ let r = Math.random() * 16 | 0;
+ let v = c === 'x' ? r : (r & 0x3 | 0x8);
+ return v.toString(16);
+ });
+}
+
+function getSearchCache(key) {
+ const cached = searchCache.get(key);
+ if (cached && Date.now() - cached.time < CACHE_TTL) {
+ log(0, '缓存', `命中: ${key}`);
+ return cached.data;
+ }
+ return null;
+}
+
+function setSearchCache(key, data) {
+ searchCache.set(key, { data, time: Date.now() });
+}
+
+// ==================== 初始化 ====================
+async function init(cfg) {
+ const start = Date.now();
+ log(1, '初始化', `========== ${siteName} ==========`);
+
+ // 星芽登录
+ try {
+ const response = await request(rule.星芽.login, {
+ method: 'POST',
+ headers: { 'User-Agent': 'okhttp/4.10.0', 'platform': '1', 'Content-Type': 'application/json' },
+ data: { device: '24250683a3bdb3f118dff25ba4b1cba1a' }
+ });
+ const res = JSON.parse(response || '{}');
+ const token = res?.data?.token || res?.token || res?.access_token;
+ xingya_headers = token ? { ...aggConfig.headers.json, authorization: token } : aggConfig.headers.json;
+ log(token ? 1 : 2, '星芽', token ? `登录成功` : `登录失败`);
+ } catch (e) {
+ xingya_headers = aggConfig.headers.json;
+ log(2, '星芽', `异常: ${e.message}`);
+ }
+
+ // 牛牛初始化
+ const nnDeviceId = generateDeviceId();
+ log(0, '牛牛', `设备ID: ${nnDeviceId}`);
+
+ try {
+ let tkhtml = await request(rule.牛牛.host + rule.牛牛.visitor, {
+ method: 'GET',
+ headers: { "deviceid": nnDeviceId, "token": "", "User-Agent": "okhttp/4.12.0", "client": "app", "devicetype": "Android", "Content-Type": "application/json" }
+ });
+ let tkRes = JSON.parse(tkhtml || '{}');
+ niuniu_token = tkRes.data?.token || '';
+ log(niuniu_token ? 1 : 2, '牛牛', niuniu_token ? `访客token成功` : `访客token失败`);
+ niuniu_headers = { ...aggConfig.headers.niuniu, "token": niuniu_token, "deviceid": nnDeviceId };
+ } catch (e) {
+ log(2, '牛牛', `访客token异常: ${e.message}`);
+ niuniu_headers = { ...aggConfig.headers.niuniu, "deviceid": nnDeviceId };
+ }
+
+ // 牛牛广告解锁
+ try {
+ let t = String(Math.floor(Date.now() / 1000));
+ let body = `ac=wifi&os=Android&vod_version=1.10.21.6-tob&os_version=9&type=1&clientVersion=v5.2.5&uuid=Y4WNZ3SAWK7MAJMH7CXCDHJ4VMPVFRZQTBSIA4XTYO4AWEUHIK6Q01&resolution=1280*2618&openudid=889edced38f1069b&dt=Pixel%204&sha1=46121F77CE2FCAD3DBC3B9EC8A24908C1A8AD6D9&os_api=28&install_id=1549688030634536&device_brand=google&sdk_version=1.1.3.0&package_name=com.niuniu.ztdh.app&siteid=5627189&dev_log_aid=667431&oaid=×tamp=${t}`;
+ let nonce = "VX1KKGtoBDCi1fB1";
+ let signature = hmacSHA256(t + nonce + body, 'aceaa47f96b4875d446b2e1d97e03bbb');
+ let encbdoy = aesEncryptECB(body, 'dafdb3d2a5c343d6');
+ let response = await request(rule.牛牛.login, {
+ method: "POST",
+ headers: { 'X-Salt': '786774955F', 'X-Nonce': nonce, 'X-Timestamp': t, 'X-Signature': signature, 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'okhttp/4.10.0' },
+ data: encbdoy
+ });
+ if (response) {
+ let logindata = aesDecryptECB(response, 'dafdb3d2a5c343d6');
+ let accesstoken = JSON.parse(logindata || '{}');
+ niuniu_access_token = accesstoken.data?.access_token || '';
+ log(niuniu_access_token ? 1 : 2, '牛牛', niuniu_access_token ? `广告token成功` : `广告token失败`);
+ }
+ } catch (e) {
+ log(2, '牛牛', `广告解锁异常: ${e.message}`);
+ }
+
+ // 河马初始化
+ hema_headers = { ...aggConfig.headers.hema, 'User-Agent': 'okhttp/4.10.0' };
+ log(1, '河马', `初始化成功`);
+
+ logTime(start, 'init');
+ return true;
+}
+
+// ==================== 首页分类 ====================
+function home(filter) {
+ const platForms = platformList.filter(item => !cate_remove.some(word => new RegExp(word, 'i').test(item.name)));
+ const classes = platForms.map(item => ({
+ type_name: item.name,
+ type_id: item.id,
+ type_flag: '[CFS][SUBSITE2][FILTERBAR]'
+ }));
+
+ const filters = {};
+ platForms.forEach(item => {
+ if (filterOptions[item.id]) filters[item.id] = filterOptions[item.id];
+ });
+
+ log(0, '首页', `分类数: ${classes.length}`);
+ return JSON.stringify({ class: classes, filters: filters });
+}
+
+// ==================== 首页推荐 ====================
+async function homeVod() {
+ const start = Date.now();
+ const platForms = platformList.filter(item => !cate_remove.some(word => new RegExp(word, 'i').test(item.name)));
+ const randomPlat = platForms[Math.floor(Math.random() * platForms.length)];
+ const randomArea = ruleFilterDef[randomPlat.id]?.area || '';
+ const categoryResult = await category(randomPlat.id, 1, { area: randomArea }, {});
+ const categoryList = JSON.parse(categoryResult).list || [];
+ log(1, '首页推荐', `返回 ${categoryList.length} 条`);
+ logTime(start, 'homeVod');
+ return JSON.stringify({ list: categoryList });
+}
+
+// ==================== 分类列表 ====================
+async function category(tid, pg, filter, extend) {
+ const start = Date.now();
+ const page = pg || 1;
+ const area = filter?.area || extend?.area || ruleFilterDef[tid]?.area || '';
+ const videos = [];
+ const platRule = rule[tid];
+
+ log(0, '分类', `${tid} page=${page} area=${area}`);
+
+ switch (tid) {
+ case '七猫': {
+ let params = { operation: 1, playlet_privacy: 1 };
+ if (area && area !== '0' && area !== '') params.tag_id = area;
+ if (page > 1) params.next_id = page;
+
+ const keys = Object.keys(params).sort();
+ let signStr = keys.map(k => `${k}=${params[k]}`).join('') + aggConfig.keys;
+ params.sign = await md5(signStr);
+
+ const url = `${platRule.host}${platRule.list}?${buildUrlQuery(params)}`;
+ const headers = await getQiMaoHeaders();
+ const response = await request(url, { method: 'GET', headers });
+
+ if (response) {
+ const res = JSON.parse(response);
+ const items = res.data?.list || [];
+ log(0, '七猫', `获取 ${items.length} 条`);
+ items.forEach(item => {
+ videos.push({
+ vod_id: `七猫@${encodeURIComponent(item.playlet_id)}`,
+ vod_name: item.title || '',
+ vod_pic: item.image_link || '',
+ vod_remarks: `七猫短剧 | ${item.total_episode_num || 0}集`,
+ vod_content: item.tags || ''
+ });
+ });
+ }
+ break;
+ }
+ case '百度': {
+ let sub = ["新剧", "限时免费", "精选", "独播"].includes(area) ? area : "新剧";
+ let tcsub = area === "全部" || area === "全部题材" ? "" : area;
+ let t = Math.floor(Date.now() / 1000);
+ let version = await md5(t + "v2");
+
+ const postData = {
+ 'data': JSON.stringify({
+ "data": {
+ "extRequest": { "flow_tabid": "13" },
+ "from": "feed",
+ "page": "channel_video_landing",
+ "pd": "feed",
+ "refreshIndex": parseInt(page),
+ "cursor": "",
+ "theme": "",
+ "timestamp": t,
+ "version": version,
+ "themes": [
+ { "kind": "综合", "names": [sub] },
+ { "kind": "题材", "names": [tcsub] }
+ ]
+ }
+ })
+ };
+
+ let html = await request(`${platRule.host}${platRule.list}`, {
+ method: 'POST',
+ headers: aggConfig.headers.baidu,
+ data: postData
+ });
+ let res = JSON.parse(html);
+ let items = res.data?.items || [];
+ log(0, '百度', `获取 ${items.length} 条`);
+ items.slice(0, 20).forEach(it => {
+ videos.push({
+ vod_id: `百度@${it.collId}`,
+ vod_name: it.title || '未知短剧',
+ vod_pic: it.img || '',
+ vod_remarks: '百度短剧 | ' + (it.updateStatus || "更新中"),
+ vod_content: it.description || ''
+ });
+ });
+ break;
+ }
+ case '星芽': {
+ const url = `${platRule.host}${platRule.list}=${area}&type=1&class2_ids=0&page_num=${page}&page_size=24`;
+ const response = await request(url, { headers: xingya_headers });
+ const res = JSON.parse(response);
+ const items = res.data?.list || [];
+ log(0, '星芽', `获取 ${items.length} 条`);
+ items.forEach(it => {
+ videos.push({
+ vod_id: `星芽@${it.theater.id}`,
+ vod_name: it.theater.title || '',
+ vod_pic: it.theater.cover_url || '',
+ vod_remarks: '星芽短剧 | ' + (it.theater.total ? `${it.theater.total}集` : ''),
+ vod_content: `播放量:${it.theater.play_amount_str || 0}`
+ });
+ });
+ break;
+ }
+ case '西饭': {
+ const [typeId, typeName] = area.split('@');
+ const ts = Math.floor(Date.now() / 1000);
+ const url = `${platRule.host}${platRule.list}?reqType=aggregationPage&offset=${(page - 1) * 30}&categoryId=${typeId}&quickEngineVersion=-1&scene=&categoryNames=${encodeURIComponent(typeName)}&categoryVersion=1&density=1.5&pageID=page_theater&version=2001001&androidVersionCode=28&requestId=${ts}aa498144140ef297&appId=drama&teenMode=false&userBaseMode=false&${XIFAN_SESSION_PARAMS}`;
+
+ const response = await request(url, { headers: aggConfig.headers.form });
+ const res = JSON.parse(response);
+ let count = 0;
+ (res.result?.elements || []).forEach(soup => {
+ (soup.contents || []).forEach(vod => {
+ const dj = vod.duanjuVo || {};
+ videos.push({
+ vod_id: `西饭@${dj.duanjuId}#${dj.source}`,
+ vod_name: dj.title || '',
+ vod_pic: dj.coverImageUrl || '',
+ vod_remarks: '西饭短剧 | ' + (dj.total ? `${dj.total}集` : ''),
+ vod_content: dj.desc || ''
+ });
+ count++;
+ });
+ });
+ log(0, '西饭', `获取 ${count} 条`);
+ break;
+ }
+ case '牛牛': {
+ let condition = { "typeId": "S1" };
+ if (area && area !== '全部' && area !== '') condition.classify = area;
+
+ const postData = { "condition": condition, "pageNum": page, "pageSize": 24 };
+ const response = await request(`${platRule.host}${platRule.list}`, {
+ method: 'POST',
+ headers: niuniu_headers,
+ data: postData
+ });
+ const res = JSON.parse(response);
+ const items = res.data?.records || [];
+ log(0, '牛牛', `获取 ${items.length} 条`);
+ items.forEach(item => {
+ videos.push({
+ vod_id: `牛牛@${item.id}`,
+ vod_name: item.name || '',
+ vod_pic: item.cover || '',
+ vod_remarks: '牛牛短剧 | ' + (item.totalEpisode ? `${item.totalEpisode}集` : ''),
+ vod_content: item.description || ''
+ });
+ });
+ break;
+ }
+ case '围观': {
+ const postData = { "audience": "全部受众", "page": page, "pageSize": 30, "searchWord": "", "subject": "全部主题" };
+ const response = await request(`${platRule.host}${platRule.search}`, {
+ method: 'POST',
+ headers: aggConfig.headers.json,
+ data: postData
+ });
+ const res = JSON.parse(response);
+ const items = (res.code === 200 && res.data) ? res.data : [];
+ log(0, '围观', `获取 ${items.length} 条`);
+ items.forEach(it => {
+ videos.push({
+ vod_id: `围观@${it.oneId}`,
+ vod_name: it.title || '未知短剧',
+ vod_pic: it.vertPoster || it.horizonPoster || '',
+ vod_remarks: '围观短剧 | ' + `集数:${it.episodeCount || 0}`,
+ vod_content: it.description || ''
+ });
+ });
+ break;
+ }
+ case '河马': {
+ try {
+ const sub = area || '308';
+ const tagIds = hemaTagIds[sub] || '';
+ const bodys = JSON.stringify({
+ "recSwitch": true, "channelId": sub, "tagIds": tagIds,
+ "cnxhFlag": page - 1, "playListFlag": true,
+ "watchRecords": ["41000103722_572752006"]
+ });
+ const body = hemaEncrypt(bodys);
+ const response = await request(`${platRule.host}${platRule.list}`, {
+ method: 'POST',
+ headers: { ...hema_headers, 'Content-Type': 'application/x-www-form-urlencoded' },
+ data: body
+ });
+ const res = JSON.parse(response);
+ const dehtml = res.data;
+ if (dehtml) {
+ const hmdata = hemaDecrypt(dehtml);
+ if (hmdata && hmdata !== '{}') {
+ const hmlist = JSON.parse(hmdata).columnData || [];
+ hmlist.forEach(videoDataArray => {
+ (videoDataArray.videoData || []).forEach(video => {
+ videos.push({
+ vod_id: `河马@${video.bookId}`,
+ vod_name: video.bookName || '',
+ vod_pic: video.coverWap || video.coverCutWap,
+ vod_remarks: `河马短剧 | 更新${video.updateNum || 0}集`,
+ vod_content: video.introduction || ''
+ });
+ });
+ });
+ }
+ }
+ } catch (e) {
+ log(2, '河马', e.message);
+ }
+ break;
+ }
+ case '星星': {
+ const postData = {
+ "productId": "2a8c14d1-72e7-498b-af23-381028eb47c0",
+ "vestId": "2be070e0-c824-4d0e-a67a-8f688890cadb",
+ "channel": "oppo19", "osType": "android", "version": "20",
+ "token": "202509271001001446030204698626", "resourceId": area,
+ "pageNum": String(page), "pageSize": "20"
+ };
+ const response = await request(`${platRule.host}${platRule.list}`, {
+ method: 'GET', headers: aggConfig.headers.form, data: postData
+ });
+ try {
+ const res = JSON.parse(response);
+ const items = res.data?.datalist || [];
+ log(0, '星星', `获取 ${items.length} 条`);
+ items.forEach(vod => {
+ videos.push({
+ vod_id: `星星@${vod.id}@${encodeURIComponent(vod.introduction || '')}`,
+ vod_name: vod.name || '',
+ vod_pic: vod.icon || '',
+ vod_remarks: `星星短剧 | ${vod.heat || 0}万播放`,
+ vod_content: vod.introduction || ''
+ });
+ });
+ } catch (e) {
+ log(2, '星星', e.message);
+ }
+ break;
+ }
+ case '好看': {
+ const postData = { "tag_id": area, "rn": "20", "pn": page };
+ const response = await request(`${platRule.host}${platRule.list}`, {
+ method: 'POST', headers: aggConfig.headers.haokan, data: postData
+ });
+ try {
+ const res = JSON.parse(response);
+ const items = res.data?.list || [];
+ log(0, '好看', `获取 ${items.length} 条`);
+ items.forEach(item => {
+ videos.push({
+ vod_id: `好看@${item.playlet_id}`,
+ vod_name: item.playlet_title || '',
+ vod_pic: item.playlet_poster || '',
+ vod_remarks: `好看短剧 | ${item.episodes_num_text || ''}`,
+ vod_content: item.tags ? item.tags.join('·') : ''
+ });
+ });
+ } catch (e) {
+ log(2, '好看', e.message);
+ }
+ break;
+ }
+ }
+
+ log(1, '分类', `${tid} 返回 ${videos.length} 条`);
+ logTime(start, 'category');
+ return JSON.stringify({ list: videos, page, pagecount: page + 1, limit: videos.length, total: videos.length * (page + 1) });
+}
+
+// ==================== 详情 ====================
+async function detail(id) {
+ const parts = id.split('@');
+ const platform = parts[0];
+ const did = parts.slice(1).join('@');
+ const platRule = rule[platform];
+ let vod = {};
+
+ log(0, '详情', `${platform} ${did.substring(0, 50)}`);
+
+ switch (platform) {
+ case '七猫': {
+ const didDecoded = decodeURIComponent(did);
+ const sign = await md5(`playlet_id=${didDecoded}${aggConfig.keys}`);
+ const url = `${platRule.detail}?playlet_id=${didDecoded}&sign=${sign}`;
+ const headers = await getQiMaoHeaders();
+ const response = await request(url, { method: 'GET', headers });
+ const data = JSON.parse(response || '{}').data || {};
+ vod = {
+ vod_id: id, vod_name: data.title || '未知标题',
+ vod_pic: data.image_link || '', vod_remarks: `${data.tags || ''} ${data.total_episode_num || 0}集`,
+ vod_content: data.intro || '未知剧情', vod_play_from: '七猫短剧',
+ vod_play_url: (data.play_list || []).map(it => `${it.sort}$${it.video_url}`).join('#')
+ };
+ break;
+ }
+ case '百度': {
+ const postData = { "playlet_id": did, "vid": "undefined" };
+ let html = await request(`${platRule.detailHost}${platRule.detail}`, {
+ method: 'POST', headers: aggConfig.headers.baidu, data: postData
+ });
+ let res = JSON.parse(html);
+ let dthtml = res.data || {};
+ let vids = dthtml.vid_list || [];
+ let playArr = vids.map((vid, index) => `第${index + 1}集$${did}@${vid}`);
+ vod = {
+ vod_id: id, vod_name: dthtml.playlet_title || '未知短剧',
+ vod_pic: dthtml.playlet_poster || '',
+ vod_content: `热度值:${dthtml.hot_value || 0}\n题材:${dthtml.tag_text || ''}\n集数:${dthtml.episodes_num || 0}\n简介:${dthtml.description || ''}`,
+ vod_remarks: `共${vids.length || 0}集`, vod_play_from: "百度短剧",
+ vod_play_url: playArr.join('#')
+ };
+ break;
+ }
+ case '星芽': {
+ const detailUrl = `${platRule.host}${platRule.detail}?theater_parent_id=${did}`;
+ const response = await request(detailUrl, { headers: xingya_headers });
+ const res = JSON.parse(response);
+ if (res.code === 'ok' && res.data) {
+ const data = res.data;
+ const playUrls = (data.theaters || []).map(item => `第${item.num}集$${item.son_video_url}`).join('#');
+ vod = {
+ vod_id: id, vod_name: data.title || '未知剧名',
+ vod_pic: data.cover_url || '', vod_remarks: data.is_over === 2 ? '连载中' : '已完结',
+ vod_content: data.introduction || data.desc || '',
+ vod_play_from: '星芽短剧', vod_play_url: playUrls || '暂无播放地址$0'
+ };
+ }
+ break;
+ }
+ case '西饭': {
+ const [duanjuId, source] = did.split('#');
+ const url = `${platRule.host}${platRule.detail}?duanjuId=${duanjuId}&source=${source}`;
+ const response = await request(url, { headers: aggConfig.headers.form });
+ const res = JSON.parse(response);
+ const data = res.result || {};
+ const playUrls = (data.episodeList || []).map(ep => `${ep.index}$${ep.playUrl}`).join('#');
+ vod = {
+ vod_id: id, vod_name: data.title || '', vod_pic: data.coverImageUrl || '',
+ vod_content: data.desc || '未知',
+ vod_remarks: data.updateStatus === 'over' ? `${data.total || 0}集 已完结` : `更新${data.total || 0}集`,
+ vod_play_from: '西饭短剧', vod_play_url: playUrls
+ };
+ break;
+ }
+ case '牛牛': {
+ const descData = await request(`${platRule.host}${platRule.desc}`, {
+ method: 'POST', headers: niuniu_headers, data: { "id": did, "typeId": "S1" }
+ });
+ const descRes = JSON.parse(descData);
+ const descInfo = descRes.data || {};
+ const listData = await request(`${platRule.host}${platRule.detail}`, {
+ method: 'POST', headers: niuniu_headers, data: { "id": did, "source": 0, "typeId": "S1", "userId": "546932" }
+ });
+ const listRes = JSON.parse(listData);
+ const listInfo = listRes.data || {};
+
+ let playUrls = '';
+ if (listInfo.url && listInfo.episodeList && listInfo.episodeList.length > 0) {
+ playUrls = (listInfo.episodeList || []).map(ep => `${ep.episode}$${did}+${ep.id}`).join('#');
+ } else if (listInfo.thirdPlayId) {
+ let thirdPlayId = listInfo.thirdPlayId;
+ let data1 = "not_include=0&lock_free=1&type=1&clientVersion=v5.2.5&uuid=6IDYUSASPQY5BBVACWQW3LLTPV4V7DE26UOCX5TZTVUGX4VUJNXQ01&resolution=1080*2320&openudid=82f4175d577a2939&dt=22021211RC&os_api=31&install_id=1496879012031075&sdk_version=1.1.3.0&siteid=5627189&dev_log_aid=667431&oaid=abec0dfff623201b×tamp=1752498494&direction=0&ac=mobile&os=Android&vod_version=1.10.21.6-tob&os_version=12&count=1&index=1&shortplay_id=" + thirdPlayId + "&sha1=46121F77CE2FCAD3DBC3B9EC8A24908C1A8AD6D9&device_brand=Redmi&package_name=com.niuniu.ztdh.app";
+ try {
+ let html1 = await niuniuPost(rule.牛牛.detail2, data1, "1");
+ if (html1 && html1.data && html1.data.episode_right_list) {
+ playUrls = html1.data.episode_right_list.map(it => {
+ let lockType = it.lock_type || 'free';
+ return `第${it.index}集$${it.index}+${lockType}+${thirdPlayId}`;
+ }).join('#');
+ }
+ } catch (e) { log(2, '牛牛详情', e.message); }
+ }
+ vod = {
+ vod_id: id, vod_name: descInfo.name || listInfo.name || '未知名称',
+ vod_pic: descInfo.cover || listInfo.cover || '',
+ vod_content: `类型:${descInfo.classify || ''}\n评分:${descInfo.score || ''}\n简介:${descInfo.introduce || ''}`,
+ vod_remarks: `共${descInfo.totalEpisode || listInfo.totalEpisode || 0}集`,
+ vod_play_from: '牛牛短剧', vod_play_url: playUrls || '暂无播放地址$0'
+ };
+ break;
+ }
+ case '围观': {
+ const response = await request(`${platRule.host}${platRule.detail}&oneId=${did}&page=1&pageSize=1000`, {
+ headers: aggConfig.headers.form
+ });
+ const res = JSON.parse(response);
+ if (res.code === 200 && res.data) {
+ const data = res.data || [];
+ const firstEpisode = data[0] || {};
+ vod = {
+ vod_id: id, vod_name: firstEpisode.title || '',
+ vod_pic: firstEpisode.vertPoster || firstEpisode.horizonPoster || '',
+ vod_remarks: `共${data.length || 0}集`,
+ vod_content: `播放量:${firstEpisode.viewCount || 0} 收藏:${firstEpisode.collectionCount || 0} 评论:${firstEpisode.commentCount || 0}`,
+ vod_play_from: '围观短剧',
+ vod_play_url: data.map(ep => {
+ let playSetting = ep.playSetting || ep.videoClarityList || [];
+ try { if (typeof playSetting === 'string') playSetting = JSON.parse(playSetting); } catch (e) { }
+ const url = (playSetting.find(item => item.name === '1080P')?.url || playSetting.find(item => item.name === '720P')?.url || '');
+ return `第${ep.playOrder || 1}集$${url}`;
+ }).filter(ep => ep.split('$')[1]).join('#')
+ };
+ }
+ break;
+ }
+ case '河马': {
+ const bookId = did;
+ const body = hemaEncrypt(JSON.stringify({ "bookId": bookId }));
+ const detailResponse = await request(`${platRule.host}${platRule.detail}`, {
+ method: 'POST', headers: { ...hema_headers, 'Content-Type': 'application/x-www-form-urlencoded' }, data: body
+ });
+ const detailRes = JSON.parse(detailResponse);
+ const detailHtml = detailRes.data;
+ const postdata = hemaDecrypt(detailHtml);
+ const videoInfo = JSON.parse(postdata).videoInfo || {};
+
+ const episodeBody = hemaEncrypt(JSON.stringify({ "bookId": bookId, "chapterMin": videoInfo.updateNum || 0, "chapterMax": videoInfo.chapterIndex || 0 }));
+ const episodeResponse = await request(`${platRule.host}${platRule.episode}`, {
+ method: 'POST', headers: { ...hema_headers, 'Content-Type': 'application/x-www-form-urlencoded' }, data: episodeBody
+ });
+ const episodeRes = JSON.parse(episodeResponse);
+ const episodeHtml = episodeRes.data;
+ const playdata = hemaDecrypt(episodeHtml);
+ const chapterList = JSON.parse(playdata).chapterList || [];
+
+ const playUrls = chapterList.map(item => `${item.chapterName}$${item.chapterId}++${item.chapterIndex}++${bookId}`).join('#');
+ vod = {
+ vod_id: id, vod_name: videoInfo.bookName || '未知剧名',
+ vod_pic: videoInfo.coverWap, vod_remarks: videoInfo.finishStatusCn || `更新至${videoInfo.updateNum || 0}集`,
+ vod_content: videoInfo.introduction || '暂无简介',
+ vod_play_from: '河马短剧', vod_play_url: playUrls || '暂无播放地址$0'
+ };
+ break;
+ }
+ case '星星': {
+ const partsArr = did.split('@');
+ const bookId = partsArr[0];
+ const contentDesc = decodeURIComponent(partsArr[1] || '');
+ const postData = {
+ "bookId": bookId, "productId": "2a8c14d1-72e7-498b-af23-381028eb47c0",
+ "vestId": "2be070e0-c824-4d0e-a67a-8f688890cadb", "channel": "oppo19",
+ "osType": "android", "version": "20", "token": "202509271001001446030204698626"
+ };
+ const response = await request(`${platRule.host}${platRule.detail}`, {
+ method: 'GET', headers: aggConfig.headers.form, data: postData
+ });
+ try {
+ const res = JSON.parse(response);
+ const data = res.data || [];
+ const playUrls = data.map((vodItem, index) => {
+ const playUrl = vodItem.shortPlayList?.[0]?.chapterShortPlayVoList?.[0]?.shortPlayUrl || '';
+ return playUrl ? `第${index + 1}集$${playUrl}` : null;
+ }).filter(Boolean).join('#');
+ vod = { vod_id: id, vod_name: '星星短剧', vod_content: contentDesc, vod_play_from: '星星短剧', vod_play_url: playUrls || '暂无播放地址$0' };
+ } catch (e) { log(2, '星星详情', e.message); }
+ break;
+ }
+ case '好看': {
+ const commonlistId = Date.now().toString().substring(0, 13);
+ const innerParams = `enable_enter_playlet=0&seek_time=0&hotspot=0&auto_show_hot_point_panel=0&type=playlet&commonlist_id=${commonlistId}&scene=&vid=&enable_atlas=0&mark_pn=&uk=&ctime=0&from=playlet_new&id=${did}&rn=10&pn=1&direction=3`;
+ const listResponse = await request(`${platRule.host}${platRule.detail_list}`, {
+ method: 'POST', headers: aggConfig.headers.haokan, data: { "video/commonlist": innerParams }
+ });
+ try {
+ const resObj = JSON.parse(listResponse);
+ const firstVideo = resObj['video/commonlist']?.data?.results?.[0];
+ const vid = firstVideo?.content?.vid;
+ const detailResponse = await request(`${platRule.host}${platRule.detail}`, {
+ method: 'POST', headers: aggConfig.headers.haokan, data: { "vid": vid, "playlet_id": did }
+ });
+ const detailDataObj = JSON.parse(detailResponse).data || {};
+ let vidList = detailDataObj.vid_list || [];
+ if (vidList.length === 0 && detailDataObj.results) vidList = detailDataObj.results.map(item => item.vid);
+ const playList = vidList.map((v, i) => `第${i + 1}集$${did}@${v}`).join('#');
+ vod = {
+ vod_id: id, vod_name: detailDataObj.playlet_title || '', vod_pic: detailDataObj.playlet_poster || '',
+ vod_remarks: (detailDataObj.hot_value || '') + '播放·' + (detailDataObj.episodes_num || '') + '集',
+ vod_content: detailDataObj.description || '', vod_play_from: '好看短剧', vod_play_url: playList
+ };
+ } catch (e) { log(2, '好看详情', e.message); }
+ break;
+ }
+ }
+
+ return JSON.stringify({ list: [vod] });
+}
+
+// ==================== 搜索 ====================
+// ==================== 搜索 ====================
+async function cfs(siteId, wd, pg) {
+ const start = Date.now();
+ const page = pg || 1;
+ const searchLimit = aggConfig.searchLimit;
+ const searchTimeout = aggConfig.searchTimeout;
+ let results = [];
+
+ const cacheKey = `${siteId}_${wd}_${page}`;
+ const cachedResult = getSearchCache(cacheKey);
+ if (cachedResult) {
+ return cachedResult;
+ }
+
+ log(0, '搜索', `${siteId} 关键词: ${wd}, 页码: ${page}`);
+
+ const platformItem = platformList.find(p => p.id === siteId);
+ if (platformItem && cate_remove.some(word => new RegExp(word, 'i').test(platformItem.name))) {
+ log(2, '搜索', `跳过平台: ${siteId}`);
+ return JSON.stringify({ list: [], page, pagecount: page + 1, limit: 0, total: 0 });
+ }
+
+ const platRule = rule[siteId];
+
+ switch (siteId) {
+ case '百度': {
+ const requestUrl = `${platRule.host}${platRule.search}`;
+ const postData = {
+ "data": {
+ "query": wd,
+ "page": page,
+ "attribute": ["title"],
+ "fe_page_type": "search",
+ "extra": {
+ "tab_id": "216",
+ "flow_tabid": "13",
+ "shortplay_source": "feed",
+ "from": "feed",
+ "tab_type": "搜索",
+ "sub_template": "playlet_search_result"
+ }
+ }
+ };
+
+ let html = await request(requestUrl, {
+ method: 'POST',
+ headers: aggConfig.headers.baidu,
+ data: postData,
+ timeout: searchTimeout
+ });
+
+ let res = JSON.parse(html);
+ let items = res.data?.itemList || res.data?.data?.itemList || res.itemList || res.data?.list || res.list || [];
+ log(0, '百度搜索', `获取到 ${items.length} 条`);
+ results = items.map(it => ({
+ vod_id: `百度@${it.nid?.split("_")[1] || it.collId || ''}`,
+ vod_name: it.title || '未知短剧',
+ vod_pic: it.img || '',
+ vod_remarks: '百度短剧 | ' + (it.collNum || it.updateStatus || "搜索短剧"),
+ vod_content: it.description || ''
+ }));
+ break;
+ }
+
+ case '七猫': {
+ try {
+ const trackId = 'ec1280db127955061754851657967';
+ let signString = `extend=page=${page}read_preference=0track_id=${trackId}wd=${wd}${aggConfig.keys}`;
+ let sign = await md5(signString);
+ const encodedKey = encodeURIComponent(wd);
+ const url = `${platRule.host}${platRule.search}?extend=&page=${page}&wd=${encodedKey}&read_preference=0&track_id=${trackId}&sign=${sign}`;
+ const headers = await getQiMaoHeaders();
+ const response = await request(url, { method: 'GET', headers, timeout: searchTimeout });
+ const res = JSON.parse(response || '{}');
+ let items = res.data?.list || res.list || [];
+ log(0, '七猫搜索', `获取到 ${items.length} 条`);
+ results = items.map(item => ({
+ vod_id: `七猫@${encodeURIComponent(item.playlet_id || item.id || '')}`,
+ vod_name: item.title || '未知标题',
+ vod_pic: item.image_link || item.cover || '',
+ vod_remarks: '七猫短剧 | ' + (item.tags || '') + ' ' + (item.total_episode_num ? `${item.total_episode_num}集` : ''),
+ vod_content: item.intro || ''
+ }));
+ } catch (e) {
+ log(2, '七猫搜索', e.message);
+ }
+ break;
+ }
+
+ case '星芽': {
+ const postData = { "text": wd };
+ const requestUrl = `${platRule.host}${platRule.search}`;
+ const response = await request(requestUrl, {
+ method: 'POST',
+ headers: xingya_headers,
+ data: postData,
+ timeout: searchTimeout
+ });
+ const res = JSON.parse(response || '{}');
+ const items = res.data?.theater?.search_data || [];
+ log(0, '星芽搜索', `获取到 ${items.length} 条`);
+ results = items.map(item => ({
+ vod_id: `星芽@${item.id}`,
+ vod_name: item.title || '',
+ vod_pic: item.cover_url || '',
+ vod_remarks: '星芽短剧 | ' + (item.total ? `${item.total}集` : ''),
+ vod_content: item.introduction || ''
+ }));
+ break;
+ }
+
+ case '西饭': {
+ const ts = Math.floor(Date.now() / 1000);
+ const url = `${platRule.host}${platRule.search}?keyword=${encodeURIComponent(wd)}&pageIndex=${page}&version=2001001&androidVersionCode=28&requestId=${ts}ea3a14bc0317d76f&appId=drama&teenMode=false&userBaseMode=false&${XIFAN_SESSION_PARAMS}`;
+ const response = await request(url, { headers: aggConfig.headers.form, timeout: searchTimeout });
+ const res = JSON.parse(response || '{}');
+ let items = [];
+ if (res.result?.elements) {
+ res.result.elements.forEach(soup => {
+ if (soup.contents) {
+ soup.contents.forEach(vod => {
+ const dj = vod.duanjuVo || {};
+ items.push({
+ vod_id: `西饭@${dj.duanjuId || ''}#${dj.source || ''}`,
+ vod_name: dj.title || '未知标题',
+ vod_pic: dj.coverImageUrl || '',
+ vod_remarks: '西饭短剧 | ' + (dj.total ? `${dj.total}集` : ''),
+ vod_content: ''
+ });
+ });
+ }
+ });
+ }
+ log(0, '西饭搜索', `获取到 ${items.length} 条`);
+ results = items;
+ break;
+ }
+
+ case '牛牛': {
+ const postData = {
+ "condition": { "typeId": "S1", "value": wd },
+ "pageNum": page,
+ "pageSize": searchLimit
+ };
+ const response = await request(`${platRule.host}${platRule.search}`, {
+ method: 'POST',
+ headers: niuniu_headers,
+ data: postData,
+ timeout: searchTimeout
+ });
+ const res = JSON.parse(response || '{}');
+ const items = res.data?.records || [];
+ log(0, '牛牛搜索', `获取到 ${items.length} 条`);
+ results = items.map(item => ({
+ vod_id: `牛牛@${item.id}`,
+ vod_name: item.name || '',
+ vod_pic: item.cover || '',
+ vod_remarks: '牛牛短剧 | ' + (item.totalEpisode ? `${item.totalEpisode}集` : ''),
+ vod_content: ''
+ }));
+ break;
+ }
+
+ case '围观': {
+ const postData = {
+ "audience": "",
+ "page": page,
+ "pageSize": 30,
+ "searchWord": wd,
+ "subject": ""
+ };
+ const response = await request(`${platRule.host}${platRule.search}`, {
+ method: 'POST',
+ headers: aggConfig.headers.json,
+ data: postData,
+ timeout: searchTimeout
+ });
+ const res = JSON.parse(response || '{}');
+ const items = (res.code === 200 && res.data) ? res.data : [];
+ log(0, '围观搜索', `获取到 ${items.length} 条`);
+ results = items.map(it => ({
+ vod_id: `围观@${it.oneId || ''}`,
+ vod_name: it.title || '未知标题',
+ vod_pic: it.vertPoster || it.horizonPoster || '',
+ vod_remarks: '围观短剧 | 集数:' + (it.episodeCount || 0),
+ vod_content: it.description || ''
+ }));
+ break;
+ }
+
+ case '河马': {
+ try {
+ const hmbody = JSON.stringify({
+ "keyword": wd,
+ "page": page,
+ "size": searchLimit
+ });
+ const encryptedBody = hemaEncrypt(hmbody);
+ const response = await request(`${platRule.host}${platRule.search}`, {
+ method: 'POST',
+ headers: hema_headers,
+ data: encryptedBody,
+ timeout: searchTimeout
+ });
+ const res = JSON.parse(response || '{}');
+ const xmres = res.data;
+ if (xmres) {
+ const dexmres = hemaDecrypt(xmres);
+ if (dexmres && dexmres !== '{}') {
+ const xmlist = JSON.parse(dexmres).searchVos || [];
+ log(0, '河马搜索', `获取到 ${xmlist.length} 条`);
+ results = xmlist.map(video => ({
+ vod_id: `河马@${video.bookId}`,
+ vod_name: video.bookName || '',
+ vod_pic: (video.coverWap || '') + '@Referer=',
+ vod_remarks: `河马短剧 | 共${video.updateNum || 0}集`,
+ vod_content: video.introduction || ''
+ }));
+ }
+ }
+ } catch (e) {
+ log(2, '河马搜索', e.message);
+ }
+ break;
+ }
+
+ case '星星': {
+ try {
+ const postData = {
+ "productId": "2a8c14d1-72e7-498b-af23-381028eb47c0",
+ "vestId": "2be070e0-c824-4d0e-a67a-8f688890cadb",
+ "channel": "oppo19",
+ "osType": "android",
+ "version": "20",
+ "token": "202509271001001446030204698626",
+ "keyWord": wd,
+ "pageNum": String(page),
+ "pageSize": String(searchLimit)
+ };
+ const response = await request(`${platRule.host}${platRule.search}`, {
+ method: 'GET',
+ headers: aggConfig.headers.json,
+ data: postData,
+ timeout: searchTimeout
+ });
+ const res = JSON.parse(response || '{}');
+ const items = res.data?.datalist || [];
+ log(0, '星星搜索', `获取到 ${items.length} 条`);
+ results = items.map(vod => ({
+ vod_id: `星星@${vod.id}@${encodeURIComponent(vod.introduction || '')}`,
+ vod_name: vod.name || '',
+ vod_pic: vod.icon || '',
+ vod_remarks: `星星短剧 | ${vod.heat || 0}万播放`,
+ vod_content: vod.introduction || ''
+ }));
+ } catch (e) {
+ log(2, '星星搜索', e.message);
+ }
+ break;
+ }
+
+ case '好看': {
+ try {
+ const postData = { "search_word": wd };
+ const response = await request(`${platRule.host}${platRule.search}`, {
+ method: 'POST',
+ headers: aggConfig.headers.haokan,
+ data: postData,
+ timeout: searchTimeout
+ });
+ const res = JSON.parse(response || '{}');
+ const items = res.data || [];
+ log(0, '好看搜索', `获取到 ${items.length} 条`);
+ results = items.map(item => ({
+ vod_id: `好看@${item.id}`,
+ vod_name: item.title || '',
+ vod_pic: item.cover_url || '',
+ vod_remarks: '好看短剧 | ' + (item.tag ? item.tag.replace(/\//g, '·') : ''),
+ vod_content: ''
+ }));
+ } catch (e) {
+ log(2, '好看搜索', e.message);
+ }
+ break;
+ }
+ }
+
+ // 关键词过滤
+ const keywordRegex = new RegExp(wd, "i");
+ let filteredResults = [];
+ for (let item of results) {
+ if (item.vod_name && keywordRegex.test(item.vod_name)) {
+ filteredResults.push(item);
+ }
+ }
+
+ log(0, `${siteId}搜索`, `原始 ${results.length} 条,匹配后 ${filteredResults.length} 条`);
+ logTime(start, 'cfs');
+
+ const resultJson = JSON.stringify({
+ list: filteredResults,
+ page: page,
+ pagecount: page + 1,
+ limit: filteredResults.length,
+ total: filteredResults.length * (page + 1)
+ });
+
+ setSearchCache(cacheKey, resultJson);
+ return resultJson;
+}
+
+// ==================== 全局搜索 ====================
+async function search(wd, quick, pg) {
+ const start = Date.now();
+ const videos = [];
+ const page = pg || 1;
+
+ log(1, '全局搜索', `关键词: ${wd}, 页码: ${page}`);
+
+ const platForms = platformList.filter(item => !cate_remove.some(word => new RegExp(word, 'i').test(item.name)));
+ log(0, '全局搜索', `共 ${platForms.length} 个平台待搜索`);
+
+ const searchPromises = platForms.map(async (platform) => {
+ try {
+ const result = await cfs(platform.id, wd, page);
+ return JSON.parse(result).list || [];
+ } catch (e) {
+ log(2, '全局搜索', `${platform.id} 异常: ${e.message}`);
+ return [];
+ }
+ });
+
+ const searchResults = await Promise.all(searchPromises);
+
+ let totalResults = 0;
+ const hasResultPlats = [];
+ const noResultPlats = [];
+
+ searchResults.forEach((list, idx) => {
+ const platform = platForms[idx];
+ const count = list.length;
+ totalResults += count;
+ if (count > 0) {
+ hasResultPlats.push(`${platform.name}(${count}条)`);
+ } else {
+ noResultPlats.push(platform.name);
+ }
+ videos.push(...list);
+ });
+
+ if (hasResultPlats.length > 0) {
+ log(1, '搜索结果', `有结果: ${hasResultPlats.join(', ')}`);
+ } else {
+ log(2, '搜索结果', `无结果`);
+ }
+
+ if (noResultPlats.length > 0) {
+ log(2, '搜索结果', `无结果平台: ${noResultPlats.join(', ')}`);
+ }
+
+ log(1, '搜索结果汇总', `共 ${totalResults} 条`);
+
+ // 关键词过滤
+ const keywordRegex = new RegExp(wd, "i");
+ let filteredResults = [];
+ for (let item of videos) {
+ if (item.vod_name && keywordRegex.test(item.vod_name)) {
+ filteredResults.push(item);
+ }
+ }
+
+ log(1, '全局搜索', `原始 ${videos.length} 条,过滤后 ${filteredResults.length} 条`);
+ logTime(start, 'search');
+
+ return JSON.stringify({
+ list: filteredResults,
+ page: page,
+ pagecount: page + 1,
+ limit: filteredResults.length,
+ total: filteredResults.length * (page + 1)
+ });
+}
+// ==================== 播放 ====================
+async function play(flag, id, flags) {
+ log(0, '播放', `${flag} ${id.substring(0, 50)}`);
+
+ if (/好看|百度/.test(flag)) {
+ let parts = id.split('@');
+ let playletId = parts[0];
+ let vid = parts[1];
+
+ if (/好看/.test(flag)) {
+ const innerParams = `method=post&vid=${vid}&immersive_mode=v4_5&tplname=feed_small_video&tag=playlet_talos&tab=detail&external_from=&is_dp_video=0&immersive_square_type=3&video_set_id=${playletId}&play_screen_type=1&play_volume_type=2&play_external_device_type=1`;
+ const response = await request(`${rule.好看.host}${rule.好看.play}`, {
+ method: 'POST', headers: aggConfig.headers.haokan, data: { "video/relate": innerParams }
+ });
+ try {
+ const videoData = JSON.parse(response)['video/relate']?.data?.cur_video || {};
+ const urlMap = {};
+ if (videoData.clarityUrl) videoData.clarityUrl.forEach(c => { if (c.title && c.url) urlMap[c.title] = c.url; });
+ if (videoData.video_list) Object.entries(videoData.video_list).forEach(([k, v]) => { if (!urlMap[k]) urlMap[k] = v; });
+ const sortedQualities = Object.keys(urlMap).sort((a, b) => {
+ const order = { '4k': 0, '2k': 1, '高清': 2, '蓝光': 3, '超清': 4, '标清': 5 };
+ return (order[a] ?? 999) - (order[b] ?? 999);
+ });
+ const playUrls = [];
+ sortedQualities.forEach(q => playUrls.push(q, urlMap[q]));
+ if (playUrls.length > 0) return JSON.stringify({ parse: 0, url: playUrls });
+ } catch (e) { }
+ return JSON.stringify({ parse: 0, url: id });
+ }
+
+ if (/百度/.test(flag)) {
+ const response = await request(`${rule.百度.detailHost}${rule.百度.play}`, {
+ method: 'POST', headers: aggConfig.headers.baidu, data: { "method": "post", "vid": vid }
+ });
+ let json = JSON.parse(response)["video/relate"]?.data?.cur_video;
+ if (!json?.clarityUrl) return JSON.stringify({ parse: 0, url: id });
+ let urls = json.clarityUrl.filter(item => item.url && item.title).map(item => ({ title: item.title, url: item.url, order: { '蓝光': 1, '超清': 2, '标清': 3 }[item.title] || 999 })).sort((a, b) => a.order - b.order).flatMap(item => [item.title, item.url]);
+ return JSON.stringify({ parse: urls.length > 0 ? 0 : 1, url: urls.length > 0 ? urls : id });
+ }
+ }
+
+ if (/河马/.test(flag)) {
+ try {
+ let arr = id.split("++");
+ let chapterId = arr[0], bookId = arr[2];
+ let fsbody = JSON.stringify({ "bookId": bookId, "chapterId": chapterId, "unClockType": "pay", "confirmPay": 2, "autoPayFlag": true, "omap": { "channelName": "精选", "logId": "17a6500357709bb2547e1e122b438cfc", "originName": "书城", "recId": "bigdata_rec", "scene": "nsc_727", "sceneId": "dzmf_video_sc_reco", "strategyId": "g6y6b5sq" } });
+ let fsbodyEnc = hemaEncrypt(fsbody);
+ let response = await request(rule.河马.host + rule.河马.play, {
+ method: 'POST', headers: { ...hema_headers, 'Content-Type': 'application/x-www-form-urlencoded' }, data: fsbodyEnc
+ });
+ let res = JSON.parse(response);
+ let fshtml = res.data;
+ if (fshtml) {
+ let fsdata = hemaDecrypt(fshtml);
+ if (fsdata && fsdata !== '{}') {
+ let parsed = JSON.parse(fsdata);
+ if (parsed.chaptersPayType == '免费') {
+ let url = parsed.chapterInfo?.[0]?.content?.m3u8720p || [];
+ if (url) return JSON.stringify({ parse: 0, url: url });
+ }
+ }
+ }
+ let playurl = "https://api.cenguigui.cn/api/duanju/hema.php?book_id=" + bookId + "&video_id=" + chapterId + "&type=mp4";
+ return JSON.stringify({ parse: 0, url: playurl + '#isVideo=true#' });
+ } catch (e) {
+ return JSON.stringify({ parse: 0, url: id });
+ }
+ }
+
+ if (/牛牛/.test(flag)) {
+ const inputArr = id.split('+');
+ if (inputArr.length === 2) {
+ let ep = inputArr[0].match(/\d+/)?.[0] || "";
+ let videoId = inputArr[1];
+ let response = await request(`${rule.牛牛.host}/api/v1/app/play/movieDetails`, {
+ method: 'POST', headers: niuniu_headers, data: { "id": videoId, "source": 0, "typeId": "S1", "userId": "546932", "episodeId": ep }
+ });
+ let result = JSON.parse(response);
+ if (result.code == 200 && result.data?.url) return JSON.stringify({ parse: 0, url: result.data.url });
+ } else if (inputArr.length === 3) {
+ let index = inputArr[0], lock_type = inputArr[1], thirdPlayId = inputArr[2];
+ let data1 = `not_include=0&lock_free=1&type=1&clientVersion=v5.2.5&uuid=6IDYUSASPQY5BBVACWQW3LLTPV4V7DE26UOCX5TZTVUGX4VUJNXQ01&resolution=1080*2320&openudid=82f4175d577a2939&dt=22021211RC&os_api=31&install_id=1496879012031075&sdk_version=1.1.3.0&siteid=5627189&dev_log_aid=667431&oaid=abec0dfff623201b×tamp=1752498494&direction=0&ac=mobile&os=Android&vod_version=1.10.21.6-tob&os_version=12&count=1&index=1&shortplay_id=${thirdPlayId}&sha1=46121F77CE2FCAD3DBC3B9EC8A24908C1A8AD6D9&device_brand=Redmi&package_name=com.niuniu.ztdh.app`;
+ if (lock_type === "free") {
+ let frhtml = await niuniuPost(rule.牛牛.detail2, data1, index);
+ if (frhtml?.data?.list?.[0]) {
+ let url = base64Decode(frhtml.data.list[0].video_model.video_list.video_1.main_url);
+ return JSON.stringify({ parse: 0, url });
+ }
+ } else {
+ let unlockData = `ac=mobile&os=Android&vod_version=1.10.21.6-tob&os_version=12&lock_ad=3&lock_free=3&type=1&clientVersion=v5.2.5&uuid=6IDYUSASPQY5BBVACWQW3LLTPV4V7DE26UOCX5TZTVUGX4VUJNXQ01&resolution=1080*2320&openudid=82f4175d577a2939&shortplay_id=${thirdPlayId}&dt=22021211RC&sha1=46121F77CE2FCAD3DBC3B9EC8A24908C1A8AD6D9&lock_index=21&os_api=31&install_id=1496879012031075&device_brand=Redmi&sdk_version=1.1.3.0&package_name=com.niuniu.ztdh.app&siteid=5627189&dev_log_aid=667431&oaid=abec0dfff623201b×tamp=1752498493`;
+ await niuniuPost(rule.牛牛.unlock, unlockData, index);
+ let unhtml = await niuniuPost(rule.牛牛.detail2, data1, index);
+ if (unhtml?.data?.list?.[0]) {
+ let url = base64Decode(unhtml.data.list[0].video_model.video_list.video_1.main_url);
+ return JSON.stringify({ parse: 0, url });
+ }
+ }
+ }
+ return JSON.stringify({ parse: 0, url: id });
+ }
+
+ if (/围观/.test(flag)) {
+ try {
+ let playSetting = typeof id === 'string' ? JSON.parse(id) : id;
+ let urls = [];
+ if (playSetting.super) urls.push("超清", playSetting.super);
+ if (playSetting.high) urls.push("高清", playSetting.high);
+ if (playSetting.normal) urls.push("流畅", playSetting.normal);
+ return JSON.stringify({ parse: 0, url: urls.length ? urls : id });
+ } catch (e) {
+ return JSON.stringify({ parse: 0, url: id });
+ }
+ }
+
+ return JSON.stringify({ parse: 0, url: id });
+}
+
+// ==================== 工具函数 ====================
+function buildUrlQuery(params) {
+ return Object.keys(params).map(k => `${encodeURIComponent(k)}=${encodeURIComponent(params[k])}`).join('&');
+}
+
+async function md5(str) {
+ return CryptoJS.MD5(str).toString(CryptoJS.enc.Hex).toLowerCase();
+}
+
+function base64Encode(text) {
+ return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(text));
+}
+
+function base64Decode(text) {
+ return CryptoJS.enc.Utf8.stringify(CryptoJS.enc.Base64.parse(text));
+}
+
+function hmacSHA256(data, key) {
+ return CryptoJS.HmacSHA256(data, key).toString(CryptoJS.enc.Hex);
+}
+
+function aesEncryptECB(text, keyStr) {
+ let key = CryptoJS.enc.Utf8.parse(keyStr);
+ return CryptoJS.AES.encrypt(text, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }).toString();
+}
+
+function aesDecryptECB(ciphertext, keyStr) {
+ let key = CryptoJS.enc.Utf8.parse(keyStr);
+ return CryptoJS.AES.decrypt(ciphertext, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }).toString(CryptoJS.enc.Utf8);
+}
+
+function hemaEncrypt(plaintext) {
+ let key = CryptoJS.enc.Hex.parse("647a6b6a67667978677368796c677a6d");
+ let iv = CryptoJS.enc.Hex.parse("6170697570646f776e65646372797074");
+ let encrypted = CryptoJS.AES.encrypt(plaintext, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
+ return encrypted.ciphertext.toString(CryptoJS.enc.Hex).toUpperCase();
+}
+
+function hemaDecrypt(word) {
+ let key = CryptoJS.enc.Hex.parse("647a6b6a67667978677368796c677a6d");
+ let iv = CryptoJS.enc.Hex.parse("6170697570646f776e65646372797074");
+ let srcs = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Hex.parse(word));
+ let decrypt = CryptoJS.AES.decrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
+ return decrypt.toString(CryptoJS.enc.Utf8);
+}
+
+async function niuniuPost(url1, data1, index) {
+ let t10 = String(Math.floor(Date.now() / 1000));
+ let X_Nonce = "X9UknYKtLa3DmtjC";
+ let body1 = data1.replace(/&lock_free=\d+/, "&lock_free=1").replace(/×tamp=\d+/, "×tamp=" + t10).replace(/&count=\d+/, "&count=1").replace(/&index=\d+/, "&index=" + index).replace(/&lock_ad=\d+/, "&lock_ad=1").replace(/&lock_index=\d+/, "&lock_index=" + index);
+ let body2 = aesEncryptECB(body1, 'ce49b18dd4e0a4d8');
+ let signature = hmacSHA256(t10 + X_Nonce + body1, 'aceaa47f96b4875d446b2e1d97e03bbb');
+ let res = await request(url1, {
+ method: 'POST',
+ headers: { 'X-Salt': 'FD8188A8D5', 'X-Nonce': X_Nonce, 'X-Timestamp': t10, 'X-Access-Token': niuniu_access_token, 'X-Signature': signature, 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'okhttp/4.12.0' },
+ data: body2
+ });
+ if (!res) return {};
+ try { return JSON.parse(aesDecryptECB(res, 'ce49b18dd4e0a4d8')); } catch (e) { return {}; }
+}
+
+async function request(url, options = {}) {
+ let reqHeaders = { ...aggConfig.headers.form, ...options.headers };
+ let finalUrl = url;
+ let requestData = options.data;
+ let useBody = false;
+
+ // POST + 字符串 + form类型 → 直接作为body发送(保留空格,牛牛接口需要)
+ if (options.method === 'POST' && typeof options.data === 'string' && reqHeaders['Content-Type']?.includes('form')) {
+ useBody = true;
+ }
+
+ // GET请求处理
+ if ((options.method === 'GET' || !options.method) && options.data && !useBody) {
+ let queryData = options.data;
+ if (typeof queryData === 'string') {
+ try { queryData = JSON.parse(queryData); } catch (e) { queryData = {}; }
+ }
+ finalUrl = url + (url.includes('?') ? '&' : '?') + buildUrlQuery(queryData);
+ requestData = null;
+ }
+
+ // 确定postType(关键!告诉req如何处理data)
+ let postType = '';
+ if (!useBody && options.data) {
+ let ct = reqHeaders['Content-Type'] || '';
+ postType = ct.includes('json') ? 'json' : (ct.includes('form') ? 'form' : '');
+ }
+
+ try {
+ const res = await req(finalUrl, {
+ method: options.method || 'GET',
+ headers: reqHeaders,
+ ...(useBody ? { body: requestData } : { data: requestData, postType: postType }),
+ timeout: options.timeout || 15000
+ });
+ return res?.content || res?.data || res;
+ } catch (e) {
+ log(2, '请求', e.message);
+ return null;
+ }
+}
+
+// ==================== 导出 ====================
+export function __jsEvalReturn() {
+ return { init, home, homeVod, category, detail, play, search };
+}
\ No newline at end of file
diff --git a/cpu_iy3/lib/mwcy.js b/cpu_iy3/lib/mwcy.js
new file mode 100644
index 00000000..bb8f941a
--- /dev/null
+++ b/cpu_iy3/lib/mwcy.js
@@ -0,0 +1,589 @@
+/**
+ * title: "喵物次元",
+ * logo: "https://www.mwcy.net/favicon.ico",
+ * more: {
+ * sourceTag: "动漫"
+ * }
+ */
+import { Crypto, load, _ } from 'assets://js/lib/cat.js';
+
+const HOST = 'https://www.mwcy.net';
+const UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36';
+
+let siteKey = "", siteType = "", sourceKey = "", ext = "";
+
+function init(cfg) {
+ siteKey = cfg.skey;
+ siteType = cfg.stype;
+ sourceKey = cfg.sourceKey;
+ ext = cfg.ext;
+ // 如果ext传入则覆盖HOST(保持兼容)
+ if (ext && ext.indexOf('http') == 0) HOST = ext;
+}
+
+// ==================== 辅助函数 ====================
+function fixUrl(url) {
+ if (!url) return '';
+ url = url.trim();
+ if (url.startsWith('//')) return 'https:' + url;
+ if (url.startsWith('/')) return HOST + url;
+ return url;
+}
+
+function cleanText(text) {
+ if (!text) return '';
+ return text.replace(/\s+/g, ' ').trim();
+}
+
+function isVideoFormat(url) {
+ if (!url) return false;
+ return /\.(m3u8|mp4|mkv|flv|avi|mov|wmv|webm)(\?.*)?$/i.test(url);
+}
+
+// ==================== 1. 首页内容与筛选配置 ====================
+function home(filter) {
+ // 固定分类(6个)
+ const classes = [
+ { type_id: "1", type_name: "番剧" },
+ { type_id: "22", type_name: "连载新番" },
+ { type_id: "24", type_name: "国漫" },
+ { type_id: "2", type_name: "剧场" },
+ { type_id: "25", type_name: "欧美动漫" },
+ { type_id: "26", type_name: "4K专区" }
+ ];
+
+ // ---- 公共筛选选项 ----
+ // 年份:当前年份往前30年 + 更早
+ const yearList = (() => {
+ const years = [{ n: "全部", v: "" }];
+ const currentYear = new Date().getFullYear();
+ for (let y = currentYear; y >= currentYear - 30; y--) {
+ years.push({ n: String(y), v: String(y) });
+ }
+ years.push({ n: "更早", v: "更早" });
+ return years;
+ })();
+
+ // 字母
+ const letterList = (() => {
+ const letters = [{ n: "全部", v: "" }];
+ const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');
+ chars.forEach(c => letters.push({ n: c, v: c }));
+ letters.push({ n: "0-9", v: "0-9" });
+ return letters;
+ })();
+
+ // 排序
+ const orderList = [
+ { n: "最新", v: "time" },
+ { n: "最热", v: "hits" },
+ { n: "评分", v: "score" }
+ ];
+
+ // 地区(用于剧场、欧美动漫)
+ const areaList = [
+ { 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: "意大利" },
+ { n: "西班牙", v: "西班牙" },
+ { n: "加拿大", v: "加拿大" },
+ { n: "其他", v: "其他" }
+ ];
+
+ // ---- 按分类配置筛选器 ----
+ const filters = {
+ "1": [ // 番剧
+ { key: "year", name: "年份", value: yearList },
+ { key: "letter", name: "字母", value: letterList },
+ { key: "order", name: "排序", value: orderList }
+ ],
+ "22": [ // 连载新番
+ { key: "year", name: "年份", value: yearList },
+ { key: "letter", name: "字母", value: letterList },
+ { key: "order", name: "排序", value: orderList }
+ ],
+ "24": [ // 国漫
+ { key: "year", name: "年份", value: yearList },
+ { key: "letter", name: "字母", value: letterList },
+ { key: "order", name: "排序", value: orderList }
+ ],
+ "2": [ // 剧场
+ { key: "area", name: "地区", value: areaList },
+ { key: "year", name: "年份", value: yearList },
+ { key: "letter", name: "字母", value: letterList },
+ { key: "order", name: "排序", value: orderList }
+ ],
+ "25": [ // 欧美动漫
+ { key: "area", name: "地区", value: areaList },
+ { key: "year", name: "年份", value: yearList },
+ { key: "letter", name: "字母", value: letterList },
+ { key: "order", name: "排序", value: orderList }
+ ],
+ "26": [ // 4K专区
+ { key: "letter", name: "字母", value: letterList },
+ { key: "order", name: "排序", value: orderList }
+ ]
+ };
+
+ return JSON.stringify({ class: classes, filters: filters });
+}
+
+// ==================== 2. 首页推荐视频 ====================
+async function homeVod() {
+ try {
+ const res = await req(HOST, { headers: { 'User-Agent': UA } });
+ const $ = load(res.content);
+
+ // 定位“十月新番”区域
+ let section = null;
+ $('.box-width.wow.fadeInUp .title .title-h').each((i, el) => {
+ if ($(el).text().trim() === '十月新番') {
+ section = $(el).closest('.box-width').find('.public-r');
+ return false;
+ }
+ });
+ if (!section) {
+ section = $('.public-list-box.public-pic-b').parent();
+ }
+
+ const items = section ? section.find('.public-list-box.public-pic-b') : $('.public-list-box.public-pic-b');
+ const videos = [];
+ const seen = new Set();
+
+ items.each((i, el) => {
+ const $el = $(el);
+ const $link = $el.find('a.public-list-exp');
+ const href = $link.attr('href');
+ if (!href || !href.startsWith('/bangumi/')) return;
+ const title = $el.find('.time-title').text().trim() || $link.attr('title') || '';
+ const pic = $link.find('img').attr('data-src') || $link.find('img').attr('src') || '';
+ const remarks = $el.find('.public-list-prb').text().trim() || '';
+ if (title && href) {
+ const vod_id = href.startsWith('http') ? href : HOST + href;
+ if (!seen.has(vod_id)) {
+ seen.add(vod_id);
+ videos.push({ vod_id, vod_name: title, vod_pic: pic, vod_remarks: remarks });
+ }
+ }
+ });
+
+ return JSON.stringify({ list: videos });
+ } catch (e) {
+ console.log('homeVod error:', e);
+ return null;
+ }
+}
+
+// ==================== 3. 分类内容爬取 ====================
+async function category(tid, pg, filter, extend) {
+ if (pg <= 0) pg = 1;
+ extend = extend || {};
+ const area = extend.area || '';
+ const year = extend.year || '';
+ const letter = extend.letter || '';
+ const order = extend.order || '';
+
+ // 构建URL
+ let url = `${HOST}/show/${tid}`;
+ const parts = [];
+ if (area) parts.push(`area/${encodeURIComponent(area)}`);
+ if (order) parts.push(`by/${encodeURIComponent(order)}`);
+ if (letter) parts.push(`letter/${encodeURIComponent(letter)}`);
+ if (year) parts.push(`year/${encodeURIComponent(year)}`);
+ if (pg > 1) parts.push(`page/${pg}`);
+
+ if (parts.length > 0) {
+ url += '/' + parts.join('/') + '.html';
+ } else {
+ url += (pg === 1 ? '.html' : `/page/${pg}.html`);
+ }
+
+
+ try {
+ const res = await req(url, { headers: { 'User-Agent': UA } });
+ const $ = load(res.content);
+
+ // 解析视频列表(多级兜底)
+ let items = $('.public-list-box.public-pic-b');
+ if (!items.length) items = $('.public-list-div').parent();
+
+ const videos = [];
+ const seen = new Set();
+
+ items.each((i, el) => {
+ const $el = $(el);
+ const $link = $el.find('a.public-list-exp');
+ const href = $link.attr('href');
+ if (!href) return;
+
+ let vod_id = href;
+ if (!href.startsWith('http')) vod_id = HOST + href;
+ // 如果是 /play/ 链接,转换为 /bangumi/
+ if (href.startsWith('/play/')) {
+ const match = href.match(/^\/play\/([^-]+)/);
+ if (match) {
+ vod_id = HOST + `/bangumi/${match[1]}.html`;
+ } else {
+ return;
+ }
+ } else if (!href.startsWith('/bangumi/')) {
+ return;
+ }
+
+ const title = $el.find('.time-title').text().trim() || $link.attr('title') || '';
+ const pic = $link.find('img').attr('data-src') || $link.find('img').attr('src') || '';
+ const remarks = $el.find('.public-list-prb').text().trim() || '';
+ if (title && vod_id && !seen.has(vod_id)) {
+ seen.add(vod_id);
+ videos.push({
+ vod_id,
+ vod_name: title,
+ vod_pic: fixUrl(pic),
+ vod_remarks: remarks
+ });
+ }
+ });
+
+ // 提取总页数
+ let pagecount = 1;
+ const pageTip = $('.page-tip').text().trim();
+ if (pageTip) {
+ const match = pageTip.match(/当前\d+\/(\d+)页/);
+ if (match) pagecount = parseInt(match[2]) || 1;
+ }
+ if (pagecount === 1) {
+ const lastPage = $('.page-link').last().attr('href');
+ if (lastPage) {
+ const m = lastPage.match(/page\/(\d+)\.html/);
+ if (m) pagecount = parseInt(m[1]) || 1;
+ }
+ }
+
+ return JSON.stringify({
+ list: videos,
+ page: pg,
+ pagecount: pagecount,
+ limit: 20,
+ total: videos.length
+ });
+ } catch (e) {
+ console.log('category error:', e);
+ return JSON.stringify({ list: [] });
+ }
+}
+
+// ==================== 4. 搜索功能 ====================
+async function search(wd) {
+ try {
+ const encoded = encodeURIComponent(wd);
+ const url = `${HOST}/search/wd/${encoded}.html`;
+
+ const res = await req(url, { headers: { 'User-Agent': UA } });
+ const $ = load(res.content);
+
+ // 搜索页结果使用 .vod-detail.search-list
+ let items = $('.vod-detail.search-list');
+ if (!items.length) items = $('.vod-detail');
+
+ const videos = [];
+ const seen = new Set();
+
+ items.each((i, el) => {
+ const $el = $(el);
+ // 标题和链接
+ let title = '';
+ let vod_id = '';
+ const titleEl = $el.find('h3.slide-info-title');
+ if (titleEl.length) title = titleEl.text().trim();
+
+ const linkEl = $el.find('a[target="_blank"]');
+ if (linkEl.length) {
+ const href = linkEl.attr('href');
+ if (href) {
+ if (href.startsWith('/bangumi/')) {
+ vod_id = HOST + href;
+ } else if (href.startsWith('/play/')) {
+ const match = href.match(/^\/play\/([^-]+)/);
+ if (match) vod_id = HOST + `/bangumi/${match[1]}.html`;
+ }
+ }
+ if (!title) title = linkEl.text().trim();
+ }
+ if (!title) {
+ // 从其他位置找
+ const altTitle = $el.find('.slide-info-title').text().trim();
+ if (altTitle) title = altTitle;
+ }
+
+ const pic = $el.find('.detail-pic img').attr('data-src') || $el.find('.detail-pic img').attr('src') || '';
+ const remarks = $el.find('.slide-info-remarks').first().text().trim() || '';
+
+ if (title && vod_id && !seen.has(vod_id)) {
+ seen.add(vod_id);
+ videos.push({
+ vod_id,
+ vod_name: title,
+ vod_pic: fixUrl(pic),
+ vod_remarks: remarks
+ });
+ }
+ });
+
+ // 总页数
+ let pagecount = 1;
+ const pageTip = $('.page-tip').text().trim();
+ if (pageTip) {
+ const match = pageTip.match(/当前\d+\/(\d+)页/);
+ if (match) pagecount = parseInt(match[2]) || 1;
+ }
+ return JSON.stringify({
+ list: videos,
+ page: 1,
+ pagecount: pagecount,
+ limit: 20,
+ total: videos.length
+ });
+ } catch (e) {
+ console.log('search error:', e);
+ return JSON.stringify({ list: [] });
+ }
+}
+
+// ==================== 5. 详情页解析 ====================
+async function detail(id) {
+ try {
+ const url = id.startsWith('http') ? id : HOST + id;
+ const res = await req(url, { headers: { 'User-Agent': UA } });
+ const $ = load(res.content);
+
+ // 标题
+ let vod_name = $('h3.slide-info-title').text().trim();
+ if (!vod_name) vod_name = $('.player-title-link').text().trim();
+ if (!vod_name) vod_name = $('title').text().replace(/^.*? - /, '').replace(/ - .*$/, '');
+
+ // 封面
+ let vod_pic = $('.detail-pic img').attr('data-src') || $('.detail-pic img').attr('src') || '';
+ if (!vod_pic) vod_pic = $('.vod-detail .detail-pic img').attr('data-src') || '';
+
+ // 简介
+ let vod_content = $('#height_limit').text().trim() || $('.vod-news .text').first().text().trim() || '';
+
+ // 元数据:年份、地区、类型
+ let vod_year = '', vod_area = '';
+ $('.slide-info .slide-info-remarks a').each((i, el) => {
+ const text = $(el).text().trim();
+ if (/^\d{4}$/.test(text)) vod_year = text;
+ else if (['日本','大陆','香港','台湾','美国','英国','韩国','法国','德国','泰国','印度','意大利','西班牙','加拿大','其他'].includes(text)) {
+ vod_area = text;
+ }
+ });
+ // 类型
+ // ---- 提取演员和导演 ----
+ let vod_actor = '', vod_director = '', type_name = '';
+
+ // 方式1:从 .slide-info.partition 中提取
+ $('.slide-info.partition').each((i, el) => {
+ const $el = $(el);
+
+ // 类型
+ const typeStrong = $el.find('strong:contains("类型")');
+ if (typeStrong.length) {
+ const typeLinks = typeStrong.nextAll('a').map((j, a) => $(a).text().trim()).get();
+ if (typeLinks.length) type_name = typeLinks.join(',');
+ }
+ // 导演
+ const dirStrong = $el.find('strong:contains("导演")');
+ if (dirStrong.length) {
+ const dirLinks = dirStrong.nextAll('a').map((j, a) => $(a).text().trim()).get();
+ if (dirLinks.length) vod_director = dirLinks.join(',');
+ }
+ // 演员
+ const actorStrong = $el.find('strong:contains("演员")');
+ if (actorStrong.length) {
+ const actorLinks = actorStrong.nextAll('a').map((j, a) => $(a).text().trim()).get();
+ if (actorLinks.length) vod_actor = actorLinks.join(',');
+ }
+ });
+
+ // ---- 播放源与剧集 ----
+ const playFrom = [];
+ const playUrls = [];
+
+ // 获取线路名称
+ const sourceNames = [];
+ $('.anthology-tab a').each((i, el) => {
+ let name = $(el).text().trim();
+ name = name.replace(/
]*>.*?<\/i>/, '').replace(/ /g, '').replace(/]*>.*?<\/span>/, '').trim();
+ if (name) sourceNames.push(name);
+ });
+ if (!sourceNames.length) {
+ $('.vod-playerUrl').each((i, el) => {
+ let name = $(el).text().trim();
+ name = name.replace(/]*>.*?<\/i>/, '').replace(/]*>.*?<\/span>/, '').trim();
+ if (name) sourceNames.push(name);
+ });
+ }
+
+ const boxes = $('.anthology-list-box');
+ if (boxes.length && sourceNames.length) {
+ boxes.each((idx, box) => {
+ const name = sourceNames[idx] || ('线路' + (idx+1));
+ const episodes = [];
+ $(box).find('ul.anthology-list-play li a').each((j, ep) => {
+ const $ep = $(ep);
+ let epName = $ep.find('span').text().trim() || $ep.text().trim();
+ let href = $ep.attr('href');
+ if (epName && href) {
+ href = fixUrl(href);
+ episodes.push(epName + '$' + href);
+ }
+ });
+ if (episodes.length) {
+ playFrom.push(name);
+ playUrls.push(episodes.join('#'));
+ }
+ });
+ }
+
+ if (!playFrom.length) {
+ const singleBox = $('.anthology-list-play');
+ if (singleBox.length) {
+ const episodes = [];
+ singleBox.find('li a').each((j, ep) => {
+ const $ep = $(ep);
+ let epName = $ep.find('span').text().trim() || $ep.text().trim();
+ let href = $ep.attr('href');
+ if (epName && href) {
+ href = fixUrl(href);
+ episodes.push(epName + '$' + href);
+ }
+ });
+ if (episodes.length) {
+ playFrom.push('默认线路');
+ playUrls.push(episodes.join('#'));
+ }
+ }
+ }
+
+ const vod = {
+ vod_id: id,
+ vod_name,
+ vod_pic: fixUrl(vod_pic),
+ type_name,
+ vod_actor: vod_actor,
+ vod_director: vod_director,
+ vod_year,
+ vod_area,
+ vod_remarks: '',
+ vod_content,
+ vod_play_from: playFrom.join('$$$'),
+ vod_play_url: playUrls.join('$$$')
+ };
+
+ return JSON.stringify({ list: [vod] });
+ } catch (e) {
+ console.log('detail error:', e);
+ return null;
+ }
+}
+
+// ==================== 6. 播放链接解析 ====================
+async function play(flag, id, flags) {
+ try {
+ const playUrl = id.startsWith('http') ? id : HOST + id;
+ const res = await req(playUrl, { headers: { 'User-Agent': UA } });
+ const html = res.content;
+
+ const match = html.match(/player_.*?=([^]*?));
+ if (!match) return JSON.stringify({ parse: 1, url: playUrl });
+
+ const config = JSON.parse(match[1]);
+ let videoUrl = (config.url || '').trim();
+ if (!videoUrl) return JSON.stringify({ parse: 1, url: playUrl });
+
+ const directVideoPattern = /\.(m3u8|mp4|mkv|flv|avi|mov|wmv|webm)(\?.*)?$/i;
+ if (directVideoPattern.test(videoUrl)) {
+ console.log('videoUrl:', videoUrl);
+ return JSON.stringify({ parse: 0, url: videoUrl });
+ }
+
+ const tryParse = async (apiPath) => {
+ try {
+ const apiUrl = `https://player.catw.moe${apiPath}${encodeURIComponent(videoUrl)}&_t=${Date.now()}`;
+ const res = await req(apiUrl, { headers: { 'User-Agent': UA } });
+ const html = res.content;
+ // 提取 uid
+ const uidMatch = html.match(/"uid"\s*:\s*"([^"]+)"/);
+ const uid = uidMatch ? uidMatch[1] : null;
+ console.log('uid:', uid);
+ // 提取 url (ConFig 根层级那个长字符串)
+ const urlMatch = html.match(/"url"\s*:\s*"([^"]+)"/);
+ const url = urlMatch ? urlMatch[1] : null;
+ console.log('url:', url);
+ if (!uid || !url) {
+ console.log('[喵物次元] ConFig 缺少 uid 或 url');
+ return null;
+ }
+
+ const realUrl = decryptEcUrl(url, uid);
+ if (realUrl) {
+ return { url: realUrl, ua: UA };
+ }
+ return null;
+ } catch (e) {
+ return null;
+ }
+ };
+
+ let parsed = await tryParse('/player/ec.php?code=qw&if=1&url=');
+ if (!parsed) parsed = await tryParse('/art.php?url=');
+
+ if (parsed) {
+ return JSON.stringify({
+ parse: 0,
+ url: parsed.url,
+ header: { 'User-Agent': parsed.ua }
+ });
+ }
+
+ return JSON.stringify({ parse: 1, url: playUrl });
+ } catch (e) {
+ return JSON.stringify({ parse: 1, url: id });
+ }
+}
+
+function decryptEcUrl(encryptedBase64, uid) {
+ try {
+ const aesKey = '2890' + uid + 'tB959C';
+ const aesIv = '2F131BE91247866E';
+ // aesX(算法, 加密?false=解密, 数据, 输入是Base64?, key, iv, 输出是Base64?)
+ const realUrl = aesX('AES/CBC/PKCS7', false, encryptedBase64, true, aesKey, aesIv, false);
+ console.log(realUrl)
+ return realUrl;
+ } catch (e) {
+ return null;
+ }
+}
+
+// ==================== 导出 ====================
+export function __jsEvalReturn() {
+ return {
+ init,
+ home,
+ homeVod,
+ category,
+ detail,
+ play,
+ search
+ };
+}
\ No newline at end of file
diff --git a/cpu_iy3/lib/qmdj.py b/cpu_iy3/lib/qmdj.py
new file mode 100644
index 00000000..7d64d491
--- /dev/null
+++ b/cpu_iy3/lib/qmdj.py
@@ -0,0 +1,518 @@
+# coding=utf-8
+# !/usr/bin/python
+
+"""
+
+作者 丢丢喵推荐 🚓 内容均从互联网收集而来 仅供交流学习使用 版权归原创者所有 如侵犯了您的权益 请通知作者 将及时删除侵权内容
+ ====================Diudiumiao====================
+
+"""
+
+from Crypto.Util.Padding import unpad
+from Crypto.Util.Padding import pad
+from urllib.parse import unquote
+from Crypto.Cipher import ARC4
+from urllib.parse import quote
+from base.spider import Spider
+from Crypto.Cipher import AES
+from datetime import datetime
+from bs4 import BeautifulSoup
+from base64 import b64decode
+import urllib.request
+import urllib.parse
+import datetime
+import binascii
+import requests
+import hashlib
+import base64
+import json
+import time
+import sys
+import re
+import os
+
+sys.path.append('..')
+
+xurl = "https://api-store.qmplaylet.com"
+
+xurl1 = "https://api-read.qmplaylet.com"
+
+keys = "d3dGiJc651gSQ8w1"
+
+data = {
+ "static_score": "0.8",
+ "uuid": "00000000-7fc7-08dc-0000-000000000000",
+ "device-id": "20250220125449b9b8cac84c2dd3d035c9052a2572f7dd0122edde3cc42a70",
+ "mac": "",
+ "sourceuid": "aa7de295aad621a6",
+ "refresh-type": "0",
+ "model": "22021211RC",
+ "wlb-imei": "",
+ "client-id": "aa7de295aad621a6",
+ "brand": "Redmi",
+ "oaid": "",
+ "oaid-no-cache": "",
+ "sys-ver": "12",
+ "trusted-id": "",
+ "phone-level": "H",
+ "imei": "",
+ "wlb-uid": "aa7de295aad621a6",
+ "session-id": str(int(time.time() * 1000)),
+ }
+
+json_str = json.dumps(data, separators=(',', ':'))
+encoded = base64.b64encode(json_str.encode()).decode()
+
+char_map = {
+ '+': 'P', '/': 'X', '0': 'M', '1': 'U', '2': 'l', '3': 'E', '4': 'r',
+ '5': 'Y', '6': 'W', '7': 'b', '8': 'd', '9': 'J', 'A': '9', 'B': 's',
+ 'C': 'a', 'D': 'I', 'E': '0', 'F': 'o', 'G': 'y', 'H': '_', 'I': 'H',
+ 'J': 'G', 'K': 'i', 'L': 't', 'M': 'g', 'N': 'N', 'O': 'A', 'P': '8',
+ 'Q': 'F', 'R': 'k', 'S': '3', 'T': 'h', 'U': 'f', 'V': 'R', 'W': 'q',
+ 'X': 'C', 'Y': '4', 'Z': 'p', 'a': 'm', 'b': 'B', 'c': 'O', 'd': 'u',
+ 'e': 'c', 'f': '6', 'g': 'K', 'h': 'x', 'i': '5', 'j': 'T', 'k': '-',
+ 'l': '2', 'm': 'z', 'n': 'S', 'o': 'Z', 'p': '1', 'q': 'V', 'r': 'v',
+ 's': 'j', 't': 'Q', 'u': '7', 'v': 'D', 'w': 'w', 'x': 'n', 'y': 'L',
+ 'z': 'e'
+ }
+
+qm_params = ''
+for c in encoded:
+ qm_params += char_map.get(c, c)
+
+params_str = (
+ "AUTHORIZATION=" +
+ "app-version=10001" +
+ "application-id=com.duoduo.read" +
+ "channel=unknown" +
+ "is-white=" +
+ "net-env=5" +
+ "platform=android" +
+ f"qm-params={qm_params}" +
+ f"reg={keys}"
+ )
+
+signs = hashlib.md5(params_str.encode()).hexdigest()
+
+headerx = {
+ 'net-env': '5',
+ 'reg': '',
+ 'channel': 'unknown',
+ 'is-white': '',
+ 'platform': 'android',
+ 'application-id': 'com.duoduo.read',
+ 'authorization': '',
+ 'app-version': '10001',
+ 'user-agent': 'webviewversion/0',
+ 'qm-params': qm_params,
+ 'sign': signs
+ }
+
+headers = {
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.87 Safari/537.36'
+ }
+
+# 全局变量用于缓存百度跳转信息
+baidu_name_cache = ""
+baidu_jump_cache = ""
+
+class Spider(Spider):
+ global xurl
+ global xurl1
+ global keys
+ global headerx
+ global headers
+ global baidu_name_cache
+ global baidu_jump_cache
+
+ def getName(self):
+ return "首页"
+
+ def init(self, extend):
+ global baidu_name_cache, baidu_jump_cache
+ # 初始化时获取百度跳转信息并缓存
+ try:
+ response = requests.get(url='https://m.baidu.com/', headers=headers, timeout=5)
+ response.encoding = 'utf-8'
+ code = response.text
+ baidu_name_cache = self.extract_middle_text(code, "s1='", "'", 0)
+ baidu_jump_cache = self.extract_middle_text(code, "s2='", "'", 0)
+ except:
+ baidu_name_cache = ""
+ baidu_jump_cache = ""
+
+ def isVideoFormat(self, url):
+ pass
+
+ def manualVideoCheck(self):
+ pass
+
+ def extract_middle_text(self, text, start_str, end_str, pl, start_index1: str = '', end_index2: str = ''):
+ if pl == 3:
+ plx = []
+ while True:
+ start_index = text.find(start_str)
+ if start_index == -1:
+ break
+ end_index = text.find(end_str, start_index + len(start_str))
+ if end_index == -1:
+ break
+ middle_text = text[start_index + len(start_str):end_index]
+ plx.append(middle_text)
+ text = text.replace(start_str + middle_text + end_str, '')
+ if len(plx) > 0:
+ purl = ''
+ for i in range(len(plx)):
+ matches = re.findall(start_index1, plx[i])
+ output = ""
+ for match in matches:
+ match3 = re.search(r'(?:^|[^0-9])(\d+)(?:[^0-9]|$)', match[1])
+ if match3:
+ number = match3.group(1)
+ else:
+ number = 0
+ if 'http' not in match[0]:
+ output += f"#{match[1]}${number}{xurl}{match[0]}"
+ else:
+ output += f"#{match[1]}${number}{match[0]}"
+ output = output[1:]
+ purl = purl + output + "$$$"
+ purl = purl[:-3]
+ return purl
+ else:
+ return ""
+ else:
+ start_index = text.find(start_str)
+ if start_index == -1:
+ return ""
+ end_index = text.find(end_str, start_index + len(start_str))
+ if end_index == -1:
+ return ""
+
+ if pl == 0:
+ middle_text = text[start_index + len(start_str):end_index]
+ return middle_text.replace("\\", "")
+
+ if pl == 1:
+ middle_text = text[start_index + len(start_str):end_index]
+ matches = re.findall(start_index1, middle_text)
+ if matches:
+ jg = ' '.join(matches)
+ return jg
+
+ if pl == 2:
+ middle_text = text[start_index + len(start_str):end_index]
+ matches = re.findall(start_index1, middle_text)
+ if matches:
+ new_list = [f'{item}' for item in matches]
+ jg = '$$$'.join(new_list)
+ return jg
+
+ def homeContent(self, filter):
+ result = {"class": []}
+
+ sign_string = f"operation=1playlet_privacy=1tag_id=0{keys}"
+ sign = hashlib.md5(sign_string.encode('utf-8')).hexdigest()
+
+ url = f"{xurl}/api/v1/playlet/index?tag_id=0&playlet_privacy=1&operation=1&sign={sign}"
+ detail = requests.get(url=url, headers=headerx)
+ detail.encoding = "utf-8"
+ data = detail.json()
+
+ duoxuan = ['0', '1', '2', '3', '4']
+ for duo in duoxuan:
+ js = data['data']['tag_categories'][int(duo)]['tags']
+
+ for vod in js:
+
+ name = vod['tag_name']
+ if "推荐" in name:
+ continue
+
+ id = vod['tag_id']
+
+ result["class"].append({"type_id": id, "type_name": "" + name})
+
+ return result
+
+ def homeVideoContent(self):
+ videos = []
+
+ sign_string = f"operation=1playlet_privacy=1tag_id=0{keys}"
+ sign = hashlib.md5(sign_string.encode('utf-8')).hexdigest()
+
+ url = f"{xurl}/api/v1/playlet/index?tag_id=0&playlet_privacy=1&operation=1&sign={sign}"
+ detail = requests.get(url=url, headers=headerx)
+ detail.encoding = "utf-8"
+ data = detail.json()
+
+ data = data['data']['list']
+
+ for vod in data:
+
+ # 获取标题,确保不为空
+ name = vod.get('title', '')
+ if not name:
+ name = vod.get('name', '未知标题')
+ name = str(name).strip()
+
+ # 获取ID
+ id = vod.get('playlet_id', '')
+ if not id:
+ id = vod.get('id', '')
+
+ # 获取封面
+ pic = vod.get('image_link', '')
+ if not pic:
+ pic = vod.get('cover', '')
+
+ # 获取热度值作为备注
+ remark = vod.get('hot_value', '')
+ if not remark:
+ remark = vod.get('view_count', '')
+
+ video = {
+ "vod_id": str(id),
+ "vod_name": name,
+ "vod_pic": pic,
+ "vod_remarks": str(remark) if remark else ''
+ }
+ videos.append(video)
+
+ result = {'list': videos}
+ return result
+
+ def categoryContent(self, cid, pg, filter, ext):
+ result = {}
+ videos = []
+
+ if pg:
+ page = int(pg)
+ else:
+ page = 1
+
+ if page == 1:
+ sign_string = f"operation=1playlet_privacy=1tag_id={cid}{keys}"
+ sign = hashlib.md5(sign_string.encode('utf-8')).hexdigest()
+ url = f'{xurl}/api/v1/playlet/index?tag_id={cid}&playlet_privacy=1&operation=1&sign={sign}'
+
+ else:
+ sign_string = f"next_id={str(page)}operation=1playlet_privacy=1tag_id={cid}{keys}"
+ sign = hashlib.md5(sign_string.encode('utf-8')).hexdigest()
+ url = f'{xurl}/api/v1/playlet/index?tag_id={cid}&next_id={str(page)}&playlet_privacy=1&operation=1&sign={sign}'
+
+ detail = requests.get(url=url, headers=headerx)
+ detail.encoding = "utf-8"
+ data = detail.json()
+
+ data = data['data']['list']
+
+ for vod in data:
+
+ name = vod.get('title', '')
+ if not name:
+ name = vod.get('name', '未知标题')
+ name = str(name).strip()
+
+ id = vod.get('playlet_id', '')
+ if not id:
+ id = vod.get('id', '')
+
+ pic = vod.get('image_link', '')
+ if not pic:
+ pic = vod.get('cover', '')
+
+ remark = vod.get('hot_value', '')
+ if not remark:
+ remark = vod.get('view_count', '')
+
+ video = {
+ "vod_id": str(id),
+ "vod_name": name,
+ "vod_pic": pic,
+ "vod_remarks": str(remark) if remark else ''
+ }
+ videos.append(video)
+
+ result = {'list': videos}
+ result['page'] = pg
+ result['pagecount'] = 9999
+ result['limit'] = 90
+ result['total'] = 999999
+ return result
+
+ def detailContent(self, ids):
+ did = ids[0]
+ result = {}
+ videos = []
+ xianlu = '七猫专线' # 统一使用七猫专线
+ bofang = ''
+
+ sign_string = f"playlet_id={did}{keys}"
+ sign = hashlib.md5(sign_string.encode('utf-8')).hexdigest()
+
+ urls = f'{xurl1}/player/api/v1/playlet/info?playlet_id={did}&sign={sign}'
+ detail = requests.get(url=urls, headers=headerx)
+ detail.encoding = "utf-8"
+ detail = detail.json()
+
+ # 获取标题(使用API返回的标题)
+ title = detail.get('data', {}).get('title', '')
+ if not title:
+ title = detail.get('data', {}).get('name', '未知标题')
+
+ blurb = detail.get('data', {}).get('intro') or "暂无剧情简介"
+ content = '剧情📢' + str(blurb)
+
+ jisu = detail.get('data', {}).get('total_episode_num', '未知')
+ jisu = str(jisu) + '全集'
+
+ leixing = detail.get('data', {}).get('tags', '未知')
+
+ remarks = str(leixing) + " " + str(jisu)
+
+ # 使用七猫的播放列表
+ soup = detail.get('data', {}).get('play_list', [])
+
+ if soup:
+ for sou in soup:
+ video_url = sou.get('video_url', '')
+ sort_name = sou.get('sort', '')
+ if video_url and sort_name:
+ bofang = bofang + str(sort_name) + '$' + str(video_url) + '#'
+ bofang = bofang[:-1] if bofang else ''
+ else:
+ # 如果没有播放列表,使用跳转链接
+ global baidu_jump_cache
+ bofang = baidu_jump_cache
+
+ videos.append({
+ "vod_id": str(did),
+ "vod_name": str(title),
+ "vod_remarks": remarks,
+ "vod_content": content,
+ "vod_play_from": xianlu,
+ "vod_play_url": bofang
+ })
+
+ result['list'] = videos
+ return result
+
+ def playerContent(self, flag, id, vipFlags):
+ result = {}
+ play_url = ""
+
+ # 获取百度跳转信息(使用缓存)
+ global baidu_jump_cache
+ baidu_jump = baidu_jump_cache
+
+ # 判断是否是外部跳转链接(百度等)
+ if 'baidu.com' in str(id) or 'tuios.com' in str(id) or 'qmplaylet' in str(id):
+ # 如果是外部跳转链接,直接使用
+ play_url = str(id)
+ # 判断是否是直接的HTTP链接
+ elif str(id).startswith('http'):
+ play_url = str(id)
+ # 如果是内部播放ID,需要重新获取详情
+ else:
+ try:
+ # 获取该ID对应的详情信息
+ sign_string = f"playlet_id={id}{keys}"
+ sign = hashlib.md5(sign_string.encode('utf-8')).hexdigest()
+ detail_url = f'{xurl1}/player/api/v1/playlet/info?playlet_id={id}&sign={sign}'
+ detail_response = requests.get(url=detail_url, headers=headerx, timeout=5)
+ detail_response.encoding = "utf-8"
+ detail_data = detail_response.json()
+
+ # 获取标题
+ title = detail_data.get('data', {}).get('title', '')
+ if not title:
+ title = detail_data.get('data', {}).get('name', '')
+
+ # 统一使用七猫专线的播放列表
+ play_list = detail_data.get('data', {}).get('play_list', [])
+
+ if play_list:
+ for idx, item in enumerate(play_list):
+ video_url = item.get('video_url', '')
+ sort_name = item.get('sort', '')
+ if video_url and sort_name:
+ if play_url:
+ play_url += '#'
+ play_url += str(sort_name) + '$' + str(video_url)
+ else:
+ # 如果没有play_list,使用原始ID
+ play_url = str(id)
+
+ except Exception as e:
+ # 如果出错,使用跳转链接或原始ID
+ play_url = baidu_jump if baidu_jump else str(id)
+
+ result["parse"] = 0
+ result["playUrl"] = ''
+ result["url"] = play_url if play_url else str(id)
+ result["header"] = headers
+
+ return result
+
+ def searchContentPage(self, key, quick, pg):
+ result = {}
+ videos = []
+
+ if pg:
+ page = int(pg)
+ else:
+ page = 1
+
+ sign_string = f"extend=page={str(page)}read_preference=0track_id=ec1280db127955061754851657967wd={key}{keys}"
+ sign = hashlib.md5(sign_string.encode('utf-8')).hexdigest()
+
+ url = f'{xurl}/api/v1/playlet/search?extend=&page={str(page)}&wd={key}&read_preference=0&track_id=ec1280db127955061754851657967&sign={sign}'
+ detail = requests.get(url=url, headers=headerx)
+ detail.encoding = "utf-8"
+ detail = detail.json()
+
+ data = detail['data']['list']
+
+ for vod in data:
+
+ name = vod.get('title', '')
+ if not name:
+ name = vod.get('name', '未知标题')
+ name = re.sub(r'<[^>]+>', '', str(name))
+ name = ' '.join(name.split())
+
+ id = vod.get('id', '')
+
+ pic = vod.get('image_link', '')
+ if not pic:
+ pic = vod.get('cover', '')
+
+ remark = vod.get('total_num', '')
+
+ video = {
+ "vod_id": str(id),
+ "vod_name": name,
+ "vod_pic": pic,
+ "vod_remarks": str(remark) if remark else ''
+ }
+ videos.append(video)
+
+ result['list'] = videos
+ result['page'] = pg
+ result['pagecount'] = 9999
+ result['limit'] = 90
+ result['total'] = 999999
+ return result
+
+ def searchContent(self, key, quick, pg="1"):
+ return self.searchContentPage(key, quick, '1')
+
+ def localProxy(self, params):
+ if params['type'] == "m3u8":
+ return self.proxyM3u8(params)
+ elif params['type'] == "media":
+ return self.proxyMedia(params)
+ elif params['type'] == "ts":
+ return self.proxyTs(params)
+ return None
\ No newline at end of file
diff --git a/cpu_iy3/lib/qxdj.py b/cpu_iy3/lib/qxdj.py
new file mode 100644
index 00000000..c12e403e
--- /dev/null
+++ b/cpu_iy3/lib/qxdj.py
@@ -0,0 +1,343 @@
+# coding = utf-8
+# !/usr/bin/python
+
+"""
+"""
+
+from Crypto.Util.Padding import unpad
+from Crypto.Util.Padding import pad
+from urllib.parse import unquote
+from Crypto.Cipher import ARC4
+from urllib.parse import quote
+from base.spider import Spider
+from Crypto.Cipher import AES
+from bs4 import BeautifulSoup
+from base64 import b64decode
+import urllib.request
+import urllib.parse
+import binascii
+import requests
+import base64
+import json
+import time
+import sys
+import re
+import os
+
+sys.path.append('..')
+
+xurl = "https://app.whjzjx.cn"
+
+headers = {
+ 'User-Agent': 'Linux; Android 12; Pixel 3 XL) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.101 Mobile Safari/537.36'
+ }
+
+headerf = {
+ "platform": "1",
+ "user_agent": "Mozilla/5.0 (Linux; Android 9; V1938T Build/PQ3A.190705.08211809; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/91.0.4472.114 Safari/537.36",
+ "content-type": "application/json; charset=utf-8"
+ }
+
+times = int(time.time() * 1000)
+
+data = {
+ "device": "2a50580e69d38388c94c93605241fb306",
+ "package_name": "com.jz.xydj",
+ "android_id": "ec1280db12795506",
+ "install_first_open": True,
+ "first_install_time": 1752505243345,
+ "last_update_time": 1752505243345,
+ "report_link_url": "",
+ "authorization": "",
+ "timestamp": times
+ }
+
+plain_text = json.dumps(data, separators=(',', ':'), ensure_ascii=False)
+
+key = "B@ecf920Od8A4df7"
+key_bytes = key.encode('utf-8')
+plain_bytes = plain_text.encode('utf-8')
+cipher = AES.new(key_bytes, AES.MODE_ECB)
+padded_data = pad(plain_bytes, AES.block_size)
+ciphertext = cipher.encrypt(padded_data)
+encrypted = base64.b64encode(ciphertext).decode('utf-8')
+
+response = requests.post("https://u.shytkjgs.com/user/v3/account/login", headers=headerf, data=encrypted)
+response_data = response.json()
+Authorization = response_data['data']['token']
+
+headerx = {
+ 'authorization': Authorization,
+ 'platform': '1',
+ 'version_name': '3.8.3.1'
+ }
+
+class Spider(Spider):
+ global xurl
+ global headerx
+ global headers
+
+ def getName(self):
+ return "首页"
+
+ def init(self, extend):
+ pass
+
+ def isVideoFormat(self, url):
+ pass
+
+ def manualVideoCheck(self):
+ pass
+
+ def extract_middle_text(self, text, start_str, end_str, pl, start_index1: str = '', end_index2: str = ''):
+ if pl == 3:
+ plx = []
+ while True:
+ start_index = text.find(start_str)
+ if start_index == -1:
+ break
+ end_index = text.find(end_str, start_index + len(start_str))
+ if end_index == -1:
+ break
+ middle_text = text[start_index + len(start_str):end_index]
+ plx.append(middle_text)
+ text = text.replace(start_str + middle_text + end_str, '')
+ if len(plx) > 0:
+ purl = ''
+ for i in range(len(plx)):
+ matches = re.findall(start_index1, plx[i])
+ output = ""
+ for match in matches:
+ match3 = re.search(r'(?:^|[^0-9])(\d+)(?:[^0-9]|$)', match[1])
+ if match3:
+ number = match3.group(1)
+ else:
+ number = 0
+ if 'http' not in match[0]:
+ output += f"#{match[1]}${number}{xurl}{match[0]}"
+ else:
+ output += f"#{match[1]}${number}{match[0]}"
+ output = output[1:]
+ purl = purl + output + "$$$"
+ purl = purl[:-3]
+ return purl
+ else:
+ return ""
+ else:
+ start_index = text.find(start_str)
+ if start_index == -1:
+ return ""
+ end_index = text.find(end_str, start_index + len(start_str))
+ if end_index == -1:
+ return ""
+
+ if pl == 0:
+ middle_text = text[start_index + len(start_str):end_index]
+ return middle_text.replace("\\", "")
+
+ if pl == 1:
+ middle_text = text[start_index + len(start_str):end_index]
+ matches = re.findall(start_index1, middle_text)
+ if matches:
+ jg = ' '.join(matches)
+ return jg
+
+ if pl == 2:
+ middle_text = text[start_index + len(start_str):end_index]
+ matches = re.findall(start_index1, middle_text)
+ if matches:
+ new_list = [f'{item}' for item in matches]
+ jg = '$$$'.join(new_list)
+ return jg
+
+ def homeContent(self, filter):
+ result = {}
+ result = {"class": [{"type_id": "1", "type_name": "七星剧场"},
+ {"type_id": "3", "type_name": "七星新剧"},
+ {"type_id": "2", "type_name": "七星热播"},
+ {"type_id": "7", "type_name": "七星星选"},
+ {"type_id": "5", "type_name": "七星阳光"}],
+ }
+
+ return result
+
+ def homeVideoContent(self):
+ videos = []
+
+ url= f'{xurl}/v1/theater/home_page?theater_class_id=1&class2_id=4&page_num=1&page_size=24'
+ detail = requests.get(url=url, headers=headerx)
+ detail.encoding = "utf-8"
+ if detail.status_code == 200:
+ data = detail.json()
+
+ for vod in data['data']['list']:
+
+ name = vod['theater']['title']
+
+ id = vod['theater']['id']
+
+ pic = vod['theater']['cover_url']
+
+ remark = vod['theater']['play_amount_str']
+
+ video = {
+ "vod_id": id,
+ "vod_name": name,
+ "vod_pic": pic,
+ "vod_remarks": remark
+ }
+ videos.append(video)
+
+ result = {'list': videos}
+ return result
+
+ def categoryContent(self, cid, pg, filter, ext):
+ result = {}
+ videos = []
+
+ url = f'{xurl}/v1/theater/home_page?theater_class_id={cid}&page_num={pg}&page_size=24'
+ detail = requests.get(url=url,headers=headerx)
+ detail.encoding = "utf-8"
+ if detail.status_code == 200:
+ data = detail.json()
+
+ for vod in data['data']['list']:
+
+ name = vod['theater']['title']
+
+ id = vod['theater']['id']
+
+ pic = vod['theater']['cover_url']
+
+ remark = vod['theater']['theme']
+
+ video = {
+ "vod_id": id,
+ "vod_name": name,
+ "vod_pic": pic,
+ "vod_remarks": remark
+ }
+ videos.append(video)
+
+ result = {'list': videos}
+ result['page'] = pg
+ result['pagecount'] = 9999
+ result['limit'] = 90
+ result['total'] = 999999
+ return result
+
+ def detailContent(self, ids):
+ did = ids[0]
+ result = {}
+ videos = []
+ xianlu = ''
+ bofang = ''
+
+ url = f'{xurl}/v2/theater_parent/detail?theater_parent_id={did}'
+ detail = requests.get(url=url, headers=headerx)
+ detail.encoding = "utf-8"
+ if detail.status_code == 200:
+ data = detail.json()
+
+ url = 'https://fs-im-kefu.7moor-fs1.com/ly/4d2c3f00-7d4c-11e5-af15-41bf63ae4ea0/1732707176882/jiduo.txt'
+ response = requests.get(url)
+ response.encoding = 'utf-8'
+ code = response.text
+ name = self.extract_middle_text(code, "s1='", "'", 0)
+ Jumps = self.extract_middle_text(code, "s2='", "'", 0)
+
+ content = '剧情:' + data['data']['introduction']
+
+ area = data['data']['desc_tags'][0]
+
+ remarks = data['data']['filing']
+
+ # 修复剧集只有一集的问题 - 检查theaters数据是否存在且不为空
+ if 'theaters' in data['data'] and data['data']['theaters']:
+ for sou in data['data']['theaters']:
+ id = sou['son_video_url']
+ name = sou['num']
+ bofang = bofang + str(name) + '$' + id + '#'
+
+ bofang = bofang[:-1] if bofang.endswith('#') else bofang
+ xianlu = '七星'
+ else:
+ # 如果没有theaters数据,检查是否有单个视频URL
+ if 'video_url' in data['data'] and data['data']['video_url']:
+ bofang = '1$' + data['data']['video_url']
+ xianlu = '七星'
+ else:
+ bofang = Jumps
+ xianlu = '1'
+
+ videos.append({
+ "vod_id": did,
+ "vod_content": content,
+ "vod_remarks": remarks,
+ "vod_area": area,
+ "vod_play_from": xianlu,
+ "vod_play_url": bofang
+ })
+
+ result['list'] = videos
+ return result
+
+ def playerContent(self, flag, id, vipFlags):
+
+ result = {}
+ result["parse"] = 0
+ result["playUrl"] = ''
+ result["url"] = id
+ result["header"] = headers
+ return result
+
+ def searchContentPage(self, key, quick, page):
+ result = {}
+ videos = []
+
+ payload = {
+ "text": key
+ }
+
+ url = f"{xurl}/v3/search"
+ detail = requests.post(url=url, headers=headerx, json=payload)
+ if detail.status_code == 200:
+ detail.encoding = "utf-8"
+ data = detail.json()
+
+ for vod in data['data']['theater']['search_data']:
+
+ name = vod['title']
+
+ id = vod['id']
+
+ pic = vod['cover_url']
+
+ remark = vod['score_str']
+
+ video = {
+ "vod_id": id,
+ "vod_name": name,
+ "vod_pic": pic,
+ "vod_remarks": remark
+ }
+ videos.append(video)
+
+ result['list'] = videos
+ result['page'] = page
+ result['pagecount'] = 9999
+ result['limit'] = 90
+ result['total'] = 999999
+ return result
+
+ def searchContent(self, key, quick, pg="1"):
+ return self.searchContentPage(key, quick, '1')
+
+ def localProxy(self, params):
+ if params['type'] == "m3u8":
+ return self.proxyM3u8(params)
+ elif params['type'] == "media":
+ return self.proxyMedia(params)
+ elif params['type'] == "ts":
+ return self.proxyTs(params)
+ return None
\ No newline at end of file
diff --git a/cpu_iy3/lib/shanzha.py b/cpu_iy3/lib/shanzha.py
new file mode 100644
index 00000000..29443a13
--- /dev/null
+++ b/cpu_iy3/lib/shanzha.py
@@ -0,0 +1,330 @@
+# -*- coding: utf-8 -*-
+# by @嗷呜
+import json
+import random
+import sys
+from base64 import b64encode, b64decode
+from concurrent.futures import ThreadPoolExecutor
+
+# 引入 RSA 加解密所需模块
+from Crypto.PublicKey import RSA
+from Crypto.Cipher import PKCS1_v1_5
+
+sys.path.append('..')
+from base.spider import Spider
+
+class Spider(Spider):
+
+ def init(self, extend=""):
+ did = self.getdid()
+ self.headers.update({'deviceId': did})
+ token = self.gettk()
+ self.headers.update({'token': token})
+
+ def getName(self):
+ pass
+
+ def isVideoFormat(self, url):
+ pass
+
+ def manualVideoCheck(self):
+ pass
+
+ def destroy(self):
+ pass
+
+ # 1. 修改为主机域名
+ host = 'http://qkys.qukanwh.com'
+
+ # 2. 同步原脚本的配置请求头
+ headers = {
+ 'HOST': 'qkys.qukanwh.com',
+ 'User-Agent': 'okhttp/4.12.0',
+ 'client': 'app',
+ 'deviceType': 'Android',
+ 'Referer': ''
+ }
+
+ # 3. 导入原脚本中的 RSA 密钥对与配置
+ publicKey_str = "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCoYt0BP77U+DM08BiI/QbSRIfxijXo85BTPqIM1Ow8BNwhLETzRIZ+dEwdWDbydG/PspgBAfRpGaYVdJYtvaC2JnoO8+Ik6qMWojfEJxSFLa0Pb0A892tun4gsxoEMjcreZ+YGyaBxAfqX0BSMfdrOgIYaZQjYrw9TRLlUT31QoQIDAQAB\n-----END PUBLIC KEY-----"
+ privateKey_str = "-----BEGIN PRIVATE KEY-----\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCquQQ5r6+yJI8CDFkXRp8vUsdD45ov8EP12ooLs56ca2DQXaSNGS9910bAPVA9chkp0mKIvKqjAsHz5Tl9EeNPblarGEeJUIxpxZtiSqNTpvtiD/TjhpzuHYic7RAfQ/h7p/ypE8ymU42pYjsB5t26Mv6XgkLV+jzrSf73HlCuS0iMyLmt6zz3Mw9izM13EpB8iFLtfbbYymycKTx4RAmPQLwhNGex/AlUIYxXP4R2yyaa4W6mEtc6aME2QuzJFxPgP3HJ9NBx/LWVn4skxWjZ7zg+VRQRHnjyVaSLu3Z5gN5ITWCyE32qaHJa6WBahZj5jWhRyAG1bQ+xKJa8lBL5AgMBAAECggEAUwv9SjJ0PSwbhNuM2w23kcWquROWhYtTA91zGY4esehqB/IFgb2mpIh8Gje5OKqwIu/8jpd4SiOlRYdUF8sD0DfUYRZGdj2AkFNX6tBz8tVfo6wvbB6naA1lzzBij1L5JO3qsjS3cJFkb+kg2yP66AC2Z+0tpfk8eRhdtshAZwfcd1DEGt1uAvYL1eaUK9HRvpt9lPeGcHERDl2hBd4uyaF0K1O+zF9y59nYbTySWPxRZq3sFEE85xRMlstD7YZi7W2gKvMFRD4/FKmrZ3m7aKJRITtyKOyyPcYmepNv3Qv7kk59Pg38n2WWQ0Ra/bCH3E48YNCnQvZMpitkTfJhoQKBgQDbnROOYTP8OTJ6f/qhoGjxeO3x1VOaOp8l0x7b0SCfoqNGS0Cyiqj72BmJtPMPqSTjn6MmNzqbg1KOdhXyzNozs+i5ccW1M56j96mr5I/Z0FpE3oyIHNfDDBlf9M8YQqEF9oYxniYYft9oapO7cRQkHER6qpvnHTavwlv4m78CXwKBgQDHAjs2YlpKDdI1lcbZJCc7TwtH+Pd2bUki8YXafWNcPhITQHbOZjr310eK1QJC6GJncjkOqbX7yv3ivvTO35FZTQhuA1xEG1P00FG8bE0tHYPIwQHi9y0eA5cieMdo8E6XYria1mw/3fqSQEsfZyJlR32JQIoGAipM8iO1X2nZpwKBgDkMFIhnt5lNQk+P7wsNIDWZtDWdtJnboHuy29E+Abt2A/O+mI/IdRz2hau/1WO8DFkUnszOi+rZshhPlGP90rCbi1igtTrcrdjp/KkqNjPea5R4OwkgdOu1uOG0NheXNzzVTQaWjk7Opjn5dWa7eP/oV+GFb/oZHJuLYVizHGsBAoGADA7rjZEKDYCm4w5PPSr+oY5ZjaPdQrS+gLqHtMRyN82fBMGcMUdqfUfzEstzVqCEDeaS5HuOBlK3bXzKkppjUTjksN3NQmcxgBz7RuJ9DqXCLXDcb2cwuafYCYOt+YLOEEgwDVm+t2P44dG5e46hO+fICH/7nP+WlpD5buz4GfMCgYB57r3g/6hi9WUDnfc7ZAzWMqR0EhJVYKYy+KFEtdIPzhkkIHq5RASe88E9kzoGoZFdb3tIjvGZWcHerirrqWkMsuQtP/Qi0zjieid5tAPj+r4kbiCVTw0E0jnmPBzGInQi7lpeTTKnG1fbyS5lBS+WmHfIuzpECgCkxhaT+LJJkg==\n-----END PRIVATE KEY-----"
+
+ # RSA 公钥加密实现
+ def rsa_encrypt(self, text):
+ try:
+ key = RSA.import_key(self.publicKey_str)
+ cipher = PKCS1_v1_5.new(key)
+ cipher_text = cipher.encrypt(text.encode('utf-8'))
+ return b64encode(cipher_text).decode('utf-8')
+ except Exception as e:
+ print(f"RSA加密失败: {e}")
+ return ""
+
+ # RSA 私钥解密实现
+ def rsa_decrypt(self, text):
+ try:
+ key = RSA.import_key(self.privateKey_str)
+ cipher = PKCS1_v1_5.new(key)
+ raw_bytes = b64decode(text.encode('utf-8'))
+
+ decrypted = b""
+ offset = 0
+ while offset < len(raw_bytes):
+ chunk = raw_bytes[offset:offset + 256]
+ decrypted += cipher.decrypt(chunk, None)
+ offset += 256
+ return decrypted.decode('utf-8')
+ except Exception as e:
+ print(f"RSA解密失败: {e}")
+ return ""
+
+ def homeContent(self, filter):
+ data = self.post(f"{self.host}/api/v1/app/screen/screenType", headers=self.headers).json()
+ result = {}
+ cate = {
+ "类型": "type",
+ "地区": "area",
+ "年份": "year"
+ }
+ sort = {
+ 'key': 'sort',
+ 'name': '排序',
+ 'value': [{'n': '最新', 'v': 'NEWEST'}, {'n': '热门', 'v': 'HOT'}, {'n': '收藏', 'v': 'COLLECT'}]
+ }
+ classes = []
+ filters = {}
+ for k in data.get('data', []):
+ classes.append({
+ 'type_name': k['name'],
+ 'type_id': str(k['id'])
+ })
+ filters[str(k['id'])] = []
+ for v in k.get('children', []):
+ if v['name'] in cate:
+ filters[str(k['id'])].append({
+ 'name': v['name'],
+ 'key': cate[v['name']],
+ 'value': [{'n': i['name'], 'v': i['name']} for i in v.get('children', [])]
+ })
+ filters[str(k['id'])].append(sort)
+ result['class'] = classes
+ result['filters'] = filters
+ return result
+
+ def homeVideoContent(self):
+ jdata = {
+ "condition": {
+ "sreecnTypeEnum": "NEWEST"
+ },
+ "pageNum": 1,
+ "pageSize": 40
+ }
+ data = self.post(f"{self.host}/api/v1/app/screen/screenMovie", headers=self.headers, json=jdata).json()
+ return {'list': self.getlist(data.get('data', {}).get('records', []))}
+
+ def categoryContent(self, tid, pg, filter, extend):
+ # 保持最纯粹的条件字段,移除任何空字符串占位
+ condition = {
+ 'sreecnTypeEnum': 'NEWEST',
+ 'typeId': int(tid) if str(tid).isdigit() else tid
+ }
+
+ if extend:
+ if 'sort' in extend:
+ condition['sreecnTypeEnum'] = extend.pop('sort')
+ condition.update(extend)
+
+ jdata = {
+ 'condition': condition,
+ 'pageNum': int(pg),
+ 'pageSize': 40,
+ }
+
+ try:
+ data = self.post(f"{self.host}/api/v1/app/screen/screenMovie", headers=self.headers, json=jdata).json()
+ result = {}
+ if data and data.get('data') and 'records' in data['data']:
+ result['list'] = self.getlist(data['data']['records'])
+ else:
+ result['list'] = []
+ result['page'] = pg
+ result['pagecount'] = 9999
+ result['limit'] = 40
+ result['total'] = 999999
+ return result
+ except Exception as e:
+ print(f"分类获取错误: {e}")
+ return {'list': [], 'page': pg}
+
+ def detailContent(self, ids):
+ ids = ids[0].split('@@')
+ jdata = {"id": int(ids[0]), "typeId": ids[-1]}
+ v = self.post(f"{self.host}/api/v1/app/play/movieDesc", headers=self.headers, json=jdata).json()
+ v = v.get('data', {})
+ vod = {
+ 'type_name': v.get('typeId', ''),
+ 'vod_year': v.get('year', ''),
+ 'vod_area': v.get('area', ''),
+ 'vod_actor': v.get('star', ''),
+ 'vod_director': v.get('director', ''),
+ 'vod_content': v.get('introduce', ''),
+ 'vod_play_from': '',
+ 'vod_play_url': ''
+ }
+
+ play_params = {
+ "id": int(ids[0]),
+ "source": 0,
+ "typeId": ids[-1]
+ }
+ encrypt_payload = {"key": self.rsa_encrypt(json.dumps(play_params))}
+
+ c_res = self.post(f"{self.host}/api/v1/app/play/movieDetails", headers=self.headers, json=encrypt_payload).json()
+ decrypted_play_str = self.rsa_decrypt(c_res.get('data', ''))
+ if not decrypted_play_str:
+ return {'list': [vod]}
+
+ decrypted_play_data = json.loads(decrypted_play_str)
+ l = decrypted_play_data.get('moviePlayerList', [])
+ if not l:
+ return {'list': [vod]}
+
+ n = {str(i['id']): i['moviePlayerName'] for i in l}
+
+ m = play_params.copy()
+ m.update({'playerId': l[0]['id']})
+
+ first_source_payload = {"key": self.rsa_encrypt(json.dumps(m))}
+ first_res = self.post(f"{self.host}/api/v1/app/play/movieDetails", headers=self.headers, json=first_source_payload).json()
+
+ decrypted_first_str = self.rsa_decrypt(first_res.get('data', ''))
+ if decrypted_first_str:
+ decrypted_first_episode = json.loads(decrypted_first_str)
+ pd = self.getv(m, decrypted_first_episode.get('episodeList', []))
+ else:
+ pd = {}
+
+ if len(l) > 1:
+ with ThreadPoolExecutor(max_workers=len(l)-1) as executor:
+ future_to_player = {executor.submit(self.getd, play_params, player): player for player in l[1:]}
+ for future in future_to_player:
+ try:
+ o, p = future.result()
+ if p:
+ pd.update(self.getv(o, p))
+ except Exception as e:
+ print(f"多线路请求失败: {e}")
+ w, e = [], []
+ for i, x in pd.items():
+ if x:
+ w.append(n.get(i, '未知线路'))
+ e.append(x)
+ vod['vod_play_from'] = '$$$'.join(w)
+ vod['vod_play_url'] = '$$$'.join(e)
+ return {'list': [vod]}
+
+ def searchContent(self, key, quick, pg="1"):
+ jdata = {
+ "condition": {
+ "value": str(key)
+ },
+ "pageNum": int(pg),
+ "pageSize": 40
+ }
+ try:
+ data = self.post(f"{self.host}/api/v1/app/search/searchMovie", headers=self.headers, json=jdata).json()
+ return {'list': self.getlist(data.get('data', {}).get('records', [])), 'page': pg}
+ except Exception as e:
+ print(f"搜索请求失败: {e}")
+ return {'list': [], 'page': pg}
+
+ def playerContent(self, flag, id, vipFlags):
+ raw_id_str = self.d64(id)
+ if not raw_id_str:
+ return {'parse': 0, 'url': ''}
+ jdata = json.loads(raw_id_str)
+ encrypt_payload = {"key": self.rsa_encrypt(json.dumps(jdata))}
+ data = self.post(f"{self.host}/api/v1/app/play/movieDetails", headers=self.headers, json=encrypt_payload).json()
+
+ try:
+ decrypted_url_data = json.loads(self.rsa_decrypt(data.get('data', '')))
+ playerUrl = decrypted_url_data.get('url', '')
+ if not playerUrl:
+ return {'parse': 0, 'url': ''}
+
+ params = {'playerUrl': playerUrl, 'playerId': jdata['playerId']}
+ pd = self.fetch(f"{self.host}/api/v1/app/play/analysisMovieUrl", headers=self.headers, params=params).json()
+ url, p = pd.get('data', ''), 0
+ except Exception as e:
+ print(f"解析流媒体直链失败: {e}")
+ url, p = "", 0
+ return {'parse': p, 'url': url, 'header': {'User-Agent': 'okhttp/4.12.0'}}
+
+ def localProxy(self, param):
+ pass
+
+ def liveContent(self, url):
+ pass
+
+ def gettk(self):
+ self.headers.update({'deviceId': self.getdid()})
+ try:
+ data = self.fetch(f"{self.host}/api/v1/app/user/visitorInfo", headers=self.headers).json()
+ return data.get('data', {}).get('token', '')
+ except:
+ return ""
+
+ def getdid(self):
+ did = self.getCache('ldid')
+ if not did:
+ hex_chars = '0123456789abcdef'
+ did = ''.join(random.choice(hex_chars) for _ in range(16))
+ self.setCache('ldid', did)
+ return did
+
+ def getd(self, jdata, player):
+ x = jdata.copy()
+ x.update({'playerId': player['id']})
+ encrypt_payload = {"key": self.rsa_encrypt(json.dumps(x))}
+ response = self.post(f"{self.host}/api/v1/app/play/movieDetails", headers=self.headers, json=encrypt_payload).json()
+ decrypted_str = self.rsa_decrypt(response.get('data', ''))
+ if decrypted_str:
+ decrypted_episode = json.loads(decrypted_str)
+ return x, decrypted_episode.get('episodeList', [])
+ return x, []
+
+ def getv(self, d, c):
+ f = {str(d['playerId']): ''}
+ g = []
+ for i in c:
+ j = d.copy()
+ j.update({'episodeId': i['id']})
+ g.append(f"{i['episode']}${self.e64(json.dumps(j))}")
+ f[str(d['playerId'])] = '#'.join(g)
+ return f
+
+ def getlist(self, data):
+ videos = []
+ for i in data:
+ if not i.get('id'):
+ continue
+ videos.append({
+ 'vod_id': f"{i['id']}@@{i.get('typeId', '')}",
+ 'vod_name': i.get('name', ''),
+ 'vod_pic': i.get('cover', ''),
+ 'vod_year': i.get('year', ''),
+ 'vod_remarks': i.get('totalEpisode', '')
+ })
+ return videos
+
+ def e64(self, text):
+ try:
+ return b64encode(text.encode('utf-8')).decode('utf-8')
+ except:
+ return ""
+
+ def d64(self, encoded_text):
+ try:
+ return b64decode(encoded_text.encode('utf-8')).decode('utf-8')
+ except:
+ return ""
diff --git a/cpu_iy3/lib/yins.png b/cpu_iy3/lib/yins.png
new file mode 100644
index 00000000..f80ec8af
--- /dev/null
+++ b/cpu_iy3/lib/yins.png
@@ -0,0 +1,38 @@
+[
+ {
+ "original": "你好1983",
+ "mapped": "你好1983(2026)"
+ },
+ {
+ "original": "海市蜃楼",
+ "mapped": "海市蜃楼(2025)"
+ },
+ {
+ "original": "凡人修仙传:重返天南",
+ "mapped": "凡人修仙传(2020)"
+ },
+ {
+ "original": "凡人修仙传重返天南",
+ "mapped": "凡人修仙传(2020)"
+ },
+ {
+ "original": "你是迟来的欢喜",
+ "mapped": "你是迟来的欢喜 (2026)"
+ },
+ {
+ "original": "爱情怎么翻译?",
+ "mapped": "爱情怎么翻译?"
+ },
+ {
+ "original": "凡人修仙传:慕兰之战",
+ "mapped": "凡人修仙传(2020)"
+ },
+ {
+ "original": "凡人修仙传慕兰之战",
+ "mapped": "凡人修仙传(2020)"
+ },
+ {
+ "original": "凡人修仙传年番4",
+ "mapped": "凡人修仙传(2020)"
+ }
+]
\ No newline at end of file
diff --git a/cpu_iy3/lib/yszb.png b/cpu_iy3/lib/yszb.png
index 2c26bb6c..5025792d 100644
--- a/cpu_iy3/lib/yszb.png
+++ b/cpu_iy3/lib/yszb.png
@@ -8,7 +8,5 @@
https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/lib/ds.png
#AI·测试2
https://gh-proxy.com/https://raw.githubusercontent.com/develop202/migu_video/refs/heads/main/interface.txt
-#AI·测试3
-https://ds65.tv1288.xyz
-#AI·测试4
-https://nos.netease.com/ysf/3d75a78a0fc7ede372c03598d6d10367.m3u
\ No newline at end of file
+#AI·无意云空间
+https://ym.wya6.cn/dszb/bf
\ No newline at end of file
diff --git a/cpu_iy3/lib/去看吧.png b/cpu_iy3/lib/去看吧.png
new file mode 100644
index 00000000..4ba1eb3b
--- /dev/null
+++ b/cpu_iy3/lib/去看吧.png
@@ -0,0 +1,19 @@
+muban.vfed.二级.title = 'h1&&Text;.fed-col-md3--span:eq(0)&&Text';
+muban.vfed.二级.desc = '.fed-col-md3:eq(3)&&Text;;;.fed-col-md6:eq(0)&&Text;.fed-col-md6--span:eq(1)&&Text';
+var rule = {
+ title: '去看吧',
+ 模板:'vfed',
+ host: 'https://www.k9dm.com',
+ // url: '/index.php/vod/show/id/fyclass/page/fypage.html',
+ url: '/index.php/vod/show/id/fyclassfyfilter.html',
+ filterable:1,//是否启用分类筛选,
+ filter_url:'{{fl.area}}{{fl.by}}{{fl.class}}/page/fypage{{fl.year}}',
+ filter:{
+ "33":[{"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/科幻"},{"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":"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"},{"n":"1999","v":"/year/1999"},{"n":"1998","v":"/year/1998"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],
+ "21":[{"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/科幻"},{"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/西班牙"},{"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"},{"n":"1999","v":"/year/1999"},{"n":"1998","v":"/year/1998"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],
+ "50":[{"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/科幻"},{"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/西班牙"},{"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"},{"n":"1999","v":"/year/1999"},{"n":"1998","v":"/year/1998"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],
+ "24":[{"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/科幻"},{"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/西班牙"},{"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"},{"n":"1999","v":"/year/1999"},{"n":"1998","v":"/year/1998"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],
+ "22":[{"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/科幻"},{"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/其他"}]},{"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"},{"n":"1999","v":"/year/1999"},{"n":"1998","v":"/year/1998"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}]
+ },
+ class_parse: '.fed-pops-list:eq(0)&&li:gt(0):lt(6);a&&Text;a&&href;.*/(.*?).html',
+}
\ No newline at end of file
diff --git a/cpu_iy3/lib/爱听音乐.py b/cpu_iy3/lib/爱听音乐.py
index 28c99ddd..1d63895d 100644
--- a/cpu_iy3/lib/爱听音乐.py
+++ b/cpu_iy3/lib/爱听音乐.py
@@ -1,240 +1,502 @@
-import re
-import sys
-from base64 import b64encode, b64decode
-from urllib.parse import quote, unquote
-from pyquery import PyQuery as pq
-from requests import Session, adapters
-from urllib3.util.retry import Retry
-from concurrent.futures import ThreadPoolExecutor, as_completed
-sys.path.append('..')
-from base.spider import Spider
-
-class Spider(Spider):
- def init(self, extend=""):
- self.host = "https://www.22a5.com"
- self.session = Session()
- adapter = adapters.HTTPAdapter(max_retries=Retry(total=3, backoff_factor=0.5, status_forcelist=[429, 500, 502, 503, 504]), pool_connections=20, pool_maxsize=50)
- self.session.mount("http://", adapter)
- self.session.mount("https://", adapter)
- self.headers = {"User-Agent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36"}
- self.session.headers.update(self.headers)
-
- def getName(self): return "爱听音乐"
- def isVideoFormat(self, url): return bool(re.search(r'\.(m3u8|mp4|mp3|m4a|flv)(\?|$)', url or "", re.I))
- def manualVideoCheck(self): return False
- def destroy(self): self.session.close()
-
- def homeContent(self, filter):
- classes = [{"type_name": n, "type_id": i} for n, i in [("歌手","/singerlist/index/index/index/index.html"), ("TOP榜单","/list/top.html"), ("新歌榜","/list/new.html"), ("电台","/radiolist/index.html"), ("高清MV","/mvlist/oumei.html"), ("专辑","/albumlist/index.html"), ("歌单","/playtype/index.html")]]
- filters = {p: d for p in [c["type_id"] for c in classes if "singer" not in c["type_id"]] if (d := self._fetch_filters(p))}
-
- if "/radiolist/index.html" not in filters:
- filters["/radiolist/index.html"] = [{"key": "id", "name": "分类", "value": [{"n": n, "v": v} for n,v in zip(["最新","最热","有声小说","相声","音乐","情感","国漫","影视","脱口秀","历史","儿童","教育","八卦","推理","头条"], ["index","hot","novel","xiangyi","music","emotion","game","yingshi","talkshow","history","children","education","gossip","tuili","headline"])]}]
-
- filters["/singerlist/index/index/index/index.html"] = [
- {"key": "area", "name": "地区", "value": [{"n": n, "v": v} for n,v in [("全部","index"),("华语","huayu"),("欧美","oumei"),("韩国","hanguo"),("日本","ribrn")]]},
- {"key": "sex", "name": "性别", "value": [{"n": n, "v": v} for n,v in [("全部","index"),("男","male"),("女","girl"),("组合","band")]]},
- {"key": "genre", "name": "流派", "value": [{"n": n, "v": v} for n,v in [("全部","index"),("流行","liuxing"),("电子","dianzi"),("摇滚","yaogun"),("嘻哈","xiha"),("R&B","rb"),("民谣","minyao"),("爵士","jueshi"),("古典","gudian")]]},
- {"key": "char", "name": "字母", "value": [{"n": n, "v": v} for n,v in [("全部","index")] + [{"n": chr(i), "v": chr(i).lower()} for i in range(65, 91)]]}
- ]
- return {"class": classes, "filters": filters, "list": []}
-
- def homeVideoContent(self): return {"list": []}
-
- def categoryContent(self, tid, pg, filter, extend):
- pg = int(pg or 1)
- url = tid
- if "/singerlist/" in tid:
- p = tid.split('/')
- if len(p) >= 6:
- url = "/".join(p[:2] + [extend.get(k, p[i]) for i, k in enumerate(["area", "sex", "genre"], 2)] + [f"{extend.get('char', 'index')}.html"])
- elif "id" in extend and extend["id"] not in ["index", "top"]:
- url = tid.replace("index.html", f"{extend['id']}.html").replace("top.html", f"{extend['id']}.html")
- if url == tid: url = f"{tid.rsplit('/', 1)[0]}/{extend['id']}.html"
-
- if pg > 1:
- sep = "/" if any(x in url for x in ["/singerlist/", "/radiolist/", "/mvlist/", "/playtype/", "/list/"]) else "_"
- url = re.sub(r'(_\d+|/\d+)?\.html$', f'{sep}{pg}.html', url)
-
- doc = self.getpq(url)
- return {"list": self._parse_list(doc(".play_list li, .video_list li, .pic_list li, .singer_list li, .ali li, .layui-row li, .base_l li"), tid), "page": pg, "pagecount": 9999, "limit": 90, "total": 999999}
-
- def searchContent(self, key, quick, pg="1"):
- return {"list": self._parse_list(self.getpq(f"/so/{quote(key)}/{pg}.html")(".base_l li, .play_list li"), "search"), "page": int(pg)}
-
- def detailContent(self, ids):
- url = self._abs(ids[0])
- doc = self.getpq(url)
- vod = {"vod_id": url, "vod_name": self._clean(doc("h1").text() or doc("title").text()), "vod_pic": self._abs(doc(".djpg img, .pic img, .djpic img").attr("src")), "vod_play_from": "爱听音乐", "vod_content": ""}
-
- if any(x in url for x in ["/playlist/", "/album/", "/list/", "/singer/", "/special/", "/radio/", "/radiolist/"]):
- eps = self._get_eps(doc)
- page_urls = {self._abs(a.attr("href")) for a in doc(".page a, .dede_pages a, .pagelist a").items() if a.attr("href") and "javascript" not in a.attr("href")} - {url}
- if page_urls:
- with ThreadPoolExecutor(max_workers=5) as ex:
- for r in as_completed([ex.submit(lambda u: self._get_eps(self.getpq(u)), u) for u in sorted(page_urls, key=lambda x: int(re.search(r'[_\/](\d+)\.html', x).group(1)) if re.search(r'[_\/](\d+)\.html', x) else 0)]):
- eps.extend(r.result() or [])
- if eps:
- vod.update({"vod_play_from": "播放列表", "vod_play_url": "#".join(eps)})
- return {"list": [vod]}
-
- play_list = []
- if mid := re.search(r'/(song|mp3|radio|radiolist|radioplay)/([^/]+)\.html', url):
- lrc_url = f"{self.host}/plug/down.php?ac=music&lk=lrc&id={mid.group(2)}"
- play_list = [f"播放${self.e64('0@@@@' + url + '|||' + lrc_url)}"]
-
- elif vid := re.search(r'/(video|mp4)/([^/]+)\.html', url):
- with ThreadPoolExecutor(max_workers=3) as ex:
- fs = {ex.submit(self._api, "/plug/down.php", {"ac": "vplay", "id": vid.group(2), "q": q}): n for n, q in [("蓝光", 1080), ("超清", 720), ("高清", 480)]}
- play_list = [f"{fs[f]}${self.e64('0@@@@'+u)}" for f in as_completed(fs) if (u := f.result())]
- play_list.sort(key=lambda x: {"蓝":0, "超":1, "高":2}.get(x[0], 3))
-
- vod["vod_play_url"] = "#".join(play_list) if play_list else f"解析失败${self.e64('1@@@@'+url)}"
- return {"list": [vod]}
-
- def playerContent(self, flag, id, vipFlags):
- raw = self.d64(id).split("@@@@")[-1]
- url, subt = raw.split("|||") if "|||" in raw else (raw, "")
- url = url.replace(r"\/", "/")
-
- if ".html" in url and not self.isVideoFormat(url):
- if mid := re.search(r'/(song|mp3|radio|radiolist|radioplay)/([^/]+)\.html', url):
- if r_url := self._api("/js/play.php", method="POST", data={"id": mid.group(2), "type": "music"}, headers={"Referer": url.replace("http://","https://"), "X-Requested-With": "XMLHttpRequest"}):
- url = r_url if ".php" not in r_url else url
- elif vid := re.search(r'/(video|mp4)/([^/]+)\.html', url):
- with ThreadPoolExecutor(max_workers=3) as ex:
- for f in as_completed([ex.submit(self._api, "/plug/down.php", {"ac": "vplay", "id": vid.group(2), "q": q}) for q in [1080, 720, 480]]):
- if v_url := f.result():
- url = v_url; break
-
- result = {"parse": 0, "url": url, "header": {"User-Agent": self.headers["User-Agent"]}}
- if "22a5.com" in url: result["header"]["Referer"] = self.host + "/"
-
- # OK影视3.6.5+支持LRC格式滚动歌词
- if subt:
- try:
- r = self.session.get(subt, headers={"Referer": self.host + "/"}, timeout=5)
- lrc_content = r.text
- if lrc_content:
- # 过滤广告内容
- lrc_content = self._filter_lrc_ads(lrc_content)
- result["lrc"] = lrc_content
- except:
- pass
-
- return result
-
- def _filter_lrc_ads(self, lrc_text):
- """过滤LRC歌词中的广告内容"""
- lines = lrc_text.splitlines()
- filtered_lines = []
-
- # 广告关键词模式
- ad_patterns = [
- r'欢迎来访.*',
- r'本站.*',
- r'.*广告.*',
- r'QQ群.*',
- r'.*www\..*',
- r'.*http.*',
- r'.*\.com.*',
- r'.*\.cn.*',
- r'.*\.net.*',
- r'.*音乐网.*',
- r'.*提供.*',
- r'.*下载.*',
- ]
-
- for line in lines:
- # 保留时间标签行,但过滤掉广告文本
- if re.match(r'\[\d{2}:\d{2}', line):
- # 检查是否包含广告
- is_ad = False
- for pattern in ad_patterns:
- if re.search(pattern, line, re.IGNORECASE):
- is_ad = True
- break
-
- if not is_ad:
- filtered_lines.append(line)
- else:
- # 非时间标签行(可能是元数据),保留
- filtered_lines.append(line)
-
- return '\n'.join(filtered_lines)
-
- def localProxy(self, param):
- url = unquote(param.get("url", ""))
- type_ = param.get("type")
-
- if type_ == "img":
- return [200, "image/jpeg", self.session.get(url, headers={"Referer": self.host + "/"}, timeout=5).content, {}]
-
- elif type_ == "lrc":
- try:
- r = self.session.get(url, headers={"Referer": self.host + "/"}, timeout=5)
- # 同时过滤代理中的广告
- lrc_content = r.text
- lrc_content = self._filter_lrc_ads(lrc_content)
- return [200, "application/octet-stream", lrc_content.encode('utf-8'), {}]
- except:
- return [404, "text/plain", "Error", {}]
-
- return None
-
- def _parse_list(self, items, tid=""):
- res = []
- for li in items.items():
- a = li("a").eq(0)
- if not (href := a.attr("href")) or href == "/" or any(x in href for x in ["/user/", "/login/", "javascript"]): continue
- if not (name := self._clean(li(".name").text() or a.attr("title") or a.text())): continue
- pic = self._abs((li("img").attr("src") or "").replace('120', '500'))
- res.append({"vod_id": self._abs(href), "vod_name": name, "vod_pic": f"{self.getProxyUrl()}&url={pic}&type=img" if pic else "", "style": {"type": "oval" if "/singer/" in href else ("list" if any(x in tid for x in ["/list/", "/playtype/", "/albumlist/"]) else "rect"), "ratio": 1 if "/singer/" in href else 1.33}})
- return res
-
- def _get_eps(self, doc):
- eps = []
- for li in doc(".play_list li, .song_list li, .music_list li").items():
- if not (a := li("a").eq(0)).attr("href") or not re.search(r'/(song|mp3|radio|radiolist|radioplay)/([^/]+)\.html', a.attr("href")): continue
- full_url = self._abs(a.attr("href"))
-
- lrc_part = ""
- mid = re.search(r'/(song|mp3|radio|radiolist|radioplay)/([^/]+)\.html', full_url)
- if mid:
- lrc_url = f"{self.host}/plug/down.php?ac=music&lk=lrc&id={mid.group(2)}"
- lrc_part = f"|||{lrc_url}"
-
- eps.append(f"{self._clean(a.text() or li('.name').text())}${self.e64('0@@@@' + full_url + lrc_part)}")
- return eps
-
- def _clean(self, text): return re.sub(r'(爱玩音乐网|视频下载说明|视频下载地址|www\.2t58\.com|MP3免费下载|LRC歌词下载|全部歌曲|\[第\d+页\]|刷新|每日推荐|最新|热门|推荐|MV|高清|无损)', '', text or "", flags=re.I).strip()
-
- def _fetch_filters(self, url):
- doc, filters = self.getpq(url), []
- for i, group in enumerate([doc(s) for s in [".ilingku_fl", ".class_list", ".screen_list", ".box_list", ".nav_list"] if doc(s)]):
- opts, seen = [{"n": "全部", "v": "top" if "top" in url else "index"}], set()
- for a in group("a").items():
- if (v := (a.attr("href") or "").split("?")[0].rstrip('/').split('/')[-1].replace('.html','')) and v not in seen:
- opts.append({"n": a.text().strip(), "v": v}); seen.add(v)
- if len(opts) > 1: filters.append({"key": f"id{i}" if i else "id", "name": "分类", "value": opts})
- return filters
-
- def _api(self, path, params=None, method="GET", headers=None, data=None):
- try:
- h = self.headers.copy()
- if headers: h.update(headers)
- r = (self.session.post if method == "POST" else self.session.get)(f"{self.host}{path}", params=params, data=data, headers=h, timeout=10, allow_redirects=False)
- if loc := r.headers.get("Location"): return self._abs(loc.strip())
- return self._abs(r.json().get("url", "").replace(r"\/", "/")) or (r.text.strip() if r.text.strip().startswith("http") else "")
- except: return ""
-
- def getpq(self, url):
- import time
- for _ in range(2):
- try: return pq(self.session.get(self._abs(url), timeout=5).text)
- except: time.sleep(0.1)
- return pq("")
-
- def _abs(self, url): return url if url.startswith("http") else (f"{self.host}{'/' if not url.startswith('/') else ''}{url}" if url else "")
- def e64(self, text): return b64encode(text.encode("utf-8")).decode("utf-8")
- def d64(self, text): return b64decode(text.encode("utf-8")).decode("utf-8")
\ No newline at end of file
+# -*- coding: utf-8 -*-
+# 修复:歌手不显示歌手图片
+# by:垃圾星河
+# 代码指导:嗷呜呜呜呜
+# 增加:自动人机验证绕过
+
+import re
+import sys
+import time
+from base64 import b64encode, b64decode
+from urllib.parse import quote, unquote
+from pyquery import PyQuery as pq
+from requests import Session, adapters
+from urllib3.util.retry import Retry
+from concurrent.futures import ThreadPoolExecutor, as_completed
+
+sys.path.append('..')
+from base.spider import Spider
+
+
+class Spider(Spider):
+ def init(self, extend=""):
+ self.host = "https://www.22a5.com"
+ self.session = Session()
+ adapter = adapters.HTTPAdapter(
+ max_retries=Retry(total=3, backoff_factor=0.5, status_forcelist=[429, 500, 502, 503, 504]),
+ pool_connections=20,
+ pool_maxsize=50
+ )
+ self.session.mount("http://", adapter)
+ self.session.mount("https://", adapter)
+ self.headers = {
+ "User-Agent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36"
+ }
+ self.session.headers.update(self.headers)
+
+ def getName(self):
+ return "爱听音乐"
+
+ def isVideoFormat(self, url):
+ return bool(re.search(r'\.(m3u8|mp4|mp3|m4a|flv)(\?|$)', url or "", re.I))
+
+ def manualVideoCheck(self):
+ return False
+
+ def destroy(self):
+ self.session.close()
+
+ # ==================== 新增人机验证绕过 ====================
+
+ def _bypass_verification(self, url, response_text):
+ """若当前页面是人机验证,自动提交勾选"""
+ if '安全人机验证' not in response_text and 'human_check' not in response_text:
+ return None
+
+ # 提取 csrf_token(支持多种格式)
+ token_match = re.search(r'name="csrf_token"\s+value="([^"]+)"', response_text)
+ if not token_match:
+ print("[爱听音乐] 未找到 csrf_token,跳过绕过")
+ return None
+ token = token_match.group(1)
+
+ # 构造提交数据
+ data = {
+ 'csrf_token': token,
+ 'human_check': 'on'
+ }
+
+ try:
+ # 发送 POST 请求,自动跟随重定向
+ post_resp = self.session.post(url, data=data, allow_redirects=True, timeout=10)
+ print("[爱听音乐] 人机验证已绕过")
+ return post_resp
+ except Exception as e:
+ print(f"[爱听音乐] 人机验证提交失败: {e}")
+ return None
+
+ def getpq(self, url):
+ """获取页面并自动处理人机验证(重试3次)"""
+ full_url = self._abs(url)
+
+ for attempt in range(3):
+ try:
+ resp = self.session.get(full_url, timeout=5)
+
+ # 若遇到验证页,尝试绕过
+ if '安全人机验证' in resp.text or 'human_check' in resp.text:
+ print("[爱听音乐] 检测到人机验证,尝试自动绕过...")
+ bypass_resp = self._bypass_verification(full_url, resp.text)
+ if bypass_resp:
+ # 验证成功后,返回最终页面(可能是重定向后的目标)
+ return pq(bypass_resp.text)
+ else:
+ # 绕过失败,等待后重试
+ time.sleep(1)
+ continue
+ else:
+ # 正常页面直接返回
+ return pq(resp.text)
+
+ except Exception as e:
+ print(f"[爱听音乐] 请求失败 (尝试 {attempt+1}/3): {e}")
+ time.sleep(0.5 * (attempt + 1))
+
+ # 全部失败,返回空文档
+ return pq("")
+
+ # ==================== 原有功能(保持不变) ====================
+
+ def homeContent(self, filter):
+ classes = [
+ {"type_name": n, "type_id": i}
+ for n, i in [
+ ("歌手", "/singerlist/index/index/index/index.html"),
+ ("TOP榜单", "/list/top.html"),
+ ("新歌榜", "/list/new.html"),
+ ("电台", "/radiolist/index.html"),
+ ("高清MV", "/mvlist/oumei.html"),
+ ("专辑", "/albumlist/index.html"),
+ ("歌单", "/playtype/index.html")
+ ]
+ ]
+ filters = {}
+ for p in [c["type_id"] for c in classes if "singer" not in c["type_id"]]:
+ d = self._fetch_filters(p)
+ if d:
+ filters[p] = d
+
+ if "/radiolist/index.html" not in filters:
+ filters["/radiolist/index.html"] = [{
+ "key": "id",
+ "name": "分类",
+ "value": [
+ {"n": n, "v": v}
+ for n, v in zip(
+ ["最新", "最热", "有声小说", "相声", "音乐", "情感", "国漫", "影视", "脱口秀", "历史", "儿童", "教育", "八卦", "推理", "头条"],
+ ["index", "hot", "novel", "xiangyi", "music", "emotion", "game", "yingshi", "talkshow", "history",
+ "children", "education", "gossip", "tuili", "headline"]
+ )
+ ]
+ }]
+
+ filters["/singerlist/index/index/index/index.html"] = [
+ {
+ "key": "area",
+ "name": "地区",
+ "value": [
+ {"n": "全部", "v": "index"},
+ {"n": "华语", "v": "huayu"},
+ {"n": "欧美", "v": "oumei"},
+ {"n": "韩国", "v": "hanguo"},
+ {"n": "日本", "v": "ribrn"}
+ ]
+ },
+ {
+ "key": "sex",
+ "name": "性别",
+ "value": [
+ {"n": "全部", "v": "index"},
+ {"n": "男", "v": "male"},
+ {"n": "女", "v": "girl"},
+ {"n": "组合", "v": "band"}
+ ]
+ },
+ {
+ "key": "genre",
+ "name": "流派",
+ "value": [
+ {"n": "全部", "v": "index"},
+ {"n": "流行", "v": "liuxing"},
+ {"n": "电子", "v": "dianzi"},
+ {"n": "摇滚", "v": "yaogun"},
+ {"n": "嘻哈", "v": "xiha"},
+ {"n": "R&B", "v": "rb"},
+ {"n": "民谣", "v": "minyao"},
+ {"n": "爵士", "v": "jueshi"},
+ {"n": "古典", "v": "gudian"}
+ ]
+ }
+ ]
+ return {"class": classes, "filters": filters, "list": []}
+
+ def homeVideoContent(self):
+ return {"list": []}
+
+ def categoryContent(self, tid, pg, filter, extend):
+ pg = int(pg or 1)
+ url = tid
+ if "/singerlist/" in tid:
+ parts = tid.split('/')
+ if len(parts) >= 6:
+ url = "/".join(parts[:2] + [extend.get(k, parts[i]) for i, k in enumerate(["area", "sex", "genre"], 2)] +
+ [f"{extend.get('char', 'index')}.html"])
+ elif "id" in extend and extend["id"] not in ["index", "top"]:
+ url = tid.replace("index.html", f"{extend['id']}.html").replace("top.html", f"{extend['id']}.html")
+ if url == tid:
+ url = f"{tid.rsplit('/', 1)[0]}/{extend['id']}.html"
+
+ if pg > 1:
+ sep = "/" if any(x in url for x in ["/singerlist/", "/radiolist/", "/mvlist/", "/playtype/", "/list/"]) else "_"
+ url = re.sub(r'(_\d+|/\d+)?\.html$', f'{sep}{pg}.html', url)
+
+ doc = self.getpq(url)
+ items = doc(".play_list li, .video_list li, .pic_list li, .singer_list li, .ali li, .layui-row li, .base_l li")
+ return {
+ "list": self._parse_list(items, tid),
+ "page": pg,
+ "pagecount": 9999,
+ "limit": 90,
+ "total": 999999
+ }
+
+ def searchContent(self, key, quick, pg="1"):
+ doc = self.getpq(f"/so/{quote(key)}/{pg}.html")
+ items = doc(".base_l li, .play_list li")
+ return {
+ "list": self._parse_list(items, "search"),
+ "page": int(pg)
+ }
+
+ def detailContent(self, ids):
+ url = self._abs(ids[0])
+ doc = self.getpq(url)
+ vod = {
+ "vod_id": url,
+ "vod_name": self._clean(doc("h1").text() or doc("title").text()),
+ "vod_pic": self._abs(doc(".djpg img, .pic img, .djpic img").attr("src")),
+ "vod_play_from": "爱听音乐",
+ "vod_content": ""
+ }
+
+ if any(x in url for x in ["/playlist/", "/album/", "/list/", "/singer/", "/special/", "/radio/", "/radiolist/"]):
+ eps = self._get_eps(doc)
+ page_urls = {
+ self._abs(a.attr("href"))
+ for a in doc(".page a, .dede_pages a, .pagelist a").items()
+ if a.attr("href") and "javascript" not in a.attr("href")
+ } - {url}
+ if page_urls:
+ with ThreadPoolExecutor(max_workers=5) as ex:
+ futures = []
+ for u in sorted(page_urls, key=lambda x: int(re.search(r'[_/](\d+)\.html', x).group(1)) if re.search(
+ r'[_/](\d+)\.html', x) else 0):
+ futures.append(ex.submit(lambda uu: self._get_eps(self.getpq(uu)), u))
+ for f in as_completed(futures):
+ eps.extend(f.result() or [])
+ if eps:
+ vod.update({
+ "vod_play_from": "播放列表",
+ "vod_play_url": "#".join(eps)
+ })
+ return {"list": [vod]}
+
+ play_list = []
+ if mid := re.search(r'/(song|mp3|radio|radiolist|radioplay)/([^/]+)\.html', url):
+ lrc_url = f"{self.host}/plug/down.php?ac=music&lk=lrc&id={mid.group(2)}"
+ play_list = [f"播放${self.e64('0@@@@' + url + '|||' + lrc_url)}"]
+
+ elif vid := re.search(r'/(video|mp4)/([^/]+)\.html', url):
+ with ThreadPoolExecutor(max_workers=3) as ex:
+ fs = {
+ ex.submit(self._api, "/plug/down.php", {"ac": "vplay", "id": vid.group(2), "q": q}): n
+ for n, q in [("蓝光", 1080), ("超清", 720), ("高清", 480)]
+ }
+ play_list = [f"{fs[f]}${self.e64('0@@@@'+u)}" for f in as_completed(fs) if (u := f.result())]
+ play_list.sort(key=lambda x: {"蓝": 0, "超": 1, "高": 2}.get(x[0], 3))
+
+ vod["vod_play_url"] = "#".join(play_list) if play_list else f"解析失败${self.e64('1@@@@'+url)}"
+ return {"list": [vod]}
+
+ def playerContent(self, flag, id, vipFlags):
+ raw = self.d64(id).split("@@@@")[-1]
+ url, subt = raw.split("|||") if "|||" in raw else (raw, "")
+ url = url.replace(r"\/", "/")
+
+ if ".html" in url and not self.isVideoFormat(url):
+ if mid := re.search(r'/(song|mp3|radio|radiolist|radioplay)/([^/]+)\.html', url):
+ if r_url := self._api("/js/play.php", method="POST", data={"id": mid.group(2), "type": "music"},
+ headers={"Referer": url.replace("http://", "https://"),
+ "X-Requested-With": "XMLHttpRequest"}):
+ url = r_url if ".php" not in r_url else url
+ elif vid := re.search(r'/(video|mp4)/([^/]+)\.html', url):
+ with ThreadPoolExecutor(max_workers=3) as ex:
+ for f in as_completed(
+ [ex.submit(self._api, "/plug/down.php", {"ac": "vplay", "id": vid.group(2), "q": q}) for q in
+ [1080, 720, 480]]):
+ if v_url := f.result():
+ url = v_url
+ break
+
+ result = {"parse": 0, "url": url, "header": {"User-Agent": self.headers["User-Agent"]}}
+ if "22a5.com" in url:
+ result["header"]["Referer"] = self.host + "/"
+
+ # OK影视3.6.5+支持LRC格式滚动歌词
+ if subt:
+ try:
+ r = self.session.get(subt, headers={"Referer": self.host + "/"}, timeout=5)
+ lrc_content = r.text
+ if lrc_content:
+ lrc_content = self._filter_lrc_ads(lrc_content)
+ result["lrc"] = lrc_content
+ except:
+ pass
+
+ return result
+
+ def _filter_lrc_ads(self, lrc_text):
+ """过滤LRC歌词中的广告内容"""
+ lines = lrc_text.splitlines()
+ filtered_lines = []
+
+ # 广告关键词模式
+ ad_patterns = [
+ r'欢迎来访.*',
+ r'本站.*',
+ r'.*广告.*',
+ r'QQ群.*',
+ r'.*www\..*',
+ r'.*http.*',
+ r'.*\.com.*',
+ r'.*\.cn.*',
+ r'.*\.net.*',
+ r'.*音乐网.*',
+ r'.*提供.*',
+ r'.*下载.*',
+ ]
+
+ for line in lines:
+ if re.match(r'\[\d{2}:\d{2}', line):
+ is_ad = False
+ for pattern in ad_patterns:
+ if re.search(pattern, line, re.IGNORECASE):
+ is_ad = True
+ break
+ if not is_ad:
+ filtered_lines.append(line)
+ else:
+ filtered_lines.append(line)
+
+ return '\n'.join(filtered_lines)
+
+ def localProxy(self, param):
+ url = unquote(param.get("url", ""))
+ type_ = param.get("type")
+
+ if type_ == "img":
+ try:
+ headers = {
+ "Referer": "https://www.baidu.com/",
+ "User-Agent": self.headers["User-Agent"],
+ "Accept": "image/webp,image/apng,image/*,*/*;q=0.8",
+ "Accept-Language": "zh-CN,zh;q=0.9"
+ }
+ resp = self.session.get(url, headers=headers, timeout=10)
+ return [200, "image/jpeg", resp.content, {}]
+ except Exception as e:
+ print(f"图片代理失败: {e}")
+ return [404, "text/plain", b"", {}]
+
+ elif type_ == "lrc":
+ try:
+ r = self.session.get(url, headers={"Referer": self.host + "/"}, timeout=5)
+ lrc_content = r.text
+ lrc_content = self._filter_lrc_ads(lrc_content)
+ return [200, "application/octet-stream", lrc_content.encode('utf-8'), {}]
+ except:
+ return [404, "text/plain", "Error", {}]
+
+ return None
+
+ # ==================== 辅助方法 ====================
+
+ def _parse_list(self, items, tid=""):
+ """解析列表项,修复歌手头像 - 直接返回原始图片URL"""
+ res = []
+ for li in items.items():
+ a = li("a").eq(0)
+ if not (href := a.attr("href")) or href == "/" or any(x in href for x in ["/user/", "/login/", "javascript"]):
+ continue
+ if not (name := self._clean(li(".name").text() or a.attr("title") or a.text())):
+ continue
+
+ is_singer = "/singer/" in href or "/singerlist" in tid
+
+ pic = ""
+ src = ""
+
+ if is_singer:
+ img = li(".pic img").eq(0)
+ src = img.attr("src") or ""
+ if not src:
+ img = li("img").eq(0)
+ src = img.attr("src") or ""
+ else:
+ img = li("img").eq(0)
+ src = img.attr("src") or ""
+ if not src:
+ img = li(".pic img").eq(0)
+ src = img.attr("src") or ""
+
+ if src:
+ if src.startswith('//'):
+ src = 'https:' + src
+ elif src.startswith('/'):
+ src = self.host + src
+ pic = src
+
+ res.append({
+ "vod_id": self._abs(href),
+ "vod_name": name,
+ "vod_pic": pic,
+ "style": {
+ "type": "oval" if is_singer else ("list" if any(
+ x in tid for x in ["/list/", "/playtype/", "/albumlist/"]) else "rect"),
+ "ratio": 1 if is_singer else 1.33
+ }
+ })
+ return res
+
+ def _get_eps(self, doc):
+ eps = []
+ for li in doc(".play_list li, .song_list li, .music_list li").items():
+ a = li("a").eq(0)
+ href = a.attr("href")
+ if not href or not re.search(r'/(song|mp3|radio|radiolist|radioplay)/([^/]+)\.html', href):
+ continue
+ full_url = self._abs(href)
+
+ lrc_part = ""
+ mid = re.search(r'/(song|mp3|radio|radiolist|radioplay)/([^/]+)\.html', full_url)
+ if mid:
+ lrc_url = f"{self.host}/plug/down.php?ac=music&lk=lrc&id={mid.group(2)}"
+ lrc_part = f"|||{lrc_url}"
+
+ eps.append(f"{self._clean(a.text() or li('.name').text())}${self.e64('0@@@@' + full_url + lrc_part)}")
+ return eps
+
+ def _clean(self, text):
+ return re.sub(
+ r'(爱玩音乐网|视频下载说明|视频下载地址|www\.2t58\.com|MP3免费下载|LRC歌词下载|全部歌曲|\[第\d+页\]|刷新|每日推荐|最新|热门|推荐|MV|高清|无损)',
+ '',
+ text or '',
+ flags=re.I
+ ).strip()
+
+ def _fetch_filters(self, url):
+ doc = self.getpq(url)
+ filters = []
+ for i, group in enumerate([
+ doc(".ilingku_fl"),
+ doc(".class_list"),
+ doc(".screen_list"),
+ doc(".box_list"),
+ doc(".nav_list")
+ ]):
+ if group:
+ opts = [{"n": "全部", "v": "top" if "top" in url else "index"}]
+ seen = set()
+ for a in group("a").items():
+ v = (a.attr("href") or "").split("?")[0].rstrip('/').split('/')[-1].replace('.html', '')
+ if v and v not in seen:
+ opts.append({"n": a.text().strip(), "v": v})
+ seen.add(v)
+ if len(opts) > 1:
+ filters.append({"key": f"id{i}" if i else "id", "name": "分类", "value": opts})
+ return filters
+
+ def _api(self, path, params=None, method="GET", headers=None, data=None):
+ try:
+ h = self.headers.copy()
+ if headers:
+ h.update(headers)
+ r = (self.session.post if method == "POST" else self.session.get)(
+ f"{self.host}{path}",
+ params=params,
+ data=data,
+ headers=h,
+ timeout=10,
+ allow_redirects=False
+ )
+ if loc := r.headers.get("Location"):
+ return self._abs(loc.strip())
+ return self._abs(r.json().get("url", "").replace(r"\/", "/")) or (r.text.strip() if r.text.strip().startswith(
+ "http") else "")
+ except:
+ return ""
+
+ def _abs(self, url):
+ if not url:
+ return ""
+ if url.startswith("http"):
+ return url
+ if url.startswith("//"):
+ return "https:" + url
+ return f"{self.host}{'/' if not url.startswith('/') else ''}{url}"
+
+ def e64(self, text):
+ return b64encode(text.encode("utf-8")).decode("utf-8")
+
+ def d64(self, text):
+ return b64decode(text.encode("utf-8")).decode("utf-8")
\ No newline at end of file
diff --git a/cpu_iy3/spider.jar b/cpu_iy3/spider.jar
index 20ce7839..d9faf44f 100644
Binary files a/cpu_iy3/spider.jar and b/cpu_iy3/spider.jar differ
diff --git a/cpu_iy3/version.txt b/cpu_iy3/version.txt
index 035854e4..47068190 100644
--- a/cpu_iy3/version.txt
+++ b/cpu_iy3/version.txt
@@ -1 +1 @@
-06.29
\ No newline at end of file
+07.03
\ No newline at end of file
diff --git a/cpu_iy3/天神IY.png b/cpu_iy3/天神IY.png
index 073a8be5..24301b81 100644
Binary files a/cpu_iy3/天神IY.png and b/cpu_iy3/天神IY.png differ
diff --git a/cpu_iy3/天神小屋.png b/cpu_iy3/天神小屋.png
index add74c0b..4be9ee59 100644
--- a/cpu_iy3/天神小屋.png
+++ b/cpu_iy3/天神小屋.png
@@ -1 +1 @@
-[{"name":"推荐","list":[{"name":"本地库【ff】","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/本地库【ff】.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"❤下载过,才能用"},{"name":"备用库【ff】","url":"https://wget.la/https://raw.githubusercontent.com/IY-CPU/test/main/本地库【ff】.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"❤下载过,才能用"}]},{"name":"播放源下载(❤下载过,才能用)","list":[{"name":"本地【vox】","url":"http://xw.123234567.xyz:60255/jiduo/vox本地包.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"最新版本"},{"name":"本地库【ff】","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/本地库【ff】.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"2026.06.17版"},{"name":"备用库【ff】","url":"https://wget.la/https://raw.githubusercontent.com/IY-CPU/test/main/本地库【ff】.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"2026.06.17版"},{"name":"本地【小虎斑】","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/IY/main/小虎斑.zip","icon":"https://img0.baidu.com/it/u=3403550249,2192222310&fm=253&fmt=auto?w=800&h=804","version":"15.8.4"},{"name":"缘起【天神IY】","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/IY/main/缘起【天神IY】.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"2026.06.29版"},{"name":"真心全量包1","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test1/main/真心20250402-全量包1.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"2025.4.2版"},{"name":"真心全量包2","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test1/main/真心20250402-全量包2.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"2025.4.2版"},{"name":"真心增量包","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/本地【真心】.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"2026.04.25版"},{"name":"本地【PG】","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/本地【PG】1.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"20260427-0913版"}]},{"name":"简易手机版软件下载,并在线可安装","list":[{"name":"天神IY手机版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神IY手机版.apk","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"5.1.6_64位"},{"name":"倾心壁纸","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test1/main/倾心壁纸_1.4.7","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/倾心壁纸.png","version":"1.4.7_手机64位"},{"name":"Via原版","url":"https://res.viayoo.com/v1/via-release-cn.apk","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/Via.png","version":"官方最新版"},{"name":"Via非原版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/IY/main/文件/Via_6.4.0内置脚本版.apk","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/Via.png","version":"6.4.0_内置脚本"},{"name":"MT管理器","url":"https://pan.mt2.cn/mt/MT2.18.3-clone-target28.apk","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/MT管理器.png","version":"2.18.3_原共存版"},{"name":"MT管理器","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/MT管理器_2.14.5部分破解版.apk","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/MT管理器.png","version":"2.14.5_部分破解"},{"name":"NP管理器","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/NP管理器_3.1.25.apk","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/NP管理器.png","version":"3.1.25_原版"},{"name":"WiFi万能钥匙","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test1/main/万能钥匙_1.1.39.apk","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/WiFi万能钥匙.png","version":"1.1.39_破解版"},{"name":"蓝牙遥控","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/IY/main/文件/蓝牙遥控_2.0.9.apk","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/蓝牙遥控器.png","version":"2.0.9_原版"}]},{"name":"其他软件下载,去文件管理器查找、安装","list":[{"name":"无意云Pro版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/无意云手机版341.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/无意云.png","version":"3.4.1_手机非共存"},{"name":"无意云Pro版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/无意云电视版341.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/无意云.png","version":"3.4.1_电视非共存"},{"name":"天神IY电视版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神IY电视版.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"5.1.6_电视32位"},{"name":"天神IY海信版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神IY海信版.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"5.1.6_非共存"},{"name":"天神IY电视版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神IY电视64位版.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"5.1.6_电视64位"},{"name":"天神IY电视全内置版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神IY电视全内置版.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"5.1.6_内置32位"},{"name":"天神IY海信全内置版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神IY海信全内置版.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"5.1.6_内置非共存"},{"name":"天神IY电视版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神IY电视版250.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"2.5.0_安卓4.+版"},{"name":"小白文件管理器","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/IY/main/文件/小白文件管理器_2.8.0(TV版).zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/小白文件管理器.png","version":"2.8.0_电视版"},{"name":"天神仓","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神仓617.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"6.1.7_180电视版"},{"name":"天神仓海信版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神仓海信版617.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"6.1.7_海信非共存"},{"name":"1DM+","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/1DM+_v17.2.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/1DM.png","version":"17.2_手机版"},{"name":"洛雪音乐","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/洛雪音乐888.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/洛雪音乐.png","version":"8.8.8_手机版"},{"name":"阅读","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test1/main/阅读合集325.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/阅读.png","version":"3.25_手机版"},{"name":"家庭KTV","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/IY/main/家庭KTV115.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/家庭KTV.png","version":"1.1.5_电视版"}]}]
\ No newline at end of file
+[{"name":"推荐","list":[{"name":"本地库【ff】","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/本地库【ff】.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"❤下载过,才能用"},{"name":"备用库【ff】","url":"https://wget.la/https://raw.githubusercontent.com/IY-CPU/test/main/本地库【ff】.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"❤下载过,才能用"}]},{"name":"播放源下载(❤下载过,才能用)","list":[{"name":"本地【vox】","url":"http://xw.123234567.xyz:60255/jiduo/vox本地包.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"最新版本"},{"name":"本地库【ff】","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/本地库【ff】.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"2026.07.03版"},{"name":"备用库【ff】","url":"https://wget.la/https://raw.githubusercontent.com/IY-CPU/test/main/本地库【ff】.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"2026.07.03版"},{"name":"本地【小虎斑】","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/IY/main/小虎斑.zip","icon":"https://img0.baidu.com/it/u=3403550249,2192222310&fm=253&fmt=auto?w=800&h=804","version":"15.8.4"},{"name":"缘起【天神IY】","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/IY/main/缘起【天神IY】.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"2026.07.03版"},{"name":"真心全量包1","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test1/main/真心20250402-全量包1.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"2025.4.2版"},{"name":"真心全量包2","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test1/main/真心20250402-全量包2.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"2025.4.2版"},{"name":"真心增量包","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/本地【真心】.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"2026.04.25版"},{"name":"本地【PG】","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/本地【PG】1.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"20260427-0913版"}]},{"name":"简易手机版软件下载,并在线可安装","list":[{"name":"天神IY手机版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神IY手机版.apk","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"5.1.6_64位"},{"name":"倾心壁纸","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test1/main/倾心壁纸_1.4.7","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/倾心壁纸.png","version":"1.4.7_手机64位"},{"name":"Via原版","url":"https://res.viayoo.com/v1/via-release-cn.apk","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/Via.png","version":"官方最新版"},{"name":"Via非原版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/IY/main/文件/Via_6.4.0内置脚本版.apk","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/Via.png","version":"6.4.0_内置脚本"},{"name":"MT管理器","url":"https://pan.mt2.cn/mt/MT2.18.3-clone-target28.apk","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/MT管理器.png","version":"2.18.3_原共存版"},{"name":"MT管理器","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/MT管理器_2.14.5部分破解版.apk","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/MT管理器.png","version":"2.14.5_部分破解"},{"name":"NP管理器","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/NP管理器_3.1.25.apk","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/NP管理器.png","version":"3.1.25_原版"},{"name":"WiFi万能钥匙","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test1/main/万能钥匙_1.1.39.apk","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/WiFi万能钥匙.png","version":"1.1.39_破解版"},{"name":"蓝牙遥控","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/IY/main/文件/蓝牙遥控_2.0.9.apk","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/蓝牙遥控器.png","version":"2.0.9_原版"}]},{"name":"其他软件下载,去文件管理器查找、安装","list":[{"name":"无意云Pro版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/无意云手机版341.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/无意云.png","version":"3.4.1_手机非共存"},{"name":"无意云Pro版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/无意云电视版341.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/无意云.png","version":"3.4.1_电视非共存"},{"name":"天神IY电视版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神IY电视版.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"5.1.6_电视32位"},{"name":"天神IY海信版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神IY海信版.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"5.1.6_非共存"},{"name":"天神IY电视版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神IY电视64位版.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"5.1.6_电视64位"},{"name":"天神IY电视全内置版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神IY电视全内置版.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"5.1.6_内置32位"},{"name":"天神IY海信全内置版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神IY海信全内置版.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"5.1.6_内置非共存"},{"name":"天神IY电视版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神IY电视版250.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"2.5.0_安卓4.+版"},{"name":"小白文件管理器","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/IY/main/文件/小白文件管理器_2.8.0(TV版).zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/小白文件管理器.png","version":"2.8.0_电视版"},{"name":"天神仓","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神仓617.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"6.1.7_180电视版"},{"name":"天神仓海信版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神仓海信版617.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"6.1.7_海信非共存"},{"name":"1DM+","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/1DM+_v17.2.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/1DM.png","version":"17.2_手机版"},{"name":"洛雪音乐","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/洛雪音乐888.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/洛雪音乐.png","version":"8.8.8_手机版"},{"name":"阅读","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test1/main/阅读合集325.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/阅读.png","version":"3.25_手机版"},{"name":"家庭KTV","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/IY/main/家庭KTV115.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/家庭KTV.png","version":"1.1.5_电视版"}]}]
\ No newline at end of file
diff --git a/cpu_iy3/缘起【天神IY】.zip b/cpu_iy3/缘起【天神IY】.zip
index d12b94e9..b88b89d6 100644
Binary files a/cpu_iy3/缘起【天神IY】.zip and b/cpu_iy3/缘起【天神IY】.zip differ
diff --git a/jaychouqq/demo1.json b/jaychouqq/demo1.json
index d7b7edf3..ec9f754d 100644
--- a/jaychouqq/demo1.json
+++ b/jaychouqq/demo1.json
@@ -14,6 +14,7 @@
{ "name": "豆瓣高分", "url": "&type=movie&tag=豆瓣高分&page_start={{page-1}}" },
{ "name": "华语", "url": "&type=movie&tag=华语&page_start={{page-1}}" },
{ "name": "欧美", "url": "&type=movie&tag=欧美&page_start={{page-1}}" },
+ { "name": "情色", "url": "&type=movie&tag=情色&page_start={{page-1}}" },
{ "name": "韩国", "url": "&type=movie&tag=韩国&page_start={{page-1}}" }
],
"list": {
diff --git a/jaychouqq/yingshi/js7/bddj.js b/jaychouqq/yingshi/js7/bddj.js
new file mode 100644
index 00000000..0a56d801
--- /dev/null
+++ b/jaychouqq/yingshi/js7/bddj.js
@@ -0,0 +1,436 @@
+/*
+@header({
+ searchable: 1,
+ filterable: 0,
+ quickSearch: 1,
+ title: '百度短剧',
+ lang: 'cat'
+})
+*/
+import { Crypto as CryptoJS } from 'assets://js/lib/cat.js';
+
+let key = '百度短剧';
+let siteName = '';
+let siteKey = '';
+let siteType = 0;
+let shuaCache = [];
+
+let UA = "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36";
+let clarity_order = {'蓝光': 1, '超清': 2, '标清': 3};
+
+// ==================== URL配置集中管理 ====================
+let rule = {
+ host: 'https://mbd.baidu.com',
+ detailHost: 'https://sv.baidu.com',
+ listUrl: '/feedapi/v1/videoserver/playlets/list?service=bdbox',
+ searchUrl: '/feedapi/v1/videoserver/playlets/search?service=bdbox',
+ detailUrl: '/haokan/ui-video/playlet/rec/detail?log=vhk&tn=1020970b&ctn=1008350n&blur=1',
+ playUrl: '/appui/api?cmd=video/relate&log=vhk&tn=1020970b&ctn=1008350n&blur=1',
+};
+
+function init(cfg) {
+ siteName = (cfg.skey?.split('_')[1] || cfg.skey) || (cfg.key?.split('_')[1] || cfg.key) || '未知';
+ siteKey = cfg.skey;
+ siteType = cfg.stype;
+}
+
+function home(filter) {
+ let he = ["全部", "新剧", "限时免费", "精选", "独播"];
+ let ticailist = [
+ "神医", "连续剧", "都市", "现代言情", "异能", "逆袭", "甜宠", "总裁", "萌宝", "战神", "宫斗宅斗", "神豪",
+ "虐恋", "闪婚", "玄幻", "穿越重生", "年代", "家庭伦理", "古代言情", "武侠武打", "赘婿", "单元剧", "青春校园",
+ "历史架空", "王妃", "鉴宝", "科幻", "军旅战争", "种田"
+ ];
+
+ let classes = he.map(name => ({
+ type_id: name,
+ type_name: name
+ }));
+
+ classes = classes.concat(ticailist.map(name => ({
+ type_id: name === "全部" ? "全部题材" : name,
+ type_name: name
+ })));
+
+ return JSON.stringify({
+ class: classes,
+ filters: {}
+ });
+}
+
+async function homeVod() {
+ const categoryResult = await category('新剧', 1, {}, {});
+ const categoryList = JSON.parse(categoryResult).list;
+
+ return JSON.stringify({
+ list: [
+ {
+ vod_id: 'shua',
+ vod_name: '发现精彩',
+ vod_pic: 'https://t8.baidu.com/it/u=615012979,225344800&fm=193'
+ },
+ ...categoryList
+ ]
+ });
+}
+
+/**
+ * 合并请求函数 - 统一处理 data 和 body,支持 form-urlencoded 和 JSON
+ */
+async function request(url, options = {}) {
+ try {
+ console.log(`【${siteName}】${options.method || 'GET'} ${url.split('?')[0]}`);
+
+ // 准备基础配置
+ let requestConfig = {
+ method: options.method || 'GET',
+ headers: { "User-Agent": UA, ...options.headers }
+ };
+
+ // 获取内容类型
+ let contentType = requestConfig.headers['Content-Type'] || '';
+
+ // 辅助函数:将对象转换为字符串
+ function stringifyData(data, format) {
+ if (format.includes('json')) {
+ return JSON.stringify(data);
+ } else {
+ // 默认 form-urlencoded
+ const parts = [];
+ for (let key in data) {
+ let value = data[key];
+ if (typeof value === 'object' && value !== null) {
+ value = JSON.stringify(value);
+ }
+ parts.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));
+ }
+ return parts.join('&');
+ }
+ }
+
+ // 处理数据 - 无论 data 还是 body,统一处理
+ let requestData = options.data || options.body;
+
+ if (requestData) {
+ if (typeof requestData === 'string') {
+ // 已经是字符串,直接使用
+ requestConfig.body = requestData;
+ } else if (typeof requestData === 'object') {
+ // 对象,根据内容类型转换
+ if (!contentType) {
+ // 没有指定内容类型,默认 form-urlencoded
+ contentType = 'application/x-www-form-urlencoded';
+ requestConfig.headers['Content-Type'] = contentType;
+ }
+ requestConfig.body = stringifyData(requestData, contentType);
+ }
+ }
+
+ const res = await req(url, requestConfig);
+ return res.content || '';
+ } catch (e) {
+ console.log(`【${siteName}】请求失败: ${e.message}`);
+ return '';
+ }
+}
+
+async function category(tid, pg, filter, extend) {
+ pg = pg <= 0 ? 1 : pg;
+ let sub = ["新剧", "限时免费", "精选", "独播"].includes(tid) ? tid : "新剧";
+ let tcsub = tid === "全部" || tid === "全部题材" ? "" : tid;
+
+ let t = Math.floor(Date.now() / 1000);
+ let version = await md5(t + "v2");
+
+ // 直接传对象
+ let postData = {
+ 'data': {
+ "data": {
+ "extRequest": { "flow_tabid": "13" },
+ "from": "feed",
+ "page": "channel_video_landing",
+ "pd": "feed",
+ "refreshIndex": pg,
+ "cursor": "",
+ "theme": "",
+ "timestamp": t,
+ "version": version,
+ "themes": [
+ { "kind": "综合", "names": [sub] },
+ { "kind": "题材", "names": [tcsub] }
+ ]
+ }
+ }
+ };
+
+ let html = await request(`${rule.host}${rule.listUrl}`, {
+ method: 'POST',
+ headers: {
+ "Connection": "Keep-Alive",
+ 'Content-Type': 'application/x-www-form-urlencoded'
+ },
+ data: postData // 可以用 data
+ });
+
+ let res = JSON.parse(html);
+ let items = res.data.items;
+
+ let videos = items.map(it => ({
+ vod_id: it.collId,
+ vod_name: it.title,
+ vod_pic: it.img,
+ vod_remarks: it.updateStatus,
+ vod_content: it.description
+ }));
+
+ return JSON.stringify({
+ page: pg,
+ pagecount: pg + 1,
+ limit: 20,
+ total: items.length * (pg + 1),
+ list: videos
+ });
+}
+
+async function detail(id) {
+ if (id === 'shua') {
+ return JSON.stringify({
+ list: [{
+ vod_id: 'shua',
+ vod_name: '发现精彩',
+ vod_pic: 'https://t8.baidu.com/it/u=615012979,225344800&fm=193',
+ vod_play_from: '百度短剧',
+ vod_play_url: '刷刷看$shua',
+ vod_tag: '[SHUA][JUMP][V]'
+ }]
+ });
+ }
+
+ // 也可以用 body
+ let html = await request(`${rule.detailHost}${rule.detailUrl}`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded'
+ },
+ body: { // body 传对象也会自动处理
+ playlet_id: id,
+ vid: "undefined"
+ }
+ });
+
+ let res = JSON.parse(html);
+ let dthtml = res.data;
+ let vids = dthtml.vid_list;
+ let playArr = vids.map((vid, index) => `第${index + 1}集$${vid}`);
+
+ const vod = {
+ vod_id: id,
+ vod_name: dthtml.playlet_title,
+ vod_pic: dthtml.playlet_poster,
+ vod_content: dthtml.description,
+ vod_remarks: `共${vids.length}集 热度值:${dthtml.hot_value} 集数:${dthtml.episodes_num}`,
+ vod_director: dthtml.tag_text,
+ vod_year: dthtml.create_time,
+ vod_play_from: "百度短剧",
+ vod_play_url: playArr.join('#')
+ };
+
+ return JSON.stringify({ list: [vod] });
+}
+
+async function play(flag, id, flags) {
+ if (id == 'shua') {
+ if (shuaCache.length == 0) {
+ const randomPage = getRnd(1, 20);
+ const categories = ["新剧", "限时免费", "精选", "独播"];
+ const randomCate = categories[Math.floor(Math.random() * categories.length)];
+
+ const categoryResult = await category(randomCate, randomPage, {}, {});
+ const res = JSON.parse(categoryResult);
+ const videos = [];
+
+ for (const it of res.list.slice(0, 10)) {
+ const detailResult = await detail(it.vod_id);
+ const detailObj = JSON.parse(detailResult);
+ const vod = detailObj.list[0];
+
+ const match = vod.vod_remarks.match(/(\d+)/);
+ const episodeCount = match[1];
+
+ videos.push({
+ parse: 0,
+ url: it.vod_id,
+ shuaTitle: vod.vod_name,
+ shuaDes: '共' + episodeCount + '集 | ' + vod.vod_content.replace(/\s/g, ''),
+ shuaActions: { play: it.vod_id },
+ errorPlayNext: true
+ });
+ }
+ shuaCache.push(...videos);
+ }
+
+ const cache = shuaCache.shift();
+ const detailResult = await detail(cache.url);
+ const detailObj = JSON.parse(detailResult);
+ const vod = detailObj.list[0];
+
+ const playUrls = vod.vod_play_url.split('#');
+ const firstEpisode = playUrls[0];
+ const vid = firstEpisode.split('$')[1];
+
+ const playHtml = await request(`${rule.detailHost}${rule.playUrl}`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded'
+ },
+ data: { // 用 data 或 body 都可以
+ method: "post",
+ vid: vid
+ }
+ });
+
+ const playRes = JSON.parse(playHtml);
+ const playJson = playRes["video/relate"].data.cur_video;
+ const urls = [];
+
+ for (const item of playJson.clarityUrl) {
+ urls.push({
+ title: item.title,
+ url: item.url,
+ order: clarity_order[item.title] || 999
+ });
+ }
+ urls.sort(function (a, b) { return a.order - b.order; });
+ cache.url = urls[0].url;
+
+ return JSON.stringify(cache);
+ }
+
+ const html = await request(`${rule.detailHost}${rule.playUrl}`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded'
+ },
+ body: { // body 传对象
+ method: "post",
+ vid: id
+ }
+ });
+
+ const res = JSON.parse(html);
+ const json = res["video/relate"].data.cur_video;
+ const urls = [];
+
+ for (const item of json.clarityUrl) {
+ urls.push({
+ title: item.title,
+ url: item.url,
+ order: clarity_order[item.title] || 999
+ });
+ }
+ urls.sort(function (a, b) { return a.order - b.order; });
+
+ const flat = [];
+ for (const item of urls) {
+ flat.push(item.title);
+ flat.push(item.url);
+ }
+
+ return JSON.stringify({
+ parse: 0,
+ url: flat,
+ header: {
+ 'User-Agent': UA,
+ 'Referer': rule.host
+ }
+ });
+}
+
+async function search(wd, quick, pg) {
+ pg = pg <= 0 ? 1 : pg;
+
+ let postData = {
+ 'data': {
+ "data": {
+ "query": wd,
+ "page": pg,
+ "attribute": ["title"],
+ "fe_page_type": "search",
+ "extra": {
+ "tab_id": "216",
+ "flow_tabid": "13",
+ "shortplay_source": "feed",
+ "from": "feed",
+ "tab_type": "搜索",
+ "sub_template": "playlet_search_result"
+ }
+ }
+ }
+ };
+
+ let html = await request(`${rule.host}${rule.searchUrl}`, {
+ method: 'POST',
+ headers: {
+ "Connection": "Keep-Alive",
+ "Accept-Encoding": "gzip",
+ 'Content-Type': 'application/x-www-form-urlencoded'
+ },
+ data: postData // 用 data
+ });
+
+ let res = JSON.parse(html);
+ let items = res.data.itemList;
+
+ let videos = items.map(it => ({
+ vod_id: it.nid.split("_")[1],
+ vod_name: it.title,
+ vod_pic: it.img,
+ vod_remarks: it.collNum + '集',
+ vod_content: it.description
+ }));
+
+ return JSON.stringify({
+ page: pg,
+ pagecount: pg + 1,
+ limit: 20,
+ total: items.length * (pg + 1),
+ list: videos
+ });
+}
+
+function getRnd(min, max, hexNum, isUpper) {
+ var r = parseInt(Math.random() * (max - min + 1) + min, 10);
+ if (hexNum) {
+ r = isUpper ? r.toString(hexNum).toUpperCase() : r.toString(hexNum);
+ }
+ return r;
+}
+
+async function md5(str) {
+ return CryptoJS.MD5(str).toString(CryptoJS.enc.Hex).toLowerCase();
+}
+
+async function action(action, value) {
+ if (action === 'shuaPlay') {
+ return JSON.stringify({
+ action: {
+ actionId: '__detail__',
+ ids: value,
+ keep: true
+ }
+ });
+ }
+}
+
+export function __jsEvalReturn() {
+ return {
+ init: init,
+ home: home,
+ homeVod: homeVod,
+ category: category,
+ detail: detail,
+ play: play,
+ search: search,
+ action: action
+ };
+}
\ No newline at end of file
diff --git a/jaychouqq/yingshi/js7/jd4k.js b/jaychouqq/yingshi/js7/jd4k.js
new file mode 100644
index 00000000..b251c368
--- /dev/null
+++ b/jaychouqq/yingshi/js7/jd4k.js
@@ -0,0 +1,1729 @@
+const _0x24a000 = _0x3bf3;
+(function (_0x4af1bf, _0x354faf) {
+ const _0x10067b = _0x3bf3, _0x4787fe = _0x4af1bf();
+ while (!![]) {
+ try {
+ const _0x4356d7 = -parseInt(_0x10067b(0x35d)) / (0x869 * -0x1 + -0x2509 * 0x1 + 0x2d73) * (parseInt(_0x10067b(0x24d)) / (0x112 * 0xe + -0x1d * 0x89 + 0x8b * 0x1)) + -parseInt(_0x10067b(0x3bd)) / (0x3f * -0x5e + 0x1596 + 0x18f) + -parseInt(_0x10067b(0x2f5)) / (0x22aa + -0x255e + -0x57 * -0x8) * (parseInt(_0x10067b(0x1e5)) / (0x1c5d + 0x769 + -0x23c1)) + -parseInt(_0x10067b(0x3c1)) / (0x1 * -0xcff + -0x1e62 + -0x29 * -0x10f) * (parseInt(_0x10067b(0x3ad)) / (0x1b46 * -0x1 + 0xf85 + 0xbc8)) + -parseInt(_0x10067b(0x34a)) / (-0x2576 + -0x1f4d + -0x44cb * -0x1) * (-parseInt(_0x10067b(0x295)) / (-0x2 * 0x7d1 + 0x1 * 0x13d5 + 0x1 * -0x42a)) + parseInt(_0x10067b(0x246)) / (0x43 * 0x59 + -0x2638 + 0x1 * 0xef7) + -parseInt(_0x10067b(0x234)) / (0x2 * 0x11dc + -0x1e02 + 0x1 * -0x5ab) * (-parseInt(_0x10067b(0x21f)) / (0x1 * -0xa75 + 0x119 * 0x15 + -0xc8c));
+ if (_0x4356d7 === _0x354faf)
+ break;
+ else
+ _0x4787fe['push'](_0x4787fe['shift']());
+ } catch (_0x531b5c) {
+ _0x4787fe['push'](_0x4787fe['shift']());
+ }
+ }
+}(_0x30bd, -0x1 * -0x192eb + -0xa95 * -0x1a7 + -0x7b329));
+import {
+ Crypto,
+ _
+} from 'assets://js/lib/cat.js';
+let host = '', header = { 'User-Agent': _0x24a000(0x269) + _0x24a000(0x2e1) }, siteKey = '', siteType = '', siteJx = '';
+const urlPattern1 = /api\.php\/.*?\/vod/, urlPattern2 = /api\.php\/.+?\.vod/, parsePattern = /\/.+\\?.+=/, parsePattern1 = /.*(url|v|vid|php\?id)=/, parsePattern2 = /https?:\/\/[^\/]*/, htmlVideoKeyMatch = [
+ /player=new/,
+ / _0x50fda5;
+ },
+ 'AEWJN': function (_0x34e794, _0x24610e, _0x529315, _0x31bacd) {
+ return _0x34e794(_0x24610e, _0x529315, _0x31bacd);
+ },
+ 'Knznh': function (_0x4f4e7d, _0x5a0aac) {
+ return _0x4f4e7d !== _0x5a0aac;
+ },
+ 'ViinS': function (_0x595f7e, _0x159136) {
+ return _0x595f7e(_0x159136);
+ }
+ };
+ try {
+ let _0xabb5ea = siteJx[_0x314f8e];
+ !_0xabb5ea && (siteJx[_0x5ed43f(0x3b3) + _0x5ed43f(0x2f2)]('*') ? _0xabb5ea = siteJx['*'] : _0xabb5ea = []);
+ _0x46895d[_0x5ed43f(0x28d)](_0xabb5ea[_0x5ed43f(0x2d3)], 0x6 * -0x2c7 + 0xf * -0x1a5 + 0xdc7 * 0x3) && (_0xabb5ea = [_0x46895d[_0x5ed43f(0x27e)]]);
+ if (_0x46895d[_0x5ed43f(0x24b)](_0xabb5ea[_0x5ed43f(0x2d3)], -0xf * 0x73 + 0x13df + -0xd22 * 0x1)) {
+ const _0xc1b189 = await _0x46895d[_0x5ed43f(0x285)](getFinalVideo, _0x314f8e, _0xabb5ea, _0x533915);
+ if (_0x46895d[_0x5ed43f(0x3c2)](_0xc1b189, null))
+ return JSON[_0x5ed43f(0x3a2)](_0xc1b189);
+ }
+ if (_0x46895d[_0x5ed43f(0x334)](isVideoFormat, _0x533915)) {
+ const _0x2016c3 = {
+ 'parse': 0x1,
+ 'playUrl': '',
+ 'url': _0x533915
+ };
+ return JSON[_0x5ed43f(0x3a2)](_0x2016c3);
+ } else {
+ const _0x59b4d5 = {
+ 'parse': 0x1,
+ 'jx': '1',
+ 'url': _0x533915
+ };
+ return JSON[_0x5ed43f(0x3a2)](_0x59b4d5);
+ }
+ } catch (_0x15f170) {
+ SpiderDebug[_0x5ed43f(0x24a)](_0x15f170);
+ }
+ return '';
+}
+async function search(_0x15b8fa, _0x588e3d) {
+ const _0xc070a9 = _0x24a000, _0x24ff97 = {
+ 'rAAqR': _0xc070a9(0x288),
+ 'gHEas': _0xc070a9(0x2cf) + 'od',
+ 'PPjsc': function (_0x4c022d, _0x4ebd2b) {
+ return _0x4c022d(_0x4ebd2b);
+ },
+ 'nAAlp': function (_0x1196f9, _0x523142, _0x215206) {
+ return _0x1196f9(_0x523142, _0x215206);
+ },
+ 'Yoody': function (_0x40a0f3, _0x527133, _0x5f956b) {
+ return _0x40a0f3(_0x527133, _0x5f956b);
+ },
+ 'Qzbyi': function (_0xf70d91, _0x5d6ade) {
+ return _0xf70d91(_0x5d6ade);
+ },
+ 'AhyMI': function (_0x42d25e, _0x371898) {
+ return _0x42d25e instanceof _0x371898;
+ },
+ 'raJIH': function (_0x2a22fd, _0x2de3f5) {
+ return _0x2a22fd instanceof _0x2de3f5;
+ },
+ 'bfaLF': function (_0x8207e7, _0x21fb6c) {
+ return _0x8207e7 !== _0x21fb6c;
+ }
+ };
+ try {
+ if (host[_0xc070a9(0x39f)](_0x24ff97[_0xc070a9(0x26f)]) || host[_0xc070a9(0x39f)](_0x24ff97[_0xc070a9(0x28c)])) {
+ const _0x26ec58 = host + (_0xc070a9(0x324) + _0xc070a9(0x28e)) + _0x24ff97[_0xc070a9(0x294)](encodeURIComponent, _0x15b8fa) + _0xc070a9(0x237), _0x1c1ca8 = await _0x24ff97[_0xc070a9(0x247)](request, _0x26ec58, _0x24ff97[_0xc070a9(0x294)](getHeaders, _0x26ec58)), _0xc6c488 = JSON[_0xc070a9(0x213)](_0x1c1ca8), _0x1ead5c = [];
+ if (_0xc6c488[_0xc070a9(0x394)] && Array[_0xc070a9(0x315)](_0xc6c488[_0xc070a9(0x394)]))
+ for (const _0x284ed3 of _0xc6c488[_0xc070a9(0x394)]) {
+ _0x1ead5c[_0xc070a9(0x332)]({
+ 'vod_id': _0x284ed3[_0xc070a9(0x3c3)],
+ 'vod_name': _0x284ed3[_0xc070a9(0x2b8)],
+ 'vod_pic': _0x284ed3[_0xc070a9(0x290)] || '',
+ 'vod_remarks': _0x284ed3[_0xc070a9(0x346) + 's'] || ''
+ });
+ }
+ return JSON[_0xc070a9(0x3a2)]({ 'list': _0x1ead5c });
+ } else {
+ const _0x4c1fc9 = host, _0x3631b2 = _0x24ff97[_0xc070a9(0x247)](getSearchUrl, _0x4c1fc9, _0x24ff97[_0xc070a9(0x294)](encodeURIComponent, _0x15b8fa)), _0x15e390 = await _0x24ff97[_0xc070a9(0x369)](request, _0x3631b2, _0x24ff97[_0xc070a9(0x2a1)](getHeaders, _0x3631b2)), _0x59d1cc = JSON[_0xc070a9(0x213)](_0x15e390);
+ let _0x136112 = null;
+ const _0x1337a6 = [];
+ if (_0x24ff97[_0xc070a9(0x3ac)](_0x59d1cc[_0xc070a9(0x394)], Array))
+ _0x136112 = _0x59d1cc[_0xc070a9(0x394)];
+ else {
+ if (_0x24ff97[_0xc070a9(0x2bc)](_0x59d1cc[_0xc070a9(0x339)], Object) && _0x24ff97[_0xc070a9(0x3ac)](_0x59d1cc[_0xc070a9(0x339)][_0xc070a9(0x394)], Array))
+ _0x136112 = _0x59d1cc[_0xc070a9(0x339)][_0xc070a9(0x394)];
+ else
+ _0x24ff97[_0xc070a9(0x2bc)](_0x59d1cc[_0xc070a9(0x339)], Array) && (_0x136112 = _0x59d1cc[_0xc070a9(0x339)]);
+ }
+ if (_0x24ff97[_0xc070a9(0x2ee)](_0x136112, null))
+ for (const _0x152e86 of _0x136112) {
+ if (_0x152e86[_0xc070a9(0x3c3)]) {
+ const _0x49ee8a = {
+ 'vod_id': _0x152e86[_0xc070a9(0x3c3)],
+ 'vod_name': _0x152e86[_0xc070a9(0x2b8)],
+ 'vod_pic': _0x152e86[_0xc070a9(0x290)],
+ 'vod_remarks': _0x152e86[_0xc070a9(0x346) + 's']
+ };
+ _0x1337a6[_0xc070a9(0x332)](_0x49ee8a);
+ } else {
+ const _0x467d07 = {
+ 'vod_id': _0x152e86[_0xc070a9(0x3b6)],
+ 'vod_name': _0x152e86[_0xc070a9(0x1e9)],
+ 'vod_pic': _0x152e86[_0xc070a9(0x3ba)],
+ 'vod_remarks': _0x152e86[_0xc070a9(0x258)]
+ };
+ _0x1337a6[_0xc070a9(0x332)](_0x467d07);
+ }
+ }
+ const _0x1e4c19 = { 'list': _0x1337a6 };
+ return JSON[_0xc070a9(0x3a2)](_0x1e4c19);
+ }
+ } catch (_0x334adf) {
+ SpiderDebug[_0xc070a9(0x24a)](_0x334adf);
+ }
+ return '';
+}
+async function getFinalVideo(_0x356707, _0x398327, _0x2ef122) {
+ const _0x12dc27 = _0x24a000, _0x44bf01 = {
+ 'KPgHF': function (_0x55b24f, _0x2ecff3) {
+ return _0x55b24f === _0x2ecff3;
+ },
+ 'WCCoT': function (_0x2ce219, _0x446505) {
+ return _0x2ce219 === _0x446505;
+ },
+ 'QIbLN': _0x12dc27(0x1fb),
+ 'XjiyL': function (_0x451dd4, _0x2b6510) {
+ return _0x451dd4 + _0x2b6510;
+ },
+ 'eFJbi': function (_0xe7aa93, _0x51184b, _0x539572, _0x540f7d) {
+ return _0xe7aa93(_0x51184b, _0x539572, _0x540f7d);
+ },
+ 'cchWu': function (_0x5d7821, _0x2a0a3c, _0x143221) {
+ return _0x5d7821(_0x2a0a3c, _0x143221);
+ },
+ 'emPiw': function (_0x242abc, _0x178c18) {
+ return _0x242abc !== _0x178c18;
+ },
+ 'HHlAe': _0x12dc27(0x366),
+ 'snexY': _0x12dc27(0x2e3),
+ 'oRses': _0x12dc27(0x352)
+ };
+ let _0xcd3790 = '';
+ for (const _0x5cb301 of _0x398327) {
+ if (_0x44bf01[_0x12dc27(0x200)](_0x5cb301, '') || _0x44bf01[_0x12dc27(0x205)](_0x5cb301, _0x44bf01[_0x12dc27(0x2a5)]))
+ continue;
+ const _0x2f83f6 = _0x44bf01[_0x12dc27(0x30c)](_0x5cb301, _0x2ef122), _0x4b7b47 = await _0x44bf01[_0x12dc27(0x219)](request, _0x2f83f6, null, -0x3 * 0x13f + -0x1 * 0x4d12 + 0x243 * 0x35);
+ let _0x5e80c0 = null;
+ try {
+ _0x5e80c0 = _0x44bf01[_0x12dc27(0x2c1)](jsonParse, _0x2ef122, _0x4b7b47);
+ } catch (_0x684857) {
+ }
+ if (_0x44bf01[_0x12dc27(0x2a3)](_0x5e80c0, null) && _0x5e80c0[_0x12dc27(0x3b3) + _0x12dc27(0x2f2)](_0x44bf01[_0x12dc27(0x364)]) && _0x5e80c0[_0x12dc27(0x3b3) + _0x12dc27(0x2f2)](_0x44bf01[_0x12dc27(0x3a7)]))
+ return _0x5e80c0[_0x12dc27(0x2e3)] = JSON[_0x12dc27(0x3a2)](_0x5e80c0[_0x12dc27(0x2e3)]), _0x5e80c0;
+ if (_0x4b7b47[_0x12dc27(0x39f)](_0x44bf01[_0x12dc27(0x2df)])) {
+ let _0x259a20 = ![];
+ for (const _0x4410e4 of htmlVideoKeyMatch) {
+ if (_0x4410e4[_0x12dc27(0x36e)](_0x4b7b47)) {
+ _0x259a20 = !![];
+ break;
+ }
+ }
+ _0x259a20 && (_0xcd3790 = _0x5cb301);
+ }
+ }
+ if (_0x44bf01[_0x12dc27(0x2a3)](_0xcd3790, '')) {
+ const _0x425204 = {
+ 'parse': 0x0,
+ 'playUrl': '',
+ 'url': _0x2ef122
+ };
+ return JSON[_0x12dc27(0x3a2)](_0x425204);
+ }
+ return null;
+}
+function genPlayList(_0x2a68f0, _0x17eead, _0x2951b7, _0x47b9eb, _0x800257) {
+ const _0x1d5b05 = _0x24a000, _0x37e1eb = {
+ 'qFCgy': _0x1d5b05(0x288),
+ 'muyni': _0x1d5b05(0x2cf) + 'od',
+ 'VdBFp': _0x1d5b05(0x27c) + 'p',
+ 'fuavN': _0x1d5b05(0x25c),
+ 'nqoHH': _0x1d5b05(0x343),
+ 'TVfJB': function (_0x46f089, _0x2a240f) {
+ return _0x46f089 > _0x2a240f;
+ },
+ 'Xavsg': _0x1d5b05(0x2c8)
+ }, _0x15a66c = [], _0x182550 = [];
+ if (_0x2a68f0[_0x1d5b05(0x39f)](_0x37e1eb[_0x1d5b05(0x37c)]) || _0x2a68f0[_0x1d5b05(0x39f)](_0x37e1eb[_0x1d5b05(0x383)])) {
+ const _0x40de27 = _0x17eead[_0x1d5b05(0x394)] && _0x17eead[_0x1d5b05(0x394)][-0x635 + 0x50e * -0x4 + -0x8cf * -0x3] ? _0x17eead[_0x1d5b05(0x394)][0x2 * 0x901 + -0x2382 + 0x1180] : {};
+ _0x47b9eb[_0x1d5b05(0x3c3)] = _0x40de27[_0x1d5b05(0x3c3)] || _0x800257, _0x47b9eb[_0x1d5b05(0x2b8)] = _0x40de27[_0x1d5b05(0x2b8)] || '', _0x47b9eb[_0x1d5b05(0x290)] = _0x40de27[_0x1d5b05(0x290)] || '', _0x47b9eb[_0x1d5b05(0x37d)] = _0x40de27[_0x1d5b05(0x37d)] || '', _0x47b9eb[_0x1d5b05(0x32c)] = _0x40de27[_0x1d5b05(0x32c)] || '', _0x47b9eb[_0x1d5b05(0x228)] = _0x40de27[_0x1d5b05(0x228)] || '', _0x47b9eb[_0x1d5b05(0x346) + 's'] = _0x40de27[_0x1d5b05(0x346) + 's'] || '', _0x47b9eb[_0x1d5b05(0x23d)] = _0x40de27[_0x1d5b05(0x23d)] || '', _0x47b9eb[_0x1d5b05(0x2cd) + 'or'] = _0x40de27[_0x1d5b05(0x2cd) + 'or'] || '', _0x47b9eb[_0x1d5b05(0x227) + 't'] = _0x40de27[_0x1d5b05(0x227) + 't'] || '', _0x47b9eb[_0x1d5b05(0x34d) + _0x1d5b05(0x3bf)] = _0x40de27[_0x1d5b05(0x34d) + _0x1d5b05(0x3bf)] || '', _0x47b9eb[_0x1d5b05(0x3a0) + 'rl'] = _0x40de27[_0x1d5b05(0x3a0) + 'rl'] || '';
+ return;
+ }
+ if (_0x2a68f0[_0x1d5b05(0x39f)](_0x37e1eb[_0x1d5b05(0x3a8)]) || _0x2a68f0[_0x1d5b05(0x39f)](_0x37e1eb[_0x1d5b05(0x238)])) {
+ const _0x249ca8 = _0x17eead[_0x1d5b05(0x339)] || {};
+ _0x47b9eb[_0x1d5b05(0x3c3)] = _0x249ca8[_0x1d5b05(0x3c3)] || _0x800257, _0x47b9eb[_0x1d5b05(0x2b8)] = _0x249ca8[_0x1d5b05(0x2b8)] || '', _0x47b9eb[_0x1d5b05(0x290)] = _0x249ca8[_0x1d5b05(0x290)] || '', _0x47b9eb[_0x1d5b05(0x37d)] = _0x249ca8[_0x1d5b05(0x311)] || '', _0x47b9eb[_0x1d5b05(0x32c)] = _0x249ca8[_0x1d5b05(0x32c)] || '', _0x47b9eb[_0x1d5b05(0x228)] = _0x249ca8[_0x1d5b05(0x228)] || '', _0x47b9eb[_0x1d5b05(0x346) + 's'] = _0x249ca8[_0x1d5b05(0x346) + 's'] || '', _0x47b9eb[_0x1d5b05(0x23d)] = _0x249ca8[_0x1d5b05(0x23d)] || '', _0x47b9eb[_0x1d5b05(0x2cd) + 'or'] = _0x249ca8[_0x1d5b05(0x2cd) + 'or'] || '', _0x47b9eb[_0x1d5b05(0x227) + 't'] = _0x249ca8[_0x1d5b05(0x227) + 't'] || '';
+ if (_0x249ca8[_0x1d5b05(0x225) + _0x1d5b05(0x251)] && Array[_0x1d5b05(0x315)](_0x249ca8[_0x1d5b05(0x225) + _0x1d5b05(0x251)]))
+ for (const _0x39d1e3 of _0x249ca8[_0x1d5b05(0x225) + _0x1d5b05(0x251)]) {
+ let _0x2f80cc = _0x39d1e3[_0x1d5b05(0x330)]?.[_0x1d5b05(0x314)]() || _0x39d1e3[_0x1d5b05(0x214)]?.[_0x1d5b05(0x314)]() || '';
+ if (!_0x2f80cc)
+ continue;
+ _0x182550[_0x1d5b05(0x332)](_0x2f80cc), _0x15a66c[_0x1d5b05(0x332)](_0x39d1e3[_0x1d5b05(0x366)] || '');
+ if (_0x39d1e3[_0x1d5b05(0x20d)]) {
+ const _0x2ff516 = parseUrlMap[_0x1d5b05(0x24f)](_0x2f80cc) || [];
+ !_0x2ff516[_0x1d5b05(0x39f)](_0x39d1e3[_0x1d5b05(0x20d)]) && _0x2ff516[_0x1d5b05(0x332)](_0x39d1e3[_0x1d5b05(0x20d)]), parseUrlMap[_0x1d5b05(0x396)](_0x2f80cc, _0x2ff516);
+ }
+ }
+ } else {
+ if (_0x2a68f0[_0x1d5b05(0x39f)](_0x37e1eb[_0x1d5b05(0x222)])) {
+ const _0x37e2c6 = _0x17eead[_0x1d5b05(0x339)] || {};
+ _0x47b9eb[_0x1d5b05(0x3c3)] = _0x37e2c6[_0x1d5b05(0x3c3)] || _0x800257, _0x47b9eb[_0x1d5b05(0x2b8)] = _0x37e2c6[_0x1d5b05(0x2b8)] || '', _0x47b9eb[_0x1d5b05(0x290)] = _0x37e2c6[_0x1d5b05(0x290)] || '', _0x47b9eb[_0x1d5b05(0x37d)] = _0x37e2c6[_0x1d5b05(0x311)] || '', _0x47b9eb[_0x1d5b05(0x32c)] = _0x37e2c6[_0x1d5b05(0x32c)] || '', _0x47b9eb[_0x1d5b05(0x228)] = _0x37e2c6[_0x1d5b05(0x228)] || '', _0x47b9eb[_0x1d5b05(0x346) + 's'] = _0x37e2c6[_0x1d5b05(0x346) + 's'] || '', _0x47b9eb[_0x1d5b05(0x23d)] = _0x37e2c6[_0x1d5b05(0x23d)] || '', _0x47b9eb[_0x1d5b05(0x2cd) + 'or'] = _0x37e2c6[_0x1d5b05(0x2cd) + 'or'] || '', _0x47b9eb[_0x1d5b05(0x227) + 't'] = _0x37e2c6[_0x1d5b05(0x227) + 't'] || '';
+ if (_0x37e2c6[_0x1d5b05(0x2f7) + _0x1d5b05(0x3a1)] && Array[_0x1d5b05(0x315)](_0x37e2c6[_0x1d5b05(0x2f7) + _0x1d5b05(0x3a1)]))
+ for (const _0x1f9806 of _0x37e2c6[_0x1d5b05(0x2f7) + _0x1d5b05(0x3a1)]) {
+ let _0x292c57 = _0x1f9806[_0x1d5b05(0x377) + 'o']?.[_0x1d5b05(0x3cb)]?.[_0x1d5b05(0x314)]() || _0x1f9806[_0x1d5b05(0x377) + 'o']?.[_0x1d5b05(0x211)]?.[_0x1d5b05(0x314)]() || '';
+ if (!_0x292c57)
+ continue;
+ _0x182550[_0x1d5b05(0x332)](_0x292c57), _0x15a66c[_0x1d5b05(0x332)](_0x1f9806[_0x1d5b05(0x366)] || '');
+ try {
+ const _0x4a4bc9 = parseUrlMap[_0x1d5b05(0x24f)](_0x292c57) || [];
+ if (_0x1f9806[_0x1d5b05(0x377) + 'o']?.[_0x1d5b05(0x213)]) {
+ const _0x3dac95 = _0x1f9806[_0x1d5b05(0x377) + 'o'][_0x1d5b05(0x213)][_0x1d5b05(0x265)](',');
+ _0x3dac95[_0x1d5b05(0x1e6)](_0x4dc07e => {
+ const _0x404f67 = _0x1d5b05;
+ _0x4dc07e && !_0x4a4bc9[_0x404f67(0x39f)](_0x4dc07e) && _0x4a4bc9[_0x404f67(0x332)](_0x4dc07e);
+ });
+ }
+ if (_0x1f9806[_0x1d5b05(0x377) + 'o']?.[_0x1d5b05(0x32d)]) {
+ const _0x57c8f0 = _0x1f9806[_0x1d5b05(0x377) + 'o'][_0x1d5b05(0x32d)][_0x1d5b05(0x265)](',');
+ _0x57c8f0[_0x1d5b05(0x1e6)](_0x522ba3 => {
+ const _0x5f1935 = _0x1d5b05;
+ _0x522ba3 && !_0x4a4bc9[_0x5f1935(0x39f)](_0x522ba3) && _0x4a4bc9[_0x5f1935(0x332)](_0x522ba3);
+ });
+ }
+ parseUrlMap[_0x1d5b05(0x396)](_0x292c57, _0x4a4bc9);
+ } catch (_0x35c48f) {
+ SpiderDebug[_0x1d5b05(0x24a)](_0x35c48f);
+ }
+ }
+ } else {
+ if (urlPattern1[_0x1d5b05(0x36e)](_0x2a68f0)) {
+ const _0x6e5bc5 = _0x17eead[_0x1d5b05(0x394)] && _0x17eead[_0x1d5b05(0x394)][0x1448 + -0x19fc + -0x1 * -0x5b4] ? _0x17eead[_0x1d5b05(0x394)][-0x704 * -0x5 + 0x29 * -0xb5 + -0x617 * 0x1] : {};
+ _0x47b9eb[_0x1d5b05(0x3c3)] = _0x6e5bc5[_0x1d5b05(0x3c3)] || _0x800257, _0x47b9eb[_0x1d5b05(0x2b8)] = _0x6e5bc5[_0x1d5b05(0x2b8)] || '', _0x47b9eb[_0x1d5b05(0x290)] = _0x6e5bc5[_0x1d5b05(0x290)] || '', _0x47b9eb[_0x1d5b05(0x37d)] = _0x6e5bc5[_0x1d5b05(0x37d)] || '', _0x47b9eb[_0x1d5b05(0x32c)] = _0x6e5bc5[_0x1d5b05(0x32c)] || '', _0x47b9eb[_0x1d5b05(0x228)] = _0x6e5bc5[_0x1d5b05(0x228)] || '', _0x47b9eb[_0x1d5b05(0x346) + 's'] = _0x6e5bc5[_0x1d5b05(0x346) + 's'] || '', _0x47b9eb[_0x1d5b05(0x23d)] = _0x6e5bc5[_0x1d5b05(0x23d)] || '', _0x47b9eb[_0x1d5b05(0x2cd) + 'or'] = _0x6e5bc5[_0x1d5b05(0x2cd) + 'or'] || '', _0x47b9eb[_0x1d5b05(0x227) + 't'] = _0x6e5bc5[_0x1d5b05(0x227) + 't'] || '', _0x47b9eb[_0x1d5b05(0x34d) + _0x1d5b05(0x3bf)] = _0x6e5bc5[_0x1d5b05(0x34d) + _0x1d5b05(0x3bf)] || '', _0x47b9eb[_0x1d5b05(0x3a0) + 'rl'] = _0x6e5bc5[_0x1d5b05(0x3a0) + 'rl'] || '';
+ }
+ }
+ }
+ _0x37e1eb[_0x1d5b05(0x30d)](_0x182550[_0x1d5b05(0x2d3)], -0x417 * 0x9 + -0x2472 + 0x186b * 0x3) && _0x37e1eb[_0x1d5b05(0x30d)](_0x15a66c[_0x1d5b05(0x2d3)], -0x1bc * 0x15 + -0x26b8 + 0x4b24) && (_0x47b9eb[_0x1d5b05(0x34d) + _0x1d5b05(0x3bf)] = _0x182550[_0x1d5b05(0x365)](_0x37e1eb[_0x1d5b05(0x2be)]), _0x47b9eb[_0x1d5b05(0x3a0) + 'rl'] = _0x15a66c[_0x1d5b05(0x365)](_0x37e1eb[_0x1d5b05(0x2be)]));
+}
+function jsonParse(_0x2bcad8, _0x2e7bc8) {
+ const _0x4a9b6b = _0x24a000, _0x54fefc = {
+ 'glzca': _0x4a9b6b(0x339),
+ 'SXiUp': function (_0x5d899b, _0x8ff4ce) {
+ return _0x5d899b === _0x8ff4ce;
+ },
+ 'mqFNW': _0x4a9b6b(0x345),
+ 'hXQXU': _0x4a9b6b(0x366),
+ 'qaLZN': function (_0x304f89, _0x4f96a0) {
+ return _0x304f89 + _0x4f96a0;
+ },
+ 'SyFuQ': _0x4a9b6b(0x1fd),
+ 'wWTGM': _0x4a9b6b(0x292),
+ 'opiXu': function (_0x16486e, _0x45288d) {
+ return _0x16486e(_0x45288d);
+ },
+ 'GMucY': function (_0x55cf35, _0x5b1ec7, _0x56a7e3) {
+ return _0x55cf35(_0x5b1ec7, _0x56a7e3);
+ },
+ 'VVWwW': _0x4a9b6b(0x2e3),
+ 'zMWEf': _0x4a9b6b(0x310),
+ 'fuDvD': _0x4a9b6b(0x255),
+ 'AAtXX': _0x4a9b6b(0x39e),
+ 'Ojjqt': _0x4a9b6b(0x2cb),
+ 'rrjLd': _0x4a9b6b(0x261),
+ 'xjYPA': function (_0x138833, _0x134ff4) {
+ return _0x138833 > _0x134ff4;
+ },
+ 'UZCOD': _0x4a9b6b(0x2e4),
+ 'PeDZZ': _0x4a9b6b(0x287),
+ 'cCmOD': function (_0xe7c3fe, _0x6c71de) {
+ return _0xe7c3fe > _0x6c71de;
+ },
+ 'clYHp': function (_0x34da34, _0x278ac6) {
+ return _0x34da34 + _0x278ac6;
+ },
+ 'ZrFqI': function (_0x57a7fe, _0x1920c9, _0x45bdb2, _0x4ed88c) {
+ return _0x57a7fe(_0x1920c9, _0x45bdb2, _0x4ed88c);
+ }
+ };
+ try {
+ let _0x654842 = JSON[_0x4a9b6b(0x213)](_0x2e7bc8);
+ _0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x32f)]) && _0x54fefc[_0x4a9b6b(0x27d)](typeof _0x654842[_0x4a9b6b(0x339)], _0x54fefc[_0x4a9b6b(0x325)]) && !_0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x1e8)]) && (_0x654842 = _0x654842[_0x4a9b6b(0x339)]);
+ let _0x100c47 = _0x654842[_0x4a9b6b(0x366)];
+ _0x100c47[_0x4a9b6b(0x2c6)]('//') && (_0x100c47 = _0x54fefc[_0x4a9b6b(0x2eb)](_0x54fefc[_0x4a9b6b(0x245)], _0x100c47));
+ if (!_0x100c47[_0x4a9b6b(0x314)]()[_0x4a9b6b(0x2c6)](_0x54fefc[_0x4a9b6b(0x322)]))
+ return null;
+ if (_0x54fefc[_0x4a9b6b(0x27d)](_0x100c47, _0x2bcad8)) {
+ if (_0x54fefc[_0x4a9b6b(0x3b8)](isVip, _0x100c47) || !_0x54fefc[_0x4a9b6b(0x3b8)](isVideoFormat, _0x100c47))
+ return null;
+ }
+ if (_0x54fefc[_0x4a9b6b(0x22e)](isBlackVodUrl, _0x2bcad8, _0x100c47))
+ return null;
+ let _0xcda3cd = {};
+ if (_0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x224)]))
+ _0xcda3cd = _0x654842[_0x4a9b6b(0x2e3)];
+ else {
+ if (_0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x29e)]))
+ _0xcda3cd = _0x654842[_0x4a9b6b(0x310)];
+ else {
+ if (_0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x3ca)]))
+ _0xcda3cd = _0x654842[_0x4a9b6b(0x255)];
+ else
+ _0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x39a)]) && (_0xcda3cd = _0x654842[_0x4a9b6b(0x39e)]);
+ }
+ }
+ let _0x2e9070 = '';
+ if (_0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x3b9)]))
+ _0x2e9070 = _0x654842[_0x54fefc[_0x4a9b6b(0x3b9)]];
+ else
+ _0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x2a4)]) && (_0x2e9070 = _0x654842[_0x54fefc[_0x4a9b6b(0x2a4)]]);
+ _0x54fefc[_0x4a9b6b(0x25a)](_0x2e9070[_0x4a9b6b(0x314)]()[_0x4a9b6b(0x2d3)], -0x60f * 0x1 + 0x12 * -0x164 + 0x7 * 0x471) && (_0xcda3cd[_0x54fefc[_0x4a9b6b(0x2a4)]] = _0x54fefc[_0x4a9b6b(0x2eb)]('\x20', _0x2e9070));
+ let _0x530de6 = '';
+ if (_0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x297)]))
+ _0x530de6 = _0x654842[_0x4a9b6b(0x2e4)];
+ else
+ _0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x207)]) && (_0x530de6 = _0x654842[_0x4a9b6b(0x287)]);
+ _0x54fefc[_0x4a9b6b(0x281)](_0x530de6[_0x4a9b6b(0x314)]()[_0x4a9b6b(0x2d3)], 0x18ce + -0x22ae + 0x9e0) && (_0xcda3cd[_0x54fefc[_0x4a9b6b(0x207)]] = _0x54fefc[_0x4a9b6b(0x1f4)]('\x20', _0x530de6));
+ _0xcda3cd = _0x54fefc[_0x4a9b6b(0x243)](fixJsonVodHeader, _0xcda3cd, _0x2bcad8, _0x100c47);
+ const _0x27e9a5 = {
+ 'header': _0xcda3cd,
+ 'url': _0x100c47,
+ 'parse': '0'
+ };
+ return _0x27e9a5;
+ } catch (_0x174821) {
+ SpiderDebug[_0x4a9b6b(0x24a)](_0x174821);
+ }
+ return null;
+}
+function isVip(_0x12df4f) {
+ const _0x1cd01d = _0x24a000, _0x2ec382 = {
+ 'updKI': _0x1cd01d(0x2c9),
+ 'XOpkJ': _0x1cd01d(0x3a6),
+ 'iOaGQ': _0x1cd01d(0x306),
+ 'uIZrh': _0x1cd01d(0x2f6),
+ 'maOml': _0x1cd01d(0x21e),
+ 'kJixo': _0x1cd01d(0x2a6),
+ 'UgQzk': _0x1cd01d(0x31d),
+ 'zyeHF': _0x1cd01d(0x22c),
+ 'GPmSe': _0x1cd01d(0x282) + 'om',
+ 'HIEhJ': _0x1cd01d(0x318) + 'm',
+ 'SvZuD': _0x1cd01d(0x2fe),
+ 'SaoFF': function (_0x49391c, _0x475da1) {
+ return _0x49391c < _0x475da1;
+ },
+ 'dhhxf': function (_0x4f647c, _0x40da9b) {
+ return _0x4f647c === _0x40da9b;
+ },
+ 'SSpmn': _0x1cd01d(0x3c9) + 'a_',
+ 'SajNK': _0x1cd01d(0x3c9) + 'w_',
+ 'IKQGq': _0x1cd01d(0x3c9) + 'v_'
+ };
+ try {
+ let _0x59a0c5 = ![];
+ const _0x472579 = new URL(_0x12df4f)[_0x1cd01d(0x3b4)], _0x39662c = [
+ _0x2ec382[_0x1cd01d(0x21c)],
+ _0x2ec382[_0x1cd01d(0x385)],
+ _0x2ec382[_0x1cd01d(0x38b)],
+ _0x2ec382[_0x1cd01d(0x34b)],
+ _0x2ec382[_0x1cd01d(0x2c0)],
+ _0x2ec382[_0x1cd01d(0x1f8)],
+ _0x2ec382[_0x1cd01d(0x26c)],
+ _0x2ec382[_0x1cd01d(0x2c3)],
+ _0x2ec382[_0x1cd01d(0x3c7)],
+ _0x2ec382[_0x1cd01d(0x2dd)],
+ _0x2ec382[_0x1cd01d(0x391)]
+ ];
+ for (let _0x587e2f = 0x1168 * -0x1 + -0x2 * -0xffa + -0xe8c; _0x2ec382[_0x1cd01d(0x29f)](_0x587e2f, _0x39662c[_0x1cd01d(0x2d3)]); _0x587e2f++) {
+ if (_0x472579[_0x1cd01d(0x39f)](_0x39662c[_0x587e2f])) {
+ if (_0x2ec382[_0x1cd01d(0x358)](_0x39662c[_0x587e2f], _0x2ec382[_0x1cd01d(0x21c)])) {
+ if (_0x12df4f[_0x1cd01d(0x39f)](_0x2ec382[_0x1cd01d(0x267)]) || _0x12df4f[_0x1cd01d(0x39f)](_0x2ec382[_0x1cd01d(0x33a)]) || _0x12df4f[_0x1cd01d(0x39f)](_0x2ec382[_0x1cd01d(0x333)])) {
+ _0x59a0c5 = !![];
+ break;
+ }
+ } else {
+ _0x59a0c5 = !![];
+ break;
+ }
+ }
+ }
+ return _0x59a0c5;
+ } catch (_0x576cf8) {
+ SpiderDebug[_0x1cd01d(0x24a)](_0x576cf8);
+ }
+ return ![];
+}
+function isBlackVodUrl(_0x307605, _0x697c5d) {
+ const _0x4a2c61 = _0x24a000, _0x27d7bc = {
+ 'gudMv': _0x4a2c61(0x2ad),
+ 'FRrZt': _0x4a2c61(0x3be)
+ };
+ return _0x697c5d[_0x4a2c61(0x39f)](_0x27d7bc[_0x4a2c61(0x34c)]) || _0x697c5d[_0x4a2c61(0x39f)](_0x27d7bc[_0x4a2c61(0x210)]);
+}
+function fixJsonVodHeader(_0x194079, _0x3e179a, _0x56db4f) {
+ const _0x555e90 = _0x24a000, _0x3e9dd1 = {
+ 'GlESc': function (_0x2d4a85, _0x14b753) {
+ return _0x2d4a85 === _0x14b753;
+ },
+ 'dixTK': _0x555e90(0x2b1) + 'om',
+ 'owLGb': _0x555e90(0x287),
+ 'UKmVu': _0x555e90(0x261),
+ 'wLZlp': _0x555e90(0x1fe) + '.0',
+ 'yLRcH': _0x555e90(0x342),
+ 'hhBdZ': _0x555e90(0x2f4),
+ 'jIZRt': _0x555e90(0x2fb) + _0x555e90(0x2d6) + _0x555e90(0x22f),
+ 'AQtGT': function (_0x35b12f, _0x2200a0) {
+ return _0x35b12f + _0x2200a0;
+ },
+ 'tVGhB': _0x555e90(0x3b0) + _0x555e90(0x21d) + _0x555e90(0x2ae) + _0x555e90(0x26d) + _0x555e90(0x24e) + _0x555e90(0x37a) + _0x555e90(0x206) + _0x555e90(0x3c4) + _0x555e90(0x20e) + _0x555e90(0x360) + _0x555e90(0x38c) + _0x555e90(0x2e7)
+ };
+ _0x3e9dd1[_0x555e90(0x326)](_0x194079, null) && (_0x194079 = {});
+ if (_0x3e179a[_0x555e90(0x39f)](_0x3e9dd1[_0x555e90(0x260)]))
+ _0x194079[_0x3e9dd1[_0x555e90(0x1fc)]] = '\x20', _0x194079[_0x3e9dd1[_0x555e90(0x232)]] = _0x3e9dd1[_0x555e90(0x29b)];
+ else {
+ if (_0x56db4f[_0x555e90(0x39f)](_0x3e9dd1[_0x555e90(0x30b)]))
+ _0x194079[_0x3e9dd1[_0x555e90(0x1fc)]] = '\x20', _0x194079[_0x3e9dd1[_0x555e90(0x232)]] = _0x3e9dd1[_0x555e90(0x29b)];
+ else
+ _0x3e179a[_0x555e90(0x39f)](_0x3e9dd1[_0x555e90(0x27a)]) && (_0x194079[_0x3e9dd1[_0x555e90(0x1fc)]] = _0x3e9dd1[_0x555e90(0x209)], _0x194079[_0x3e9dd1[_0x555e90(0x232)]] = _0x3e9dd1[_0x555e90(0x335)]('\x20', _0x3e9dd1[_0x555e90(0x363)]));
+ }
+ return _0x194079;
+}
+const snifferMatch = /http((?!http).){26,}?\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg)\?.*|http((?!http).){26,}\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg)|http((?!http).){26,}\/m3u8\?pt=m3u8.*|http((?!http).)*?default\.ixigua\.com\/.*|http((?!http).)*?cdn-tos[^\?]*|http((?!http).)*?\/obj\/tos[^\?]*|http.*?\/player\/m3u8play\.php\?url=.*|http.*?\/player\/.*?[pP]lay\.php\?url=.*|http.*?\/playlist\/m3u8\/\?vid=.*|http.*?\.php\?type=m3u8&.*|http.*?\/download.aspx\?.*|http.*?\/api\/up_api.php\?.*|https.*?\.66yk\.cn.*|http((?!http).)*?netease\.com\/file\/.*/;
+function isVideoFormat(_0x5515b3) {
+ const _0xf7bf44 = _0x24a000, _0x2fce53 = {
+ 'HdgCs': _0xf7bf44(0x3b7),
+ 'iPFTd': _0xf7bf44(0x1ef)
+ };
+ if (snifferMatch[_0xf7bf44(0x36e)](_0x5515b3))
+ return !_0x5515b3[_0xf7bf44(0x39f)](_0x2fce53[_0xf7bf44(0x309)]) || !_0x5515b3[_0xf7bf44(0x39f)](_0x2fce53[_0xf7bf44(0x1ee)]);
+ return ![];
+}
+function isVideo(_0x507319) {
+ const _0x1fc38a = _0x24a000, _0x2030df = {
+ 'zjKSG': _0x1fc38a(0x350),
+ 'omoGP': _0x1fc38a(0x35c)
+ };
+ return !_0x507319[_0x1fc38a(0x39f)](_0x2030df[_0x1fc38a(0x357)]) && !_0x507319[_0x1fc38a(0x39f)](_0x2030df[_0x1fc38a(0x248)]);
+}
+function UA(_0x59c882) {
+ const _0x1c26ca = _0x24a000, _0x800c4e = {
+ 'KVRHH': _0x1c26ca(0x343),
+ 'FVRLu': _0x1c26ca(0x286) + '.0',
+ 'dZwJv': _0x1c26ca(0x3b0) + _0x1c26ca(0x21d) + _0x1c26ca(0x2ae) + _0x1c26ca(0x26d) + _0x1c26ca(0x24e) + _0x1c26ca(0x37a) + _0x1c26ca(0x206) + _0x1c26ca(0x3c4) + _0x1c26ca(0x20e) + _0x1c26ca(0x360) + _0x1c26ca(0x38c) + _0x1c26ca(0x2e7)
+ };
+ if (_0x59c882[_0x1c26ca(0x39f)](_0x800c4e[_0x1c26ca(0x289)]))
+ return _0x800c4e[_0x1c26ca(0x39c)];
+ return _0x800c4e[_0x1c26ca(0x305)];
+}
+function getCateUrl(_0x23db0c) {
+ const _0x49974e = _0x24a000, _0x37953d = {
+ 'ECjej': _0x49974e(0x27c) + 'p',
+ 'sFIgg': _0x49974e(0x25c),
+ 'TJcyc': function (_0xdc8f68, _0x11b1f5) {
+ return _0xdc8f68 + _0x11b1f5;
+ },
+ 'BxtWY': _0x49974e(0x2c4),
+ 'tMugk': _0x49974e(0x343),
+ 'YouNd': function (_0x4b91da, _0x11cfe1) {
+ return _0x4b91da + _0x11cfe1;
+ },
+ 'GRdgl': _0x49974e(0x367)
+ };
+ if (_0x23db0c[_0x49974e(0x39f)](_0x37953d[_0x49974e(0x2d0)]) || _0x23db0c[_0x49974e(0x39f)](_0x37953d[_0x49974e(0x29c)]))
+ return _0x37953d[_0x49974e(0x235)](_0x23db0c, _0x37953d[_0x49974e(0x33c)]);
+ else
+ return _0x23db0c[_0x49974e(0x39f)](_0x37953d[_0x49974e(0x32e)]) ? _0x37953d[_0x49974e(0x236)](_0x23db0c, _0x37953d[_0x49974e(0x381)]) : '';
+}
+function getPlayUrlPrefix(_0x5ee424) {
+ const _0x1bf8f8 = _0x24a000, _0x598264 = {
+ 'FSokj': _0x1bf8f8(0x27c) + 'p',
+ 'FPdLA': _0x1bf8f8(0x25c),
+ 'JQGUp': function (_0xdfc607, _0x448366) {
+ return _0xdfc607 + _0x448366;
+ },
+ 'ToKis': _0x1bf8f8(0x348) + _0x1bf8f8(0x2a7),
+ 'NaZIK': _0x1bf8f8(0x343),
+ 'hggTv': function (_0x4737db, _0x8a0e91) {
+ return _0x4737db + _0x8a0e91;
+ },
+ 'rcDwJ': _0x1bf8f8(0x30f) + _0x1bf8f8(0x22b)
+ };
+ if (_0x5ee424[_0x1bf8f8(0x39f)](_0x598264[_0x1bf8f8(0x323)]) || _0x5ee424[_0x1bf8f8(0x39f)](_0x598264[_0x1bf8f8(0x2a2)]))
+ return _0x598264[_0x1bf8f8(0x299)](_0x5ee424, _0x598264[_0x1bf8f8(0x3b5)]);
+ else
+ return _0x5ee424[_0x1bf8f8(0x39f)](_0x598264[_0x1bf8f8(0x21b)]) ? _0x598264[_0x1bf8f8(0x2de)](_0x5ee424, _0x598264[_0x1bf8f8(0x398)]) : '';
+}
+function getRecommendUrl(_0x80e8f1) {
+ const _0x43bed3 = _0x24a000, _0x5b36fd = {
+ 'TOllB': _0x43bed3(0x27c) + 'p',
+ 'PVTeb': _0x43bed3(0x25c),
+ 'zyflE': function (_0x5b4b9d, _0x36c3c2) {
+ return _0x5b4b9d + _0x36c3c2;
+ },
+ 'ijImY': _0x43bed3(0x268) + _0x43bed3(0x31b),
+ 'EfLao': _0x43bed3(0x343),
+ 'Sebfw': function (_0x1c1df5, _0x470f1b) {
+ return _0x1c1df5 + _0x470f1b;
+ },
+ 'SdUcg': _0x43bed3(0x291)
+ };
+ if (_0x80e8f1[_0x43bed3(0x39f)](_0x5b36fd[_0x43bed3(0x354)]) || _0x80e8f1[_0x43bed3(0x39f)](_0x5b36fd[_0x43bed3(0x2ca)]))
+ return _0x5b36fd[_0x43bed3(0x2b0)](_0x80e8f1, _0x5b36fd[_0x43bed3(0x336)]);
+ else
+ return _0x80e8f1[_0x43bed3(0x39f)](_0x5b36fd[_0x43bed3(0x23b)]) ? _0x5b36fd[_0x43bed3(0x3b1)](_0x80e8f1, _0x5b36fd[_0x43bed3(0x2b4)]) : '';
+}
+function _0x30bd() {
+ const _0x2b0aa4 = [
+ 'Rhngk',
+ '0\x20(Macinto',
+ 'nqoHH',
+ 'Udbgi',
+ 'VVWwW',
+ 'vod_url_wi',
+ 'comic+4K=m',
+ 'vod_conten',
+ 'vod_area',
+ 'bkKAx',
+ '分类+全部=+电影=',
+ 'd_id=',
+ 'acfun.cn',
+ '分类接口错误:',
+ 'GMucY',
+ 'i.com/',
+ '?ac=detail',
+ 'hQLKD',
+ 'UKmVu',
+ 'Uqurg',
+ '11bSKqkq',
+ 'TJcyc',
+ 'YouNd',
+ '&pg=1',
+ 'fuavN',
+ 'Zelfl',
+ '+2008+2007',
+ 'EfLao',
+ 'limit',
+ 'vod_actor',
+ 'XhjKd',
+ 'ist&t=',
+ 'gINFD',
+ '?ac=list&z',
+ '匪+犯罪+动画+奇幻',
+ 'ZrFqI',
+ 'sh;\x20Intel\x20',
+ 'SyFuQ',
+ '6057730KXKKrO',
+ 'nAAlp',
+ 'omoGP',
+ '+2024+2023',
+ 'log',
+ 'zlCKO',
+ '?type=',
+ '10ifJwJp',
+ ')\x20AppleWeb',
+ 'get',
+ '?wd=',
+ 'th_player',
+ 'nDVeB',
+ 'MJeua',
+ 'nFrDW',
+ 'headers',
+ 'area',
+ 'tvplay+综艺=',
+ 'state',
+ 'indexOf',
+ 'xjYPA',
+ 'lass=',
+ 'xgapp',
+ 'search?tex',
+ 'mWrNJ',
+ 'axNZh',
+ 'dixTK',
+ 'User-Agent',
+ 'eXwPu',
+ 'pg=#PN#',
+ 'ome/91.0.4',
+ 'split',
+ 'AdIkD',
+ 'SSpmn',
+ 'index_vide',
+ 'okhttp/3.1',
+ '+2016+2015',
+ '&page=#PN#',
+ 'UgQzk',
+ 'Win64;\x20x64',
+ 'RZVZb',
+ 'rAAqR',
+ 'FMcfW',
+ 'qhbab',
+ 'qvaVO',
+ 'fBrnR',
+ 'ts+评分=scor',
+ 'vqyhb',
+ 'uUBbz',
+ 'SKgeb',
+ 'tvshow+动漫=',
+ 'FEuLQ',
+ 'hhBdZ',
+ 'lang',
+ 'api.php/ap',
+ 'SXiUp',
+ 'rQSdz',
+ 'OdHdL',
+ 'bkfnv',
+ 'cCmOD',
+ 'bilibili.c',
+ 'uzruO',
+ '+2006+2005',
+ 'AEWJN',
+ 'okhttp/4.1',
+ 'Referer',
+ '/vod',
+ 'KVRHH',
+ '大+其他\x0a筛选yea',
+ 'fcPwA',
+ 'gHEas',
+ 'rfYvZ',
+ 'ist&wd=',
+ 'KqkGD',
+ 'vod_pic',
+ '/vodPhbAll',
+ 'http',
+ 'UlRrv',
+ 'PPjsc',
+ '9IUFsEu',
+ '+2012+2011',
+ 'UZCOD',
+ 'xVjfI',
+ 'JQGUp',
+ 'WodPN',
+ 'wLZlp',
+ 'sFIgg',
+ '+大陆+香港+台湾+',
+ 'zMWEf',
+ 'SaoFF',
+ 'qrmQn',
+ 'Qzbyi',
+ 'FPdLA',
+ 'emPiw',
+ 'rrjLd',
+ 'QIbLN',
+ 'mgtv.com',
+ 'il?id=',
+ 'ovie_4k+体育',
+ 'HHuLq',
+ '+农村+惊悚+惊悚+',
+ '=tiyu\x0a筛选cl',
+ 'vod_list',
+ '973973.xyz',
+ '\x20NT\x2010.0;\x20',
+ '=1&area=&t',
+ 'zyflE',
+ 'www.mgtv.c',
+ '+2000',
+ 'IWfGL',
+ 'SdUcg',
+ '科幻+剧情+战争+警',
+ 'umjti',
+ '+2018+2017',
+ 'vod_name',
+ 'eCaVc',
+ 'nvSRb',
+ 'fkHDy',
+ 'raJIH',
+ '&pg=',
+ 'Xavsg',
+ 'xaxYD',
+ 'maOml',
+ 'cchWu',
+ 'class&star',
+ 'zyeHF',
+ 'nav?token=',
+ 'wovvt',
+ 'startsWith',
+ 'VeDky',
+ '$$$',
+ 'iqiyi.com',
+ 'PVTeb',
+ 'user-agent',
+ 'lpEGG',
+ 'vod_direct',
+ 'pagecount',
+ '/provide/v',
+ 'ECjej',
+ 'https://ji',
+ 'OIKvw',
+ 'length',
+ 'vlist',
+ 'fari/537.3',
+ 'ww.bilibil',
+ 'ea&type=筛选',
+ 'Mac\x20OS\x20X\x201',
+ 'QDURc',
+ '伦理+情色+福利+三',
+ 'y=c87681c9',
+ '筛选area&lan',
+ 'HIEhJ',
+ 'hggTv',
+ 'oRses',
+ '+爱情+恐怖+动作+',
+ '2.11',
+ 'jIVVu',
+ 'header',
+ 'referer',
+ 'replace',
+ 'video?tid=',
+ '37.36',
+ 'YTcha',
+ 'type_exten',
+ '筛选area+全部=',
+ 'qaLZN',
+ '3d5e430cac',
+ 'znjdK',
+ 'bfaLF',
+ 'IKCWR',
+ 'g=筛选lang&y',
+ 'QZvys',
+ 'erty',
+ 'fIzpG',
+ 'bilibili',
+ '4oTuTQS',
+ 'le.com',
+ 'vod_play_l',
+ 'zMZmQ',
+ 'class',
+ '472.114\x20Sa',
+ '\x20https://w',
+ 'it=18&page',
+ 'PzBoQ',
+ 'pptv.com',
+ 'JpyoV',
+ 'GGHOc',
+ 'OvREh',
+ 'AsjQf',
+ 'UwOqb',
+ '1aa5&url=',
+ 'dZwJv',
+ 'youku.com',
+ 'ofHAn',
+ 'ulXQF',
+ 'HdgCs',
+ 'HUsMa',
+ 'yLRcH',
+ 'XjiyL',
+ 'TVfJB',
+ 'zFyTh',
+ '/detail?vo',
+ 'Header',
+ 'vod_class',
+ '+2010+2009',
+ 'IFEDw',
+ 'trim',
+ 'isArray',
+ 'eXDqH',
+ 'TmtUN',
+ 'baofeng.co',
+ 'KRVeJ',
+ '537.36\x20(KH',
+ 'o?token=',
+ 'IpeiC',
+ 'sohu.com',
+ 'wpdZs',
+ '+2014+2013',
+ 'rDTqC',
+ 'WNSZb',
+ 'wWTGM',
+ 'FSokj',
+ '?ac=videol',
+ 'mqFNW',
+ 'GlESc',
+ 'EsiSO',
+ 'fUjyK',
+ '+2002+2001',
+ 'ghVBe',
+ 'mEBLG',
+ 'vod_year',
+ 'parse2',
+ 'tMugk',
+ 'glzca',
+ 'code',
+ '+2022+2021',
+ 'push',
+ 'IKQGq',
+ 'ViinS',
+ 'AQtGT',
+ 'ijImY',
+ 'host',
+ 'ext',
+ 'data',
+ 'SajNK',
+ 'MAPTF',
+ 'BxtWY',
+ 'floor',
+ 'xIeyb',
+ 'fmHZd',
+ 'ear=筛选year',
+ 'exi.jdyx.p',
+ 'titan.mgtv',
+ '.vod',
+ 'hPgPi',
+ 'object',
+ 'vod_remark',
+ 'MWcjN',
+ 'video_deta',
+ 'ro/api/?ke',
+ '11069064LnYXCB',
+ 'uIZrh',
+ 'gudMv',
+ 'vod_play_f',
+ 'VoCNI',
+ '美国+英国+法国+日',
+ '.mp4',
+ 'stype',
+ ' {
+ const _0x53867c = _0x4dd129, _0x8beb43 = {
+ 'TSUgZ': function (_0x52410f, _0x64397c) {
+ const _0x2a0b08 = _0x3bf3;
+ return _0x1bb544[_0x2a0b08(0x275)](_0x52410f, _0x64397c);
+ },
+ 'FMcfW': _0x1bb544[_0x53867c(0x303)],
+ 'OvREh': function (_0x17e635, _0x1e79bc) {
+ const _0x2b8dff = _0x53867c;
+ return _0x1bb544[_0x2b8dff(0x3aa)](_0x17e635, _0x1e79bc);
+ },
+ 'RZVZb': function (_0x2aff9c, _0x16add9, _0x39fb37, _0x56dec0) {
+ const _0x399614 = _0x53867c;
+ return _0x1bb544[_0x399614(0x380)](_0x2aff9c, _0x16add9, _0x39fb37, _0x56dec0);
+ }
+ };
+ try {
+ const _0x5b9b85 = _0x2c154b[_0x4410f9];
+ _0x1bb544[_0x53867c(0x20f)](_0x4410f9, _0x4dc412) && Array[_0x53867c(0x315)](_0x5b9b85) && _0xe7aee[_0x53867c(0x332)](_0x5b9b85), _0x1bb544[_0x53867c(0x20f)](typeof _0x5b9b85, _0x1bb544[_0x53867c(0x303)]) && _0x1bb544[_0x53867c(0x1f0)](_0x5b9b85, null) && (Array[_0x53867c(0x315)](_0x5b9b85) ? _0x5b9b85[_0x53867c(0x1e6)](_0xce021c => {
+ const _0x7a8860 = _0x53867c;
+ _0x8beb43[_0x7a8860(0x3bc)](typeof _0xce021c, _0x8beb43[_0x7a8860(0x270)]) && _0x8beb43[_0x7a8860(0x301)](_0xce021c, null) && _0x8beb43[_0x7a8860(0x26e)](findJsonArray, _0xce021c, _0x4dc412, _0xe7aee);
+ }) : _0x1bb544[_0x53867c(0x380)](findJsonArray, _0x5b9b85, _0x4dc412, _0xe7aee));
+ } catch (_0x161cd2) {
+ SpiderDebug[_0x53867c(0x24a)](_0x161cd2);
+ }
+ });
+}
+function jsonArr2Str(_0x2ac5a3) {
+ const _0x171e1b = _0x24a000, _0x3f6d96 = {
+ 'IFEDw': function (_0x584b3a, _0x1079df) {
+ return _0x584b3a < _0x1079df;
+ }
+ }, _0x36becd = [];
+ for (let _0x29367c = -0x1 * -0x1987 + 0x1 * -0x1323 + -0x664; _0x3f6d96[_0x171e1b(0x313)](_0x29367c, _0x2ac5a3[_0x171e1b(0x2d3)]); _0x29367c++) {
+ try {
+ _0x36becd[_0x171e1b(0x332)](_0x2ac5a3[_0x29367c]);
+ } catch (_0x3e4b7e) {
+ SpiderDebug[_0x171e1b(0x24a)](_0x3e4b7e);
+ }
+ }
+ return _0x36becd[_0x171e1b(0x365)](',');
+}
+function getHeaders(_0x2dbbbb) {
+ const _0x690d7 = _0x24a000, _0x11947b = {
+ 'OdHdL': _0x690d7(0x261),
+ 'VeDky': function (_0x4325bb, _0x1c5140) {
+ return _0x4325bb(_0x1c5140);
+ }
+ }, _0x24e5fe = {};
+ return _0x24e5fe[_0x11947b[_0x690d7(0x27f)]] = _0x11947b[_0x690d7(0x2c7)](UA, _0x2dbbbb), _0x24e5fe;
+}
+function isJsonString(_0x52901c) {
+ const _0x44dab5 = _0x24a000;
+ try {
+ JSON[_0x44dab5(0x213)](_0x52901c);
+ } catch (_0x568d34) {
+ return ![];
+ }
+ return !![];
+}
+export function __jsEvalReturn() {
+ return {
+ 'init': init,
+ 'home': home,
+ 'homeVod': homeVod,
+ 'category': category,
+ 'detail': detail,
+ 'play': play,
+ 'search': search
+ };
+}
\ No newline at end of file
diff --git a/jaychouqq/yingshi/js7/jhdj.js b/jaychouqq/yingshi/js7/jhdj.js
new file mode 100644
index 00000000..0ad0959d
--- /dev/null
+++ b/jaychouqq/yingshi/js7/jhdj.js
@@ -0,0 +1,1669 @@
+/*
+@header({
+ searchable: 1,
+ filterable: 1,
+ quickSearch: 1,
+ title: '聚合短剧',
+ lang: 'cat'
+})
+*/
+
+import { Crypto as CryptoJS } from 'assets://js/lib/cat.js';
+
+let debug = 1;
+let siteName = '聚合短剧';
+let xingya_headers = {};
+let niuniu_headers = {};
+let niuniu_token = '';
+let niuniu_access_token = '';
+let hema_headers = {};
+
+// 搜索缓存
+const searchCache = new Map();
+const CACHE_TTL = 5 * 60 * 1000;
+
+// 分类排除规则
+const cate_remove = ['分类排除', '软鸭', '碎片', '锦鲤', '番茄', '甜圈'];
+const UA = "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36";
+
+const aggConfig = {
+ keys: 'd3dGiJc651gSQ8w1',
+ searchLimit: 20,
+ searchTimeout: 8000,
+ charMap: {
+ '+': 'P', '/': 'X', '0': 'M', '1': 'U', '2': 'l', '3': 'E', '4': 'r', '5': 'Y', '6': 'W', '7': 'b', '8': 'd', '9': 'J',
+ 'A': '9', 'B': 's', 'C': 'a', 'D': 'I', 'E': '0', 'F': 'o', 'G': 'y', 'H': '_', 'I': 'H', 'J': 'G', 'K': 'i', 'L': 't',
+ 'M': 'g', 'N': 'N', 'O': 'A', 'P': '8', 'Q': 'F', 'R': 'k', 'S': '3', 'T': 'h', 'U': 'f', 'V': 'R', 'W': 'q', 'X': 'C',
+ 'Y': '4', 'Z': 'p', 'a': 'm', 'b': 'B', 'c': 'O', 'd': 'u', 'e': 'c', 'f': '6', 'g': 'K', 'h': 'x', 'i': '5', 'j': 'T',
+ 'k': '-', 'l': '2', 'm': 'z', 'n': 'S', 'o': 'Z', 'p': '1', 'q': 'V', 'r': 'v', 's': 'j', 't': 'Q', 'u': '7', 'v': 'D',
+ 'w': 'w', 'x': 'n', 'y': 'L', 'z': 'e'
+ },
+ headers: {
+ json: { 'User-Agent': 'okhttp/4.10.0', 'Content-Type': 'application/json' },
+ form: { 'User-Agent': 'okhttp/4.10.0', 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8' },
+ niuniu: { 'Cache-Control': 'no-cache', 'Content-Type': 'application/json;charset=UTF-8', 'User-Agent': 'okhttp/4.12.0' },
+ baidu: { 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': UA },
+ hema: {
+ 'datas': 'e5f22c6e2c82fe001738cb9ce4696eab0556d064a55aef402e0fbe6b29a083f6538e4567de38e67de2071a49d9751526bfba45314e1fd4702b11c76ab9a3b5f873262854ba66e6715ed51364dbc6ee62c7180e047fcbcdbfd49874fc8f28674b16d90ca71a02de76c70598e0b75e647c37c2c19287e49be5f2a259d727dfc4df3d28802388bf3c356576b342e17e30a2ab74859263dba4d1c8eba79990d22d60d60927fdacb2addf2f0eaadd8887585ca2eb87f603faf0c207dda18cf67dc25b2199d303baff9e6605b3314a7d2631f62864f48619daceb9452f2b7b0667773553741856df030cca68af3c57810f983d452bb428ef5fc32206aef4865ae06c629bee7f5135547304acc7ef4e7c6df887308f2e79c493fd2ee03488722861b5bb51b09cb8911dfc92c288d94e601c066d2f9d612ad2c8d4eeb4920b1d44aff3e13fd75229b857f64925df1cf12f75a00d438c422ec1726462b915903f1dd1f4bb7cdf82cc15a6d507f80c789903e710f39a62aef073f3f93a6c681e75d295428aa290d7e98f82e7e9ad6e2b23d9086dfe8c63c5d8550b13fd61a77291473a8bdd43c7c2639f264be69d9d07f0585de4342a399275a64e7d1d4400b8ed4421a2f289f622e40cdd1cfc916a0b9ce747c924ac33e32d24b91ed5d64772d6ad6896412f52724006eabf12aaecfd6e81dad432c7b3800bbf793a1c375e3e7b4fb3b097724b5fc88a8c9bcf3dbc10cbdb252965',
+ 'Content-Type': 'text/plain'
+ },
+ haokan: {
+ 'User-Agent': UA,
+ 'Talos-Module-Name': 'shortDrama',
+ 'Talos-Module-Version': '1.0.71.1',
+ 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8',
+ 'Cookie': 'BAIDUCUID=giHCu0azv80G8SfQ0avU8gaaH8jfiv86ju2MugiR2i8-k3a35avAa1_mA'
+ }
+ }
+};
+
+// ==================== URL配置 ====================
+const rule = {
+ 百度: {
+ host: 'https://mbd.baidu.com',
+ detailHost: 'https://sv.baidu.com',
+ list: '/feedapi/v1/videoserver/playlets/list?service=bdbox',
+ search: '/feedapi/v1/videoserver/playlets/search?service=bdbox',
+ detail: '/haokan/ui-video/playlet/rec/detail?log=vhk&tn=1020970b&ctn=1008350n&blur=1',
+ play: '/appui/api?cmd=video/relate&log=vhk&tn=1020970b&ctn=1008350n&blur=1'
+ },
+ 七猫: {
+ host: 'https://api-store.qmplaylet.com',
+ list: '/api/v1/playlet/index',
+ detail: 'https://api-read.qmplaylet.com/player/api/v1/playlet/info',
+ search: '/api/v1/playlet/search'
+ },
+ 星芽: {
+ host: 'https://app.whjzjx.cn',
+ list: '/cloud/v2/theater/home_page?theater_class_id',
+ detail: '/v2/theater_parent/detail',
+ search: '/v3/search',
+ login: 'https://u.shytkjgs.com/user/v1/account/login'
+ },
+ 西饭: {
+ host: 'https://xifan-api-cn.youlishipin.com',
+ list: '/xifan/drama/portalPage',
+ detail: '/xifan/drama/getDuanjuInfo',
+ search: '/xifan/search/getSearchList'
+ },
+ 牛牛: {
+ host: 'https://new.tianjinzhitongdaohe.com',
+ list: '/api/v1/app/screen/screenMovie',
+ detail: '/api/v1/app/play/movieDetails',
+ search: '/api/v1/app/search/searchMovie',
+ desc: '/api/v1/app/play/movieDesc',
+ visitor: '/api/v1/app/user/visitorInfo',
+ login: 'https://csj-sp.csjdeveloper.com/csj_sp/api/v1/user/login?siteid=5627189',
+ detail2: 'https://csj-sp.csjdeveloper.com/csj_sp/api/v1/shortplay/detail?siteid=5627189',
+ unlock: 'https://csj-sp.csjdeveloper.com/csj_sp/api/v1/pay/ad_unlock?siteid=5627189'
+ },
+ 围观: {
+ host: 'https://api.drama.9ddm.com',
+ list: '/drama/home/shortVideoTags?version_code=1500&os_type=1',
+ detail: '/drama/home/shortVideoDetail?version_code=1500&os_type=1',
+ search: '/drama/home/search?version_code=1500&os_type=1'
+ },
+ 河马: {
+ host: 'https://freevideo.zqqds.cn',
+ list: '/free-video-portal/portal/1121',
+ detail: '/free-video-portal/portal/1131',
+ episode: '/free-video-portal/portal/1132',
+ play: '/free-video-portal/portal/1133',
+ search: '/free-video-portal/portal/1803'
+ },
+ 星星: {
+ host: 'http://read.api.duodutek.com',
+ list: '/novel-api/app/pageModel/getResourceById',
+ detail: '/novel-api/basedata/book/getChapterList'
+ },
+ 好看: {
+ host: 'https://sv.baidu.com',
+ list: '/haokan/ui-feed/playletTagsFeed?osbranch=a0',
+ home: '/haokan/ui-feed/playletShelfFeed?osbranch=a0',
+ detail_list: '/appui/api?osbranch=a0',
+ detail: '/haokan/ui-video/playlet/rec/detail?osbranch=a0',
+ play: '/appui/api?osbranch=a0',
+ search: '/haokan/ui-interact/playlet/search/sugs?osbranch=a0'
+ }
+};
+
+const platformList = [
+ { name: '百度短剧', id: '百度' },
+ { name: '七猫短剧', id: '七猫' },
+ { name: '星芽短剧', id: '星芽' },
+ { name: '西饭短剧', id: '西饭' },
+ { name: '牛牛短剧', id: '牛牛' },
+ { name: '围观短剧', id: '围观' },
+ { name: '河马短剧', id: '河马' },
+ { name: '星星短剧', id: '星星' },
+ { name: '好看短剧', id: '好看' }
+];
+
+const ruleFilterDef = {
+ 百度: { area: '新剧' },
+ 七猫: { area: '0' },
+ 星芽: { area: '1' },
+ 西饭: { area: '68@都市' },
+ 牛牛: { area: '现言' },
+ 围观: { area: '' },
+ 河马: { area: '308' },
+ 星星: { area: '1287' },
+ 好看: { area: '1' }
+};
+
+// ==================== 筛选配置 ====================
+const filterOptions = {
+ "七猫": [{
+ "key": "area",
+ "name": "分类",
+ "value": [
+ { "n": "全部", "v": "" },
+ { "n": "推荐", "v": "0" },
+ { "n": "新剧", "v": "-1" },
+ { "n": "都市情感", "v": "1273" },
+ { "n": "古装", "v": "1272" },
+ { "n": "都市", "v": "571" },
+ { "n": "玄幻仙侠", "v": "1286" },
+ { "n": "奇幻", "v": "570" },
+ { "n": "乡村", "v": "590" },
+ { "n": "民国", "v": "573" },
+ { "n": "年代", "v": "572" },
+ { "n": "青春校园", "v": "1288" },
+ { "n": "武侠", "v": "371" },
+ { "n": "科幻", "v": "594" },
+ { "n": "末世", "v": "556" },
+ { "n": "二次元", "v": "1289" },
+ { "n": "逆袭", "v": "400" },
+ { "n": "穿越", "v": "373" },
+ { "n": "复仇", "v": "795" },
+ { "n": "系统", "v": "787" },
+ { "n": "权谋", "v": "790" },
+ { "n": "重生", "v": "784" },
+ { "n": "女性成长", "v": "1294" },
+ { "n": "打脸虐渣", "v": "716" },
+ { "n": "闪婚", "v": "480" },
+ { "n": "强者回归", "v": "402" },
+ { "n": "追妻火葬场", "v": "715" },
+ { "n": "家庭", "v": "670" },
+ { "n": "马甲", "v": "558" },
+ { "n": "职场", "v": "724" },
+ { "n": "宫斗", "v": "343" },
+ { "n": "高手下山", "v": "1299" },
+ { "n": "娱乐明星", "v": "1295" },
+ { "n": "异能", "v": "727" },
+ { "n": "宅斗", "v": "342" },
+ { "n": "替身", "v": "712" },
+ { "n": "穿书", "v": "338" },
+ { "n": "商战", "v": "723" },
+ { "n": "种田经商", "v": "1291" },
+ { "n": "伦理", "v": "1293" },
+ { "n": "社会话题", "v": "1290" },
+ { "n": "致富", "v": "492" },
+ { "n": "偷听心声", "v": "1258" },
+ { "n": "脑洞", "v": "526" },
+ { "n": "豪门总裁", "v": "624" },
+ { "n": "萌宝", "v": "356" },
+ { "n": "战神", "v": "527" },
+ { "n": "真假千金", "v": "812" },
+ { "n": "赘婿", "v": "36" },
+ { "n": "神医", "v": "1269" },
+ { "n": "神豪", "v": "37" },
+ { "n": "小人物", "v": "1296" },
+ { "n": "团宠", "v": "545" },
+ { "n": "欢喜冤家", "v": "464" },
+ { "n": "女帝", "v": "617" },
+ { "n": "银发", "v": "1297" },
+ { "n": "兵王", "v": "28" },
+ { "n": "虐恋", "v": "16" },
+ { "n": "甜宠", "v": "21" },
+ { "n": "悬疑", "v": "27" },
+ { "n": "搞笑", "v": "793" },
+ { "n": "灵异", "v": "1287" }
+ ]
+ }],
+ "牛牛": [{
+ "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": "古装" },
+ { "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": "二次元" },
+ { "n": "未来", "v": "未来" },
+ { "n": "快速穿越", "v": "快速穿越" },
+ { "n": "烧脑", "v": "烧脑" },
+ { "n": "治愈", "v": "治愈" },
+ { "n": "其他剧情", "v": "其他剧情" }
+ ]
+ }],
+ "百度": [{
+ "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": "总裁" },
+ { "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": "赘婿" },
+ { "n": "单元剧", "v": "单元剧" },
+ { "n": "青春校园", "v": "青春校园" },
+ { "n": "历史架空", "v": "历史架空" },
+ { "n": "王妃", "v": "王妃" },
+ { "n": "鉴宝", "v": "鉴宝" },
+ { "n": "科幻", "v": "科幻" },
+ { "n": "军旅战争", "v": "军旅战争" },
+ { "n": "种田", "v": "种田" }
+ ]
+ }],
+ "围观": [{
+ "key": "area",
+ "name": "分类",
+ "value": [{ "n": "全部", "v": "" }]
+ }],
+ "星芽": [{
+ "key": "area",
+ "name": "分类",
+ "value": [
+ { "n": "剧场", "v": "1" },
+ { "n": "热播剧", "v": "2" },
+ { "n": "会员专享", "v": "8" },
+ { "n": "星选好剧", "v": "7" },
+ { "n": "新剧", "v": "3" },
+ { "n": "阳光剧场", "v": "5" }
+ ]
+ }],
+ "西饭": [{
+ "key": "area",
+ "name": "分类",
+ "value": [
+ { "n": "都市", "v": "68@都市" },
+ { "n": "青春", "v": "68@青春" },
+ { "n": "现代言情", "v": "81@现代言情" },
+ { "n": "豪门", "v": "81@豪门" },
+ { "n": "大女主", "v": "80@大女主" },
+ { "n": "逆袭", "v": "79@逆袭" },
+ { "n": "打脸虐渣", "v": "79@打脸虐渣" },
+ { "n": "穿越", "v": "81@穿越" }
+ ]
+ }],
+ "河马": [{
+ "key": "area",
+ "name": "分类",
+ "value": [
+ { "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" },
+ { "n": "传承觉醒", "v": "321" },
+ { "n": "神豪", "v": "322" },
+ { "n": "民国", "v": "323" }
+ ]
+ }],
+ "星星": [{
+ "key": "area",
+ "name": "分类",
+ "value": [
+ { "n": "甜宠", "v": "1287" },
+ { "n": "逆袭", "v": "1288" },
+ { "n": "热血", "v": "1289" },
+ { "n": "现代", "v": "1290" },
+ { "n": "古代", "v": "1291" }
+ ]
+ }],
+ "好看": [{
+ "key": "area",
+ "name": "分类",
+ "value": [
+ { "n": "热播剧", "v": "1" },
+ { "n": "新剧", "v": "2" },
+ { "n": "战神", "v": "1001" },
+ { "n": "神豪", "v": "2001" },
+ { "n": "神医", "v": "1002" },
+ { "n": "甜宠", "v": "1007" },
+ { "n": "赘婿", "v": "1003" },
+ { "n": "穿越重生", "v": "2004" },
+ { "n": "异能", "v": "2005" },
+ { "n": "虐恋", "v": "1006" },
+ { "n": "宫斗宅斗", "v": "2006" },
+ { "n": "玄幻", "v": "2009" }
+ ]
+ }]
+};
+
+// 河马分类标签映射
+const hemaTagIds = {
+ "308": "", "309": "", "310": "417,473,474,464", "311": "462,466", "312": "476",
+ "313": "585,616", "314": "444,468", "315": "417,439,464,465", "316": "589",
+ "317": "416,439,463,465", "318": "438", "319": "417,474,464", "320": "439,442,443,445,465,470",
+ "321": "417,473,474,464", "322": "472,475,585", "323": "590"
+};
+
+// 西饭搜索固定session参数
+const XIFAN_SESSION_PARAMS = 'session=eyJpbmZvIjp7InVpZCI6IiIsInJ0IjoiMTc0MDY2ODk4NiIsInVuIjoiT1BHX2U5ODQ4NTgzZmM4ZjQzZTJhZjc5ZTcxNjRmZTE5Y2JjIiwiZnQiOiIxNzQwNjY4OTg2In19&feedssession=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1dHlwIjowLCJidWlkIjoxNjM0MDU3ODE4OTgxNDk5OTA0LCJhdWQiOiJkcmFtYSIsInZlciI6MiwicmF0IjoxNzQwNjY4OTg2LCJ1bm0iOiJPUEdfZTk4NDg1ODNmYzhmNDNlMmFmNzllNzE2NGZlMTljYmMiLCJpZCI6ImVhZGE1NmEyZWEzYTE0YmMwMzE3ZDc2ZmVjODJjNzc3IiwiZXhwIjoxNzQxMjczNzg2LCJkYyI6ImJqaHQifQ.IwuI0gK077RF4G10JRxgxx4GCG502vR8Z0W9EV4kd-c';
+
+// ==================== 日志函数 ====================
+function log(level, tag, msg) {
+ if (!debug) return;
+ const prefix = { 0: '🔍', 1: '✅', 2: '⚠️', 3: '❌' }[level] || '📝';
+ console.log(`${prefix}【${tag}】 ${msg}`);
+}
+
+function logTime(start, label) {
+ if (!debug) return;
+ console.log(`⏱️【${label}】耗时: ${Date.now() - start}ms`);
+}
+
+// ==================== 七猫公共函数 ====================
+async function getQmParamsAndSign() {
+ let sessionId = Math.floor(Date.now()).toString();
+ let data = {
+ "static_score": "0.8",
+ "uuid": "00000000-7fc7-08dc-0000-000000000000",
+ "device-id": "20250220125449b9b8cac84c2dd3d035c9052a2572f7dd0122edde3cc42a70",
+ "mac": "",
+ "sourceuid": "aa7de295aad621a6",
+ "refresh-type": "0",
+ "model": "22021211RC",
+ "wlb-imei": "",
+ "client-id": "aa7de295aad621a6",
+ "brand": "Redmi",
+ "oaid": "",
+ "oaid-no-cache": "",
+ "sys-ver": "12",
+ "trusted-id": "",
+ "phone-level": "H",
+ "imei": "",
+ "wlb-uid": "aa7de295aad621a6",
+ "session-id": sessionId
+ };
+ let jsonStr = JSON.stringify(data);
+ let base64Str = base64Encode(jsonStr).replace(/[\r\n\s]/g, '');
+ let qmParams = '';
+ for (let c of base64Str) qmParams += aggConfig.charMap[c] || c;
+ let paramsStr = `AUTHORIZATION=app-version=10001application-id=com.duoduo.readchannel=unknownis-white=net-env=5platform=androidqm-params=${qmParams}reg=${aggConfig.keys}`;
+ let sign = await md5(paramsStr);
+ log(0, '七猫', `qmParams生成成功`);
+ return { qmParams, sign };
+}
+
+async function getQiMaoHeaders() {
+ let { qmParams, sign } = await getQmParamsAndSign();
+ return {
+ 'net-env': '5', 'reg': '', 'channel': 'unknown', 'is-white': '',
+ 'platform': 'android', 'application-id': 'com.duoduo.read', 'AUTHORIZATION': '',
+ 'app-version': '10001', 'user-agent': 'okhttp/4.10.0',
+ 'qm-params': qmParams, 'sign': sign, 'Content-Type': 'application/json'
+ };
+}
+
+// ==================== 缓存管理 ====================
+const loginCache = new Map();
+const LOGIN_CACHE_TTL = 24 * 60 * 60 * 1000;
+
+function generateDeviceId() {
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
+ let r = Math.random() * 16 | 0;
+ let v = c === 'x' ? r : (r & 0x3 | 0x8);
+ return v.toString(16);
+ });
+}
+
+function getSearchCache(key) {
+ const cached = searchCache.get(key);
+ if (cached && Date.now() - cached.time < CACHE_TTL) {
+ log(0, '缓存', `命中: ${key}`);
+ return cached.data;
+ }
+ return null;
+}
+
+function setSearchCache(key, data) {
+ searchCache.set(key, { data, time: Date.now() });
+}
+
+// ==================== 初始化 ====================
+async function init(cfg) {
+ const start = Date.now();
+ log(1, '初始化', `========== ${siteName} ==========`);
+
+ // 星芽登录
+ try {
+ const response = await request(rule.星芽.login, {
+ method: 'POST',
+ headers: { 'User-Agent': 'okhttp/4.10.0', 'platform': '1', 'Content-Type': 'application/json' },
+ data: { device: '24250683a3bdb3f118dff25ba4b1cba1a' }
+ });
+ const res = JSON.parse(response || '{}');
+ const token = res?.data?.token || res?.token || res?.access_token;
+ xingya_headers = token ? { ...aggConfig.headers.json, authorization: token } : aggConfig.headers.json;
+ log(token ? 1 : 2, '星芽', token ? `登录成功` : `登录失败`);
+ } catch (e) {
+ xingya_headers = aggConfig.headers.json;
+ log(2, '星芽', `异常: ${e.message}`);
+ }
+
+ // 牛牛初始化
+ const nnDeviceId = generateDeviceId();
+ log(0, '牛牛', `设备ID: ${nnDeviceId}`);
+
+ try {
+ let tkhtml = await request(rule.牛牛.host + rule.牛牛.visitor, {
+ method: 'GET',
+ headers: { "deviceid": nnDeviceId, "token": "", "User-Agent": "okhttp/4.12.0", "client": "app", "devicetype": "Android", "Content-Type": "application/json" }
+ });
+ let tkRes = JSON.parse(tkhtml || '{}');
+ niuniu_token = tkRes.data?.token || '';
+ log(niuniu_token ? 1 : 2, '牛牛', niuniu_token ? `访客token成功` : `访客token失败`);
+ niuniu_headers = { ...aggConfig.headers.niuniu, "token": niuniu_token, "deviceid": nnDeviceId };
+ } catch (e) {
+ log(2, '牛牛', `访客token异常: ${e.message}`);
+ niuniu_headers = { ...aggConfig.headers.niuniu, "deviceid": nnDeviceId };
+ }
+
+ // 牛牛广告解锁
+ try {
+ let t = String(Math.floor(Date.now() / 1000));
+ let body = `ac=wifi&os=Android&vod_version=1.10.21.6-tob&os_version=9&type=1&clientVersion=v5.2.5&uuid=Y4WNZ3SAWK7MAJMH7CXCDHJ4VMPVFRZQTBSIA4XTYO4AWEUHIK6Q01&resolution=1280*2618&openudid=889edced38f1069b&dt=Pixel%204&sha1=46121F77CE2FCAD3DBC3B9EC8A24908C1A8AD6D9&os_api=28&install_id=1549688030634536&device_brand=google&sdk_version=1.1.3.0&package_name=com.niuniu.ztdh.app&siteid=5627189&dev_log_aid=667431&oaid=×tamp=${t}`;
+ let nonce = "VX1KKGtoBDCi1fB1";
+ let signature = hmacSHA256(t + nonce + body, 'aceaa47f96b4875d446b2e1d97e03bbb');
+ let encbdoy = aesEncryptECB(body, 'dafdb3d2a5c343d6');
+ let response = await request(rule.牛牛.login, {
+ method: "POST",
+ headers: { 'X-Salt': '786774955F', 'X-Nonce': nonce, 'X-Timestamp': t, 'X-Signature': signature, 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'okhttp/4.10.0' },
+ data: encbdoy
+ });
+ if (response) {
+ let logindata = aesDecryptECB(response, 'dafdb3d2a5c343d6');
+ let accesstoken = JSON.parse(logindata || '{}');
+ niuniu_access_token = accesstoken.data?.access_token || '';
+ log(niuniu_access_token ? 1 : 2, '牛牛', niuniu_access_token ? `广告token成功` : `广告token失败`);
+ }
+ } catch (e) {
+ log(2, '牛牛', `广告解锁异常: ${e.message}`);
+ }
+
+ // 河马初始化
+ hema_headers = { ...aggConfig.headers.hema, 'User-Agent': 'okhttp/4.10.0' };
+ log(1, '河马', `初始化成功`);
+
+ logTime(start, 'init');
+ return true;
+}
+
+// ==================== 首页分类 ====================
+function home(filter) {
+ const platForms = platformList.filter(item => !cate_remove.some(word => new RegExp(word, 'i').test(item.name)));
+ const classes = platForms.map(item => ({
+ type_name: item.name,
+ type_id: item.id,
+ type_flag: '[CFS][SUBSITE2][FILTERBAR]'
+ }));
+
+ const filters = {};
+ platForms.forEach(item => {
+ if (filterOptions[item.id]) filters[item.id] = filterOptions[item.id];
+ });
+
+ log(0, '首页', `分类数: ${classes.length}`);
+ return JSON.stringify({ class: classes, filters: filters });
+}
+
+// ==================== 首页推荐 ====================
+async function homeVod() {
+ const start = Date.now();
+ const platForms = platformList.filter(item => !cate_remove.some(word => new RegExp(word, 'i').test(item.name)));
+ const randomPlat = platForms[Math.floor(Math.random() * platForms.length)];
+ const randomArea = ruleFilterDef[randomPlat.id]?.area || '';
+ const categoryResult = await category(randomPlat.id, 1, { area: randomArea }, {});
+ const categoryList = JSON.parse(categoryResult).list || [];
+ log(1, '首页推荐', `返回 ${categoryList.length} 条`);
+ logTime(start, 'homeVod');
+ return JSON.stringify({ list: categoryList });
+}
+
+// ==================== 分类列表 ====================
+async function category(tid, pg, filter, extend) {
+ const start = Date.now();
+ const page = pg || 1;
+ const area = filter?.area || extend?.area || ruleFilterDef[tid]?.area || '';
+ const videos = [];
+ const platRule = rule[tid];
+
+ log(0, '分类', `${tid} page=${page} area=${area}`);
+
+ switch (tid) {
+ case '七猫': {
+ let params = { operation: 1, playlet_privacy: 1 };
+ if (area && area !== '0' && area !== '') params.tag_id = area;
+ if (page > 1) params.next_id = page;
+
+ const keys = Object.keys(params).sort();
+ let signStr = keys.map(k => `${k}=${params[k]}`).join('') + aggConfig.keys;
+ params.sign = await md5(signStr);
+
+ const url = `${platRule.host}${platRule.list}?${buildUrlQuery(params)}`;
+ const headers = await getQiMaoHeaders();
+ const response = await request(url, { method: 'GET', headers });
+
+ if (response) {
+ const res = JSON.parse(response);
+ const items = res.data?.list || [];
+ log(0, '七猫', `获取 ${items.length} 条`);
+ items.forEach(item => {
+ videos.push({
+ vod_id: `七猫@${encodeURIComponent(item.playlet_id)}`,
+ vod_name: item.title || '',
+ vod_pic: item.image_link || '',
+ vod_remarks: `七猫短剧 | ${item.total_episode_num || 0}集`,
+ vod_content: item.tags || ''
+ });
+ });
+ }
+ break;
+ }
+ case '百度': {
+ let sub = ["新剧", "限时免费", "精选", "独播"].includes(area) ? area : "新剧";
+ let tcsub = area === "全部" || area === "全部题材" ? "" : area;
+ let t = Math.floor(Date.now() / 1000);
+ let version = await md5(t + "v2");
+
+ const postData = {
+ 'data': JSON.stringify({
+ "data": {
+ "extRequest": { "flow_tabid": "13" },
+ "from": "feed",
+ "page": "channel_video_landing",
+ "pd": "feed",
+ "refreshIndex": parseInt(page),
+ "cursor": "",
+ "theme": "",
+ "timestamp": t,
+ "version": version,
+ "themes": [
+ { "kind": "综合", "names": [sub] },
+ { "kind": "题材", "names": [tcsub] }
+ ]
+ }
+ })
+ };
+
+ let html = await request(`${platRule.host}${platRule.list}`, {
+ method: 'POST',
+ headers: aggConfig.headers.baidu,
+ data: postData
+ });
+ let res = JSON.parse(html);
+ let items = res.data?.items || [];
+ log(0, '百度', `获取 ${items.length} 条`);
+ items.slice(0, 20).forEach(it => {
+ videos.push({
+ vod_id: `百度@${it.collId}`,
+ vod_name: it.title || '未知短剧',
+ vod_pic: it.img || '',
+ vod_remarks: '百度短剧 | ' + (it.updateStatus || "更新中"),
+ vod_content: it.description || ''
+ });
+ });
+ break;
+ }
+ case '星芽': {
+ const url = `${platRule.host}${platRule.list}=${area}&type=1&class2_ids=0&page_num=${page}&page_size=24`;
+ const response = await request(url, { headers: xingya_headers });
+ const res = JSON.parse(response);
+ const items = res.data?.list || [];
+ log(0, '星芽', `获取 ${items.length} 条`);
+ items.forEach(it => {
+ videos.push({
+ vod_id: `星芽@${it.theater.id}`,
+ vod_name: it.theater.title || '',
+ vod_pic: it.theater.cover_url || '',
+ vod_remarks: '星芽短剧 | ' + (it.theater.total ? `${it.theater.total}集` : ''),
+ vod_content: `播放量:${it.theater.play_amount_str || 0}`
+ });
+ });
+ break;
+ }
+ case '西饭': {
+ const [typeId, typeName] = area.split('@');
+ const ts = Math.floor(Date.now() / 1000);
+ const url = `${platRule.host}${platRule.list}?reqType=aggregationPage&offset=${(page - 1) * 30}&categoryId=${typeId}&quickEngineVersion=-1&scene=&categoryNames=${encodeURIComponent(typeName)}&categoryVersion=1&density=1.5&pageID=page_theater&version=2001001&androidVersionCode=28&requestId=${ts}aa498144140ef297&appId=drama&teenMode=false&userBaseMode=false&${XIFAN_SESSION_PARAMS}`;
+
+ const response = await request(url, { headers: aggConfig.headers.form });
+ const res = JSON.parse(response);
+ let count = 0;
+ (res.result?.elements || []).forEach(soup => {
+ (soup.contents || []).forEach(vod => {
+ const dj = vod.duanjuVo || {};
+ videos.push({
+ vod_id: `西饭@${dj.duanjuId}#${dj.source}`,
+ vod_name: dj.title || '',
+ vod_pic: dj.coverImageUrl || '',
+ vod_remarks: '西饭短剧 | ' + (dj.total ? `${dj.total}集` : ''),
+ vod_content: dj.desc || ''
+ });
+ count++;
+ });
+ });
+ log(0, '西饭', `获取 ${count} 条`);
+ break;
+ }
+ case '牛牛': {
+ let condition = { "typeId": "S1" };
+ if (area && area !== '全部' && area !== '') condition.classify = area;
+
+ const postData = { "condition": condition, "pageNum": page, "pageSize": 24 };
+ const response = await request(`${platRule.host}${platRule.list}`, {
+ method: 'POST',
+ headers: niuniu_headers,
+ data: postData
+ });
+ const res = JSON.parse(response);
+ const items = res.data?.records || [];
+ log(0, '牛牛', `获取 ${items.length} 条`);
+ items.forEach(item => {
+ videos.push({
+ vod_id: `牛牛@${item.id}`,
+ vod_name: item.name || '',
+ vod_pic: item.cover || '',
+ vod_remarks: '牛牛短剧 | ' + (item.totalEpisode ? `${item.totalEpisode}集` : ''),
+ vod_content: item.description || ''
+ });
+ });
+ break;
+ }
+ case '围观': {
+ const postData = { "audience": "全部受众", "page": page, "pageSize": 30, "searchWord": "", "subject": "全部主题" };
+ const response = await request(`${platRule.host}${platRule.search}`, {
+ method: 'POST',
+ headers: aggConfig.headers.json,
+ data: postData
+ });
+ const res = JSON.parse(response);
+ const items = (res.code === 200 && res.data) ? res.data : [];
+ log(0, '围观', `获取 ${items.length} 条`);
+ items.forEach(it => {
+ videos.push({
+ vod_id: `围观@${it.oneId}`,
+ vod_name: it.title || '未知短剧',
+ vod_pic: it.vertPoster || it.horizonPoster || '',
+ vod_remarks: '围观短剧 | ' + `集数:${it.episodeCount || 0}`,
+ vod_content: it.description || ''
+ });
+ });
+ break;
+ }
+ case '河马': {
+ try {
+ const sub = area || '308';
+ const tagIds = hemaTagIds[sub] || '';
+ const bodys = JSON.stringify({
+ "recSwitch": true, "channelId": sub, "tagIds": tagIds,
+ "cnxhFlag": page - 1, "playListFlag": true,
+ "watchRecords": ["41000103722_572752006"]
+ });
+ const body = hemaEncrypt(bodys);
+ const response = await request(`${platRule.host}${platRule.list}`, {
+ method: 'POST',
+ headers: { ...hema_headers, 'Content-Type': 'application/x-www-form-urlencoded' },
+ data: body
+ });
+ const res = JSON.parse(response);
+ const dehtml = res.data;
+ if (dehtml) {
+ const hmdata = hemaDecrypt(dehtml);
+ if (hmdata && hmdata !== '{}') {
+ const hmlist = JSON.parse(hmdata).columnData || [];
+ hmlist.forEach(videoDataArray => {
+ (videoDataArray.videoData || []).forEach(video => {
+ videos.push({
+ vod_id: `河马@${video.bookId}`,
+ vod_name: video.bookName || '',
+ vod_pic: video.coverWap || video.coverCutWap,
+ vod_remarks: `河马短剧 | 更新${video.updateNum || 0}集`,
+ vod_content: video.introduction || ''
+ });
+ });
+ });
+ }
+ }
+ } catch (e) {
+ log(2, '河马', e.message);
+ }
+ break;
+ }
+ case '星星': {
+ const postData = {
+ "productId": "2a8c14d1-72e7-498b-af23-381028eb47c0",
+ "vestId": "2be070e0-c824-4d0e-a67a-8f688890cadb",
+ "channel": "oppo19", "osType": "android", "version": "20",
+ "token": "202509271001001446030204698626", "resourceId": area,
+ "pageNum": String(page), "pageSize": "20"
+ };
+ const response = await request(`${platRule.host}${platRule.list}`, {
+ method: 'GET', headers: aggConfig.headers.form, data: postData
+ });
+ try {
+ const res = JSON.parse(response);
+ const items = res.data?.datalist || [];
+ log(0, '星星', `获取 ${items.length} 条`);
+ items.forEach(vod => {
+ videos.push({
+ vod_id: `星星@${vod.id}@${encodeURIComponent(vod.introduction || '')}`,
+ vod_name: vod.name || '',
+ vod_pic: vod.icon || '',
+ vod_remarks: `星星短剧 | ${vod.heat || 0}万播放`,
+ vod_content: vod.introduction || ''
+ });
+ });
+ } catch (e) {
+ log(2, '星星', e.message);
+ }
+ break;
+ }
+ case '好看': {
+ const postData = { "tag_id": area, "rn": "20", "pn": page };
+ const response = await request(`${platRule.host}${platRule.list}`, {
+ method: 'POST', headers: aggConfig.headers.haokan, data: postData
+ });
+ try {
+ const res = JSON.parse(response);
+ const items = res.data?.list || [];
+ log(0, '好看', `获取 ${items.length} 条`);
+ items.forEach(item => {
+ videos.push({
+ vod_id: `好看@${item.playlet_id}`,
+ vod_name: item.playlet_title || '',
+ vod_pic: item.playlet_poster || '',
+ vod_remarks: `好看短剧 | ${item.episodes_num_text || ''}`,
+ vod_content: item.tags ? item.tags.join('·') : ''
+ });
+ });
+ } catch (e) {
+ log(2, '好看', e.message);
+ }
+ break;
+ }
+ }
+
+ log(1, '分类', `${tid} 返回 ${videos.length} 条`);
+ logTime(start, 'category');
+ return JSON.stringify({ list: videos, page, pagecount: page + 1, limit: videos.length, total: videos.length * (page + 1) });
+}
+
+// ==================== 详情 ====================
+async function detail(id) {
+ const parts = id.split('@');
+ const platform = parts[0];
+ const did = parts.slice(1).join('@');
+ const platRule = rule[platform];
+ let vod = {};
+
+ log(0, '详情', `${platform} ${did.substring(0, 50)}`);
+
+ switch (platform) {
+ case '七猫': {
+ const didDecoded = decodeURIComponent(did);
+ const sign = await md5(`playlet_id=${didDecoded}${aggConfig.keys}`);
+ const url = `${platRule.detail}?playlet_id=${didDecoded}&sign=${sign}`;
+ const headers = await getQiMaoHeaders();
+ const response = await request(url, { method: 'GET', headers });
+ const data = JSON.parse(response || '{}').data || {};
+ vod = {
+ vod_id: id, vod_name: data.title || '未知标题',
+ vod_pic: data.image_link || '', vod_remarks: `${data.tags || ''} ${data.total_episode_num || 0}集`,
+ vod_content: data.intro || '未知剧情', vod_play_from: '七猫短剧',
+ vod_play_url: (data.play_list || []).map(it => `${it.sort}$${it.video_url}`).join('#')
+ };
+ break;
+ }
+ case '百度': {
+ const postData = { "playlet_id": did, "vid": "undefined" };
+ let html = await request(`${platRule.detailHost}${platRule.detail}`, {
+ method: 'POST', headers: aggConfig.headers.baidu, data: postData
+ });
+ let res = JSON.parse(html);
+ let dthtml = res.data || {};
+ let vids = dthtml.vid_list || [];
+ let playArr = vids.map((vid, index) => `第${index + 1}集$${did}@${vid}`);
+ vod = {
+ vod_id: id, vod_name: dthtml.playlet_title || '未知短剧',
+ vod_pic: dthtml.playlet_poster || '',
+ vod_content: `热度值:${dthtml.hot_value || 0}\n题材:${dthtml.tag_text || ''}\n集数:${dthtml.episodes_num || 0}\n简介:${dthtml.description || ''}`,
+ vod_remarks: `共${vids.length || 0}集`, vod_play_from: "百度短剧",
+ vod_play_url: playArr.join('#')
+ };
+ break;
+ }
+ case '星芽': {
+ const detailUrl = `${platRule.host}${platRule.detail}?theater_parent_id=${did}`;
+ const response = await request(detailUrl, { headers: xingya_headers });
+ const res = JSON.parse(response);
+ if (res.code === 'ok' && res.data) {
+ const data = res.data;
+ const playUrls = (data.theaters || []).map(item => `第${item.num}集$${item.son_video_url}`).join('#');
+ vod = {
+ vod_id: id, vod_name: data.title || '未知剧名',
+ vod_pic: data.cover_url || '', vod_remarks: data.is_over === 2 ? '连载中' : '已完结',
+ vod_content: data.introduction || data.desc || '',
+ vod_play_from: '星芽短剧', vod_play_url: playUrls || '暂无播放地址$0'
+ };
+ }
+ break;
+ }
+ case '西饭': {
+ const [duanjuId, source] = did.split('#');
+ const url = `${platRule.host}${platRule.detail}?duanjuId=${duanjuId}&source=${source}`;
+ const response = await request(url, { headers: aggConfig.headers.form });
+ const res = JSON.parse(response);
+ const data = res.result || {};
+ const playUrls = (data.episodeList || []).map(ep => `${ep.index}$${ep.playUrl}`).join('#');
+ vod = {
+ vod_id: id, vod_name: data.title || '', vod_pic: data.coverImageUrl || '',
+ vod_content: data.desc || '未知',
+ vod_remarks: data.updateStatus === 'over' ? `${data.total || 0}集 已完结` : `更新${data.total || 0}集`,
+ vod_play_from: '西饭短剧', vod_play_url: playUrls
+ };
+ break;
+ }
+ case '牛牛': {
+ const descData = await request(`${platRule.host}${platRule.desc}`, {
+ method: 'POST', headers: niuniu_headers, data: { "id": did, "typeId": "S1" }
+ });
+ const descRes = JSON.parse(descData);
+ const descInfo = descRes.data || {};
+ const listData = await request(`${platRule.host}${platRule.detail}`, {
+ method: 'POST', headers: niuniu_headers, data: { "id": did, "source": 0, "typeId": "S1", "userId": "546932" }
+ });
+ const listRes = JSON.parse(listData);
+ const listInfo = listRes.data || {};
+
+ let playUrls = '';
+ if (listInfo.url && listInfo.episodeList && listInfo.episodeList.length > 0) {
+ playUrls = (listInfo.episodeList || []).map(ep => `${ep.episode}$${did}+${ep.id}`).join('#');
+ } else if (listInfo.thirdPlayId) {
+ let thirdPlayId = listInfo.thirdPlayId;
+ let data1 = "not_include=0&lock_free=1&type=1&clientVersion=v5.2.5&uuid=6IDYUSASPQY5BBVACWQW3LLTPV4V7DE26UOCX5TZTVUGX4VUJNXQ01&resolution=1080*2320&openudid=82f4175d577a2939&dt=22021211RC&os_api=31&install_id=1496879012031075&sdk_version=1.1.3.0&siteid=5627189&dev_log_aid=667431&oaid=abec0dfff623201b×tamp=1752498494&direction=0&ac=mobile&os=Android&vod_version=1.10.21.6-tob&os_version=12&count=1&index=1&shortplay_id=" + thirdPlayId + "&sha1=46121F77CE2FCAD3DBC3B9EC8A24908C1A8AD6D9&device_brand=Redmi&package_name=com.niuniu.ztdh.app";
+ try {
+ let html1 = await niuniuPost(rule.牛牛.detail2, data1, "1");
+ if (html1 && html1.data && html1.data.episode_right_list) {
+ playUrls = html1.data.episode_right_list.map(it => {
+ let lockType = it.lock_type || 'free';
+ return `第${it.index}集$${it.index}+${lockType}+${thirdPlayId}`;
+ }).join('#');
+ }
+ } catch (e) { log(2, '牛牛详情', e.message); }
+ }
+ vod = {
+ vod_id: id, vod_name: descInfo.name || listInfo.name || '未知名称',
+ vod_pic: descInfo.cover || listInfo.cover || '',
+ vod_content: `类型:${descInfo.classify || ''}\n评分:${descInfo.score || ''}\n简介:${descInfo.introduce || ''}`,
+ vod_remarks: `共${descInfo.totalEpisode || listInfo.totalEpisode || 0}集`,
+ vod_play_from: '牛牛短剧', vod_play_url: playUrls || '暂无播放地址$0'
+ };
+ break;
+ }
+ case '围观': {
+ const response = await request(`${platRule.host}${platRule.detail}&oneId=${did}&page=1&pageSize=1000`, {
+ headers: aggConfig.headers.form
+ });
+ const res = JSON.parse(response);
+ if (res.code === 200 && res.data) {
+ const data = res.data || [];
+ const firstEpisode = data[0] || {};
+ vod = {
+ vod_id: id, vod_name: firstEpisode.title || '',
+ vod_pic: firstEpisode.vertPoster || firstEpisode.horizonPoster || '',
+ vod_remarks: `共${data.length || 0}集`,
+ vod_content: `播放量:${firstEpisode.viewCount || 0} 收藏:${firstEpisode.collectionCount || 0} 评论:${firstEpisode.commentCount || 0}`,
+ vod_play_from: '围观短剧',
+ vod_play_url: data.map(ep => {
+ let playSetting = ep.playSetting || ep.videoClarityList || [];
+ try { if (typeof playSetting === 'string') playSetting = JSON.parse(playSetting); } catch (e) { }
+ const url = (playSetting.find(item => item.name === '1080P')?.url || playSetting.find(item => item.name === '720P')?.url || '');
+ return `第${ep.playOrder || 1}集$${url}`;
+ }).filter(ep => ep.split('$')[1]).join('#')
+ };
+ }
+ break;
+ }
+ case '河马': {
+ const bookId = did;
+ const body = hemaEncrypt(JSON.stringify({ "bookId": bookId }));
+ const detailResponse = await request(`${platRule.host}${platRule.detail}`, {
+ method: 'POST', headers: { ...hema_headers, 'Content-Type': 'application/x-www-form-urlencoded' }, data: body
+ });
+ const detailRes = JSON.parse(detailResponse);
+ const detailHtml = detailRes.data;
+ const postdata = hemaDecrypt(detailHtml);
+ const videoInfo = JSON.parse(postdata).videoInfo || {};
+
+ const episodeBody = hemaEncrypt(JSON.stringify({ "bookId": bookId, "chapterMin": videoInfo.updateNum || 0, "chapterMax": videoInfo.chapterIndex || 0 }));
+ const episodeResponse = await request(`${platRule.host}${platRule.episode}`, {
+ method: 'POST', headers: { ...hema_headers, 'Content-Type': 'application/x-www-form-urlencoded' }, data: episodeBody
+ });
+ const episodeRes = JSON.parse(episodeResponse);
+ const episodeHtml = episodeRes.data;
+ const playdata = hemaDecrypt(episodeHtml);
+ const chapterList = JSON.parse(playdata).chapterList || [];
+
+ const playUrls = chapterList.map(item => `${item.chapterName}$${item.chapterId}++${item.chapterIndex}++${bookId}`).join('#');
+ vod = {
+ vod_id: id, vod_name: videoInfo.bookName || '未知剧名',
+ vod_pic: videoInfo.coverWap, vod_remarks: videoInfo.finishStatusCn || `更新至${videoInfo.updateNum || 0}集`,
+ vod_content: videoInfo.introduction || '暂无简介',
+ vod_play_from: '河马短剧', vod_play_url: playUrls || '暂无播放地址$0'
+ };
+ break;
+ }
+ case '星星': {
+ const partsArr = did.split('@');
+ const bookId = partsArr[0];
+ const contentDesc = decodeURIComponent(partsArr[1] || '');
+ const postData = {
+ "bookId": bookId, "productId": "2a8c14d1-72e7-498b-af23-381028eb47c0",
+ "vestId": "2be070e0-c824-4d0e-a67a-8f688890cadb", "channel": "oppo19",
+ "osType": "android", "version": "20", "token": "202509271001001446030204698626"
+ };
+ const response = await request(`${platRule.host}${platRule.detail}`, {
+ method: 'GET', headers: aggConfig.headers.form, data: postData
+ });
+ try {
+ const res = JSON.parse(response);
+ const data = res.data || [];
+ const playUrls = data.map((vodItem, index) => {
+ const playUrl = vodItem.shortPlayList?.[0]?.chapterShortPlayVoList?.[0]?.shortPlayUrl || '';
+ return playUrl ? `第${index + 1}集$${playUrl}` : null;
+ }).filter(Boolean).join('#');
+ vod = { vod_id: id, vod_name: '星星短剧', vod_content: contentDesc, vod_play_from: '星星短剧', vod_play_url: playUrls || '暂无播放地址$0' };
+ } catch (e) { log(2, '星星详情', e.message); }
+ break;
+ }
+ case '好看': {
+ const commonlistId = Date.now().toString().substring(0, 13);
+ const innerParams = `enable_enter_playlet=0&seek_time=0&hotspot=0&auto_show_hot_point_panel=0&type=playlet&commonlist_id=${commonlistId}&scene=&vid=&enable_atlas=0&mark_pn=&uk=&ctime=0&from=playlet_new&id=${did}&rn=10&pn=1&direction=3`;
+ const listResponse = await request(`${platRule.host}${platRule.detail_list}`, {
+ method: 'POST', headers: aggConfig.headers.haokan, data: { "video/commonlist": innerParams }
+ });
+ try {
+ const resObj = JSON.parse(listResponse);
+ const firstVideo = resObj['video/commonlist']?.data?.results?.[0];
+ const vid = firstVideo?.content?.vid;
+ const detailResponse = await request(`${platRule.host}${platRule.detail}`, {
+ method: 'POST', headers: aggConfig.headers.haokan, data: { "vid": vid, "playlet_id": did }
+ });
+ const detailDataObj = JSON.parse(detailResponse).data || {};
+ let vidList = detailDataObj.vid_list || [];
+ if (vidList.length === 0 && detailDataObj.results) vidList = detailDataObj.results.map(item => item.vid);
+ const playList = vidList.map((v, i) => `第${i + 1}集$${did}@${v}`).join('#');
+ vod = {
+ vod_id: id, vod_name: detailDataObj.playlet_title || '', vod_pic: detailDataObj.playlet_poster || '',
+ vod_remarks: (detailDataObj.hot_value || '') + '播放·' + (detailDataObj.episodes_num || '') + '集',
+ vod_content: detailDataObj.description || '', vod_play_from: '好看短剧', vod_play_url: playList
+ };
+ } catch (e) { log(2, '好看详情', e.message); }
+ break;
+ }
+ }
+
+ return JSON.stringify({ list: [vod] });
+}
+
+// ==================== 搜索 ====================
+// ==================== 搜索 ====================
+async function cfs(siteId, wd, pg) {
+ const start = Date.now();
+ const page = pg || 1;
+ const searchLimit = aggConfig.searchLimit;
+ const searchTimeout = aggConfig.searchTimeout;
+ let results = [];
+
+ const cacheKey = `${siteId}_${wd}_${page}`;
+ const cachedResult = getSearchCache(cacheKey);
+ if (cachedResult) {
+ return cachedResult;
+ }
+
+ log(0, '搜索', `${siteId} 关键词: ${wd}, 页码: ${page}`);
+
+ const platformItem = platformList.find(p => p.id === siteId);
+ if (platformItem && cate_remove.some(word => new RegExp(word, 'i').test(platformItem.name))) {
+ log(2, '搜索', `跳过平台: ${siteId}`);
+ return JSON.stringify({ list: [], page, pagecount: page + 1, limit: 0, total: 0 });
+ }
+
+ const platRule = rule[siteId];
+
+ switch (siteId) {
+ case '百度': {
+ const requestUrl = `${platRule.host}${platRule.search}`;
+ const postData = {
+ "data": {
+ "query": wd,
+ "page": page,
+ "attribute": ["title"],
+ "fe_page_type": "search",
+ "extra": {
+ "tab_id": "216",
+ "flow_tabid": "13",
+ "shortplay_source": "feed",
+ "from": "feed",
+ "tab_type": "搜索",
+ "sub_template": "playlet_search_result"
+ }
+ }
+ };
+
+ let html = await request(requestUrl, {
+ method: 'POST',
+ headers: aggConfig.headers.baidu,
+ data: postData,
+ timeout: searchTimeout
+ });
+
+ let res = JSON.parse(html);
+ let items = res.data?.itemList || res.data?.data?.itemList || res.itemList || res.data?.list || res.list || [];
+ log(0, '百度搜索', `获取到 ${items.length} 条`);
+ results = items.map(it => ({
+ vod_id: `百度@${it.nid?.split("_")[1] || it.collId || ''}`,
+ vod_name: it.title || '未知短剧',
+ vod_pic: it.img || '',
+ vod_remarks: '百度短剧 | ' + (it.collNum || it.updateStatus || "搜索短剧"),
+ vod_content: it.description || ''
+ }));
+ break;
+ }
+
+ case '七猫': {
+ try {
+ const trackId = 'ec1280db127955061754851657967';
+ let signString = `extend=page=${page}read_preference=0track_id=${trackId}wd=${wd}${aggConfig.keys}`;
+ let sign = await md5(signString);
+ const encodedKey = encodeURIComponent(wd);
+ const url = `${platRule.host}${platRule.search}?extend=&page=${page}&wd=${encodedKey}&read_preference=0&track_id=${trackId}&sign=${sign}`;
+ const headers = await getQiMaoHeaders();
+ const response = await request(url, { method: 'GET', headers, timeout: searchTimeout });
+ const res = JSON.parse(response || '{}');
+ let items = res.data?.list || res.list || [];
+ log(0, '七猫搜索', `获取到 ${items.length} 条`);
+ results = items.map(item => ({
+ vod_id: `七猫@${encodeURIComponent(item.playlet_id || item.id || '')}`,
+ vod_name: item.title || '未知标题',
+ vod_pic: item.image_link || item.cover || '',
+ vod_remarks: '七猫短剧 | ' + (item.tags || '') + ' ' + (item.total_episode_num ? `${item.total_episode_num}集` : ''),
+ vod_content: item.intro || ''
+ }));
+ } catch (e) {
+ log(2, '七猫搜索', e.message);
+ }
+ break;
+ }
+
+ case '星芽': {
+ const postData = { "text": wd };
+ const requestUrl = `${platRule.host}${platRule.search}`;
+ const response = await request(requestUrl, {
+ method: 'POST',
+ headers: xingya_headers,
+ data: postData,
+ timeout: searchTimeout
+ });
+ const res = JSON.parse(response || '{}');
+ const items = res.data?.theater?.search_data || [];
+ log(0, '星芽搜索', `获取到 ${items.length} 条`);
+ results = items.map(item => ({
+ vod_id: `星芽@${item.id}`,
+ vod_name: item.title || '',
+ vod_pic: item.cover_url || '',
+ vod_remarks: '星芽短剧 | ' + (item.total ? `${item.total}集` : ''),
+ vod_content: item.introduction || ''
+ }));
+ break;
+ }
+
+ case '西饭': {
+ const ts = Math.floor(Date.now() / 1000);
+ const url = `${platRule.host}${platRule.search}?keyword=${encodeURIComponent(wd)}&pageIndex=${page}&version=2001001&androidVersionCode=28&requestId=${ts}ea3a14bc0317d76f&appId=drama&teenMode=false&userBaseMode=false&${XIFAN_SESSION_PARAMS}`;
+ const response = await request(url, { headers: aggConfig.headers.form, timeout: searchTimeout });
+ const res = JSON.parse(response || '{}');
+ let items = [];
+ if (res.result?.elements) {
+ res.result.elements.forEach(soup => {
+ if (soup.contents) {
+ soup.contents.forEach(vod => {
+ const dj = vod.duanjuVo || {};
+ items.push({
+ vod_id: `西饭@${dj.duanjuId || ''}#${dj.source || ''}`,
+ vod_name: dj.title || '未知标题',
+ vod_pic: dj.coverImageUrl || '',
+ vod_remarks: '西饭短剧 | ' + (dj.total ? `${dj.total}集` : ''),
+ vod_content: ''
+ });
+ });
+ }
+ });
+ }
+ log(0, '西饭搜索', `获取到 ${items.length} 条`);
+ results = items;
+ break;
+ }
+
+ case '牛牛': {
+ const postData = {
+ "condition": { "typeId": "S1", "value": wd },
+ "pageNum": page,
+ "pageSize": searchLimit
+ };
+ const response = await request(`${platRule.host}${platRule.search}`, {
+ method: 'POST',
+ headers: niuniu_headers,
+ data: postData,
+ timeout: searchTimeout
+ });
+ const res = JSON.parse(response || '{}');
+ const items = res.data?.records || [];
+ log(0, '牛牛搜索', `获取到 ${items.length} 条`);
+ results = items.map(item => ({
+ vod_id: `牛牛@${item.id}`,
+ vod_name: item.name || '',
+ vod_pic: item.cover || '',
+ vod_remarks: '牛牛短剧 | ' + (item.totalEpisode ? `${item.totalEpisode}集` : ''),
+ vod_content: ''
+ }));
+ break;
+ }
+
+ case '围观': {
+ const postData = {
+ "audience": "",
+ "page": page,
+ "pageSize": 30,
+ "searchWord": wd,
+ "subject": ""
+ };
+ const response = await request(`${platRule.host}${platRule.search}`, {
+ method: 'POST',
+ headers: aggConfig.headers.json,
+ data: postData,
+ timeout: searchTimeout
+ });
+ const res = JSON.parse(response || '{}');
+ const items = (res.code === 200 && res.data) ? res.data : [];
+ log(0, '围观搜索', `获取到 ${items.length} 条`);
+ results = items.map(it => ({
+ vod_id: `围观@${it.oneId || ''}`,
+ vod_name: it.title || '未知标题',
+ vod_pic: it.vertPoster || it.horizonPoster || '',
+ vod_remarks: '围观短剧 | 集数:' + (it.episodeCount || 0),
+ vod_content: it.description || ''
+ }));
+ break;
+ }
+
+ case '河马': {
+ try {
+ const hmbody = JSON.stringify({
+ "keyword": wd,
+ "page": page,
+ "size": searchLimit
+ });
+ const encryptedBody = hemaEncrypt(hmbody);
+ const response = await request(`${platRule.host}${platRule.search}`, {
+ method: 'POST',
+ headers: hema_headers,
+ data: encryptedBody,
+ timeout: searchTimeout
+ });
+ const res = JSON.parse(response || '{}');
+ const xmres = res.data;
+ if (xmres) {
+ const dexmres = hemaDecrypt(xmres);
+ if (dexmres && dexmres !== '{}') {
+ const xmlist = JSON.parse(dexmres).searchVos || [];
+ log(0, '河马搜索', `获取到 ${xmlist.length} 条`);
+ results = xmlist.map(video => ({
+ vod_id: `河马@${video.bookId}`,
+ vod_name: video.bookName || '',
+ vod_pic: (video.coverWap || '') + '@Referer=',
+ vod_remarks: `河马短剧 | 共${video.updateNum || 0}集`,
+ vod_content: video.introduction || ''
+ }));
+ }
+ }
+ } catch (e) {
+ log(2, '河马搜索', e.message);
+ }
+ break;
+ }
+
+ case '星星': {
+ try {
+ const postData = {
+ "productId": "2a8c14d1-72e7-498b-af23-381028eb47c0",
+ "vestId": "2be070e0-c824-4d0e-a67a-8f688890cadb",
+ "channel": "oppo19",
+ "osType": "android",
+ "version": "20",
+ "token": "202509271001001446030204698626",
+ "keyWord": wd,
+ "pageNum": String(page),
+ "pageSize": String(searchLimit)
+ };
+ const response = await request(`${platRule.host}${platRule.search}`, {
+ method: 'GET',
+ headers: aggConfig.headers.json,
+ data: postData,
+ timeout: searchTimeout
+ });
+ const res = JSON.parse(response || '{}');
+ const items = res.data?.datalist || [];
+ log(0, '星星搜索', `获取到 ${items.length} 条`);
+ results = items.map(vod => ({
+ vod_id: `星星@${vod.id}@${encodeURIComponent(vod.introduction || '')}`,
+ vod_name: vod.name || '',
+ vod_pic: vod.icon || '',
+ vod_remarks: `星星短剧 | ${vod.heat || 0}万播放`,
+ vod_content: vod.introduction || ''
+ }));
+ } catch (e) {
+ log(2, '星星搜索', e.message);
+ }
+ break;
+ }
+
+ case '好看': {
+ try {
+ const postData = { "search_word": wd };
+ const response = await request(`${platRule.host}${platRule.search}`, {
+ method: 'POST',
+ headers: aggConfig.headers.haokan,
+ data: postData,
+ timeout: searchTimeout
+ });
+ const res = JSON.parse(response || '{}');
+ const items = res.data || [];
+ log(0, '好看搜索', `获取到 ${items.length} 条`);
+ results = items.map(item => ({
+ vod_id: `好看@${item.id}`,
+ vod_name: item.title || '',
+ vod_pic: item.cover_url || '',
+ vod_remarks: '好看短剧 | ' + (item.tag ? item.tag.replace(/\//g, '·') : ''),
+ vod_content: ''
+ }));
+ } catch (e) {
+ log(2, '好看搜索', e.message);
+ }
+ break;
+ }
+ }
+
+ // 关键词过滤
+ const keywordRegex = new RegExp(wd, "i");
+ let filteredResults = [];
+ for (let item of results) {
+ if (item.vod_name && keywordRegex.test(item.vod_name)) {
+ filteredResults.push(item);
+ }
+ }
+
+ log(0, `${siteId}搜索`, `原始 ${results.length} 条,匹配后 ${filteredResults.length} 条`);
+ logTime(start, 'cfs');
+
+ const resultJson = JSON.stringify({
+ list: filteredResults,
+ page: page,
+ pagecount: page + 1,
+ limit: filteredResults.length,
+ total: filteredResults.length * (page + 1)
+ });
+
+ setSearchCache(cacheKey, resultJson);
+ return resultJson;
+}
+
+// ==================== 全局搜索 ====================
+async function search(wd, quick, pg) {
+ const start = Date.now();
+ const videos = [];
+ const page = pg || 1;
+
+ log(1, '全局搜索', `关键词: ${wd}, 页码: ${page}`);
+
+ const platForms = platformList.filter(item => !cate_remove.some(word => new RegExp(word, 'i').test(item.name)));
+ log(0, '全局搜索', `共 ${platForms.length} 个平台待搜索`);
+
+ const searchPromises = platForms.map(async (platform) => {
+ try {
+ const result = await cfs(platform.id, wd, page);
+ return JSON.parse(result).list || [];
+ } catch (e) {
+ log(2, '全局搜索', `${platform.id} 异常: ${e.message}`);
+ return [];
+ }
+ });
+
+ const searchResults = await Promise.all(searchPromises);
+
+ let totalResults = 0;
+ const hasResultPlats = [];
+ const noResultPlats = [];
+
+ searchResults.forEach((list, idx) => {
+ const platform = platForms[idx];
+ const count = list.length;
+ totalResults += count;
+ if (count > 0) {
+ hasResultPlats.push(`${platform.name}(${count}条)`);
+ } else {
+ noResultPlats.push(platform.name);
+ }
+ videos.push(...list);
+ });
+
+ if (hasResultPlats.length > 0) {
+ log(1, '搜索结果', `有结果: ${hasResultPlats.join(', ')}`);
+ } else {
+ log(2, '搜索结果', `无结果`);
+ }
+
+ if (noResultPlats.length > 0) {
+ log(2, '搜索结果', `无结果平台: ${noResultPlats.join(', ')}`);
+ }
+
+ log(1, '搜索结果汇总', `共 ${totalResults} 条`);
+
+ // 关键词过滤
+ const keywordRegex = new RegExp(wd, "i");
+ let filteredResults = [];
+ for (let item of videos) {
+ if (item.vod_name && keywordRegex.test(item.vod_name)) {
+ filteredResults.push(item);
+ }
+ }
+
+ log(1, '全局搜索', `原始 ${videos.length} 条,过滤后 ${filteredResults.length} 条`);
+ logTime(start, 'search');
+
+ return JSON.stringify({
+ list: filteredResults,
+ page: page,
+ pagecount: page + 1,
+ limit: filteredResults.length,
+ total: filteredResults.length * (page + 1)
+ });
+}
+// ==================== 播放 ====================
+async function play(flag, id, flags) {
+ log(0, '播放', `${flag} ${id.substring(0, 50)}`);
+
+ if (/好看|百度/.test(flag)) {
+ let parts = id.split('@');
+ let playletId = parts[0];
+ let vid = parts[1];
+
+ if (/好看/.test(flag)) {
+ const innerParams = `method=post&vid=${vid}&immersive_mode=v4_5&tplname=feed_small_video&tag=playlet_talos&tab=detail&external_from=&is_dp_video=0&immersive_square_type=3&video_set_id=${playletId}&play_screen_type=1&play_volume_type=2&play_external_device_type=1`;
+ const response = await request(`${rule.好看.host}${rule.好看.play}`, {
+ method: 'POST', headers: aggConfig.headers.haokan, data: { "video/relate": innerParams }
+ });
+ try {
+ const videoData = JSON.parse(response)['video/relate']?.data?.cur_video || {};
+ const urlMap = {};
+ if (videoData.clarityUrl) videoData.clarityUrl.forEach(c => { if (c.title && c.url) urlMap[c.title] = c.url; });
+ if (videoData.video_list) Object.entries(videoData.video_list).forEach(([k, v]) => { if (!urlMap[k]) urlMap[k] = v; });
+ const sortedQualities = Object.keys(urlMap).sort((a, b) => {
+ const order = { '4k': 0, '2k': 1, '高清': 2, '蓝光': 3, '超清': 4, '标清': 5 };
+ return (order[a] ?? 999) - (order[b] ?? 999);
+ });
+ const playUrls = [];
+ sortedQualities.forEach(q => playUrls.push(q, urlMap[q]));
+ if (playUrls.length > 0) return JSON.stringify({ parse: 0, url: playUrls });
+ } catch (e) { }
+ return JSON.stringify({ parse: 0, url: id });
+ }
+
+ if (/百度/.test(flag)) {
+ const response = await request(`${rule.百度.detailHost}${rule.百度.play}`, {
+ method: 'POST', headers: aggConfig.headers.baidu, data: { "method": "post", "vid": vid }
+ });
+ let json = JSON.parse(response)["video/relate"]?.data?.cur_video;
+ if (!json?.clarityUrl) return JSON.stringify({ parse: 0, url: id });
+ let urls = json.clarityUrl.filter(item => item.url && item.title).map(item => ({ title: item.title, url: item.url, order: { '蓝光': 1, '超清': 2, '标清': 3 }[item.title] || 999 })).sort((a, b) => a.order - b.order).flatMap(item => [item.title, item.url]);
+ return JSON.stringify({ parse: urls.length > 0 ? 0 : 1, url: urls.length > 0 ? urls : id });
+ }
+ }
+
+ if (/河马/.test(flag)) {
+ try {
+ let arr = id.split("++");
+ let chapterId = arr[0], bookId = arr[2];
+ let fsbody = JSON.stringify({ "bookId": bookId, "chapterId": chapterId, "unClockType": "pay", "confirmPay": 2, "autoPayFlag": true, "omap": { "channelName": "精选", "logId": "17a6500357709bb2547e1e122b438cfc", "originName": "书城", "recId": "bigdata_rec", "scene": "nsc_727", "sceneId": "dzmf_video_sc_reco", "strategyId": "g6y6b5sq" } });
+ let fsbodyEnc = hemaEncrypt(fsbody);
+ let response = await request(rule.河马.host + rule.河马.play, {
+ method: 'POST', headers: { ...hema_headers, 'Content-Type': 'application/x-www-form-urlencoded' }, data: fsbodyEnc
+ });
+ let res = JSON.parse(response);
+ let fshtml = res.data;
+ if (fshtml) {
+ let fsdata = hemaDecrypt(fshtml);
+ if (fsdata && fsdata !== '{}') {
+ let parsed = JSON.parse(fsdata);
+ if (parsed.chaptersPayType == '免费') {
+ let url = parsed.chapterInfo?.[0]?.content?.m3u8720p || [];
+ if (url) return JSON.stringify({ parse: 0, url: url });
+ }
+ }
+ }
+ let playurl = "https://api.cenguigui.cn/api/duanju/hema.php?book_id=" + bookId + "&video_id=" + chapterId + "&type=mp4";
+ return JSON.stringify({ parse: 0, url: playurl + '#isVideo=true#' });
+ } catch (e) {
+ return JSON.stringify({ parse: 0, url: id });
+ }
+ }
+
+ if (/牛牛/.test(flag)) {
+ const inputArr = id.split('+');
+ if (inputArr.length === 2) {
+ let ep = inputArr[0].match(/\d+/)?.[0] || "";
+ let videoId = inputArr[1];
+ let response = await request(`${rule.牛牛.host}/api/v1/app/play/movieDetails`, {
+ method: 'POST', headers: niuniu_headers, data: { "id": videoId, "source": 0, "typeId": "S1", "userId": "546932", "episodeId": ep }
+ });
+ let result = JSON.parse(response);
+ if (result.code == 200 && result.data?.url) return JSON.stringify({ parse: 0, url: result.data.url });
+ } else if (inputArr.length === 3) {
+ let index = inputArr[0], lock_type = inputArr[1], thirdPlayId = inputArr[2];
+ let data1 = `not_include=0&lock_free=1&type=1&clientVersion=v5.2.5&uuid=6IDYUSASPQY5BBVACWQW3LLTPV4V7DE26UOCX5TZTVUGX4VUJNXQ01&resolution=1080*2320&openudid=82f4175d577a2939&dt=22021211RC&os_api=31&install_id=1496879012031075&sdk_version=1.1.3.0&siteid=5627189&dev_log_aid=667431&oaid=abec0dfff623201b×tamp=1752498494&direction=0&ac=mobile&os=Android&vod_version=1.10.21.6-tob&os_version=12&count=1&index=1&shortplay_id=${thirdPlayId}&sha1=46121F77CE2FCAD3DBC3B9EC8A24908C1A8AD6D9&device_brand=Redmi&package_name=com.niuniu.ztdh.app`;
+ if (lock_type === "free") {
+ let frhtml = await niuniuPost(rule.牛牛.detail2, data1, index);
+ if (frhtml?.data?.list?.[0]) {
+ let url = base64Decode(frhtml.data.list[0].video_model.video_list.video_1.main_url);
+ return JSON.stringify({ parse: 0, url });
+ }
+ } else {
+ let unlockData = `ac=mobile&os=Android&vod_version=1.10.21.6-tob&os_version=12&lock_ad=3&lock_free=3&type=1&clientVersion=v5.2.5&uuid=6IDYUSASPQY5BBVACWQW3LLTPV4V7DE26UOCX5TZTVUGX4VUJNXQ01&resolution=1080*2320&openudid=82f4175d577a2939&shortplay_id=${thirdPlayId}&dt=22021211RC&sha1=46121F77CE2FCAD3DBC3B9EC8A24908C1A8AD6D9&lock_index=21&os_api=31&install_id=1496879012031075&device_brand=Redmi&sdk_version=1.1.3.0&package_name=com.niuniu.ztdh.app&siteid=5627189&dev_log_aid=667431&oaid=abec0dfff623201b×tamp=1752498493`;
+ await niuniuPost(rule.牛牛.unlock, unlockData, index);
+ let unhtml = await niuniuPost(rule.牛牛.detail2, data1, index);
+ if (unhtml?.data?.list?.[0]) {
+ let url = base64Decode(unhtml.data.list[0].video_model.video_list.video_1.main_url);
+ return JSON.stringify({ parse: 0, url });
+ }
+ }
+ }
+ return JSON.stringify({ parse: 0, url: id });
+ }
+
+ if (/围观/.test(flag)) {
+ try {
+ let playSetting = typeof id === 'string' ? JSON.parse(id) : id;
+ let urls = [];
+ if (playSetting.super) urls.push("超清", playSetting.super);
+ if (playSetting.high) urls.push("高清", playSetting.high);
+ if (playSetting.normal) urls.push("流畅", playSetting.normal);
+ return JSON.stringify({ parse: 0, url: urls.length ? urls : id });
+ } catch (e) {
+ return JSON.stringify({ parse: 0, url: id });
+ }
+ }
+
+ return JSON.stringify({ parse: 0, url: id });
+}
+
+// ==================== 工具函数 ====================
+function buildUrlQuery(params) {
+ return Object.keys(params).map(k => `${encodeURIComponent(k)}=${encodeURIComponent(params[k])}`).join('&');
+}
+
+async function md5(str) {
+ return CryptoJS.MD5(str).toString(CryptoJS.enc.Hex).toLowerCase();
+}
+
+function base64Encode(text) {
+ return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(text));
+}
+
+function base64Decode(text) {
+ return CryptoJS.enc.Utf8.stringify(CryptoJS.enc.Base64.parse(text));
+}
+
+function hmacSHA256(data, key) {
+ return CryptoJS.HmacSHA256(data, key).toString(CryptoJS.enc.Hex);
+}
+
+function aesEncryptECB(text, keyStr) {
+ let key = CryptoJS.enc.Utf8.parse(keyStr);
+ return CryptoJS.AES.encrypt(text, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }).toString();
+}
+
+function aesDecryptECB(ciphertext, keyStr) {
+ let key = CryptoJS.enc.Utf8.parse(keyStr);
+ return CryptoJS.AES.decrypt(ciphertext, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }).toString(CryptoJS.enc.Utf8);
+}
+
+function hemaEncrypt(plaintext) {
+ let key = CryptoJS.enc.Hex.parse("647a6b6a67667978677368796c677a6d");
+ let iv = CryptoJS.enc.Hex.parse("6170697570646f776e65646372797074");
+ let encrypted = CryptoJS.AES.encrypt(plaintext, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
+ return encrypted.ciphertext.toString(CryptoJS.enc.Hex).toUpperCase();
+}
+
+function hemaDecrypt(word) {
+ let key = CryptoJS.enc.Hex.parse("647a6b6a67667978677368796c677a6d");
+ let iv = CryptoJS.enc.Hex.parse("6170697570646f776e65646372797074");
+ let srcs = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Hex.parse(word));
+ let decrypt = CryptoJS.AES.decrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
+ return decrypt.toString(CryptoJS.enc.Utf8);
+}
+
+async function niuniuPost(url1, data1, index) {
+ let t10 = String(Math.floor(Date.now() / 1000));
+ let X_Nonce = "X9UknYKtLa3DmtjC";
+ let body1 = data1.replace(/&lock_free=\d+/, "&lock_free=1").replace(/×tamp=\d+/, "×tamp=" + t10).replace(/&count=\d+/, "&count=1").replace(/&index=\d+/, "&index=" + index).replace(/&lock_ad=\d+/, "&lock_ad=1").replace(/&lock_index=\d+/, "&lock_index=" + index);
+ let body2 = aesEncryptECB(body1, 'ce49b18dd4e0a4d8');
+ let signature = hmacSHA256(t10 + X_Nonce + body1, 'aceaa47f96b4875d446b2e1d97e03bbb');
+ let res = await request(url1, {
+ method: 'POST',
+ headers: { 'X-Salt': 'FD8188A8D5', 'X-Nonce': X_Nonce, 'X-Timestamp': t10, 'X-Access-Token': niuniu_access_token, 'X-Signature': signature, 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'okhttp/4.12.0' },
+ data: body2
+ });
+ if (!res) return {};
+ try { return JSON.parse(aesDecryptECB(res, 'ce49b18dd4e0a4d8')); } catch (e) { return {}; }
+}
+
+async function request(url, options = {}) {
+ let reqHeaders = { ...aggConfig.headers.form, ...options.headers };
+ let finalUrl = url;
+ let requestData = options.data;
+ let useBody = false;
+
+ // POST + 字符串 + form类型 → 直接作为body发送(保留空格,牛牛接口需要)
+ if (options.method === 'POST' && typeof options.data === 'string' && reqHeaders['Content-Type']?.includes('form')) {
+ useBody = true;
+ }
+
+ // GET请求处理
+ if ((options.method === 'GET' || !options.method) && options.data && !useBody) {
+ let queryData = options.data;
+ if (typeof queryData === 'string') {
+ try { queryData = JSON.parse(queryData); } catch (e) { queryData = {}; }
+ }
+ finalUrl = url + (url.includes('?') ? '&' : '?') + buildUrlQuery(queryData);
+ requestData = null;
+ }
+
+ // 确定postType(关键!告诉req如何处理data)
+ let postType = '';
+ if (!useBody && options.data) {
+ let ct = reqHeaders['Content-Type'] || '';
+ postType = ct.includes('json') ? 'json' : (ct.includes('form') ? 'form' : '');
+ }
+
+ try {
+ const res = await req(finalUrl, {
+ method: options.method || 'GET',
+ headers: reqHeaders,
+ ...(useBody ? { body: requestData } : { data: requestData, postType: postType }),
+ timeout: options.timeout || 15000
+ });
+ return res?.content || res?.data || res;
+ } catch (e) {
+ log(2, '请求', e.message);
+ return null;
+ }
+}
+
+// ==================== 导出 ====================
+export function __jsEvalReturn() {
+ return { init, home, homeVod, category, detail, play, search };
+}
\ No newline at end of file
diff --git a/jaychouqq/yingshi/js7/mwcy.js b/jaychouqq/yingshi/js7/mwcy.js
new file mode 100644
index 00000000..bb8f941a
--- /dev/null
+++ b/jaychouqq/yingshi/js7/mwcy.js
@@ -0,0 +1,589 @@
+/**
+ * title: "喵物次元",
+ * logo: "https://www.mwcy.net/favicon.ico",
+ * more: {
+ * sourceTag: "动漫"
+ * }
+ */
+import { Crypto, load, _ } from 'assets://js/lib/cat.js';
+
+const HOST = 'https://www.mwcy.net';
+const UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36';
+
+let siteKey = "", siteType = "", sourceKey = "", ext = "";
+
+function init(cfg) {
+ siteKey = cfg.skey;
+ siteType = cfg.stype;
+ sourceKey = cfg.sourceKey;
+ ext = cfg.ext;
+ // 如果ext传入则覆盖HOST(保持兼容)
+ if (ext && ext.indexOf('http') == 0) HOST = ext;
+}
+
+// ==================== 辅助函数 ====================
+function fixUrl(url) {
+ if (!url) return '';
+ url = url.trim();
+ if (url.startsWith('//')) return 'https:' + url;
+ if (url.startsWith('/')) return HOST + url;
+ return url;
+}
+
+function cleanText(text) {
+ if (!text) return '';
+ return text.replace(/\s+/g, ' ').trim();
+}
+
+function isVideoFormat(url) {
+ if (!url) return false;
+ return /\.(m3u8|mp4|mkv|flv|avi|mov|wmv|webm)(\?.*)?$/i.test(url);
+}
+
+// ==================== 1. 首页内容与筛选配置 ====================
+function home(filter) {
+ // 固定分类(6个)
+ const classes = [
+ { type_id: "1", type_name: "番剧" },
+ { type_id: "22", type_name: "连载新番" },
+ { type_id: "24", type_name: "国漫" },
+ { type_id: "2", type_name: "剧场" },
+ { type_id: "25", type_name: "欧美动漫" },
+ { type_id: "26", type_name: "4K专区" }
+ ];
+
+ // ---- 公共筛选选项 ----
+ // 年份:当前年份往前30年 + 更早
+ const yearList = (() => {
+ const years = [{ n: "全部", v: "" }];
+ const currentYear = new Date().getFullYear();
+ for (let y = currentYear; y >= currentYear - 30; y--) {
+ years.push({ n: String(y), v: String(y) });
+ }
+ years.push({ n: "更早", v: "更早" });
+ return years;
+ })();
+
+ // 字母
+ const letterList = (() => {
+ const letters = [{ n: "全部", v: "" }];
+ const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');
+ chars.forEach(c => letters.push({ n: c, v: c }));
+ letters.push({ n: "0-9", v: "0-9" });
+ return letters;
+ })();
+
+ // 排序
+ const orderList = [
+ { n: "最新", v: "time" },
+ { n: "最热", v: "hits" },
+ { n: "评分", v: "score" }
+ ];
+
+ // 地区(用于剧场、欧美动漫)
+ const areaList = [
+ { 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: "意大利" },
+ { n: "西班牙", v: "西班牙" },
+ { n: "加拿大", v: "加拿大" },
+ { n: "其他", v: "其他" }
+ ];
+
+ // ---- 按分类配置筛选器 ----
+ const filters = {
+ "1": [ // 番剧
+ { key: "year", name: "年份", value: yearList },
+ { key: "letter", name: "字母", value: letterList },
+ { key: "order", name: "排序", value: orderList }
+ ],
+ "22": [ // 连载新番
+ { key: "year", name: "年份", value: yearList },
+ { key: "letter", name: "字母", value: letterList },
+ { key: "order", name: "排序", value: orderList }
+ ],
+ "24": [ // 国漫
+ { key: "year", name: "年份", value: yearList },
+ { key: "letter", name: "字母", value: letterList },
+ { key: "order", name: "排序", value: orderList }
+ ],
+ "2": [ // 剧场
+ { key: "area", name: "地区", value: areaList },
+ { key: "year", name: "年份", value: yearList },
+ { key: "letter", name: "字母", value: letterList },
+ { key: "order", name: "排序", value: orderList }
+ ],
+ "25": [ // 欧美动漫
+ { key: "area", name: "地区", value: areaList },
+ { key: "year", name: "年份", value: yearList },
+ { key: "letter", name: "字母", value: letterList },
+ { key: "order", name: "排序", value: orderList }
+ ],
+ "26": [ // 4K专区
+ { key: "letter", name: "字母", value: letterList },
+ { key: "order", name: "排序", value: orderList }
+ ]
+ };
+
+ return JSON.stringify({ class: classes, filters: filters });
+}
+
+// ==================== 2. 首页推荐视频 ====================
+async function homeVod() {
+ try {
+ const res = await req(HOST, { headers: { 'User-Agent': UA } });
+ const $ = load(res.content);
+
+ // 定位“十月新番”区域
+ let section = null;
+ $('.box-width.wow.fadeInUp .title .title-h').each((i, el) => {
+ if ($(el).text().trim() === '十月新番') {
+ section = $(el).closest('.box-width').find('.public-r');
+ return false;
+ }
+ });
+ if (!section) {
+ section = $('.public-list-box.public-pic-b').parent();
+ }
+
+ const items = section ? section.find('.public-list-box.public-pic-b') : $('.public-list-box.public-pic-b');
+ const videos = [];
+ const seen = new Set();
+
+ items.each((i, el) => {
+ const $el = $(el);
+ const $link = $el.find('a.public-list-exp');
+ const href = $link.attr('href');
+ if (!href || !href.startsWith('/bangumi/')) return;
+ const title = $el.find('.time-title').text().trim() || $link.attr('title') || '';
+ const pic = $link.find('img').attr('data-src') || $link.find('img').attr('src') || '';
+ const remarks = $el.find('.public-list-prb').text().trim() || '';
+ if (title && href) {
+ const vod_id = href.startsWith('http') ? href : HOST + href;
+ if (!seen.has(vod_id)) {
+ seen.add(vod_id);
+ videos.push({ vod_id, vod_name: title, vod_pic: pic, vod_remarks: remarks });
+ }
+ }
+ });
+
+ return JSON.stringify({ list: videos });
+ } catch (e) {
+ console.log('homeVod error:', e);
+ return null;
+ }
+}
+
+// ==================== 3. 分类内容爬取 ====================
+async function category(tid, pg, filter, extend) {
+ if (pg <= 0) pg = 1;
+ extend = extend || {};
+ const area = extend.area || '';
+ const year = extend.year || '';
+ const letter = extend.letter || '';
+ const order = extend.order || '';
+
+ // 构建URL
+ let url = `${HOST}/show/${tid}`;
+ const parts = [];
+ if (area) parts.push(`area/${encodeURIComponent(area)}`);
+ if (order) parts.push(`by/${encodeURIComponent(order)}`);
+ if (letter) parts.push(`letter/${encodeURIComponent(letter)}`);
+ if (year) parts.push(`year/${encodeURIComponent(year)}`);
+ if (pg > 1) parts.push(`page/${pg}`);
+
+ if (parts.length > 0) {
+ url += '/' + parts.join('/') + '.html';
+ } else {
+ url += (pg === 1 ? '.html' : `/page/${pg}.html`);
+ }
+
+
+ try {
+ const res = await req(url, { headers: { 'User-Agent': UA } });
+ const $ = load(res.content);
+
+ // 解析视频列表(多级兜底)
+ let items = $('.public-list-box.public-pic-b');
+ if (!items.length) items = $('.public-list-div').parent();
+
+ const videos = [];
+ const seen = new Set();
+
+ items.each((i, el) => {
+ const $el = $(el);
+ const $link = $el.find('a.public-list-exp');
+ const href = $link.attr('href');
+ if (!href) return;
+
+ let vod_id = href;
+ if (!href.startsWith('http')) vod_id = HOST + href;
+ // 如果是 /play/ 链接,转换为 /bangumi/
+ if (href.startsWith('/play/')) {
+ const match = href.match(/^\/play\/([^-]+)/);
+ if (match) {
+ vod_id = HOST + `/bangumi/${match[1]}.html`;
+ } else {
+ return;
+ }
+ } else if (!href.startsWith('/bangumi/')) {
+ return;
+ }
+
+ const title = $el.find('.time-title').text().trim() || $link.attr('title') || '';
+ const pic = $link.find('img').attr('data-src') || $link.find('img').attr('src') || '';
+ const remarks = $el.find('.public-list-prb').text().trim() || '';
+ if (title && vod_id && !seen.has(vod_id)) {
+ seen.add(vod_id);
+ videos.push({
+ vod_id,
+ vod_name: title,
+ vod_pic: fixUrl(pic),
+ vod_remarks: remarks
+ });
+ }
+ });
+
+ // 提取总页数
+ let pagecount = 1;
+ const pageTip = $('.page-tip').text().trim();
+ if (pageTip) {
+ const match = pageTip.match(/当前\d+\/(\d+)页/);
+ if (match) pagecount = parseInt(match[2]) || 1;
+ }
+ if (pagecount === 1) {
+ const lastPage = $('.page-link').last().attr('href');
+ if (lastPage) {
+ const m = lastPage.match(/page\/(\d+)\.html/);
+ if (m) pagecount = parseInt(m[1]) || 1;
+ }
+ }
+
+ return JSON.stringify({
+ list: videos,
+ page: pg,
+ pagecount: pagecount,
+ limit: 20,
+ total: videos.length
+ });
+ } catch (e) {
+ console.log('category error:', e);
+ return JSON.stringify({ list: [] });
+ }
+}
+
+// ==================== 4. 搜索功能 ====================
+async function search(wd) {
+ try {
+ const encoded = encodeURIComponent(wd);
+ const url = `${HOST}/search/wd/${encoded}.html`;
+
+ const res = await req(url, { headers: { 'User-Agent': UA } });
+ const $ = load(res.content);
+
+ // 搜索页结果使用 .vod-detail.search-list
+ let items = $('.vod-detail.search-list');
+ if (!items.length) items = $('.vod-detail');
+
+ const videos = [];
+ const seen = new Set();
+
+ items.each((i, el) => {
+ const $el = $(el);
+ // 标题和链接
+ let title = '';
+ let vod_id = '';
+ const titleEl = $el.find('h3.slide-info-title');
+ if (titleEl.length) title = titleEl.text().trim();
+
+ const linkEl = $el.find('a[target="_blank"]');
+ if (linkEl.length) {
+ const href = linkEl.attr('href');
+ if (href) {
+ if (href.startsWith('/bangumi/')) {
+ vod_id = HOST + href;
+ } else if (href.startsWith('/play/')) {
+ const match = href.match(/^\/play\/([^-]+)/);
+ if (match) vod_id = HOST + `/bangumi/${match[1]}.html`;
+ }
+ }
+ if (!title) title = linkEl.text().trim();
+ }
+ if (!title) {
+ // 从其他位置找
+ const altTitle = $el.find('.slide-info-title').text().trim();
+ if (altTitle) title = altTitle;
+ }
+
+ const pic = $el.find('.detail-pic img').attr('data-src') || $el.find('.detail-pic img').attr('src') || '';
+ const remarks = $el.find('.slide-info-remarks').first().text().trim() || '';
+
+ if (title && vod_id && !seen.has(vod_id)) {
+ seen.add(vod_id);
+ videos.push({
+ vod_id,
+ vod_name: title,
+ vod_pic: fixUrl(pic),
+ vod_remarks: remarks
+ });
+ }
+ });
+
+ // 总页数
+ let pagecount = 1;
+ const pageTip = $('.page-tip').text().trim();
+ if (pageTip) {
+ const match = pageTip.match(/当前\d+\/(\d+)页/);
+ if (match) pagecount = parseInt(match[2]) || 1;
+ }
+ return JSON.stringify({
+ list: videos,
+ page: 1,
+ pagecount: pagecount,
+ limit: 20,
+ total: videos.length
+ });
+ } catch (e) {
+ console.log('search error:', e);
+ return JSON.stringify({ list: [] });
+ }
+}
+
+// ==================== 5. 详情页解析 ====================
+async function detail(id) {
+ try {
+ const url = id.startsWith('http') ? id : HOST + id;
+ const res = await req(url, { headers: { 'User-Agent': UA } });
+ const $ = load(res.content);
+
+ // 标题
+ let vod_name = $('h3.slide-info-title').text().trim();
+ if (!vod_name) vod_name = $('.player-title-link').text().trim();
+ if (!vod_name) vod_name = $('title').text().replace(/^.*? - /, '').replace(/ - .*$/, '');
+
+ // 封面
+ let vod_pic = $('.detail-pic img').attr('data-src') || $('.detail-pic img').attr('src') || '';
+ if (!vod_pic) vod_pic = $('.vod-detail .detail-pic img').attr('data-src') || '';
+
+ // 简介
+ let vod_content = $('#height_limit').text().trim() || $('.vod-news .text').first().text().trim() || '';
+
+ // 元数据:年份、地区、类型
+ let vod_year = '', vod_area = '';
+ $('.slide-info .slide-info-remarks a').each((i, el) => {
+ const text = $(el).text().trim();
+ if (/^\d{4}$/.test(text)) vod_year = text;
+ else if (['日本','大陆','香港','台湾','美国','英国','韩国','法国','德国','泰国','印度','意大利','西班牙','加拿大','其他'].includes(text)) {
+ vod_area = text;
+ }
+ });
+ // 类型
+ // ---- 提取演员和导演 ----
+ let vod_actor = '', vod_director = '', type_name = '';
+
+ // 方式1:从 .slide-info.partition 中提取
+ $('.slide-info.partition').each((i, el) => {
+ const $el = $(el);
+
+ // 类型
+ const typeStrong = $el.find('strong:contains("类型")');
+ if (typeStrong.length) {
+ const typeLinks = typeStrong.nextAll('a').map((j, a) => $(a).text().trim()).get();
+ if (typeLinks.length) type_name = typeLinks.join(',');
+ }
+ // 导演
+ const dirStrong = $el.find('strong:contains("导演")');
+ if (dirStrong.length) {
+ const dirLinks = dirStrong.nextAll('a').map((j, a) => $(a).text().trim()).get();
+ if (dirLinks.length) vod_director = dirLinks.join(',');
+ }
+ // 演员
+ const actorStrong = $el.find('strong:contains("演员")');
+ if (actorStrong.length) {
+ const actorLinks = actorStrong.nextAll('a').map((j, a) => $(a).text().trim()).get();
+ if (actorLinks.length) vod_actor = actorLinks.join(',');
+ }
+ });
+
+ // ---- 播放源与剧集 ----
+ const playFrom = [];
+ const playUrls = [];
+
+ // 获取线路名称
+ const sourceNames = [];
+ $('.anthology-tab a').each((i, el) => {
+ let name = $(el).text().trim();
+ name = name.replace(/
]*>.*?<\/i>/, '').replace(/ /g, '').replace(/]*>.*?<\/span>/, '').trim();
+ if (name) sourceNames.push(name);
+ });
+ if (!sourceNames.length) {
+ $('.vod-playerUrl').each((i, el) => {
+ let name = $(el).text().trim();
+ name = name.replace(/]*>.*?<\/i>/, '').replace(/]*>.*?<\/span>/, '').trim();
+ if (name) sourceNames.push(name);
+ });
+ }
+
+ const boxes = $('.anthology-list-box');
+ if (boxes.length && sourceNames.length) {
+ boxes.each((idx, box) => {
+ const name = sourceNames[idx] || ('线路' + (idx+1));
+ const episodes = [];
+ $(box).find('ul.anthology-list-play li a').each((j, ep) => {
+ const $ep = $(ep);
+ let epName = $ep.find('span').text().trim() || $ep.text().trim();
+ let href = $ep.attr('href');
+ if (epName && href) {
+ href = fixUrl(href);
+ episodes.push(epName + '$' + href);
+ }
+ });
+ if (episodes.length) {
+ playFrom.push(name);
+ playUrls.push(episodes.join('#'));
+ }
+ });
+ }
+
+ if (!playFrom.length) {
+ const singleBox = $('.anthology-list-play');
+ if (singleBox.length) {
+ const episodes = [];
+ singleBox.find('li a').each((j, ep) => {
+ const $ep = $(ep);
+ let epName = $ep.find('span').text().trim() || $ep.text().trim();
+ let href = $ep.attr('href');
+ if (epName && href) {
+ href = fixUrl(href);
+ episodes.push(epName + '$' + href);
+ }
+ });
+ if (episodes.length) {
+ playFrom.push('默认线路');
+ playUrls.push(episodes.join('#'));
+ }
+ }
+ }
+
+ const vod = {
+ vod_id: id,
+ vod_name,
+ vod_pic: fixUrl(vod_pic),
+ type_name,
+ vod_actor: vod_actor,
+ vod_director: vod_director,
+ vod_year,
+ vod_area,
+ vod_remarks: '',
+ vod_content,
+ vod_play_from: playFrom.join('$$$'),
+ vod_play_url: playUrls.join('$$$')
+ };
+
+ return JSON.stringify({ list: [vod] });
+ } catch (e) {
+ console.log('detail error:', e);
+ return null;
+ }
+}
+
+// ==================== 6. 播放链接解析 ====================
+async function play(flag, id, flags) {
+ try {
+ const playUrl = id.startsWith('http') ? id : HOST + id;
+ const res = await req(playUrl, { headers: { 'User-Agent': UA } });
+ const html = res.content;
+
+ const match = html.match(/player_.*?=([^]*?));
+ if (!match) return JSON.stringify({ parse: 1, url: playUrl });
+
+ const config = JSON.parse(match[1]);
+ let videoUrl = (config.url || '').trim();
+ if (!videoUrl) return JSON.stringify({ parse: 1, url: playUrl });
+
+ const directVideoPattern = /\.(m3u8|mp4|mkv|flv|avi|mov|wmv|webm)(\?.*)?$/i;
+ if (directVideoPattern.test(videoUrl)) {
+ console.log('videoUrl:', videoUrl);
+ return JSON.stringify({ parse: 0, url: videoUrl });
+ }
+
+ const tryParse = async (apiPath) => {
+ try {
+ const apiUrl = `https://player.catw.moe${apiPath}${encodeURIComponent(videoUrl)}&_t=${Date.now()}`;
+ const res = await req(apiUrl, { headers: { 'User-Agent': UA } });
+ const html = res.content;
+ // 提取 uid
+ const uidMatch = html.match(/"uid"\s*:\s*"([^"]+)"/);
+ const uid = uidMatch ? uidMatch[1] : null;
+ console.log('uid:', uid);
+ // 提取 url (ConFig 根层级那个长字符串)
+ const urlMatch = html.match(/"url"\s*:\s*"([^"]+)"/);
+ const url = urlMatch ? urlMatch[1] : null;
+ console.log('url:', url);
+ if (!uid || !url) {
+ console.log('[喵物次元] ConFig 缺少 uid 或 url');
+ return null;
+ }
+
+ const realUrl = decryptEcUrl(url, uid);
+ if (realUrl) {
+ return { url: realUrl, ua: UA };
+ }
+ return null;
+ } catch (e) {
+ return null;
+ }
+ };
+
+ let parsed = await tryParse('/player/ec.php?code=qw&if=1&url=');
+ if (!parsed) parsed = await tryParse('/art.php?url=');
+
+ if (parsed) {
+ return JSON.stringify({
+ parse: 0,
+ url: parsed.url,
+ header: { 'User-Agent': parsed.ua }
+ });
+ }
+
+ return JSON.stringify({ parse: 1, url: playUrl });
+ } catch (e) {
+ return JSON.stringify({ parse: 1, url: id });
+ }
+}
+
+function decryptEcUrl(encryptedBase64, uid) {
+ try {
+ const aesKey = '2890' + uid + 'tB959C';
+ const aesIv = '2F131BE91247866E';
+ // aesX(算法, 加密?false=解密, 数据, 输入是Base64?, key, iv, 输出是Base64?)
+ const realUrl = aesX('AES/CBC/PKCS7', false, encryptedBase64, true, aesKey, aesIv, false);
+ console.log(realUrl)
+ return realUrl;
+ } catch (e) {
+ return null;
+ }
+}
+
+// ==================== 导出 ====================
+export function __jsEvalReturn() {
+ return {
+ init,
+ home,
+ homeVod,
+ category,
+ detail,
+ play,
+ search
+ };
+}
\ No newline at end of file
diff --git a/jaychouqq/yingshi/json1/4K在线.json b/jaychouqq/yingshi/json1/4K在线.json
new file mode 100644
index 00000000..012dbc1c
--- /dev/null
+++ b/jaychouqq/yingshi/json1/4K在线.json
@@ -0,0 +1,19 @@
+
+{
+ "作者":"20260317",
+ "站名":"4K在线-永久发布页https://4kfabuye.top/",
+ "主页url": "https://bbibi.cc/",
+ "请求头": "User-Agent$MOBILE_UA",
+ "简介":"description\" content=\"&&\"",
+ "线路二次截取": "播放地址&&",
+ "线路数组": "",
+ "线路标题": ">&&<",
+ "播放数组": "text-muted col-pd\">&&",
+ "标题": "alt=\"&&\"",
+ "图片": "https://+src=\"https*src=&&\"",
+ "副标题": "update\">&& +icon-star2\">&& ",
+ "链接前缀": "https://www.4kvm.org",
+ "链接": "href=\"&&\"",
+ "导演": "导演*>&&",
+ "主演": "主演*>&&",
+ "简介": "👉【提醒:请不要相信视频中的广告以免上当受骗!】,+description\" content=\"&&\"",
+ "线路数组": "se-q'>&&",
+ "线路标题": "专线",
+ "多线数组": "se-q'>&&",
+ "多线链接": "href=\"&&\"",
+ "搜索url": "https://www.4kvm.org/search?q={wd}",
+ "搜索模式": "1",
+ "搜索数组": "[包含:/play/]",
+ "搜索标题": "alt=\"&&\"",
+ "搜索图片": "https://+src=\"https*src=&&\"",
+ "搜索链接前缀": "https://www.4kvm.org",
+ "搜索链接": "href=\"&&\"",
+ "倒序": "0",
+ "播放列表": "[包含:/play/]",
+ "播放标题": "&&&&",
+"图片": "src=\"&&\"",
+"标题":"class=\"title\">&&",
+"链接":"href=\"&&\"",
+"搜索":"https://www.4kcabin.com/vodsearch/-------------.html?wd={wd}",
+"分类":"电影$dianying#连续剧$dianshiju#综艺$zongyi#动漫$dongman#短剧$duanju",
+"分类url": "https://www.4kcabin.com/vodshow/{cateId}-{area}--{class}-----{catePg}---{year}.html"
+}
diff --git a/jaychouqq/yingshi/json1/Auete.json b/jaychouqq/yingshi/json1/Auete.json
new file mode 100644
index 00000000..e7c7a85c
--- /dev/null
+++ b/jaychouqq/yingshi/json1/Auete.json
@@ -0,0 +1,80 @@
+{
+ "作者": "菜妮丝,修复首页与分页不同",
+ "站名": "Auete影视地址发布页https://v.auete.com/",
+ "主页url": "https://www.au1080.com/",
+
+ "分类": "电影$Movie#电视剧$Tv#综艺$Zy#动漫$Dm#其他$qita",
+ //"分类url": "https://auete.top/{cateId}{class}/index{catePg}.html[https://auete.com/{cateId}/index.html]",
+ "分类url": "https://www.au1080.com/{cateId}{class}/index{catePg}.html",
+ "起始页": "2",
+ "数组": "",
+ "副标题": "hdtag\">&&<",
+
+ "搜索模式": "1",
+ "搜索url": "/aueteso.php?searchword={wd}",
+ "搜索数组": "mb-0\">&&",
+ "搜索图片": "空",
+ "搜索标题": "text-danger\">&&<",
+ "搜索链接": "data-href=\"&&\"",
+
+ "影片地区": "地区:&&",
+ "影片类型": "分类:&&",
+ "导演": "导演:&&",
+ "主演": "主演:&&",
+ "简介": "&&
",
+
+ "线路数组": "&&small>",
+ "线路标题": ">&&<[替换:『*』>>空#:>>空]",
+
+ "播放数组": "",
+
+ "筛选":{
+"Movie":[
+ {"key":"class","name":"剧情","value":[
+ {"n":"全部","v":""},
+ {"n":"喜剧片","v":"/xjp"},
+ {"n":"动作片","v":"/dzp"},
+ {"n":"爱情片","v":"/aqp"},
+ {"n":"科幻片","v":"/khp"},
+ {"n":"恐怖片","v":"/kbp"},
+ {"n":"惊悚片","v":"/jsp"},
+ {"n":"战争片","v":"/zzp"},
+ {"n":"剧情片","v":"/jqp"}]}],
+
+"Tv":[
+ {"key":"class","name":"剧情","value":[
+ {"n":"全部","v":""},
+ {"n":"美剧","v":"/oumei"},
+ {"n":"韩剧","v":"/hanju"},
+ {"n":"日剧","v":"/riju"},
+ {"n":"泰剧","v":"/yataiju"},
+ {"n":"网剧","v":"/wangju"},
+ {"n":"台剧","v":"/taiju"},
+ {"n":"国产","v":"/neidi"},
+ {"n":"港剧","v":"/tvbgj"},
+ {"n":"英剧","v":"/yingju"}]}],
+
+"Zy":[
+ {"key":"class","name":"剧情","value":[
+ {"n":"全部","v":""},
+ {"n":"国综","v":"/guozong"},
+ {"n":"韩综","v":"/hanzong"},
+ {"n":"美综","v":"/meizong"}]}],
+
+"Dm":[
+ {"key":"class","name":"剧情","value":[
+ {"n":"全部","v":""},
+ {"n":"动画","v":"/donghua"},
+ {"n":"日漫","v":"/riman"},
+ {"n":"国漫","v":"/guoman"},
+ {"n":"美漫","v":"/meiman"}]}],
+
+"qita":[
+ {"key":"class","name":"剧情","value":[
+ {"n":"全部","v":""},
+ {"n":"记录片","v":"/Jlp"},
+ {"n":"经典片","v":"/Jdp"},
+ {"n":"经典剧","v":"/Jdj"},
+ {"n":"网大电影","v":"/wlp"},
+ {"n":"国产老电影","v":"/laodianying"}]}]}
+}
\ No newline at end of file
diff --git a/jaychouqq/yingshi/json1/CNN影视.json b/jaychouqq/yingshi/json1/CNN影视.json
new file mode 100644
index 00000000..af881137
--- /dev/null
+++ b/jaychouqq/yingshi/json1/CNN影视.json
@@ -0,0 +1,34 @@
+ {
+ "站名": "🎈️CNN影视🎈",
+ "播放请求头": "User-Agent$Mozilla/5.0",
+ "二次截取": "videoList*[&&]",
+ "数组": "{&&}",
+ "图片": "https://obs.3688baihuo.com/+huo.com/&&\"",
+ "标题": "\"vodName\":\"&&\"",
+ "副标题": "vodRemarks\":\"(&&\"",
+ "链接": "\"vodId\":&&,",
+ "链接前缀": "https://m.shunhengdf.com/detail/",
+ "简介": "简介:&&\"",
+
+ "搜索url": "https://m.shunhengdf.com/vod/search/{wd}",
+ "搜索副标题": "class=\"boottom\"*&&
",
+ "线路标题": ">&&",
+
+ "播放数组":"episodeList\":\\[&&\\][替换:nid\":>>nid\":/1/]",
+ "播放列表":"{&&}",
+ "播放标题":"name\":\"&&\"",
+
+ "播放链接前缀":"https://m.shunhengdf.com/vod/play/+data\":{\"vodId\":&&,",
+ "播放链接":"nid\":&&,",
+ "倒序":"0",
+ "跳转解析":"",
+ "跳转播放链接":"",
+
+ "分类url":"https://m.shunhengdf.com/vod/show/id/{cateId}/class/{class}/area/{area}/year/{year}/page/{catePg}",
+
+ "分类":"电影$1#电视剧$2#综艺$3#动漫$4"
+
+
+}
\ No newline at end of file
diff --git a/jaychouqq/yingshi/json1/Vidhub视频库.json b/jaychouqq/yingshi/json1/Vidhub视频库.json
new file mode 100644
index 00000000..fc124c44
--- /dev/null
+++ b/jaychouqq/yingshi/json1/Vidhub视频库.json
@@ -0,0 +1,138 @@
+//写法思路来海阔视界,xpath筛选。本人是海阔用户,所以搬了海阔的jsoup写法过来。2022年9月17日
+//jsoup规则写法请查阅海阔视界或者海阔影视相关教程。不支持js写法
+//本文档为完整模板,请不要去无中生有添加多余的键值参数。
+{
+ //规则名
+ "title": "Vidhub视频库",
+ //作者
+ "author": "香雅情",
+ //请求头UA,键名$键值,每一组用#分开,不填则默认okhttp/3.12.11,可填MOBILE_UA或PC_UA使用内置的手机版或电脑版UA
+ //多个请求头参数写法示例,"User-Agent$PC_UA#Referer$http://ww.baidu.com#Cookie$ser=ok",每一组用#分开。
+ //习惯查看手机源码写建议用手机版UA,习惯查看PC版源码写建议用电脑版UA
+ "Headers":"PC_UA",
+ //图片是否需要代理
+ "PicNeedProxy":"0",
+ //是否开启获取首页数据,0关闭,1开启
+ "homeContent":"1",
+ //首页推荐数据获取链接
+ "rcmed_url": "https://vidhub.tv",
+ //首页列表数组截取。
+ "home_arr_rule": "body&&.module-items",
+ //首页片单列表数组定位。
+ "hmepi_arr_rule": ".module-item:not(:contains(伦理片))",
+ //首页片单信息jsoup与正则截取写法切换,只作用于html网页,1为jsoup写法(默认),0为正则截取写法
+ "home_is_jsoup":"1",
+
+ //分类链接起始页码,禁止负数和含小数点。
+ "firstpage": "1",
+ //分类链接,{cateId}是分类,{catePg}是页码,第一页没有页码的可以这样写 第二页链接[firstPage=第一页的链接]
+ "class_url": "https://vidhub.tv/vodshow/{cateId}--hits------{catePg}---.html[firstPage=https://vidhub.tv/vodshow/{cateId}--hits---------.html]",
+ //分类名,分类1&分类2&分类3
+ "class_name": "电影&电视剧&动漫&综艺",
+ //分类名替换词,替换词1&替换词2&替换词3,替换词包含英文&的用两个中文&&代替,示例:&&id=0&&&id=1
+ "class_value": "1&2&4&3",
+ //筛选数据,json格式,参考xpath的筛选写法
+ "filterdata":{},
+
+ //分类页面截取数据模式,0为json,其它数字为普通网页。
+ "cat_mode": "1",
+ //分类列表数组定位,最多支持3层,能力有限,不是所有页面都能支持
+ "cat_arr_rule": ".module-items&&.module-item:not(:contains(伦理片))",
+ //分类片单信息jsoup与xb截取写法切换,只作用于html网页,1为jsoup写法(默认),0为xb写法
+ "cat_is_jsoup":"1",
+ //分类片单标题
+ "cat_title": "a&&title",
+ //分类片单链接
+ "cat_url": "a&&href",
+ //分类片单图片,支持自定义图片链接
+ "cat_pic": ".lazyloaded&&data-src",
+ //分类片单副标题
+ "cat_subtitle":".module-item-text&&Text",
+ //分类片单链接补前缀
+ "cat_prefix": "https://vidhub.tv",
+ //分类片单链接补后缀
+ "cat_suffix": "",
+
+ //搜索请求头参数,不填则默认okhttp/3.12.11,可填MOBILE_UA或PC_UA使用内置的手机版或电脑版UA
+ //多个请求头参数写法示例,键名$键值,每一组用#分开。"User-Agent$PC_UA#Referer$http://ww.baidu.com#Cookie$ser=ok"。
+ "SHeaders":"User-Agent$PC_UA",
+ //搜索链接,搜索关键字用{wd}表示,post请求的最后面加;post
+ //POST链接示例 http://www.lezhutv.com/index.php?m=vod-search;post
+ "search_url": "https://vidhub.tv/index.php/ajax/suggest?mid=1&wd={wd}&limit=50",
+ //POST搜索body,填写搜索关键字的键值,一般常见的是searchword和wd,不是POST搜索的可留空或删除。
+ "sea_PtBody":"wd={wd}&search=",
+
+ //搜索截取模式,0为json搜索,只支持列表在list数组里的,其它数字为网页截取。
+ "search_mode": "0",
+ //搜索列表数组定位,不填默认内置list,最多支持3层,能力有限,不是所有页面都能支持。
+ "sea_arr_rule": "list",
+ //搜索片单信息jsoup与xb截取写法切换,只作用于html网页,1为jsoup写法(默认),0为xb写法
+ "sea_is_jsoup":"1",
+ //搜索片单图片,支持自定义图片链接
+ "sea_pic": "pic",
+ //搜索片单标题
+ "sea_title": "name",
+ //搜索片单链接
+ "sea_url": "id",
+ //搜索片单副标题
+ "sea_subtitle":"",
+ //搜索片单链接补前缀
+ "search_prefix": "https://vidhub.tv/voddetail/",
+ //搜索片单链接补后缀,这个一般json搜索的需要
+ "search_suffix": ".html",
+
+ //片单链接是否直接播放,0否,1分类片单链接直接播放,2详情选集链接直接播放。
+ //设置成直接播放后,后面3个参数请注意该留空的请务必留空。
+ "force_play": "0",
+ //直接播放链接补前缀
+ "play_prefix": "https://live.52sf.ga/huya/",
+ //直接播放链接补后缀,设置为#isVideo=true#可强制识别为视频链接
+ "play_suffix": "#isVideo=true#",
+ //直接播放链接设置请求头,只对直链视频有效,每一组用#分开
+ "play_header": "authority$ku.peizq.online#Referer$https://play.peizq.online",
+
+ //项目信息jsoup与xb截取写法切换,1为jsoup写法(默认),0为xb写法
+ "proj_is_jsoup":"1",
+ //类型数据,截取前缀&&截取后缀
+ "proj_cate": ".video-info&&.video-info-aux&&Text",
+ //年代数据,截取前缀&&截取后缀
+ "proj_year": ".video-info&&.video-info-items,2&&Text",
+ //地区数据,截取前缀&&截取后缀
+ "proj_area": "",
+ //演员数据,截取前缀&&截取后缀
+ "proj_actor": ".video-info&&.video-info-items,1&&Text",
+ //简介内容,截取前缀&&截取后缀
+ "proj_plot": ".video-info&&.video-info-content&&Text",
+
+ //线路截取区域,如果不需要请把tab_title或tab_arr_rule置空或者全部不要填。
+ //线路截取数组
+ "tab_arr_rule": ".module-tab-items&&.module-tab-item",
+ //线路标题,截取前缀&&截取后缀
+ "tab_title": "Text",
+
+ //列表数组截取,必须
+ "list_arr_rule": "body&&.module-player-list",
+ //集数数组截取,必须
+ "epi_arr_rule": ".scroll-content&&a",
+ //集数标题,截取前缀&&截取后缀
+ "epi_title": "Text",
+ //集数链接,截取前缀&&截取后缀
+ "epi_url": "href",
+ //选集是否反转显示
+ "epi_reverse": "0",
+ //集数链接补前缀
+ "epiurl_prefix": "https://vidhub.tv",
+ //集数链接补后缀
+ "epiurl_suffix": "",
+
+ //下面几个参数请勿乱用。否则可能会有副作用。
+ //分析网页源码中有