Skip to content

Commit cc23a80

Browse files
authored
feat(route/pixiv): add language attributes for novels (#17667)
* feat(route/pixiv): add language tags for novels * rm redundant elements
1 parent 7c4d3cc commit cc23a80

File tree

8 files changed

+38
-21
lines changed

8 files changed

+38
-21
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import cache from '@/utils/cache';
2+
import got from '@/utils/got';
3+
import { load } from 'cheerio';
4+
5+
export async function getNovelLanguage(novelId: string): Promise<string> {
6+
return (await cache.tryGet(`https://www.pixiv.net/novel/show.php?id=${novelId}`, async () => {
7+
const rsp = await got(`https://www.pixiv.net/novel/show.php?id=${novelId}`);
8+
const $ = load(rsp.data);
9+
const data = JSON.parse($('#meta-preload-data').attr('content'));
10+
return data?.novel[novelId].language;
11+
})) as string;
12+
}

lib/routes/pixiv/novel-api/content/nsfw.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import queryString from 'query-string';
66
import { parseNovelContent } from './utils';
77
import type { NovelContent, NSFWNovelDetail } from './types';
88
import { parseDate } from '@/utils/parse-date';
9+
import { getNovelLanguage } from './common';
910

1011
export async function getNSFWNovelContent(novelId: string, token: string): Promise<NovelContent> {
1112
return (await cache.tryGet(`https://app-api.pixiv.net/webview/v2/novel:${novelId}`, async () => {
@@ -43,6 +44,8 @@ export async function getNSFWNovelContent(novelId: string, token: string): Promi
4344

4445
const parsedContent = await parseNovelContent(novelDetail.text, images, token);
4546

47+
const language = await getNovelLanguage(novelId);
48+
4649
return {
4750
id: novelDetail.id,
4851
title: novelDetail.title,
@@ -68,6 +71,8 @@ export async function getNSFWNovelContent(novelId: string, token: string): Promi
6871

6972
seriesId: novelDetail.seriesId || null,
7073
seriesTitle: novelDetail.seriesTitle || null,
74+
75+
language,
7176
};
7277
})) as NovelContent;
7378
}

lib/routes/pixiv/novel-api/content/sfw.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import pixivUtils from '../../utils';
44
import { parseNovelContent } from './utils';
55
import { NovelContent, SFWNovelDetail } from './types';
66
import { parseDate } from '@/utils/parse-date';
7+
import { getNovelLanguage } from './common';
78

89
const baseUrl = 'https://www.pixiv.net';
910

@@ -33,6 +34,8 @@ export async function getSFWNovelContent(novelId: string): Promise<NovelContent>
3334

3435
const parsedContent = await parseNovelContent(novelDetail.body.content, images);
3536

37+
const language = await getNovelLanguage(novelId);
38+
3639
return {
3740
id: body.id,
3841
title: body.title,
@@ -58,6 +61,8 @@ export async function getSFWNovelContent(novelId: string): Promise<NovelContent>
5861

5962
seriesId: body.seriesNavData?.seriesId?.toString() || null,
6063
seriesTitle: body.seriesNavData?.title || null,
64+
65+
language,
6166
};
6267
})) as NovelContent;
6368
}

lib/routes/pixiv/novel-api/content/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ export interface NovelContent {
2121

2222
seriesId: string | null;
2323
seriesTitle: string | null;
24+
25+
language: string | null;
2426
}
2527

2628
export interface SFWNovelDetail {

lib/routes/pixiv/novel-api/series/nsfw.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,11 @@ export async function getNSFWSeriesNovels(seriesId: string, limit: number = 10):
5757
title: `#${chapterStartNum + index} ${novelContent.title}`,
5858
description: `
5959
<img src="${pixivUtils.getProxiedImageUrl(novelContent.coverUrl)}" />
60+
<div lang="${novelContent.language}">
6061
<p>${novelContent.description}</p>
61-
<p>
62-
收藏數:${novelContent.bookmarkCount}<br>
63-
閱覧數:${novelContent.viewCount}<br>
64-
喜歡數:${novelContent.likeCount}<br>
65-
</p><hr>
62+
<hr>
6663
${novelContent.content}
64+
</div>
6765
`,
6866
link: `${baseUrl}/novel/show.php?id=${novelContent.id}`,
6967
pubDate: novelContent.createDate,

lib/routes/pixiv/novel-api/series/sfw.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,11 @@ export async function getSFWSeriesNovels(seriesId: string, limit: number = 10):
4545
title: `#${chapterStartNum + index} ${novelContent.title}`,
4646
description: `
4747
<img src="${pixivUtils.getProxiedImageUrl(novelContent.coverUrl)}" />
48+
<div lang="${novelContent.language}">
4849
<p>${novelContent.description}</p>
49-
<p>
50-
收藏數:${novelContent.bookmarkCount}<br>
51-
閱覧數:${novelContent.viewCount}<br>
52-
喜歡數:${novelContent.likeCount}<br>
53-
</p><hr>
50+
<hr>
5451
${novelContent.content}
52+
</div>
5553
`,
5654
link: `${baseUrl}/novel/show.php?id=${novelContent.id}`,
5755
pubDate: novelContent.createDate,

lib/routes/pixiv/novel-api/user-novels/nsfw.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import ConfigNotFoundError from '@/errors/types/config-not-found';
1111
import cache from '@/utils/cache';
1212
import { getToken } from '../../token';
1313
import InvalidParameterError from '@/errors/types/invalid-parameter';
14+
import { getNovelLanguage } from '../content/common';
1415

1516
function getNovels(user_id: string, token: string): Promise<NSFWNovelsResponse> {
1617
return got('https://app-api.pixiv.net/v1/user/novels', {
@@ -46,17 +47,14 @@ export async function getNSFWUserNovels(id: string, fullContent: boolean = false
4647

4748
const items = await Promise.all(
4849
novels.map(async (novel) => {
50+
const language = await getNovelLanguage(novel.id);
4951
const baseItem = {
5052
title: novel.series?.title ? `${novel.series.title} - ${novel.title}` : novel.title,
5153
description: `
5254
<img src="${pixivUtils.getProxiedImageUrl(novel.image_urls.large)}" />
55+
<div lang="${language}">
5356
<p>${convertPixivProtocolExtended(novel.caption)}</p>
54-
<p>
55-
字數:${novel.text_length}<br>
56-
閱覽數:${novel.total_view}<br>
57-
收藏數:${novel.total_bookmarks}<br>
58-
評論數:${novel.total_comments}<br>
59-
</p>`,
57+
</div>`,
6058
author: novel.user.name,
6159
pubDate: parseDate(novel.create_date),
6260
link: `https://www.pixiv.net/novel/show.php?id=${novel.id}`,

lib/routes/pixiv/novel-api/user-novels/sfw.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { parseDate } from '@/utils/parse-date';
33
import pixivUtils from '../../utils';
44
import { getSFWNovelContent } from '../content/sfw';
55
import type { SFWNovelsResponse, NovelList } from './types';
6+
import { getNovelLanguage } from '../content/common';
67

78
const baseUrl = 'https://www.pixiv.net';
89

@@ -36,16 +37,14 @@ export async function getSFWUserNovels(id: string, fullContent: boolean = false,
3637

3738
const items = await Promise.all(
3839
Object.values(data.body.works).map(async (item) => {
40+
const language = await getNovelLanguage(item.id);
3941
const baseItem = {
4042
title: item.title,
4143
description: `
4244
<img src=${pixivUtils.getProxiedImageUrl(item.url)} />
45+
<div lang="${language}">
4346
<p>${item.description}</p>
44-
<p>
45-
字數:${item.textCount}<br>
46-
閱讀時間:${item.readingTime} 分鐘<br>
47-
收藏數:${item.bookmarkCount}<br>
48-
</p>
47+
</div>
4948
`,
5049
link: `${baseUrl}/novel/show.php?id=${item.id}`,
5150
author: item.userName,

0 commit comments

Comments
 (0)