diff --git a/README.md b/README.md index 34657e534..35f001e67 100644 --- a/README.md +++ b/README.md @@ -132,3 +132,4 @@ Live 配置可內嵌或獨立存放。完整欄位說明見 [CONFIG.md](docs/CON | [CONFIG.md](docs/CONFIG.md) | Vod / Live 完整配置欄位說明 | | [SPIDER.md](docs/SPIDER.md) | Spider 所有方法規格與回傳格式 | | [LOCAL.md](docs/LOCAL.md) | 本地 HTTP API 所有端點完整說明 | +| [LIVE.md](docs/LIVE.md) | 直播來源格式完整說明 | diff --git a/docs/CONFIG.md b/docs/CONFIG.md index 270ff5c09..635e8d26b 100644 --- a/docs/CONFIG.md +++ b/docs/CONFIG.md @@ -72,6 +72,7 @@ Vod 配置為一個 JSON 物件,作為應用程式的主要配置入口。配 | `searchable` | `integer` | 搜尋開關。`0`=停用,`1`=啟用(預設)。 | | `changeable` | `integer` | 線路切換開關。`0`=停用,`1`=啟用(預設)。 | | `quickSearch` | `integer` | 快速搜尋開關。`0`=停用,`1`=啟用。 | +| `indexs` | `integer` | 索引模式旗標。`1` 表示此來源作為索引來源使用。 | | `categories` | `array` | 顯示的分類名稱白名單,僅顯示清單中的分類。 | | `header` | `object` | 此來源請求時附加的 HTTP 標頭,格式為鍵值對。 | | `style` | `Style` | 卡片顯示樣式。詳見 [style](#style--卡片樣式)。 | @@ -198,7 +199,7 @@ Live 配置可以是獨立的 JSON 檔案,或內嵌於 Vod 配置的 `lives` | `catchup` | `Catchup` | 追看/時移設定,作為此來源所有頻道的預設值。詳見 [catchup](#catchup--追看時移)。 | | `groups` | `array` | 直播頻道分組清單(內嵌方式)。詳見 [groups](#groups--頻道分組)。 | | `boot` | `boolean` | 是否在應用啟動時自動選中此直播來源。多個來源設定時,最後一個生效。 | -| `pass` | `boolean` | `true` 表示略過此直播來源的載入。 | +| `pass` | `boolean` | `true` 表示略過密碼保護,強制顯示此來源所有分組(含設有密碼的隱藏分組)。 | **範例:** @@ -253,24 +254,24 @@ Live 配置可以是獨立的 JSON 檔案,或內嵌於 Vod 配置的 `lives` `channel` 為 `Channel` 物件陣列,每個物件代表一個直播頻道。 -| 欄位 | 類型 | 說明 | -|-----------|-----------------|---------------------------------------------------------| -| `name` | `string` | 頻道顯示名稱。 | -| `urls` | `array` | 頻道播放 URL 清單,支援多個備用線路,依序嘗試。 | -| `number` | `string` | 頻道號碼(顯示用)。 | -| `logo` | `string` | 頻道 Logo 圖片 URL,覆蓋來源預設值。 | -| `epg` | `string` | 此頻道專屬 EPG URL,覆蓋來源預設 EPG。 | -| `ua` | `string` | 此頻道播放請求的 User-Agent,覆蓋來源預設值。 | -| `click` | `string` | 點擊攔截處理。 | -| `format` | `string` | 指定媒體格式(如 `"m3u8"`、`"flv"`)。 | -| `origin` | `string` | 請求 `Origin` 標頭值,覆蓋來源預設值。 | -| `referer` | `string` | 請求 `Referer` 標頭值,覆蓋來源預設值。 | -| `tvgId` | `string` | TVG 格式 EPG 頻道 ID。 | -| `tvgName` | `string` | TVG 格式 EPG 頻道名稱。 | -| `header` | `object` | 此頻道請求的額外 HTTP 標頭,格式為鍵值對。 | -| `parse` | `integer` | 是否需要解析此頻道 URL。`0`=不解析,`1`=解析。 | -| `catchup` | `Catchup` | 此頻道的追看/時移設定,覆蓋分組及來源預設值。詳見 [catchup](#catchup--追看時移)。 | -| `drm` | `Drm` | DRM 版權保護設定。欄位同 [playerContent 回傳的 `drm` 物件](SPIDER.md)。 | +| 欄位 | 類型 | 說明 | +|-----------|-----------------|--------------------------------------------------------------------------------------------------------------------| +| `name` | `string` | 頻道顯示名稱。 | +| `urls` | `array` | 頻道播放 URL 清單,支援多個備用線路,依序嘗試。每條 URL 可附加 `$線路名稱` 後綴指定顯示名稱(如 `"http://cdn1.example.com/hbo.m3u8$CDN1"`);省略時自動顯示為「線路 N」。 | +| `number` | `string` | 頻道號碼(顯示用)。 | +| `logo` | `string` | 頻道 Logo 圖片 URL,覆蓋來源預設值。 | +| `epg` | `string` | 此頻道專屬 EPG URL,覆蓋來源預設 EPG。 | +| `ua` | `string` | 此頻道播放請求的 User-Agent,覆蓋來源預設值。 | +| `click` | `string` | 點擊攔截處理。 | +| `format` | `string` | 指定媒體 MIME type,直接傳入播放器。常用值:`"application/x-mpegURL"`(HLS)。 | +| `origin` | `string` | 請求 `Origin` 標頭值,覆蓋來源預設值。 | +| `referer` | `string` | 請求 `Referer` 標頭值,覆蓋來源預設值。 | +| `tvgId` | `string` | TVG 格式 EPG 頻道 ID。 | +| `tvgName` | `string` | TVG 格式 EPG 頻道名稱。 | +| `header` | `object` | 此頻道請求的額外 HTTP 標頭,格式為鍵值對。 | +| `parse` | `integer` | 是否需要解析此頻道 URL。`0`=不解析,`1`=解析。 | +| `catchup` | `Catchup` | 此頻道的追看/時移設定,覆蓋分組及來源預設值。詳見 [catchup](#catchup--追看時移)。 | +| `drm` | `Drm` | DRM 版權保護設定。欄位同 [playerContent 回傳的 `drm` 物件](SPIDER.md)。 | **範例:** @@ -289,7 +290,6 @@ Live 配置可以是獨立的 JSON 檔案,或內嵌於 Vod 配置的 `lives` }, "catchup": { "type": "append", - "days": "7", "source": "?playseek=${(b)yyyyMMddHHmmss}-${(e)yyyyMMddHHmmss}" } } @@ -458,11 +458,13 @@ scheme://username:password@host:port **範例:** ```json -"hosts": [ - "stream.example.com=1.2.3.4", - "old.cdn.example.com=new.cdn.example.com", - "cache.ott.*.itv.cmvideo.cn=base-v4-free-mghy.e.cdn.chinamobile.com" -] +{ + "hosts": [ + "stream.example.com=1.2.3.4", + "old.cdn.example.com=new.cdn.example.com", + "cache.ott.*.itv.cmvideo.cn=base-v4-free-mghy.e.cdn.chinamobile.com" + ] +} ``` --- @@ -478,10 +480,12 @@ scheme://username:password@host:port **範例:** ```json -"ads": [ - "ads.example.com", - "tracker.example.net" -] +{ + "ads": [ + "ads.example.com", + "tracker.example.net" + ] +} ``` --- @@ -490,20 +494,18 @@ scheme://username:password@host:port 設定頻道的回看/時移功能,可定義在 `Live`(來源層級)或 `Channel`(頻道層級)。 -| 欄位 | 類型 | 說明 | -|-----------|----------|---------------------------------------------------------------------------------------------------------------------| -| `type` | `string` | 時移類型,決定 URL 的組合方式(如 `"append"`、`"shift"`、`"flussonic"`、`"xui"`)。 | -| `days` | `string` | 支援回看的天數(如 `"7"`)。 | -| `regex` | `string` | 用於提取時間參數的正規表示式。 | -| `source` | `string` | 時移 URL 範本。支援 `{(b)格式}`(開始時間)、`{(e)格式}`(結束時間)、`{utc:}`(開始 Unix 秒)、`{utcend:}`(結束 Unix 秒)。非 `default` 類型時結果附加至原始 URL。 | -| `replace` | `string` | 用於替換 URL 中部分字串的替換字串。 | +| 欄位 | 類型 | 說明 | +|-----------|----------|---------------------------------------------------------------------------------------------------------| +| `type` | `string` | 時移類型。`"append"`(預設):將格式化後的 `source` 附加至原始 URL 末尾;`"default"`:以格式化後的 `source` 完全替換原始 URL。 | +| `regex` | `string` | 判斷此追看設定是否適用於當前 URL 的比對條件(子字串或正規表示式)。未設定時只要 `source` 非空即啟用;設定後只有 URL 符合此條件才啟用追看。 | +| `source` | `string` | 時移 URL 範本,**非空時才啟用追看功能**。支援 `{(b)格式}`(開始時間)、`{(e)格式}`(結束時間)、`{utc:}`(開始 Unix 秒)、`{utcend:}`(結束 Unix 秒)。 | +| `replace` | `string` | 逗號分隔的替換對(`原字串,新字串`),在組合時移 URL 前先對原始 URL 執行替換。 | **範例:** ```json { "type": "append", - "days": "7", "source": "?playseek=${(b)yyyyMMddHHmmss}-${(e)yyyyMMddHHmmss}" } ``` @@ -706,7 +708,6 @@ scheme://username:password@host:port ], "catchup": { "type": "append", - "days": "3", "source": "?playseek=${(b)yyyyMMddHHmmss}-${(e)yyyyMMddHHmmss}" } } diff --git a/docs/LIVE.md b/docs/LIVE.md new file mode 100644 index 000000000..a38fbd529 --- /dev/null +++ b/docs/LIVE.md @@ -0,0 +1,352 @@ +# 直播來源格式說明 + +LiveParser 依內容自動偵測格式,支援三種直播來源: + +| 格式 | 判斷條件 | +|--------------------|-------------------------------| +| [JSON](#json-陣列格式) | 內容為 JSON(`[` 開頭) | +| [M3U](#m3u-格式) | 任一行含 `#EXTM3U`(且不含 `#genre#`) | +| [TXT](#txt-格式) | 其他 | + +--- + +## 目錄 + +- [TXT 格式](#txt-格式) +- [M3U 格式](#m3u-格式) +- [JSON 陣列格式](#json-陣列格式) +- [頻道指令](#頻道指令) +- [DRM 宣告](#drm-宣告) +- [追看/時移](#追看時移) + +--- + +## TXT 格式 + +每行以逗號 `,` 分為兩欄。含 `#genre#` 的行宣告分組,含 `://` 的行為頻道。 + +``` +分組名稱,#genre# +頻道名稱,播放URL +``` + +**行的解析規則:** + +| 行的形式 | 說明 | +|------------------|---------------------------------| +| `名稱,#genre#` | 宣告新分組,後續頻道歸入此分組 | +| `名稱,URL` | 頻道項目(第二欄含 `://`) | +| `名稱_密碼,#genre#` | 建立密碼保護的隱藏分組 | +| 不含 `://` 的行 | 頻道[指令行](#頻道指令),作用至下一個 `#genre#` | +| 首個頻道前無 `#genre#` | 自動建立無名預設分組 | + +**多線路備援**:以 `#` 分隔多個 URL,播放器依序嘗試: + +``` +CCTV1,http://cdn1.example.com/cctv1.m3u8#http://cdn2.example.com/cctv1.m3u8 +``` + +**行內標頭**:URL 後接 `|key=value`,多個以 `&` 連接,多線路時每段各自帶標頭: + +``` +CCTV1,http://cdn1.example.com/cctv1.m3u8|User-Agent=okhttp#http://cdn2.example.com/cctv1.m3u8|Referer=https://example.com/ +``` + +**範例:** + +``` +新聞台,#genre# +CCTV1,http://cdn1.example.com/cctv1.m3u8#http://cdn2.example.com/cctv1.m3u8 +鳳凰資訊,http://example.com/phoenix.m3u8|User-Agent=Mozilla/5.0 + +體育台,#genre# +ua=Mozilla/5.0 +referer=https://sports.example.com/ +CCTV5,http://example.com/cctv5.m3u8 +CCTV5+,http://example.com/cctv5plus.m3u8 + +電影台,#genre# +header={"Authorization":"Bearer token123"} +HBO,http://example.com/hbo.m3u8 + +成人_secretpass,#genre# +某頻道,http://example.com/adult.m3u8 +``` + +--- + +## M3U 格式 + +以 `#EXTM3U` 開頭,每個頻道由 `#EXTINF:` 行與其後的 URL 行組成,中間可插入任意指令行。 + +```m3u +#EXTM3U [全域屬性...] +#EXTINF:-1 [頻道屬性...],頻道顯示名稱 +[選用指令行...] +http://example.com/stream.m3u8[|行內標頭] +``` + +### `#EXTM3U` 全域屬性 + +| 屬性 | 說明 | +|-----------------------|------------------------------------------| +| `tvg-url="…"` | XMLTV EPG 節目表 URL(僅當 Live 配置未設定 EPG 時生效) | +| `url-tvg="…"` | 同 `tvg-url`,備用寫法(同上條件) | +| `catchup="…"` | 全域預設追看類型 | +| `catchup-source="…"` | 全域追看 URL 模板 | +| `catchup-replace="…"` | 全域追看 URL 替換字串 | + +```m3u +#EXTM3U tvg-url="https://epg.example.com/xmltv.xml" catchup="append" catchup-source="?playseek=${(b)yyyyMMddHHmmss}-${(e)yyyyMMddHHmmss}" +``` + +### `#EXTINF` 頻道屬性 + +屬性寫在逗號前,頻道顯示名稱寫在逗號後至行尾。 + +| 屬性 | 說明 | +|-----------------------|--------------------| +| `tvg-id="…"` | EPG 頻道 ID | +| `tvg-name="…"` | EPG 頻道名稱(可與顯示名稱不同) | +| `tvg-chno="…"` | 頻道號碼 | +| `tvg-logo="…"` | 頻道 Logo URL | +| `group-title="…"` | 所屬分組名稱 | +| `http-user-agent="…"` | 播放請求 User-Agent | +| `catchup="…"` | 此頻道追看類型,覆蓋全域設定 | +| `catchup-source="…"` | 此頻道追看 URL 模板 | +| `catchup-replace="…"` | 此頻道追看替換字串 | + +```m3u +#EXTINF:-1 tvg-id="CCTV1" tvg-name="CCTV-1" tvg-chno="1" tvg-logo="https://example.com/logo/cctv1.png" group-title="央視",CCTV-1 +``` + +### M3U 專屬指令行 + +在 `#EXTINF:` 與 URL 行之間插入,作用於緊接的下一個 URL([通用指令](#頻道指令)同樣適用)。 + +| 指令 | 說明 | +|--------------------------------|--------------------------------| +| `#EXTHTTP:{"Key":"Value"}` | JSON 格式 HTTP 標頭 | +| `#EXTVLCOPT:http-user-agent=…` | VLC 風格 User-Agent | +| `#EXTVLCOPT:http-referrer=…` | VLC 風格 Referer | +| `#EXTVLCOPT:http-origin=…` | VLC 風格 Origin | +| `#KODIPROP:…` | DRM 與媒體格式,詳見 [DRM 宣告](#drm-宣告) | + +**行內標頭**:URL 末接 `|key=value&key2=value2`: + +```m3u +http://example.com/stream.m3u8|User-Agent=Mozilla/5.0&Referer=https://example.com/ +``` + +**範例:** + +```m3u +#EXTM3U tvg-url="https://epg.example.com/xmltv.xml.gz" catchup="append" catchup-source="?playseek=${(b)yyyyMMddHHmmss}-${(e)yyyyMMddHHmmss}" + +#EXTINF:-1 tvg-id="CCTV1" tvg-chno="1" tvg-logo="https://example.com/logo/cctv1.png" group-title="央視",CCTV-1 +http://cdn1.example.com/cctv1.m3u8 + +#EXTINF:-1 tvg-id="CCTV5" group-title="央視",CCTV-5 體育 +#EXTVLCOPT:http-user-agent=Mozilla/5.0 +#EXTVLCOPT:http-referrer=https://sports.example.com/ +http://cdn1.example.com/cctv5.m3u8|User-Agent=Mozilla/5.0 + +#EXTINF:-1 group-title="加密頻道",Premium HD +#KODIPROP:inputstream.adaptive.license_type=widevine +#KODIPROP:inputstream.adaptive.license_key=https://license.example.com/widevine|User-Agent=Mozilla/5.0 +format=mpd +http://example.com/premium.mpd + +#EXTINF:-1 group-title="加密頻道",PlayReady 頻道 +#KODIPROP:inputstream.adaptive.drm_legacy=playready|https://license.example.com/playready +http://example.com/playready.mpd + +#EXTINF:-1 group-title="一般頻道",需解析頻道 +parse=1 +click=https://example.com/click +http://example.com/parse-needed.m3u8 + +#EXTINF:-1 group-title="帶標頭頻道",自訂標頭 +#EXTHTTP:{"Authorization":"Bearer mytoken","X-Custom":"value"} +http://example.com/auth-stream.m3u8 +``` + +--- + +## JSON 陣列格式 + +內容以 `[` 開頭時,直接反序列化為 `List`,結構與 Live 配置的 `groups` 欄位相同。 + +```json +[ + { + "name": "新聞台", + "channel": [ + { + "name": "TVBS新聞台", + "urls": [ + "http://cdn1.example.com/tvbs.m3u8", + "http://cdn2.example.com/tvbs.m3u8" + ], + "number": "56", + "logo": "https://example.com/logo/tvbs.png", + "tvgId": "TVBS", + "ua": "Mozilla/5.0", + "catchup": { + "type": "append", + "source": "?playseek=${(b)yyyyMMddHHmmss}-${(e)yyyyMMddHHmmss}" + } + } + ] + }, + { + "name": "加密頻道", + "pass": "secretpass", + "channel": [ + { + "name": "Premium", + "urls": [ + "http://example.com/premium.mpd" + ], + "format": "application/dash+xml", + "drm": { + "type": "widevine", + "key": "https://license.example.com/widevine", + "header": { + "User-Agent": "Mozilla/5.0" + } + } + } + ] + } +] +``` + +> 完整欄位定義見 [CONFIG.md — channel 頻道項目](CONFIG.md#channel--頻道項目)。 + +--- + +## 頻道指令 + +以下指令在 **M3U** 與 **TXT** 格式中均適用,寫法完全一致。 + +- **TXT**:指令行寫在頻道行前,作用至下一個 `#genre#`(包含該分組內所有後續頻道及其多線路 URL)。 +- **M3U**:指令行寫在 `#EXTINF:` 與 URL 行之間,僅作用於緊接的下一個 URL(每個 URL 處理後立即清除)。 + +| 指令 | 範例 | 說明 | +|-------------|--------------------------------|---------------------------------------| +| `ua=` | `ua=Mozilla/5.0` | 播放請求 User-Agent | +| `origin=` | `origin=https://example.com` | 請求 Origin 標頭 | +| `referer=` | `referer=https://example.com/` | 請求 Referer 標頭(`referrer=` 雙 r 寫法同樣接受) | +| `header=` | `header={"X-Token":"abc"}` | 任意 HTTP 標頭(JSON 格式) | +| `format=` | `format=mpd` | 強制指定媒體格式 | +| `parse=` | `parse=1` | `1` = 需透過解析器處理此 URL | +| `click=` | `click=https://example.com/c` | 點擊攔截處理 URL | +| `forceKey=` | `forceKey=true` | 強制使用 DRM 金鑰 | + +**`format` 可選值:** + +| 值 | 說明 | +|----------------|--------------------------------------| +| `hls` | HLS 串流(`application/x-mpegURL`) | +| `dash` 或 `mpd` | MPEG-DASH 串流(`application/dash+xml`) | + +--- + +## DRM 宣告 + +僅 M3U 格式支援,透過 `#KODIPROP:` 行宣告,寫在 `#EXTINF:` 與 URL 行之間。 + +| 指令 | 說明 | +|-----------------------------------------------------|----------------------------------------------| +| `#KODIPROP:inputstream.adaptive.license_type=…` | DRM 類型:`widevine` / `playready` / `clearkey` | +| `#KODIPROP:inputstream.adaptive.license_key=…` | DRM 授權伺服器 URL(或 ClearKey JSON) | +| `#KODIPROP:inputstream.adaptive.drm_legacy=類型\|URL` | 快速宣告,類型與授權 URL 合一 | +| `#KODIPROP:inputstream.adaptive.manifest_type=…` | 媒體格式:`mpd` / `dash` / `hls` | +| `#KODIPROP:inputstream.adaptive.stream_headers=…` | 串流請求標頭(`key=val&key2=val2`) | +| `#KODIPROP:inputstream.adaptive.common_headers=…` | 通用請求標頭(同上格式) | + +**授權伺服器標頭**:附加於 `license_key` URL 後,以 `|` 分隔: + +```m3u +#KODIPROP:inputstream.adaptive.license_key=https://license.example.com/widevine|User-Agent=Mozilla/5.0&token=abc +``` + +**標準寫法(Widevine):** + +```m3u +#EXTINF:-1 group-title="加密頻道",Premium HD +#KODIPROP:inputstream.adaptive.license_type=widevine +#KODIPROP:inputstream.adaptive.license_key=https://license.example.com/widevine|User-Agent=Mozilla/5.0 +format=mpd +http://example.com/premium.mpd +``` + +**快速寫法(`drm_legacy`):** + +```m3u +#EXTINF:-1 group-title="加密頻道",PlayReady 頻道 +#KODIPROP:inputstream.adaptive.drm_legacy=playready|https://license.example.com/playready +http://example.com/playready.mpd +``` + +**ClearKey(本地 JSON 金鑰):** + +```m3u +#EXTINF:-1 group-title="加密頻道",ClearKey 頻道 +#KODIPROP:inputstream.adaptive.license_type=clearkey +#KODIPROP:inputstream.adaptive.license_key={"keys":[{"kty":"oct","k":"base64key","kid":"base64kid"}],"type":"temporary"} +http://example.com/clearkey.mpd +``` + +**ClearKey(簡短 hex 格式):** 以 `kid_hex:key_hex` 表示,多對以逗號分隔,框架自動轉換為標準 JSON: + +```m3u +#KODIPROP:inputstream.adaptive.license_type=clearkey +#KODIPROP:inputstream.adaptive.license_key=a7e61c373e219033c21091c302f996c5:100b6c20940f779a4589152b57d2dacb +http://example.com/clearkey.mpd +``` + +**`stream_headers` 也支援 `drmScheme` / `drmLicense` 鍵名:** + +```m3u +#KODIPROP:inputstream.adaptive.stream_headers=drmScheme=widevine&drmLicense=https://license.example.com/ +``` + +--- + +## 追看/時移 + +在 `#EXTM3U`、`#EXTINF` 或 Live 配置的 `catchup` 欄位中設定,頻道層級設定覆蓋全域。 + +**`type` 可選值:** + +| 值 | 說明 | +|-----------|-------------------------------| +| `append` | 將 `source` 模板附加至原始 URL 末尾(預設) | +| `default` | 以格式化後的 `source` 完全替換原始 URL | + +> **PLTV 自動追看**:若頻道未設定任何追看,但播放 URL 含有 `/PLTV/`,框架會自動套用內建的 PLTV 追看設定(`append` 類型,7 天,替換 `/PLTV/` → `/TVOD/`,模板 `?playseek=${(b)yyyyMMddHHmmss}-${(e)yyyyMMddHHmmss}`),無需手動設定。 + +**`source` 模板變數:** + +| 變數 | 說明 | 輸出範例 | +|------------------------|------------------|------------------| +| `${(b)yyyyMMddHHmmss}` | 節目開始時間 | `20260312140000` | +| `${(e)yyyyMMddHHmmss}` | 節目結束時間 | `20260312150000` | +| `{utc:}` | 節目開始 Unix 時間戳(秒) | `1741780800` | +| `{utcend:}` | 節目結束 Unix 時間戳(秒) | `1741784400` | + +**範例(`append` 類型):** + +``` +catchup="append" catchup-source="?playseek=${(b)yyyyMMddHHmmss}-${(e)yyyyMMddHHmmss}" +``` + +**`catchup-replace` 用途**: + +組合時移 URL 前,先對原始 URL 執行字串替換。格式為 `原字串,新字串`(逗號分隔): + +``` +catchup-replace="/PLTV/,/TVOD/" +``` diff --git a/docs/SPIDER.md b/docs/SPIDER.md index 70705b47b..fbb9bd29b 100644 --- a/docs/SPIDER.md +++ b/docs/SPIDER.md @@ -223,20 +223,23 @@ public String playerContent(String flag, String id, List vipFlags) throw 選填欄位: -| 欄位 | 說明 | -|------------|------------------------------------------------------------------------------------| -| `parse` | `0` = 直接播放,`1` = 需進一步解析(預設 `0`)。 | -| `header` | 播放請求所需的 HTTP 標頭(鍵值對)。 | -| `flag` | 覆蓋來源旗標,傳入 VIP 解析器時使用。 | -| `jxFrom` | 強制指定解析器旗標(覆蓋 `flag` 的解析器比對結果)。 | -| `format` | 媒體 MIME type(如 `"application/x-mpegURL"`、`"application/dash+xml"`),指定後播放器跳過格式自動偵測。 | -| `danmaku` | 彈幕資料列表,詳見 [Danmaku](#danmaku--彈幕物件)。 | -| `subs` | 字幕列表,詳見 [Sub](#sub--字幕物件)。 | -| `drm` | DRM 版權保護設定,詳見 [Drm](#drm--drm-設定物件)。 | -| `artwork` | 播放頁面封面圖 URL。 | -| `desc` | 播放頁面描述文字。 | -| `position` | 播放恢復位置(毫秒)。 | -| `lrc` | 歌詞 URL(音樂類來源使用)。 | +| 欄位 | 說明 | +|------------|---------------------------------------------------------------------| +| `parse` | `0` = 直接播放,`1` = 需進一步解析(預設 `0`)。`jx=1` 效果相同。 | +| `jx` | 同 `parse=1`,需進一步解析。 | +| `playUrl` | 解析器前綴或指定。`json:…` 傳入 JSON 解析器,`parse:解析器名稱` 指定具名解析器,其他值作為解析 URL 前綴。 | | +| `click` | 點擊攔截處理 URL,傳遞給解析器 WebView。 | +| `code` | 非零時抑制 `msg` 顯示。 | +| `header` | 播放請求所需的 HTTP 標頭(鍵值對)。 | +| `flag` | 覆蓋來源旗標,傳入 VIP 解析器時使用。 | +| `jxFrom` | 強制指定解析器旗標(覆蓋 `flag` 的解析器比對結果)。 | +| `format` | 媒體 MIME type(如 `"application/x-mpegURL"`),指定後播放器跳過格式自動偵測。 | +| `danmaku` | 彈幕資料列表,詳見 [Danmaku](#danmaku--彈幕物件)。 | +| `subs` | 字幕列表,詳見 [Sub](#sub--字幕物件)。 | +| `drm` | DRM 版權保護設定,詳見 [Drm](#drm--drm-設定物件)。 | +| `artwork` | 播放頁面封面圖 URL。 | +| `desc` | 播放頁面描述文字。 | +| `position` | 播放恢復位置(毫秒)。 | --- @@ -364,17 +367,19 @@ public void destroy() | JSON 欄位 | 類型 | 說明 | |-------------|--------------|--------------------------------------------| | `list` | `array` | 影片卡片列表。詳見 [Vod](#vod--影片卡片物件)。 | -| `page` | `integer` | 當前頁碼(`categoryContent` 使用)。 | | `pagecount` | `integer` | 總頁數(`categoryContent`、`searchContent` 使用)。 | -| `limit` | `integer` | 每頁筆數(`categoryContent` 使用)。 | -| `total` | `integer` | 總筆數(`categoryContent` 使用)。 | **playerContent:** | JSON 欄位 | 類型 | 說明 | |------------|------------------|------------------------------------------------------------------------------------| | `url` | `string` | 實際播放媒體 URL。 | -| `parse` | `integer` | `0` = 直接播放,`1` = 需進一步解析(預設 `0`)。 | +| `parse` | `integer` | `0` = 直接播放,`1` = 需進一步解析(預設 `0`)。`jx=1` 效果相同。 | +| `jx` | `integer` | 同 `parse=1`,需進一步解析(兩者任一為 `1` 即觸發解析流程)。 | +| `playUrl` | `string` | 解析器前綴或指定。`json:…` 傳入 JSON 解析器,`parse:解析器名稱` 指定具名解析器,其他值作為解析 URL 前綴。 | +| `key` | `string` | 來源 `key`,用於從配置查找對應 `Site.click`。當爬蟲未回傳 `click` 時,框架以此 key 從 VodConfig 取得 click。 | +| `click` | `string` | 點擊攔截處理 URL,傳遞給解析器 WebView 執行點擊動作。 | +| `code` | `integer` | 非零時抑制 `msg` 顯示(通常用於錯誤狀態碼)。 | | `header` | `object` | 播放請求的額外 HTTP 標頭,鍵值對格式。 | | `flag` | `string` | 播放來源旗標名稱,覆蓋原始 `flag` 參數。 | | `jxFrom` | `string` | 強制指定解析器旗標(覆蓋 `flag` 的解析器比對結果)。 | @@ -399,23 +404,27 @@ public void destroy() `list` 陣列中的每個元素。 -| JSON 欄位 | 類型 | 說明 | -|-----------------|----------|----------------------------------------------------------| -| `vod_id` | `string` | **影片唯一 ID**,傳入 `detailContent` 的 `ids` 參數。 | -| `vod_name` | `string` | 影片顯示名稱(支援 HTML 編碼)。 | -| `vod_pic` | `string` | 縮圖 URL。 | -| `vod_remarks` | `string` | 備註標籤,顯示在縮圖上(如 `"更新至12集"`、`"HD"`)。 | -| `type_name` | `string` | 所屬分類名稱(用於分類過濾)。 | -| `vod_year` | `string` | 年份。 | -| `vod_area` | `string` | 地區。 | -| `vod_director` | `string` | 導演。 | -| `vod_actor` | `string` | 演員。 | -| `vod_content` | `string` | 簡介/描述。 | -| `vod_play_from` | `string` | 播放來源名稱,多個來源以 `$$$` 分隔。 | -| `vod_play_url` | `string` | 播放集數 URL,格式詳見[下方說明](#播放集數格式vod_play_from--vod_play_url)。 | -| `vod_tag` | `string` | 特殊標記。`"folder"` 表示此項為資料夾,點擊後以 `action` 欄位的 URL 取得子列表。 | -| `action` | `string` | 資料夾類型的子列表請求 URL,回傳格式同 `categoryContent`。 | -| `style` | `Style` | 此影片卡片的顯示樣式覆蓋,詳見 [CONFIG.md](CONFIG.md)。 | +| JSON 欄位 | 類型 | 說明 | +|-----------------|-----------|-----------------------------------------------------------------------------------------------| +| `vod_id` | `string` | **影片唯一 ID**,傳入 `detailContent` 的 `ids` 參數。 | +| `vod_name` | `string` | 影片顯示名稱(支援 HTML 編碼)。 | +| `vod_pic` | `string` | 縮圖 URL。 | +| `vod_remarks` | `string` | 備註標籤,顯示在縮圖上(如 `"更新至12集"`、`"HD"`)。 | +| `type_name` | `string` | 所屬分類名稱(用於分類過濾)。 | +| `vod_year` | `string` | 年份。 | +| `vod_area` | `string` | 地區。 | +| `vod_director` | `string` | 導演。 | +| `vod_actor` | `string` | 演員。 | +| `vod_content` | `string` | 簡介/描述。 | +| `vod_play_from` | `string` | 播放來源名稱,多個來源以 `$$$` 分隔。 | +| `vod_play_url` | `string` | 播放集數 URL,格式詳見[下方說明](#播放集數格式vod_play_from--vod_play_url)。 | +| `vod_tag` | `string` | 特殊標記。`"folder"` 表示此項為資料夾,點擊後以 `action` 欄位的 URL 取得子列表。 | +| `action` | `string` | 資料夾類型的子列表請求 URL,回傳格式同 `categoryContent`。 | +| `cate` | `Cate` | 資料夾顯示樣式物件,包含 `land`、`circle`、`ratio` 三個子欄位(含義同下方三欄)。設定此欄位等同於 `vod_tag: "folder"`,即自動將此項視為資料夾。 | +| `land` | `integer` | 橫向顯示旗標,覆蓋 [Class](#class--分類物件) 層級的 `land` 設定。 | +| `circle` | `integer` | 圓形顯示旗標,覆蓋 [Class](#class--分類物件) 層級的 `circle` 設定。 | +| `ratio` | `float` | 卡片寬高比,覆蓋 [Class](#class--分類物件) 層級的 `ratio` 設定。 | +| `style` | `Style` | 此影片卡片的顯示樣式覆蓋,詳見 [CONFIG.md](CONFIG.md)。 | --- @@ -439,26 +448,28 @@ public void destroy() `filters` 為一個物件,key 為 `type_id`,value 為 `Filter` 陣列,每個 `Filter` 定義一個篩選維度。 ```json -"filters": { - "1": [ - { - "key": "area", - "name": "地區", - "value": [ - {"n": "全部", "v": ""}, - {"n": "大陸", "v": "大陸"}, - {"n": "美國", "v": "美國"} - ] - }, - { - "key": "year", - "name": "年份", - "value": [ - {"n": "全部", "v": ""}, - {"n": "2024", "v": "2024"} - ] - } - ] +{ + "filters": { + "1": [ + { + "key": "area", + "name": "地區", + "value": [ + {"n": "全部", "v": ""}, + {"n": "大陸", "v": "大陸"}, + {"n": "美國", "v": "美國"} + ] + }, + { + "key": "year", + "name": "年份", + "value": [ + {"n": "全部", "v": ""}, + {"n": "2024", "v": "2024"} + ] + } + ] + } } ``` @@ -497,13 +508,13 @@ public void destroy() `subs` 陣列中的每個元素。 -| JSON 欄位 | 類型 | 說明 | -|----------|-----------|------------------------------------------------------------------------| -| `url` | `string` | 字幕檔 URL(必填)。 | -| `name` | `string` | 顯示名稱(選填)。 | -| `lang` | `string` | 語言代碼(選填,如 `"zh-tw"`、`"en"`)。 | -| `format` | `string` | MIME 類型(選填),常用值:`"text/x-ssa"`、`"application/x-subrip"`。省略時框架依副檔名自動偵測。 | -| `flag` | `integer` | 字幕旗標(選填)。`2` = 強制字幕(forced subtitle)。 | +| JSON 欄位 | 類型 | 說明 | +|----------|-----------|----------------------------------------------------------------------------------------------------------------------------| +| `url` | `string` | 字幕檔 URL(必填)。 | +| `name` | `string` | 顯示名稱(選填)。 | +| `lang` | `string` | 語言代碼(選填,如 `"zh-tw"`、`"en"`)。 | +| `format` | `string` | MIME 類型(選填),常用值:`"text/x-ssa"`、`"application/x-subrip"`。省略時框架依副檔名自動偵測。 | +| `flag` | `integer` | ExoPlayer `C.SELECTION_FLAG_*` 常數(選填)。`0` 或省略時預設為 `SELECTION_FLAG_DEFAULT`(自動選擇);`2` = `SELECTION_FLAG_FORCED`(強制顯示,不可關閉)。 | --- @@ -609,7 +620,7 @@ vod_play_url: "第01集$https://cdn1.example.com/ep1.m3u8#第02集$https://cdn1 ### homeVideoContent / categoryContent 回傳範例 -> `categoryContent` 可額外回傳 `page`、`pagecount`、`limit`、`total`;`homeVideoContent` 無此欄位。 +> `categoryContent` 和 `searchContent` 可額外回傳 `pagecount`;`homeVideoContent` 無此欄位。 ```json { @@ -629,10 +640,7 @@ vod_play_url: "第01集$https://cdn1.example.com/ep1.m3u8#第02集$https://cdn1 "type_name": "電視劇" } ], - "page": 1, - "pagecount": 10, - "limit": 20, - "total": 200 + "pagecount": 10 } ```