From 8295cee6ca9a7ddbb89bda8f4fcbdfe198cff7e6 Mon Sep 17 00:00:00 2001 From: Maiko Sinkyaet Tan Date: Tue, 26 Mar 2024 11:40:02 +0800 Subject: [PATCH] feat(pixiv): migrate arraybuffer to stream again (#216) * feat(pixiv): migrate arraybuffer to stream again * chore: update koishi to 4.17.3 --- packages/pixiv/package.json | 4 ++-- packages/pixiv/src/index.ts | 9 ++++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/pixiv/package.json b/packages/pixiv/package.json index 721641f6e..310c797d0 100644 --- a/packages/pixiv/package.json +++ b/packages/pixiv/package.json @@ -52,7 +52,7 @@ "peerDependencies": { "@koishijs/assets": "^1.0.4", "@koishijs/plugin-server": "^3.1.8", - "koishi": "^4.17.0", + "koishi": "^4.17.3", "koishi-plugin-booru": "^1.2.0" }, "peerDependenciesMeta": { @@ -66,6 +66,6 @@ "devDependencies": { "@koishijs/assets": "^1.0.4", "@koishijs/plugin-server": "^3.1.8", - "koishi": "^4.17.0" + "koishi": "^4.17.3" } } diff --git a/packages/pixiv/src/index.ts b/packages/pixiv/src/index.ts index 17f3fc17c..9f420f540 100644 --- a/packages/pixiv/src/index.ts +++ b/packages/pixiv/src/index.ts @@ -1,7 +1,10 @@ import { createCipheriv, createDecipheriv, randomBytes } from 'node:crypto' +import { Readable } from 'node:stream' +import { ReadableStream } from 'node:stream/web' import {} from '@koishijs/assets' import {} from '@koishijs/plugin-server' + import { Context, Quester, Random, Schema, trimSlash } from 'koishi' import { ImageSource } from 'koishi-plugin-booru' @@ -47,15 +50,15 @@ class PixivImageSource extends ImageSource { const url = ctx.request.url.replace(/^\/booru\/pixiv\/proxy\//, '') const decrypted = Cipher.decrypt(decodeURIComponent(url), config.aesKey) if (typeof decrypted !== 'string' || !decrypted.startsWith('https://i.pximg.net/')) return next() - const file = await this.http(decrypted, { + const file = await this.http(decrypted, { headers: { Referer: 'https://www.pixiv.net/' }, - responseType: 'arraybuffer', + responseType: 'stream', }) ctx.set(Object.fromEntries(file.headers.entries())) ctx.remove('Content-Length') ctx.response.status = file.status ctx.response.message = file.statusText - ctx.body = Buffer.from(file.data) + ctx.body = Readable.fromWeb(file.data) return next() }) }