@riffyh/adapter-niyaniya 1.0.2 → 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
@@ -76,7 +76,19 @@ const tagTypeMap = {
76
76
  [13]: TagType.Tag
77
77
  };
78
78
  //#endregion
79
- //#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
80
92
  const getGallery = async ({ id }, options) => {
81
93
  const [bookId, bookKey] = id.split(".");
82
94
  if (!bookId || !bookKey) throw new Error("unable to parse ids");
@@ -101,9 +113,10 @@ const getGallery = async ({ id }, options) => {
101
113
  width: page.dimensions[0],
102
114
  height: page.dimensions[1]
103
115
  })),
116
+ language: getLanugageByTags(bookDetail.tags),
104
117
  tags: bookDetail.tags.map((tag) => {
105
118
  return {
106
- id: tag.namespace ? namespace[tag.namespace] : "tag:" + tag.name.replace(/\s+/g, "+"),
119
+ id: `${tag.namespace ? namespace[tag.namespace] : "tag"}:${tag.name}`,
107
120
  key: "ny",
108
121
  slug: tag.name,
109
122
  name: tag.name,
@@ -113,34 +126,43 @@ const getGallery = async ({ id }, options) => {
113
126
  };
114
127
  };
115
128
  //#endregion
116
- //#region src/getListing.ts
117
- const getListing = async ({ searchQuery, page }, options) => {
129
+ //#region src/functions/getBookSearch.ts
130
+ const getBookSearch = async (searchQuery, page, userAgent) => {
118
131
  const payload = new URLSearchParams();
119
132
  if (searchQuery !== null && searchQuery !== "") payload.append("s", searchQuery);
120
133
  if (page !== 1) payload.append("page", page.toString());
121
- const data = await fetch(`https://api.schale.network/books?${payload.toString()}`, { headers: {
134
+ return await fetch(`https://api.schale.network/books?${payload.toString()}`, { headers: {
122
135
  ...headers,
123
- "User-Agent": options.userAgent
136
+ "User-Agent": userAgent
124
137
  } }).then((o) => {
125
138
  if (o.ok) return o.json();
126
139
  else throw o;
127
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);
128
146
  return {
129
- galleries: data.entries.map((result) => ({
130
- id: result.id.toString() + "." + result.key,
131
- key: "ny",
132
- title: {
133
- display: result.title,
134
- original: null
135
- },
136
- cover: {
137
- src: result.thumbnail.path,
138
- width: result.thumbnail.dimensions[0],
139
- height: result.thumbnail.dimensions[1]
140
- }
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
+ };
141
163
  })),
142
164
  currentPage: page,
143
- maximumPages: Math.ceil(data.total / data.limit)
165
+ maximumPages: Math.ceil(bookSearch.total / bookSearch.limit)
144
166
  };
145
167
  };
146
168
  //#endregion
@@ -153,6 +175,26 @@ const getImage = async ({ url }, options) => fetch(url, { headers: {
153
175
  else throw o;
154
176
  });
155
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
156
198
  //#region src/index.ts
157
199
  const niyaniya = (options) => {
158
200
  return {
@@ -161,7 +203,8 @@ const niyaniya = (options) => {
161
203
  iconUrl: "https://niyaniya.moe/favicon.ico",
162
204
  getGallery: (payload) => getGallery(payload, options),
163
205
  getListing: (payload) => getListing(payload, options),
164
- getImage: (payload) => getImage(payload, options)
206
+ getImage: (payload) => getImage(payload, options),
207
+ getTagListing: (payload) => getTagListing(payload, options)
165
208
  };
166
209
  };
167
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(\"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 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.2",
3
+ "version": "1.2.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/rayriffy/rayriffy-h.git"
@@ -16,7 +16,7 @@
16
16
  "registry": "https://registry.npmjs.org"
17
17
  },
18
18
  "dependencies": {
19
- "@riffyh/commons": "2.1.2"
19
+ "@riffyh/commons": "2.2.0"
20
20
  },
21
21
  "devDependencies": {
22
22
  "tsdown": "0.22.3"