Ad blacklist terms (#434)
* coming along well * working properly * check claim name and dont have side effect if the environment vars are not set * check against claim name
This commit is contained in:
parent
62122f6a96
commit
1bfe9e2eda
4 changed files with 45 additions and 4 deletions
|
@ -87,6 +87,8 @@ const config = {
|
||||||
FIREBASE_MEASUREMENT_ID: process.env.FIREBASE_MEASUREMENT_ID,
|
FIREBASE_MEASUREMENT_ID: process.env.FIREBASE_MEASUREMENT_ID,
|
||||||
FIREBASE_VAPID_KEY: process.env.FIREBASE_VAPID_KEY,
|
FIREBASE_VAPID_KEY: process.env.FIREBASE_VAPID_KEY,
|
||||||
|
|
||||||
|
AD_KEYWORD_BLOCKLIST: process.env.AD_KEYWORD_BLOCKLIST,
|
||||||
|
AD_KEYWORD_BLOCKLIST_CHECK_DESCRIPTION: process.env.AD_KEYWORD_BLOCKLIST_CHECK_DESCRIPTION
|
||||||
};
|
};
|
||||||
|
|
||||||
config.SDK_API_PATH = `${config.LBRY_WEB_API}/api/v1`;
|
config.SDK_API_PATH = `${config.LBRY_WEB_API}/api/v1`;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import { makeSelectClaimForUri } from 'redux/selectors/claims';
|
import { makeSelectClaimForUri, makeSelectMetadataForUri } from 'redux/selectors/claims';
|
||||||
import { doFetchRecommendedContent } from 'redux/actions/search';
|
import { doFetchRecommendedContent } from 'redux/actions/search';
|
||||||
import { selectRecommendedContentForUri, selectIsSearching } from 'redux/selectors/search';
|
import { selectRecommendedContentForUri, selectIsSearching } from 'redux/selectors/search';
|
||||||
import { selectUserVerifiedEmail } from 'redux/selectors/user';
|
import { selectUserVerifiedEmail } from 'redux/selectors/user';
|
||||||
|
@ -10,6 +10,7 @@ const select = (state, props) => {
|
||||||
const { claim_id: claimId } = claim;
|
const { claim_id: claimId } = claim;
|
||||||
const recommendedContentUris = selectRecommendedContentForUri(state, props.uri);
|
const recommendedContentUris = selectRecommendedContentForUri(state, props.uri);
|
||||||
const nextRecommendedUri = recommendedContentUris && recommendedContentUris[0];
|
const nextRecommendedUri = recommendedContentUris && recommendedContentUris[0];
|
||||||
|
const metadata = makeSelectMetadataForUri(props.uri)(state);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
claim,
|
claim,
|
||||||
|
@ -18,6 +19,7 @@ const select = (state, props) => {
|
||||||
nextRecommendedUri,
|
nextRecommendedUri,
|
||||||
isSearching: selectIsSearching(state),
|
isSearching: selectIsSearching(state),
|
||||||
isAuthenticated: selectUserVerifiedEmail(state),
|
isAuthenticated: selectUserVerifiedEmail(state),
|
||||||
|
metadata,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
// @flow
|
// @flow
|
||||||
import { SHOW_ADS } from 'config';
|
import { SHOW_ADS, AD_KEYWORD_BLOCKLIST, AD_KEYWORD_BLOCKLIST_CHECK_DESCRIPTION } from 'config';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import ClaimList from 'component/claimList';
|
import ClaimList from 'component/claimList';
|
||||||
import ClaimListDiscover from 'component/claimListDiscover';
|
import ClaimListDiscover from 'component/claimListDiscover';
|
||||||
|
@ -22,6 +22,7 @@ type Props = {
|
||||||
isAuthenticated: boolean,
|
isAuthenticated: boolean,
|
||||||
claim: ?StreamClaim,
|
claim: ?StreamClaim,
|
||||||
claimId: string,
|
claimId: string,
|
||||||
|
metadata: any,
|
||||||
};
|
};
|
||||||
|
|
||||||
export default React.memo<Props>(function RecommendedContent(props: Props) {
|
export default React.memo<Props>(function RecommendedContent(props: Props) {
|
||||||
|
@ -34,7 +35,41 @@ export default React.memo<Props>(function RecommendedContent(props: Props) {
|
||||||
isAuthenticated,
|
isAuthenticated,
|
||||||
claim,
|
claim,
|
||||||
claimId,
|
claimId,
|
||||||
|
metadata,
|
||||||
} = props;
|
} = props;
|
||||||
|
|
||||||
|
let { description, title } = metadata;
|
||||||
|
|
||||||
|
if (description) {
|
||||||
|
description = description.toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (title) {
|
||||||
|
title = title.toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
const checkDescriptionForBlacklistWords = AD_KEYWORD_BLOCKLIST_CHECK_DESCRIPTION === 'true';
|
||||||
|
|
||||||
|
let triggerBlacklist = false;
|
||||||
|
if (AD_KEYWORD_BLOCKLIST) {
|
||||||
|
const termsToCheck = AD_KEYWORD_BLOCKLIST.split(',');
|
||||||
|
// eslint-disable-next-line no-unused-vars
|
||||||
|
|
||||||
|
if (title) {
|
||||||
|
for (const term of termsToCheck) {
|
||||||
|
if (claim && claim.name && claim.name.includes(term)) {
|
||||||
|
triggerBlacklist = true;
|
||||||
|
}
|
||||||
|
if (title.includes(term)) {
|
||||||
|
triggerBlacklist = true;
|
||||||
|
}
|
||||||
|
if (description && checkDescriptionForBlacklistWords && description.includes(term)) {
|
||||||
|
triggerBlacklist = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const [viewMode, setViewMode] = React.useState(VIEW_ALL_RELATED);
|
const [viewMode, setViewMode] = React.useState(VIEW_ALL_RELATED);
|
||||||
const signingChannel = claim && claim.signing_channel;
|
const signingChannel = claim && claim.signing_channel;
|
||||||
const channelName = signingChannel ? signingChannel.name : null;
|
const channelName = signingChannel ? signingChannel.name : null;
|
||||||
|
@ -99,7 +134,7 @@ export default React.memo<Props>(function RecommendedContent(props: Props) {
|
||||||
loading={isSearching}
|
loading={isSearching}
|
||||||
uris={recommendedContentUris}
|
uris={recommendedContentUris}
|
||||||
hideMenu={isMobile}
|
hideMenu={isMobile}
|
||||||
injectedItem={SHOW_ADS && IS_WEB && !isAuthenticated && <Ads small type={'video'} />}
|
injectedItem={SHOW_ADS && IS_WEB && !isAuthenticated && <Ads small type={'video'} triggerBlacklist={triggerBlacklist} />}
|
||||||
empty={__('No related content found')}
|
empty={__('No related content found')}
|
||||||
onClick={handleRecommendationClicked}
|
onClick={handleRecommendationClicked}
|
||||||
/>
|
/>
|
||||||
|
|
|
@ -30,6 +30,7 @@ type Props = {
|
||||||
claim: Claim,
|
claim: Claim,
|
||||||
isMature: boolean,
|
isMature: boolean,
|
||||||
authenticated: boolean,
|
authenticated: boolean,
|
||||||
|
triggerBlacklist: boolean
|
||||||
};
|
};
|
||||||
|
|
||||||
function removeIfExists(querySelector) {
|
function removeIfExists(querySelector) {
|
||||||
|
@ -43,6 +44,7 @@ function Ads(props: Props) {
|
||||||
type = 'video',
|
type = 'video',
|
||||||
small,
|
small,
|
||||||
authenticated,
|
authenticated,
|
||||||
|
triggerBlacklist,
|
||||||
} = props;
|
} = props;
|
||||||
|
|
||||||
// load ad and tags here
|
// load ad and tags here
|
||||||
|
@ -131,7 +133,7 @@ function Ads(props: Props) {
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!SHOW_ADS) {
|
if (!SHOW_ADS || triggerBlacklist) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (type === 'video') {
|
if (type === 'video') {
|
||||||
|
|
Loading…
Reference in a new issue