// >>> 当前时间是: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']*id="__NUXT_DATA__"[^>]*>(.*?)', 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']*type="application/ld\+json"[^>]*>(.*?)', 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']+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']+name="description"[^>]+content="([^"]*)"', html) if dm: desc = unescape(dm.group(1)) if not cover: cm = re.search(r']+property="og:image"[^>]+content="([^"]*)"', html) if cm: cover = unescape(cm.group(1)) h1m = re.search(r']*>\s*([^<]+)\s*', 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" } ] }