Sync all projects

This commit is contained in:
github-actions[bot]
2026-07-03 14:44:27 +00:00
parent 76739f4491
commit fe482c649e
52 changed files with 23283 additions and 11320 deletions
+463
View File
@@ -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('&quot;', '"').replace('&apos;', "'").replace('&amp;', '&')
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'))
+6
View File
@@ -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|🔞",
+719
View File
@@ -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"
]
}
]
}
+6
View File
@@ -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|🔞[成人]",