Files
jellybit/web/templates/partials/review_source_block.html
T
avandClaude Opus 4.8 02d4ecc2aa display_name: слоистое разрешение полей + сохранение режиссёра из контекста
Единый источник полей отображаемого имени и один рендер полного ярлыка на
всех путях (старт и «Обновить имя»/авто-перелив). Раньше старт давал полный
«Название (режиссёр, год). Сезон N» но выбрасывал структуру, а перелив по
распознаванию — усечённый «Title (Year)».

- Слоистое разрешение скаляров имени: override → recognition(+match) →
  новый базовый слой «контекст» (download.parsed_context, JSON naming.Fields).
- naming: публичные Fields/Label/Derive, вынесен единый рендер; удалён
  FormatTitleYear. Сводка сезонов вынесена в recognize.SeasonSummary.
- Режиссёр из метабазы (решение A2): TMDB/TVDB credits через опциональный
  metadata.DirectorProvider; авто-матч кладёт в plan.Director, ручной выбор
  кандидата тянет credits и пиннит ovrDirector. Метабаза бьёт контекст.
- refreshDisplayNameLocked строит полный ярлык из эффективных полей;
  инфо-панель ревью показывает загруженного режиссёра.
- Миграция 0011_parsed_context + ER-схема. Всё косметика: на пути/раскладку
  не влияет, приём/вывод имени не валятся (best-effort).

Закрывает беклог-задачу «Кнопка „Обновить имя“: полный формат ярлыка».
OpenSpec: archive/2026-07-11-field-resolution-display-name (ingest,
recognition, metadata-match, review).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 11:50:08 +03:00

81 lines
4.4 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{{define "review_source_block"}}
<div class="section" id="source-block">
<div class="section-head">
<h2>Источник и раскладка</h2>
<span class="hint">выбери вариант — инфо и раскладка обновятся сразу</span>
</div>
{{if .BlockError}}
<div class="block-error">{{.BlockError}}</div>
{{end}}
<!-- 1. Список вариантов: клик по строке = выбор + сохранение (htmx) -->
<div class="cand-list">
{{range .Sources}}
<div class="cand{{if .Active}} selected{{end}}{{if eq .Kind "neural"}} nn-cand{{end}}">
<label class="cand-pick">
<input class="cand-radio" type="radio" name="candidate_id"
value="{{if eq .Kind "neural"}}{{else}}{{.CandidateID}}{{end}}"
{{if .Active}}checked{{end}}
hx-post="/ui/downloads/{{$.ID}}/{{if eq .Kind "neural"}}nobase{{else}}candidate{{end}}"
hx-trigger="change"
hx-target="#source-block"
hx-swap="outerHTML">
<span class="radio"></span>
<div class="body">
{{if eq .Kind "neural"}}
<div class="name"><span class="prov nn">нейронка</span> распознано нейронкой</div>
<div class="sub">без базы — тег папки не ставится</div>
{{else}}
<div class="name"><span class="prov {{.Provider}}">{{.Provider}}</span> {{if .Title}}{{.Title}}{{else}}<span class="faint">id {{.ProviderID}}</span>{{end}}{{if .Year}} <span class="muted">· {{.Year}}</span>{{end}}</div>
<div class="sub">id {{.ProviderID}}</div>
{{end}}
</div>
</label>
{{if .MatchURL}}<a class="ext-link" href="{{.MatchURL}}" target="_blank" rel="noopener">запись ↗</a>{{end}}
</div>
{{end}}
</div>
<!-- Ручное добавление источника -->
<form class="cand-extra" hx-post="/ui/downloads/{{.ID}}/source"
hx-target="#source-block" hx-swap="outerHTML">
<select class="select" name="provider" style="max-width:120px">
<option value="tmdb">TMDB</option>
<option value="tvdb">TVDB</option>
<option value="imdb">IMDb</option>
</select>
<input class="input mono" name="provider_id" placeholder="id или URL записи (для TVDB — числовой id)" required>
<button class="btn btn-sm" type="submit">Добавить</button>
</form>
<!-- 2. Инфо о выбранном источнике (тип read-only) -->
<div class="src-info">
<div class="field"><span class="label">Тип</span><div>{{if .IsSeries}}сериал{{else}}фильм{{end}}</div></div>
<div class="field"><span class="label">Название</span><div>{{.Title}}</div></div>
{{if .OriginalTitle}}<div class="field"><span class="label">Ориг. название</span><div class="mono">{{.OriginalTitle}}</div></div>{{end}}
{{if .Year}}<div class="field"><span class="label">Год</span><div>{{.Year}}</div></div>{{end}}
{{if .IsSeries}}<div class="field"><span class="label">Сезоны</span><div>{{if .SeasonSummary}}{{.SeasonSummary}}{{else}}<span class="faint"></span>{{end}}</div></div>{{end}}
<div class="field"><span class="label">Режиссёр</span><div>{{if .Director}}{{.Director}}{{else}}<span class="faint"></span>{{end}}</div></div>
</div>
<!-- 3. Предпросмотр раскладки выбранного источника -->
<div class="src-layout">
<div class="section-head" style="margin-bottom:var(--sp-3)">
<h3 class="sub-head">Раскладка</h3>
<span class="hint">файл источника → целевой хардлинк</span>
</div>
{{template "layout_widget" .Files}}
<p class="faint" style="font-size:var(--fs-xs);margin:var(--sp-3) 0 0">
Буквальные целевые пути. Применяются как хардлинки — исходник остаётся на раздаче.
</p>
</div>
</div>
{{end}}
{{/* Ответ на своп выбора источника: свежий #source-block + oob-обновление
панели действий (#action-bar), чтобы кнопка «Применить» синхронно отражала
актуальный HasLinks. Рендерится с ActionBarOOB=true (reviewBlockAction). */}}
{{define "review_source_swap"}}{{template "review_source_block" .}}
{{template "review_action_bar" .}}{{end}}