# 本地 HTTP API 應用程式啟動後會在本地綁定一個 HTTP 伺服器,埠號從 **9978** 開始依序嘗試至 **9998**,取得第一個可用埠。 ``` http://127.0.0.1:{port} ``` > 實際埠號依系統可用情況而定,預設起始為 9978。 所有端點支援 GET 與 POST(除特別標注外),參數可放在 Query String 中。回應若無特別說明皆為 `text/plain`,成功回傳 `OK`,失敗回傳 `500` 與錯誤訊息。 --- ## 目錄 - [/action — 動作指令](#action--動作指令) - [do=control — 播放控制](#docontrol--播放控制) - [do=refresh — 刷新指令](#dorefresh--刷新指令) - [do=push — 推送播放](#dopush--推送播放) - [do=file — 開啟檔案](#dofile--開啟檔案) - [do=search — 觸發搜尋](#dosearch--觸發搜尋) - [do=setting — 載入配置](#dosetting--載入配置) - [do=cast — 投放媒體](#docast--投放媒體) - [do=sync — 同步資料](#dosync--同步資料) - [/cache — 快取操作](#cache--快取操作) - [/media — 播放狀態](#media--播放狀態) - [/file — 本地檔案系統](#file--本地檔案系統) - [/upload — 上傳檔案](#upload--上傳檔案) - [/newFolder — 新增資料夾](#newfolder--新增資料夾) - [/delFolder — 刪除資料夾](#delfolder--刪除資料夾) - [/delFile — 刪除檔案](#delfile--刪除檔案) - [/parse — 解析頁面](#parse--解析頁面) - [/proxy — 爬蟲代理](#proxy--爬蟲代理) - [/device — 裝置資訊](#device--裝置資訊) - [端點總覽](#端點總覽) --- ## /action — 動作指令 透過 `do` 參數分派不同動作。 ``` GET/POST http://127.0.0.1:9978/action?do={do}&... ``` --- ### do=control — 播放控制 控制目前播放器的播放狀態。 ``` http://127.0.0.1:9978/action?do=control&type={type} ``` | 參數 | 說明 | |--------|-----------| | `type` | 控制指令,見下表。 | **`type` 可選值:** | `type` | 說明 | |----------|----------| | `play` | 播放 | | `pause` | 暫停 | | `stop` | 停止 | | `replay` | 重新播放 | | `prev` | 上一集 | | `next` | 下一集 | | `loop` | 切換循環播放模式 | **範例:** ``` http://127.0.0.1:9978/action?do=control&type=play http://127.0.0.1:9978/action?do=control&type=pause http://127.0.0.1:9978/action?do=control&type=next ``` --- ### do=refresh — 刷新指令 觸發應用程式重新載入指定頁面資料,或推送內容至播放器。 ``` http://127.0.0.1:9978/action?do=refresh&type={type}&... ``` **`type` 可選值:** | `type` | 額外參數 | 說明 | |------------|--------|-----------------------------------| | `live` | — | 重新整理直播頁面。 | | `detail` | — | 重新整理影片詳情頁。 | | `player` | — | 重新整理播放頁面。 | | `subtitle` | `path` | 推送字幕至目前播放器,`path` 為字幕檔 URL。 | | `danmaku` | `path` | 推送彈幕至目前播放器,`path` 為彈幕檔 URL。 | | `vod` | `json` | 推送 Vod 物件更新,`json` 為 Vod JSON 字串。 | **範例:** ``` http://127.0.0.1:9978/action?do=refresh&type=detail http://127.0.0.1:9978/action?do=refresh&type=subtitle&path=http://example.com/sub.srt http://127.0.0.1:9978/action?do=refresh&type=danmaku&path=http://example.com/danmaku.xml ``` --- ### do=push — 推送播放 推送一個 URL 至應用程式進行播放。 ``` http://127.0.0.1:9978/action?do=push&url={url} ``` | 參數 | 說明 | |-------|-----------------------| | `url` | 要播放的媒體 URL(需 URL 編碼)。 | **範例:** ``` http://127.0.0.1:9978/action?do=push&url=http%3A%2F%2Fexample.com%2Fvideo.m3u8 ``` --- ### do=file — 開啟檔案 指定本地檔案路徑,依副檔名執行對應動作。 ``` http://127.0.0.1:9978/action?do=file&path={path} ``` | 參數 | 說明 | |--------|------------| | `path` | 本地檔案的絕對路徑。 | **依副檔名的行為:** | 副檔名 | 行為 | |----------------------|---------------| | `.apk` | 觸發 APK 安裝流程。 | | `.srt` `.ssa` `.ass` | 注入字幕至目前播放器。 | | 其他 | 觸發設定頁面開啟對應檔案。 | --- ### do=search — 觸發搜尋 在應用程式介面觸發關鍵字搜尋。 ``` http://127.0.0.1:9978/action?do=search&word={word} ``` | 參數 | 說明 | |--------|--------| | `word` | 搜尋關鍵字。 | **範例:** ``` http://127.0.0.1:9978/action?do=search&word=%E9%A3%9F%E7%A5%9E ``` --- ### do=setting — 載入配置 載入配置內容或指定名稱的配置。 ``` http://127.0.0.1:9978/action?do=setting&text={text}&name={name} ``` | 參數 | 說明 | |--------|----------------| | `text` | 配置內容字串或配置 URL。 | | `name` | 配置顯示名稱(選填)。 | --- ### do=cast — 投放媒體 將指定媒體投放至遠端裝置播放。 ``` http://127.0.0.1:9978/action?do=cast&config={config}&device={device}&history={history} ``` | 參數 | 說明 | |-----------|------------------------------------| | `config` | Config 物件的 JSON 字串,指定要投放的配置。 | | `device` | 目標裝置的 Device 物件 JSON 字串(含 IP 等資訊)。 | | `history` | History 物件的 JSON 字串,包含播放歷史。 | --- ### do=sync — 同步資料 在多個裝置間同步觀看紀錄(`history`)或收藏清單(`keep`)。 ``` POST http://127.0.0.1:9978/action?do=sync&type={type}&device={device}&force={force}&mode={mode} ``` **Query 參數:** | 參數 | 說明 | |----------|--------------------------------------------| | `type` | 同步類型:`"history"`(觀看紀錄)或 `"keep"`(收藏)。 | | `device` | 目標裝置的 Device 物件 JSON 字串。 | | `force` | `"true"` = 先刪除後合併;其他 = 直接合併。 | | `mode` | `"0"` = 雙向(發送+接收);`"1"` = 僅接收;`"2"` = 僅發送。 | | `config` | (`history` 用)Config 物件 JSON 字串。 | **POST Body(`application/x-www-form-urlencoded`):** | 參數 | 說明 | |-----------|-----------------------------------| | `targets` | History 或 Keep 物件陣列的 JSON 字串。 | | `configs` | (`keep` 用)Config URL 陣列的 JSON 字串。 | --- ## /cache — 快取操作 存取應用程式的鍵值快取(基於 SharedPreferences),可用於爬蟲在不同請求間共享資料。 ``` GET/POST http://127.0.0.1:9978/cache?do={do}&... ``` **Key 計算規則:** `"cache_" + (rule 為空 ? "" : rule + "_") + key` --- ### do=get — 讀取快取 ``` http://127.0.0.1:9978/cache?do=get&key={key}&rule={rule} ``` | 參數 | 說明 | |--------|-------------------------| | `key` | 快取鍵名。 | | `rule` | 命名空間前綴,用於隔離不同爬蟲的快取(選填)。 | **回應:** `200 OK`,回傳儲存的字串值(若不存在則為空字串)。 --- ### do=set — 寫入快取 ``` http://127.0.0.1:9978/cache?do=set&key={key}&value={value}&rule={rule} ``` | 參數 | 說明 | |---------|-------------| | `key` | 快取鍵名。 | | `value` | 要儲存的字串值。 | | `rule` | 命名空間前綴(選填)。 | --- ### do=del — 刪除快取 ``` http://127.0.0.1:9978/cache?do=del&key={key}&rule={rule} ``` | 參數 | 說明 | |--------|-------------| | `key` | 要刪除的快取鍵名。 | | `rule` | 命名空間前綴(選填)。 | --- ## /media — 播放狀態 取得目前播放器的媒體資訊與播放狀態。 ``` GET http://127.0.0.1:9978/media ``` **回應格式:** `application/json` **播放器未啟動時:** ```json {} ``` **播放器啟動時:** ```json { "url": "https://cdn.example.com/video.m3u8", "state": 3, "speed": 1.0, "title": "範例電影", "artist": "來源名稱", "artwork": "https://example.com/cover.jpg", "duration": 7200000, "position": 1234567 } ``` **欄位說明:** | 欄位 | 類型 | 說明 | |------------|-----------|----------------------------------------------------------| | `url` | `string` | 目前串流 URL,無則為 `""`。 | | `state` | `integer` | PlaybackStateCompat 狀態碼。`1`=緩衝中,`2`=暫停,`3`=播放中,無則為 `-1`。 | | `speed` | `float` | 播放速率(`1.0` = 正常速度),無則為 `-1`。 | | `title` | `string` | 媒體標題,無則為 `""`。 | | `artist` | `string` | 藝術家或來源名稱,無則為 `""`。 | | `artwork` | `string` | 封面圖 URI,無則為 `""`。 | | `duration` | `long` | 媒體總時長(毫秒),無則為 `-1`。 | | `position` | `long` | 目前播放位置(毫秒),無則為 `-1`。 | --- ## /file — 本地檔案系統 瀏覽或下載應用程式的本地儲存空間。 ``` GET http://127.0.0.1:9978/file/{path} ``` | 參數 | 說明 | |--------|-------------------------| | `path` | 相對於應用程式根目錄的路徑。省略時列出根目錄。 | **目錄回應(JSON):** ```json { "parent": "videos", "files": [ { "name": "movie.mp4", "path": "videos/movie.mp4", "time": "2025/03/05 12:00:00", "dir": 0 }, { "name": "subtitles", "path": "videos/subtitles", "time": "2025/03/05 10:00:00", "dir": 1 } ] } ``` **`files` 陣列欄位說明:** | 欄位 | 類型 | 說明 | |--------|-----------|----------------------------------| | `name` | `string` | 檔案或目錄名稱。 | | `path` | `string` | 相對於根目錄的路徑。 | | `time` | `string` | 最後修改時間,格式 `yyyy/MM/dd HH:mm:ss`。 | | `dir` | `integer` | `1` = 目錄,`0` = 檔案。 | **`parent` 欄位說明:** | 值 | 意義 | |--------------------|----------------| | `"."` | 目前即為根目錄(無上一層)。 | | `""` | 上一層為根目錄。 | | `"path/to/parent"` | 上一層目錄的相對路徑。 | **檔案回應:** 直接串流檔案內容,支援 Range 請求(`206 Partial Content`)與 ETag 快取(`304 Not Modified`)。 --- ## /upload — 上傳檔案 上傳檔案至指定目錄,`.zip` 檔案會自動解壓縮。 ``` POST http://127.0.0.1:9978/upload?path={path} Content-Type: multipart/form-data ``` | 參數 | 說明 | |--------|------------------| | `path` | 目標目錄,相對於應用程式根目錄。 | | 檔案類型 | 行為 | |--------|----------------------| | `.zip` | 解壓縮至 `path` 目錄。 | | 其他 | 複製至 `path/filename`。 | --- ## /newFolder — 新增資料夾 在指定路徑下建立新目錄。 ``` GET http://127.0.0.1:9978/newFolder?path={path}&name={name} ``` | 參數 | 說明 | |--------|-------------------| | `path` | 父目錄路徑,相對於應用程式根目錄。 | | `name` | 要建立的資料夾名稱。 | --- ## /delFolder — 刪除資料夾 刪除指定目錄及其所有內容。 ``` GET http://127.0.0.1:9978/delFolder?path={path} ``` | 參數 | 說明 | |--------|----------------------| | `path` | 要刪除的目錄路徑,相對於應用程式根目錄。 | --- ## /delFile — 刪除檔案 刪除指定檔案。 ``` GET http://127.0.0.1:9978/delFile?path={path} ``` | 參數 | 說明 | |--------|----------------------| | `path` | 要刪除的檔案路徑,相對於應用程式根目錄。 | --- ## /parse — 解析頁面 將解析器腳本與目標 URL 嵌入 HTML 範本後回傳,通常供 WebView 內部使用。 ``` GET http://127.0.0.1:9978/parse?jxs={jxs}&url={url} ``` | 參數 | 說明 | |-------|---------------| | `jxs` | 解析器腳本識別碼或內容。 | | `url` | 待解析的媒體頁面 URL。 | **回應格式:** `text/html`,回傳渲染後的 `parse.html` 頁面。 --- ## /proxy — 爬蟲代理 將請求轉發至爬蟲的 `proxy()` 方法處理,供爬蟲自訂回應(如轉發串流、修改標頭等)。 ``` GET/POST http://127.0.0.1:9978/proxy?... ``` 所有 Query String 參數、請求標頭與 POST Body 會合併後傳入 `BaseLoader.get().proxy(params)`。回應由爬蟲 `proxy()` 決定,框架原封不動地轉發爬蟲回傳的串流與標頭。 爬蟲如何實作 `proxy()` 方法及取得代理 URL,見 [SPIDER.md — 爬蟲本地代理 URL](SPIDER.md#爬蟲本地代理-url)。 --- ## /device — 裝置資訊 取得本機裝置資訊。 ``` GET http://127.0.0.1:9978/device ``` **回應格式:** `text/plain`,內容為裝置資訊的 JSON 字串。 **回應欄位:** | 欄位 | 類型 | 說明 | |--------|----------|---------------| | `name` | `string` | 裝置顯示名稱。 | | `ip` | `string` | 裝置區域網路 IP 位址。 | --- ## 端點總覽 | 端點 | 方法 | 主要參數 | 說明 | |----------------------|----------|-----------------------------------|---------------------------------------------| | `/action?do=control` | GET/POST | `type` | 播放控制(play/pause/stop/prev/next/loop/replay) | | `/action?do=refresh` | GET/POST | `type`, `path`, `json` | 刷新頁面或推送字幕/彈幕 | | `/action?do=push` | GET/POST | `url` | 推送 URL 播放 | | `/action?do=file` | GET/POST | `path` | 開啟本地檔案 | | `/action?do=search` | GET/POST | `word` | 觸發關鍵字搜尋 | | `/action?do=setting` | GET/POST | `text`, `name` | 載入配置 | | `/action?do=cast` | GET/POST | `config`, `device`, `history` | 投放媒體至遠端裝置 | | `/action?do=sync` | POST | `type`, `device`, `force`, `mode` | 多裝置資料同步 | | `/cache?do=get` | GET/POST | `key`, `rule` | 讀取快取值 | | `/cache?do=set` | GET/POST | `key`, `value`, `rule` | 寫入快取值 | | `/cache?do=del` | GET/POST | `key`, `rule` | 刪除快取值 | | `/media` | GET | — | 取得播放狀態 JSON | | `/file/{path}` | GET | — | 瀏覽目錄或下載檔案(支援 Range) | | `/upload` | POST | `path`(multipart) | 上傳檔案(支援 .zip 解壓) | | `/newFolder` | GET | `path`, `name` | 建立資料夾 | | `/delFolder` | GET | `path` | 刪除資料夾 | | `/delFile` | GET | `path` | 刪除檔案 | | `/parse` | GET | `jxs`, `url` | 取得渲染後的解析 HTML 頁面 | | `/proxy` | GET/POST | 自訂(轉發至爬蟲) | 爬蟲代理轉發 | | `/device` | GET | — | 取得裝置資訊 |