MEDIABROWSER 개명·업데이트 채널 전환·아이콘 tofu 근본 수정 (BACKLOG 13차) — ①개명: installer.iss AppName/출력 MediaBrowser-Setup-*(AppId·exe·데이터 경로 유지로 업그레이드 호환), 워크플로 산출물명(mediabrowser-*.tar.gz, MediaBrowser-<ver>-arm64.apk), 창 타이틀·모바일 표시명·obtainium.json·README. ②UpdateChecker: apiBase 주입(기본=자체 Forgejo /api/v1, GitHub 는 apiBase 로 호환), osx 자산 tar.gz 허용(기존 dmg 만 → mac 영원히 자산 없음 결함 수정), AppConfig 기본 UpdateRepo=Video-Downloader/releases+UpdateApiBase — 테스트 4건. ③아이콘 tofu(사용자 보고 "절대 안고쳐지네") 근본 원인: Shared.xaml 암시적 TextBlock 스타일의 FontFamily=UiFont 강제가 버튼 ContentPresenter 자동 TextBlock 의 IconFont 상속을 덮어 모든 PUA 글리프가 notdef — 폰트 설치/글리프 존재/HW·SW 렌더/RTB/DPI/런타임 8·10/자체포함·공유 전부 배제 후 실창 픽셀 비교로 격리, 콘텐츠 TextBlock 의 실폰트가 Pretendard 체인임을 테스트로 실증. 수정: 암시 스타일 FontFamily 제거(창 루트 상속으로 통일, PairingWindow/PlayerWindow 는 SetResourceReference), PUA+텍스트 혼합 콘텐츠 7곳+코드 1곳 정리, 순수 글리프 2곳 IconFont 명시. 회귀 방어: IconGlyphXamlTests(정적 스캔)·IconContentFontTests(실창 폰트 단정)·IconGlyphRenderTests(픽셀 비교) — 462/462 GREEN, 수정 전후 실창 캡처로 글리프 렌더 확인
This commit is contained in:
parent
c8b061959b
commit
02995f4153
24 changed files with 451 additions and 64 deletions
|
|
@ -78,8 +78,12 @@ public class AppConfig
|
|||
public bool RemoteAccessEnabled { get; set; } = false;
|
||||
public string? RemoteAccessToken { get; set; }
|
||||
|
||||
/// <summary>업데이트 확인 대상 GitHub 저장소("owner/repo") — DEPLOYMENT_PLAN §6 v1. 비면 확인 안 함.</summary>
|
||||
public string UpdateRepo { get; set; } = "";
|
||||
/// <summary>업데이트 확인 대상 저장소("owner/repo") — DEPLOYMENT_PLAN §6 v1. 비면 확인 안 함.
|
||||
/// 기본은 자체 Forgejo 공개 릴리스 저장소(§5-bis).</summary>
|
||||
public string UpdateRepo { get; set; } = "Video-Downloader/releases";
|
||||
|
||||
/// <summary>업데이트 채널 API 베이스. Forgejo 는 /api/v1 접두 포함, GitHub 는 "https://api.github.com".</summary>
|
||||
public string UpdateApiBase { get; set; } = Update.UpdateChecker.DefaultApiBase;
|
||||
|
||||
// ==================== UI 복잡 버전 (docs/UI_USECASES.md) ====================
|
||||
|
||||
|
|
|
|||
|
|
@ -2,18 +2,22 @@ using System.Text.Json;
|
|||
|
||||
namespace VideoDownloader.Core.Update;
|
||||
|
||||
/// <summary>GitHub 릴리스의 설치 자산 하나.</summary>
|
||||
/// <summary>릴리스의 설치 자산 하나.</summary>
|
||||
public sealed record UpdateAsset(string Name, string DownloadUrl);
|
||||
|
||||
/// <summary>업데이트 확인 결과. LatestVersion 은 태그의 v 접두를 뗀 정규형.</summary>
|
||||
public sealed record UpdateCheckResult(bool IsNewer, string CurrentVersion, string LatestVersion, string ReleaseUrl, UpdateAsset? Asset);
|
||||
|
||||
/// <summary>
|
||||
/// DEPLOYMENT_PLAN §6 자동 업데이트 v1 — GitHub Releases latest 태그 폴링(무의존·전 OS 공통).
|
||||
/// 설치를 자동 적용하지 않고 릴리스/자산 URL 만 돌려준다(설치는 사람 관문).
|
||||
/// DEPLOYMENT_PLAN §6 자동 업데이트 v1 — Releases latest 태그 폴링(무의존·전 OS 공통).
|
||||
/// 기본 채널은 자체 Forgejo 공개 릴리스 저장소(§5-bis)이고, apiBase 로 GitHub 등 다른 채널도 쓸 수 있다
|
||||
/// (Forgejo 와 GitHub 의 releases/latest 응답 형태가 동일). 설치는 사람 관문 — URL 만 돌려준다.
|
||||
/// </summary>
|
||||
public sealed class UpdateChecker
|
||||
{
|
||||
/// <summary>기본 업데이트 채널 API 베이스 — Forgejo 는 /api/v1 접두 포함.</summary>
|
||||
public const string DefaultApiBase = "https://git.chanpaca.net/api/v1";
|
||||
|
||||
private readonly HttpClient _http;
|
||||
|
||||
public UpdateChecker(HttpMessageHandler? handler = null)
|
||||
|
|
@ -49,7 +53,7 @@ public sealed class UpdateChecker
|
|||
{
|
||||
"win" => name.EndsWith(".exe") || name.EndsWith(".msi"),
|
||||
"linux" => name.EndsWith(".tar.gz") || name.EndsWith(".appimage") || name.EndsWith(".deb"),
|
||||
"osx" => name.EndsWith(".dmg"),
|
||||
"osx" => name.EndsWith(".dmg") || name.EndsWith(".tar.gz"), // 프리뷰는 tar.gz 배포(§5-bis), 정식 서명판은 dmg
|
||||
_ => false,
|
||||
};
|
||||
if (osMatch) return asset;
|
||||
|
|
@ -57,10 +61,13 @@ public sealed class UpdateChecker
|
|||
return null;
|
||||
}
|
||||
|
||||
/// <summary>repo("owner/repo")의 latest 릴리스를 조회한다. API 실패는 HttpRequestException 으로 드러난다.</summary>
|
||||
public async Task<UpdateCheckResult> CheckAsync(string repo, string currentVersion, string rid, CancellationToken ct = default)
|
||||
/// <summary>
|
||||
/// repo("owner/repo")의 latest 릴리스를 조회한다. API 실패는 HttpRequestException 으로 드러난다.
|
||||
/// apiBase 미지정이면 기본 채널(자체 Forgejo). GitHub 는 "https://api.github.com" 을 넘긴다.
|
||||
/// </summary>
|
||||
public async Task<UpdateCheckResult> CheckAsync(string repo, string currentVersion, string rid, string? apiBase = null, CancellationToken ct = default)
|
||||
{
|
||||
using var res = await _http.GetAsync($"https://api.github.com/repos/{repo}/releases/latest", ct);
|
||||
using var res = await _http.GetAsync($"{(apiBase ?? DefaultApiBase).TrimEnd('/')}/repos/{repo}/releases/latest", ct);
|
||||
res.EnsureSuccessStatusCode();
|
||||
using var doc = JsonDocument.Parse(await res.Content.ReadAsStringAsync(ct));
|
||||
var root = doc.RootElement;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue