Add Google Video Search metadata

## Issue
5870: Add metadata for google video search
This commit is contained in:
infinite-persistence 2021-04-14 16:13:38 +08:00 committed by Sean Yesmunt
parent 1b6c217226
commit 166d2f9049

View file

@ -8,13 +8,14 @@ const {
SITE_DESCRIPTION, SITE_DESCRIPTION,
SITE_NAME, SITE_NAME,
} = require('../../config.js'); } = require('../../config.js');
const { generateEmbedUrl, generateStreamUrl } = require('../../ui/util/web'); const { generateEmbedUrl, generateStreamUrl, generateDirectUrl } = require('../../ui/util/web');
const PAGES = require('../../ui/constants/pages'); const PAGES = require('../../ui/constants/pages');
const { CATEGORY_METADATA } = require('./category-metadata'); const { CATEGORY_METADATA } = require('./category-metadata');
const { getClaim } = require('./chainquery'); const { getClaim } = require('./chainquery');
const { parseURI } = require('lbry-redux'); const { parseURI } = require('lbry-redux');
const fs = require('fs'); const fs = require('fs');
const path = require('path'); const path = require('path');
const moment = require('moment');
const removeMd = require('remove-markdown'); const removeMd = require('remove-markdown');
const { getJsBundleId } = require('../bundle-id.js'); const { getJsBundleId } = require('../bundle-id.js');
const jsBundleId = getJsBundleId(); const jsBundleId = getJsBundleId();
@ -166,6 +167,40 @@ function buildClaimOgMetadata(uri, claim, overrideOptions = {}) {
return head; return head;
} }
function buildGoogleVideoMetadata(claimUri, claim) {
if (!claim.source_media_type || !claim.source_media_type.startsWith('video/')) {
return '';
}
const { claimName } = parseURI(claimUri);
const claimTitle = escapeHtmlProperty(claim.title ? claim.title : claimName);
const claimDescription =
claim.description && claim.description.length > 0
? escapeHtmlProperty(truncateDescription(claim.description))
: `View ${claimTitle} on ${SITE_NAME}`;
const claimThumbnail = escapeHtmlProperty(claim.thumbnail_url) || OG_IMAGE_URL || `${URL}/public/v2-og.png`;
const releaseTime = claim.release_time || 0;
// https://developers.google.com/search/docs/data-types/video
const googleVideoMetadata = {
// --- Must ---
'@context': 'https://schema.org',
'@type': 'VideoObject',
name: `${claimTitle}`,
description: `${removeMd(claimDescription)}`,
thumbnailUrl: `${claimThumbnail}`,
uploadDate: `${new Date(releaseTime * 1000).toISOString()}`,
// --- Recommended ---
duration: moment.duration(claim.duration).toISOString(),
contentUrl: generateDirectUrl(claim.name, claim.claim_id),
embedUrl: generateEmbedUrl(claim.name, claim.claim_id),
};
return (
'<script type="application/ld+json">\n' + JSON.stringify(googleVideoMetadata, null, ' ') + '\n' + '</script>\n'
);
}
async function getClaimFromChainqueryOrRedirect(ctx, url, ignoreRedirect = false) { async function getClaimFromChainqueryOrRedirect(ctx, url, ignoreRedirect = false) {
const { isChannel, streamName, channelName, channelClaimId, streamClaimId } = parseURI(url); const { isChannel, streamName, channelName, channelClaimId, streamClaimId } = parseURI(url);
const claimName = isChannel ? '@' + channelName : streamName; const claimName = isChannel ? '@' + channelName : streamName;
@ -231,7 +266,8 @@ async function getHtml(ctx) {
if (claim) { if (claim) {
const ogMetadata = buildClaimOgMetadata(claimUri, claim); const ogMetadata = buildClaimOgMetadata(claimUri, claim);
return insertToHead(html, ogMetadata); const googleVideoMetadata = buildGoogleVideoMetadata(claimUri, claim);
return insertToHead(html, ogMetadata.concat('\n', googleVideoMetadata));
} }
return insertToHead(html); return insertToHead(html);
@ -253,7 +289,8 @@ async function getHtml(ctx) {
if (claim) { if (claim) {
const ogMetadata = buildClaimOgMetadata(claimUri, claim); const ogMetadata = buildClaimOgMetadata(claimUri, claim);
return insertToHead(html, ogMetadata); const googleVideoMetadata = buildGoogleVideoMetadata(claimUri, claim);
return insertToHead(html, ogMetadata.concat('\n', googleVideoMetadata));
} }
} }