片頭片尾跳過 - MiCat-S/Mi302 GitHub Wiki
Mi302 從大家看劇時的操作學出每一季的片頭和片尾,讓播放器顯示「跳過片頭」。學得不準或想先設好的季,也可以手動設定。這一頁說明怎麼學、怎麼手動設定、播放器拿到什麼、怎麼用 SenPlayer 測試,以及資料存在哪裡。
播放器播放時每隔幾秒會回報一次播放位置。Mi302 從這些回報看出「在開頭跳過了一段」和「在片尾停下、切下一集」,記成這一集的片頭片尾。
- 不讀影片、不碰 115,也不需要 ffmpeg。
- 只學劇集的集,電影不學。
- 做法參考 Emby 神醫助手(StrmAssistant)的「片頭探測 - 播放行為」。
| 條件 | 規則 |
|---|---|
| 從哪裡開始跳 | 片頭區內:前 10 分鐘;片長不到 40 分鐘時是前 25%(24 分鐘的動畫是前 6 分鐘);不知道片長時用前 10 分鐘 |
| 一次往前跳多少 | 15 秒到 3 分鐘;超過 3 分鐘算跳過劇情,不算片頭 |
| 不是倍速播放 | 位置前進的量要超過實際經過時間的 3 倍再加 15 秒 |
| 記下什麼 | 跳之前最後回報的位置 → 跳之後第一次回報的位置 |
只看跳的那一下,之後怎麼播不管。因為用的是回報的位置,會有幾秒誤差。
片尾要知道片長。片長來自 nfo 的 <runtime>,或媒體資訊(X-mediainfo.json、ffprobe 探測);不知道片長的集不學片尾。
| 條件 | 規則 |
|---|---|
| 片尾區 | 最後 5 分鐘;片長不到 20 分鐘時是最後 25% |
| 情況一:停下 | 在片尾區裡停止播放(切下一集、關掉),離結尾還有 20 秒以上 → 記下停下的位置 |
| 情況二:往前跳 | 從片尾區裡往前跳(同樣要不是倍速播放),跳到離結尾不到 20 秒的地方,或一次跳 60 秒以上 → 記下跳之前的位置 |
| 不算 | 離結尾不到 20 秒才停(等於播完了);還沒到片尾區就開始跳 |
「一次跳 60 秒以上」是為了片尾曲後面還有下集預告的情況:跳過片尾曲,但不一定跳到結尾。
- 每個使用者對每一集的片頭、片尾各只留最後一次紀錄。
- 這一集自己有紀錄(不論是誰的):片頭的開始、結束各取中位數;片尾開始取中位數。
- 這一集沒有自己的紀錄:用同一季其他集的紀錄。片頭同樣取開始、結束的中位數;片尾取「距離結尾多久」的中位數,再套到這一集的片長上(這一集也要知道片長)。
- 自己的紀錄優先,不和整季混在一起算。
- 取中位數,所以偶爾有人亂跳不會蓋掉。
- 這一季有手動設定時,設了的部分用手動的值,不看上面這些,見下面的「手動設定」。
三種格式都給,播放器認哪種用哪種:
| 格式 | 在哪裡 | 內容 |
|---|---|---|
| Emby 章節標記 | 項目詳細資料的 Chapters(/Users/{userId}/Items/{id}、/Items/{id},或查詢時帶 Fields=Chapters) |
MarkerType 為 IntroStart、IntroEnd、CreditsStart 的章節,接在媒體資訊的章節後面 |
| Jellyfin Intro Skipper 外掛 |
GET /Episode/{id}/IntroTimestamps(也認 /v1)、GET /Episode/{id}/Timestamps
|
以秒為單位的片頭(和片尾);沒有片頭時 IntroTimestamps 回 404 |
| Jellyfin 10.10 媒體片段 | GET /MediaSegments/{id} |
Intro、Outro 兩種片段 |
這些是播放器要資料時才算的。剛學到的片頭,播放器下次載入那一集就拿得到。
SenPlayer 讀的是 Emby 的章節標記(上表第一種)。測試步驟:
- 確認「整理」分頁「片頭片尾」卡片「設定」裡的「學片頭片尾並給播放器」開著(預設開)。
- 在 SenPlayer 打開一部有片頭的劇的某一集,先正常播幾秒。
- 在片頭區內(前 10 分鐘,短的集是前 25%)一次往前跳過片頭,長度在 15 秒到 3 分鐘之間,例如拖動進度條。
- 跳過之後繼續播 10 到 20 秒,讓 SenPlayer 回報新的位置。
- 回管理網頁看「片頭片尾」卡片,這一季應該出現「片頭 X → Y」。
- 在 SenPlayer 打開同一季的另一集:播到片頭時應該出現跳過片頭的按鈕。
沒有學到時,到「日誌」分頁搜尋「學到片頭」。常見原因:一次跳超過 3 分鐘、開始跳的位置已經過了片頭區、跳之前或之後播放器還沒回報位置。
片尾的測法:在最後 5 分鐘內(離結尾 20 秒以上)停止播放或切下一集,卡片上會出現「片尾在結尾前 …」。這一集要知道片長。
在「整理」分頁的「片頭片尾」:
- 上方的數字是「學到的季」「有紀錄的集」和「手動設定的季」。
- 搜尋框:輸入劇名找某一部劇的每一季,還沒學到的季也找得到。原名、簡繁體、拼音全拼、首字母都認,例如
qyn。 - 沒有搜尋時,清單列出有學到紀錄或手動設定的季,最近有動靜的在前面,一頁 20 季。每一季顯示劇名、第幾季、「片頭 X → Y」和「片尾在結尾前 …」,括號標出是「學到」還是「手動」;手動設定的季有「手動」標籤。這些值用那一季第 1 集來算。
- 每一季的「編輯」:手動設定,見下一節。
- 「清除全部」:確認後刪掉所有學到的紀錄,之後看劇時重新學。手動設定不會清掉。
- 「設定」裡的「學片頭片尾並給播放器」:
server.intro_skip,切換時立刻儲存。
學得不準、或想在還沒人看之前先設好時,搜尋劇名,按那一季的「編輯」:
| 欄位 | 選項 |
|---|---|
| 片頭 | 「自動(照播放行為學)」、「手動設定」(填開始和結束)、「這一季沒有片頭」 |
| 片尾 | 「自動(照播放行為學)」、「手動設定」(填從結尾前多久開始)、「這一季沒有片尾」 |
- 時間寫成「分:秒」(例如
1:35)、「時:分:秒」或秒數。還沒手動設定過時,欄位先填上學到的值,改一點就好。 - 片尾記的是「從結尾前多久開始」,所以同一季片長不同的集也對得上;要知道片長(nfo 的
<runtime>或媒體資訊)才給得出去。 - 勾「這部劇的每一季都用這個設定」,同一部劇的每一季都存成一樣的設定。
- 有學到紀錄的季,還有「清除這一季學到的紀錄」。
- 手動設定了的部分直接給播放器,不再照播放行為;片頭、片尾可以分開設,另一個照樣自動學。播放行為照樣記錄,把兩個都改回「自動」就回到學到的值。
- 片頭的結束和片尾的長度都不能超過 60 分鐘,片頭的開始要早於結束。
關掉「學片頭片尾並給播放器」後:
- 不再學新的紀錄。
- 不再給播放器:沒有章節標記,Intro Skipper 的端點回 404 或
Valid: false,媒體片段是空的。 - 已經學到的紀錄和手動設定都留在資料庫,重新打開就再用。要刪掉學到的紀錄請按「清除全部」。
- 手動設定也要開著這個開關才會給播放器。
- 學到的紀錄存在資料庫
data/library.db的intro_obs資料表:每一集、每個使用者、片頭或片尾各一筆,記開始、結束位置和時間。 - 重新啟動、更新都不會不見,每天的自動備份也包含它,見 備份與還原。
- 只有「目前這一次播放」放在記憶體:每個使用者每一集最後回報的位置和時間,停止播放或 6 小時沒動靜就丟掉。所以剛好跨過重新啟動的那一跳學不到。
- 手動設定存在同一個資料庫的
intro_manual資料表,每一季一筆。 - 集從媒體庫移除時(檔案刪掉、改名),它的紀錄跟著刪掉;季不見了,它的手動設定也跟著刪掉。