866 lines
30 KiB
Plaintext
866 lines
30 KiB
Plaintext
// >>> 当前时间是:2026-08-18 12:49:57 <<<
|
|
// 关注微信公众号【太太太硬了】有惊喜哦!!!
|
|
|
|
// 当前接口:http://www.xn--sss604efuw.cc/tv
|
|
{
|
|
"spider": "https://zl.wpscdn.cn/2026/08/16/space_img/319d8350-dadc-4c0e-9555-15c65fd6dbdb.jpg;md5;ea8ab37f3d7bedd2bfa2b4b1e4d1eca4",
|
|
"wallpaper": "https://饭的动态壁纸.xxooo.cf/",
|
|
"sites": [
|
|
|
|
{
|
|
"key": "枫叶影视",
|
|
"name": "🍁枫叶4k",
|
|
"type": 3,
|
|
"jar":"https://s3plus.meituan.net/opapisdk/op_ticket_1_885190757_1786441652042_3gdAtt9a.zip;md5;72f76facb402366ab5f43d5dc6a45bf7",
|
|
"api": "csp_FengYe",
|
|
"searchable": 1,
|
|
"quickSearch": 1,
|
|
"filterable": 0,
|
|
"ext": "https://www.vip1949.com/"
|
|
},
|
|
{
|
|
"key": "SA视频",
|
|
"name": "七味网",
|
|
"type": 3,
|
|
"py":"# -*- coding: utf-8 -*-
|
|
# - SA 影视 (https://www.lsjys11.com/)
|
|
# 优化版:图片直链 + 视频代理 + 单线路
|
|
|
|
import re
|
|
import json
|
|
import sys
|
|
import requests
|
|
from urllib.parse import quote, unquote, urljoin, urlparse
|
|
from html import unescape
|
|
|
|
sys.path.append('..')
|
|
from base.spider import Spider
|
|
|
|
|
|
class Spider(Spider):
|
|
|
|
def getName(self):
|
|
return "SA影视"
|
|
|
|
def init(self, extend=""):
|
|
self.host = "https://www.lsjys11.com"
|
|
self.headers = {
|
|
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) 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/webp,*/*;q=0.8',
|
|
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
|
|
'Referer': self.host,
|
|
}
|
|
self.session = requests.Session()
|
|
adapter = requests.adapters.HTTPAdapter(pool_connections=10, pool_maxsize=30, max_retries=0)
|
|
self.session.mount('http://', adapter)
|
|
self.session.mount('https://', adapter)
|
|
self.timeout = 8
|
|
self.UA = self.headers['User-Agent']
|
|
|
|
def isVideoFormat(self, url):
|
|
pass
|
|
|
|
def manualVideoCheck(self):
|
|
pass
|
|
|
|
def destroy(self):
|
|
if hasattr(self, 'session'):
|
|
self.session.close()
|
|
|
|
CATEGORIES = {
|
|
"movie": {"name": "电影", "cat_id": 13},
|
|
"tv": {"name": "连续剧", "cat_id": 12},
|
|
"variety": {"name": "综艺", "cat_id": 11},
|
|
"anime": {"name": "动漫", "cat_id": 14},
|
|
"short": {"name": "短剧", "cat_id": 16},
|
|
"documentary": {"name": "纪录片", "cat_id": 15},
|
|
}
|
|
|
|
def _proxy_url(self, url, typ="m3u8"):
|
|
url = str(url or "").strip()
|
|
if not url:
|
|
return ""
|
|
try:
|
|
return self.getProxyUrl() + "&type=" + typ + "&url=" + quote(url, safe="")
|
|
except Exception:
|
|
return url
|
|
|
|
def _play_headers(self, url=""):
|
|
host = ""
|
|
try:
|
|
u = urlparse(url or self.host)
|
|
host = u.scheme + "://" + u.netloc + "/" if u.scheme and u.netloc else self.host
|
|
except Exception:
|
|
host = self.host
|
|
return {
|
|
"User-Agent": self.UA,
|
|
"Accept": "*/*",
|
|
"Connection": "keep-alive",
|
|
"Referer": self.host,
|
|
"Origin": self.host.rstrip("/"),
|
|
}
|
|
|
|
def _parse_nuxt(self, html):
|
|
m = re.search(r'<script[^>]*id="__NUXT_DATA__"[^>]*>(.*?)</script>', html, re.DOTALL)
|
|
if not m:
|
|
return None
|
|
try:
|
|
return json.loads(m.group(1))
|
|
except:
|
|
return None
|
|
|
|
def _extract_videos(self, data):
|
|
if not data:
|
|
return []
|
|
videos = []
|
|
for item in data:
|
|
if not isinstance(item, dict):
|
|
continue
|
|
if 'id' not in item or 'name' not in item or 'score' not in item:
|
|
continue
|
|
vid = item['id']
|
|
name = item['name']
|
|
if isinstance(vid, int) and vid < len(data):
|
|
vid = data[vid]
|
|
if isinstance(name, int) and name < len(data):
|
|
name = data[name]
|
|
if not isinstance(vid, str) or not isinstance(name, str):
|
|
continue
|
|
if len(vid) < 5:
|
|
continue
|
|
cover = ""
|
|
img_idx = item.get('img')
|
|
if isinstance(img_idx, int) and img_idx < len(data):
|
|
cover = data[img_idx]
|
|
if isinstance(cover, str) and cover.startswith("//"):
|
|
cover = "https:" + cover
|
|
score = ""
|
|
score_idx = item.get('score')
|
|
if isinstance(score_idx, int) and score_idx < len(data):
|
|
score = str(data[score_idx])
|
|
episodes = ""
|
|
if item.get('number'):
|
|
n = item['number']
|
|
if isinstance(n, int) and n < len(data):
|
|
episodes = str(data[n])
|
|
videos.append({
|
|
"vod_id": f"/movie/detail/{vid}",
|
|
"vod_name": name,
|
|
"vod_pic": cover if isinstance(cover, str) else "",
|
|
"vod_remarks": f"{score}分 {episodes}集".strip() if score else "",
|
|
})
|
|
return videos
|
|
|
|
def homeContent(self, filter):
|
|
classes = []
|
|
filters = {}
|
|
for cid, info in self.CATEGORIES.items():
|
|
classes.append({"type_id": cid, "type_name": info["name"]})
|
|
filters[cid] = []
|
|
result = {"class": classes, "filters": filters}
|
|
try:
|
|
rsp = self.fetch(self.host, headers=self.headers)
|
|
html = rsp.text
|
|
data = self._parse_nuxt(html)
|
|
videos = self._extract_videos(data)
|
|
result["list"] = videos[:50]
|
|
except Exception as e:
|
|
self.log(f"首页获取出错: {str(e)}")
|
|
result["list"] = []
|
|
return result
|
|
|
|
def homeVideoContent(self):
|
|
try:
|
|
rsp = self.fetch(self.host, headers=self.headers)
|
|
html = rsp.text
|
|
data = self._parse_nuxt(html)
|
|
videos = self._extract_videos(data)
|
|
return {"list": videos[:50]}
|
|
except Exception as e:
|
|
self.log(f"首页视频获取出错: {str(e)}")
|
|
return {"list": []}
|
|
|
|
def categoryContent(self, tid, pg, filter, extend):
|
|
result = {"list": [], "page": int(pg), "pagecount": 999, "limit": 24, "total": 9999}
|
|
info = self.CATEGORIES.get(tid)
|
|
if not info:
|
|
return result
|
|
try:
|
|
page_num = int(pg) if pg and int(pg) > 0 else 1
|
|
if page_num > 1:
|
|
url = f"{self.host}/movie/list/{page_num}?cat_id={info['cat_id']}&position=movie&page={page_num}"
|
|
else:
|
|
url = f"{self.host}/movie/list?cat_id={info['cat_id']}&position=movie"
|
|
rsp = self.fetch(url, headers=self.headers)
|
|
html = rsp.text
|
|
data = self._parse_nuxt(html)
|
|
result["list"] = self._extract_videos(data)
|
|
except Exception as e:
|
|
self.log(f"分类获取出错: {str(e)}")
|
|
return result
|
|
|
|
def _get_str(self, data, val):
|
|
if isinstance(val, int) and val < len(data):
|
|
return str(data[val])
|
|
return str(val)
|
|
|
|
def _extract_episodes(self, data, item):
|
|
episodes = []
|
|
links_idx = item.get('links')
|
|
if not isinstance(links_idx, int) or links_idx >= len(data):
|
|
return episodes
|
|
links = data[links_idx]
|
|
if not isinstance(links, list):
|
|
return episodes
|
|
for link_idx in links:
|
|
if not isinstance(link_idx, int) or link_idx >= len(data):
|
|
continue
|
|
link_data = data[link_idx]
|
|
if not isinstance(link_data, dict):
|
|
continue
|
|
items_idx = link_data.get('items')
|
|
if not isinstance(items_idx, int) or items_idx >= len(data):
|
|
continue
|
|
items = data[items_idx]
|
|
if not isinstance(items, list):
|
|
continue
|
|
for item_idx in items:
|
|
if not isinstance(item_idx, int) or item_idx >= len(data):
|
|
continue
|
|
ep = data[item_idx]
|
|
if not isinstance(ep, dict):
|
|
continue
|
|
ep_id = self._get_str(data, ep.get('id', ''))
|
|
ep_name = self._get_str(data, ep.get('name', ''))
|
|
if ep_id and ep_name:
|
|
episodes.append({'name': ep_name, 'id': ep_id})
|
|
return episodes
|
|
|
|
def detailContent(self, ids):
|
|
if not ids or not ids[0]:
|
|
return {"list": []}
|
|
vid = ids[0]
|
|
url = f"{self.host}{vid}"
|
|
try:
|
|
rsp = self.fetch(url, headers=self.headers)
|
|
html = rsp.text
|
|
|
|
title = ""
|
|
desc = ""
|
|
cover = ""
|
|
category = ""
|
|
director = ""
|
|
actors = ""
|
|
genre = ""
|
|
|
|
ld_m = re.search(r'<script[^>]*type="application/ld\+json"[^>]*>(.*?)</script>', html, re.DOTALL)
|
|
if ld_m:
|
|
try:
|
|
ld = json.loads(ld_m.group(1))
|
|
if ld.get("@type") in ["Movie", "TVSeries", "Episode"]:
|
|
title = ld.get("name", "")
|
|
desc = ld.get("description", "")
|
|
cover = ld.get("image", "")
|
|
d = ld.get("director", [])
|
|
if d and isinstance(d, list):
|
|
director = ", ".join([x.get("name", "") for x in d if isinstance(x, dict)])
|
|
a = ld.get("actor", [])
|
|
if a and isinstance(a, list):
|
|
actors = ", ".join([x.get("name", "") for x in a if isinstance(x, dict)])
|
|
g = ld.get("genre", [])
|
|
if g and isinstance(g, list):
|
|
genre = ", ".join(g)
|
|
category = genre
|
|
except:
|
|
pass
|
|
|
|
if not title:
|
|
hm = re.search(r'<meta[^>]+property="og:title"[^>]+content="([^"]*)"', html)
|
|
if hm:
|
|
title = unescape(hm.group(1))
|
|
title = re.sub(r'\s+在线观看.*', '', title)
|
|
|
|
if not desc:
|
|
dm = re.search(r'<meta[^>]+name="description"[^>]+content="([^"]*)"', html)
|
|
if dm:
|
|
desc = unescape(dm.group(1))
|
|
|
|
if not cover:
|
|
cm = re.search(r'<meta[^>]+property="og:image"[^>]+content="([^"]*)"', html)
|
|
if cm:
|
|
cover = unescape(cm.group(1))
|
|
|
|
h1m = re.search(r'<h1[^>]*>\s*([^<]+)\s*</h1>', html)
|
|
if h1m:
|
|
title = h1m.group(1).strip()
|
|
|
|
if not category:
|
|
category = "电影" if "/movie/" in vid else "未知"
|
|
|
|
# === 只保留一条线路 ===
|
|
play_from = ["SA影视"]
|
|
play_urls_parts = []
|
|
data = self._parse_nuxt(html)
|
|
if data:
|
|
for item in data:
|
|
if not isinstance(item, dict):
|
|
continue
|
|
if 'play_links' not in item or 'links' not in item:
|
|
continue
|
|
|
|
episodes = self._extract_episodes(data, item)
|
|
if episodes:
|
|
ep_list = [f"{ep['name']}${url}" for ep in episodes]
|
|
play_urls_parts.append('#'.join(ep_list))
|
|
else:
|
|
play_urls_parts.append(f"SA影视${url}")
|
|
break
|
|
|
|
if not play_urls_parts:
|
|
play_urls_parts = [f"SA影视${url}"]
|
|
|
|
vod = {
|
|
"vod_id": vid,
|
|
"vod_name": title,
|
|
"type_name": category,
|
|
"vod_pic": cover,
|
|
"vod_content": desc,
|
|
"vod_play_from": "$$$".join(play_from),
|
|
"vod_play_url": "$$$".join(play_urls_parts),
|
|
"vod_director": director,
|
|
"vod_actor": actors,
|
|
"vod_class": genre,
|
|
}
|
|
return {"list": [vod]}
|
|
except Exception as e:
|
|
self.log(f"详情获取出错: {str(e)}")
|
|
return {"list": []}
|
|
|
|
def searchContent(self, key, quick, pg="1"):
|
|
try:
|
|
url = f"{self.host}/search?keyword={key}"
|
|
rsp = self.fetch(url, headers=self.headers)
|
|
html = rsp.text
|
|
data = self._parse_nuxt(html)
|
|
videos = self._extract_videos(data)
|
|
return {"list": videos, "page": pg}
|
|
except Exception as e:
|
|
self.log(f"搜索出错: {str(e)}")
|
|
return {"list": [], "page": pg}
|
|
|
|
def playerContent(self, flag, id, vipFlags):
|
|
url = str(id or "").strip()
|
|
is_direct = any(url.lower().endswith(ext) for ext in ['.m3u8', '.mp4', '.ts', '.flv', '.mkv']) if url else False
|
|
|
|
if is_direct:
|
|
proxy_url = self._proxy_url(url, "m3u8" if ".m3u8" in url.lower() else "media")
|
|
return {
|
|
"parse": 0,
|
|
"playUrl": "",
|
|
"url": proxy_url,
|
|
"header": self._play_headers(url),
|
|
}
|
|
else:
|
|
return {
|
|
"parse": 1,
|
|
"url": url,
|
|
"header": {"User-Agent": self.UA}
|
|
}
|
|
|
|
def localProxy(self, params):
|
|
try:
|
|
typ = params.get("type") if isinstance(params, dict) else ""
|
|
if typ == "m3u8":
|
|
return self.proxyM3u8(params)
|
|
if typ in ("media", "ts", "key"):
|
|
return self.proxyMedia(params)
|
|
except Exception as e:
|
|
return [500, "text/plain", str(e).encode("utf-8"), {}]
|
|
return None
|
|
|
|
def proxyM3u8(self, params):
|
|
url = unquote(params.get("url", ""))
|
|
r = self.session.get(url, headers=self._play_headers(url), timeout=self.timeout, allow_redirects=True)
|
|
r.encoding = "utf-8"
|
|
base = r.url or url
|
|
text = r.text or ""
|
|
|
|
def repl_uri(m):
|
|
raw = m.group(1)
|
|
abs_url = urljoin(base, raw)
|
|
ptype = "m3u8" if ".m3u8" in abs_url.lower() else "media"
|
|
return 'URI="' + self._proxy_url(abs_url, ptype) + '"'
|
|
|
|
out = []
|
|
for line in text.splitlines():
|
|
s = line.strip()
|
|
if not s:
|
|
out.append(line)
|
|
continue
|
|
if s.startswith("#"):
|
|
if "URI=" in s:
|
|
s = re.sub(r'URI="([^"]+)"', repl_uri, s)
|
|
out.append(s)
|
|
continue
|
|
abs_url = urljoin(base, s)
|
|
ptype = "m3u8" if ".m3u8" in abs_url.lower() else "media"
|
|
out.append(self._proxy_url(abs_url, ptype))
|
|
body = ("\n".join(out) + "\n").encode("utf-8")
|
|
return [200, "application/vnd.apple.mpegurl", body, {"Access-Control-Allow-Origin": "*"}]
|
|
|
|
def proxyMedia(self, params):
|
|
url = unquote(params.get("url", ""))
|
|
r = self.session.get(url, headers=self._play_headers(url), timeout=self.timeout, stream=False, allow_redirects=True)
|
|
ctype = r.headers.get("Content-Type") or "application/octet-stream"
|
|
return [200, ctype, r.content, {"Access-Control-Allow-Origin": "*"}]
|
|
|
|
def liveContent(self, url):
|
|
pass
|
|
",
|
|
|
|
"searchable": 1,
|
|
"quickSearch": 0,
|
|
|
|
},
|
|
|
|
{
|
|
"key": "csp_PianKu8",
|
|
"name": "🍬山楂┃热门4K",
|
|
"type": 3,
|
|
"jar":"https://s3plus.meituan.net/opapisdk/op_ticket_1_885190757_1786441652042_3gdAtt9a.zip;md5;72f76facb402366ab5f43d5dc6a45bf7",
|
|
"api": "csp_PianKu8"
|
|
},
|
|
{
|
|
"key": "csp_Wwys",
|
|
"name": "🌾农民┃1080P",
|
|
"type": 3,
|
|
"jar":"https://s3plus.meituan.net/opapisdk/op_ticket_1_885190757_1786441652042_3gdAtt9a.zip;md5;72f76facb402366ab5f43d5dc6a45bf7",
|
|
"api": "csp_Wwys",
|
|
"timeout": 12,
|
|
"ext": "https://vip.wwgz.cn:5200"
|
|
},
|
|
|
|
{
|
|
"key": "csp_XY",
|
|
"name": "🔥短剧┃1080P",
|
|
"type": 3,
|
|
"jar":"https://s3plus.meituan.net/opapisdk/op_ticket_1_885190757_1786441652042_3gdAtt9a.zip;md5;72f76facb402366ab5f43d5dc6a45bf7",
|
|
"timeout": 12,
|
|
"api": "csp_AppXY",
|
|
"ext": ""
|
|
},
|
|
|
|
{
|
|
"key": "csp_Jpys",
|
|
"name": "🥇金牌┃1080P",
|
|
"type": 3,
|
|
"jar":"https://s3plus.meituan.net/opapisdk/op_ticket_1_885190757_1786441652042_3gdAtt9a.zip;md5;72f76facb402366ab5f43d5dc6a45bf7",
|
|
"timeout": 12,
|
|
"searchable": 1,
|
|
"quickSearch": 0,
|
|
"api": "csp_Jpys",
|
|
"ext": "https://y2s52n7.com"
|
|
},
|
|
{
|
|
"key": "光影",
|
|
"name": "🌞光影┃不卡",
|
|
"type": 3,
|
|
"api": "csp_T4Guard",
|
|
"searchable": 1,
|
|
"quickSearch": 1,
|
|
"changeable": 0,
|
|
"ext": "rfOIzPkSUkANv6AT2prC8en3+Trbx4j10CIoZMv3Ag4bdEYQqTMqu/Z3YPtC2NJv6n6YeZdgyWlo4WJjBL5gUt6B7LvCEDT4CLrWka31GRq7jwVkfQRB/Jy9HkG7E8xUBIJi5DdVFk3qAuGnwUWqQNRblRxzHW+tdSm6zoFcG/QkZ97bzWOXn0fzbgwjBDkBHgcPIYjlULlctCNKgJ9DzGNSl+zMZDZgmxczsZeeahRS38Cst3qvaHn1T2lmLBGVGXPaRovi77LPRRDOJSNRrdpvCHdRikYwgar0MU56hXMGeGBiKp/OmGTIYR8dFRGvZ/m8xGOqs8U13h6wvADOGlYoP9VaQBqTcDnz9Q0Urhw3oFXWyvIlUrDhX9la5L2NYzagbyk3afqhxeSXXp07nAFsNy2CojHRTbmz4eohLoIJTSi2DzPpheVx1DAapfgRdTc7Ax5ddYpN338GiDAa0GnEgLe04a1pZ5jF+/Q7HJswqlSO+DXCQ3FjRbb/ZPQcozcCWwzhUHE1QUAt799V9DPMuiHGyudIcZarGQmezB+Lb45RdHIRy0PXD+NRVPJlfDFD5FMGSqsiVklibvuwlVHT8J5vHgh/1nEZoI1RlYYLrkjTts2EeQmrpB/sgLyo1vnjFw=="
|
|
},
|
|
|
|
{
|
|
"key": "瓜子",
|
|
"name": "👀瓜子┃不卡",
|
|
"type": 3,
|
|
"api": "csp_AppgzGuard",
|
|
"timeout": 15,
|
|
"playerType": "2",
|
|
"searchable": 1,
|
|
"quickSearch": 1,
|
|
"changeable": 1
|
|
},
|
|
{
|
|
"key": "比特",
|
|
"name": "🍄比特┃不卡",
|
|
"type": 3,
|
|
"api": "csp_BttwooGuard",
|
|
"timeout": 10,
|
|
"searchable": 1,
|
|
"quickSearch": 1,
|
|
"changeable": 1
|
|
},
|
|
{
|
|
"key": "糯米",
|
|
"name": "🍓糯米┃秒播",
|
|
"type": 3,
|
|
"api": "csp_NmyswvGuard",
|
|
"timeout": 15,
|
|
"searchable": 1,
|
|
"quickSearch": 1,
|
|
"changeable": 1
|
|
},
|
|
{
|
|
"key": "文采",
|
|
"name": "💮文采┃秒播",
|
|
"type": 3,
|
|
"api": "csp_JpysGuard",
|
|
"timeout": 10,
|
|
"playerType": 2,
|
|
"searchable": 1,
|
|
"quickSearch": 1,
|
|
"changeable": 1
|
|
},
|
|
{
|
|
"key": "奶酪",
|
|
"name": "🧀奶酪┃秒播",
|
|
"type": 3,
|
|
"api": "csp_T4Guard",
|
|
"searchable": 1,
|
|
"quickSearch": 1,
|
|
"changeable": 0,
|
|
"ext": "rfOIzPkSUkANv6AT2prC8en3+TzKx9TnlT8vaY37HhtYfAQe6C5xqrVuJPhQwYV6r3eRdMBGm3Qm6Th+BushR86B6KqJGXDsHazHw7alBG/7zUxkN1tK/NypRxnpBNoeUtpw4jcCGhytI75yO4g4zG6SOPA0RSwhksM0IF2friAkrHCWoW3v+0mdw6sjz4t4XB1Df7yL/R5cfaA/5LQYq3I8OkvMrJMU9Q1P7JXwx7NSF2zTyH/ANVmZ4u5m567DW1KVG7OuQjXPjZiOXTYk0+wjpfBRTf19yIq6q/C76k2Fs80joAMPw0ueDR+QHxtuDcTom2rmHkI1Fonkzi6BotbpUcbSi4PiIgmfdbvVwhG6Z+i4nvt+IYa48l5aLA7PLgDiERpuOs31aHaXlgFswT87XyTb8QaF4CuzKWJuXptwNTjvXAS9KHdxH49Ay+hfBAB2bCvUf4CMoldF2wZUv0mI2qY966erFpOFg+FOc7t88EUH8j8ACXQtHJiKC9RQ+SaLIF0="
|
|
},
|
|
|
|
{
|
|
"key": "视界",
|
|
"name": "🌸茉莉┃多线",
|
|
"type": 3,
|
|
"api": "csp_App99Guard",
|
|
"timeout": 10,
|
|
"searchable": 1,
|
|
"quickSearch": 1,
|
|
"changeable": 1,
|
|
"ext": "rfOX1voDIQhH8epBwtCFsuby/mmdmIu8kGlnJc+7VkMRLQ1K+jMy+KN1MKQe0MZ6tmGSO5oFzD8/vWwiSqEpFczDqLrdGT3iH6fZmryrFzKijwYkJUMctdztE0O4CsgYZdBu8XhZSwuhSqqllQz4AZMa1l0sT+1NrbhNIxHkrY0upiYSTLNqEaledgZikMCviOXWr3cPBP4COOeoGUyJSJrrybmUppnWGeDAOHhHOVUSXjwSb+QQvcJIT2lmrf1Bk68myGs7qOqc19tD/rnzf2WOb2MzJZqtURBmUFgaW6ea2dL8OPSpSeVAvaGCAnqwuUNGE9hHpK8jfOs0bLJRdkFLnijAn5Q+ofVM5hgGb8c="
|
|
},
|
|
{
|
|
"key": "播客",
|
|
"name": "🦊播客┃多线",
|
|
"type": 3,
|
|
"api": "csp_AppSxGuard",
|
|
"timeout": 10,
|
|
"searchable": 1,
|
|
"quickSearch": 1,
|
|
"changeable": 1,
|
|
"ext": "rfOb1uAWbkRHp7hdxprG9un3+SPC3Nbv1SI/b5LtAUhbYkFU/DFvsLBvd/oV3cA4uGiCZNFRz3ln6nh5Q+AgDZiM5KrCAiO7S7SVzv31EG78jVB4JEMNrMPzTgWqRZdMTdR1smBWWwru"
|
|
},
|
|
{
|
|
"key": "剧圈",
|
|
"name": "🐻剧圈┃多线",
|
|
"type": 3,
|
|
"api": "csp_AppSxGuard",
|
|
"timeout": 10,
|
|
"searchable": 1,
|
|
"quickSearch": 1,
|
|
"changeable": 1,
|
|
"ext": "rfOX1voDIQhH8epBwpmIsuSluiuZl4+/lm1iJsy3HwNWMxpf9CY77fshI+kByoxy7DyPatUZ1jk0ty1p"
|
|
},
|
|
|
|
{
|
|
"key": "奥特",
|
|
"name": "🏝奥特┃多线",
|
|
"type": 3,
|
|
"api": "csp_AueteGuard",
|
|
"timeout": 10,
|
|
"searchable": 1,
|
|
"quickSearch": 1,
|
|
"changeable": 1
|
|
},
|
|
|
|
{
|
|
"key": "看球",
|
|
"name": "⚽八八┃看球",
|
|
"type": 3,
|
|
"api": "csp_KanqiuGuard",
|
|
"timeout": 10,
|
|
"searchable": 0,
|
|
"changeable": 0,
|
|
"style": {
|
|
"type": "list"
|
|
}
|
|
},
|
|
{
|
|
"key": "多多",
|
|
"name": "🏀多多┃看球",
|
|
"type": 3,
|
|
"api": "csp_DoubaoGuard",
|
|
"searchable": 0,
|
|
"quickSearch": 0,
|
|
"changeable": 0,
|
|
"style": {
|
|
"type": "list"
|
|
}
|
|
},
|
|
{
|
|
"key": "吃瓜",
|
|
"name": "🏐吃瓜┃看球",
|
|
"type": 3,
|
|
"api": "csp_LiveGzGuard",
|
|
"searchable": 0,
|
|
"quickSearch": 0,
|
|
"changeable": 0,
|
|
"style": {
|
|
"type": "list"
|
|
}
|
|
},
|
|
|
|
{
|
|
"key": "Aid",
|
|
"name": "🚑急救┃教学",
|
|
"type": 3,
|
|
"api": "csp_FirstAidGuard",
|
|
"searchable": 0,
|
|
"quickSearch": 0,
|
|
"changeable": 0,
|
|
"style": {
|
|
"type": "rect",
|
|
"ratio": 3.8
|
|
}
|
|
},
|
|
{
|
|
"key": "bili",
|
|
"name": "合集",
|
|
"type": 3,
|
|
"api": "csp_BiliGuard",
|
|
"style": {
|
|
"type": "rect",
|
|
"ratio": 1.597
|
|
},
|
|
"searchable": 0,
|
|
"quickSearch": 0,
|
|
"changeable": 0,
|
|
"ext": {
|
|
"json": "https://gittea.dev/yongge/ge/raw/branch/master/bili.json"
|
|
}
|
|
},
|
|
{
|
|
"key": "MTV",
|
|
"name": "🅱哔哔音乐MV",
|
|
"type": 3,
|
|
"api": "csp_BiliGuard",
|
|
"style": {
|
|
"type": "rect",
|
|
"ratio": 1.597
|
|
},
|
|
"searchable": 0,
|
|
"quickSearch": 0,
|
|
"changeable": 0,
|
|
"ext": {
|
|
"json": "https://nos.netease.com/ysf/5af5fbe12a88b7c45aa1c21e6551826c.txt"
|
|
}
|
|
},
|
|
{
|
|
"key": "MTV",
|
|
"name": "🅱哔哔音乐MV",
|
|
"type": 3,
|
|
"api": "csp_BiliGuard",
|
|
"style": {
|
|
"type": "rect",
|
|
"ratio": 1.597
|
|
},
|
|
"searchable": 0,
|
|
"quickSearch": 0,
|
|
"changeable": 0,
|
|
"ext": {
|
|
"json": "https://nos.netease.com/ysf/5af5fbe12a88b7c45aa1c21e6551826c.txt"
|
|
}
|
|
},
|
|
{
|
|
"key": "南昌采茶戏",
|
|
"name": "🅱哔哔南昌采茶戏",
|
|
"type": 3,
|
|
"api": "csp_BiliGuard",
|
|
"style": {
|
|
"type": "rect",
|
|
"ratio": 1.597
|
|
},
|
|
"searchable": 0,
|
|
"quickSearch": 0,
|
|
"changeable": 0,
|
|
"ext": {
|
|
"json": "https://gittea.dev/yongge/ge/raw/branch/master/%E5%8D%97%E6%98%8C%E9%87%87%E8%8C%B6%E6%88%8F.json"
|
|
}
|
|
},
|
|
{
|
|
"key": "哔哩哔哩戏曲",
|
|
"name": "🅱哔哔戏曲",
|
|
"type": 3,
|
|
"api": "csp_BiliGuard",
|
|
"style": {
|
|
"type": "rect",
|
|
"ratio": 1.597
|
|
},
|
|
"searchable": 0,
|
|
"quickSearch": 0,
|
|
"changeable": 0,
|
|
"ext": {
|
|
"json": "https://raw.giteeusercontent.com/cccbb/jj/raw/master/Y/%E5%93%94%E5%93%A9%E5%93%94%E5%93%A9%E6%88%8F%E6%9B%B2.json"
|
|
}
|
|
},
|
|
{
|
|
"key": "哔哔影视频道",
|
|
"name": "🅱哔哔影视频道",
|
|
"type": 3,
|
|
"api": "csp_BiliGuard",
|
|
"style": {
|
|
"type": "rect",
|
|
"ratio": 1.597
|
|
},
|
|
"searchable": 0,
|
|
"quickSearch": 0,
|
|
"changeable": 0,
|
|
"ext": {
|
|
"json": "https://codeberg.org/yongge/ge/raw/branch/main/%E5%93%94%E5%93%94%E5%BD%B1%E8%A7%86%E9%A2%91%E9%81%93.json"
|
|
}
|
|
},
|
|
{
|
|
"key": "Bili",
|
|
"name": "🅱哔哔合集",
|
|
"type": 3,
|
|
"api": "csp_BiliGuard",
|
|
"style": {
|
|
"type": "rect",
|
|
"ratio": 1.597
|
|
},
|
|
"searchable": 1,
|
|
"quickSearch": 0,
|
|
"changeable": 0,
|
|
"ext": {
|
|
"json": "https://codeberg.org/yongge/ge/raw/branch/main/biliheji.txt"
|
|
}
|
|
},
|
|
{
|
|
"key": "Biliych",
|
|
"name": "🅱哔哔演唱会",
|
|
"type": 3,
|
|
"api": "csp_BiliGuard",
|
|
"style": {
|
|
"type": "rect",
|
|
"ratio": 1.597
|
|
},
|
|
"searchable": 0,
|
|
"quickSearch": 0,
|
|
"changeable": 0,
|
|
"ext": {
|
|
"json": "https://nos.netease.com/ysf/6496356286589c68f52c2f99c0c674c7.txt"
|
|
}
|
|
},
|
|
{
|
|
"key": "dr_兔小贝",
|
|
"name": "📚儿童┃启蒙",
|
|
"type": 3,
|
|
"api": "https://git.yylx.win/https://raw.githubusercontent.com/fantaiying7/EXT/refs/heads/main/drpy2.min.js",
|
|
"ext": "https://git.yylx.win/https://raw.githubusercontent.com/fantaiying7/EXT/refs/heads/main/%E5%85%94%E5%B0%8F%E8%B4%9D.js",
|
|
"style": {
|
|
"type": "rect",
|
|
"ratio": 1.597
|
|
},
|
|
"searchable": 0,
|
|
"quickSearch": 0,
|
|
"changeable": 0
|
|
},
|
|
{
|
|
"key": "少儿教育",
|
|
"name": "📚少儿┃教育",
|
|
"type": 3,
|
|
"api": "csp_BiliGuard",
|
|
"style": {
|
|
"type": "rect",
|
|
"ratio": 1.597
|
|
},
|
|
"searchable": 0,
|
|
"quickSearch": 0,
|
|
"changeable": 0,
|
|
"ext": {
|
|
"json": "https://nos.netease.com/ysf/89370c8ddf36b5e1beb4d71adb921bda.txt"
|
|
}
|
|
},
|
|
{
|
|
"key": "小学课堂",
|
|
"name": "📚小学┃课堂",
|
|
"type": 3,
|
|
"api": "csp_BiliGuard",
|
|
"style": {
|
|
"type": "rect",
|
|
"ratio": 1.597
|
|
},
|
|
"searchable": 0,
|
|
"quickSearch": 0,
|
|
"changeable": 0,
|
|
"ext": {
|
|
"json": "https://nos.netease.com/ysf/d7a21cf34ede56f5c686ecfba5fc7e3f.txt"
|
|
}
|
|
},
|
|
{
|
|
"key": "初中课堂",
|
|
"name": "📚初中┃课堂",
|
|
"type": 3,
|
|
"api": "csp_BiliGuard",
|
|
"style": {
|
|
"type": "rect",
|
|
"ratio": 1.597
|
|
},
|
|
"searchable": 0,
|
|
"quickSearch": 0,
|
|
"changeable": 0,
|
|
"ext": {
|
|
"json": "https://nos.netease.com/ysf/8f55d520f8d70056695740ef151744a7.txt"
|
|
}
|
|
},
|
|
{
|
|
"key": "高中教育",
|
|
"name": "📚高中┃课堂",
|
|
"type": 3,
|
|
"api": "csp_BiliGuard",
|
|
"style": {
|
|
"type": "rect",
|
|
"ratio": 1.597
|
|
},
|
|
"searchable": 0,
|
|
"quickSearch": 0,
|
|
"changeable": 0,
|
|
"ext": {
|
|
"json": "https://nos.netease.com/ysf/c66a4b5356141c49fd45ec51568017b4.txt"
|
|
}
|
|
}
|
|
],
|
|
"rules": [
|
|
{
|
|
"name": "cdn.ryplay",
|
|
"hosts": [
|
|
"cdn.ryplay"
|
|
],
|
|
"regex": [
|
|
"5.480000",
|
|
"#EXT-X-DISCONTINUITY\\r*\\n*#EXTINF:5.480000,[\\s\\S]*?#EXT-X-DISCONTINUITY",
|
|
"#EXT-X-DISCONTINUITY\\s*\\r?\\n#EXTINF:5.320000,\\s*\\r?\\n.+\\.ts\\s*\\r?\\n(?:#EXTINF:[\\d.]+,\\s*\\r?\\n.+\\.ts\\s*\\r?\\n)*?#EXTINF:3.360000,\\s*\\r?\\n.+\\.ts\\s*\\r?\\n#EXT-X-DISCONTINUITY",
|
|
"#EXT-X-DISCONTINUITY\\s*\\r?\\n#EXTINF:4.000000,\\s*\\r?\\n.+\\.ts\\s*\\r?\\n(?:#EXTINF:[\\d.]+,\\s*\\r?\\n.+\\.ts\\s*\\r?\\n)*?#EXTINF:0.560000,\\s*\\r?\\n.+\\.ts\\s*\\r?\\n#EXT-X-DISCONTINUITY",
|
|
"#EXTINF.*?\\s+.*?1o.*?\\.ts\\s+"
|
|
]
|
|
}
|
|
],
|
|
"logo": "https://bdcache1-f1.v3mh.com/image/25-12-16/6941612717007.gif",
|
|
"hosts": [
|
|
"img1.wsyzy.org=fan.cloudflare.182682.xyz",
|
|
"fiizvfck.top=fan.cloudflare.182682.xyz",
|
|
"images.67c6c7a.com=fan.cloudflare.182682.xyz"
|
|
],
|
|
"lives": [
|
|
{
|
|
"name": "电视直播",
|
|
"type": 0,
|
|
"url": "https://raw.giteeusercontent.com/cccbb/js/raw/d/lpj.txt",
|
|
"playerType": 2,
|
|
"epg": "http://diyp5.112114.xyz/?ch={name}&date={date}",
|
|
"logo": "https://epg.112114.xyz/logo/{name}.png"
|
|
},
|
|
{
|
|
"name": "📺 我的直播",
|
|
"type": 0,
|
|
"url": "https://raw.githubusercontent.com/best-fan/iptv-sources/master/cn_all.m3u8"
|
|
}
|
|
]
|
|
} |