Правки: дата на стр. загрузки, ссылка TVDB по типу, заголовки в Telegram

- Веб-UI: под шапкой страницы загрузки — дата добавления и относительная
  давность («N дней назад»), как в карточках списка.
- Баг: ссылка-dereferrer TVDB для фильма вела на /series/; теперь строится
  по типу запроса (/movie/ либо /series/). Тест + правка спеки metadata-match.
- Telegram: заголовки уведомлений (готово/ошибка/рассинхрон) берутся из
  display_name — консистентно с веб-UI; сезон подтягивается автоматически.
- Telegram: в сообщениях об ошибке — и заголовок, и #id загрузки (ULID)
  для быстрого поиска по логам.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
av
2026-07-04 11:50:04 +03:00
co-authored by Claude Opus 4.8
parent 5d5456fa68
commit 280204db18
8 changed files with 64 additions and 32 deletions
+8 -3
View File
@@ -108,7 +108,7 @@ const tid = "01arz3ndektsv4rrffq69g5fav"
func reviewData(state store.State) *worker.ReviewData {
s, e := 2, 1
return &worker.ReviewData{
Download: store.Download{ID: tid, State: state, Context: "Фарго, второй сезон", SourceRef: "magnet:?x"},
Download: store.Download{ID: tid, State: state, DisplayName: "Фарго (2015). Сезон 2", Context: "Фарго, второй сезон", SourceRef: "magnet:?x"},
Recognition: &store.Recognition{
Provider: store.NullString("tvdb"), ProviderID: store.NullString("269613"),
Reasons: `["неполный пак"]`,
@@ -255,7 +255,9 @@ func TestBot_NotifyDone(t *testing.T) {
rev.data = reviewData(store.StateDone)
b.Notify(context.Background(), tid, worker.EventDone)
if len(api.sent) != 1 || !strings.Contains(api.sent[0].text, "Готово") {
// Заголовок берётся из display_name (консистентно с веб-UI), а не из Plan.Title.
if len(api.sent) != 1 || !strings.Contains(api.sent[0].text, "Готово") ||
!strings.Contains(api.sent[0].text, "Фарго (2015). Сезон 2") {
t.Errorf("sent = %+v", api.sent)
}
}
@@ -265,7 +267,10 @@ func TestBot_NotifyFailed(t *testing.T) {
rev.data = reviewData(store.StateFailed)
b.Notify(context.Background(), tid, worker.EventFailed)
if len(api.sent) != 1 || !strings.Contains(api.sent[0].text, "не удалась") {
// В ошибке — и заголовок (display_name), и #id для поиска по логам.
if len(api.sent) != 1 || !strings.Contains(api.sent[0].text, "не удалась") ||
!strings.Contains(api.sent[0].text, "Фарго (2015). Сезон 2") ||
!strings.Contains(api.sent[0].text, "#"+tid) {
t.Errorf("sent = %+v", api.sent)
}
if !api.sent[0].hasKB { // кнопка повтора