rsshub
Version:
Make RSS Great Again!
99 lines (89 loc) • 3.14 kB
text/typescript
import { Route } from '@/types';
// journals form AAAS publishing group
//
// science: Science
// sciadv: Science Advances
// sciimmunol: Science Immunology
// scirobotics: Science Robotics
// signaling: Science Signaling
// stm: Science Translational Medicine
import got from '@/utils/got';
import { load } from 'cheerio';
import { parseDate } from '@/utils/parse-date';
import { art } from '@/utils/render';
import path from 'node:path';
import { baseUrl } from './utils';
export const route: Route = {
path: '/cover',
categories: ['journal'],
example: '/science/cover',
parameters: {},
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: true,
supportBT: false,
supportPodcast: false,
supportScihub: false,
},
radar: [
{
source: ['science.org/'],
},
],
name: 'Cover Story',
maintainers: ['y9c', 'TonyRL'],
handler,
url: 'science.org/',
description: `Subscribe to the cover images of Science journals, and get the latest publication updates in time.
Including 'Science', 'Science Advances', 'Science Immunology', 'Science Robotics', 'Science Signaling' and 'Science Translational Medicine'.`,
};
async function handler() {
const pageURL = `${baseUrl}/journals`;
const { data: pageResponse } = await got(pageURL, {
headers: {
cookie: 'cookiePolicy=iaccept;',
},
});
const $ = load(pageResponse);
const items = $('.browse-journals .browse-journals__item')
.not('.partner-journals')
.toArray()
.map((item) => {
item = $(item);
const name = item.find('.row h2').first().text().trim();
const volume = item
.find('.row li')
.eq(0)
.text()
.trim()
.match(/Volume (\d+)/)[1];
const issue = item
.find('.row li')
.eq(1)
.text()
.trim()
.match(/Issue (\d+)/)[1];
const date = item.find('.row li').eq(2).text().trim();
const coverUrl = `${baseUrl}${item.find('.cover-image__popup-moving-cover').attr('data-cover-src')}`;
const content = $('.cover-image__popup-view__caption-wrapper').html();
const link = $('.browse-journals__item__links a').eq(0).attr('href').replace('/current', '');
return {
title: `${name} | Volume ${volume} Issue ${issue}`,
description: art(path.join(__dirname, 'templates/cover.art'), {
coverUrl,
content,
}),
link: `${baseUrl}/${link}/${volume}/${issue}`,
pubDate: parseDate(date),
};
});
return {
title: $('head title').text(),
description: $('meta[property="og:description"]').attr('content'),
image: `${baseUrl}/apple-touch-icon.png`,
link: pageURL,
language: 'en-US',
item: items,
};
}