Skip to content

Commit

Permalink
feat: add NWMU router. (#17996)
Browse files Browse the repository at this point in the history
* Update package.json

* Update package.json

* feat: add RSS subscription for (NWMU) Northwestern Minzu University.

* fix: fix array generation forms for dom-parser.

* fix: fix url replacing behavior.

* fix: fix cover images, typos and maintainer.

* fix: remove router from deprecated routers.

* fix: fix router name and example.

* fix: fix items limit.

* fix: fix date parser.

* fix: use cache for the RSS data.

* fix: typo

---------

Co-authored-by: pull[bot] <39814207+pull[bot]@users.noreply.github.com>
  • Loading branch information
PrinOrange and pull[bot] authored Dec 30, 2024
1 parent 8a81b00 commit f569801
Show file tree
Hide file tree
Showing 3 changed files with 188 additions and 0 deletions.
91 changes: 91 additions & 0 deletions lib/routes/xbmu/academic.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
import { DataItem, Route } from '@/types';
import cache from '@/utils/cache';
import got from '@/utils/got';
import { parseDate } from '@/utils/parse-date';
import { load } from 'cheerio';

const BASE_URL = 'https://www.xbmu.edu.cn/xwzx/xsxx.htm';

const handler: Route['handler'] = async () => {
try {
// Fetch the academic page
const { data: listResponse } = await got(BASE_URL);
const $ = load(listResponse);

// Select all list items containing academic information
const ITEM_SELECTOR = 'body > div.container.list-container.ny_mani > div > div.news_list > ul > li';
const listItems = $(ITEM_SELECTOR);

// Map through each list item to extract details
const academicLinkList = await Promise.all(
listItems.toArray().map((element) => {
const rawDate = $(element).find('span').text().trim();
const [day, yearMonth] = rawDate.split('/').map((s) => s.trim());
const formattedDate = parseDate(`${yearMonth}-${day}`).toUTCString();

const title = $(element).find('a').attr('title') || '学术信息';
const relativeHref = $(element).find('a').attr('href') || '';
const link = `https://www.xbmu.edu.cn/${relativeHref.replaceAll('../', '')}`;

return {
date: formattedDate,
title,
link,
};
})
);

return {
title: '西北民族大学学术信息',
description: '西北民族大学近日学术信息',
link: BASE_URL,
image: 'http://210.26.0.114:9090/mdxg/img/weex/default_img.jpg',
item: (await Promise.all(
academicLinkList.map((item) =>
cache.tryGet(item.link, async () => {
const CONTENT_SELECTOR = '#vsb_content > div';
const { data: contentResponse } = await got(item.link);
const contentPage = load(contentResponse);
const content = contentPage(CONTENT_SELECTOR).html() || '';
return {
title: item.title,
pubDate: item.date,
link: item.link,
description: content,
category: ['university'],
guid: item.link,
id: item.link,
image: 'http://210.26.0.114:9090/mdxg/img/weex/default_img.jpg',
content,
updated: item.date,
language: 'zh-cn',
};
})
)
)) as DataItem[],
allowEmpty: true,
language: 'zh-cn',
feedLink: 'https://rsshub.app/xbmu/academic',
id: 'https://rsshub.app/xbmu/academic',
};
} catch (error) {
throw new Error(`Error fetching academic information: ${error}`);
}
};

export const route: Route = {
path: '/academic',
name: '学术信息',
maintainers: ['PrinOrange'],
handler,
categories: ['university'],
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportBT: false,
supportPodcast: false,
supportScihub: false,
},
example: '/xbmu/academic',
};
91 changes: 91 additions & 0 deletions lib/routes/xbmu/announcement.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
import { DataItem, Route } from '@/types';
import cache from '@/utils/cache';
import got from '@/utils/got';
import { parseDate } from '@/utils/parse-date';
import { load } from 'cheerio';

const BASE_URL = 'https://www.xbmu.edu.cn/xwzx/tzgg.htm';

const handler: Route['handler'] = async () => {
try {
// Fetch the announcements page
const { data: listResponse } = await got(BASE_URL);
const $ = load(listResponse);

// Select all list items containing announcement information
const ITEM_SELECTOR = 'body > div.container.list-container.ny_mani > div > div.news_list > ul > li';
const listItems = $(ITEM_SELECTOR);

// Map through each list item to extract details
const announcementLinkList = await Promise.all(
listItems.toArray().map((element) => {
const rawDate = $(element).find('span').text().trim();
const [day, yearMonth] = rawDate.split('/').map((s) => s.trim());
const formattedDate = parseDate(`${yearMonth}-${day}`).toUTCString();

const title = $(element).find('a').attr('title') || '通知公告';
const relativeHref = $(element).find('a').attr('href') || '';
const link = `https://www.xbmu.edu.cn/${relativeHref.replaceAll('../', '')}`;

return {
date: formattedDate,
title,
link,
};
})
);

return {
title: '西北民族大学通知公告',
description: '西北民族大学近日通知公告',
link: BASE_URL,
image: 'http://210.26.0.114:9090/mdxg/img/weex/default_img.jpg',
item: (await Promise.all(
announcementLinkList.map((item) =>
cache.tryGet(item.link, async () => {
const CONTENT_SELECTOR = '#vsb_content > div';
const { data: contentResponse } = await got(item.link);
const contentPage = load(contentResponse);
const content = contentPage(CONTENT_SELECTOR).html() || '';
return {
title: item.title,
pubDate: item.date,
link: item.link,
description: content,
category: ['university'],
guid: item.link,
id: item.link,
image: 'http://210.26.0.114:9090/mdxg/img/weex/default_img.jpg',
content,
updated: item.date,
language: 'zh-cn',
};
})
)
)) as DataItem[],
allowEmpty: true,
language: 'zh-cn',
feedLink: 'https://rsshub.app/xbmu/announcement',
id: 'https://rsshub.app/xbmu/announcement',
};
} catch (error) {
throw new Error(`Error fetching announcements: ${error}`);
}
};

export const route: Route = {
path: '/announcement',
name: '通知公告',
maintainers: ['PrinOrange'],
handler,
categories: ['university'],
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportBT: false,
supportPodcast: false,
supportScihub: false,
},
example: '/xbmu/announcement',
};
6 changes: 6 additions & 0 deletions lib/routes/xbmu/namespace.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import type { Namespace } from '@/types';

export const namespace: Namespace = {
name: '西北民族大学',
url: 'www.xbmu.edu.cn',
};

0 comments on commit f569801

Please sign in to comment.