const { DOMAIN } = require('../../config.js'); const { generateStreamUrl } = require('../../ui/util/lbrytv'); const { getClaim } = require('./chainquery'); const { parseURI } = require('lbry-redux'); const fs = require('fs'); const path = require('path'); let html = fs.readFileSync(path.join(__dirname, '/../dist/index.html'), 'utf8'); const defaultHead = 'lbry.tv\n' + `\n` + '\n' + '\n' + '\n' + `\n` + '\n' + `\n` + ''; function insertToHead(fullHtml, htmlToInsert = defaultHead) { return fullHtml.replace(/.*/s, htmlToInsert); } function truncateDescription(description) { return description.length > 200 ? description.substr(0, 200) + '...' : description; } function escapeHtmlProperty(property) { return property ? String(property) .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') .replace(/'/g, ''') : ''; } function buildOgMetadata(uri, claim) { const { isChannel, claimName } = parseURI(uri); const title = escapeHtmlProperty(claim.title ? claim.title : claimName); const claimDescription = claim.description && claim.description.length > 0 ? escapeHtmlProperty(truncateDescription(claim.description)) : `Watch ${title} on LBRY.tv`; const claimLanguage = escapeHtmlProperty(claim.language) || 'en_US'; const claimThumbnail = escapeHtmlProperty(claim.thumbnail_url) || `${DOMAIN}/og.png`; const claimTitle = claim.channel && !isChannel ? `${title} from ${claim.channel} on LBRY.tv` : `${title} on LBRY.tv`; let head = ''; head += ''; head += `${claimTitle}`; head += ``; if (claim.tags) { head += ``; } head += ``; head += ``; head += ``; head += ``; head += ``; head += ``; head += ``; head += ``; // below should be canonical_url, but not provided by chainquery yet head += ``; if (claim.source_media_type && claim.source_media_type.startsWith('video/')) { const videoUrl = generateStreamUrl(claim.name, claim.claim_id); head += ``; head += ``; head += ``; if (claim.frame_width && claim.frame_height) { head += ``; head += ``; } } return head; } module.exports.getHtml = async function getHtml(ctx) { const path = ctx.path; if (path.length === 0 || path[1] === '$') { return insertToHead(html); } const claimUri = path.slice(1).replace(/:/g, '#'); const { isChannel, streamName, channelName, channelClaimId, streamClaimId } = parseURI(claimUri); const claimName = isChannel ? '@' + channelName : streamName; const claimId = isChannel ? channelClaimId : streamClaimId; const rows = await getClaim(claimName, claimId, channelName, channelClaimId); if (!rows || !rows.length) { return insertToHead(html); } const claim = rows[0]; const ogMetadata = buildOgMetadata(claimUri, claim); return insertToHead(html, ogMetadata); };