feat(growth): ship search registration, long-tail SEO and in-app sharing

Register both Paca domains on Naver Search Advisor, Google Search Console and
Bing Webmaster Tools so the site can be indexed by every major engine, add
DASH and AES-128 how-to pages to capture protocol-specific searches, and let a
finished download share a UTM-tagged landing link from the completion shelf.
Package-manager manifests (winget, Chocolatey, Scoop) now carry verified
v1.2.0 hashes and product codes instead of placeholders. All 2,757 tests pass.

💘 Generated with Crush

Assisted-by: Crush:deepseek-v4.1-flash
This commit is contained in:
Yun Chan 2026-09-15 03:37:47 +09:00
parent 0e568f1f0a
commit a5a8da7424
37 changed files with 2841 additions and 10 deletions

View file

@ -1177,6 +1177,13 @@
<TextBlock Text="폴더에 표시" FontSize="11.5" VerticalAlignment="Center"/>
</StackPanel>
</Button>
<Button x:Name="DownloadShelfShareBtn" Style="{StaticResource GhostButton}" Height="28" Padding="10,0" Margin="2,0"
Click="DownloadShelfShareBtn_Click" AutomationProperties.Name="다운로드 결과 공유">
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE72D;" Style="{StaticResource FluentIcon}" FontSize="11" Margin="0,0,4,0" VerticalAlignment="Center"/>
<TextBlock Text="공유" FontSize="11.5" VerticalAlignment="Center"/>
</StackPanel>
</Button>
<Button x:Name="DownloadShelfShowAllBtn" Style="{StaticResource GhostButton}" Height="28" Padding="10,0" Margin="2,0"
Click="DownloadShelfShowAllBtn_Click" AutomationProperties.Name="모두 표시">
<TextBlock Text="모두 표시" FontSize="11.5" VerticalAlignment="Center"/>

View file

@ -5603,6 +5603,25 @@ public partial class MainWindow : Window
}
}
private void DownloadShelfShareBtn_Click(object sender, RoutedEventArgs e)
{
try
{
var name = DownloadShelfFileName?.Text ?? "";
var shareText = Paca.Core.Social.ShareCardBuilder.BuildShareText(name);
try { Clipboard.SetText(shareText); } catch { }
var dlg = new QrCodeDialog(Paca.Core.Social.ShareCardBuilder.BuildShareUrl(), Paca.Core.Social.ShareCardBuilder.BuildQrTitle(name))
{
Owner = this
};
dlg.ShowDialog();
}
catch
{
_toast?.Show("공유 링크를 만들지 못했습니다", "error");
}
}
private void DownloadShelfShowAllBtn_Click(object sender, RoutedEventArgs e)
{
DownloadsPopup.IsOpen = true;

View file

@ -0,0 +1,33 @@
namespace Paca.Core.Social;
/// <summary>
/// 제품 내 확산 루프용 공유 카드 페이로드 빌더.
/// 다운로드 완료 화면에서 결과물을 공유할 때 UTM 이 붙은 랜딩 URL 을 함께 실어 보내
/// 공유에서 방문, 설치로 이어지는 유입 루프를 닫는다.
/// </summary>
public static class ShareCardBuilder
{
/// <summary>공유에 사용하는 공식 랜딩 URL.</summary>
public const string LandingUrl = "https://mediabrowser.chanpaca.net/";
/// <summary>유입 분석용 UTM 소스(앱 내 공유).</summary>
public const string UtmSource = "paca_app";
/// <summary>UTM 이 부착된 공유용 랜딩 URL 을 만든다.</summary>
public static string BuildShareUrl(string medium = "share_card")
{
var m = string.IsNullOrWhiteSpace(medium) ? "share_card" : medium.Trim();
return $"{LandingUrl}?utm_source={UtmSource}&utm_medium={m}&utm_campaign=download_complete";
}
/// <summary>공유 시트나 클립보드에 넣을 공유 문구를 만든다.</summary>
public static string BuildShareText(string title, string medium = "share_card")
{
var name = string.IsNullOrWhiteSpace(title) ? "미디어" : title.Trim();
return $"Paca로 '{name}' 저장 완료. 재생만 하면 스트림을 자동 감지해 무손실 MP4로 저장하는 100% 무료 미디어 브라우저 → {BuildShareUrl(medium)}";
}
/// <summary>공유 카드(QR) 창의 제목을 만든다.</summary>
public static string BuildQrTitle(string title)
=> string.IsNullOrWhiteSpace(title) ? "Paca 무료 다운로드" : $"'{title.Trim()}' 공유 - Paca 무료 다운로드";
}