This commit is contained in:
2026-05-28 18:00:10 +08:00
parent 7201bf9845
commit a1d3fde774
6 changed files with 69 additions and 24 deletions

View File

@@ -79,10 +79,10 @@ func PlayworksPage(w http.ResponseWriter, r *http.Request) {
<label class="net-row"><input type="checkbox" class="net-cb" data-tag="is" checked /><span class="net-label">Ironsource <span class="net-tag">is</span></span><span class="net-note">HTML + mraid.js in head</span></label>
<label class="net-row"><input type="checkbox" class="net-cb" data-tag="fb" checked /><span class="net-label">Facebook <span class="net-tag">fb</span></span><span class="net-note">HTML</span></label>
<label class="net-row"><input type="checkbox" class="net-cb" data-tag="gg" checked /><span class="net-label">Google Ads <span class="net-tag">gg</span></span><span class="net-note">ZIP + exitapi.js in head</span></label>
<label class="net-row"><input type="checkbox" class="net-cb" data-tag="ap" checked /><span class="net-label">Appreciate <span class="net-tag">ap</span></span><span class="net-note">ZIP + exitapi.js in head</span></label>
<label class="net-row"><input type="checkbox" class="net-cb" data-tag="mo" checked /><span class="net-label">Moloco <span class="net-tag">mo</span></span><span class="net-note">HTML + FbPlayableAd CTA</span></label>
<label class="net-row"><input type="checkbox" class="net-cb" data-tag="vu" checked /><span class="net-label">Vungle <span class="net-tag">vu</span></span><span class="net-note">ZIP + __VUNGLE__ flag</span></label>
<label class="net-row"><input type="checkbox" class="net-cb" data-tag="mtg" checked /><span class="net-label">Mintegral <span class="net-tag">mtg</span></span><span class="net-note">ZIP + onload gameReady</span></label>
<label class="net-row"><input type="checkbox" class="net-cb" data-tag="un" checked /><span class="net-label">Unity <span class="net-tag">un</span></span><span class="net-note">HTML + mraid.js in head</span></label>
<label class="net-row"><input type="checkbox" class="net-cb" data-tag="tt" /><span class="net-label">TikTok <span class="net-tag">tt</span></span><span class="net-note">HTML + __TIKTOK__ flag</span></label>
</div>
</div>
@@ -218,6 +218,12 @@ func PlayworksConvert(w http.ResponseWriter, r *http.Request) {
}
results := []playworksNetworkResult{}
unityPath, err := copyPlayworksUnityInput(data, opts)
if err != nil {
results = append(results, playworksNetworkResult{Network: "un", OK: false, Error: err.Error()})
} else {
results = append(results, playworksNetworkResult{Network: "un", File: unityPath, OK: true})
}
for _, network := range opts.Networks {
filePath, err := convertPlayworksNetwork(string(data), opts, network)
if err != nil {
@@ -229,7 +235,7 @@ func PlayworksConvert(w http.ResponseWriter, r *http.Request) {
writeJSON(w, map[string]any{"results": results})
}
var playworksSuffixRx = regexp.MustCompile(`_(?:un|al|is|fb|gg|mo|vu|mtg|tt)$`)
var playworksSuffixRx = regexp.MustCompile(`_(?:un|al|is|fb|gg|ap|mo|vu|mtg|tt)$`)
var playworksMraidScriptRx = regexp.MustCompile(`(?i)<script\b[^>]*\bsrc\s*=\s*["']mraid\.js["'][^>]*>\s*</script>\s*`)
var playworksExitapiScriptRx = regexp.MustCompile(`(?i)<script\b[^>]*\bsrc\s*=\s*["']exitapi\.js["'][^>]*>\s*</script>\s*`)
var playworksHeadCloseRx = regexp.MustCompile(`(?i)</head>`)
@@ -296,6 +302,19 @@ func convertPlayworksNetwork(htmlSrc string, opts playworksConvertOptions, netwo
return outPath, nil
}
func copyPlayworksUnityInput(data []byte, opts playworksConvertOptions) (string, error) {
baseName := playworksOutputBaseName(opts)
outputDir := filepath.Join(opts.OutputDir, "Unity")
if err := os.MkdirAll(outputDir, 0755); err != nil {
return "", err
}
outPath := filepath.Join(outputDir, fmt.Sprintf("%s_un.html", baseName))
if err := os.WriteFile(outPath, data, 0644); err != nil {
return "", err
}
return outPath, nil
}
func playworksNetworkOutputFolder(network string) string {
switch network {
case "al":
@@ -306,14 +325,14 @@ func playworksNetworkOutputFolder(network string) string {
return "Facebook"
case "gg":
return "GoogleAds"
case "ap":
return "Appreciate"
case "mo":
return "Moloco"
case "vu":
return "Vungle"
case "mtg":
return "Mintegral"
case "un":
return "Unity"
case "tt":
return "TikTok"
default:
@@ -322,16 +341,20 @@ func playworksNetworkOutputFolder(network string) string {
}
func playworksNeedsZip(network string) bool {
return network == "gg" || network == "vu" || network == "mtg"
return network == "gg" || network == "ap" || network == "vu" || network == "mtg"
}
func playworksIsMraidNetwork(network string) bool {
return network == "al" || network == "is" || network == "un"
return network == "al" || network == "is"
}
func playworksIsExitapiNetwork(network string) bool {
return network == "gg" || network == "ap"
}
func playworksIsSupportedNetwork(network string) bool {
switch network {
case "al", "is", "fb", "gg", "mo", "vu", "mtg", "un", "tt":
case "al", "is", "fb", "gg", "ap", "mo", "vu", "mtg", "tt":
return true
default:
return false
@@ -343,7 +366,7 @@ func transformPlayworksHTML(htmlSrc, network string) string {
headInject := buildPlayworksLifecycleScript()
if playworksIsMraidNetwork(network) {
headInject += `<script src="mraid.js"></script>` + buildPlayworksMraidComplianceScript()
} else if network == "gg" {
} else if playworksIsExitapiNetwork(network) {
headInject += `<script src="exitapi.js"></script>`
}
result = injectPlayworksBeforeHeadClose(result, headInject)
@@ -385,7 +408,7 @@ func trimPlayworksAfterFirstHTMLClose(htmlSrc string) string {
func finalizePlayworksNetworkHTML(htmlSrc, network string) string {
result := cleanupPlayworksHTML(htmlSrc)
result = dedupePlayworksScriptSrc(result, "mraid.js", playworksIsMraidNetwork(network))
result = dedupePlayworksScriptSrc(result, "exitapi.js", network == "gg")
result = dedupePlayworksScriptSrc(result, "exitapi.js", playworksIsExitapiNetwork(network))
return result
}
@@ -565,11 +588,11 @@ func buildPlayworksCTAScript(network string) string {
closeCall := `try{window.gameClose();}catch(e){}`
ctaLogic := closeCall + `window.open(o,"_blank");`
switch network {
case "al", "is", "un":
case "al", "is":
ctaLogic = closeCall + `if(typeof mraid!=="undefined"&&typeof mraid.open==="function"){var s=typeof mraid.getState==="function"?mraid.getState():"default";if(s!=="loading"){mraid.open(o);return;}}window.open(o,"_blank");`
case "fb":
ctaLogic = closeCall + `if(typeof FbPlayableAd!=="undefined"&&typeof FbPlayableAd.onCTAClick==="function"){FbPlayableAd.onCTAClick();return;}window.open(o,"_blank");`
case "gg":
case "gg", "ap":
ctaLogic = closeCall + `if(typeof ExitApi!=="undefined"&&typeof ExitApi.exit==="function"){ExitApi.exit();return;}window.open(o,"_blank");`
case "mo":
ctaLogic = closeCall + `if(typeof FbPlayableAd!=="undefined"&&typeof FbPlayableAd.onCTAClick==="function"){FbPlayableAd.onCTAClick();return;}if(typeof window.clickTag==="string"&&window.clickTag){window.open(window.clickTag,"_blank");return;}window.open(o,"_blank");`

View File

@@ -12,7 +12,7 @@ func TestExportPlayworksNetworksForRuntimeCheck(t *testing.T) {
t.Skip("PLAYWORKS_EXPORT_DIR not set")
}
sourcePath := filepath.Join("..", "aiAssets", "Playworks_UnityNetwork.html")
sourcePath := filepath.Join("..", "aiAssets", "DogCat3_Full.html")
data, err := os.ReadFile(sourcePath)
if err != nil {
t.Fatalf("read source: %v", err)
@@ -24,7 +24,11 @@ func TestExportPlayworksNetworksForRuntimeCheck(t *testing.T) {
BaseName: "wat_mip_grhpl_dogcat3_05_real_na_noseason_en_full_na",
}
for _, network := range []string{"al", "fb", "gg", "is", "mo", "mtg", "un", "vu"} {
if _, err := copyPlayworksUnityInput(data, opts); err != nil {
t.Fatalf("copy unity input: %v", err)
}
for _, network := range []string{"al", "ap", "fb", "gg", "is", "mo", "mtg", "vu"} {
if _, err := convertPlayworksNetwork(string(data), opts, network); err != nil {
t.Fatalf("convert %s: %v", network, err)
}

View File

@@ -8,7 +8,7 @@ import (
)
func TestTransformPlayworksHTMLNetworkRequirements(t *testing.T) {
sourcePath := filepath.Join("..", "aiAssets", "Playworks_UnityNetwork.html")
sourcePath := filepath.Join("..", "aiAssets", "DogCat3_Full.html")
data, err := os.ReadFile(sourcePath)
if err != nil {
t.Fatalf("read source: %v", err)
@@ -21,8 +21,8 @@ func TestTransformPlayworksHTMLNetworkRequirements(t *testing.T) {
}{
{network: "al", wantMraid: 1},
{network: "is", wantMraid: 1},
{network: "un", wantMraid: 1},
{network: "gg", wantExitapi: 1},
{network: "ap", wantExitapi: 1},
{network: "fb"},
{network: "mo"},
{network: "vu"},