先從可直接修改的配置開始
先選擇點播或直播的完整配置,再替換名稱、路徑與需要的欄位。後續各節另有標明層級的物件片段,需放入對應欄位。
範例位置說明主配置中的 ./ 與 ../ 會以該配置檔的位置展開;外部陣列檔或直播列表內的路徑不會再次展開,請使用完整網址。example.com 與保留測試 IP 只用來展示結構,並不是可用來源。
點播配置:Java、JS、Python
JSON / VodConfigvod.json
{
"spider": "./spider.jar",
"sites": [
{
"key": "java_demo",
"name": "Java Demo",
"type": 3,
"api": "csp_Demo"
},
{
"key": "js_demo",
"name": "JavaScript Demo",
"type": 3,
"api": "./demo.js",
"ext": { "region": "tw" }
},
{
"key": "py_demo",
"name": "Python Demo",
"type": 3,
"api": "./demo.py"
}
],
"parses": [
{
"name": "JSON 解析範例",
"type": 1,
"url": "https://example.com/parse?url=",
"ext": {
"flag": ["demo"],
"header": { "User-Agent": "ExampleClient/1.0" }
}
}
]
}
Java 使用 csp_ 類別名稱;JS 與 Python 檔案使用 ./ 相對路徑。
直播配置:外部 M3U
JSON / LiveConfiglive-config.json
{
"lives": [
{
"name": "M3U 範例",
"url": "./live.m3u",
"epg": "https://example.com/epg.xml",
"logo": "https://example.com/logo/{id}.png",
"ua": "ExampleClient/1.0",
"timeZone": "Asia/Taipei",
"boot": false
}
]
}
url 也可改成 ./live.txt 或 ./live.json;內容格式會由 LiveParser 判斷。
VodConfig 頂層欄位
主要配置入口。只有 headers、proxy、rules、doh 等經過 fetchArray 的欄位,才支援物件陣列、外部位置或兩者混用。
配置倉庫 Depot
JSON / Depotdepot.json
{
"urls": [
{ "name": "同目錄配置", "url": "./vod.json" },
{ "name": "遠端配置", "url": "https://example.com/vod.json" }
]
}
頂層出現 urls 時,App 登記清單後會載入第一項配置,清單不可為空;每一項包含 name 與 url。
可引用外部陣列的欄位
JSON / arraysVodConfig 頂層欄位片段
{
"doh": "./doh.json",
"headers": [
"./headers.json",
{
"host": "media.example.com",
"header": { "Referer": "https://example.com/" }
}
],
"proxy": "./proxy.json",
"rules": [
"./rules.json",
{
"name": "媒體請求範例",
"hosts": ["player.example.com"],
"regex": [".*m3u8.*"],
"exclude": [".*preview.*"]
}
]
}
整個欄位可以是一個位置,也可以在陣列中混用外部 JSON 位置與內嵌物件。外部檔案本身必須回傳 JSON 陣列。
Site 點播站點
0XML HTTP1JSON HTTP3JAR / JS / PY4HTTP 擴充
Type 3 站點範例
JSON / Sitesites[] 物件片段
{
"key": "js_demo",
"name": "JavaScript Demo",
"type": 3,
"api": "./demo.js",
"ext": { "region": "tw" },
"searchable": 1,
"changeable": 1,
"categories": ["電影", "戲劇"],
"header": { "User-Agent": "ExampleClient/1.0" },
"style": { "type": "rect", "ratio": 1.33 }
}
改用 Python 時只需把 api 換成 ./demo.py;Java 類別則填 csp_Demo。相對路徑也適用於 ext 與 jar。
Parse URL 處理規則
WebView 與 JSON API 範例
JSON / Parseparses 欄位值
[
{
"name": "WebView 解析範例",
"type": 0,
"url": "https://example.com/web?url="
},
{
"name": "JSON API 解析範例",
"type": 1,
"url": "https://example.com/api?url=",
"ext": {
"flag": ["demo"],
"header": { "Referer": "https://example.com/" }
}
}
]
parses 的值是陣列;ext.flag 是 type 4 並行解析的優先比對條件,不是全域白名單。ext.header 也可能作為解析結果的預設播放標頭,詳見上表。
LiveConfig 與直播來源
獨立 LiveConfig 的 JSON 頂層使用 lives,並支援 spider、headers、proxy、rules、hosts、ads、urls 與 msg;不讀取獨立的 doh。下表說明 lives[] 中的 Live 來源物件。
url 與 groups 通常擇一;groups 為空且提供 api 時,會先呼叫 Spider 的 liveContent(url) 取得文字,再交由 LiveParser 判斷格式。
同名配置已保存的 boot、pass 與 keep 可能覆蓋配置值;請同時檢查 App 內的已保存設定。
載入外部列表
JSON / LiveConfiglive-config.json
{
"lives": [
{
"name": "M3U 範例",
"url": "./live.m3u",
"epg": "https://example.com/epg.xml",
"logo": "https://example.com/logo/{id}.png",
"ua": "ExampleClient/1.0",
"timeZone": "Asia/Taipei",
"boot": false
}
]
}
這是含 lives 陣列的完整 LiveConfig;url 指向可獨立維護的 M3U、TXT 或 JSON 檔案。
直接內嵌 Group / Channel
JSON / LiveConfiglive-config.json
{
"lives": [
{
"name": "內嵌 JSON 範例",
"groups": [
{
"name": "新聞",
"channel": [
{
"name": "範例一台",
"number": "1",
"tvgId": "demo-1",
"urls": [
"https://example.com/live/main.m3u8$主線",
"https://example.com/live/backup.m3u8$備線"
],
"header": { "Referer": "https://example.com/" }
}
]
}
]
}
]
}
$主線、$備線 是線路標籤;同一頻道可以提供多個位置。直接內嵌 groups 不經外部列表的自動編號與預設值繼承,請在 Channel 明確設定需要的欄位。
分組與頻道欄位
若 JSON 是由 Live.url 載入,檔案最外層直接放 Group 陣列,如下一節的 JSON 範例;若寫在主配置內,則放進 lives[].groups。
特殊播放核心欄位
Live.core 只在對應播放核心初始化時使用;一般直播配置不需要填寫。以下示範它在 Live 物件中的位置;option 的名稱與值由該核心實作定義,不是通用配置參數。
JSON / Live.corelives[] 物件片段
{
"name": "特殊核心示意",
"url": "./live.m3u",
"core": {
"auth": "https://example.com/core/auth",
"name": "demo",
"pass": "demo-pass",
"broker": "https://example.com/core/broker",
"domain": "example.com",
"so": "https://example.com/core/libcore.so",
"option": []
}
}
網路、時移與顯示物件
DoH、Proxy、Hosts 與 Ads
JSON / sharedVodConfig 頂層欄位片段
{
"doh": [
{
"name": "Example DoH",
"url": "https://dns.example.com/dns-query",
"ips": ["203.0.113.53"]
}
],
"proxy": [
{
"name": "本機代理範例",
"hosts": ["media.example.com"],
"urls": ["http://127.0.0.1:8080", "socks5://127.0.0.1:1080"]
}
],
"hosts": ["media.example.com=203.0.113.10"],
"ads": ["ads.example.com"]
}
代理位置必須包含 scheme、host 與 port;hosts 使用 原主機=目標主機或 IP。
追看 / 時移 Catchup
JSON / Live.catchuplives[] 物件片段
{
"name": "時移示意",
"url": "./live.m3u",
"catchup": {
"type": "append",
"days": "7",
"regex": "example.com/live/",
"source": "?playseek=${(b)yyyyMMddHHmmss}-${(e)yyyyMMddHHmmss}",
"replace": "live/,archive/"
}
}
${(b)yyyyMMddHHmmss} 與 ${(e)yyyyMMddHHmmss} 會分別替換為節目開始與結束時間,格式化使用裝置系統時區,不使用 Live.timeZone。