traxxx-web/src/affiliates.js

115 lines
3.1 KiB
JavaScript

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;
}