Skip to content

Commit e2dd033

Browse files
Add DLsite metadata download support
1 parent 388def0 commit e2dd033

File tree

9 files changed

+72
-8
lines changed

9 files changed

+72
-8
lines changed

build-rel.bat

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
@echo off&cd /d %~dp0
22

33
set "ISCC_PATH=C:\Program Files (x86)\Inno Setup 6\ISCC.exe"
4-
set VERSION_NUM=1.2.0
4+
set VERSION_NUM=1.2.1
55

66
mkdir build\asmr-dl-ng
77
xcopy bin build\asmr-dl-ng\bin /E /I /Q

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "asmr-dl-ng",
3-
"version": "1.2.0",
3+
"version": "1.2.1",
44
"description": "ASMR Direct Downloader (New Generation)",
55
"author": "daydreamer-json <[email protected]> (https://github.com/daydreamer-json)",
66
"license": "AGPL-3.0-or-later",

setup/main.iss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#define MyAppName "asmr-dl-ng"
2-
#define MyAppVersion "1.2.0"
2+
#define MyAppVersion "1.2.1"
33
#define MyAppPublisher "daydreamer-json"
44
#define MyAppURL "https://github.com/daydreamer-json/asmr-dl-ng"
55
#define MyAppExeName "asmr-dl-ng.exe"

src/cmds/info.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ async function mainCmdHandler() {
4646
const workApiRsp = await downloadUtils.downloadMeta(argvUtils.getArgv()['id']);
4747

4848
console.log(termPrettyUtils.printWorkInfo(workApiRsp));
49+
50+
// console.log(YAML.stringify(workApiRsp.infoOrig));
51+
// await fs.promises.writeFile('R:/dlsite_api_meta.yaml', YAML.stringify(workApiRsp.infoOrig), 'utf-8');
4952
}
5053

5154
export default mainCmdHandler;

src/utils/api.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,22 @@ export default {
2020
setBaseUri: (server: TypesApi.ServerName) => {
2121
BASE_URI = `https://${appConfig.network.asmrApi.baseDomain[server]}/${appConfig.network.asmrApi.apiPath}`;
2222
},
23+
apiDlsite: {
24+
work: {
25+
info: async (source_id: string): Promise<any> => {
26+
const rsp = await ky
27+
.get(atob('aHR0cHM6Ly93d3cuZGxzaXRlLmNvbQ==') + '/maniax/product/info/ajax', {
28+
...defaultKySettings,
29+
searchParams: {
30+
product_id: source_id,
31+
cdn_cache_min: 1,
32+
},
33+
})
34+
.json();
35+
return (rsp as any)[source_id] ?? rsp;
36+
},
37+
},
38+
},
2339
api: {
2440
health: async (): Promise<{ available: boolean; message: string }> => {
2541
const rsp = await ky.get(`${BASE_URI}/health`, defaultKySettings).text();

src/utils/configEmbed.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@ import semver from 'semver';
22

33
export default {
44
APPLICATION_NAME: 'asmr-dl-ng',
5-
VERSION_NUMBER: semver.valid('1.2.0'),
5+
VERSION_NUMBER: semver.valid('1.2.1'),
66
};

src/utils/download.ts

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import termPrettyUtils from './termPretty.js';
2929

3030
async function downloadMeta(workId: number) {
3131
const spinner = !argvUtils.getArgv()['no-show-progress']
32-
? ora({ text: 'Downloading work metadata ...', color: 'cyan', spinner: 'dotsCircle' }).start()
32+
? ora({ text: 'Downloading metadata from DB ...', color: 'cyan', spinner: 'dotsCircle' }).start()
3333
: undefined;
3434
const workApiRsp: {
3535
info: TypesApiEndpoint.RspWorkInfoSanitized;
@@ -65,26 +65,56 @@ async function downloadMeta(workId: number) {
6565
}
6666
}
6767
})();
68+
spinner ? (spinner.text = 'Downloading metadata from DLsite server ...') : undefined;
69+
const workOriginApiRsp = await (async () => {
70+
try {
71+
return await apiUtils.apiDlsite.work.info(workApiRsp.info.source_id);
72+
} catch (error) {
73+
spinner?.stop();
74+
if (error instanceof HTTPError) {
75+
if (error.response.status === 404) {
76+
logger.error(`Work not found. Please check the ID and try again. ID: ${workId}`);
77+
await exitUtils.exit(1, null, false);
78+
} else if (error.response.status === 525) {
79+
logger.error(`Failed to download metadata: 525 Cloudflare SSL handshake failed`);
80+
await exitUtils.exit(1, null, false);
81+
}
82+
logger.error(`Failed to download metadata: ${error.response.status} ${error.response.statusText}`);
83+
await exitUtils.exit(1, null, false);
84+
throw error;
85+
} else if (error instanceof Error) {
86+
logger.error(`Failed to download metadata: ${error.message}`);
87+
await exitUtils.exit(1, null, false);
88+
throw error;
89+
} else {
90+
throw new Error('An unknown error occurred while downloading metadata');
91+
}
92+
}
93+
})();
6894
const coverImgBuffer: Record<'main' | 'thumb' | 'icon', ArrayBuffer | null> = {
6995
main: null,
7096
thumb: null,
7197
icon: null,
7298
};
99+
spinner ? (spinner.text = 'Downloading cover image ...') : undefined;
73100
for (const coverImgType of ['main', 'thumb', 'icon'] as const) {
74101
try {
75102
coverImgBuffer[coverImgType] = await apiUtils.api.media.coverImage(workId, coverImgType);
76103
} catch (error) {
77104
if (error instanceof HTTPError) {
78105
if (error.response.status !== 404) {
106+
spinner?.stop();
79107
logger.error(`Failed to download metadata: ${error.response.status} ${error.response.statusText}`);
80108
await exitUtils.exit(1, null, false);
81109
throw error;
82110
}
83111
} else if (error instanceof Error) {
112+
spinner?.stop();
84113
logger.error(`Failed to download metadata: ${error.message}`);
85114
await exitUtils.exit(1, null, false);
86115
throw error;
87116
} else {
117+
spinner?.stop();
88118
throw new Error('An unknown error occurred while downloading metadata');
89119
}
90120
}
@@ -93,7 +123,9 @@ async function downloadMeta(workId: number) {
93123
spinner?.stop();
94124
logger.info('Work metadata downloaded');
95125
return {
96-
...workApiRsp,
126+
info: workApiRsp.info,
127+
infoOrig: JSON.stringify(workOriginApiRsp) === '[]' ? null : workOriginApiRsp,
128+
fileEntry: workApiRsp.fileEntry,
97129
coverImgBuffer,
98130
};
99131
}
@@ -156,6 +188,7 @@ async function filterFileEntry(fileEntries: TypesApiFiles.FilesystemEntryTransfo
156188
async function downloadWork(
157189
workApiRsp: {
158190
info: TypesApiEndpoint.RspWorkInfoSanitized;
191+
infoOrig: any;
159192
fileEntry: {
160193
raw: TypesApiFiles.FilesystemEntry[];
161194
transformed: TypesApiFiles.FilesystemEntryTransformed[];
@@ -403,6 +436,7 @@ async function downloadWork(
403436
path.join(tempOutputDirPath, 'meta.yaml'),
404437
YAML.stringify({
405438
info: workApiRsp.info,
439+
infoOrig: workApiRsp.infoOrig,
406440
coverImage: Object.fromEntries(Object.entries(workApiRsp.coverImgBuffer).map((e) => [e[0], e[1] !== null])),
407441
fileEntry: (() => {
408442
return workApiRsp.fileEntry.transformed

src/utils/downloadPost.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ async function calculateHashes(
184184
async function deobfuscateFilename(
185185
workApiRsp: {
186186
info: TypesApiEndpoint.RspWorkInfoSanitized;
187+
infoOrig: any;
187188
fileEntry: {
188189
raw: TypesApiFiles.FilesystemEntry[];
189190
transformed: TypesApiFiles.FilesystemEntryTransformed[];
@@ -205,7 +206,10 @@ async function deobfuscateFilename(
205206
(() => {
206207
const replaceArray: [RegExp, string][] = [
207208
[/<WORK_ID>/g, workApiRsp.info.source_id],
208-
[/<WORK_TITLE>/g, stringUtils.sanitizeFilename(workApiRsp.info.title)],
209+
[
210+
/<WORK_TITLE>/g,
211+
stringUtils.sanitizeFilename(workApiRsp.infoOrig ? workApiRsp.infoOrig.work_name : workApiRsp.info.title),
212+
],
209213
[/<CIRCLE_ID>/g, workApiRsp.info.circle.source_id],
210214
[/<CIRCLE_NAME>/g, stringUtils.sanitizeFilename(workApiRsp.info.circle.name)],
211215
[/<VA_NAME>/g, workApiRsp.info.vas.map((e) => stringUtils.sanitizeFilename(e.name)).join(',')],

src/utils/termPretty.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ function wordWrapperSimple(strArray: string[], width: number): string[] {
148148

149149
function printWorkInfo(workApiRsp: {
150150
info: TypesApiEndpoint.RspWorkInfoSanitized;
151+
infoOrig: any;
151152
fileEntry: {
152153
raw: TypesApiFiles.FilesystemEntry[];
153154
transformed: TypesApiFiles.FilesystemEntryTransformed[];
@@ -169,7 +170,13 @@ function printWorkInfo(workApiRsp: {
169170
table.push(
170171
...[
171172
['ID', workApiRsp.info.source_id],
172-
['Title', wordWrapper(workApiRsp.info.title, availableMaxTextWidth).join('\n')],
173+
[
174+
'Title',
175+
wordWrapper(
176+
workApiRsp.infoOrig ? workApiRsp.infoOrig.work_name : workApiRsp.info.title,
177+
availableMaxTextWidth,
178+
).join('\n'),
179+
],
173180
// ['Circle ID', workApiRsp.info.circle.source_id],
174181
['Circle Name', wordWrapper(workApiRsp.info.circle.name, availableMaxTextWidth).join('\n')],
175182
[

0 commit comments

Comments
 (0)