Skip to content

Commit 92e6fbf

Browse files
committed
feat: ✨ pixiv 支持切换加载原图/非原图
#313
1 parent b8cd45b commit 92e6fbf

3 files changed

Lines changed: 81 additions & 25 deletions

File tree

src/helper/other.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -653,8 +653,8 @@ export const onUrlChange = (
653653
/** wait,但是只在 url 变化时判断 */
654654
export const waitUrlChange = (isValidUrl: () => unknown) =>
655655
new Promise<void>((resolve) => {
656-
const abort = onUrlChange(() => {
657-
if (!isValidUrl()) return;
656+
const abort = onUrlChange(async () => {
657+
if (!(await isValidUrl())) return;
658658
resolve();
659659
abort();
660660
});

src/index.ts

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -933,29 +933,7 @@ try {
933933
// #其他[Pixiv](https://www.pixiv.net)
934934
// test: https://www.pixiv.net/artworks/128841242
935935
case 'www.pixiv.net': {
936-
let imgList: string[] = [];
937-
938-
options = {
939-
name: 'pixiv',
940-
getImgList: () => imgList,
941-
SPA: {
942-
async isMangaPage() {
943-
const id = Number(location.pathname.split('/')[2]);
944-
if (!id || !location.pathname.startsWith('/artworks/')) {
945-
imgList.length = 0;
946-
return false;
947-
}
948-
949-
type resData = { body: { urls: { original: string } }[] };
950-
const res = await request<resData>(`/ajax/illust/${id}/pages`, {
951-
responseType: 'json',
952-
});
953-
imgList = res.response.body.map((e) => e.urls.original);
954-
return imgList.length > 1;
955-
},
956-
},
957-
initOptions: { autoShow: false, defaultOption: { pageNum: 1 } },
958-
};
936+
inject('site/pixiv');
959937
break;
960938
}
961939

src/site/pixiv.tsx

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import { createEffectOn, onUrlChange, waitUrlChange } from 'helper';
2+
import { request, useInit } from 'main';
3+
4+
(async () => {
5+
let imgs: {
6+
urls: { original: string; regular: string };
7+
height: number;
8+
width: number;
9+
}[] = [];
10+
11+
const isMangaPage = async () => {
12+
const id = Number(location.pathname.split('/')[2]);
13+
if (!id || !location.pathname.startsWith('/artworks/')) {
14+
imgs.length = 0;
15+
return false;
16+
}
17+
18+
const res = await request<{ body: typeof imgs }>(
19+
`/ajax/illust/${id}/pages`,
20+
{ responseType: 'json' },
21+
);
22+
imgs = res.response.body;
23+
return imgs.length > 1;
24+
};
25+
await waitUrlChange(isMangaPage);
26+
27+
const { store, setState, showComic, init } = await useInit('pixiv', {
28+
autoShow: false,
29+
defaultOption: { pageNum: 1 },
30+
/** 加载原图 */
31+
load_original_image: true,
32+
});
33+
34+
// 在切换时重新获取图片
35+
createEffectOn(
36+
() => store.options.load_original_image,
37+
(isOriginal, prev) => {
38+
setState('nowComic', isOriginal ? 'original' : 'regular');
39+
if (prev) showComic();
40+
},
41+
);
42+
43+
const getImgList = (isOriginal: boolean) => () =>
44+
imgs.map((img) => {
45+
const src = isOriginal ? img.urls.original : img.urls.regular;
46+
return { src, height: img.height, width: img.width };
47+
});
48+
49+
setState((state) => {
50+
state.comicMap.original = {
51+
getImgList: getImgList(true),
52+
imgList: getImgList(true)(),
53+
};
54+
state.comicMap.regular = {
55+
getImgList: getImgList(false),
56+
imgList: getImgList(false)(),
57+
};
58+
});
59+
60+
init();
61+
62+
onUrlChange(async (lastUrl) => {
63+
if (!lastUrl) return;
64+
65+
if (!isMangaPage())
66+
return setState((state) => {
67+
state.fab.show = false;
68+
state.manga.show = false;
69+
});
70+
71+
setState((state) => {
72+
state.fab.show = undefined;
73+
state.manga.show = false;
74+
});
75+
76+
if (store.options.autoShow) await showComic();
77+
});
78+
})();

0 commit comments

Comments
 (0)