RSS: Switch from ChainQuery to SDK
## Issue 3779 RSS feed for channels
This commit is contained in:
parent
49046c9d25
commit
c84d820b09
2 changed files with 54 additions and 40 deletions
|
@ -58,21 +58,3 @@ module.exports.getClaim = async function getClaim(claimName, claimId, channelNam
|
||||||
|
|
||||||
return queryPool(sql, params);
|
return queryPool(sql, params);
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports.getChannelClaim = async function getChannelClaim(channelClaimId) {
|
|
||||||
const params = [];
|
|
||||||
const select = ['claim_id', 'name', 'title', 'thumbnail_url', 'description'].join(', ');
|
|
||||||
|
|
||||||
const sql = `SELECT ${select} FROM claim WHERE claim_id = "${channelClaimId}"`;
|
|
||||||
return queryPool(sql, params);
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports.getClaimsFromChannel = async function getClaimsFromChannel(channelClaimId, count = 10) {
|
|
||||||
const params = [];
|
|
||||||
const select = ['claim_id', 'name', 'title', 'thumbnail_url', 'description', 'created_at'].join(', ');
|
|
||||||
const sort = 'ORDER BY created_at DESC';
|
|
||||||
const limit = `LIMIT ${count}`;
|
|
||||||
|
|
||||||
const sql = `SELECT ${select} FROM claim WHERE publisher_id = "${channelClaimId}" ${sort} ${limit}`;
|
|
||||||
return queryPool(sql, params);
|
|
||||||
};
|
|
||||||
|
|
|
@ -1,27 +1,56 @@
|
||||||
const { URL, SITE_NAME } = require('../../config.js');
|
const { URL, SITE_NAME, LBRY_WEB_API } = require('../../config.js');
|
||||||
const { getChannelClaim, getClaimsFromChannel } = require('./chainquery');
|
const { Lbry } = require('lbry-redux');
|
||||||
const Feed = require('feed').Feed;
|
const Feed = require('feed').Feed;
|
||||||
|
|
||||||
async function getChannelClaimFromChainquery(claimId) {
|
const SDK_API_PATH = `${LBRY_WEB_API}/api/v1`;
|
||||||
const rows = await getChannelClaim(claimId);
|
const proxyURL = `${SDK_API_PATH}/proxy`;
|
||||||
if (rows && rows.length) {
|
Lbry.setDaemonConnectionString(proxyURL);
|
||||||
const claim = rows[0];
|
|
||||||
return claim;
|
|
||||||
}
|
|
||||||
|
|
||||||
return undefined;
|
async function doClaimSearch(options) {
|
||||||
|
let results;
|
||||||
|
try {
|
||||||
|
results = await Lbry.claim_search(options);
|
||||||
|
} catch {}
|
||||||
|
return results ? results.items : undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getChannelClaim(claimId) {
|
||||||
|
const options = {
|
||||||
|
claim_ids: [claimId],
|
||||||
|
page_size: 1,
|
||||||
|
no_totals: true,
|
||||||
|
};
|
||||||
|
|
||||||
|
const claims = await doClaimSearch(options);
|
||||||
|
return claims ? claims[0] : undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getClaimsFromChannel(claimId, count) {
|
||||||
|
const options = {
|
||||||
|
channel_ids: [claimId],
|
||||||
|
page_size: count,
|
||||||
|
has_source: true,
|
||||||
|
claim_type: 'stream',
|
||||||
|
order_by: ['creation_timestamp'],
|
||||||
|
no_totals: true,
|
||||||
|
};
|
||||||
|
|
||||||
|
return await doClaimSearch(options);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getFeed(channelClaim) {
|
async function getFeed(channelClaim) {
|
||||||
const replaceLineFeeds = (str) => str.replace(/(?:\r\n|\r|\n)/g, '<br>');
|
const replaceLineFeeds = (str) => str.replace(/(?:\r\n|\r|\n)/g, '<br>');
|
||||||
|
|
||||||
|
const value = channelClaim.value;
|
||||||
|
const title = value ? value.title : channelClaim.name;
|
||||||
|
|
||||||
const options = {
|
const options = {
|
||||||
title: channelClaim.title + ' on ' + SITE_NAME,
|
title: title + ' on ' + SITE_NAME,
|
||||||
description: channelClaim.description ? replaceLineFeeds(channelClaim.description) : '',
|
description: value ? replaceLineFeeds(value.description) : '',
|
||||||
link: `${URL}/${channelClaim.name}:${channelClaim.claim_id}`,
|
link: `${URL}/${channelClaim.name}:${channelClaim.claim_id}`,
|
||||||
favicon: URL + '/public/favicon.png',
|
favicon: URL + '/public/favicon.png',
|
||||||
generator: SITE_NAME + ' RSS Feed',
|
generator: SITE_NAME + ' RSS Feed',
|
||||||
image: channelClaim.thumbnail_url,
|
image: value ? value.thumbnail.url : '',
|
||||||
author: {
|
author: {
|
||||||
name: channelClaim.name,
|
name: channelClaim.name,
|
||||||
link: URL + '/' + channelClaim.name + ':' + channelClaim.claim_id,
|
link: URL + '/' + channelClaim.name + ':' + channelClaim.claim_id,
|
||||||
|
@ -30,17 +59,20 @@ async function getFeed(channelClaim) {
|
||||||
|
|
||||||
const feed = new Feed(options);
|
const feed = new Feed(options);
|
||||||
|
|
||||||
const latestClaims = await getClaimsFromChannel(channelClaim.claim_id, 10);
|
const latestClaims = await getClaimsFromChannel(channelClaim.claim_id, 50);
|
||||||
|
|
||||||
latestClaims.forEach((c) => {
|
latestClaims.forEach((c) => {
|
||||||
|
const meta = c.meta;
|
||||||
|
const value = c.value;
|
||||||
|
|
||||||
feed.addItem({
|
feed.addItem({
|
||||||
guid: c.claim_id,
|
guid: c.claim_id,
|
||||||
id: c.claim_id,
|
id: c.claim_id,
|
||||||
title: c.title,
|
title: value ? value.title : c.name,
|
||||||
description: c.description ? replaceLineFeeds(c.description) : '',
|
description: value ? replaceLineFeeds(value.description) : '',
|
||||||
image: c.thumbnail_url,
|
image: value ? value.thumbnail.url : '',
|
||||||
link: URL + '/' + c.name + ':' + c.claim_id,
|
link: URL + '/' + c.name + ':' + c.claim_id,
|
||||||
date: new Date(c.created_at),
|
date: new Date(meta ? meta.creation_timestamp * 1000 : null),
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -52,13 +84,13 @@ async function getRss(ctx) {
|
||||||
return 'Invalid URL';
|
return 'Invalid URL';
|
||||||
}
|
}
|
||||||
|
|
||||||
const channelClaim = await getChannelClaimFromChainquery(ctx.params.claimId);
|
const channelClaim = await getChannelClaim(ctx.params.claimId);
|
||||||
if (channelClaim) {
|
if (typeof channelClaim === 'string' || !channelClaim) {
|
||||||
const feed = await getFeed(channelClaim);
|
return channelClaim;
|
||||||
return feed.rss2();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 'Invalid channel';
|
const feed = await getFeed(channelClaim);
|
||||||
|
return feed.rss2();
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = { getRss };
|
module.exports = { getRss };
|
||||||
|
|
Loading…
Reference in a new issue