From 70049ed4950e84ee0193a6c4699ded5084bd4e27 Mon Sep 17 00:00:00 2001 From: DebaucheryLibrarian Date: Thu, 29 Jan 2026 22:23:32 +0100 Subject: [PATCH] Fixed entity affiliate URL generator breaking if no entity URL exists, falling back on parent URL. --- pages/entities/@entitySlug/+Page.vue | 6 +--- src/affiliates.js | 47 +++++++++++++++++++--------- 2 files changed, 33 insertions(+), 20 deletions(-) diff --git a/pages/entities/@entitySlug/+Page.vue b/pages/entities/@entitySlug/+Page.vue index 48962d6..3c35a7b 100644 --- a/pages/entities/@entitySlug/+Page.vue +++ b/pages/entities/@entitySlug/+Page.vue @@ -164,11 +164,7 @@ const scrollable = computed(() => children.value?.scrollWidth > children.value?. const domain = routeParams.domain; const entityUrl = (() => { - if (!entity.url) { - return null; - } - - return entity.affiliateUrl || entity.url; + return entity.affiliateUrl || entity.url || null; })(); diff --git a/src/affiliates.js b/src/affiliates.js index 1879e53..d4fdf88 100644 --- a/src/affiliates.js +++ b/src/affiliates.js @@ -23,7 +23,7 @@ export function getAffiliateSceneUrl(scene) { return null; } - if (!scene.affiliate) { + if (!scene.affiliate || scene.affiliate.parameters.scene === false) { return watchUrl; } @@ -42,14 +42,25 @@ export function getAffiliateSceneUrl(scene) { }); } + // NATS deep URL if (affiliateUrl?.includes('/track') && scene.affiliate.parameters.scene !== false - && (!scene.channel.isIndependent || scene.channel.id === scene.affiliate.entityId)) { // standard NATS redirect + && (!scene.channel.isIndependent || scene.channel.id === scene.affiliate.entityId)) { const { pathname, search } = new URL(watchUrl); return `${affiliateUrl}${pathname.replace(/^\/trial/, '')}${search}`; // replace needed for Jules Jordan, verify behavior on other sites } + const affiliateUrlComponents = new URL(affiliateUrl); + + // NetFame / GammaE deep URL + if (affiliateUrlComponents.searchParams.has('pa') && affiliateUrlComponents.searchParams.has('ar')) { + affiliateUrlComponents.searchParams.set('pa', 'clip'); + affiliateUrlComponents.searchParams.set('ar', scene.entryId); + + return affiliateUrlComponents.href; + } + if (scene.affiliate.parameters.query) { // used by e.g. Bang const newParams = new URLSearchParams({ ...Object.fromEntries(new URL(watchUrl).searchParams), @@ -63,29 +74,35 @@ export function getAffiliateSceneUrl(scene) { } export function getAffiliateEntityUrl(entity) { - if (!entity.affiliate) { - return entity.url; + const entityUrl = entity.url || entity.parent?.url; + + if (!entityUrl) { + return null; } - const affiliateUrl = entity.affiliate.parameters.replaceEntity?.hostname === new URL(entity.url).hostname - ? entity.affiliate.parameters.replaceEntity.url + if (!entity.affiliate) { + return entityUrl; + } + + const affiliateUrl = entity.affiliate.parameters.replaceEntity?.hostname === new URL(entityUrl).hostname + ? entity.affiliate.parameters.replaceentityUrl : entity.affiliate.url; - if (entity.id === entity.affiliate.entityId || entity.url === entity.parent?.url) { + if (entity.id === entity.affiliate.entityId || entityUrl === entity.parent?.url) { return affiliateUrl; } if (entity.type === 'network' || entity.isIndependent) { - return entity.url; + return entityUrl; } // channel has its own domain - if (new URL(entity.url).pathname === '/' && entity.url !== entity.parent?.url) { - return entity.url; + if (new URL(entityUrl).pathname === '/' && entityUrl !== entity.parent?.url) { + return entityUrl; } if (entity.affiliate.parameters.dynamicEntity) { - const entityPath = new URL(entity.url).pathname; + const entityPath = new URL(entityUrl).pathname; return format(entity.affiliate.parameters.dynamicEntity, { entityPath: entity.affiliate.parameters.prefixSlash @@ -96,19 +113,19 @@ export function getAffiliateEntityUrl(entity) { if (affiliateUrl?.includes('/track') && entity.affiliate.parameters.channel !== false) { - const { pathname, search } = new URL(entity.url); + const { pathname, search } = new URL(entityUrl); return `${affiliateUrl}${pathname.replace(/^\/trial/, '')}${search}`; // replace needed for Jules Jordan, verify behavior on other sites } if (entity.affiliate.parameters.query) { // used by e.g. Bang const newParams = new URLSearchParams({ - ...Object.fromEntries(new URL(entity.url).searchParams), + ...Object.fromEntries(new URL(entityUrl).searchParams), ...Object.fromEntries(new URLSearchParams(entity.affiliate.parameters.query)), }); - return `${entity.url}?${newParams.toString()}`; + return `${entityUrl}?${newParams.toString()}`; } - return entity.url; + return entityUrl; }