feat(ads/seo/release): v1.2.0 with live Google Ads, isolated ad profile, ads.txt, and SEO/AEO/GEO optimization

This commit is contained in:
Yun Chan 2026-09-14 00:39:44 +09:00
parent a88aafa1e5
commit 0e568f1f0a
975 changed files with 130593 additions and 16783 deletions

View file

@ -0,0 +1,90 @@
using System;
using System.Collections.Generic;
using Paca.Core;
using Xunit;
namespace Paca.Tests.Core;
public class HlsManifestValidatorGateTests
{
[Fact]
public void Gate441_HlsManifestValidator_DetectsMasterPlaylist_AndVariants()
{
var manifest = @"#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720
720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080
1080p.m3u8";
var result = HlsManifestValidator.Analyze(manifest);
Assert.True(result.IsMasterPlaylist);
Assert.Equal(2, result.Variants.Count);
Assert.Equal(5000000, result.Variants[0].Bandwidth); // highest first
Assert.Equal("1080p.m3u8", result.Variants[0].Uri);
Assert.Equal("1920x1080", result.Variants[0].Resolution);
}
[Fact]
public void Gate442_HlsManifestValidator_ParsesMediaPlaylist_Accurately()
{
var manifest = @"#EXTM3U
#EXT-X-TARGETDURATION:10
#EXTINF:10.0,
seg1.ts
#EXTINF:10.0,
seg2.ts
#EXTINF:5.5,
seg3.ts
#EXT-X-ENDLIST";
var result = HlsManifestValidator.Analyze(manifest);
Assert.False(result.IsMasterPlaylist);
Assert.True(result.IsVod);
Assert.False(result.IsLive);
Assert.Equal(3, result.SegmentCount);
Assert.Equal(25.5, result.TotalDurationSec, 1);
}
[Fact]
public void Gate443_HlsManifestValidator_DetectsDiscontinuities_AndLiveStream()
{
var manifest = @"#EXTM3U
#EXT-X-TARGETDURATION:6
#EXTINF:6.0,
live1.ts
#EXT-X-DISCONTINUITY
#EXTINF:6.0,
live2.ts";
var result = HlsManifestValidator.Analyze(manifest);
Assert.True(result.IsLive);
Assert.False(result.IsVod);
Assert.Equal(1, result.DiscontinuityCount);
Assert.Equal(2, result.SegmentCount);
}
[Fact]
public void Gate444_HlsManifestValidator_StripsAdDiscontinuityBlocks()
{
var manifest = @"#EXTM3U
#EXTINF:10.0,
main1.ts
#EXT-X-DISCONTINUITY
#EXTINF:15.0,
ad1.ts
#EXT-X-DISCONTINUITY
#EXTINF:10.0,
main2.ts
#EXT-X-ENDLIST";
// Ad duration 15.0s between discontinuities stripped
var cleaned = HlsManifestValidator.StripAdBlocks(manifest, maxAdDurationSec: 30.0);
Assert.Contains("main1.ts", cleaned);
Assert.Contains("main2.ts", cleaned);
Assert.DoesNotContain("ad1.ts", cleaned);
}
}