无插件 - 赛事直播

http://www.wuchajian.xyz

jianghubailei (2226)5天前

只支持新包名版(体积19MB),或者Sigma版

搜索支持多关键字,用空格隔开

部分线路无法播放,更换线路

备用地址:http://www.yoozb.live
二维码导入
{
    "bookSourceComment": "只支持新包名版(体积19MB),或者Sigma版\n\n搜索支持多关键字,用空格隔开\n\n部分线路无法播放,更换线路\n\n备用地址:http:\/\/www.yoozb.live",
    "bookSourceGroup": "直播",
    "bookSourceName": "无插件 - 赛事直播",
    "bookSourceType": 4,
    "bookSourceUrl": "http:\/\/www.wuchajian.xyz",
    "customButton": false,
    "customOrder": 1,
    "enabled": true,
    "enabledCookieJar": true,
    "enabledExplore": true,
    "eventListener": false,
    "exploreUrl": "@js:\nconst list = []\nconst push = (title, url, size) => list.push({\n  title,\n  url,\n  style: {layout_flexBasisPercent: size}\n});\n\nconst url = source.key + \"\/m.html\";\nlet time = +String(java.get(\"wuchajian_time\"))\nlet html = String(java.get(\"wuchajian\"));\n\nif(!html || Date.now() - time > 3.6e6){\n  html = java.ajax(url);\n  java.put(\"wuchajian\", html);\n  java.put(\"wuchajian_time\", Date.now());\n}\n\npush(\"全部赛事\", url, 0.29);\n\nconst doc = org.jsoup.Jsoup.parse(html);\nconst leagues = new Set();\n\ndoc.select(\"[data-role=content] .league\")\n.forEach(el => leagues.add(String(el.text())));\n\nleagues.forEach(lg =>\n  push(lg, `${url}#${encodeURI(lg)}`, 0.29)\n)\n\nJSON.stringify(list)",
    "header": "{\"User-Agent\":\"Mozilla\/5.0 (iPhone; CPU iPhone OS 17_2_1 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/17.2 Mobile\/15E148 Safari\/604.1\"}",
    "jsLib": "function hitRateFilter(arr, keyWords = '', exactLeague = false) {\n  if (!Array.isArray(arr)) return [];\n  const words = keyWords\n    .trim()\n    .split(\/\\s+\/)\n    .filter(Boolean);\n \n  if (!words.length) return arr.slice();\n\n  const regs = words.map(w => new RegExp(w.replace(\/[.*+?^${}()|[\\]\\\\]\/g, '\\\\$&'), 'i'));\n\n  const extract = obj =>\n    Object.values(obj)\n      .map(String)\n      .join(' ');\n\n  const scored = [];\n  \n  for (let item of arr) {\n  \t if (exactLeague) {\n      let league = String(item.league || '');\n      let hit = words.some(w => w == league);\n      if (!hit) continue;\n    }\n    let hits = regs.reduce((n, r) => n + r.test(extract(item)), 0);\n    if (hits) scored.push({ item, rate: hits \/ words.length });\n  }\n  \n  scored.sort((a, b) => b.rate - a.rate);\n  \n  return scored.map(x => x.item);\n}\n\n",
    "lastUpdateTime": "1768214087015",
    "loginUi": "[\n  {\n    \"name\": \"清空发现缓存\",\n    \"type\": \"button\",\n    \"action\": \"clear()\"\n  }\n]",
    "loginUrl": "function login(){}\n\nfunction clear(){\n\t java.put(\"wuchajian\", \"\")\n\t source.refreshExplore()\n}",
    "respondTime": 180000,
    "ruleBookInfo": {},
    "ruleContent": {
        "content": "<js>\nif(result){\n  result.replace(\/.*?=\/, \"\")\n}else{\n  java.toast(\"没有嗅探到资源\")\n} \n<\/js>",
        "sourceRegex": ".*(?:index\\.m3u8|jhyun\\.m3u8|playlist\\.m3u8$|\\.m3u8?|\\.mp4|\\.m3u8$).*"
    },
    "ruleExplore": {},
    "ruleSearch": {
        "bookList": "@js:\nconst isStrict = !baseUrl.endsWith(\"#\");\nconst keys = decodeURI(baseUrl.split(\"#\")?.[1] || \"\");\n\nconst html = result.replace(\/^\\s*(<li>.*?)<li>\\s*$\/gm, \"$1<\/li>\");\n\nconst doc = org.jsoup.Jsoup.parse(html);\nconst resList = [];\n\nlet currDate = \"\";\n\ndoc.select('[role=\"main\"] li').forEach(li => {\n    let divider = li.select('li[data-theme=b]');\n    if (divider.size() > 0) {\n        currDate = divider.text().trim();\n        return;\n    }\n\n    let a = li.select('a').first();\n    if (!a) return;\n    \n    let fullText = String(a.text());\n    let title = fullText.replace(\/^.*\\d{2}:\\d{2}\/, '').trim();\n    let league = li.select('.league').text().trim();\n    let status = li.select('.close').size()  \n                       ? \"已结束\" \n                       : li.select('.live').size()\n                         ? \"直播中\"  \n                         : '未开赛';\n                         \n    let time = fullText.match(\/\\d{2}:\\d{2}\/)?.[0]\n    let datetime = currDate + (time ? ' ' + time : '');\n    let kind = [league, status];\n    \n    let id = a.attr('href');\n    let links = doc.select(id).select(\"a\")\n                    .toArray()\n                    .filter(link=>link.attr(\"href\").startsWith(\"http\"))\n                    .map(String);\n    let json = JSON.stringify(links);\n    let url = `data:;base64,${java.base64Encode(json)},{\"type\":\"\"}`\n    \n    resList.push({\n        title,\n        datetime,\n        league,\n        kind,\n        url\n    });\n});\n\nconst results = hitRateFilter(resList, keys, isStrict);\nif(results.length === 0){\n\t results.push({\n    title: `没有找到与“${keys}”相关的赛事`,\n    datetime: \"尽量缩短关键字,字越多,越搜不到\"\n  })\n}\nresults",
        "bookUrl": "url",
        "checkKeyWord": "CBA",
        "intro": "datetime",
        "kind": "kind",
        "name": "title"
    },
    "ruleToc": {
        "chapterList": "@js:\nJSON.parse(java.hexDecodeToString(result))",
        "chapterName": "text",
        "chapterUrl": "a@href##$##,{\"webView\": true}"
    },
    "searchUrl": "\/m.html#{{encodeURI(key)}}#",
    "weight": 0
}
广告