Fixed entity affiliate URL generator breaking if no entity URL exists, falling back on parent URL.

This commit is contained in:
DebaucheryLibrarian 2026-01-29 22:23:32 +01:00
parent 9e20af925f
commit 70049ed495
2 changed files with 33 additions and 20 deletions

View File

@ -164,11 +164,7 @@ const scrollable = computed(() => children.value?.scrollWidth > children.value?.
const domain = routeParams.domain; const domain = routeParams.domain;
const entityUrl = (() => { const entityUrl = (() => {
if (!entity.url) { return entity.affiliateUrl || entity.url || null;
return null;
}
return entity.affiliateUrl || entity.url;
})(); })();
</script> </script>

View File

@ -23,7 +23,7 @@ export function getAffiliateSceneUrl(scene) {
return null; return null;
} }
if (!scene.affiliate) { if (!scene.affiliate || scene.affiliate.parameters.scene === false) {
return watchUrl; return watchUrl;
} }
@ -42,14 +42,25 @@ export function getAffiliateSceneUrl(scene) {
}); });
} }
// NATS deep URL
if (affiliateUrl?.includes('/track') if (affiliateUrl?.includes('/track')
&& scene.affiliate.parameters.scene !== false && 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); const { pathname, search } = new URL(watchUrl);
return `${affiliateUrl}${pathname.replace(/^\/trial/, '')}${search}`; // replace needed for Jules Jordan, verify behavior on other sites 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 if (scene.affiliate.parameters.query) { // used by e.g. Bang
const newParams = new URLSearchParams({ const newParams = new URLSearchParams({
...Object.fromEntries(new URL(watchUrl).searchParams), ...Object.fromEntries(new URL(watchUrl).searchParams),
@ -63,29 +74,35 @@ export function getAffiliateSceneUrl(scene) {
} }
export function getAffiliateEntityUrl(entity) { export function getAffiliateEntityUrl(entity) {
if (!entity.affiliate) { const entityUrl = entity.url || entity.parent?.url;
return entity.url;
if (!entityUrl) {
return null;
} }
const affiliateUrl = entity.affiliate.parameters.replaceEntity?.hostname === new URL(entity.url).hostname if (!entity.affiliate) {
? entity.affiliate.parameters.replaceEntity.url return entityUrl;
}
const affiliateUrl = entity.affiliate.parameters.replaceEntity?.hostname === new URL(entityUrl).hostname
? entity.affiliate.parameters.replaceentityUrl
: entity.affiliate.url; : 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; return affiliateUrl;
} }
if (entity.type === 'network' || entity.isIndependent) { if (entity.type === 'network' || entity.isIndependent) {
return entity.url; return entityUrl;
} }
// channel has its own domain // channel has its own domain
if (new URL(entity.url).pathname === '/' && entity.url !== entity.parent?.url) { if (new URL(entityUrl).pathname === '/' && entityUrl !== entity.parent?.url) {
return entity.url; return entityUrl;
} }
if (entity.affiliate.parameters.dynamicEntity) { if (entity.affiliate.parameters.dynamicEntity) {
const entityPath = new URL(entity.url).pathname; const entityPath = new URL(entityUrl).pathname;
return format(entity.affiliate.parameters.dynamicEntity, { return format(entity.affiliate.parameters.dynamicEntity, {
entityPath: entity.affiliate.parameters.prefixSlash entityPath: entity.affiliate.parameters.prefixSlash
@ -96,19 +113,19 @@ export function getAffiliateEntityUrl(entity) {
if (affiliateUrl?.includes('/track') if (affiliateUrl?.includes('/track')
&& entity.affiliate.parameters.channel !== false) { && 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 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 if (entity.affiliate.parameters.query) { // used by e.g. Bang
const newParams = new URLSearchParams({ 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)), ...Object.fromEntries(new URLSearchParams(entity.affiliate.parameters.query)),
}); });
return `${entity.url}?${newParams.toString()}`; return `${entityUrl}?${newParams.toString()}`;
} }
return entity.url; return entityUrl;
} }