@riffyh/adapter-niyaniya 1.0.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -43,59 +43,55 @@ const getBookImage = async (size, bookId, bookKey, dataId, dataKey, crt, userAge
43
43
  };
44
44
  //#endregion
45
45
  //#region src/constants/namespace.ts
46
- let Namespace = /* @__PURE__ */ function(Namespace) {
47
- Namespace[Namespace["Artist"] = 1] = "Artist";
48
- Namespace[Namespace["Circle"] = 2] = "Circle";
49
- Namespace[Namespace["Parody"] = 3] = "Parody";
50
- Namespace[Namespace["Magazine"] = 4] = "Magazine";
51
- Namespace[Namespace["Character"] = 5] = "Character";
52
- Namespace[Namespace["Cosplayer"] = 6] = "Cosplayer";
53
- Namespace[Namespace["Uploader"] = 7] = "Uploader";
54
- Namespace[Namespace["Male"] = 8] = "Male";
55
- Namespace[Namespace["Female"] = 9] = "Female";
56
- Namespace[Namespace["Mixed"] = 10] = "Mixed";
57
- Namespace[Namespace["Language"] = 11] = "Language";
58
- Namespace[Namespace["Other"] = 12] = "Other";
59
- Namespace[Namespace["Reclass"] = 13] = "Reclass";
60
- return Namespace;
61
- }({});
62
46
  const namespace = {
63
- [Namespace.Artist]: "artist",
64
- [Namespace.Circle]: "circle",
65
- [Namespace.Parody]: "parody",
66
- [Namespace.Magazine]: "magazine",
67
- [Namespace.Character]: "character",
68
- [Namespace.Cosplayer]: "cosplayer",
69
- [Namespace.Uploader]: "uploader",
70
- [Namespace.Male]: "male",
71
- [Namespace.Female]: "female",
72
- [Namespace.Mixed]: "mixed",
73
- [Namespace.Language]: "language",
74
- [Namespace.Other]: "other",
75
- [Namespace.Reclass]: "reclass"
47
+ [1]: "artist",
48
+ [2]: "circle",
49
+ [3]: "parody",
50
+ [4]: "magazine",
51
+ [5]: "character",
52
+ [6]: "cosplayer",
53
+ [7]: "uploader",
54
+ [8]: "male",
55
+ [9]: "female",
56
+ [10]: "mixed",
57
+ [11]: "language",
58
+ [12]: "other",
59
+ [13]: "reclass"
76
60
  };
77
61
  //#endregion
78
62
  //#region src/constants/tagTypeMap.ts
79
63
  const tagTypeMap = {
80
- [Namespace.Artist]: TagType.Artist,
81
- [Namespace.Circle]: TagType.Artist,
82
- [Namespace.Parody]: TagType.Parody,
83
- [Namespace.Magazine]: TagType.Group,
84
- [Namespace.Character]: TagType.Character,
85
- [Namespace.Cosplayer]: TagType.Character,
86
- [Namespace.Uploader]: TagType.Tag,
87
- [Namespace.Male]: TagType.Tag,
88
- [Namespace.Female]: TagType.Tag,
89
- [Namespace.Mixed]: TagType.Tag,
90
- [Namespace.Language]: TagType.Language,
91
- [Namespace.Other]: TagType.Tag,
92
- [Namespace.Reclass]: TagType.Tag
64
+ [1]: TagType.Artist,
65
+ [2]: TagType.Artist,
66
+ [3]: TagType.Parody,
67
+ [4]: TagType.Group,
68
+ [5]: TagType.Character,
69
+ [6]: TagType.Character,
70
+ [7]: TagType.Tag,
71
+ [8]: TagType.Tag,
72
+ [9]: TagType.Tag,
73
+ [10]: TagType.Tag,
74
+ [11]: TagType.Language,
75
+ [12]: TagType.Tag,
76
+ [13]: TagType.Tag
93
77
  };
94
78
  //#endregion
95
- //#region src/getGalery.ts
79
+ //#region src/language.ts
80
+ const languageMap = {
81
+ english: "en",
82
+ chinese: "cn"
83
+ };
84
+ const languageKey = Object.keys(languageMap);
85
+ const getLanugageByTags = (tags) => {
86
+ const languageTag = tags.find((tag) => tag.namespace === 11 && languageKey.includes(tag.name));
87
+ if (languageTag) return languageMap[languageTag.name] || null;
88
+ return null;
89
+ };
90
+ //#endregion
91
+ //#region src/getGallery.ts
96
92
  const getGallery = async ({ id }, options) => {
97
93
  const [bookId, bookKey] = id.split(".");
98
- if (!bookId || !bookKey) throw new Error("unalbe to parse ids");
94
+ if (!bookId || !bookKey) throw new Error("unable to parse ids");
99
95
  const [bookDetail, bookData] = await Promise.all([getBookDetail(bookId, bookKey, options.userAgent), getBookData(bookId, bookKey, options.crt, options.userAgent)]);
100
96
  const maxSize = Math.max(...Object.keys(bookData.data).map((v) => Number(v)));
101
97
  const bookImages = await getBookImage(maxSize, bookId, bookKey, bookData.data[maxSize].id.toString(), bookData.data[maxSize].key, options.crt, options.userAgent);
@@ -117,9 +113,10 @@ const getGallery = async ({ id }, options) => {
117
113
  width: page.dimensions[0],
118
114
  height: page.dimensions[1]
119
115
  })),
116
+ language: getLanugageByTags(bookDetail.tags),
120
117
  tags: bookDetail.tags.map((tag) => {
121
118
  return {
122
- id: tag.namespace ? namespace[tag.namespace] : "tag:" + tag.name.replace(/\s+/g, "+"),
119
+ id: `${tag.namespace ? namespace[tag.namespace] : "tag"}:${tag.name}`,
123
120
  key: "ny",
124
121
  slug: tag.name,
125
122
  name: tag.name,
@@ -129,34 +126,43 @@ const getGallery = async ({ id }, options) => {
129
126
  };
130
127
  };
131
128
  //#endregion
132
- //#region src/getListing.ts
133
- const getListing = async ({ searchQuery, page }, options) => {
129
+ //#region src/functions/getBookSearch.ts
130
+ const getBookSearch = async (searchQuery, page, userAgent) => {
134
131
  const payload = new URLSearchParams();
135
132
  if (searchQuery !== null && searchQuery !== "") payload.append("s", searchQuery);
136
133
  if (page !== 1) payload.append("page", page.toString());
137
- const data = await fetch(`https://api.schale.network/books?${payload.toString()}`, { headers: {
134
+ return await fetch(`https://api.schale.network/books?${payload.toString()}`, { headers: {
138
135
  ...headers,
139
- "User-Agent": options.userAgent
136
+ "User-Agent": userAgent
140
137
  } }).then((o) => {
141
138
  if (o.ok) return o.json();
142
139
  else throw o;
143
140
  });
141
+ };
142
+ //#endregion
143
+ //#region src/getListing.ts
144
+ const getListing = async ({ searchQuery, page }, options) => {
145
+ const bookSearch = await getBookSearch(searchQuery, page, options.userAgent);
144
146
  return {
145
- galleries: data.entries.map((result) => ({
146
- id: result.id.toString() + "." + result.key,
147
- key: "ny",
148
- title: {
149
- display: result.title,
150
- original: null
151
- },
152
- cover: {
153
- src: result.thumbnail.path,
154
- width: result.thumbnail.dimensions[0],
155
- height: result.thumbnail.dimensions[1]
156
- }
147
+ galleries: await Promise.all(bookSearch.entries.map(async (entry) => {
148
+ const bookDetail = await getBookDetail(entry.id.toString(), entry.key, options.userAgent);
149
+ return {
150
+ id: entry.id.toString() + "." + entry.key,
151
+ key: "ny",
152
+ title: {
153
+ display: entry.title,
154
+ original: null
155
+ },
156
+ language: getLanugageByTags(bookDetail.tags),
157
+ cover: {
158
+ src: entry.thumbnail.path,
159
+ width: entry.thumbnail.dimensions[0],
160
+ height: entry.thumbnail.dimensions[1]
161
+ }
162
+ };
157
163
  })),
158
164
  currentPage: page,
159
- maximumPages: Math.ceil(data.total / data.limit)
165
+ maximumPages: Math.ceil(bookSearch.total / bookSearch.limit)
160
166
  };
161
167
  };
162
168
  //#endregion
@@ -169,6 +175,26 @@ const getImage = async ({ url }, options) => fetch(url, { headers: {
169
175
  else throw o;
170
176
  });
171
177
  //#endregion
178
+ //#region src/getTagListing.ts
179
+ const extractTag = (id) => {
180
+ const index = id.indexOf(":");
181
+ if (index === -1) return {
182
+ type: "tag",
183
+ name: id
184
+ };
185
+ return {
186
+ type: id.slice(0, index),
187
+ name: id.slice(index + 1)
188
+ };
189
+ };
190
+ const getTagListing = ({ id, page }, options) => {
191
+ const { type, name } = extractTag(id);
192
+ return getListing({
193
+ searchQuery: `${type}:"^${name}$"`,
194
+ page
195
+ }, options);
196
+ };
197
+ //#endregion
172
198
  //#region src/index.ts
173
199
  const niyaniya = (options) => {
174
200
  return {
@@ -177,7 +203,8 @@ const niyaniya = (options) => {
177
203
  iconUrl: "https://niyaniya.moe/favicon.ico",
178
204
  getGallery: (payload) => getGallery(payload, options),
179
205
  getListing: (payload) => getListing(payload, options),
180
- getImage: (payload) => getImage(payload, options)
206
+ getImage: (payload) => getImage(payload, options),
207
+ getTagListing: (payload) => getTagListing(payload, options)
181
208
  };
182
209
  };
183
210
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/constants/headers.ts","../src/functions/getBookData.ts","../src/functions/getBookDetail.ts","../src/functions/getBookImages.ts","../src/constants/namespace.ts","../src/constants/tagTypeMap.ts","../src/getGalery.ts","../src/getListing.ts","../src/getImage.ts","../src/index.ts"],"sourcesContent":["export const headers = {\n Accept: \"*/*\",\n Origin: \"https://niyaniya.moe\",\n Referer: \"https://niyaniya.moe/\",\n};\n","import { headers } from \"../constants/headers\";\nimport type { NiyaData } from \"../types/NiyaData\";\n\nexport const getBookData = async (\n bookId: string,\n bookKey: string,\n crt: string,\n userAgent: string,\n) => {\n const data = await fetch(\n `https://api.schale.network/books/detail/${bookId}/${bookKey}?${new URLSearchParams({\n crt,\n }).toString()}`,\n {\n method: \"POST\",\n headers: {\n ...headers,\n \"User-Agent\": userAgent,\n },\n },\n ).then((o) => {\n if (o.ok) return o.json() as Promise<NiyaData>;\n else throw o;\n });\n\n return data;\n};\n","import { headers } from \"../constants/headers\";\nimport type { NiyaGallery } from \"../types/NiyaGallery\";\n\nexport const getBookDetail = async (bookId: string, bookKey: string, userAgent: string) => {\n const data = await fetch(`https://api.schale.network/books/detail/${bookId}/${bookKey}`, {\n headers: {\n ...headers,\n \"User-Agent\": userAgent,\n },\n }).then((o) => {\n if (o.ok) return o.json() as Promise<NiyaGallery>;\n else throw o;\n });\n\n return data;\n};\n","import { headers } from \"../constants/headers\";\nimport type { NiyaImages } from \"../types/NiyaImages\";\n\nexport const getBookImage = async (\n size: number,\n bookId: string,\n bookKey: string,\n dataId: string,\n dataKey: string,\n crt: string,\n userAgent: string,\n) => {\n const data = await fetch(\n `https://api.schale.network/books/data/${bookId}/${bookKey}/${dataId}/${dataKey}/${size}?${new URLSearchParams(\n {\n crt,\n },\n ).toString()}`,\n {\n headers: {\n ...headers,\n \"User-Agent\": userAgent,\n },\n },\n ).then((o) => {\n if (o.ok) return o.json() as Promise<NiyaImages>;\n else throw o;\n });\n\n return data;\n};\n","export enum Namespace {\n Artist = 1,\n Circle = 2,\n Parody = 3,\n Magazine = 4,\n Character = 5,\n Cosplayer = 6,\n Uploader = 7,\n Male = 8,\n Female = 9,\n Mixed = 10,\n Language = 11,\n Other = 12,\n Reclass = 13,\n}\n\nexport const namespace: Record<number, string> = {\n [Namespace.Artist]: \"artist\",\n [Namespace.Circle]: \"circle\",\n [Namespace.Parody]: \"parody\",\n [Namespace.Magazine]: \"magazine\",\n [Namespace.Character]: \"character\",\n [Namespace.Cosplayer]: \"cosplayer\",\n [Namespace.Uploader]: \"uploader\",\n [Namespace.Male]: \"male\",\n [Namespace.Female]: \"female\",\n [Namespace.Mixed]: \"mixed\",\n [Namespace.Language]: \"language\",\n [Namespace.Other]: \"other\",\n [Namespace.Reclass]: \"reclass\",\n};\n","import { TagType } from \"@riffyh/commons\";\nimport { Namespace } from \"./namespace\";\n\nexport const tagTypeMap: Record<number, TagType> = {\n [Namespace.Artist]: TagType.Artist,\n [Namespace.Circle]: TagType.Artist,\n [Namespace.Parody]: TagType.Parody,\n [Namespace.Magazine]: TagType.Group,\n [Namespace.Character]: TagType.Character,\n [Namespace.Cosplayer]: TagType.Character,\n [Namespace.Uploader]: TagType.Tag,\n [Namespace.Male]: TagType.Tag,\n [Namespace.Female]: TagType.Tag,\n [Namespace.Mixed]: TagType.Tag,\n [Namespace.Language]: TagType.Language,\n [Namespace.Other]: TagType.Tag,\n [Namespace.Reclass]: TagType.Tag,\n};\n","import { getBookData } from \"./functions/getBookData\";\nimport { getBookDetail } from \"./functions/getBookDetail\";\nimport { getBookImage } from \"./functions/getBookImages\";\nimport { key } from \"./key\";\n\nimport { TagType, type DataSource, type Gallery } from \"@riffyh/commons\";\nimport type { Options } from \"./types/Options\";\nimport { namespace } from \"./constants/namespace\";\nimport { tagTypeMap } from \"./constants/tagTypeMap\";\n\nexport const getGallery = async (\n { id }: Parameters<DataSource[\"getGallery\"]>[0],\n options: Options,\n): ReturnType<DataSource[\"getGallery\"]> => {\n const [bookId, bookKey] = id.split(\".\");\n\n if (!bookId || !bookKey) throw new Error(\"unalbe to parse ids\");\n\n const [bookDetail, bookData] = await Promise.all([\n getBookDetail(bookId, bookKey, options.userAgent),\n getBookData(bookId, bookKey, options.crt, options.userAgent),\n ]);\n\n // pick data in bookData that has biggest integer\n const maxSize = Math.max(...Object.keys(bookData.data).map((v) => Number(v)));\n\n const bookImages = await getBookImage(\n maxSize,\n bookId,\n bookKey,\n bookData.data[maxSize]!.id.toString(),\n bookData.data[maxSize]!.key,\n options.crt,\n options.userAgent,\n );\n\n const gallery: Gallery = {\n id: bookDetail.id.toString() + \".\" + bookDetail.key,\n key,\n title: {\n display: bookDetail.title,\n original: null,\n },\n cover: {\n src: bookDetail.thumbnails.base + bookDetail.thumbnails.main.path,\n width: bookDetail.thumbnails.main.dimensions[0],\n height: bookDetail.thumbnails.main.dimensions[1],\n },\n pages: bookImages.entries.map((page, i) => ({\n order: i + 1,\n src: bookImages.base + page.path,\n width: page.dimensions[0],\n height: page.dimensions[1],\n })),\n tags: bookDetail.tags.map((tag) => {\n return {\n id: tag.namespace ? namespace[tag.namespace]! : \"tag\" + \":\" + tag.name.replace(/\\s+/g, \"+\"),\n key,\n slug: tag.name,\n name: tag.name,\n type: tag.namespace ? tagTypeMap[tag.namespace]! : TagType.Tag,\n };\n }),\n };\n\n return gallery;\n};\n","import { headers } from \"./constants/headers\";\nimport { key } from \"./key\";\n\nimport type { DataSource, ListingResult } from \"@riffyh/commons\";\nimport type { NiyaSearchResult } from \"./types/NiyaSearchResult\";\nimport type { Options } from \"./types/Options\";\n\nexport const getListing = async (\n { searchQuery, page }: Parameters<DataSource[\"getListing\"]>[0],\n options: Options,\n): ReturnType<DataSource[\"getListing\"]> => {\n const payload = new URLSearchParams();\n\n if (searchQuery !== null && searchQuery !== \"\") payload.append(\"s\", searchQuery);\n if (page !== 1) payload.append(\"page\", page.toString());\n\n const data = await fetch(`https://api.schale.network/books?${payload.toString()}`, {\n headers: {\n ...headers,\n \"User-Agent\": options.userAgent,\n },\n }).then((o) => {\n if (o.ok) return o.json() as Promise<NiyaSearchResult>;\n else throw o;\n });\n\n const result: ListingResult = {\n galleries: data.entries.map((result) => ({\n id: result.id.toString() + \".\" + result.key,\n key,\n title: {\n display: result.title,\n original: null,\n },\n cover: {\n src: result.thumbnail.path,\n width: result.thumbnail.dimensions[0],\n height: result.thumbnail.dimensions[1],\n },\n })),\n currentPage: page,\n maximumPages: Math.ceil(data.total / data.limit),\n };\n\n return result;\n};\n","import type { DataSource } from \"@riffyh/commons\";\nimport type { Options } from \"./types/Options\";\nimport { headers } from \"./constants/headers\";\n\nexport const getImage = async (\n { url }: Parameters<DataSource[\"getImage\"]>[0],\n options: Options,\n): ReturnType<DataSource[\"getImage\"]> =>\n fetch(url, {\n headers: {\n ...headers,\n \"User-Agent\": options.userAgent,\n },\n }).then(async (o) => {\n if (o.ok) return Buffer.from(await o.arrayBuffer());\n else throw o;\n });\n","import type { DataSource } from \"@riffyh/commons\";\nimport { getGallery } from \"./getGalery\";\nimport { getListing } from \"./getListing\";\nimport { getImage } from \"./getImage\";\nimport { key } from \"./key\";\n\nimport type { Options } from \"./types/Options\";\n\nexport const niyaniya = (options: Options): DataSource => {\n return {\n key,\n name: \"niyaniya\",\n iconUrl: \"https://niyaniya.moe/favicon.ico\",\n getGallery: (payload) => getGallery(payload, options),\n getListing: (payload) => getListing(payload, options),\n getImage: (payload) => getImage(payload, options),\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/constants/headers.ts","../src/functions/getBookData.ts","../src/functions/getBookDetail.ts","../src/functions/getBookImages.ts","../src/constants/namespace.ts","../src/constants/tagTypeMap.ts","../src/language.ts","../src/getGallery.ts","../src/functions/getBookSearch.ts","../src/getListing.ts","../src/getImage.ts","../src/getTagListing.ts","../src/index.ts"],"sourcesContent":["export const headers = {\n Accept: \"*/*\",\n Origin: \"https://niyaniya.moe\",\n Referer: \"https://niyaniya.moe/\",\n};\n","import { headers } from \"../constants/headers\";\nimport type { NiyaData } from \"../types/NiyaData\";\n\nexport const getBookData = async (\n bookId: string,\n bookKey: string,\n crt: string,\n userAgent: string,\n) => {\n const data = await fetch(\n `https://api.schale.network/books/detail/${bookId}/${bookKey}?${new URLSearchParams({\n crt,\n }).toString()}`,\n {\n method: \"POST\",\n headers: {\n ...headers,\n \"User-Agent\": userAgent,\n },\n },\n ).then((o) => {\n if (o.ok) return o.json() as Promise<NiyaData>;\n else throw o;\n });\n\n return data;\n};\n","import { headers } from \"../constants/headers\";\nimport type { NiyaGallery } from \"../types/NiyaGallery\";\n\nexport const getBookDetail = async (bookId: string, bookKey: string, userAgent: string) => {\n const data = await fetch(`https://api.schale.network/books/detail/${bookId}/${bookKey}`, {\n headers: {\n ...headers,\n \"User-Agent\": userAgent,\n },\n }).then((o) => {\n if (o.ok) return o.json() as Promise<NiyaGallery>;\n else throw o;\n });\n\n return data;\n};\n","import { headers } from \"../constants/headers\";\nimport type { NiyaImages } from \"../types/NiyaImages\";\n\nexport const getBookImage = async (\n size: number,\n bookId: string,\n bookKey: string,\n dataId: string,\n dataKey: string,\n crt: string,\n userAgent: string,\n) => {\n const data = await fetch(\n `https://api.schale.network/books/data/${bookId}/${bookKey}/${dataId}/${dataKey}/${size}?${new URLSearchParams(\n {\n crt,\n },\n ).toString()}`,\n {\n headers: {\n ...headers,\n \"User-Agent\": userAgent,\n },\n },\n ).then((o) => {\n if (o.ok) return o.json() as Promise<NiyaImages>;\n else throw o;\n });\n\n return data;\n};\n","export enum Namespace {\n Artist = 1,\n Circle = 2,\n Parody = 3,\n Magazine = 4,\n Character = 5,\n Cosplayer = 6,\n Uploader = 7,\n Male = 8,\n Female = 9,\n Mixed = 10,\n Language = 11,\n Other = 12,\n Reclass = 13,\n}\n\nexport const namespace: Record<number, string> = {\n [Namespace.Artist]: \"artist\",\n [Namespace.Circle]: \"circle\",\n [Namespace.Parody]: \"parody\",\n [Namespace.Magazine]: \"magazine\",\n [Namespace.Character]: \"character\",\n [Namespace.Cosplayer]: \"cosplayer\",\n [Namespace.Uploader]: \"uploader\",\n [Namespace.Male]: \"male\",\n [Namespace.Female]: \"female\",\n [Namespace.Mixed]: \"mixed\",\n [Namespace.Language]: \"language\",\n [Namespace.Other]: \"other\",\n [Namespace.Reclass]: \"reclass\",\n};\n","import { TagType } from \"@riffyh/commons\";\nimport { Namespace } from \"./namespace\";\n\nexport const tagTypeMap: Record<number, TagType> = {\n [Namespace.Artist]: TagType.Artist,\n [Namespace.Circle]: TagType.Artist,\n [Namespace.Parody]: TagType.Parody,\n [Namespace.Magazine]: TagType.Group,\n [Namespace.Character]: TagType.Character,\n [Namespace.Cosplayer]: TagType.Character,\n [Namespace.Uploader]: TagType.Tag,\n [Namespace.Male]: TagType.Tag,\n [Namespace.Female]: TagType.Tag,\n [Namespace.Mixed]: TagType.Tag,\n [Namespace.Language]: TagType.Language,\n [Namespace.Other]: TagType.Tag,\n [Namespace.Reclass]: TagType.Tag,\n};\n","import type { Language } from \"@riffyh/commons\";\nimport { Namespace } from \"./constants/namespace\";\nimport type { NiyaGallery } from \"./types/NiyaGallery\";\n\nconst languageMap: Record<string, Language> = {\n english: \"en\",\n chinese: \"cn\",\n};\n\nconst languageKey = Object.keys(languageMap);\n\nexport const getLanugageByTags = (tags: NiyaGallery[\"tags\"]): Language | null => {\n const languageTag = tags.find(\n (tag) => tag.namespace === Namespace.Language && languageKey.includes(tag.name),\n );\n\n if (languageTag) return languageMap[languageTag.name] || null;\n\n return null;\n};\n","import { getBookData } from \"./functions/getBookData\";\nimport { getBookDetail } from \"./functions/getBookDetail\";\nimport { getBookImage } from \"./functions/getBookImages\";\nimport { key } from \"./key\";\n\nimport { TagType, type DataSource, type Gallery } from \"@riffyh/commons\";\nimport type { Options } from \"./types/Options\";\nimport { namespace } from \"./constants/namespace\";\nimport { tagTypeMap } from \"./constants/tagTypeMap\";\nimport { getLanugageByTags } from \"./language\";\n\nexport const getGallery = async (\n { id }: Parameters<DataSource[\"getGallery\"]>[0],\n options: Options,\n): ReturnType<DataSource[\"getGallery\"]> => {\n const [bookId, bookKey] = id.split(\".\");\n\n if (!bookId || !bookKey) throw new Error(\"unable to parse ids\");\n\n const [bookDetail, bookData] = await Promise.all([\n getBookDetail(bookId, bookKey, options.userAgent),\n getBookData(bookId, bookKey, options.crt, options.userAgent),\n ]);\n\n // pick data in bookData that has biggest integer\n const maxSize = Math.max(...Object.keys(bookData.data).map((v) => Number(v)));\n\n const bookImages = await getBookImage(\n maxSize,\n bookId,\n bookKey,\n bookData.data[maxSize]!.id.toString(),\n bookData.data[maxSize]!.key,\n options.crt,\n options.userAgent,\n );\n\n const gallery: Gallery = {\n id: bookDetail.id.toString() + \".\" + bookDetail.key,\n key,\n title: {\n display: bookDetail.title,\n original: null,\n },\n cover: {\n src: bookDetail.thumbnails.base + bookDetail.thumbnails.main.path,\n width: bookDetail.thumbnails.main.dimensions[0],\n height: bookDetail.thumbnails.main.dimensions[1],\n },\n pages: bookImages.entries.map((page, i) => ({\n order: i + 1,\n src: bookImages.base + page.path,\n width: page.dimensions[0],\n height: page.dimensions[1],\n })),\n language: getLanugageByTags(bookDetail.tags),\n tags: bookDetail.tags.map((tag) => {\n return {\n id: `${tag.namespace ? namespace[tag.namespace]! : \"tag\"}:${tag.name}`,\n key,\n slug: tag.name,\n name: tag.name,\n type: tag.namespace ? tagTypeMap[tag.namespace]! : TagType.Tag,\n };\n }),\n };\n\n return gallery;\n};\n","import { headers } from \"../constants/headers\";\nimport type { NiyaSearchResult } from \"../types/NiyaSearchResult\";\n\nexport const getBookSearch = async (\n searchQuery: string | null,\n page: number,\n userAgent: string,\n) => {\n const payload = new URLSearchParams();\n\n if (searchQuery !== null && searchQuery !== \"\") payload.append(\"s\", searchQuery);\n if (page !== 1) payload.append(\"page\", page.toString());\n\n const data = await fetch(`https://api.schale.network/books?${payload.toString()}`, {\n headers: {\n ...headers,\n \"User-Agent\": userAgent,\n },\n }).then((o) => {\n if (o.ok) return o.json() as Promise<NiyaSearchResult>;\n else throw o;\n });\n\n return data;\n};\n","import { key } from \"./key\";\n\nimport type { DataSource, ListingResult } from \"@riffyh/commons\";\nimport type { Options } from \"./types/Options\";\nimport { getBookSearch } from \"./functions/getBookSearch\";\nimport { getBookDetail } from \"./functions/getBookDetail\";\nimport { getLanugageByTags } from \"./language\";\n\nexport const getListing = async (\n { searchQuery, page }: Parameters<DataSource[\"getListing\"]>[0],\n options: Options,\n): ReturnType<DataSource[\"getListing\"]> => {\n const bookSearch = await getBookSearch(searchQuery, page, options.userAgent);\n\n const galleries = await Promise.all(\n bookSearch.entries.map(async (entry) => {\n const bookDetail = await getBookDetail(entry.id.toString(), entry.key, options.userAgent);\n\n return {\n id: entry.id.toString() + \".\" + entry.key,\n key,\n title: {\n display: entry.title,\n original: null,\n },\n language: getLanugageByTags(bookDetail.tags),\n cover: {\n src: entry.thumbnail.path,\n width: entry.thumbnail.dimensions[0],\n height: entry.thumbnail.dimensions[1],\n },\n } satisfies ListingResult[\"galleries\"][number];\n }),\n );\n\n const result: ListingResult = {\n galleries,\n currentPage: page,\n maximumPages: Math.ceil(bookSearch.total / bookSearch.limit),\n };\n\n return result;\n};\n","import type { DataSource } from \"@riffyh/commons\";\nimport type { Options } from \"./types/Options\";\nimport { headers } from \"./constants/headers\";\n\nexport const getImage = async (\n { url }: Parameters<DataSource[\"getImage\"]>[0],\n options: Options,\n): ReturnType<DataSource[\"getImage\"]> =>\n fetch(url, {\n headers: {\n ...headers,\n \"User-Agent\": options.userAgent,\n },\n }).then(async (o) => {\n if (o.ok) return Buffer.from(await o.arrayBuffer());\n else throw o;\n });\n","import type { DataSource } from \"@riffyh/commons\";\nimport type { Options } from \"./types/Options\";\nimport { getListing } from \"./getListing\";\n\nconst extractTag = (id: string) => {\n const index = id.indexOf(\":\");\n if (index === -1) {\n return {\n type: \"tag\",\n name: id,\n };\n }\n return {\n type: id.slice(0, index),\n name: id.slice(index + 1),\n };\n};\n\nexport const getTagListing = (\n { id, page }: Parameters<DataSource[\"getTagListing\"]>[0],\n options: Options,\n) => {\n const { type, name } = extractTag(id);\n return getListing(\n {\n searchQuery: `${type}:\"^${name}$\"`,\n page,\n },\n options,\n );\n};\n","import type { DataSource } from \"@riffyh/commons\";\nimport { getGallery } from \"./getGallery\";\nimport { getListing } from \"./getListing\";\nimport { getImage } from \"./getImage\";\nimport { key } from \"./key\";\n\nimport type { Options } from \"./types/Options\";\nimport { getTagListing } from \"./getTagListing\";\n\nexport const niyaniya = (options: Options): DataSource => {\n return {\n key,\n name: \"niyaniya\",\n iconUrl: \"https://niyaniya.moe/favicon.ico\",\n getGallery: (payload) => getGallery(payload, options),\n getListing: (payload) => getListing(payload, options),\n getImage: (payload) => getImage(payload, options),\n getTagListing: (payload) => getTagListing(payload, options),\n };\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@riffyh/adapter-niyaniya",
3
- "version": "1.0.1",
3
+ "version": "1.2.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/rayriffy/rayriffy-h.git"
@@ -16,12 +16,13 @@
16
16
  "registry": "https://registry.npmjs.org"
17
17
  },
18
18
  "dependencies": {
19
- "@riffyh/commons": "2.1.0"
19
+ "@riffyh/commons": "2.2.0"
20
20
  },
21
21
  "devDependencies": {
22
- "tsdown": "0.21.7"
22
+ "tsdown": "0.22.3"
23
23
  },
24
24
  "scripts": {
25
+ "dev": "tsdown --watch",
25
26
  "build": "tsdown"
26
27
  }
27
28
  }