import format from 'template-format'; function getWatchUrl(scene) { if (scene.url) { return scene.url; } if (scene.channel && (scene.channel.isIndependent || scene.channel.type === 'network')) { return scene.channel.url; } if (scene.network) { return scene.network.url; } return null; } export function getAffiliateSceneUrl(scene) { const watchUrl = getWatchUrl(scene); if (!watchUrl) { return null; } if (!scene.affiliate) { return watchUrl; } const affiliateUrl = scene.affiliate.parameters.replaceScene?.hostname === new URL(watchUrl).hostname ? scene.affiliate.parameters.replaceScene.url : scene.affiliate.url; if (scene.affiliate.parameters.dynamicScene) { const scenePath = new URL(watchUrl).pathname; return format(scene.affiliate.parameters.dynamicScene, { scenePath: scene.affiliate.parameters.prefixSlash ? scenePath : scenePath.replace(/^\//, ''), entryId: scene.entryId, }); } if (affiliateUrl?.includes('/track') && scene.affiliate.parameters.scene !== false && (!scene.channel.isIndependent || scene.channel.id === scene.affiliate.entityId)) { // standard NATS redirect const { pathname, search } = new URL(watchUrl); return `${affiliateUrl}${pathname.replace(/^\/trial/, '')}${search}`; // replace needed for Jules Jordan, verify behavior on other sites } if (scene.affiliate.parameters.query) { // used by e.g. Bang const newParams = new URLSearchParams({ ...Object.fromEntries(new URL(watchUrl).searchParams), ...Object.fromEntries(new URLSearchParams(scene.affiliate.parameters.query)), }); return `${watchUrl}?${newParams.toString()}`; } return watchUrl; } export function getAffiliateEntityUrl(entity) { if (!entity.affiliate) { return entity.url; } const affiliateUrl = entity.affiliate.parameters.replaceEntity?.hostname === new URL(entity.url).hostname ? entity.affiliate.parameters.replaceEntity.url : entity.affiliate.url; if (entity.id === entity.affiliate.entityId || entity.url === entity.parent?.url) { return affiliateUrl; } if (entity.type === 'network' || entity.isIndependent) { return entity.url; } // channel has its own domain if (new URL(entity.url).pathname === '/' && entity.url !== entity.parent?.url) { return entity.url; } if (entity.affiliate.parameters.dynamicEntity) { const entityPath = new URL(entity.url).pathname; return format(entity.affiliate.parameters.dynamicEntity, { entityPath: entity.affiliate.parameters.prefixSlash ? entityPath : entityPath.replace(/^\//, ''), }); } if (affiliateUrl?.includes('/track') && entity.affiliate.parameters.channel !== false) { const { pathname, search } = new URL(entity.url); 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 URLSearchParams(entity.affiliate.parameters.query)), }); return `${entity.url}?${newParams.toString()}`; } return entity.url; }