Skip to content

Commit

Permalink
feat(route): add route of ζ„ζž— (DIYgod#16831)
Browse files Browse the repository at this point in the history
* feat(route): add route of ζ„ζž—

* fix: solve review

* fix: solve review

* fix: solve review

* fix: solve review
  • Loading branch information
g0ngjie committed Sep 22, 2024
1 parent 20ef6f2 commit 558207e
Show file tree
Hide file tree
Showing 3 changed files with 169 additions and 0 deletions.
58 changes: 58 additions & 0 deletions lib/routes/yilinzazhi/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import { Data, DataItem, Route } from '@/types';
import cache from '@/utils/cache';
import got from '@/utils/got';
import { load } from 'cheerio';

export const route: Route = {
path: '/',
categories: ['reading'],
example: '/yilinzazhi',
radar: [
{
source: ['www.yilinzazhi.com'],
target: '/',
},
],
name: 'ζ–‡η« εˆ—θ‘¨',
maintainers: ['g0ngjie'],
handler,
url: 'www.yilinzazhi.com',
};

async function handler(): Promise<Data> {
const baseUrl = 'https://www.yilinzazhi.com/';
const response = await got(baseUrl);
const $ = load(response.data);
const contents: DataItem[] = $('section.content')
.find('li')
.map((_, target) => {
const li = $(target);

const aTag = li.find('a');
const title = aTag.text();
const link = baseUrl + aTag.attr('href');

return {
title,
link,
description: '',
};
})
.toArray();

const items = (await Promise.all(
contents.map((content) =>
cache.tryGet(content.link!, async () => {
const childRes = await got(content.link);
const $$ = load(childRes.data);
content.description = $$('.maglistbox').html()!;
return content;
})
)
)) as DataItem[];
return {
title: 'ζ„ζž—ζ‚εΏ—η½‘',
link: baseUrl,
item: items,
};
}
103 changes: 103 additions & 0 deletions lib/routes/yilinzazhi/latest.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
import { Data, DataItem, Route } from '@/types';
import cache from '@/utils/cache';
import got from '@/utils/got';
import { load } from 'cheerio';
import dayjs from 'dayjs';

export const route: Route = {
path: '/latest',
categories: ['reading'],
example: '/yilinzazhi/latest',
radar: [
{
source: ['www.yilinzazhi.com'],
target: '/',
},
],
name: 'θΏ‘ζœŸζ–‡η« ζ±‡ζ€»',
maintainers: ['g0ngjie'],
handler,
url: 'www.yilinzazhi.com',
description: 'ζœ€θΏ‘δΈ€ζœŸηš„ζ–‡η« ζ±‡ζ€»',
};

type Stage = {
link: string;
title: string;
};

type Catalog = {
title: string;
tables: Data[];
};

async function handler(): Promise<Data> {
const baseUrl = 'https://www.yilinzazhi.com/';
const response = await got(baseUrl);
const $ = load(response.data);

const currentYear = dayjs().year();
const yearSection = $('.year-section')
.toArray()
.find((el) =>
$(el)
.find('.year-title')
.text()
.includes(currentYear + '')
);

const stage = $(yearSection!)
.find('a')
.map<typeof yearSection, Stage>(function () {
const aTag = $(this);
const link = baseUrl + aTag.attr('href');
const title = aTag.text();
return { link, title };
})
.toArray()[0];

const catalogs = (await cache.tryGet(stage.link, async () => {
const stageRes = await got(stage.link);
const $$ = load(stageRes.data);
const catalogsEl = $$('.maglistbox dl').toArray();
const children = catalogsEl.map<Catalog>((catalog) => {
const title = $$(catalog).find('dt span').text();
const tables = $$(catalog)
.find('a')
.toArray()
.map<Data>((aTag) => {
const href = $$(aTag).attr('href')!;
const yearType = currentYear + href.substring(4, 5);
return {
title: $$(aTag).text(),
link: `${baseUrl}${currentYear}/yl${yearType}/${href}`,
};
});
return { title, tables };
});
return children;
})) as Catalog[];

const contents: Data[] = catalogs.flatMap((catalog) => catalog.tables);

const items = (await Promise.all(
contents.map(
async (target) =>
await cache.tryGet(target.link!, async () => {
const detailRes = await got(target.link);
const $$ = load(detailRes.data);
const detailContainer = $$('.blkContainerSblk.collectionContainer');

target.description = detailContainer.html()!;

return target;
})
)
)) as DataItem[];

return {
title: 'ζ„ζž— - θΏ‘ζœŸζ–‡η« ζ±‡ζ€»',
link: stage.link,
item: items,
};
}
8 changes: 8 additions & 0 deletions lib/routes/yilinzazhi/namespace.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import type { Namespace } from '@/types';

export const namespace: Namespace = {
name: 'ζ„ζž—ζ‚εΏ—',
url: 'www.yilinzazhi.com',
categories: ['reading'],
description: '',
};

0 comments on commit 558207e

Please sign in to comment.