Правки: дата на стр. загрузки, ссылка 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:
@@ -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 { // кнопка повтора
|
||||
|
||||
@@ -85,9 +85,19 @@ func (b *Bot) reviewKeyboard(rd *worker.ReviewData) *tgbotapi.InlineKeyboardMark
|
||||
return &kb
|
||||
}
|
||||
|
||||
// displayTitle — имя раздачи для уведомлений: имя раздачи (display_name, то,
|
||||
// что ушло в qBittorrent и показывается в веб-UI) → распознанное название.
|
||||
// Пусто, если ни того ни другого нет. Держим заголовки консистентными с UI.
|
||||
func displayTitle(rd *worker.ReviewData) string {
|
||||
if t := strings.TrimSpace(rd.Download.DisplayName); t != "" {
|
||||
return t
|
||||
}
|
||||
return rd.Plan.Title
|
||||
}
|
||||
|
||||
// renderDone — короткое сообщение о готовности.
|
||||
func (b *Bot) renderDone(rd *worker.ReviewData) string {
|
||||
title := rd.Plan.Title
|
||||
title := displayTitle(rd)
|
||||
if title == "" {
|
||||
title = "#" + rd.Download.ID
|
||||
}
|
||||
@@ -100,7 +110,7 @@ func (b *Bot) renderDone(rd *worker.ReviewData) string {
|
||||
|
||||
// renderDesync — уведомление о рассинхроне (источник/цель удалены вручную).
|
||||
func (b *Bot) renderDesync(rd *worker.ReviewData, event worker.NotifyEvent) string {
|
||||
title := rd.Plan.Title
|
||||
title := displayTitle(rd)
|
||||
if title == "" {
|
||||
title = "#" + rd.Download.ID
|
||||
}
|
||||
@@ -122,7 +132,12 @@ func (b *Bot) renderFailed(rd *worker.ReviewData) (string, *tgbotapi.InlineKeybo
|
||||
if rd.Download.State == store.StateStuck {
|
||||
verb = "зависла"
|
||||
}
|
||||
fmt.Fprintf(&sb, "❌ Задача #%s %s", id, verb)
|
||||
// Заголовок (display_name) для читаемости + #id для поиска по логам.
|
||||
if title := displayTitle(rd); title != "" {
|
||||
fmt.Fprintf(&sb, "❌ «%s» — задача #%s %s", title, id, verb)
|
||||
} else {
|
||||
fmt.Fprintf(&sb, "❌ Задача #%s %s", id, verb)
|
||||
}
|
||||
if code := rd.Download.ErrorCode.String; code != "" {
|
||||
fmt.Fprintf(&sb, " (%s)", code)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user