All files / Player/Utils deriveConvivaCustomMetadata.js

100% Statements 25/25
100% Branches 2/2
100% Functions 6/6
100% Lines 21/21

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 911x   1x   1x                                         1x       1x       1x         1x             15x   78x 78x     3x 3x   1x 3x 3x 3x 3x 3x   3x             3x         3x                                  
import pathOr from 'ramda/src/pathOr';
 
import { version } from '../../../package.json';
 
const playbackAssetDataMap = {
    articleId:          ['id'],
    awayContestantId:   ['contestants', 1, 'id'],
    awayContestantName: ['contestants', 1, 'title'],
    competitionId:      ['competition', 'id'],
    competitionName:    ['competition', 'title'],
    contentId:          ['id'],
    contentName:        ['title'],
    contentType:        ['type', 'name'],
    fixtureId:          ['eventId'],
    homeContestantId:   ['contestants', 0, 'id'],
    homeContestantName: ['contestants', 0, 'title'],
    publicationDate:    ['pubDate'],
    sportId:            ['sport', 'id'],
    sportName:          ['sport', 'title'],
    stageId:            ['stage', 'id'],
    stageName:          ['stage', 'title'],
    venueId:            ['venue', 'id'],
    venueName:          ['venue', 'title'],
};
 
const playbackMediaDataMap = {
    videoType: ['videoType'],
};
 
const assetDataMap = {
    expireDate: ['expirationDate'],
};
 
const configDataMap = {
    commentatoryLanguage:   ['environment', 'language'],
    interfaceLanguage:      ['environment', 'language'],
};
 
const windowDataMap = {
    applicationType:    ['dazn', 'platform'],
    daznUserAgent:      ['navigator', 'userAgent'],
    countryCode:        ['dazn', 'userProfile', 'UserCountryCode'],
    site:               ['location', 'hostname'],
};
 
const extractMetadataWithDataMap = (source, dataMap) =>
    Object.keys(dataMap).reduce((acc, key) => {
        acc[key] = pathOr(null, dataMap[key], source) || `Unknown ${key}`;
        return acc;
    }, {});
 
const getAccountType = authToken => JSON.parse(atob(authToken.split('.')[1])).userstatus;
const getProductionValue = categories => categories.map(e => e.name).join(', ');
 
const deriveConvivaCustomMetadata = (latestPlayback, latestConfig, latestAsset, window) => {
    const playbackAssetMetadata = extractMetadataWithDataMap(latestPlayback.asset, playbackAssetDataMap);
    const playbackMediaMetadata = extractMetadataWithDataMap(latestPlayback.media, playbackMediaDataMap);
    const assetMetadata         = extractMetadataWithDataMap(latestAsset, assetDataMap);
    const configMetadata        = extractMetadataWithDataMap(latestConfig, configDataMap);
    const windowMetadata        = extractMetadataWithDataMap(window, windowDataMap);
 
    const metadata = {
        applicationVersion: version,
        autoPlay: 'true', // NB: Conviva requires that all custom meta tags be strings
        accountType: getAccountType(latestConfig.environment.authToken),
        productionValue: getProductionValue(latestPlayback.asset.categories),
    };
 
    const unknownValues = {
        deviceCarrier: 'Unknown deviceCarrier',
        deviceConnectionType: 'Unknown deviceConnectionType',
    };
 
    return Object.assign(
        playbackAssetMetadata,
        playbackMediaMetadata,
        assetMetadata,
        configMetadata,
        windowMetadata,
        metadata,
        unknownValues,
    );
};
 
export {
    deriveConvivaCustomMetadata as default,
    extractMetadataWithDataMap,
    getAccountType,
    getProductionValue,
};