rsshub
Version:
Make RSS Great Again!
412 lines (340 loc) • 17.4 kB
text/typescript
import { Route } from '@/types';
import cache from '@/utils/cache';
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';
export const route: Route = {
path: '/:category?',
categories: ['new-media'],
example: '/thoughtco',
parameters: { category: 'Category id, see below' },
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportBT: false,
supportPodcast: false,
supportScihub: false,
},
name: 'Category',
maintainers: ['nczitzk'],
handler,
description: `#### Science, Tech, Math
| category | id |
| ---------------- | -------------------------- |
| Science | science-4132464 |
| Math | math-4133545 |
| Social Sciences | social-sciences-4133522 |
| Computer Science | computer-science-4133486 |
| Animals & Nature | animals-and-nature-4133421 |
#### Humanities
| category | id |
| ----------------- | --------------------------- |
| History & Culture | history-and-culture-4133356 |
| Visual Arts | visual-arts-4132957 |
| Literature | literature-4133251 |
| English | english-4688281 |
| Geography | geography-4133035 |
| Philosophy | philosophy-4133025 |
| Issues | issues-4133022 |
#### Languages
| category | id |
| ---------------------------- | ---------------- |
| English as a Second Language | esl-4133095 |
| Spanish | spanish-4133085 |
| French | french-4133079 |
| German | german-4133073 |
| Italian | italian-4133069 |
| Japanese | japanese-4133062 |
| Mandarin | mandarin-4133057 |
| Russian | russian-4175265 |
#### Resources
| category | id |
| ---------------------- | ---------------------------- |
| For Students & Parents | for-students-parents-4132588 |
| For Educators | for-educators-4132509 |
| For Adult Learners | for-adult-learners-4132469 |
<details>
<summary>More categories</summary>
#### Science
| category | id |
| ----------------- | --------------------------- |
| Chemistry | chemistry-4133594 |
| Biology | biology-4133580 |
| Physics | physics-4133571 |
| Geology | geology-4133564 |
| Astronomy | astronomy-4133558 |
| Weather & Climate | weather-and-climate-4133550 |
#### Math
| category | id |
| --------------------- | ------------------------------- |
| Math Tutorials | math-tutorials-4133543 |
| Geometry | geometry-4133540 |
| Arithmetic | arithmetic-4133542 |
| Pre Algebra & Algebra | pre-algebra-and-algebra-4133541 |
| Statistics | statistics-4133539 |
| Exponential Decay | exponential-decay-4133528 |
| Worksheets By Grade | worksheets-by-grade-4133526 |
| Resources | math-resources-4133523 |
#### Social Sciences
| category | id |
| ----------- | ------------------- |
| Psychology | psychology-4160512 |
| Sociology | sociology-4133515 |
| Archaeology | archaeology-4133504 |
| Economics | economics-4133521 |
| Ergonomics | ergonomics-4133492 |
#### Computer Science
| category | id |
| ---------------------- | -------------------------------- |
| PHP Programming | php-4133485 |
| Perl | perl-4133481 |
| Python | python-4133477 |
| Java Programming | java-programming-4133478 |
| Javascript Programming | javascript-programming-4133476 |
| Delphi Programming | delphi-programming-4133475 |
| C & C++ Programming | c-and-c-plus-programming-4133470 |
| Ruby Programming | ruby-programming-4133469 |
| Visual Basic | visual-basic-4133468 |
#### Animals and Nature
| category | id |
| ---------------- | ------------------------ |
| Amphibians | amphibians-4133418 |
| Birds | birds-4133416 |
| Habitat Profiles | habitat-profiles-4133412 |
| Mammals | mammals-4133411 |
| Reptiles | reptiles-4133408 |
| Insects | insects-4133406 |
| Marine Life | marine-life-4133393 |
| Forestry | forestry-4133386 |
| Dinosaurs | dinosaurs-4133376 |
| Evolution | evolution-4133366 |
#### History and Culture
| category | id |
| ------------------------------ | ---------------------------------------- |
| American History | american-history-4133354 |
| African American History | african-american-history-4133344 |
| African History | african-history-4133338 |
| Ancient History and Culture | ancient-history-4133336 |
| Asian History | asian-history-4133325 |
| European History | european-history-4133316 |
| Genealogy | genealogy-4133308 |
| Inventions | inventions-4133303 |
| Latin American History | latin-american-history-4133296 |
| Medieval & Renaissance History | medieval-and-renaissance-history-4133289 |
| Military History | military-history-4133285 |
| The 20th Century | 20th-century-4133273 |
| Women's History | womens-history-4133260 |
#### Visual Arts
| category | id |
| ------------- | -------------------- |
| Art & Artists | art-4132956 |
| Architecture | architecture-4132953 |
#### Literature
| category | id |
| ------------------ | -------------------------- |
| Best Sellers | best-sellers-4133250 |
| Classic Literature | classic-literature-4133245 |
| Plays & Drama | plays-and-drama-4133239 |
| Poetry | poetry-4133232 |
| Quotations | quotations-4133229 |
| Shakespeare | shakespeare-4133223 |
| Short Stories | short-stories-4133217 |
| Children's Books | childrens-books-4133216 |
#### English
| category | id |
| --------------- | ----------------------- |
| English Grammar | english-grammar-4133049 |
| Writing | writing-4133048 |
#### Geography
| category | id |
| ------------------------ | ---------------------------------- |
| Basics | geography-basics-4133034 |
| Physical Geography | physical-geography-4133032 |
| Political Geography | political-geography-4133033 |
| Population | population-4133031 |
| Country Information | country-information-4133030 |
| Key Figures & Milestones | key-figures-and-milestones-4133029 |
| Maps | maps-4133027 |
| Urban Geography | urban-geography-4133026 |
#### Philosophy
| category | id |
| ------------------------------ | ---------------------------------------- |
| Philosophical Theories & Ideas | philosophical-theories-and-ideas-4133024 |
| Major Philosophers | major-philosophers-4133023 |
#### Issues
| category | id |
| --------------------------------- | -------------------------------- |
| The U. S. Government | us-government-4133021 |
| U.S. Foreign Policy | us-foreign-policy-4133010 |
| U.S. Liberal Politics | us-liberal-politics-4133009 |
| U.S. Conservative Politics | us-conservative-politics-4133006 |
| Women's Issues | womens-issues-4133002 |
| Civil Liberties | civil-liberties-4132996 |
| The Middle East | middle-east-4132989 |
| Race Relations | race-relations-4132982 |
| Immigration | immigration-4132977 |
| Crime & Punishment | crime-and-punishment-4132972 |
| Canadian Government | canadian-government-4132959 |
| Understanding Types of Government | types-of-government-5179107 |
#### English as a Second Language
| category | id |
| ---------------------------- | ------------------------------------------ |
| Pronunciation & Conversation | esl-pronunciation-and-conversation-4133093 |
| Vocabulary | esl-vocabulary-4133092 |
| Writing Skills | esl-writing-skills-4133091 |
| Reading Comprehension | esl-reading-comprehension-4133090 |
| Grammar | esl-grammar-4133089 |
| Business English | esl-business-english-4133088 |
| Resources for Teachers | resources-for-esl-teachers-4133087 |
#### Spanish
| category | id |
| ----------------- | ----------------------------------- |
| History & Culture | spanish-history-and-culture-4133084 |
| Pronunciation | spanish-pronunciation-4133083 |
| Vocabulary | spanish-vocabulary-4133082 |
| Writing Skills | spanish-writing-skills-4133081 |
| Grammar | spanish-grammar-4133080 |
#### French
| category | id |
| ---------------------------- | -------------------------------------------- |
| Pronunciation & Conversation | french-pronunciation-4133075 |
| Vocabulary | french-vocabulary-4133076 |
| Grammar | french-grammar-4133074 |
| Resources For Teachers | french-resources-for-french-teachers-4133077 |
#### German
| category | id |
| ---------------------------- | ---------------------------------- |
| History & Culture | german-history-and-culture-4133071 |
| Pronunciation & Conversation | german-pronunciation-4133070 |
| Vocabulary | german-vocabulary-4133068 |
| Grammar | german-grammar-4133067 |
#### Italian
| category | id |
| ----------------- | ----------------------------------- |
| History & Culture | italian-history-and-culture-4133065 |
| Vocabulary | italian-vocabulary-4133061 |
| Grammar | italian-grammar-4133063 |
#### Japanese
| category | id |
| ----------------------------- | ------------------------------------ |
| History & Culture | japanese-history-and-culture-4133058 |
| Essential Japanese Vocabulary | japanese-vocabulary-4133060 |
| Japanese Grammar | japanese-grammar-4133056 |
#### Mandarin
| category | id |
| -------------------------------- | ---------------------------------------- |
| Mandarin History and Culture | mandarin-history-and-culture-4133054 |
| Pronunciation | mandarin-pronunciation-4133053 |
| Vocabulary | mandarin-vocabulary-4133052 |
| Understanding Chinese Characters | understanding-chinese-characters-4133051 |
#### Russian
| category | id |
| -------- | --------------- |
| Russian | russian-4175265 |
#### For Students & Parents
| category | id |
| ------------------ | -------------------------- |
| Homework Help | homework-help-4132587 |
| Private School | private-school-4132514 |
| Test Prep | test-prep-4132578 |
| College Admissions | college-admissions-4132565 |
| College Life | college-life-4132553 |
| Graduate School | graduate-school-4132543 |
| Business School | business-school-4132536 |
| Law School | law-school-4132527 |
| Distance Learning | distance-learning-4132521 |
#### For Educators
| category | id |
| -------------------- | ----------------------------- |
| Becoming A Teacher | becoming-a-teacher-4132510 |
| Assessments & Tests | assessments-and-tests-4132508 |
| Elementary Education | elementary-education-4132507 |
| Secondary Education | secondary-education-4132504 |
| Special Education | special-education-4132499 |
| Teaching | teaching-4132488 |
| Homeschooling | homeschooling-4132480 |
#### For Adult Learners
| category | id |
| ----------------------- | ------------------------------- |
| Tips For Adult Students | tips-for-adult-students-4132468 |
| Getting Your Ged | getting-your-ged-4132466 |
</details>`,
};
async function handler(ctx) {
const { category = '' } = ctx.req.param();
const limit = ctx.req.query('limit') ? Number.parseInt(ctx.req.query('limit'), 10) : 50;
const rootUrl = 'https://www.thoughtco.com';
const currentUrl = new URL(category, rootUrl).href;
const { data: response } = await got(currentUrl);
const $ = load(response);
let items = $('a[data-doc-id]')
.slice(0, limit)
.toArray()
.map((item) => {
item = $(item);
return {
title: item.find('span.block-title').text(),
link: new URL(item.prop('href'), rootUrl).href,
};
});
items = await Promise.all(
items.map((item) =>
cache.tryGet(item.link, async () => {
const { data: detailResponse } = await got(item.link);
const content = load(detailResponse);
content('div.adslot').remove();
content('div.sources-and-citation, .mntl-figure-caption svg').remove();
content('div.figure-media').each((_, e) => {
e = $(e);
const image = e.find('img');
e.replaceWith(
art(path.join(__dirname, 'templates/description.art'), {
image: {
src: image.prop('data-src'),
width: image.prop('width'),
height: image.prop('height'),
},
})
);
});
item.title = content('meta[property="og:title"]').prop('content');
item.description = art(path.join(__dirname, 'templates/description.art'), {
image: {
src: content('meta[property="og:image"]').prop('content'),
},
description: content('div.article-content').html(),
});
item.author = content('meta[name="sailthru.author"]').prop('content');
item.category = [
...new Set(
content('meta[name="parsely-tags"]')
.prop('content')
?.split(/,/)
.map((c) => c.trim())
),
];
item.pubDate = parseDate(detailResponse.match(/"datePublished": "(.*?)"/)[1]);
item.updated = parseDate(detailResponse.match(/"dateModified": "(.*?)"/)[1]);
return item;
})
)
);
const author = $('meta[property="og:site_name"]').prop('content');
const title = $('meta[property="og:title"]').prop('content');
const icon = new URL($('link[rel="apple-touch-icon-precomposed"]').prop('href'), rootUrl).href;
return {
item: items,
title: `${author}${title.startsWith(author) ? '' : ` - ${title}`}`,
link: currentUrl,
description: $('meta[property="og:description"]').prop('content'),
language: $('html').prop('lang'),
image: $('meta[property="og:image"]').prop('content'),
icon,
logo: icon,
subtitle: $('meta[property="og:title"]').prop('content'),
author,
};
}