Repository navigation
Releases: 1morr/Berth
Release list
v0.5.0
從 0.4.1 升級(0.4.2-rc1 是演練發版流程的預發佈,程式與 0.4.1 相同):docker compose pull && docker compose up -d
就好;docker-compose.yml 與 .env 沒有變。image 是 ghcr.io/1morr/berth:0.5.0,同時是 :0.5 與 :latest——固定在
:0.4 的不會自動升到這一版,要把 berth 的 image 改成 :0.5。下面改到的 API 只有 Berth 自己的畫面在用,升級之後
重新整理一次頁面即可。這一版有兩個資料庫 migration(Berth 啟動時自動依序套用一次,各自寫在下面那一條;都只加
可以留空的欄位,舊資料不改);升級前備份一次 ${CONFIG_ROOT}/berth。
升級後第一次啟動要知道的:
- 審核佇列會自動重算一次:停在審核、由舊版本規則算出的計劃(例如被「早於播出日」擋下的地上波先行集數),啟動後在
背景照新規則重算,放行的自己入庫;你逐列改過的與撤銷回來的不動。之後同一版重啟不再重算。 - 第一次每日巡檢(05:00)可能開出「遲到」:訂閱的作品最後入庫的一集之後,有集播出過了門檻(預設 2 天,從播出日
隔天起算)還沒入庫時,待處理會多一件;最後一集缺集播出滿 60 天的不提醒,收在追更頁的「斷更很久」。門檻在訂閱頁改。 - 推理程度預設「中」:設定 → AI 沒動過的,升級後讀回來是「中」。Anthropic 接口上的 DeepSeek 與支援推理程度的
Claude 會照它送(DeepSeek 的「中」等於「高」),之前什麼都不送;要省 token 或你的服務不收這個參數,到設定 → AI
改成「低」或「關」。OpenAI 相容接口上 Berth 認不得的模型照舊不送。
這一版是 M5.5「新番與導覽」:頁首收成五項,多了新番時間表與追更頁,訂閱的作品晚了會開 Issue;審核佇列裡被誤擋的地上波
先行集數與累計編號的第一批不再等人,這些都不需要 AI;助理面板修了模型清單、搜尋結果、推理與對話清單。
Added
- 訂閱的作品遲到提醒:每天 05:00 的巡檢看訂閱的作品(綁好的 RSS Series,或從作品頁預先綁定、一集都還沒收到的
Feed),最後入庫的一集之後播出滿門檻還沒入庫的集,開一件「遲到」到待處理,一部作品一件,列出晚的集與卡在哪
(字幕組沒發、送單失敗、下載停滯、入庫失敗),連到作品頁與卡住的下載;下載還在跑、等審核或已經有 Issue 管著的
不開,都入庫之後自己收掉。門檻預設 2 天,在訂閱頁改(新的
GET/PUT /api/rss/overdue,只有管理員)。上一集與這一集隔了三週以上時說「可能是下一輪」(多半是 Mikan 上另一個
番組,要另外訂);最後一集缺集播出滿 60 天就不再提醒;刪掉訂閱之後不再提醒。每個字幕組可以在訂閱頁的「進階」各設門檻
(新的PUT /api/rss/series/{id}/overdue,只有管理員;migratione5a2c8f4b931在rss_series加可留空的
overdue_days,留空用全域),一部作品訂了幾組時取最大的。巡檢前先向 TMDB 更新訂閱作品的
集數表,剛播出的那一集看得到;更新失敗的那部作品那一天不開也不收。Discord 的「有 N 件等你處理」與「等了 N 天」
遇到遲到時,內文一部一行寫出作品名與晚的集(例如「葬送的芙莉蓮 S02E05–E06」),可能是下一輪的照實說,最多列五部、
其餘寫「等 N 部」;英文的私訊用英文片名。 - 新番時間表(
/schedule):這一週 TMDB 上播的日本與中國動畫,週一到週日分欄、今天標出,手機上一次看一天;每張卡寫
第幾集與狀態(已訂閱、已入庫),點進作品頁就能訂閱,可切「只看已訂閱」。頁首的「新番」改成每個人都有、連到這裡;
「訂閱」分頁仍只有管理員。第一次打開要向 TMDB 讀這一週每一部作品,約十幾秒,之後六小時內是即時的。新的
GET /api/schedule(登入就能讀)。原文名在 AniList 對得上的卡片另寫放送時刻(只有還沒播的),在 Bangumi 對得上的
另寫評分;對不上或這兩個來源連不上時只少這兩格(GET /api/schedule的卡片多airs_at與score)。 - 追更頁(
/schedule/tracking,只有管理員):新番底下多一個「追更」分頁,訂閱的作品一部一列,寫字幕組、已播到、
已入庫到與狀態(下載停滯會說出來),晚了的寫「晚 N 天」(從播出日算)並連到卡住的下載;分「要你動手」「準時」
「斷更很久」三段,斷更很久預設收起。沒接 Discord 收不到遲到通知時,頁首說一句並連到通知設定。時間表上晚了的那一集
也寫「晚 N 天」。新的GET /api/schedule/tracking(只有管理員);GET /api/schedule的卡片多late狀態與
late_days。 - 設定 → AI 的模型清單:模型欄的建議照表單上的 Base URL 換成那一家的模型(例如填了 DeepSeek 的網址就是 DeepSeek
的模型),只查 Berth 內建的價目表、不帶 key、不連外。模型欄旁多一顆「取得模型」,按了才向填的端點問它有哪些模型;
端點不提供清單(例如 DeepSeek 的 Anthropic 接口)或問不到時退回內建的清單並說明原因,模型名仍可照打。改了 Base URL
或 key 之後,取得的清單收掉。新的GET/POST /api/settings/ai/models(只有管理員)。 - 查得到助理當時有哪些搜尋工具:側面板的
/status多一列「網路搜尋」,由 Berth 照設定直接說下一則訊息搜得到什麼
(伺服器端web_search、Tavily),不問模型;每一輪的步驟頁在每次模型呼叫下列出送出的工具,之前的呼叫寫「未記錄」
(migrationb8d4f2a6c193在ai_calls加可留空的tools_json)。
助理也被告知工具可能在兩則訊息之間變動,只看當下的清單。 - 推理程度:設定 → AI 的模型欄下面多一格「推理程度」(關、低、中、高,沒設過是中),兩種接口各記各的。DeepSeek
只分低與高,中等於高;在 Anthropic 接口上關掉就真的不推理。OpenAI 相容接口上 Berth 認不得會推理的模型(包括
DeepSeek),以及 Claude Sonnet 4.5、Haiku 4.5 這類不支援的 Claude,不送這個設定,設定頁會說沒有效果。
服務不接受這個程度時,助理停下的說明下面連到設定頁那一格(一般使用者
看到請管理員改)。/api/settings/ai每種接口多reasoning,新的GET /api/settings/ai/reasoning(只有管理員)。
Anthropic 接口上 Berth 認不得的相容閘道(DeepSeek 官方端點以外),選「關」就什麼推理參數都不送,設定頁與停下的
說明都會這樣說;低、中、高照送。GET /api/settings/ai/reasoning多收base_url、多回off_sends_nothing。 - 側面板畫出助理的推理:模型回推理文字時(例如 DeepSeek),回答上方多一格「推理」,預設收起、串流中也不展開,
展開看得到全文;重新載入之後還在。 - 助理的對話清單:側面板頁首多一顆「對話」,列出你最近 50 段對話(第一句話當標題、多久前、還在回答的標出來),
點一段切回去;輸入欄打/history是同一份清單。換一個瀏覽器或裝置打開面板時,自動接上你最近的一段對話,不再是空白;
按「新對話」之後重新整理仍是新的那一段。新的GET /api/agent/conversations(登入就能讀,只列自己的)。
Changed
- 頁首收斂成五項:探索、新番、媒體庫、下載、待處理(待處理只有管理員;新番與待處理帶件數,只有管理員看得到);
設定、健康、週報、語言與登出收進右上角的帳號選單。待處理裡審核與 Issue 是兩個分頁,原本的 RSS 頁改叫「訂閱」、
放在新番底下。所有網址不變,Discord 週報的連結照樣打得開。新的GET /api/waiting(只有管理員)回三份清單各等著幾件。 - M5.5 的介面收尾:桌面上開著側面板時,時間表改成一次一天、頁首不再折成三列;時間表選的那一天與「只看已訂閱」
記在網址,點進作品頁再回來還在。待處理的「遲到」收著就寫出哪一集、晚幾天、卡在哪,下一步照卡在哪說。設定 → AI
按「取得模型」後把端點列的模型畫成一排鍵、按一下就填進去;改了 Base URL 時 key 欄當場說存著的 key 用不上。側面板的
對話清單打開時焦點落在目前這段;英文的面板抬頭改成 Chats / New chat。沒有 TMDB 憑證時,一般使用者只被請去找管理員,
怎麼申請只對管理員說,服務的原文收進「技術細節」。 - 地上波先行的集數不再被擋在審核:字幕組從 ABEMA 這類平台先拿到片,發佈比 TMDB 的電視台播出日早幾天。季集照字面
對上的發佈,早 9 天以內照常入庫(早超過 2 天的記一條「比播出日早」的理由);早 10–14 天的停在審核、說平台先行的
核准就好,更早的叫人先查作品與 TMDB 的日期。這樣先行的字幕組,訂閱的第一批也由系統確認。季號或集號經過換算的發佈
仍只容忍 2 天,理由改叫人查季號、offset 或絕對編號。 - 寫明季號的累計編號,第一批由系統確認:例如「夜櫻家 S2 - 40」對到第二季第 13 集,前面各季集數加起來剛好對得上、
那一集剛播、下一集還沒播時,訂閱的第一批不再等人按確認。只寫集號的絕對編號與重數推測仍要人確認。 - 升級後自動重算審核佇列:啟動時,停在審核、由舊版本規則算出的計劃會在背景照新規則重算;人改過的計劃與撤銷回來的
不動,同版本重啟不重算。 - 助理的網路搜尋結果:側面板把
web_search的結果畫成標題、網址與日期的清單;每筆只給服務端用的encrypted_content
不再送到瀏覽器(串流與重新載入都是),助理下一輪的歷史照舊。
Fixed
- 改了 AI 的 Base URL 後,存著的 key 會被送到新網址:key 欄空著時,Berth 只在 Base URL 與存著的相同時才用存著的
那把(留空與填官方網址算相同)。網址改了、key 欄空著時,「取得模型」「測試連線」與儲存都會說要重填 key,什麼都不送、
不存。
v0.4.2-rc1
預發佈,不必升級:演練新的發版流程(tag 先過完整 CI 與真服務 e2e,都綠了才推 image、建 Release)。程式與 0.4.1
相同,只多了測試與 CI 的改動;image 是 ghcr.io/1morr/berth:0.4.2-rc1,不動 :0.4 與 :latest。
v0.4.1
從 0.4.0 升級:docker compose pull && docker compose up -d 就好;docker-compose.yml 與 .env 沒有變,沒有資料庫
migration。image 是 ghcr.io/1morr/berth:0.4.1,同時是 :0.4 與 :latest。升級之後重新整理一次頁面。
Fixed
- 用區網 IP 走 HTTP 開 Berth(例如
http://192.168.1.10:8383)時整頁顯示「Something went wrong!」:0.4.0 的助理面板用了
瀏覽器只在 HTTPS 或 localhost 才提供的crypto.randomUUID,一打開就出錯。現在 HTTP 下照常運作。同一個原因讓「複製」鍵
(手動步驟的指令、Discord bot 邀請連結)在 HTTP 下按了沒反應,現在也複製得到。
v0.4.0
從 0.3.0 升級:docker compose pull && docker compose up -d 就好;docker-compose.yml 與 .env 沒有變。
image 是 ghcr.io/1morr/berth:0.4.0,同時是 :0.4 與 :latest——固定在 :0.3 的不會自動升到這一版,要把
berth 的 image 改成 :0.4。下面改到的 API 只有 Berth 自己的畫面在用,升級之後重新整理一次頁面即可。
這一版有九個資料庫 migration(Berth 啟動時自動依序套用一次,各自寫在下面那一條);升級前備份一次
${CONFIG_ROOT}/berth。
這一版是 M5「AI 助理」:頁首多一個「助理」側面板,要先在設定 → AI 填你自己的模型服務(Anthropic 或 OpenAI 相容)
與 key;不填也照舊運作,只是沒有助理。選 OpenAI 相容接口時建議另填 Tavily key,整部系列與評價要用網路搜尋。
助理改東西(送單、訂閱、刪訂閱)一律先出確認卡,你按了才做。
Added
-
助理看得到 Jellyfin 裡已有的東西(M5 票 28):自己複製進 Jellyfin、或舊安裝入庫而 Berth 沒有紀錄的集,作品頁季表標成
「Jellyfin 已有」,不再算「缺」:「只看缺集」不列、缺集一鍵搜不搜,助理補缺集與整部系列也不會重下(要換版本照名字搜)。
側面板多一個讀取工具「用名字查媒體庫裡有沒有」(只找你在 Jellyfin 看得到的媒體庫),推薦新番時標出已經有的與已經訂閱的;
這類檔案很多時,助理建議到待處理按「從媒體庫重建帳本」。Jellyfin 連不上時作品頁照常打開,只是分不出這一種。
GET /api/media/{id}多jellyfin(found/absent/unknown),集的status多in_jellyfin。
Jellyfin 的集照播出日對 TMDB,不照它自己的季集號(它可能照 TVDB 編):對不上的照舊算缺、缺集搜尋照搜,季表上標
「Jellyfin 可能有」並說出是 Jellyfin 的哪幾集(jellyfin_unmatched、集的jellyfin_maybe)。送單確認卡逐列標出
作品已經有的集(「含已有的第 1 季第 4 集」,preview.held),由 Berth 算,不靠助理說。 -
助理的訂閱流程,搜尋一律多語言(M5 票 27):請助理訂閱一部還在播的作品時,它用原名、英文名與你說的語言的作品名搜
(中文另加字幕組常寫的簡體名;TMDB 沒有你那種語言的名字時用它自己知道的或網路搜尋,並說出來源),列一張字幕組比較表
(字幕語言、解析度、最新到第幾集與日期、平常比播出晚多久、做種數、Mikan 有沒有)、給一個建議,等你選了才出卡。選的字幕組
在 Mikan 上就訂 Mikan,不在才建關鍵字訂閱(例如英文字幕組);作品已經有訂閱時會問要不要先刪掉舊的;某個站連不上時說是哪一站、
建議稍後再試,不自己改走另一個來源。下載一季、補缺集、整部系列與推薦新番找發佈時也照同一套名字搜,結果不夠時自己換關鍵字,
字幕語言與字幕組照你說的挑;你沒說、找到的又有不同字幕語言時,先分語言列出候選、問你要哪種再出卡。整部系列每一部分
先只用一個名字搜,沒有才換一次,Re:Zero 這種長系列找來源那一輪的用量不會因此變多。 -
助理看得到、刪得掉作品的訂閱(M5 票 26):側面板多一個讀取工具「列出作品的訂閱」(哪一條 Feed、哪個站、哪個字幕組)
與一張「刪除訂閱」的確認卡(不可逆;已下載、入庫的檔案與綁定留著)。訂閱與加 Mikan 單一 feed 的卡片會說出這部作品已經有的
訂閱,要不要再訂一份由你決定。搜尋發佈給助理的結果多了發佈時間,它算得出各字幕組多久出一集。 -
側面板的停下、繼續與暫停,作品頁說得出為什麼缺(M5 票 22):防護讓一輪停下時,側面板畫成 Berth 說的一塊「停下」
(哪一條、做到哪),不再像助理自己的話;可以續的那一輪(只有最後一輪)下面有一顆「繼續」,按一次就沒了。按「停止」之後
「連線被關掉」那一則當場就看得到。AI 服務連續出錯被暫停時,面板頂上說暫停到幾點、到時間自動恢復(一般使用者也看得到,
管理員另有錯誤原文)。送單確認卡
重述第一次送單會寫死的資料夾名。作品頁季表「缺」「卡住」那一格多一顆「為什麼」,按了說出原因(待綁定、被排除、
停在審核、沒有來源……)與下一步。data-stop多note(說明的字),重新載入時說明那一則也是同一個data-stop;
GET /api/agent/conversations/{id}拿掉stop(看最後一則的data-stop)。 -
助理會推薦新番、整理整部系列(M5 票 16、23d):側面板多三個讀取工具——AniList 的當季清單(附打分人數)、
Bangumi 的本季放送表(中文名與評分票數)與 TMDB 本週趨勢。「推薦新番」與「整部系列」兩份流程因此上線(推薦新番要訂閱,
只給管理員)。整部系列用網路搜尋查各季、各 cour 的集數表,對照 TMDB 的季集表列出範圍;集數加不起來、季接著上一季編號,
或有第 0 集、.5 集、總集篇被 TMDB 放進特別篇時,那一季整季標「請確認」。沒有網路搜尋(OpenAI 相容接口沒填 Tavily key)
或搜不到時,照 TMDB 各集播出日的空檔切段,每一季都標「沒有網頁核對,請確認」,AI 設定頁也會建議填 Tavily key。
AniList 照它目前的上限每兩秒最多問一次、被限流就整個停到它說的時間,問過的記 6 小時。這幾個來源是社群編的資料:
卡片上原本的「出自網頁」標記改叫「出自外部來源」,從這些資料站抄來的字也會標。伺服器端網搜搜到的整頁只在下一步再送給模型一次,
找來源時每次搜尋只給模型看前 10 列與它們沒涵蓋到的集(其餘說有幾列),Re:Zero 這種長系列從列清單到出卡不再撞到每輪的用量上限。 -
助理可以訂閱與加 RSS Feed(M5 票 14):管理員可以請助理從 Mikan 訂閱一部作品(它搜番組、列字幕組,出一張確認卡)、
建 Nyaa / acg.rip 關鍵字訂閱(可逆,直接做),或加一個你貼的 RSS 網址(出卡)。補缺集時助理只搜缺的那幾集,
一般使用者也用得上「補缺集」這份流程。幾條硬規則不靠模型聽話:卡片上的作品、發佈、Route、番組、字幕組一定要是
這段對話裡工具查到的;Feed 的網址一定要是你自己打的字(叫它「上網找網址直接加」會被擋下);從網頁抄來的文字
(例如搜尋詞、Feed 名稱)在卡片上標「出自網頁」,原本直接做的關鍵字訂閱也因此改成要你確認。一張卡送出的 torrent 最多 13 個
(Mikan 訂閱照整季的集數算,單獨就超過或讀不到集數的訂閱自己一張),多的等你按了之後助理再提一張。Mikan 訂閱卡那一列寫明「會送出整季」與幾個 torrent(按下確認就送,不經第一批確認;
讀不到 Mikan 時說數量要送出時才知道)。側面板上被 Berth 擋下的工具呼叫顯示「沒成功」,不再是「完成」。
GET /api/proposals的preview多external_fields(逐列出自網頁的欄位)、held_back(留給下一張的列數)
與torrents(逐列會送出幾個 torrent)。 -
AI 用量頁與每一輪的步驟頁(M5 票 21):設定多一個「用量」分頁(只有管理員):近 30 天每天的 token(新的 input、快取讀、快取寫、
output)、快取命中率、估計費用、網搜次數,各種防護停下幾次、工具呼叫被擋下幾次,最近 20 輪,以及費用怎麼估(價目附查證日期)。
接口沒報的數字寫「—」、價目表上沒有的模型寫「未知」,不當 0。可以設每日提醒值;今天到了它,或是近 14 天有用量那幾天的中位數的
5 倍以上,用量頁與側面板(只給管理員)會提醒——只提醒,不會停用 AI,也不推 Discord。提醒只算得進有價目的費用:今天或前 14 天有費用未知的呼叫(有回應,但模型不在價目表上;出錯沒有回應的沒有花費,不算)時,兩處都明說有幾次沒算進去,「沒有提醒」不會看起來像沒事。側面板每一則回覆底下多一個「步驟」,
連到那一輪的步驟頁:每一次模型呼叫與它叫的工具、各自的 token、耗時、結果(含被擋的理由)與停止原因,被中止的那一輪也有。
一般使用者看得到自己的步驟頁,看不到用量頁。新增GET /api/settings/usage、PUT /api/settings/usage/alert、
GET /api/agent/runs/{id};GET /api/agent/status多spend(提醒與沒算進去的呼叫數,只給管理員),對話的每一則助理訊息帶metadata.runId。 -
助理的上下文壓縮與斜線指令(M5 票 18):對話一長,下一則開頭自動把較早的部分換成一段摘要
(佔到模型 context window 的六成時,留最後兩輪),助理照樣記得要的是哪部作品、送了什麼;等你確認的卡片不受影響。
摘要在對話開頭收成一行,展開看全文。輸入欄打/列出指令:/new新對話、/compact現在就壓縮(只留最後一輪)、
/usage這段對話用了多少(token、快取命中、網搜次數、估計費用)、/status模型與上下文用了多少、
/pending還在等你決定的確認卡(每一段對話的)、/skills助理會照著做的工作流程。指令不經過模型,結果只在這個分頁。
新增POST /api/agent/conversations/{id}/commands;以/開頭的訊息送進POST /api/agent/chat是 422slash_command。
資料庫 migratione6b2d9a4c731:ai_runs多一欄kind(chat/compaction),既有的列是chat。 -
助理可以替你送單,先出一張確認卡(M5 票 13):在側面板說「下載 ⋯⋯」,助理搜作品、搜發佈、選好 Route,
然後出一張卡:每一列是一個要送的 torrent(發佈名、大小、作品、Route),標著「會送出 torrent」與期限。
多列時逐列可取消勾選;按下確認就送出勾著的那幾列,每一列當場看得到結果(會部分成功),助理接著說它拿到的結果。
沒按就繼續聊也沒關係:卡片仍然有效,之後再按照樣執行,助理下一則會知道。卡片存在 Berth 的資料庫裡,
重新載入、換裝置、Berth 重啟之後都還按得下去,24 小時沒人按就過期。只有提出它的那個人(與管理員)按得到;
一般使用者也能請助理送自己的單。卡片上不會出現下載連結(帶著 Prowlarr 的 API key)。
資料庫 migrationd8a4f1c6e273:proposals多兩欄(提出它的那一次工具呼叫、脫離對話的時刻),既有的列是空的。 -
助理側面板(M5 票 12):每一頁的頁首多一顆「助理」,打開是一個對話面板——桌面在畫面右側一欄、頁面讓位,
兩邊都能操作;手機蓋滿整個畫面。可以問「某部作品為什麼還沒入庫」:助理查了什麼一行一個(展開看參數與結果),
回答說出結論。換頁、重新載入之後對話還在(存在 Berth 的資料庫,記在這個瀏覽器);「新對話」從空的開始。
回覆裡的圖片一律不載入,只印出網址(圖片網址是常見的外洩通道),原始 HTML 不渲染。AI 沒開時管理員看到
去設定頁的連結,其他人看到「管理員還沒設定」,其餘功能與之前完全一樣。
新增GET /api/agent/status(登入就讀得到,回 AI 開著沒有)。演練伺服器多一個agent情境(照腳本回答的
假模型,不需要金鑰)。 -
AI 對話的工作流程說明(skills)(M5 票 19):常見的幾種事 AI 照一份寫好的步驟做,平常只帶名稱與一句描述,
要用時才載入全文,不必每一輪都付整段流程的費用。第一批四份:為什麼沒入庫、補缺集、整理整個系列(含 TMDB 把好幾季併成一季時的集數換算)、
當季新番推薦(評分附評分人數,太少的標出來)。這一版只有「為什麼沒入庫」用得上,其餘三份等送單、訂閱與動漫資料來源的工具做好就自動出現。
skill 是berth/skills/底下的 Markdown 檔,只能寫步驟,不能附程式。 -
AI 對話的網路搜尋(M5 票 17):推薦新番、查系列順序時 AI 可以上網看評價。接口是 Anthropic Messages
(官方或 DeepSeek 這類相容端點)時用服務自己的網路搜尋,不用另外申請帳號;在設定 → AI 填了 Tavily key 的話,
兩種接口都多一個 Tavily 搜尋。只搜動漫與影視的資料站、維基百科與 Reddit,每則回覆最多搜 5 次,回覆引用的網頁附網址。
搜尋次數記在用量裡;Anthropic 官方端點每次估 $0.01,其他端點的網搜價格不知道,不算進估計費用。
資料庫 migrationc3e7a1f9d524:ai_calls、ai_runs多記網搜次數,既有的列補 0。 -
AI 對話的其餘防護(M5 票 20):模型在兩個呼叫之間來回而結果都沒變、或連續三次呼叫都沒拿到新東西時停下;
一筆工具結果太長時只交給模型前面一部分,並告訴它還有幾筆、怎麼縮小範圍再問。AI 服務連續 5 次出錯時暫停
15 分鐘(換了 key 或模型不用等),GET /api/agent/status說暫停到什麼時候(管理員另外看得到是什麼錯),一般使用者也看得到。
被防護停下的那一輪可以按一次「繼續」(POST /api/agent/chat帶continues),續的那一輪再停下就不能再續;
GET /api/agent/conversations/{id}多一格stop說最後一輪停在哪。每一種防護停下都記成自己的停止原因。
這一版還沒有畫面。資料庫 migrationc4e7a9d2b158:ai_runs與ai_tool_calls各加一欄。 -
AI 對話的後端(M5 票 11):
POST /api/agent/chat(Vercel AI SDK 的串流)與GET /api/agent/conversations/{id}。
對話存在 Berth 的資料庫,畫面送來的歷史不採用;AI 能用的只有幾支讀取命令(找作品、「為什麼沒入庫」、下載清單與時間線),
一般使用者只有前兩支。每一次模型呼叫的 token、快取讀寫與估計費用當場記下,被中止的那一輪也有。
防護:每次最多輸出 4096 token、每輪 20 次模型呼叫與 400K / 30K token、同一個呼叫第 2 次警告 / 第 3 次擋下 / 第 4 次中止
(失敗的重試不算)、每人同時一輪;停下來時對話裡留一則說明是哪一條、做到哪。畫面見上面的助理側面板。
資料庫 migration78a62163b817:新增四張表,既有的不動。 -
確認卡的後端(M5 票 08):要人確認的動作存成一筆資料,隔天按、換一台裝置按、Berth 重啟之後按都照樣有效,
沒人按的 24 小時後過期。按下確認時用伺服器存的那一份參數、先重新檢查一次,再逐列執行並記下每一列的結果
(一次送整個系列時會有幾列成功、幾列被拒);只有提出的人或管理員按得到,連按兩次只執行一次。
API:GET /api/proposals、POST /api/proposals/{id}/decide,狀態變更經GET /api/events/stream的
event: proposal推出去。這一版還沒有畫面,是之後 AI 側面板確認卡的資料來源。 -
「為什麼沒入庫」的讀取 API(M5 票 10):
GET /api/media/{id}/why-not,加?season=&episode=問一集。
一次回齊季表、相關的下載與最後幾筆時間線、開著的 Issue、RSS 那一側(綁了沒、被排除了沒),加一個結論:
入庫失敗、沒下載成、等審核、待綁定、被排除、沒有來源、還在下載、Jellyfin 還沒掃到、還沒播、已入庫。
一般使用者只看得到自己送的下載,看不到 Issue 與 RSS。這一版還沒有畫面,是之後 AI 側面板的資料來源。 -
設定 → AI(M5 票 09):接上你自己的模型服務。兩種接口各自記著 Base URL、API key 與模型名:
Anthropic Messages(官方或相容閘道)與 OpenAI 相容的 Chat Completions(OpenAI、OpenRouter、自架閘道、本機模型);
切換接口不會丟掉另一邊填好的。「測試連線」用表單上還沒存的值打一次最小呼叫,成功說哪個模型回話,失敗說是
key 被拒、模型或網址找不到、服務出錯、連不上還是網址指錯地方,並附上服務回的原文。key 存進去之後畫面只說
「已設定」,不回到瀏覽器、不進 log。已知價目的模型顯示每百萬 token 的價格與查證日期,認不得的寫「未知」。
另可填 Tavily key 給之後的網路搜尋工具。開關預設關著:不設定的話 Berth 與之前完全一樣。設定存在資料庫,
不讀環境變數。API:GET|PUT /api/settings/ai、POST /api/settings/ai/test、DELETE /api/settings/ai/keys/{key}。
Changed
- 訂閱的字幕組由你選(M5 票 26):Mikan 訂閱卡列出番組頁上的每個字幕組(筆數、最近更新、最新一筆),助理建議的
只是預選,可選的不只一個時沒選就沒有確認鍵;送出的集數跟著選的那一組。關鍵字訂閱(Nyaa / acg.rip)在側面板一律出卡、
在作品頁先搜:兩處都列出這一次搜到的字幕組,選一組、看它的第一批,再選「下載這些並追之後的」(預設)或「只追之後的」
(同 RSS 頁第一輪那兩顆),按下去才建,那條 Feed 只收這個字幕組的發佈,不必再到 RSS 頁選第一輪;讀不到搜尋就不建。
POST /api/rss/subscriptions/search的subgroup必填、多first_batch,新端點GET /api/rss/search/subgroups;卡片 API
多preview.subgroups、preview.existing、preview.first_batch與決定時的subgroups、first_batch
(subgroup_required、subgroup_not_offered、first_batch_not_offered);rss_feeds多subgroup(migration
d7e1b3a5c926)。已經綁了好幾個字幕組的舊 Feed 照舊運作。 - 重新整理頁面、關掉分頁,助理那一輪照樣跑完(M5 票 25):之前連線一斷那一輪就停在「連線被關掉」。現在它在伺服器上
跑到完,回到對話時接著顯示還在跑的那一輪,或直接看到跑完的結果;只有按「停止」會停(說明寫「你按了停止」,開著同一段
對話的每個分頁都收到)。另一個分頁正在答時送出,面板接上那一輪;在跑的是你的另一段對話(例如開了新對話)時,面板說是哪一段,可以點過去接上,或停掉那一輪再重送這一則(busy的 detail 是那一段對話的 id)。Berth 重新啟動時還在跑的那一輪記成「Berth 重新啟動時
中斷」並補一則說明,用量頁與步驟頁也這樣寫。新增GET /api/agent/conversations/{id}/stream?turn=<id>(重連,沒有在跑
是 204)與POST /api/agent/conversations/{id}/stop(沒有在跑是 409not_running);GET /api/agent/conversations/{id}
多running;停止原因多interrupted。 - 作品放得進的 Route 不只一條時,確認卡上要你選(M5 票 23b):助理出的送單卡與 Mikan、關鍵字訂閱卡,那部作品有兩條以上
啟用中、收這一種作品的 Route 時,那一列的 Route 換成必選的下拉,預選這部作品上次送單用的那一條(沒用過就不預選),
勾著的列沒選齊之前沒有確認鍵;助理不再在對話裡問 Route,它給的那一條也不會被預選。關鍵字訂閱(Nyaa / acg.rip)平常由助理
直接建,但作品放得進的 Route 不只一條、這部作品又沒送過單時,改成出卡讓你選。伺服器只收提出時存下的那份清單裡的
Route。只有一條時照舊直接帶入。API:GET /api/proposals的preview多逐列routes(可選清單與預選),卡片多routes
(核准時選的);POST /api/proposals/{id}/decide多選填的routes(與列對齊),要選的列沒選是 422route_required,
不在清單上是 422route_not_offered。資料庫 migrationc2f6a8d4e917:proposals多一欄routes_json,既有的列是NULL。 - AI 估計費用改用 genai-prices 查價,照端點網址認服務商(M5 票 21b):價目改由 Pydantic 維護的
genai-prices(隨 Berth 內附的 0.1.13)提供,先照 base URL 認出是哪一家,
所以「Anthropic 接口 + DeepSeek 端點」照 DeepSeek 的價算,不再照模型名套原廠價;DeepSeek 的尖峰離峰照每次呼叫當時的價。
網址認不得(自架閘道)時照接口種類查;都查不到的看 Berth 自己的補位表,再查不到照舊寫「未知」。查價不連網,價目跟著
Berth 的版本更新。AI 設定頁與用量頁的「查證日期」改成價目來源(genai-prices 的版本與它認出的服務商,或補位表的查證日期),
用量頁的價目改成每一組「端點 + 模型」各列一次,模型欄的建議...
v0.3.0
從 0.2.9 升級:docker compose pull && docker compose up -d 就好;docker-compose.yml 與 .env 沒有變。
image 是 ghcr.io/1morr/berth:0.3.0,同時是 :0.3 與 :latest——固定在 :0.2 的不會自動升到這一版,要把
berth 的 image 改成 :0.3。下面改到的 API 只有 Berth 自己的畫面在用,升級之後重新整理一次頁面即可。
這一版有六個資料庫 migration(Berth 啟動時自動依序套用一次,各自寫在下面那一條)。
這一版是 M4「有事時 Berth 會說」:通知走 Discord 私訊,要先在設定 → 通知貼上你自己建的 bot token;不設也照舊運作,
只是不會收到通知。每天的巡檢與每週的週報不需要設定。
Added
- 「可以看了」送到管理員的 Discord(M4 票 123):一筆下載在 Jellyfin 全部認出來之後,每一位填了 Discord ID 的
管理員收到一則私訊,說出作品、季集與 Route(電影只說作品)。設定 → 通知:貼上自己建的 Discord bot 的 token
(存的時候向 Discord 驗一次,之後畫面只說「已設定」,token 不回到瀏覽器)、用邀請連結把 bot 加進你所在的伺服器、
填自己的 Discord user ID、按「送一則測試訊息給我」,失敗時當場說出原因與補法。通知用存 ID 那一刻的介面語言寫。
Discord 暫時連不上時,沒送到的那幾則留著下一輪再送。API:GET /api/settings/notifications、
PUT /api/settings/notifications/bot;自己的 Discord ID 與測試在/api/me/notifications(下一條)。
這一版有資料庫 migration(d5e8a2c7f914):新的待送表,使用者多兩欄(Discord ID、通知語言)。 - 通知裡的連結(M4 票 124):設定 → 通知多一格「Berth 的網址」,填你在手機上、家外面打開 Berth 用的那一個
(反向代理、Tailscale、NAS 的網域)。沒存過時預填你現在開著 Berth 的網址,按儲存才算數;不是http://或
https://開頭的完整網址會被擋下並說原因。存了之後「可以看了」帶作品頁的連結;沒存照送、不附連結。
Jellyfin 的對外網址同一條規則,兩者都不再收帶?或#的網址(接上路徑之後開不到那一頁)。
API:PUT /api/settings/notifications/berth-url,GET /api/settings/notifications多一格berth_url。 - 通知送不出去時看得見、不拖累別的(M4 票 128):健康頁多一張「通知」卡,說出上次送出、等著送幾則;
Discord 不再接受 bot token(例如在 Developer Portal 重設過)時它變紅、通知全部暫停,設定 → 通知貼上新的
token 就自動恢復。Discord 連不上時自動退避再試(30 秒起,最長隔一小時),被限速時照 Discord 說的秒數等。
bot 傳不到某個人(沒有共同伺服器或關了私訊)時,那一則不再重試,那個人的設定 → 通知上說出原因與兩個補法,
補好之後按測試、送到了那一句就收掉。送不出去的通知最多留 24 小時就放棄,修好之後不會一次湧出一大堆舊的。
通知寫不成或送出出錯都不會讓下載、入庫失敗。API:GET /api/health/detail多notify,
GET /api/settings/notifications多token_rejected,GET /api/me/notifications有unreachable_at、
unreachable_detail。
這一版有資料庫 migration(e3a9c6f1b207):使用者多兩欄(上次收不到通知的時間與原文)。 - 每個人都收得到通知,只收自己看得到的(M4 票 125):一般使用者也有設定 → 通知(頁首的「設定」帶他到這一頁),
填自己的 Discord ID、勾要收哪幾種(「可以看了」預設勾著;「正在下載」可以先勾,這一則還沒開始送)、按測試;
bot token 與 Berth 的網址仍只有管理員看得到。「可以看了」只送給在 Jellyfin 看得到那個媒體庫的人,
帳號被停用的不送;Jellyfin 暫時問不到時那一則等它回來再送,不猜。同一部作品 5 分鐘內入庫的幾批合成一則、
季集範圍合起來,所以每一則「可以看了」會在認出來之後約 5 分鐘到。API:「我的」那一半從
/api/settings/notifications/me、/test搬到GET|PUT /api/me/notifications(多kinds)、
POST /api/me/notifications/test;GET /api/settings/notifications只剩 bot 與 Berth 的網址。
這一版有資料庫 migration(f4b8d2e6a913):使用者多一欄(要收的通知種類,既有的人是「可以看了」)。 - 「有 N 件等你處理」(M4 票 127):待審核、Issue 或待綁定的 RSS Series 有新的一件時,管理員收到一則 Discord
私訊;10 分鐘內接著出現的併進同一則。訊息說出這一波新增了什麼(「新增 3 件:1 件待審核、1 個 Issue(無主目錄)、
1 個 RSS Series 待綁定」)與現在各有幾件;只有一件時連到那一列(頁面打開後捲到那裡),多件時連到各自的清單。
送出前都已經處理掉的就不送;被忽略、隔天對帳又開的 Issue 算進總數但不再推。原本規劃的「Issue 新增」通知併進這一則。
只有管理員收得到、在設定 → 通知勾得到;管理員預設就勾著。Discord 的連結好幾條時寫在同一行。
這一版有資料庫 migration(b7d1e5a3c820):既有的管理員補上這一種通知的訂閱。 - 「正在下載」開始送了(M4 票 126):在設定 → 通知勾了它的人,RSS 送出新的下載時收到一則 Discord 私訊,
說出作品、季集與 Route(「正在下載:葬送的芙莉蓮」、S02E03–E05)。一輪一則、一部作品一則:一個 Feed
的一次輪詢、一次綁定(連補舊集上百集也一樣)、一次訂閱,送出幾集都合成一則;qBittorrent 沒收下的不算。
在搜尋結果或作品頁按下載、在 RSS 頁按綁定、「立即輪詢」、「全部下載」、放行時,其他訂閱的人照收,按的人自己不收。
只送給在 Jellyfin 看得到那個媒體庫的人(同「可以看了」)。 - 每日巡檢(M4 票 129):Berth 每天 05:00(容器的時區)自己檢查一次,不花 token。
- 第一批卡住:還沒確認的 RSS Series 有一筆下載停在「送單失敗」或「客戶端錯誤」超過一天,而那一筆沒有別的
Issue 在說它時,/issues多一件「第一批卡住」。列上說出停在哪、從什麼時候、原因與下一步(重試或刪掉那一筆,
或在審核頁確認整個 Series),連到那一筆下載;處理之後隔天巡檢自己收掉,忽略了就不再問到它解除為止。 - 放太久:「等你處理」裡最舊的一件等了 3 天以上,訂閱了「等你處理」的管理員再收到一則提醒(「有一件等了
3 天」),連到那一件;同一件 3 天內只提醒一次,送出前處理掉了就不送。升級之前就在等的,從升級後開始算。 - 重啟 Berth 不會立刻跑一輪;精靈跑完之前不跑。
- 第一批卡住:還沒確認的 RSS Series 有一筆下載停在「送單失敗」或「客戶端錯誤」超過一天,而那一筆沒有別的
- 每日巡檢看 RSS(M4 票 130):同一輪多三種
/issues,處理之後隔天巡檢自己收掉,忽略了就不再問到它解除為止。- 一直失敗的 Feed:Feed 的輪詢或每日補漏一直失敗超過一天,各開一件(「輪詢一直失敗」「補漏一直失敗」),
說出從什麼時候、最後的原因,連到 RSS 頁的那一個 Feed。RSS 頁的 Feed 列也把兩種失敗分開說:輪詢是整個 Feed
讀不到,補漏是某幾個字幕組在 Mikan 上的整季清單讀不到。 - 缺集:一個 RSS Series 已入庫的集數中間少了幾集,而且後面那一集入庫已滿 7 天(給字幕組晚發),列出缺哪幾集、
連到作品頁搜缺的集。別的字幕組或手動下載補上的不算缺,正在下載或等審核的也不算。 - 同一集多份:同一個字幕組的兩個發佈寫的是不同集,卻都入庫成同一集(多半是集號換算或 offset 錯了),列出
撞在一起的發佈名、連到作品頁修正。同一集的 v2、简繁兩版、不同解析度、季末合集與別的字幕組照舊並存,不算。 - API:
GET /api/rss/feeds的last_error拆成poll_error與backfill_error。
這一版有資料庫 migration(c5f2a8e4d917):Feed 原本的錯誤搬到輪詢那一欄,補漏那一欄從空的開始;降版把兩欄
併回一欄。
- 一直失敗的 Feed:Feed 的輪詢或每日補漏一直失敗超過一天,各開一件(「輪詢一直失敗」「補漏一直失敗」),
- 週報(M4 票 131):每週一 05:00(容器的時區)每日巡檢跑完之後,Berth 寫一份上一週的週報:入庫了哪幾部
(季集範圍)、修了什麼(核准的計劃、rematch 的檔案、你們解決的與系統收掉的 Issue)、還有什麼等你處理(那一刻的
待審核、Issue、待綁定的 RSS Series,巡檢開的另外點出來)。頁首多一個「週報」(只有管理員),看最新一週與歷來每一週;
週報寫下來就不再變,之後刪掉的下載不會讓舊週報少一行。管理員在設定 → 通知多一個「週報」勾選,預設勾著,
收到一則 Discord 摘要、連到那一週。週一那一刻 Berth 沒在跑的話,下一次啟動補上,同一週不會有兩份;新裝的 Berth
從下一個週一起。API:GET /api/weekly、GET /api/weekly/{id}。
這一版有資料庫 migration(a8c3f6e1d254):新的週報表;既有的管理員補上「週報」訂閱;降版拿掉兩者。
Fixed
- 套用到 RSS Series 時其中一筆剛好被別處處理掉,不再整個失敗(M4 票 133):在審核頁改季集並套用到整個 RSS Series,
另一個分頁同時核准或刪掉了其中一筆停著的下載時,那一筆跳過、其餘照常重算;原本整個套用報錯。 - 忽略的 Jellyfin 認錯不再每天重開(M4 票 122):按「忽略」之後,每日對帳又比到同樣的不一致不會再開一筆;
Jellyfin 認對過一輪之後又認錯才重開,問不到 Jellyfin 的那一輪不算認對。qBittorrent 上 Berth 不認得的 torrent
同樣:按「忽略」之後原本 5 秒內就重開,現在它還掛在 qBittorrent 上就不再問,移除之後又出現才重開。 - 作品頁跟得上背景入庫(M4 票 132):作品頁開著時,RSS 在背景替這部作品送出第一筆下載並入庫,
原本季表停在舊的件數、也不長出「下載」段,要重新整理才看得到;現在幾秒內自己更新。 - 英文介面的 Route 頁標題與分頁同名(M4 票 132):設定的分頁叫 Library paths,點進去與精靈頁 3 的標題
卻是 Routes;兩個標題改成 Library paths(中文本來就都叫「媒體庫路徑」)。 - 通知的測試不再測到舊的 Discord ID(M4 票 132):設定 → 通知改了自己的 Discord ID 還沒儲存時,「送一則測試訊息給我」
先說「先儲存你改過的 Discord ID,再測試」,不再拿存著的舊 ID 去送、說已送出。「通知裡的連結」改過欄位後說明不再說那是預填的;
清空並儲存時說「已清掉:通知不附連結」。 - 作品頁的搜尋區塊(M4 票 132):搜尋鍵停用時,原因就在鍵的正下方(手機上原本要往下捲過名字與清單才看得到);
打了關鍵字時名字與季的選項停用並說為什麼(之前按了也不影響要問的那一個);換了名字之後查詢數的變化念得出來;
從季表按「搜這部作品缺的集」時,預覽回來之前不再列出作品名那幾個查詢。 - 完成頁的服務連結(M4 票 132):點得到的高度至少 24px,並念得出會開新分頁。
v0.2.9
從 0.2.8 升級:docker compose pull && docker compose up -d 就好;docker-compose.yml 與 .env 沒有變。
image 是 ghcr.io/1morr/berth:0.2.9,同時是 :0.2 與 :latest。下面改到的 API 只有 Berth 自己的畫面在用,升級之後
重新整理一次頁面即可。這一版有資料庫 migration(c1d7e4a9b302,Berth 啟動時自動套用一次):之前因為請求預算用完而停在待綁定、
等下一輪再認的 RSS Series,改成下一輪就重認,那一次不算進重認的次數上限。
Added
- 每個 Feed 可以設輪詢間隔(M4 票 109):/rss 的新增表單多一格「輪詢間隔」(15 分、30 分、1、3、6、12、24 小時,
預設 15 分鐘),Feed 列上「改輪詢間隔」就地改;改了不會馬上輪詢,下一輪是上次輪詢再過新的間隔。最短 15 分鐘,讀得
太勤來源站會封鎖 IP。從作品頁訂閱建的 Feed 是 15 分鐘,之後在 /rss 改。API:POST /api/rss/feeds多選填的
interval_sec,新的PUT /api/rss/feeds/{id}/interval,不在檔位裡的回 422interval_unsupported。 - 作品頁的 Mikan 可以「只下載現有的」(M4 票 112):選好字幕組之後,「訂閱並送出」旁邊多一顆「只下載現有的」,
就地列出這個字幕組在 Mikan 上現有的,勾幾筆送出——不建 Feed,合集也勾得了,之後出的新集不會自動下載。給已經完結、
字幕組只出了合集的作品。訂閱之後有被排除條件擋下的,那一句會說出幾筆、為什麼(例如「1 筆是合集、區間或季包,沒有
自動下載」),並在下面給「只下載現有的」。API:GET /api/rss/mikan/bangumi/{id}的每個字幕組多feed_url,
POST /api/rss/subscriptions/mikan的回應多excluded。 - 被排除的 Feed Item 可以「仍然下載」(M4 票 111):/rss 的「最近的 Feed Item」與 RSS Series 展開的清單裡,被排除
的那一筆(例如被「不自動下載合集」擋下的[01-12 合集])多一顆「仍然下載」,按了當場送出,那一列換成送出去的
下載;同一個 torrent 已經送過就標成重複。RSS Series 還沒綁定、Feed 還在等第一輪決定時按鈕停用並說原因;送不出去
(Route 紅燈、磁碟門檻)時那一筆留在排除、說出原因。一次一筆,改規則照舊不會把之前擋下的整批放回來。API:
POST /api/rss/items/{id}/release,GET /api/rss/items每一筆多release_blocked。 - 加 Feed 時就能設排除條件(M4 票 110):新增表單多一格「排除條件」,與 Feed 卡片上的一樣(建議項、規則格式說明),
跟著「加入」一起存。Mikan 的 Feed 不先預覽、加入後半分鐘內就自動綁定送單,加完再到卡片上設的擋不到已經送出的——要排除
的現在就加。API:POST /api/rss/feeds多選填的exclusions,寫壞的回 422rule_invalid、Feed 不加。
Changed
-
精靈頁 4 套件內 Prowlarr:還沒加站時只有一顆黃色主鍵(M4 票 119):「測試推薦站」還在時,介面登入的送出鍵
是次要樣式,加了站之後才換成主鍵;原本兩顆黃鍵並排,看不出先做哪一件。 -
精靈的既有分支每件事只說一次(M4 票 104):頁 2 選了自己的 qBittorrent、做完之後,「Berth 不改你的設定」只在
卡片上說一次(原本五處),探針的說明移到測試鍵旁,「torrent 加入時執行外部程式」會觸發那一句獨立一行、做完之後
也留在測試結果底下;頁 1、頁 4 同一個做法。頁 4 還沒選時的標題改成「先選 Prowlarr 是哪一台」;頁 6 的「已繫上」
與頁 3 一樣不塗漆;頁 2 套件內做完不再多一則完成提示;沿用 Jellyfin 帳密設的介面登入重新整理之後照樣說「已沿用」;
頁 4 的剖面多一列「介面登入」,與頁 2 同一套。 -
作品頁照作品名搜,三個字以上的中文名也算對得上名字(M4 票 83c):《無間道》搜到只寫中文名的
無間道 III [国语中字]、[无间道I]…不再歸「名字對不上」、預設就列出來。一、兩個字的中文名照舊不拿來比——
實測《英雄》會把英雄教室、我的英雄学院都判成符合;這類作品改用自己打關鍵字。 -
完結的 RSS Series 不再每天補漏(M4 票 108):綁好的 Mikan 字幕組每天會再讀一次整季清單、補上 Feed 輪詢沒接到的
集數(例如 Berth 停機的期間);之前完結了也照讀、永遠不停,現在完結之後再補最後一次就停(Berth 停機期間剛好播完時,被捲掉的最後幾集靠這一次補回,M4 票 116),有新的一筆出現時恢復。/rss 的 RSS Series
段落多一行說明,Mikan 的每一列說「上次補漏:〈多久前〉」「尚未補漏」或「已完結,不再補漏」;訂閱與綁定確認的說法跟著
改成同一句。API:GET /api/rss/series每一筆多backfilled_at。 -
/rss 的排除條件分清全域與內建(M4 票 113):全域那一段改叫「全域排除條件」;「不自動下載合集」自成一組
「內建判斷」,標明看的是解析結果、不是關鍵字,與下面的「標題規則」分開;建議那一列標成「建議關鍵字」。Feed 與
RSS Series 那兩層(以及新增 Feed 的表單)多一行說出全域的合集設定目前是什麼,連回全域那一段——合集照舊只在全域設。
沒有規則時改說「沒有標題規則。」。 -
Feed 與 RSS Series 那一層的展開鍵改叫「標題規則(N 條)」(M4 票 117):N 只算這一層的標題規則,原本的
「排除條件(0 條)」在全域擋著合集時讀起來像什麼都不擋。三層(含全域)的加入欄改叫「加一條標題規則」。
Removed
- 站點請求預算(M4 票 107,推翻 M3 票 20 與 M4 票 77):RSS 輪詢、每日補漏、搜尋與
/rss上人按的讀取不再共用
「每站每小時 60 個」。這個數字不是量出來的,實際擋到的只有 Berth 自己——例如訂閱 MyBangumi 之後 Mikan 的額度被輪詢
用完,搜尋就跳過 Mikan。搜尋經過 Prowlarr,各站要不要限次數請在 Prowlarr 索引站的 Query Limit 設定;站點真的回
429 / 5xx 時照舊下一輪再試。健康頁拿掉「請求預算」那一張卡,搜尋區塊拿掉「這次沒問」「等請求預算」與下一批的等待時間。
API(只有 Berth 自己的畫面在用,升級之後重新整理一次頁面即可):拿掉GET /api/health/budget;GET /api/search
拿掉skipped、retry_at與batch.next_at,problem不再有budget_exhausted;GET /api/search/queries拿掉
budget;/api/rss的讀取不再回 429budget_exhausted;RSS Series 的綁定理由不再有lookup_deferred。
Fixed
- 精靈頁 2 的介面登入不再預填 qBittorrent 不收的帳號(M4 票 118):擁有者的名字太短或有冒號時,帳號欄空著讓你
自己打,不是等送出才報錯;合規則的照舊預填擁有者。英文的「已沿用」改成完成式Set to your Jellyfin login (…)。 - 新增 Feed 送出中規則欄鎖住(M4 票 117):原本只鎖按鈕,送出中多打的字在成功之後被清掉;改了就存的那三層
在存檔途中也一樣鎖住。 - 搜尋時每個查詢都逾時,不再整頁說「連不上索引站」(M4 票 114,票 107 帶進來的退化):Prowlarr 冷啟動或背後的站
慢、每個查詢都超過 120 秒時,畫面照舊是逐查詢的失敗列,說得出是哪一個查詢沒答上來;真的連不上(拒絕連線、主機
不在)照舊是「連不上」。「連不上索引站」那一句補上「或這一次答不出來」。 - 有 RSS 綁著的 Route 刪不掉了(M4 票 115):Feed 的自動綁定送進它、或有 RSS Series 綁著它的 Route,刪除會被拒,
說出「這條 Route 還有 N 個 RSS Feed、M 個 RSS Series」,出路照舊是停用;之前這樣的 Route 刪得掉,Feed 與 Series 會
無聲失去 Route,之後每一集都送不出。Route 設定頁的那一列也多說 RSS 的數量(是 0 不說)。之前已經失去 Route 的 RSS
Series,「仍然下載」改成停用並說「沒有 Route」,不再每按一次都失敗;到 /rss 重選 Route 即可。API:GET /api/routes
每一列與DELETE /api/routes/{id}、DELETE /api/setup/routes/{id}的 409route_in_use多rss_feeds、
rss_series;POST /api/rss/items/{id}/release多一種 422route_missing。
v0.2.8
從 0.2.7 升級:docker compose pull && docker compose up -d 就好;docker-compose.yml 與 .env 沒有變。
image 是 ghcr.io/1morr/berth:0.2.8,同時是 :0.2 與 :latest。這一版有資料庫 migration(bec5947663f5,
Berth 啟動時自動套用一次):每個 Feed 從一條 Route 改成劇集、電影各一條,能推的自動填好;推不出來的 Feed 列上標
「要選 Route」,按「改 Route」選一次即可(見下面〈Changed〉票 105)。停在審核、季號明寫而集號累加的計劃不會自動重算,
在審核頁按「重新規劃」。下面改到的 API 只有 Berth 自己的畫面在用,升級之後重新整理一次頁面即可。
Changed
- 作品頁自己打關鍵字搜尋,也分得出哪些是你要的(M4 票 83b):結果分「對得上」(發佈名含你打的字,或含這部作品的某個名字,
例如打「無間道」時簡體的「无间道」與英文名也算)與「對不上」,預設只列對得上的——The Pirate Bay 對搜不到的字回的熱門清單
不再壓在真正的結果上面。對不上的照樣送來,按按鈕就看得到、送得了單。API:GET /api/search的verdict多typed_match、
typed_miss,拿掉unjudged(只有 Berth 自己的畫面在用,升級之後重新整理一次頁面即可)。 - 作品頁搜尋區塊排整齊了(M4 票 84b):「名字」「季」的標籤移到 chip 上方,chip 與關鍵字框對齊;按下去之前的預覽變成
「會問 · N 個查詢」一個欄位,不再把開著的名字再印一次;會佔幾格請求預算與要等多久併成一句。 - Feed 的 Route 必填,劇集、電影各一條(M4 票 105):加 Feed 時「劇集送進」「電影送進」那一種有 Route 就要選、只有一條時
預填,拿掉「不指定」——Route 不只一條時認出來的作品直接自動綁進 Feed 說的那一條,不再停在待綁定等你多按一次;Mikan 的劇場版
照「電影送進」那一格。升級時 migration 能推就推:某一種的啟用中 Route 只有一條就填它;推不出來的那一格在 Feed 列上標
「要選 Route」,按「改 Route」選好之後,那個 Feed 長出、因為 Route 不只一條而停在待綁定的作品當場綁上並送單。從作品頁訂閱建的
搜尋 Feed 只問那部作品那一種,另一種不標也不要求。手動綁定的
「入庫到」也先預選長出它的 Feed 那一種的 Route。API:POST /api/rss/feeds的route換成tv_route、movie_route
(缺必填的是 422route_required,類型不符是 422route_kind_mismatch);新增PUT /api/rss/feeds/{id}/routes;
FeedOut的route_id換成tv_route_id、movie_route_id,多route_kinds、awaiting_route;SeriesOut多feed_routes
(只有 Berth 自己的畫面在用,升級之後重新整理一次頁面即可)。 - 季號明寫、集號從第一季一路數下來的發佈,換算成那一季的集(票 106):ANi 的
黑色五葉草 Season 2 - 171(TMDB 第 1 季
170 集)現在計劃成 S02E01、medium,理由多一句「累加換算」;原本照字面讀成 TMDB 沒有的 S02E171、停在審核,直接核准會寫出
Jellyfin 對不上的集。換算落在別季、或那一季本來就有那一集時照舊。已經停在審核的計劃不會自動重算:在審核頁按「重新規劃」
就會套用新規則。 - 審核頁的「拒絕」改叫「重新規劃」(票 106):它做的事與下載詳情頁的「重新規劃」相同——照目前的 TMDB 資料與設定重算、
丟掉逐列改過的、檔案不動;確認句把這三件說清楚。時間線與計劃狀態跟著改說法。API 不變(仍是POST /api/plans/{id}/reject)。
Added
- 設定頁底部顯示 Berth 版本(票 106):每一個分頁都看得到「Berth 0.2.8」這一行,不必再自己打
/api/health。
v0.2.7
從 0.2.6 升級:docker compose pull && docker compose up -d 就好;docker-compose.yml 與 .env 沒有變,也沒有
資料庫 migration。image 是 ghcr.io/1morr/berth:0.2.7,同時是 :0.2 與 :latest。下面改到的 API(多一個欄位)
只有 Berth 自己的畫面在用,升級之後重新整理一次頁面即可。
Changed
- 換 qBittorrent 時說出還沒下完的那幾筆(M4 票 102):它們的 torrent 留在原本那一台,換台之後新那一台上找不到,
會各變成一件待處理「torrent 已經不在 qBittorrent 上」,在那裡「重新送單」就送到新那一台。換台框現在照實說,並列出是哪幾筆
(連不到原本那一台也列得出)。API:GET /api/setup/services/{kind}/leftovers多in_flight。 - 設定 → qBittorrent / Prowlarr 的「改位址」換到另一台既有,也走換台(M4 票 102):打了不同的位址,表單裡就地出現換台說明、
Berth 在原本那一台留下的東西(qBittorrent 多一個「一併移除空的 berth- 分類」勾選),「測試連線」就是確認。只改帳密、打回原本那個位址都不是換台。 - 刪除的「可空出空間」改量實際佔用(M4 票 102):還在下載的檔是 sparse 檔,原本照表觀大小算會多報(例如表觀 970 MB、
實際約 192 MB)。現在量的是磁碟上真的佔的區塊,已下完的檔也以區塊取整,時間線上的「空出了多少」同一條規則。 - 精靈的文案收尾(M4 票 103):套件內 qBittorrent 與 Prowlarr 自己的登入都叫「介面登入」(原本 qBittorrent 那一頁叫
「WebUI 登入」);頁 1、頁 2「既有」卡片少了約三分之一的字,會動到什麼、不動什麼照樣說;選了既有之後,停掉套件內那一台的
COMPOSE_PROFILES與docker compose stop只在完成頁「閒著的套件內容器」照整份選擇給一次,選的那一頁只指過去
(原本頁 1、2、4 各給一次)。 - 作品頁不再說「Berth 下一次確認在 4 秒前」(M4 票 103):排定的時間過了、那一輪還沒跑到時說「Berth 即將再確認」。
Fixed
- Prowlarr 與 qBittorrent 的連結落在對的頁面(M4 票 102):「開啟 Prowlarr 的索引站頁」連到它的首頁(就是索引站清單)、
介面登入沒設成的補法連到/settings/general——原本的/#/settings/general落在首頁。qBittorrent 沒有通往「選項」的網址,
補法改成給 WebUI 本身,說在「工具 → 選項 → Web UI」。
v0.2.6
從 0.2.5 升級:docker compose pull && docker compose up -d 就好,.env 不用改,也沒有資料庫 migration。
image 是 ghcr.io/1morr/berth:0.2.6,同時是 :0.2 與 :latest。建議換成這一版附的 docker-compose.yml
(下載):它多把 .env 的
DATA_ROOT 傳給 Berth,既有服務沒掛 /data 時補法才印得出你的資料夾;不換也能跑,補法照舊寫 ${DATA_ROOT}。
下面〈Changed〉裡改到的 API 只有 Berth 自己的畫面在用,升級之後重新整理一次頁面即可。
從套件內 Prowlarr 移除站,現在只限 Berth 自己加的站;你自己加的站請在 Prowlarr 刪。
Added
- 可以不用 Prowlarr(M4 票 61,審計 E3):設定 → Prowlarr 頁尾多一區「不用 Prowlarr」,就地確認之後生效,
與精靈頁 4 的「之後再說」是同一個狀態、隨時改得回來。不用的時候健康頁 BTH 4 是「沒有使用」、不算阻擋,健康檢查也不再
連它;作品頁的搜尋區說「沒有接索引站」,給「前往設定:Prowlarr」與「到 RSS 訂閱」兩條路;設定 → Prowlarr 收成一塊
說明加「改回使用 Prowlarr」。Berth 不動 Prowlarr 上的站與它的容器。 - 既有 Jellyfin 缺某種媒體庫時,在精靈頁 3 勾一下就建(M4 票 64,審計 E1):例如只有劇集、你要下載電影。
勾選表最後一張「在這台 Jellyfin 新建一個媒體庫」,勾了才展開類型(預設那台還沒有的那一種)、名稱(預填,可改)與
資料夾(/data/library/<名稱>),按「建立並檢查」時才建;不勾就什麼都不建。新的媒體庫在你的伺服器上,所有使用者
都看得到,之後改名或刪除在 Jellyfin 做;刪掉它不動你原有的媒體庫。名稱與已有的撞名、或資料夾已經是別的媒體庫的,
按之前就說。API:POST /api/setup/jellyfin/libraries。
Changed
-
精靈各頁說法一致(M4 票 68,審計 P2-1–P2-5、P2-11、P2-12、P2-16、P2-20、P2-21):頁 2 與頁 4 選了套件內、
請求還在路上時都說「接法」,頁 4 不再問「先選」;Berth 設的介面登入在頁 2、頁 4 都說「已完成」(加站之後不再變成
「已經是這樣」),自動沿用頁 1 那一組時前進鍵的位置不再寫「還差 設定 Prowlarr 介面登入」。頁 1 登入被拒(帳密不對、
不是管理員)標在帳密兩格上;密碼空著先說「密碼沒填」、只標密碼那一格;右欄只列會動的:現在建 API key、媒體庫到頁 3 按下時才動。選了既有 Jellyfin
之後,「停掉套件內那一台」那兩行在擁有者成立之後照樣看得到。完成頁:沿用 Jellyfin 帳密的那一台說「密碼與 Jellyfin
同一組」,上一次留下的登入說忘了去「設定 → 該服務」的「介面登入」換一組,選了既有而套件內那一台還在跑時再提醒一次
停掉它。重裝時頁 3 說為什麼沒有自己開跑、要按「建立並檢查」。作品頁搜尋說「通常要幾秒到一分鐘」。健康頁的「最後成功」
在瀏覽器時鐘較慢時不再說成未來。GET /api/setup/qbittorrent/diff與GET /api/setup/indexers等回應多一欄
web_ui_login_reuses_owner。 -
頁 4 推薦站不在 Prowlarr 裡時說出原因(M4 票 73,Linux 實跑 L4):Prowlarr 連不上
indexers.prowlarr.com
(防火牆、DNS 過濾、代理、地區封鎖)時只剩磁碟上的幾個站定義,推薦的一個都不在,原本「測試推薦站,加入通過的」
無聲無息地不見。現在那裡說明原因、給「重新讀取」(網路通了就讀得到,不必重啟 Prowlarr)與 Prowlarr 事件頁的連結,
「之後再說」與「進階」照舊;只缺幾站時照常測找得到的,結果多一行缺的是哪幾站。
GET /api/setup/indexers等回應多一欄unlisted。 -
套件內 Prowlarr 的「移除」只給 Berth 加的站(M4 票 66,審計 P1-10):之前 Berth 加得回去的公開站都按得到
移除,連你自己在 Prowlarr 加的也是。現在只有 Berth 加的那幾站有「移除」,其他的說「Berth 沒有加這一站的紀錄」、
要移除請到 Prowlarr。0.2.0 之前 Berth 加的站沒有紀錄,同樣不能從 Berth 移除。
DELETE /api/setup/indexers/{id}對它們回 422。 -
新的使用指南〈Uninstalling Berth〉(M4 票 66,審計 P1-11):不用 Berth 時 Jellyfin、qBittorrent、Prowlarr
各要手動清什麼(API key、裝置、Berth 路徑、berth-*分類與 tagberth的 torrent、Berth 加的站),以及硬鏈接
要兩邊都刪才會釋放空間。精靈指南的〈What Berth changes in your services〉補上執行期會做的事。 -
既有服務沒掛
/data時,補法直接印出你的資料夾(M4 票 63,審計 P1-6):原本片段是${DATA_ROOT}:/data,
要自己去 Berth 的.env找值。部署的 compose 現在把DATA_ROOT傳給 Berth(HOST_DATA_ROOT),compose、
docker run兩種片段與新加的 Unraid 模板欄位(Container Path、Host Path)都帶著它;Windows 路徑寫成C:/…,
相對路徑(預設的./data)會說它相對於 Berth 的 docker-compose.yml、要換成絕對路徑。沿用舊的 compose 檔時
補法照舊是${DATA_ROOT}:換成這一版附的docker-compose.yml才有。 -
既有 Jellyfin 沒掛
/data在頁 1 就說(M4 票 63,審計 C7):成為擁有者之後 Berth 立刻問它看不看得到/data,
不再等到頁 3。頁 3 兩個以上的媒體庫加不上 Berth 路徑時,合併成一則、列出是哪幾個,補法只給一次。 -
localhost 的說明只說一次、技術細節的位址帶上
http://(M4 票 63,審計 P2-4、P2-6)。 -
既有 Jellyfin 的電影與劇集媒體庫在精靈頁 3 預設勾好(M4 票 64,審計 C2):寫入目標照舊預設新的 Berth 路徑,
不要的取消勾選。GET /api/setup/routes的每個媒體庫多一格preselected。 -
精靈再省幾按(M4 票 67,審計 C1、C3、C4):既有 Jellyfin 的位址與管理員帳密同一張表單,一顆「連線並登入」
(原本先「測試連線」、通過之後才長出登入表單再按「登入」);位址錯標在位址欄、帳密錯標在帳密兩格,還沒跑過初始設定的
那一台帳密留空,連上之後換成建立管理員的表單。既有 Prowlarr 一站都沒有時也有「測試推薦站,加入通過的」,那一句列出
會測哪幾站、加進哪一台,逐站挑選收進「進階」。TMDB 貼上 key 直接按「前往下一個泊位」就先測、過了才走,「測試 TMDB」照留。
API:新增POST /api/setup/owner/existing;POST /api/setup/indexers/recommended也收既有的 Prowlarr(之前 422)。 -
換 qBittorrent 時說清楚留下了什麼,移除空分類改成跟著換台走(M4 票 65,審計 P1-4、P2-9):換台框說分類裡的
torrent 會留在原本那一台繼續做種、換台之後 Berth 不再追蹤(已入庫的檔案不受影響);從套件內那一台換走時,多列它預置的
免密白名單與在 WebUI 怎麼關。「移除空的 berth- 分類」從按下就生效的按鈕改成換台框裡的勾選(預設不勾),確認換台才移除,
取消就什麼都不動;勾了而原本那一台沒答上來時整個換台不做,取消勾選再換一次就只換台。換台之後,送進原本那一台、已入庫的
下載在詳情頁說「做種的 torrent 在原本那一台」。API:POST /api/setup/services/qbittorrent多一格
remove_empty_categories(失敗是 502categories_not_removed)、JobOut多一格previous_client;
刪掉DELETE /api/setup/services/qbittorrent/leftovers/categories。 -
審核頁每一段的標題改用全站同一種區塊標題(M4 票 99):計數從標題裡移到標題旁,螢幕閱讀器念段落名時不再
連著件數(件數照樣念得到,帶單位);「全部確認」仍在標題列右側。 -
Jellyfin 掃描收斂成只掃 Berth 寫入的那個媒體庫(M4 票 62,審計 E2):反查一直找不到、或在待處理按「重新掃描
媒體庫」時,之前一律跑 Jellyfin 整台的「掃描媒體庫」排程任務,會掃到你既有 Jellyfin 的每一個媒體庫;現在只刷新
那條 Route 的媒體庫(同 Jellyfin 控制台媒體庫卡片上的「掃描媒體庫」)。例外是 Jellyfin 還沒在 Berth 的路徑底下
列出過任何東西時(空的媒體庫第一次入庫、既有媒體庫剛加上 Berth 的路徑):Jellyfin 只有整台掃描建得出那個路徑,
所以照舊掃整台;精靈「既有」Jellyfin 的說明與待處理那一件都寫明了。 -
作品頁不再說「Jellyfin 還在掃描」(M4 票 62):入庫當下 Berth 只是通知 Jellyfin,那時它還沒在掃;改說
「已通知 Jellyfin,等它收錄」,媒體庫的卡片說「等 Jellyfin 收錄」。 -
API 破壞性變更:
POST /api/setup/qbittorrent/apply對既有的 qBittorrent 一律回 422(M4 票 101),
與PUT /api/setup/qbittorrent/login一致。之前不帶登入時照樣再連一次、記一條沒有人讀的skipped;畫面自
M4 票 38 起就不對既有那一台呼叫它,精靈與設定頁不受影響。既有那一台的頁 2 照舊是連線測試通過就做完。
Fixed
-
Prowlarr 回來之後要等滿 5 分鐘健康頁才變綠(M4 票 61,審計 P1-2):健康檢查連不上 Prowlarr 時,之後每 30 秒
左右只重測它一次,不必等下一整輪。qBittorrent 與 Jellyfin 照舊每 5 分鐘一輪。 -
設定頁同時顯示舊的綠色「連線測試通過」與紅色的健康卡(M4 票 61,審計 S4):連線那一列帶上測試時間;測試之後的
健康檢查連不上時,它改說「過時」並給「重新測試」,不再畫舊的「連上了」。 -
作品頁搜尋失敗時露出原始字串(M4 票 61,審計 P2-7):例如
GET /api/v1/indexer: host does not resolve;現在只說
人話,原文收進「技術細節」。 -
名稱不同、算出同一個資料夾的兩個媒體庫會共用一條 Berth 路徑(M4 票 64,審計 P2-15):例如「TV Shows」與
「TV-Shows」都是/data/library/tv-shows,之前精靈會把它加到兩個媒體庫上,兩邊掃到同一批檔案。現在後加的那個
不加、說是被哪個媒體庫用了(path_taken),勾選表上那一條也選不了。 -
空的媒體庫第一次入庫,Jellyfin 認到要等 2.5 分鐘以上(M4 票 62,審計 S1、S3;Unraid 上 12 分半):Berth
要等第二次反查沒找到才請 Jellyfin 掃,請完又把下一次反查排到 10 分鐘後。現在第一次反查(入庫後 30 秒)沒找到就請它掃,
下一次反查在那之後 1 分鐘;反查的第二次間隔也由 2 分鐘改成 1 分鐘。 -
最後三處也照原因說,不再一律怪外部服務(M4 票 99):移除 Prowlarr 的站沒成功時,之前一律說「Prowlarr 可能正在重啟」,
媒體庫路徑那一頁的重新讀取沒成時一律說「讀不到 Jellyfin 現在的媒體庫」,媒體庫的類型、年份選項讀不到時不說原因。
現在 Prowlarr、Jellyfin 真的沒答上來(或 Prowlarr 拒絕了)才怪它們,原文附上;看不到這個媒體庫時照實說;其餘照請求為什麼沒成說。
API:DELETE /api/setup/indexers/{id}在 Prowlarr 沒答上來或拒絕時回 502 帶原文,之前是不帶原因的 500。
v0.2.5
從 0.2.4 升級:docker compose pull && docker compose up -d 就好,.env 不用改;docker-compose.yml 只改了開頭的
註解,不換也可以。image 是 ghcr.io/1morr/berth:0.2.5,同時是 :0.2 與 :latest。這一版有資料庫 migration
(a6c3e9f2b815,Berth 啟動時自動套用一次),不必做任何事;既有的 Job、檔案、計劃與帳本都留著。下面〈Removed〉的
API 欄位與 GET /api/settings/services 只有 Berth 自己的畫面在用,升級之後重新整理一次頁面即可。從這一版起,
部署檔附在每一版的 Release 上,README 的連結固定指向最新一版。
Changed
- 部署的兩個檔改成 Release 的附件,README 的連結不再帶版號(M4 票 97):每一版的 Release 附上
docker-compose.yml與example.env(就是 repo 的deploy/.env.example;GitHub 會改掉開頭是.的附件名),
README 與 Unraid 那一段連到https://github.com/1morr/Berth/releases/latest/download/docker-compose.yml與
.../example.env,永遠是最新正式版的檔案,預發佈不算。0.2.4 已補上這兩個附件。要固定某一版,把latest/download
換成download/v<版號>(docs/guide/upgrading.md)。已經在跑的不用改任何東西。
Removed
- API 回應裡畫面沒讀的欄位(M4 票 94):
GET /api/jobs與各支回 Job 的端點拿掉trigger_ref、route_slug、
user_id、completed_at、imported_at;GET /api/jobs/{hash}/deletion拿掉link_bytes、source_bytes
(可釋放的量照舊在reclaimable);GET /api/health/budget拿掉window_seconds、每站的frees_at、延後工作的
since;RSS 的 Item 拿掉seen_at、GET /api/rss/mikan/bangumi/{id}拿掉premiere;審核佇列對不到的那一列拿掉
file_kind。資料庫不動。自己寫腳本讀這幾欄的要改;content_path與計劃的engine/engine_version留著。 - 四個沒有人讀的資料庫欄位(M4 票 95):
jobs.last_seen_in_client_at、job_files.updated_at、
ledger.source_inode、ledger.link_mode。畫面與 API 都沒有用過它們(API 回應本來就不帶)。
資料庫 migrationa6c3e9f2b815:原生刪欄,不重建表。降版把欄位加回來:來源 inode 補成目標 inode
(硬鏈接兩端相同)、鏈接方式補hardlink、檔案的更新時間補成 Job 加入的時間、最後在客戶端看到的時間留空。 GET /api/settings/services(M4 票 87):回的與GET /api/health/detail一字不差,設定頁的健康卡改讀後者。
之前兩頁各有一份快取,在健康頁按「立即重測」之後,設定頁的卡片要等它自己重抓才會是新的;現在兩頁讀同一份。
POST /api/settings/services/{kind}/test照舊。GET /api/setup/jellyfin等精靈 Jellyfin 端點回應裡的libraries(M4 票 91):畫面沒有讀它,頁 3 的媒體庫清單
一直讀GET /api/setup/routes的libraries,那一份照舊(同樣有uses_tvdb、berth_path、has_berth_path)。GET /api/setup/status、GET /api/setup/routes等精靈端點回應裡的completed(M4 票 93):畫面沒有讀它,
精靈跑完了沒一直看GET /api/health的setup_completed,那一份照舊。POST /api/setup/complete與
/api/setup/routes系列回同樣的形狀,也一起少了這個欄位。- Berth 不再讀環境變數
DATA_ROOT(M4 票 93):它從來沒有作用——incomplete、complete 與媒體庫的路徑來自資料庫的
路徑設定,image 的ENV DATA_ROOT=/data一併拿掉。.env與docker-compose.yml不用改:DATA_ROOT還是 compose
把宿主目錄掛到容器/data的那個變數。本機開發的.env.example不再列它。
Fixed
- 刪除還在下載的單、勾了「刪除下載目錄裡的檔案」,incomplete 裡下到一半的那一包也刪掉(M4 票 74):之前只刪 complete
底下的,/data/torrent/incomplete/<分類>/裡那一包留著、沒有任何東西管它,回應與時間線還說空出 0。現在照 qBittorrent
報的內容路徑逐檔刪(只刪那一個 torrent 的;從沒報過內容路徑的不猜),刪除框的「會空出多少」也算進它——沒有媒體庫鏈接時
只勾刪檔就說得出數字。 - RSS 綁定框與一次性連結的搜尋框,預填的作品名改由 Berth 從發佈名讀(M4 票 88):與自動綁定拿去搜 TMDB 的
是同一個讀法——季名拿掉(Re:从零开始的异世界生活 第四季預填Re:从零开始的异世界生活,之前要自己刪「第四季」)、
英文或羅馬字那一段優先;組名後面整格方括號就是標題的發佈名([千夏字幕組][中文名_Romaji][第12話])預填那一格,
之前退回整串原文。API:GET /api/rss/series的每一列與POST /api/rss/oneshot的每一筆多search_term。 - 待處理與審核頁不再把後端出錯、登入失效說成「Berth 的 API 沒回應」(M4 票 89):處理一件、立刻對帳、重建帳本、
核准或拒絕計劃、確認或撤銷入庫、改季集(作品頁的修正檔案也是同一個表單)、重複版本的三顆,以及兩頁與媒體庫審核篩選的
清單讀不到時,後端沒說理由就照請求為什麼沒成說:500 說後端出錯了、看 berth 容器的 log;401 說登入已失效;真的送不到
才說後端可能沒在跑。之前這幾種一律說 Berth 自己的 API 沒有回應。審核頁讀不到某一份計劃、待處理頁選作品的搜尋沒成時,
之前只說讀不到或什麼都不說,現在也說原因。 - 其餘每一頁也不再把後端出錯、登入失效說成「API 沒回應」或「後端可能沒在跑」(M4 票 90):下載(列表、詳情、
計劃與時間線、重新規劃、重試、重新入庫、刪除與它的空間估算)、作品頁(讀不到作品、下載與檔案清單、觀看區的集、搜尋、
送單、RSS 訂閱、標為已看)、探索與媒體庫、RSS 頁(各段清單、加 Feed、輪詢與移除、排除條件、綁定與一次性連結)、
健康頁、設定頁(Jellyfin、qBittorrent、Prowlarr、TMDB、媒體庫路徑的讀取、儲存、檢查、新增、停用與刪除)與設定精靈
(各頁讀不到狀態、清單存不下來、測試與試搜沒走完、完成寫不進去):說得出是什麼沒做成,後半句照請求為什麼沒成說,
與上一條同一套。幾處原本怪錯對象的也一併改:RSS 綁定讀不到作品詳情不再說「TMDB 可能連不上」、Prowlarr 那一頁讀不到
不再說「連不上套件內的 Prowlarr」(這兩種外部服務問不到時,Berth 本來就會回一句它們自己的原因)。RSS 綁定與一次性連結
的 TMDB 搜尋沒成時,之前什麼都不說。精靈頁 1 重新登入換 key 時,Jellyfin 沒給 key 改說那一步為什麼沒成,不再說
「請求沒跑完」。 - 巢狀的 Route,媒體庫裡的檔案歸到較深的那一條(M4 票 87):較淺那一條的目標路徑寫得不正規(例如結尾多打了幾個
/)、字串反而比較長時,媒體庫、反查與刪除 Route 前的引用數會把檔案算給較淺的那一條。現在照路徑段數比,
與認領同一支判斷。