片頭片尾跳過 - MiCat-S/Mi302 GitHub Wiki

繁體中文 | 简体中文 | English

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 測試

SenPlayer 讀的是 Emby 的章節標記(上表第一種)。測試步驟:

  1. 確認「整理」分頁「片頭片尾」卡片「設定」裡的「學片頭片尾並給播放器」開著(預設開)。
  2. 在 SenPlayer 打開一部有片頭的劇的某一集,先正常播幾秒。
  3. 在片頭區內(前 10 分鐘,短的集是前 25%)一次往前跳過片頭,長度在 15 秒到 3 分鐘之間,例如拖動進度條。
  4. 跳過之後繼續播 10 到 20 秒,讓 SenPlayer 回報新的位置。
  5. 回管理網頁看「片頭片尾」卡片,這一季應該出現「片頭 X → Y」。
  6. 在 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 資料表,每一季一筆。
  • 集從媒體庫移除時(檔案刪掉、改名),它的紀錄跟著刪掉;季不見了,它的手動設定也跟著刪掉。
⚠️ **GitHub.com Fallback** ⚠️