更新线路

整体线路:v20250629
This commit is contained in:
Liu
2025-06-30 12:08:52 +08:00
parent f74d24c2f2
commit 5cb75d947e
36 changed files with 3244 additions and 71494 deletions

View File

@@ -1,7 +1,7 @@
{
"spider": "./spider.jar",
"wallpaper": "http://ceshi.xn--z7x900a.com/ppic/feimao.php",
"logo": "http://ceshi.xn--z7x900a.com/panda/0262.png",
"wallpaper": "http://ppic/feimao.php",
"logo": "http://panda/0262.png",
"sites": [
{
"key": "drpy_js_豆瓣",
@@ -95,31 +95,94 @@
},
{
"key": "潮流",
"name": "🏜┃潮流┃影视",
"name": "🏜┃潮流┃APP",
"type": 3,
"api": "csp_AppRJ",
"ext": "sHR2rlsfjI4L3t4RXQMkn9mmg6Ofmy66+wcs9waIyn4hKqT9jG9s4kO6qzcu2OSqWS1/T+wfkqe+UwoipekwvcM11PTDrQqKYI8lmMXUc1vBHxp/2uWIw5HUoscBNWEb"
"ext": "vxw35/hHSj07Q+maxQzOVMq1rjRCOTXpUCx8iKu5jIg="
},
{
"key": "梦回",
"name": "🏈┃梦回┃影视",
"name": "🏈┃梦回┃APP",
"type": 3,
"api": "csp_AppRJ",
"ext": "sHR2rlsfjI4L3t4RXQMkn9NPgTvCXvJVoUvXJHT6PqBNTg88Q5I4mc95m2RizprWhdAIQNMU/HShly4WRNzUsfhvqzHXHhHD57G7QagNV0Cx+WDSBgm0uZMAbZVHmzjM"
"ext": "Z2MNziRBwjQxqaBuUxNkDRyvTntIkN1cOXhjyWgjCTc="
},
{
"key": "星辉",
"name": "🦢┃星辉┃影视",
"name": "🦢┃星辉┃APP",
"type": 3,
"api": "csp_AppRJ",
"ext": "sHR2rlsfjI4L3t4RXQMknxhunFUlA4159TKiKvIPpfcM1xianxebcSLajBbwFymqC+z9WoGzQYbh7FSvh8KdiC0BKF0CalaPaCEMOZm+ClGEeNzXAaR0FnrV04SiB2NK"
"ext": "jsSMEuhTZIAHjnUoLBzKdlRu5exzno6M4efF8LzwjWM="
},
{
"key": "菲儿",
"name": "🍁┃菲菲┃影视",
"key": "肥猫",
"name": "🐼┃肥猫┃APP",
"type": 3,
"api": "csp_AppFerr",
"ext": "sHR2rlsfjI4L3t4RXQMkn/M3t4AXAKTrZj3tfhm1t/gMT3dOrHqIzUNqLUEOIDMvllTbX6e1hMhB2mfpOaCmHNOL1yBB3SmxNyqXlai90EIpdnwOOgCR9Z+YwCTj6ySjzJ2VBiH3eXeOGcavcNeVRA=="
"api": "csp_AppGet",
"ext": "4wSF77WNzVYxpDQF3Vf/eAoVqKf1nKdv5MpKtrhokKJN288M3lP16ZeoM36I71sJ"
},
{
"key": "干饭",
"name": "🍚┃干饭┃APP",
"type": 3,
"api": "csp_AppGet",
"ext": "Ygx7wpu8Zcm70i88iO9WMRvxQZdMqIapMqvlBKPmjCP60xrvslJlJFIwHepviTkKbgCK9nn25i0k7xnWVX0Y7g=="
},
{
"key": "光盘",
"name": "📀┃光盘┃APP",
"type": 3,
"api": "csp_AppGet",
"ext": "5ztMiKPUcHLR7TRusm5rHsPgFhlXstdsZuadxKTvmldCWgloYKsAMQA+2Sr7eCUj"
},
{
"key": "行动",
"name": "😌┃行动┃APP",
"type": 3,
"api": "csp_AppSy",
"ext": "iUYplHbim/qVptUBrzCuqk72erYn+xHvZVGawkGUOqtLGtiWlDcWpUagYzdfPYeECbG+IjVf7Mhz2ZqZ70k6X72tkUhQDNEpIN/XScTGlUE="
},
{
"key": "再来",
"name": "✌┃再来┃APP",
"type": 3,
"api": "csp_AppGet",
"ext": "gKqtScS9maa2YW8G9NNOtUsSxDvraRvNMDiazqRUzDYklDH0MMxfu9ZPgRdHKBcI"
},
{
"key": "一碗",
"name": "🥣┃一碗┃APP",
"type": 3,
"api": "csp_AppGet",
"ext": "cOS1UvSbYM3xW1jXF4QBcYkSAhpFDDoh7c53wGBZEyxDhNunH+Feq+RreiUkQsV1"
},
{
"key": "猫抓",
"name": "🐱┃猫抓┃APP",
"type": 3,
"api": "csp_AppGet",
"ext": "iUYplHbim/qVptUBrzCuqmzk48cRdrCU+TvWjkRayUR3VnXktGT5Xk3xOdnrzb1IN9MUDdYRVCdA3H9+5eszqQ=="
},
{
"key": "仓鼠",
"name": "🐹┃耗子┃APP",
"type": 3,
"api": "csp_AppGet",
"ext": "uOx4WoHPKe5LbDsNX+u7yPwU6Ups0duUFWxZbQqPo2oF+jkgV7jbW6aOO1kS4+9PdDFoRHhRxKKvcUOgzloTKw=="
},
{
"key": "蔬菜",
"name": "🫛┃蔬菜┃APP",
"type": 3,
"api": "csp_AppGet",
"ext": "II6EBjEX9APRjw9zkvfuusSMPTiiXvPm9pK9Zv0wFaq4AWWODp1x+otEA1t0ZFTSq+p0AmaiQvE9cq5Hdl/Vlg=="
},
{
"key": "黑猫",
"name": "🐼┃黑猫┃APP",
"type": 3,
"api": "csp_AppGet",
"ext": "cLeOXZXsq65z+2s8qkWsD+GYhlTxoLn2cNnZiAXyiQPBfOCR3nVfgmZWdkvjSaqJFD9Bmb+U0RVCI9wv8BMVIg=="
},
{
"key": "csp_Jpys",
@@ -147,12 +210,6 @@
"api": "csp_FourK",
"ext": "https://www.4kvm.tv"
},
{
"key": "csp_Siren",
"name": "🎉️┃私人┃影城",
"type": 3,
"api": "csp_Siren"
},
{
"key": "csp_Lkdy",
"name": "🏔️┃来看┃影视",
@@ -263,18 +320,6 @@
"ratio": 1.333
}
},
{
"key": "csp_YouShengBook",
"name": "📚┃六月┃听书",
"type": 3,
"playerType": "2",
"api": "csp_TingBook",
"searchable": 0,
"style": {
"type": "rect",
"ratio": 1.333
}
},
{
"key": "csp_Dm84",
"name": "🤣┃动漫┃巴士",
@@ -310,52 +355,31 @@
]
}
},
{
"key": "酷奇",
"name": "🎤┃酷奇┃MV",
"type": 3,
"api": "./api/drpy2.min.js",
"searchable": 0,
"quickSearch": 0,
"ext": "./js/酷奇MV.js"
},
{
"key": "MTV",
"name": "🎧┃明星┃MV",
"type": 3,
"api": "csp_Bili",
"searchable": 0,
"quickSearch": 0,
"ext": "./json/MTV.json"
"playerType": 2,
"ext": {
"json": "https://img2.gelonghui.com/library/2b4eb-8fb08a6b-f9f1-48d8-816a-1bc712a85fefnull",
"cookie": ""
},
"style": {
"type": "rect",
"ratio": 1.333
}
},
{
"key": "虎牙直播js",
"name": "🐯┃虎牙┃直播",
"key": "娱乐",
"name": "🎮┃游戏┃娱乐",
"type": 3,
"api": "./api/drpy2.min.js",
"searchable": 0,
"quickSearch": 0,
"playerType": 1,
"ext": "./js/huya2.js"
},
{
"key": "斗鱼js",
"name": "🐟┃斗鱼┃直播",
"type": 3,
"api": "./api/drpy2.min.js",
"searchable": 0,
"quickSearch": 0,
"playerType": 1,
"ext": "./js/斗鱼直播.js"
},
{
"key": "聚短视频js",
"name": "📽┃️聚短┃视频",
"type": 3,
"api": "./api/drpy2.min.js",
"searchable": 0,
"quickSearch": 0,
"ext": "./js/短视频.js"
"api": "./api/LIVES.py",
"style": {
"type": "rect",
"ratio": 1.333
},
"ext": ""
},
{
"key": "看球",
@@ -411,60 +435,64 @@
"ext": "./js/兔小贝.js"
},
{
"key": "少儿",
"key": "csp_少儿",
"name": "📚┃少儿┃教育",
"type": 3,
"api": "csp_Bili",
"searchable": 0,
"quickSearch": 0,
"changeable": 0,
"playerType": 2,
"ext": {
"json": "https://img2.gelonghui.com/library/1903b-eb0f1675-2437-4e72-bcf0-427b1626d79fnull",
"cookie": ""
},
"style": {
"type": "rect",
"ratio": 1.597
},
"ext": "./json/少儿教育.json"
"ratio": 1.333
}
},
{
"key": "小学",
"key": "csp_小学",
"name": "📚┃小学┃课堂",
"type": 3,
"api": "csp_Bili",
"searchable": 0,
"quickSearch": 0,
"changeable": 0,
"playerType": 2,
"ext": {
"json": "https://img2.gelonghui.com/library/a1140-144855fe-3eaa-44f3-b689-6812c233de54null",
"cookie": ""
},
"style": {
"type": "rect",
"ratio": 1.597
},
"ext": "./json/小学课堂.json"
"ratio": 1.333
}
},
{
"key": "初中",
"key": "csp_初中",
"name": "📚┃初中┃课堂",
"type": 3,
"api": "csp_Bili",
"searchable": 0,
"quickSearch": 0,
"changeable": 0,
"playerType": 2,
"ext": {
"json": "https://img2.gelonghui.com/library/ba156-73e16cad-8257-4f33-b8c0-e051e72e546dnull",
"cookie": ""
},
"style": {
"type": "rect",
"ratio": 1.597
},
"ext": "./json/初中课堂.json"
"ratio": 1.333
}
},
{
"key": "高中",
"key": "csp_高中",
"name": "📚┃高中┃课堂",
"type": 3,
"api": "csp_Bili",
"searchable": 0,
"quickSearch": 0,
"changeable": 0,
"playerType": 2,
"ext": {
"json": "https://img2.gelonghui.com/library/e44b3-4a82ab48-e014-49b2-bb66-ee5207e8f195null",
"cookie": ""
},
"style": {
"type": "rect",
"ratio": 1.597
},
"ext": "./json/高中课堂.json"
"ratio": 1.333
}
},
{
"key": "push_agent",
@@ -535,5 +563,161 @@
"url": "./lives/live.txt",
"epg": "http://epg.112114.xyz/?ch={name}&date={date}"
}
],
"rules": [
{
"name": "♻️量非",
"hosts": [
"lz",
"vip.lz",
"v.cdnlz",
"hd.lz",
"ffzy",
"vip.ffzy",
"hd.ffzy"
],
"regex": [
"#EXT-X-DISCONTINUITY\r*\n*#EXTINF:6.666667,[\\s\\S]*?#EXT-X-DISCONTINUITY",
"#EXT-X-DISCONTINUITY\r*\n*#EXTINF:6.600000,[\\s\\S]*?#EXT-X-DISCONTINUITY"
]
},
{
"name": "♻️索尼",
"hosts": [
"suonizy",
"qrssv.com"
],
"regex": [
"15.1666",
"15.2666"
]
},
{
"name": "♻️乐视",
"hosts": [
"leshiyun"
],
"regex": [
"15.92"
]
},
{
"name": "♻️优质",
"hosts": [
"yzzy",
"playback"
],
"regex": [
"16.63",
"18.66",
"17.66",
"19.13"
]
},
{
"name": "♻️快看",
"hosts": [
"kuaikan",
"vip.kuaikan"
],
"regex": [
"15.32",
"15.231",
"18.066"
]
},
{
"name": "♻360",
"hosts": [
"lyhuicheng"
],
"regex": [
"#EXTINF.*?\\s+.*?hrz8QcR9.*?\\.ts\\s+",
"#EXT-X-KEY:METHOD=NONE[\\s\\S]*?#EXT-X-DISCONTINUITY"
]
},
{
"name": "♻️开源棋牌",
"hosts": [
"askzycdn",
"jkunbf",
"bfikuncdn",
"bfaskcdn"
],
"regex": [
"#EXT-X-KEY:METHOD=NONE\r*\n*#EXTINF:5,[\\s\\S]*?#EXT-X-DISCONTINUITY",
"#EXT-X-KEY:METHOD=AES-128,URI=\"[^\"]+\"\r*\n*#EXTINF:3.333,[\\s\\S]*?#EXT-X-DISCONTINUITY"
]
},
{
"name": "♻️暴风",
"hosts": [
"bfengbf.com",
"bfzy",
"c1"
],
"regex": [
"#EXTINF.*?\\s+.*?adjump.*?\\.ts\\s+",
"#EXT-X-DISCONTINUITY\r*\n*#EXTINF:3,[\\s\\S]*?#EXT-X-DISCONTINUITY"
]
},
{
"name": "♻️农民",
"hosts": [
"toutiaovod.com"
],
"regex": [
"video/tos/cn"
]
},
{
"name": "♻️火山",
"hosts": [
"huoshan.com"
],
"regex": [
"item_id="
]
},
{
"name": "♻️抖音",
"hosts": [
"douyin.com"
],
"regex": [
"is_play_url="
]
},
{
"name": "♻️磁力",
"hosts": [
"magnet"
],
"regex": [
"最 新",
"直 播",
"更 新"
]
},
{
"name": "♻️饭团点击",
"hosts": [
"dadagui",
"freeok",
"dadagui"
],
"script": [
"document.querySelector(\"#playleft iframe\").contentWindow.document.querySelector(\"#start\").click();"
]
},
{
"name": "♻️毛驴点击",
"hosts": [
"www.maolvys.com"
],
"script": [
"document.getElementsByClassName('swal-button swal-button--confirm')[0].click()"
]
}
]
}

768
肥猫/api/LIVES.py Normal file
View File

@@ -0,0 +1,768 @@
# -*- coding: utf-8 -*-
# by @嗷呜
import json
import re
import sys
import time
from base64 import b64decode, b64encode
from urllib.parse import parse_qs
import requests
from pyquery import PyQuery as pq
sys.path.append('..')
from base.spider import Spider
from concurrent.futures import ThreadPoolExecutor
class Spider(Spider):
def init(self, extend=""):
tid = 'douyin'
headers = self.gethr(0, tid)
response = requests.head(self.hosts[tid], headers=headers)
ttwid = response.cookies.get('ttwid')
headers.update({
'authority': self.hosts[tid].split('//')[-1],
'cookie': f'ttwid={ttwid}' if ttwid else ''
})
self.dyheaders = headers
pass
def getName(self):
pass
def isVideoFormat(self, url):
pass
def manualVideoCheck(self):
pass
def destroy(self):
pass
headers = [
{
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0"
},
{
"User-Agent": "Dart/3.4 (dart:io)"
}
]
excepturl = 'https://www.baidu.com'
hosts = {
"huya": ["https://www.huya.com","https://mp.huya.com"],
"douyin": "https://live.douyin.com",
"douyu": "https://www.douyu.com",
"wangyi": "https://cc.163.com",
"bili": ["https://api.live.bilibili.com", "https://api.bilibili.com"]
}
referers = {
"huya": "https://live.cdn.huya.com",
"douyin": "https://live.douyin.com",
"douyu": "https://m.douyu.com",
"bili": "https://live.bilibili.com"
}
playheaders = {
"wangyi": {
"User-Agent": "ExoPlayer",
"Connection": "Keep-Alive",
"Icy-MetaData": "1"
},
"bili": {
'Accept': '*/*',
'Icy-MetaData': '1',
'referer': referers['bili'],
'user-agent': headers[0]['User-Agent']
},
'douyin': {
'User-Agent': 'libmpv',
'Icy-MetaData': '1'
},
'huya': {
'User-Agent': 'ExoPlayer',
'Connection': 'Keep-Alive',
'Icy-MetaData': '1'
},
'douyu': {
'User-Agent': 'libmpv',
'Icy-MetaData': '1'
}
}
def process_bili(self):
try:
self.blfdata = self.fetch(
f'{self.hosts["bili"][0]}/room/v1/Area/getList?need_entrance=1&parent_id=0',
headers=self.gethr(0, 'bili')
).json()
return ('bili', [{'key': 'cate', 'name': '分类',
'value': [{'n': i['name'], 'v': str(i['id'])}
for i in self.blfdata['data']]}])
except Exception as e:
print(f"bili处理错误: {e}")
return 'bili', None
def process_douyin(self):
try:
data = self.getpq(self.hosts['douyin'], headers=self.dyheaders)('script')
for i in data.items():
if 'categoryData' in i.text():
content = i.text()
start = content.find('{')
end = content.rfind('}') + 1
if start != -1 and end != -1:
json_str = content[start:end]
json_str = json_str.replace('\\"', '"')
try:
self.dyifdata = json.loads(json_str)
return ('douyin', [{'key': 'cate', 'name': '分类',
'value': [{'n': i['partition']['title'],
'v': f"{i['partition']['id_str']}@@{i['partition']['title']}"}
for i in self.dyifdata['categoryData']]}])
except json.JSONDecodeError as e:
print(f"douyin解析错误: {e}")
return 'douyin', None
except Exception as e:
print(f"douyin请求或处理错误: {e}")
return 'douyin', None
def process_douyu(self):
try:
self.dyufdata = self.fetch(
f'{self.referers["douyu"]}/api/cate/list',
headers=self.headers[1]
).json()
return ('douyu', [{'key': 'cate', 'name': '分类',
'value': [{'n': i['cate1Name'], 'v': str(i['cate1Id'])}
for i in self.dyufdata['data']['cate1Info']]}])
except Exception as e:
print(f"douyu错误: {e}")
return 'douyu', None
def homeContent(self, filter):
result = {}
cateManual = {
"虎牙": "huya",
"哔哩": "bili",
"抖音": "douyin",
"斗鱼": "douyu",
"网易": "wangyi"
}
classes = []
filters = {
'huya': [{'key': 'cate', 'name': '分类',
'value': [{'n': '网游', 'v': '1'}, {'n': '单机', 'v': '2'},
{'n': '娱乐', 'v': '8'}, {'n': '手游', 'v': '3'}]}]
}
with ThreadPoolExecutor(max_workers=3) as executor:
futures = {
executor.submit(self.process_bili): 'bili',
executor.submit(self.process_douyin): 'douyin',
executor.submit(self.process_douyu): 'douyu'
}
for future in futures:
platform, filter_data = future.result()
if filter_data:
filters[platform] = filter_data
for k in cateManual:
classes.append({
'type_name': k,
'type_id': cateManual[k]
})
result['class'] = classes
result['filters'] = filters
return result
def homeVideoContent(self):
pass
def categoryContent(self, tid, pg, filter, extend):
vdata = []
result = {}
pagecount = 9999
result['page'] = pg
result['limit'] = 90
result['total'] = 999999
if tid == 'wangyi':
vdata, pagecount = self.wyccContent(tid, pg, filter, extend, vdata)
elif 'bili' in tid:
vdata, pagecount = self.biliContent(tid, pg, filter, extend, vdata)
elif 'huya' in tid:
vdata, pagecount = self.huyaContent(tid, pg, filter, extend, vdata)
elif 'douyin' in tid:
vdata, pagecount = self.douyinContent(tid, pg, filter, extend, vdata)
elif 'douyu' in tid:
vdata, pagecount = self.douyuContent(tid, pg, filter, extend, vdata)
result['list'] = vdata
result['pagecount'] = pagecount
return result
def wyccContent(self, tid, pg, filter, extend, vdata):
params = {
'format': 'json',
'start': (int(pg) - 1) * 20,
'size': '20',
}
response = self.fetch(f'{self.hosts[tid]}/api/category/live/', params=params, headers=self.headers[0]).json()
for i in response['lives']:
if i.get('cuteid'):
bvdata = self.buildvod(
vod_id=f"{tid}@@{i['cuteid']}",
vod_name=i.get('title'),
vod_pic=i.get('cover'),
vod_remarks=i.get('nickname'),
style={"type": "rect", "ratio": 1.33}
)
vdata.append(bvdata)
return vdata, 9999
def biliContent(self, tid, pg, filter, extend, vdata):
if extend.get('cate') and pg == '1' and 'click' not in tid:
for i in self.blfdata['data']:
if str(i['id']) == extend['cate']:
for j in i['list']:
v = self.buildvod(
vod_id=f"click_{tid}@@{i['id']}@@{j['id']}",
vod_name=j.get('name'),
vod_pic=j.get('pic'),
vod_tag=1,
style={"type": "oval", "ratio": 1}
)
vdata.append(v)
return vdata, 1
else:
path = f'/xlive/web-interface/v1/second/getListByArea?platform=web&sort=online&page_size=30&page={pg}'
if 'click' in tid:
ids = tid.split('_')[1].split('@@')
tid = ids[0]
path = f'/xlive/web-interface/v1/second/getList?platform=web&parent_area_id={ids[1]}&area_id={ids[-1]}&sort_type=&page={pg}'
data = self.fetch(f'{self.hosts[tid][0]}{path}', headers=self.gethr(0, tid)).json()
for i in data['data']['list']:
if i.get('roomid'):
data = self.buildvod(
f"{tid}@@{i['roomid']}",
i.get('title'),
i.get('cover'),
i.get('watched_show', {}).get('text_large'),
0,
i.get('uname'),
style={"type": "rect", "ratio": 1.33}
)
vdata.append(data)
return vdata, 9999
def huyaContent(self, tid, pg, filter, extend, vdata):
if extend.get('cate') and pg == '1' and 'click' not in tid:
id = extend.get('cate')
data = self.fetch(f'{self.referers[tid]}/liveconfig/game/bussLive?bussType={id}',
headers=self.headers[1]).json()
for i in data['data']:
v = self.buildvod(
vod_id=f"click_{tid}@@{int(i['gid'])}",
vod_name=i.get('gameFullName'),
vod_pic=f'https://huyaimg.msstatic.com/cdnimage/game/{int(i["gid"])}-MS.jpg',
vod_tag=1,
style={"type": "oval", "ratio": 1}
)
vdata.append(v)
return vdata, 1
else:
gid = ''
if 'click' in tid:
ids = tid.split('_')[1].split('@@')
tid = ids[0]
gid = f'&gameId={ids[1]}'
data = self.fetch(f'{self.hosts[tid][0]}/cache.php?m=LiveList&do=getLiveListByPage&tagAll=0{gid}&page={pg}',
headers=self.headers[1]).json()
for i in data['data']['datas']:
if i.get('profileRoom'):
v = self.buildvod(
f"{tid}@@{i['profileRoom']}",
i.get('introduction'),
i.get('screenshot'),
str(int(i.get('totalCount', '1')) / 10000) + '',
0,
i.get('nick'),
style={"type": "rect", "ratio": 1.33}
)
vdata.append(v)
return vdata, 9999
def douyinContent(self, tid, pg, filter, extend, vdata):
if extend.get('cate') and pg == '1' and 'click' not in tid:
ids = extend.get('cate').split('@@')
for i in self.dyifdata['categoryData']:
c = i['partition']
if c['id_str'] == ids[0] and c['title'] == ids[1]:
vlist = i['sub_partition'].copy()
vlist.insert(0, {'partition': c})
for j in vlist:
j = j['partition']
v = self.buildvod(
vod_id=f"click_{tid}@@{j['id_str']}@@{j['type']}",
vod_name=j.get('title'),
vod_pic='https://p3-pc-weboff.byteimg.com/tos-cn-i-9r5gewecjs/pwa_v3/512x512-1.png',
vod_tag=1,
style={"type": "oval", "ratio": 1}
)
vdata.append(v)
return vdata, 1
else:
path = f'/webcast/web/partition/detail/room/?aid=6383&app_name=douyin_web&live_id=1&device_platform=web&count=15&offset={(int(pg) - 1) * 15}&partition=720&partition_type=1'
if 'click' in tid:
ids = tid.split('_')[1].split('@@')
tid = ids[0]
path = f'/webcast/web/partition/detail/room/?aid=6383&app_name=douyin_web&live_id=1&device_platform=web&count=15&offset={(int(pg) - 1) * 15}&partition={ids[1]}&partition_type={ids[-1]}&req_from=2'
data = self.fetch(f'{self.hosts[tid]}{path}', headers=self.dyheaders).json()
for i in data['data']['data']:
v = self.buildvod(
vod_id=f"{tid}@@{i['web_rid']}",
vod_name=i['room'].get('title'),
vod_pic=i['room']['cover'].get('url_list')[0],
vod_year=i.get('user_count_str'),
vod_remarks=i['room']['owner'].get('nickname'),
style={"type": "rect", "ratio": 1.33}
)
vdata.append(v)
return vdata, 9999
def douyuContent(self, tid, pg, filter, extend, vdata):
if extend.get('cate') and pg == '1' and 'click' not in tid:
for i in self.dyufdata['data']['cate2Info']:
if str(i['cate1Id']) == extend['cate']:
v = self.buildvod(
vod_id=f"click_{tid}@@{i['cate2Id']}",
vod_name=i.get('cate2Name'),
vod_pic=i.get('icon'),
vod_remarks=i.get('count'),
vod_tag=1,
style={"type": "oval", "ratio": 1}
)
vdata.append(v)
return vdata, 1
else:
path = f'/japi/weblist/apinc/allpage/6/{pg}'
if 'click' in tid:
ids = tid.split('_')[1].split('@@')
tid = ids[0]
path = f'/gapi/rkc/directory/mixList/2_{ids[1]}/{pg}'
url = f'{self.hosts[tid]}{path}'
data = self.fetch(url, headers=self.headers[1]).json()
for i in data['data']['rl']:
v = self.buildvod(
vod_id=f"{tid}@@{i['rid']}",
vod_name=i.get('rn'),
vod_pic=i.get('rs16'),
vod_year=str(int(i.get('ol', 1)) / 10000) + '',
vod_remarks=i.get('nn'),
style={"type": "rect", "ratio": 1.33}
)
vdata.append(v)
return vdata, 9999
def detailContent(self, ids):
ids = ids[0].split('@@')
if ids[0] == 'wangyi':
vod = self.wyccDetail(ids)
elif ids[0] == 'bili':
vod = self.biliDetail(ids)
elif ids[0] == 'huya':
vod = self.huyaDetail(ids)
elif ids[0] == 'douyin':
vod = self.douyinDetail(ids)
elif ids[0] == 'douyu':
vod = self.douyuDetail(ids)
return {'list': [vod]}
def wyccDetail(self, ids):
try:
vdata = self.getpq(f'{self.hosts[ids[0]]}/{ids[1]}', self.headers[0])('script').eq(-1).text()
def get_quality_name(vbr):
if vbr <= 600:
return "标清"
elif vbr <= 1000:
return "高清"
elif vbr <= 2000:
return "超清"
else:
return "蓝光"
data = json.loads(vdata)['props']['pageProps']['roomInfoInitData']
name = data['live'].get('title', ids[0])
vod = self.buildvod(vod_name=data.get('keywords_suffix'), vod_remarks=data['live'].get('title'),
vod_content=data.get('description_suffix'))
resolution_data = data['live']['quickplay']['resolution']
all_streams = {}
sorted_qualities = sorted(resolution_data.items(),
key=lambda x: x[1]['vbr'],
reverse=True)
for quality, data in sorted_qualities:
vbr = data['vbr']
quality_name = get_quality_name(vbr)
for cdn_name, url in data['cdn'].items():
if cdn_name not in all_streams and type(url) == str and url.startswith('http'):
all_streams[cdn_name] = []
if isinstance(url, str) and url.startswith('http'):
all_streams[cdn_name].extend([quality_name, url])
plists = []
names = []
for i, (cdn_name, stream_list) in enumerate(all_streams.items(), 1):
names.append(f'线路{i}')
pstr = f"{name}${ids[0]}@@{self.e64(json.dumps(stream_list))}"
plists.append(pstr)
vod['vod_play_from'] = "$$$".join(names)
vod['vod_play_url'] = "$$$".join(plists)
return vod
except Exception as e:
return self.handle_exception(e)
def biliDetail(self, ids):
try:
vdata = self.fetch(
f'{self.hosts[ids[0]][0]}/xlive/web-room/v1/index/getInfoByRoom?room_id={ids[1]}&wts={int(time.time())}',
headers=self.gethr(0, ids[0])).json()
v = vdata['data']['room_info']
vod = self.buildvod(
vod_name=v.get('title'),
type_name=v.get('parent_area_name') + '/' + v.get('area_name'),
vod_remarks=v.get('tags'),
vod_play_from=v.get('title'),
)
data = self.fetch(
f'{self.hosts[ids[0]][0]}/xlive/web-room/v2/index/getRoomPlayInfo?room_id={ids[1]}&protocol=0%2C1&format=0%2C1%2C2&codec=0%2C1&platform=web',
headers=self.gethr(0, ids[0])).json()
vdnams = data['data']['playurl_info']['playurl']['g_qn_desc']
all_accept_qns = []
streams = data['data']['playurl_info']['playurl']['stream']
for stream in streams:
for format_item in stream['format']:
for codec in format_item['codec']:
if 'accept_qn' in codec:
all_accept_qns.append(codec['accept_qn'])
max_accept_qn = max(all_accept_qns, key=len) if all_accept_qns else []
quality_map = {
item['qn']: item['desc']
for item in vdnams
}
quality_names = [f"{quality_map.get(qn)}${ids[0]}@@{ids[1]}@@{qn}" for qn in max_accept_qn]
vod['vod_play_url'] = "#".join(quality_names)
return vod
except Exception as e:
return self.handle_exception(e)
def huyaDetail(self, ids):
try:
vdata = self.fetch(f'{self.hosts[ids[0]][1]}/cache.php?m=Live&do=profileRoom&roomid={ids[1]}',
headers=self.headers[0]).json()
v = vdata['data']['liveData']
vod = self.buildvod(
vod_name=v.get('introduction'),
type_name=v.get('gameFullName'),
vod_director=v.get('nick'),
vod_remarks=v.get('contentIntro'),
)
data = dict(reversed(list(vdata['data']['stream'].items())))
names = []
plist = []
for stream_type, stream_data in data.items():
if isinstance(stream_data, dict) and 'multiLine' in stream_data and 'rateArray' in stream_data:
names.append(f"线路{len(names) + 1}")
qualities = sorted(
stream_data['rateArray'],
key=lambda x: (x['iBitRate'], x['sDisplayName']),
reverse=True
)
cdn_urls = []
for cdn in stream_data['multiLine']:
quality_urls = []
for quality in qualities:
quality_name = quality['sDisplayName']
bit_rate = quality['iBitRate']
base_url = cdn['url']
if bit_rate > 0:
if '.m3u8' in base_url:
new_url = base_url.replace(
'ratio=2000',
f'ratio={bit_rate}'
)
else:
new_url = base_url.replace(
'imgplus.flv',
f'imgplus_{bit_rate}.flv'
)
else:
new_url = base_url
quality_urls.extend([quality_name, new_url])
encoded_urls = self.e64(json.dumps(quality_urls))
cdn_urls.append(f"{cdn['cdnType']}${ids[0]}@@{encoded_urls}")
if cdn_urls:
plist.append('#'.join(cdn_urls))
vod['vod_play_from'] = "$$$".join(names)
vod['vod_play_url'] = "$$$".join(plist)
return vod
except Exception as e:
return self.handle_exception(e)
def douyinDetail(self, ids):
url = f'{self.hosts[ids[0]]}/webcast/room/web/enter/?aid=6383&app_name=douyin_web&live_id=1&device_platform=web&enter_from=web_live&web_rid={ids[1]}&room_id_str=&enter_source=&Room-Enter-User-Login-Ab=0&is_need_double_stream=false&cookie_enabled=true&screen_width=1980&screen_height=1080&browser_language=zh-CN&browser_platform=Win32&browser_name=Edge&browser_version=125.0.0.0'
data = self.fetch(url, headers=self.dyheaders).json()
try:
vdata = data['data']['data'][0]
vod = self.buildvod(
vod_name=vdata['title'],
vod_remarks=vdata['user_count_str'],
)
resolution_data = vdata['stream_url']['live_core_sdk_data']['pull_data']['options']['qualities']
stream_json = vdata['stream_url']['live_core_sdk_data']['pull_data']['stream_data']
stream_json = json.loads(stream_json)
available_types = []
if any(sdk_key in stream_json['data'] and 'main' in stream_json['data'][sdk_key] for sdk_key in
stream_json['data']):
available_types.append('main')
if any(sdk_key in stream_json['data'] and 'backup' in stream_json['data'][sdk_key] for sdk_key in
stream_json['data']):
available_types.append('backup')
plist = []
for line_type in available_types:
format_arrays = {'flv': [], 'hls': [], 'lls': []}
qualities = sorted(resolution_data, key=lambda x: x['level'], reverse=True)
for quality in qualities:
sdk_key = quality['sdk_key']
if sdk_key in stream_json['data'] and line_type in stream_json['data'][sdk_key]:
stream_info = stream_json['data'][sdk_key][line_type]
if stream_info.get('flv'):
format_arrays['flv'].extend([quality['name'], stream_info['flv']])
if stream_info.get('hls'):
format_arrays['hls'].extend([quality['name'], stream_info['hls']])
if stream_info.get('lls'):
format_arrays['lls'].extend([quality['name'], stream_info['lls']])
format_urls = []
for format_name, url_array in format_arrays.items():
if url_array:
encoded_urls = self.e64(json.dumps(url_array))
format_urls.append(f"{format_name}${ids[0]}@@{encoded_urls}")
if format_urls:
plist.append('#'.join(format_urls))
names = ['线路1', '线路2'][:len(plist)]
vod['vod_play_from'] = "$$$".join(names)
vod['vod_play_url'] = "$$$".join(plist)
return vod
except Exception as e:
return self.handle_exception(e)
def douyuDetail(self, ids):
headers = self.gethr(0, zr=f'{self.hosts[ids[0]]}/{ids[1]}')
try:
data = self.fetch(f'{self.hosts[ids[0]]}/betard/{ids[1]}', headers=headers).json()
vname = data['room']['room_name']
vod = self.buildvod(
vod_name=vname,
vod_remarks=data['room'].get('second_lvl_name'),
vod_director=data['room'].get('nickname'),
)
vdata = self.fetch(f'{self.hosts[ids[0]]}/swf_api/homeH5Enc?rids={ids[1]}', headers=headers).json()
json_body = vdata['data']
json_body = {"html": self.douyu_text(json_body[f'room{ids[1]}']), "rid": ids[1]}
sign = self.post('http://alive.nsapps.cn/api/AllLive/DouyuSign', json=json_body, headers=self.headers[1]).json()['data']
body = f'{sign}&cdn=&rate=-1&ver=Douyu_223061205&iar=1&ive=1&hevc=0&fa=0'
body=self.params_to_json(body)
nubdata = self.post(f'{self.hosts[ids[0]]}/lapi/live/getH5Play/{ids[1]}', data=body, headers=headers).json()
plist = []
names = []
for i,x in enumerate(nubdata['data']['cdnsWithName']):
names.append(f'线路{i+1}')
d = {'sign': sign, 'cdn': x['cdn'], 'id': ids[1]}
plist.append(
f'{vname}${ids[0]}@@{self.e64(json.dumps(d))}@@{self.e64(json.dumps(nubdata["data"]["multirates"]))}')
vod['vod_play_from'] = "$$$".join(names)
vod['vod_play_url'] = "$$$".join(plist)
return vod
except Exception as e:
return self.handle_exception(e)
def douyu_text(self, text):
function_positions = [m.start() for m in re.finditer('function', text)]
total_functions = len(function_positions)
if total_functions % 2 == 0:
target_index = total_functions // 2 + 1
else:
target_index = (total_functions - 1) // 2 + 1
if total_functions >= target_index:
cut_position = function_positions[target_index - 1]
ctext = text[4:cut_position]
return re.sub(r'eval\(strc\)\([\w\d,]+\)', 'strc', ctext)
return text
def searchContent(self, key, quick, pg="1"):
pass
def playerContent(self, flag, id, vipFlags):
try:
ids = id.split('@@')
p = 1
if ids[0] in ['wangyi', 'douyin','huya']:
p, url = 0, json.loads(self.d64(ids[1]))
elif ids[0] == 'bili':
p, url = self.biliplay(ids)
elif ids[0] == 'huya':
p, url = 0, json.loads(self.d64(ids[1]))
elif ids[0] == 'douyu':
p, url = self.douyuplay(ids)
return {'parse': p, 'url': url, 'header': self.playheaders[ids[0]]}
except Exception as e:
return {'parse': 1, 'url': self.excepturl, 'header': self.headers[0]}
def biliplay(self, ids):
try:
data = self.fetch(
f'{self.hosts[ids[0]][0]}/xlive/web-room/v2/index/getRoomPlayInfo?room_id={ids[1]}&protocol=0,1&format=0,2&codec=0&platform=web&qn={ids[2]}',
headers=self.gethr(0, ids[0])).json()
urls = []
line_index = 1
for stream in data['data']['playurl_info']['playurl']['stream']:
for format_item in stream['format']:
for codec in format_item['codec']:
for url_info in codec['url_info']:
full_url = f"{url_info['host']}/{codec['base_url'].lstrip('/')}{url_info['extra']}"
urls.extend([f"线路{line_index}", full_url])
line_index += 1
return 0, urls
except Exception as e:
return 1, self.excepturl
def douyuplay(self, ids):
try:
sdata = json.loads(self.d64(ids[1]))
headers = self.gethr(0, zr=f'{self.hosts[ids[0]]}/{sdata["id"]}')
ldata = json.loads(self.d64(ids[2]))
result_obj = {}
with ThreadPoolExecutor(max_workers=len(ldata)) as executor:
futures = [
executor.submit(
self.douyufp,
sdata,
quality,
headers,
self.hosts[ids[0]],
result_obj
) for quality in ldata
]
for future in futures:
future.result()
result = []
for bit in sorted(result_obj.keys(), reverse=True):
result.extend(result_obj[bit])
if result:
return 0, result
return 1, self.excepturl
except Exception as e:
return 1, self.excepturl
def douyufp(self, sdata, quality, headers, host, result_obj):
try:
body = f'{sdata["sign"]}&cdn={sdata["cdn"]}&rate={quality["rate"]}'
body=self.params_to_json(body)
data = self.post(f'{host}/lapi/live/getH5Play/{sdata["id"]}',
data=body, headers=headers).json()
if data.get('data'):
play_url = data['data']['rtmp_url'] + '/' + data['data']['rtmp_live']
bit = quality.get('bit', 0)
if bit not in result_obj:
result_obj[bit] = []
result_obj[bit].extend([quality['name'], play_url])
except Exception as e:
print(f"Error fetching {quality['name']}: {str(e)}")
def localProxy(self, param):
pass
def e64(self, text):
try:
text_bytes = text.encode('utf-8')
encoded_bytes = b64encode(text_bytes)
return encoded_bytes.decode('utf-8')
except Exception as e:
print(f"Base64编码错误: {str(e)}")
return ""
def d64(self, encoded_text):
try:
encoded_bytes = encoded_text.encode('utf-8')
decoded_bytes = b64decode(encoded_bytes)
return decoded_bytes.decode('utf-8')
except Exception as e:
print(f"Base64解码错误: {str(e)}")
return ""
def josn_to_params(self, params, skip_empty=False):
query = []
for k, v in params.items():
if skip_empty and not v:
continue
query.append(f"{k}={v}")
return "&".join(query)
def params_to_json(self, query_string):
parsed_data = parse_qs(query_string)
result = {key: value[0] for key, value in parsed_data.items()}
return result
def buildvod(self, vod_id='', vod_name='', vod_pic='', vod_year='', vod_tag='', vod_remarks='', style='',
type_name='', vod_area='', vod_actor='', vod_director='',
vod_content='', vod_play_from='', vod_play_url=''):
vod = {
'vod_id': vod_id,
'vod_name': vod_name,
'vod_pic': vod_pic,
'vod_year': vod_year,
'vod_tag': 'folder' if vod_tag else '',
'vod_remarks': vod_remarks,
'style': style,
'type_name': type_name,
'vod_area': vod_area,
'vod_actor': vod_actor,
'vod_director': vod_director,
'vod_content': vod_content,
'vod_play_from': vod_play_from,
'vod_play_url': vod_play_url
}
vod = {key: value for key, value in vod.items() if value}
return vod
def getpq(self, url, headers=None, cookies=None):
data = self.fetch(url, headers=headers, cookies=cookies).text
try:
return pq(data)
except Exception as e:
print(f"解析页面错误: {str(e)}")
return pq(data.encode('utf-8'))
def gethr(self, index, rf='', zr=''):
headers = self.headers[index]
if zr:
headers['referer'] = zr
else:
headers['referer'] = f"{self.referers[rf]}/"
return headers
def handle_exception(self, e):
print(f"报错: {str(e)}")
return {'vod_play_from': '哎呀翻车啦', 'vod_play_url': f'翻车啦${self.excepturl}'}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,24 +0,0 @@
// 搜寻验证
var rule = {
title:'短视频',
host:'http://www.sharenice.net',
url:'/fyclass?page=fypage',
//searchUrl:'/video/search?search_key=**',
searchable:0,
quickSearch:0,
headers:{
'User-Agent':'PC_UA'
},
timeout:5000,
// class_name:'抖音&快手&微视&火山&场库&体育&美拍&秒拍&全民&梨&好兔&美女&正能量&搞笑&社会&游戏&娱乐&旅游&萌系&生活&音乐&美食&明星&动漫&影视&时尚',
class_name:'抖音&快手&微视&火山&场库&美拍&秒拍&全民&澎湃&好兔&开眼&美女&搞笑&社会&影视&音乐&娱乐&正能量&生活&动漫&体育&美食&萌系&旅游&游戏&明星&时尚',
// class_url:'douyin&kuaishou&weishi&huoshan&changku&tags/t-5L2T6IKy.html&meipai&miaopai&quanmin&lishipin&haotu&tags/t-576O5aWz.html&tags/t-5q2j6IO96YeP.html&tags/t-5pCe56yR.html&tags/t-56S+5Lya.html&tags/t-5ri45oiP.html&tags/t-5aix5LmQ.html&tags/t-5peF5ri4.html&tags/t-6JCM57O7.html&tags/t-55Sf5rS7.html&tags/t-6Z+z5LmQ.html&tags/t-576O6aOf.html&tags/t-5piO5pif.html&tags/t-5Yqo5ryr.html&tags/t-5b2x6KeG.html&tags/t-5pe25bCa.html',
class_url:'douyin&kuaishou&weishi&huoshan&changku&meipai&miaopai&quanmin&lishipin&haotu&kaiyan&t-576O5aWz&t-5pCe56yR&t-56S+5Lya&t-5b2x6KeG&t-6Z+z5LmQ&t-5aix5LmQ&t-5q2j6IO96YeP&t-55Sf5rS7&t-5Yqo5ryr&t-5L2T6IKy&t-576O6aOf&t-6JCM57O7&t-5peF5ri4&t-5ri45oiP&t-5piO5pif&t-5pe25bCa',
play_parse:true,
lazy:'js:/kuaishou/.test(input)?input=jsp.pdfh(request("http://m.sharenice.net/mobile"+input.split("net")[1]),".video-play-box&&video&&src"):input=jsp.pdfh(request("http://m.sharenice.net/mobile"+input.split("net")[1]),".video-play-box&&video&&src")+"#.mp4"',
limit:6,
double:false,
推荐:'*',
一级:'.item-box&&ul&&li;a&&title;img&&data-original;;a&&href',
二级:'*',
}

View File

@@ -1,25 +0,0 @@
var rule = {
title:'酷奇MV',
host:'https://www.kuqimv.com',
// homeUrl:'/play/',
url:'/play/fyclass_fypage.html',
searchUrl:'/search.php?key=**&pages=fypage',
searchable:2,
quickSearch:0,
// class_parse:'.main:eq(1)&&li;a&&Text;a&&href;.*/(\\d+)_1.html',
// class_parse:'.lei_class&&a;a&&Text;a&&href;.*/(\\d+)_1.html',
class_name:'华语高清&日韩精选&欧美MV&高清现场&影视MV&夜店视频&车模视频&热舞视频&美女写真&美女打碟',
class_url:'1&2&3&4&5&6&7&8&9&10',
headers:{
'User-Agent':'MOBILE_UA'
},
timeout:5000,
play_parse:true,
lazy:'',
limit:6,
double:false,
推荐:'*',
一级:'js:var d=[];pdfh=jsp.pdfh;pdfa=jsp.pdfa;pd=jsp.pd;var html=request(input);let list=pdfa(html,".mv_list&&li");list.forEach((it)=>{d.push({title:pdfh(it,".name&&Text"),desc:"🎤"+pdfh(it,".singer&&Text")+""+pdfh(it,".time&&Text"),pic_url:pd(it,"img&&src"),url:pd(it,"a&&href"),})});setResult(d);',
二级:'*',
搜索:'.video_list&&li;a&&title;;.singer&&Text;a&&href;.t_03:eq(1)&&Text',
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,782 +0,0 @@
{
"classes": [{
"type_name": "1年级语文",
"type_id": "1年级语文"
}, {
"type_name": "1年级数学",
"type_id": "1年级数学"
}, {
"type_name": "1年级英语",
"type_id": "1年级英语"
}, {
"type_name": "2年级语文",
"type_id": "2年级语文"
}, {
"type_name": "2年级数学",
"type_id": "2年级数学"
}, {
"type_name": "2年级英语",
"type_id": "2年级英语"
}, {
"type_name": "3年级语文",
"type_id": "3年级语文"
}, {
"type_name": "3年级数学",
"type_id": "3年级数学"
}, {
"type_name": "3年级英语",
"type_id": "3年级英语"
}, {
"type_name": "4年级语文",
"type_id": "4年级语文"
}, {
"type_name": "4年级数学",
"type_id": "4年级数学"
}, {
"type_name": "4年级英语",
"type_id": "4年级英语"
}, {
"type_name": "5年级语文",
"type_id": "5年级语文"
}, {
"type_name": "5年级数学",
"type_id": "5年级数学"
}, {
"type_name": "5年级英语",
"type_id": "5年级英语"
}, {
"type_name": "6年级语文",
"type_id": "6年级语文"
}, {
"type_name": "6年级数学",
"type_id": "6年级数学"
}, {
"type_name": "6年级英语",
"type_id": "6年级英语"
}],
"cookie": "SESSDATA=01c79709%2C1711618905%2C244c3%2A91CjA9UUnRb_kJg03J5FqUbin76yMY90o1-ckJsM1ItQH21ns4hgcS6Le6oMR3SKtC18QSVmxSbGRhN3cyS3NReERsOHRfYVlhTWJKZjZyTF9wUWJXbjNfaF9qWklFMFpoeVg1ZUhFb0Q0MGFiN3FYd1N3UEFEY1oxX29IdmFSRVVLamcybGhhSkJnIIEC; bili_jct=e9d6e9df733afde2a03693d63a4e77dc; DedeUserID=186957646; DedeUserID__ckMd5=4f717c8832ee1e62; sid=elhiqom1",
"filter": {
"1年级语文": [{
"key": "tid",
"name": "分类",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "沪教版",
"v": "沪教版1年级语文"
}, {
"n": "人教版",
"v": "人教版1年级语文"
}, {
"n": "北师大版",
"v": "北师大版1年级语文"
}, {
"n": "苏教版",
"v": "苏教版1年级语文"
}]
}, {
"key": "duration",
"name": "时长",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "60分钟以上",
"v": "4"
}, {
"n": "30~60分钟",
"v": "3"
}, {
"n": "10~30分钟",
"v": "2"
}, {
"n": "10分钟以下",
"v": "1"
}]
}],
"1年级英语": [{
"key": "tid",
"name": "分类",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "沪教版",
"v": "沪教版1年级英语"
}, {
"n": "人教版",
"v": "人教版1年级英语"
}, {
"n": "北师大版",
"v": "北师大版1年级英语"
}, {
"n": "苏教版",
"v": "苏教版1年级英语"
}]
}, {
"key": "duration",
"name": "时长",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "60分钟以上",
"v": "4"
}, {
"n": "30~60分钟",
"v": "3"
}, {
"n": "10~30分钟",
"v": "2"
}, {
"n": "10分钟以下",
"v": "1"
}]
}],
"1年级数学": [{
"key": "tid",
"name": "分类",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "沪教版",
"v": "沪教版1年级数学"
}, {
"n": "人教版",
"v": "人教版1年级数学"
}, {
"n": "北师大版",
"v": "北师大版1年级数学"
}, {
"n": "苏教版",
"v": "苏教版1年级数学"
}, {
"n": "青岛版",
"v": "青岛版1年级数学"
}]
}, {
"key": "duration",
"name": "时长",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "60分钟以上",
"v": "4"
}, {
"n": "30~60分钟",
"v": "3"
}, {
"n": "10~30分钟",
"v": "2"
}, {
"n": "10分钟以下",
"v": "1"
}]
}],
"2年级语文": [{
"key": "tid",
"name": "分类",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "沪教版",
"v": "沪教版2年级语文"
}, {
"n": "人教版",
"v": "人教版2年级语文"
}, {
"n": "北师大版",
"v": "北师大版2年级语文"
}, {
"n": "苏教版",
"v": "苏教版2年级语文"
}]
}, {
"key": "duration",
"name": "时长",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "60分钟以上",
"v": "4"
}, {
"n": "30~60分钟",
"v": "3"
}, {
"n": "10~30分钟",
"v": "2"
}, {
"n": "10分钟以下",
"v": "1"
}]
}],
"2年级英语": [{
"key": "tid",
"name": "分类",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "沪教版",
"v": "沪教版2年级英语"
}, {
"n": "人教版",
"v": "人教版2年级英语"
}, {
"n": "北师大版",
"v": "北师大版2年级英语"
}, {
"n": "苏教版",
"v": "苏教版2年级英语"
}]
}, {
"key": "duration",
"name": "时长",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "60分钟以上",
"v": "4"
}, {
"n": "30~60分钟",
"v": "3"
}, {
"n": "10~30分钟",
"v": "2"
}, {
"n": "10分钟以下",
"v": "1"
}]
}],
"2年级数学": [{
"key": "tid",
"name": "分类",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "沪教版",
"v": "沪教版2年级数学"
}, {
"n": "人教版",
"v": "人教版2年级数学"
}, {
"n": "北师大版",
"v": "北师大版2年级数学"
}, {
"n": "苏教版",
"v": "苏教版2年级数学"
}, {
"n": "青岛版",
"v": "青岛版2年级数学"
}]
}, {
"key": "duration",
"name": "时长",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "60分钟以上",
"v": "4"
}, {
"n": "30~60分钟",
"v": "3"
}, {
"n": "10~30分钟",
"v": "2"
}, {
"n": "10分钟以下",
"v": "1"
}]
}],
"3年级语文": [{
"key": "tid",
"name": "分类",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "沪教版",
"v": "沪教版3年级语文"
}, {
"n": "人教版",
"v": "人教版3年级语文"
}, {
"n": "北师大版",
"v": "北师大版3年级语文"
}, {
"n": "苏教版",
"v": "苏教版3年级语文"
}]
}, {
"key": "duration",
"name": "时长",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "60分钟以上",
"v": "4"
}, {
"n": "30~60分钟",
"v": "3"
}, {
"n": "10~30分钟",
"v": "2"
}, {
"n": "10分钟以下",
"v": "1"
}]
}],
"3年级英语": [{
"key": "tid",
"name": "分类",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "沪教版",
"v": "沪教版3年级英语"
}, {
"n": "人教版",
"v": "人教版3年级英语"
}, {
"n": "北师大版",
"v": "北师大版3年级英语"
}, {
"n": "苏教版",
"v": "苏教版3年级英语"
}]
}, {
"key": "duration",
"name": "时长",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "60分钟以上",
"v": "4"
}, {
"n": "30~60分钟",
"v": "3"
}, {
"n": "10~30分钟",
"v": "2"
}, {
"n": "10分钟以下",
"v": "1"
}]
}],
"3年级数学": [{
"key": "tid",
"name": "分类",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "沪教版",
"v": "沪教版3年级数学"
}, {
"n": "人教版",
"v": "人教版3年级数学"
}, {
"n": "北师大版",
"v": "北师大版3年级数学"
}, {
"n": "苏教版",
"v": "苏教版3年级数学"
}, {
"n": "青岛版",
"v": "青岛版3年级数学"
}]
}, {
"key": "duration",
"name": "时长",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "60分钟以上",
"v": "4"
}, {
"n": "30~60分钟",
"v": "3"
}, {
"n": "10~30分钟",
"v": "2"
}, {
"n": "10分钟以下",
"v": "1"
}]
}],
"4年级语文": [{
"key": "tid",
"name": "分类",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "沪教版",
"v": "沪教版4年级语文"
}, {
"n": "人教版",
"v": "人教版4年级语文"
}, {
"n": "北师大版",
"v": "北师大版4年级语文"
}, {
"n": "苏教版",
"v": "苏教版4年级语文"
}]
}, {
"key": "duration",
"name": "时长",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "60分钟以上",
"v": "4"
}, {
"n": "30~60分钟",
"v": "3"
}, {
"n": "10~30分钟",
"v": "2"
}, {
"n": "10分钟以下",
"v": "1"
}]
}],
"4年级英语": [{
"key": "tid",
"name": "分类",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "沪教版",
"v": "沪教版4年级英语"
}, {
"n": "人教版",
"v": "人教版4年级英语"
}, {
"n": "北师大版",
"v": "北师大版4年级英语"
}, {
"n": "苏教版",
"v": "苏教版4年级英语"
}]
}, {
"key": "duration",
"name": "时长",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "60分钟以上",
"v": "4"
}, {
"n": "30~60分钟",
"v": "3"
}, {
"n": "10~30分钟",
"v": "2"
}, {
"n": "10分钟以下",
"v": "1"
}]
}],
"4年级数学": [{
"key": "tid",
"name": "分类",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "沪教版",
"v": "沪教版4年级数学"
}, {
"n": "人教版",
"v": "人教版4年级数学"
}, {
"n": "北师大版",
"v": "北师大版4年级数学"
}, {
"n": "苏教版",
"v": "苏教版4年级数学"
}, {
"n": "青岛版",
"v": "青岛版4年级数学"
}]
}, {
"key": "duration",
"name": "时长",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "60分钟以上",
"v": "4"
}, {
"n": "30~60分钟",
"v": "3"
}, {
"n": "10~30分钟",
"v": "2"
}, {
"n": "10分钟以下",
"v": "1"
}]
}],
"5年级语文": [{
"key": "tid",
"name": "分类",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "沪教版",
"v": "沪教版5年级语文"
}, {
"n": "人教版",
"v": "人教版5年级语文"
}, {
"n": "北师大版",
"v": "北师大版5年级语文"
}, {
"n": "苏教版",
"v": "苏教版5年级语文"
}]
}, {
"key": "duration",
"name": "时长",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "60分钟以上",
"v": "4"
}, {
"n": "30~60分钟",
"v": "3"
}, {
"n": "10~30分钟",
"v": "2"
}, {
"n": "10分钟以下",
"v": "1"
}]
}],
"5年级英语": [{
"key": "tid",
"name": "分类",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "沪教版",
"v": "沪教版5年级英语"
}, {
"n": "人教版",
"v": "人教版5年级英语"
}, {
"n": "北师大版",
"v": "北师大版5年级英语"
}, {
"n": "苏教版",
"v": "苏教版5年级英语"
}]
}, {
"key": "duration",
"name": "时长",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "60分钟以上",
"v": "4"
}, {
"n": "30~60分钟",
"v": "3"
}, {
"n": "10~30分钟",
"v": "2"
}, {
"n": "10分钟以下",
"v": "1"
}]
}],
"5年级数学": [{
"key": "tid",
"name": "分类",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "沪教版",
"v": "沪教版5年级数学"
}, {
"n": "人教版",
"v": "人教版5年级数学"
}, {
"n": "北师大版",
"v": "北师大版5年级数学"
}, {
"n": "苏教版",
"v": "苏教版5年级数学"
}, {
"n": "青岛版",
"v": "青岛版5年级数学"
}]
}, {
"key": "duration",
"name": "时长",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "60分钟以上",
"v": "4"
}, {
"n": "30~60分钟",
"v": "3"
}, {
"n": "10~30分钟",
"v": "2"
}, {
"n": "10分钟以下",
"v": "1"
}]
}],
"6年级语文": [{
"key": "tid",
"name": "分类",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "沪教版",
"v": "沪教版6年级语文"
}, {
"n": "人教版",
"v": "人教版6年级语文"
}, {
"n": "北师大版",
"v": "北师大版6年级语文"
}, {
"n": "苏教版",
"v": "苏教版6年级语文"
}]
}, {
"key": "duration",
"name": "时长",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "60分钟以上",
"v": "4"
}, {
"n": "30~60分钟",
"v": "3"
}, {
"n": "10~30分钟",
"v": "2"
}, {
"n": "10分钟以下",
"v": "1"
}]
}],
"6年级英语": [{
"key": "tid",
"name": "分类",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "沪教版",
"v": "沪教版6年级英语"
}, {
"n": "人教版",
"v": "人教版6年级英语"
}, {
"n": "北师大版",
"v": "北师大版6年级英语"
}, {
"n": "苏教版",
"v": "苏教版6年级英语"
}]
}, {
"key": "duration",
"name": "时长",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "60分钟以上",
"v": "4"
}, {
"n": "30~60分钟",
"v": "3"
}, {
"n": "10~30分钟",
"v": "2"
}, {
"n": "10分钟以下",
"v": "1"
}]
}],
"6年级数学": [{
"key": "tid",
"name": "分类",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "沪教版",
"v": "沪教版6年级数学"
}, {
"n": "人教版",
"v": "人教版6年级数学"
}, {
"n": "北师大版",
"v": "北师大版6年级数学"
}, {
"n": "苏教版",
"v": "苏教版6年级数学"
}, {
"n": "青岛版",
"v": "青岛版6年级数学"
}]
}, {
"key": "duration",
"name": "时长",
"value": [{
"n": "全部",
"v": "0"
}, {
"n": "60分钟以上",
"v": "4"
}, {
"n": "30~60分钟",
"v": "3"
}, {
"n": "10~30分钟",
"v": "2"
}, {
"n": "10分钟以下",
"v": "1"
}]
}]
}
}

View File

@@ -1,476 +0,0 @@
{
"classes": [
{
"type_name": "儿童早教",
"type_id": "儿童早教"
},
{
"type_name": "儿童启蒙故事",
"type_id": "儿童启蒙故事"
},
{
"type_name": "儿童英语启蒙",
"type_id": "儿童英语启蒙"
},
{
"type_name": "儿童歌曲",
"type_id": "儿童歌曲"
},
{
"type_name": "儿童绘画",
"type_id": "儿童绘画"
},
{
"type_name": "睡前故事",
"type_id": "睡前故事"
},
{
"type_name": "儿童动画",
"type_id": "儿童动画"
},
{
"type_name": "儿童音乐",
"type_id": "儿童音乐"
},
{
"type_name": "儿童安全教育",
"type_id": "儿童安全教育"
},
{
"type_name": "贝瓦儿歌",
"type_id": "贝瓦儿歌"
},
{
"type_name": "悟空识字",
"type_id": "悟空识字"
},
{
"type_name": "宝宝巴士",
"type_id": "宝宝巴士"
},
{
"type_name": "儿歌多多",
"type_id": "儿歌多多"
},
{
"type_name": "学而思",
"type_id": "学而思"
}],
"cookie": "SESSDATA=01c79709%2C1711618905%2C244c3%2A91CjA9UUnRb_kJg03J5FqUbin76yMY90o1-ckJsM1ItQH21ns4hgcS6Le6oMR3SKtC18QSVmxSbGRhN3cyS3NReERsOHRfYVlhTWJKZjZyTF9wUWJXbjNfaF9qWklFMFpoeVg1ZUhFb0Q0MGFiN3FYd1N3UEFEY1oxX29IdmFSRVVLamcybGhhSkJnIIEC; bili_jct=e9d6e9df733afde2a03693d63a4e77dc; DedeUserID=186957646; DedeUserID__ckMd5=4f717c8832ee1e62; sid=elhiqom1",
"filter": {
"儿童早教": [
{
"key": "duration",
"name": "时长",
"value": [
{
"n": "全部",
"v": "0"
},
{
"n": "60分钟以上",
"v": "4"
},
{
"n": "30~60分钟",
"v": "3"
},
{
"n": "10~30分钟",
"v": "2"
},
{
"n": "10分钟以下",
"v": "1"
}
]
}
],
"儿童启蒙故事": [
{
"key": "duration",
"name": "时长",
"value": [
{
"n": "全部",
"v": "0"
},
{
"n": "60分钟以上",
"v": "4"
},
{
"n": "30~60分钟",
"v": "3"
},
{
"n": "10~30分钟",
"v": "2"
},
{
"n": "10分钟以下",
"v": "1"
}
]
}
],
"儿童英语启蒙": [
{
"key": "duration",
"name": "时长",
"value": [
{
"n": "全部",
"v": "0"
},
{
"n": "60分钟以上",
"v": "4"
},
{
"n": "30~60分钟",
"v": "3"
},
{
"n": "10~30分钟",
"v": "2"
},
{
"n": "10分钟以下",
"v": "1"
}
]
}
],
"儿童歌曲": [
{
"key": "duration",
"name": "时长",
"value": [
{
"n": "全部",
"v": "0"
},
{
"n": "60分钟以上",
"v": "4"
},
{
"n": "30~60分钟",
"v": "3"
},
{
"n": "10~30分钟",
"v": "2"
},
{
"n": "10分钟以下",
"v": "1"
}
]
}
],
"儿童绘画": [
{
"key": "duration",
"name": "时长",
"value": [
{
"n": "全部",
"v": "0"
},
{
"n": "60分钟以上",
"v": "4"
},
{
"n": "30~60分钟",
"v": "3"
},
{
"n": "10~30分钟",
"v": "2"
},
{
"n": "10分钟以下",
"v": "1"
}
]
}
],
"睡前故事": [
{
"key": "duration",
"name": "时长",
"value": [
{
"n": "全部",
"v": "0"
},
{
"n": "60分钟以上",
"v": "4"
},
{
"n": "30~60分钟",
"v": "3"
},
{
"n": "10~30分钟",
"v": "2"
},
{
"n": "10分钟以下",
"v": "1"
}
]
}
],
"儿童动画": [
{
"key": "duration",
"name": "时长",
"value": [
{
"n": "全部",
"v": "0"
},
{
"n": "60分钟以上",
"v": "4"
},
{
"n": "30~60分钟",
"v": "3"
},
{
"n": "10~30分钟",
"v": "2"
},
{
"n": "10分钟以下",
"v": "1"
}
]
}
],
"儿童音乐": [
{
"key": "duration",
"name": "时长",
"value": [
{
"n": "全部",
"v": "0"
},
{
"n": "60分钟以上",
"v": "4"
},
{
"n": "30~60分钟",
"v": "3"
},
{
"n": "10~30分钟",
"v": "2"
},
{
"n": "10分钟以下",
"v": "1"
}
]
}
],
"儿童安全教育": [
{
"key": "duration",
"name": "时长",
"value": [
{
"n": "全部",
"v": "0"
},
{
"n": "60分钟以上",
"v": "4"
},
{
"n": "30~60分钟",
"v": "3"
},
{
"n": "10~30分钟",
"v": "2"
},
{
"n": "10分钟以下",
"v": "1"
}
]
}
],
"贝瓦儿歌": [
{
"key": "duration",
"name": "时长",
"value": [
{
"n": "全部",
"v": "0"
},
{
"n": "60分钟以上",
"v": "4"
},
{
"n": "30~60分钟",
"v": "3"
},
{
"n": "10~30分钟",
"v": "2"
},
{
"n": "10分钟以下",
"v": "1"
}
]
}
],
"悟空识字": [
{
"key": "duration",
"name": "时长",
"value": [
{
"n": "全部",
"v": "0"
},
{
"n": "60分钟以上",
"v": "4"
},
{
"n": "30~60分钟",
"v": "3"
},
{
"n": "10~30分钟",
"v": "2"
},
{
"n": "10分钟以下",
"v": "1"
}
]
}
],
"宝宝巴士": [
{
"key": "duration",
"name": "时长",
"value": [
{
"n": "全部",
"v": "0"
},
{
"n": "60分钟以上",
"v": "4"
},
{
"n": "30~60分钟",
"v": "3"
},
{
"n": "10~30分钟",
"v": "2"
},
{
"n": "10分钟以下",
"v": "1"
}
]
}
],
"儿歌多多": [
{
"key": "duration",
"name": "时长",
"value": [
{
"n": "全部",
"v": "0"
},
{
"n": "60分钟以上",
"v": "4"
},
{
"n": "30~60分钟",
"v": "3"
},
{
"n": "10~30分钟",
"v": "2"
},
{
"n": "10分钟以下",
"v": "1"
}
]
}
],
"学而思": [
{
"key": "duration",
"name": "时长",
"value": [
{
"n": "全部",
"v": "0"
},
{
"n": "60分钟以上",
"v": "4"
},
{
"n": "30~60分钟",
"v": "3"
},
{
"n": "10~30分钟",
"v": "2"
},
{
"n": "10分钟以下",
"v": "1"
}
]
}
]
}}

File diff suppressed because it is too large Load Diff

Binary file not shown.