dsh-plugin-streamnest 0.0.0-stage → 0.0.2

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.
Files changed (150) hide show
  1. package/LICENSE +27 -0
  2. package/README.en.md +106 -0
  3. package/README.md +105 -2
  4. package/assets/logo.svg +5 -0
  5. package/assets/reference-projects.json +16 -0
  6. package/assets/screenshots/deepseek-harness-installed.png +0 -0
  7. package/lib/THIRD_PARTY_LICENSES.txt +2068 -0
  8. package/lib/apps/api/src/app.module.js +52 -0
  9. package/lib/apps/api/src/app.module.js.map +1 -0
  10. package/lib/apps/api/src/common/api-error.filter.js +22 -0
  11. package/lib/apps/api/src/common/api-error.filter.js.map +1 -0
  12. package/lib/apps/api/src/common/business-error.js +21 -0
  13. package/lib/apps/api/src/common/business-error.js.map +1 -0
  14. package/lib/apps/api/src/common/network.js +89 -0
  15. package/lib/apps/api/src/common/network.js.map +1 -0
  16. package/lib/apps/api/src/common/process.js +101 -0
  17. package/lib/apps/api/src/common/process.js.map +1 -0
  18. package/lib/apps/api/src/common/validation.js +30 -0
  19. package/lib/apps/api/src/common/validation.js.map +1 -0
  20. package/lib/apps/api/src/create-application.js +65 -0
  21. package/lib/apps/api/src/create-application.js.map +1 -0
  22. package/lib/apps/api/src/main.js +9 -0
  23. package/lib/apps/api/src/main.js.map +1 -0
  24. package/lib/apps/api/src/media/arguments.js +120 -0
  25. package/lib/apps/api/src/media/arguments.js.map +1 -0
  26. package/lib/apps/api/src/media/delete-downloads.js +129 -0
  27. package/lib/apps/api/src/media/delete-downloads.js.map +1 -0
  28. package/lib/apps/api/src/media/directory-sync.js +152 -0
  29. package/lib/apps/api/src/media/directory-sync.js.map +1 -0
  30. package/lib/apps/api/src/media/dto/media.dto.js +268 -0
  31. package/lib/apps/api/src/media/dto/media.dto.js.map +1 -0
  32. package/lib/apps/api/src/media/engines/aria2-progress.js +11 -0
  33. package/lib/apps/api/src/media/engines/aria2-progress.js.map +1 -0
  34. package/lib/apps/api/src/media/engines/aria2.js +85 -0
  35. package/lib/apps/api/src/media/engines/aria2.js.map +1 -0
  36. package/lib/apps/api/src/media/engines/direct-state.js +42 -0
  37. package/lib/apps/api/src/media/engines/direct-state.js.map +1 -0
  38. package/lib/apps/api/src/media/engines/direct.js +269 -0
  39. package/lib/apps/api/src/media/engines/direct.js.map +1 -0
  40. package/lib/apps/api/src/media/engines/js-runtime.js +125 -0
  41. package/lib/apps/api/src/media/engines/js-runtime.js.map +1 -0
  42. package/lib/apps/api/src/media/engines/types.js +2 -0
  43. package/lib/apps/api/src/media/engines/types.js.map +1 -0
  44. package/lib/apps/api/src/media/formats.js +106 -0
  45. package/lib/apps/api/src/media/formats.js.map +1 -0
  46. package/lib/apps/api/src/media/media.controller.js +312 -0
  47. package/lib/apps/api/src/media/media.controller.js.map +1 -0
  48. package/lib/apps/api/src/media/media.engine.js +446 -0
  49. package/lib/apps/api/src/media/media.engine.js.map +1 -0
  50. package/lib/apps/api/src/media/media.service.js +563 -0
  51. package/lib/apps/api/src/media/media.service.js.map +1 -0
  52. package/lib/apps/api/src/media/parsing/browser-paths.js +105 -0
  53. package/lib/apps/api/src/media/parsing/browser-paths.js.map +1 -0
  54. package/lib/apps/api/src/media/parsing/browser-pool.service.js +84 -0
  55. package/lib/apps/api/src/media/parsing/browser-pool.service.js.map +1 -0
  56. package/lib/apps/api/src/media/parsing/cache.service.js +123 -0
  57. package/lib/apps/api/src/media/parsing/cache.service.js.map +1 -0
  58. package/lib/apps/api/src/media/parsing/cookie.service.js +243 -0
  59. package/lib/apps/api/src/media/parsing/cookie.service.js.map +1 -0
  60. package/lib/apps/api/src/media/parsing/platform-data.js +131 -0
  61. package/lib/apps/api/src/media/parsing/platform-data.js.map +1 -0
  62. package/lib/apps/api/src/media/parsing/platform-parser.service.js +230 -0
  63. package/lib/apps/api/src/media/parsing/platform-parser.service.js.map +1 -0
  64. package/lib/apps/api/src/media/parsing/youtube-retry.js +24 -0
  65. package/lib/apps/api/src/media/parsing/youtube-retry.js.map +1 -0
  66. package/lib/apps/api/src/media/thumbnail.service.js +189 -0
  67. package/lib/apps/api/src/media/thumbnail.service.js.map +1 -0
  68. package/lib/apps/api/src/media/wechat/api.js +251 -0
  69. package/lib/apps/api/src/media/wechat/api.js.map +1 -0
  70. package/lib/apps/api/src/media/wechat/decode.js +121 -0
  71. package/lib/apps/api/src/media/wechat/decode.js.map +1 -0
  72. package/lib/apps/api/src/media/wechat/wechat.service.js +61 -0
  73. package/lib/apps/api/src/media/wechat/wechat.service.js.map +1 -0
  74. package/lib/apps/api/src/runtime/assets.json +98 -0
  75. package/lib/apps/api/src/runtime/runtime-archive.js +44 -0
  76. package/lib/apps/api/src/runtime/runtime-archive.js.map +1 -0
  77. package/lib/apps/api/src/runtime/runtime-discovery.js +163 -0
  78. package/lib/apps/api/src/runtime/runtime-discovery.js.map +1 -0
  79. package/lib/apps/api/src/runtime/runtime-installer.js +93 -0
  80. package/lib/apps/api/src/runtime/runtime-installer.js.map +1 -0
  81. package/lib/apps/api/src/runtime/runtime-manager.js +180 -0
  82. package/lib/apps/api/src/runtime/runtime-manager.js.map +1 -0
  83. package/lib/apps/api/src/runtime/runtime-manifest.js +48 -0
  84. package/lib/apps/api/src/runtime/runtime-manifest.js.map +1 -0
  85. package/lib/apps/api/src/runtime/runtime.service.js +2 -0
  86. package/lib/apps/api/src/runtime/runtime.service.js.map +1 -0
  87. package/lib/apps/api/src/storage/legacy-vault.js +66 -0
  88. package/lib/apps/api/src/storage/legacy-vault.js.map +1 -0
  89. package/lib/apps/api/src/storage/task-record.js +87 -0
  90. package/lib/apps/api/src/storage/task-record.js.map +1 -0
  91. package/lib/apps/api/src/storage/vault.store.js +321 -0
  92. package/lib/apps/api/src/storage/vault.store.js.map +1 -0
  93. package/lib/apps/api/src/system/browser-profiles.js +117 -0
  94. package/lib/apps/api/src/system/browser-profiles.js.map +1 -0
  95. package/lib/apps/api/src/system/journal.service.js +87 -0
  96. package/lib/apps/api/src/system/journal.service.js.map +1 -0
  97. package/lib/apps/api/src/system/native.service.js +106 -0
  98. package/lib/apps/api/src/system/native.service.js.map +1 -0
  99. package/lib/apps/api/src/system/system.controller.js +162 -0
  100. package/lib/apps/api/src/system/system.controller.js.map +1 -0
  101. package/lib/apps/api/src/system/system.dto.js +127 -0
  102. package/lib/apps/api/src/system/system.dto.js.map +1 -0
  103. package/lib/apps/api/src/system/system.service.js +191 -0
  104. package/lib/apps/api/src/system/system.service.js.map +1 -0
  105. package/lib/apps/shared/src/brand.js +9 -0
  106. package/lib/apps/shared/src/brand.js.map +1 -0
  107. package/lib/apps/shared/src/browser-profiles.js +15 -0
  108. package/lib/apps/shared/src/browser-profiles.js.map +1 -0
  109. package/lib/apps/shared/src/contracts.js +13 -0
  110. package/lib/apps/shared/src/contracts.js.map +1 -0
  111. package/lib/apps/shared/src/cookies.js +23 -0
  112. package/lib/apps/shared/src/cookies.js.map +1 -0
  113. package/lib/apps/shared/src/links.js +7 -0
  114. package/lib/apps/shared/src/links.js.map +1 -0
  115. package/lib/apps/shared/src/media-files.js +17 -0
  116. package/lib/apps/shared/src/media-files.js.map +1 -0
  117. package/lib/apps/shared/src/messages.js +255 -0
  118. package/lib/apps/shared/src/messages.js.map +1 -0
  119. package/lib/apps/shared/src/parse-errors.js +69 -0
  120. package/lib/apps/shared/src/parse-errors.js.map +1 -0
  121. package/lib/apps/shared/src/preferences.js +26 -0
  122. package/lib/apps/shared/src/preferences.js.map +1 -0
  123. package/lib/apps/shared/src/system.js +7 -0
  124. package/lib/apps/shared/src/system.js.map +1 -0
  125. package/lib/apps/shared/src/task-messages.js +21 -0
  126. package/lib/apps/shared/src/task-messages.js.map +1 -0
  127. package/lib/apps/shared/src/thumbnail.js +16 -0
  128. package/lib/apps/shared/src/thumbnail.js.map +1 -0
  129. package/lib/client.js +43785 -0
  130. package/lib/index.js +1 -0
  131. package/lib/packages/harness/src/index.js +46 -0
  132. package/lib/packages/harness/src/index.js.map +1 -0
  133. package/lib/packages/harness/src/tools/business-errors.js +47 -0
  134. package/lib/packages/harness/src/tools/business-errors.js.map +1 -0
  135. package/lib/packages/harness/src/tools/permissions.js +24 -0
  136. package/lib/packages/harness/src/tools/permissions.js.map +1 -0
  137. package/lib/packages/harness/src/tools/register.js +356 -0
  138. package/lib/packages/harness/src/tools/register.js.map +1 -0
  139. package/lib/packages/harness/src/tools/schemas.js +248 -0
  140. package/lib/packages/harness/src/tools/schemas.js.map +1 -0
  141. package/lib/packages/harness/src/tools/system-schemas.js +88 -0
  142. package/lib/packages/harness/src/tools/system-schemas.js.map +1 -0
  143. package/lib/packages/harness/src/tools/system-tools.js +193 -0
  144. package/lib/packages/harness/src/tools/system-tools.js.map +1 -0
  145. package/licenses/downvid.LICENSE +22 -0
  146. package/licenses/wx_channels_download.LICENSE +35 -0
  147. package/package.json +150 -3
  148. package/packages/harness/cordis.patch.yml +3 -0
  149. package/packages/harness/locale/en.json +6 -0
  150. package/packages/harness/locale/zh.json +6 -0
@@ -0,0 +1,129 @@
1
+ import { lstat, realpath } from 'node:fs/promises';
2
+ import { promises as fs } from 'node:fs';
3
+ import { isAbsolute, relative, resolve, sep } from 'node:path';
4
+ import { BusinessError, businessMessage, readBusinessMessage, } from '../../../shared/src/messages.js';
5
+ function within(root, path) {
6
+ const child = relative(root, path);
7
+ return child !== '..' && !child.startsWith(`..${sep}`) && !isAbsolute(child);
8
+ }
9
+ async function info(path) {
10
+ return lstat(path).catch((error) => {
11
+ if (error.code !== 'ENOENT')
12
+ throw error;
13
+ return undefined;
14
+ });
15
+ }
16
+ /** Resolve registered files under the task's original download root, without following links. */
17
+ async function registeredFile(task, name) {
18
+ const root = resolve(task.preferences.downloadDirectory);
19
+ const directory = resolve(task.outputDirectory);
20
+ const file = resolve(directory, name);
21
+ if (!name || isAbsolute(name) || file === directory || !within(directory, file))
22
+ throw new BusinessError('DELETE_PATH_UNSAFE');
23
+ const canonicalRoot = await realpath(root).catch((error) => {
24
+ if (error.code !== 'ENOENT')
25
+ throw error;
26
+ return root;
27
+ });
28
+ const base = within(root, directory) ? root : canonicalRoot;
29
+ if (!within(base, directory))
30
+ throw new BusinessError('DELETE_PATH_UNSAFE');
31
+ const segments = relative(base, file).split(sep);
32
+ let path = canonicalRoot;
33
+ for (let index = 0; index < segments.length; index++) {
34
+ path = resolve(path, segments[index]);
35
+ const entry = await info(path);
36
+ if (!entry)
37
+ return { path: resolve(canonicalRoot, relative(base, file)), entry: undefined };
38
+ if (entry.isSymbolicLink() ||
39
+ (index === segments.length - 1 ? !entry.isFile() : !entry.isDirectory()))
40
+ throw new BusinessError('DELETE_PATH_UNSAFE');
41
+ }
42
+ return { path, entry: await info(path) };
43
+ }
44
+ export async function deleteDownloadFiles(tasks, allTasks, signal) {
45
+ const selected = new Set(tasks.map((task) => task.id));
46
+ const references = new Set();
47
+ const activeDirectories = [];
48
+ const directories = new Map();
49
+ for (const task of allTasks) {
50
+ signal?.throwIfAborted();
51
+ if (selected.has(task.id))
52
+ continue;
53
+ if (!directories.has(task.outputDirectory))
54
+ directories.set(task.outputDirectory, await realpath(task.outputDirectory).catch(() => resolve(task.outputDirectory)));
55
+ const directory = directories.get(task.outputDirectory);
56
+ for (const file of task.artifacts)
57
+ references.add(resolve(directory, file.name));
58
+ if (['queued', 'downloading', 'processing', 'paused'].includes(task.state))
59
+ activeDirectories.push(directory);
60
+ }
61
+ const result = {
62
+ requested: tasks.length,
63
+ deletedFiles: 0,
64
+ missingFiles: 0,
65
+ removedRecords: 0,
66
+ removedTaskIds: [],
67
+ failures: [],
68
+ cancelled: false,
69
+ };
70
+ const processed = new Set();
71
+ for (const task of tasks) {
72
+ if (signal?.aborted)
73
+ break;
74
+ try {
75
+ const files = await Promise.all(task.artifacts.map((file) => registeredFile(task, file.name)));
76
+ if (files.some(({ path }) => references.has(path) || activeDirectories.some((root) => within(root, path))))
77
+ throw new BusinessError('DELETE_FILE_SHARED');
78
+ let complete = true;
79
+ for (const [index, file] of files.entries()) {
80
+ if (signal?.aborted) {
81
+ complete = false;
82
+ break;
83
+ }
84
+ if (processed.has(file.path))
85
+ continue;
86
+ const current = await registeredFile(task, task.artifacts[index].name);
87
+ if (current.path !== file.path ||
88
+ (current.entry &&
89
+ (!file.entry ||
90
+ current.entry.ino !== file.entry.ino ||
91
+ current.entry.dev !== file.entry.dev)))
92
+ throw new BusinessError('DELETE_PATH_UNSAFE');
93
+ if (!current.entry) {
94
+ result.missingFiles++;
95
+ processed.add(file.path);
96
+ continue;
97
+ }
98
+ try {
99
+ await fs.unlink(file.path);
100
+ }
101
+ catch (error) {
102
+ // Reconcile a file removed concurrently before reporting a failure.
103
+ if (await info(file.path))
104
+ throw error;
105
+ }
106
+ if (await info(file.path))
107
+ throw new Error('The file is still present at its original path.');
108
+ result.deletedFiles++;
109
+ processed.add(file.path);
110
+ }
111
+ if (complete)
112
+ result.removedTaskIds.push(task.id);
113
+ }
114
+ catch (error) {
115
+ result.failures.push({
116
+ taskId: task.id,
117
+ ...(signal?.aborted
118
+ ? businessMessage('DELETE_CANCELLED')
119
+ : (readBusinessMessage(error) ??
120
+ businessMessage('DELETE_FAILED', {
121
+ reason: (error instanceof Error ? error.message : String(error)).slice(-2_000),
122
+ }))),
123
+ });
124
+ }
125
+ }
126
+ result.cancelled = signal?.aborted ?? false;
127
+ return result;
128
+ }
129
+ //# sourceMappingURL=delete-downloads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-downloads.js","sourceRoot":"","sources":["../../../../../apps/api/src/media/delete-downloads.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,152 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { lstat, readdir, realpath } from 'node:fs/promises';
3
+ import { basename, dirname, extname, isAbsolute, relative, resolve, sep } from 'node:path';
4
+ import { mediaFileMode } from '../../../shared/src/media-files.js';
5
+ import { BusinessError } from '../../../shared/src/messages.js';
6
+ import { taskMessage } from '../../../shared/src/task-messages.js';
7
+ function within(root, path) {
8
+ const child = relative(root, path);
9
+ return child !== '..' && !child.startsWith(`..${sep}`) && !isAbsolute(child);
10
+ }
11
+ export async function planDirectorySync(tasks, preferences, signal) {
12
+ const root = resolve(preferences.downloadDirectory);
13
+ const removed = [];
14
+ const updated = [];
15
+ const imported = [];
16
+ const files = new Map();
17
+ const ignored = new Set();
18
+ const taskDirectories = new Map();
19
+ let skipped = 0;
20
+ let entries = 0;
21
+ signal?.throwIfAborted();
22
+ const canonicalRoot = await realpath(root);
23
+ if (!(await lstat(canonicalRoot)).isDirectory())
24
+ throw new BusinessError('DIRECTORY_SYNC_FAILED', { reason: 'Not a directory' });
25
+ for (const task of tasks) {
26
+ signal?.throwIfAborted();
27
+ let directory = resolve(task.outputDirectory);
28
+ if (!within(root, directory)) {
29
+ const canonical = await realpath(directory).catch(() => undefined);
30
+ if (!canonical || !within(canonicalRoot, canonical))
31
+ continue;
32
+ directory = resolve(root, relative(canonicalRoot, canonical));
33
+ }
34
+ taskDirectories.set(task.id, directory);
35
+ if (task.state !== 'completed')
36
+ ignored.add(directory);
37
+ }
38
+ const excluded = (path) => {
39
+ for (let current = path; within(root, current); current = dirname(current)) {
40
+ if (ignored.has(current))
41
+ return true;
42
+ if (current === root)
43
+ break;
44
+ }
45
+ return false;
46
+ };
47
+ async function scan(directory) {
48
+ for (const entry of await readdir(directory, { withFileTypes: true })) {
49
+ signal?.throwIfAborted();
50
+ if (++entries > 50_000)
51
+ throw new BusinessError('DIRECTORY_SYNC_LIMIT');
52
+ const path = resolve(directory, entry.name);
53
+ if (entry.isSymbolicLink() || entry.name.startsWith('.') || excluded(path)) {
54
+ ignored.add(path);
55
+ skipped++;
56
+ continue;
57
+ }
58
+ const canonical = await realpath(path);
59
+ if (!within(canonicalRoot, canonical))
60
+ throw new BusinessError('ARTIFACT_PATH_ESCAPE');
61
+ if (entry.isDirectory())
62
+ await scan(path);
63
+ else if (entry.isFile()) {
64
+ const info = await lstat(path);
65
+ if (!info.isFile())
66
+ throw new BusinessError('DIRECTORY_SYNC_FAILED', { reason: path });
67
+ files.set(path, { size: info.size, mtimeMs: info.mtimeMs });
68
+ }
69
+ }
70
+ }
71
+ await scan(root);
72
+ signal?.throwIfAborted();
73
+ const owned = new Set();
74
+ for (const task of tasks) {
75
+ signal?.throwIfAborted();
76
+ const directory = taskDirectories.get(task.id);
77
+ if (task.state !== 'completed' || !directory || excluded(directory))
78
+ continue;
79
+ const paths = task.artifacts.map((artifact) => {
80
+ const path = resolve(directory, artifact.name);
81
+ if (!within(directory, path))
82
+ throw new BusinessError('ARTIFACT_PATH_ESCAPE');
83
+ return path;
84
+ });
85
+ if (paths.some(excluded))
86
+ continue;
87
+ const primary = task.artifacts.filter((artifact) => mediaFileMode(artifact.name) === task.request.mode);
88
+ const expected = primary.length ? primary : task.artifacts;
89
+ if (!expected.some((artifact) => files.has(resolve(directory, artifact.name)))) {
90
+ removed.push(task.id);
91
+ continue;
92
+ }
93
+ paths.forEach((path) => owned.add(path));
94
+ const artifacts = task.artifacts.map((artifact, index) => {
95
+ const file = files.get(paths[index]);
96
+ return file ? { ...artifact, bytes: file.size } : artifact;
97
+ });
98
+ if (artifacts.some((artifact, index) => artifact.bytes !== task.artifacts[index].bytes))
99
+ updated.push({ ...task, artifacts, updatedAt: new Date().toISOString() });
100
+ }
101
+ for (const [path, info] of files) {
102
+ signal?.throwIfAborted();
103
+ const mode = mediaFileMode(path);
104
+ if (!mode ||
105
+ !info.size ||
106
+ owned.has(path) ||
107
+ /\.(?:part[-.]|(?:temp|tmp|f\d+)\.)/i.test(basename(path)))
108
+ continue;
109
+ const id = randomUUID();
110
+ const now = new Date().toISOString();
111
+ const mediaId = randomUUID();
112
+ imported.push({
113
+ id,
114
+ state: 'completed',
115
+ progress: 100,
116
+ downloadedBytes: info.size,
117
+ totalBytes: info.size,
118
+ speed: 0,
119
+ eta: 0,
120
+ ...taskMessage('completed'),
121
+ createdAt: new Date(info.mtimeMs).toISOString(),
122
+ updatedAt: now,
123
+ outputDirectory: dirname(path),
124
+ artifacts: [{ name: basename(path), bytes: info.size }],
125
+ archived: false,
126
+ preferences,
127
+ request: { mediaId, mode },
128
+ media: {
129
+ id: mediaId,
130
+ url: '',
131
+ title: basename(path, extname(path)),
132
+ uploader: '',
133
+ platform: 'Local',
134
+ duration: 0,
135
+ thumbnail: '',
136
+ formats: [],
137
+ audioTracks: [],
138
+ subtitles: [],
139
+ parsedAt: now,
140
+ },
141
+ });
142
+ }
143
+ return {
144
+ directory: root,
145
+ imported,
146
+ removed,
147
+ updated,
148
+ scanned: [...files.keys()].filter((path) => mediaFileMode(path)).length,
149
+ skipped,
150
+ };
151
+ }
152
+ //# sourceMappingURL=directory-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directory-sync.js","sourceRoot":"","sources":["../../../../../apps/api/src/media/directory-sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,268 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { IsArray, ArrayMinSize, ArrayMaxSize, ArrayUnique, IsBoolean, IsIn, IsInt, ValidateIf, IsString, IsUUID, Max, MaxLength, Min, ValidateNested, } from 'class-validator';
11
+ import { Type } from 'class-transformer';
12
+ import { DOWNLOAD_MODES } from '../../../../shared/src/contracts.js';
13
+ export class ParseMediaDto {
14
+ url;
15
+ }
16
+ __decorate([
17
+ IsString(),
18
+ MaxLength(4096),
19
+ __metadata("design:type", String)
20
+ ], ParseMediaDto.prototype, "url", void 0);
21
+ export class CreateDownloadDto {
22
+ mediaId;
23
+ mode;
24
+ formatId;
25
+ audioTrackId;
26
+ audioFormatId;
27
+ subtitleFormat;
28
+ subtitles;
29
+ }
30
+ __decorate([
31
+ IsUUID(),
32
+ __metadata("design:type", String)
33
+ ], CreateDownloadDto.prototype, "mediaId", void 0);
34
+ __decorate([
35
+ IsIn(DOWNLOAD_MODES),
36
+ __metadata("design:type", String)
37
+ ], CreateDownloadDto.prototype, "mode", void 0);
38
+ __decorate([
39
+ ValidateIf((_object, value) => value !== undefined),
40
+ IsString(),
41
+ MaxLength(200),
42
+ __metadata("design:type", String)
43
+ ], CreateDownloadDto.prototype, "formatId", void 0);
44
+ __decorate([
45
+ ValidateIf((_object, value) => value !== undefined),
46
+ IsString(),
47
+ MaxLength(200),
48
+ __metadata("design:type", String)
49
+ ], CreateDownloadDto.prototype, "audioTrackId", void 0);
50
+ __decorate([
51
+ ValidateIf((_object, value) => value !== undefined),
52
+ IsString(),
53
+ MaxLength(200),
54
+ __metadata("design:type", String)
55
+ ], CreateDownloadDto.prototype, "audioFormatId", void 0);
56
+ __decorate([
57
+ ValidateIf((_object, value) => value !== undefined),
58
+ IsIn(['srt', 'source']),
59
+ __metadata("design:type", String)
60
+ ], CreateDownloadDto.prototype, "subtitleFormat", void 0);
61
+ __decorate([
62
+ ValidateIf((_object, value) => value !== undefined),
63
+ IsArray(),
64
+ IsString({ each: true }),
65
+ MaxLength(100, { each: true }),
66
+ __metadata("design:type", Array)
67
+ ], CreateDownloadDto.prototype, "subtitles", void 0);
68
+ export class TaskActionDto {
69
+ action;
70
+ }
71
+ __decorate([
72
+ IsIn(['pause', 'resume', 'retry', 'cancel']),
73
+ __metadata("design:type", String)
74
+ ], TaskActionDto.prototype, "action", void 0);
75
+ export class ArchiveTaskDto {
76
+ archived;
77
+ }
78
+ __decorate([
79
+ IsBoolean(),
80
+ __metadata("design:type", Boolean)
81
+ ], ArchiveTaskDto.prototype, "archived", void 0);
82
+ export class RemoveTaskDto {
83
+ stopActive;
84
+ }
85
+ __decorate([
86
+ ValidateIf((_object, value) => value !== undefined),
87
+ IsBoolean(),
88
+ __metadata("design:type", Boolean)
89
+ ], RemoveTaskDto.prototype, "stopActive", void 0);
90
+ export class ClearHistoryDto {
91
+ scope;
92
+ }
93
+ __decorate([
94
+ IsIn(['library', 'ended']),
95
+ __metadata("design:type", String)
96
+ ], ClearHistoryDto.prototype, "scope", void 0);
97
+ export class RestoreHistoryDto {
98
+ backupId;
99
+ }
100
+ __decorate([
101
+ IsUUID(),
102
+ __metadata("design:type", String)
103
+ ], RestoreHistoryDto.prototype, "backupId", void 0);
104
+ export class DeleteDownloadsDto {
105
+ taskIds;
106
+ confirmDelete;
107
+ }
108
+ __decorate([
109
+ IsArray(),
110
+ ArrayMinSize(1),
111
+ ArrayMaxSize(100),
112
+ ArrayUnique(),
113
+ IsUUID('all', { each: true }),
114
+ __metadata("design:type", Array)
115
+ ], DeleteDownloadsDto.prototype, "taskIds", void 0);
116
+ __decorate([
117
+ IsIn([true]),
118
+ __metadata("design:type", Boolean)
119
+ ], DeleteDownloadsDto.prototype, "confirmDelete", void 0);
120
+ export class BinaryPathsDto {
121
+ 'yt-dlp';
122
+ ffmpeg;
123
+ ffprobe;
124
+ }
125
+ __decorate([
126
+ ValidateIf((_object, value) => value !== undefined),
127
+ IsString(),
128
+ MaxLength(4096),
129
+ __metadata("design:type", String)
130
+ ], BinaryPathsDto.prototype, "yt-dlp", void 0);
131
+ __decorate([
132
+ ValidateIf((_object, value) => value !== undefined),
133
+ IsString(),
134
+ MaxLength(4096),
135
+ __metadata("design:type", String)
136
+ ], BinaryPathsDto.prototype, "ffmpeg", void 0);
137
+ __decorate([
138
+ ValidateIf((_object, value) => value !== undefined),
139
+ IsString(),
140
+ MaxLength(4096),
141
+ __metadata("design:type", String)
142
+ ], BinaryPathsDto.prototype, "ffprobe", void 0);
143
+ export class AccelerationDto {
144
+ enabled;
145
+ maxConnections;
146
+ aria2Path;
147
+ }
148
+ __decorate([
149
+ IsBoolean(),
150
+ __metadata("design:type", Boolean)
151
+ ], AccelerationDto.prototype, "enabled", void 0);
152
+ __decorate([
153
+ IsInt(),
154
+ Min(1),
155
+ Max(16),
156
+ __metadata("design:type", Number)
157
+ ], AccelerationDto.prototype, "maxConnections", void 0);
158
+ __decorate([
159
+ IsString(),
160
+ MaxLength(4096),
161
+ __metadata("design:type", String)
162
+ ], AccelerationDto.prototype, "aria2Path", void 0);
163
+ export class UpdatePreferencesDto {
164
+ filenameTemplate;
165
+ preferredQuality;
166
+ language;
167
+ cookieStrategy;
168
+ acceleration;
169
+ downloadDirectory;
170
+ concurrency;
171
+ fragments;
172
+ proxy;
173
+ cookieBrowser;
174
+ cookieProfile;
175
+ cookiesFile;
176
+ binaryPaths;
177
+ }
178
+ __decorate([
179
+ ValidateIf((_object, value) => value !== undefined),
180
+ IsString(),
181
+ MaxLength(500),
182
+ __metadata("design:type", String)
183
+ ], UpdatePreferencesDto.prototype, "filenameTemplate", void 0);
184
+ __decorate([
185
+ ValidateIf((_object, value) => value !== undefined),
186
+ IsIn(['best', '2160', '1440', '1080', '720', '480', '360']),
187
+ __metadata("design:type", String)
188
+ ], UpdatePreferencesDto.prototype, "preferredQuality", void 0);
189
+ __decorate([
190
+ ValidateIf((_object, value) => value !== undefined),
191
+ IsIn(['system', 'zh-CN', 'en-US']),
192
+ __metadata("design:type", String)
193
+ ], UpdatePreferencesDto.prototype, "language", void 0);
194
+ __decorate([
195
+ ValidateIf((_object, value) => value !== undefined),
196
+ IsIn(['selected', 'auto']),
197
+ __metadata("design:type", String)
198
+ ], UpdatePreferencesDto.prototype, "cookieStrategy", void 0);
199
+ __decorate([
200
+ ValidateIf((_object, value) => value !== undefined),
201
+ ValidateNested(),
202
+ Type(() => AccelerationDto),
203
+ __metadata("design:type", AccelerationDto)
204
+ ], UpdatePreferencesDto.prototype, "acceleration", void 0);
205
+ __decorate([
206
+ ValidateIf((_object, value) => value !== undefined),
207
+ IsString(),
208
+ MaxLength(4096),
209
+ __metadata("design:type", String)
210
+ ], UpdatePreferencesDto.prototype, "downloadDirectory", void 0);
211
+ __decorate([
212
+ ValidateIf((_object, value) => value !== undefined),
213
+ IsInt(),
214
+ Min(1),
215
+ Max(4),
216
+ __metadata("design:type", Number)
217
+ ], UpdatePreferencesDto.prototype, "concurrency", void 0);
218
+ __decorate([
219
+ ValidateIf((_object, value) => value !== undefined),
220
+ IsInt(),
221
+ Min(1),
222
+ Max(16),
223
+ __metadata("design:type", Number)
224
+ ], UpdatePreferencesDto.prototype, "fragments", void 0);
225
+ __decorate([
226
+ ValidateIf((_object, value) => value !== undefined),
227
+ IsString(),
228
+ MaxLength(4096),
229
+ __metadata("design:type", String)
230
+ ], UpdatePreferencesDto.prototype, "proxy", void 0);
231
+ __decorate([
232
+ ValidateIf((_object, value) => value !== undefined),
233
+ IsIn(['', 'chrome', 'edge', 'firefox', 'safari', 'brave', 'chromium']),
234
+ __metadata("design:type", String)
235
+ ], UpdatePreferencesDto.prototype, "cookieBrowser", void 0);
236
+ __decorate([
237
+ ValidateIf((_object, value) => value !== undefined),
238
+ IsString(),
239
+ MaxLength(100),
240
+ __metadata("design:type", String)
241
+ ], UpdatePreferencesDto.prototype, "cookieProfile", void 0);
242
+ __decorate([
243
+ ValidateIf((_object, value) => value !== undefined),
244
+ IsString(),
245
+ MaxLength(4096),
246
+ __metadata("design:type", String)
247
+ ], UpdatePreferencesDto.prototype, "cookiesFile", void 0);
248
+ __decorate([
249
+ ValidateIf((_object, value) => value !== undefined),
250
+ ValidateNested(),
251
+ Type(() => BinaryPathsDto),
252
+ __metadata("design:type", BinaryPathsDto)
253
+ ], UpdatePreferencesDto.prototype, "binaryPaths", void 0);
254
+ export class InstallRuntimeDto {
255
+ force;
256
+ kinds;
257
+ }
258
+ __decorate([
259
+ ValidateIf((_object, value) => value !== undefined),
260
+ IsBoolean(),
261
+ __metadata("design:type", Boolean)
262
+ ], InstallRuntimeDto.prototype, "force", void 0);
263
+ __decorate([
264
+ IsArray(),
265
+ IsIn(['yt-dlp', 'ffmpeg', 'ffprobe'], { each: true }),
266
+ __metadata("design:type", Array)
267
+ ], InstallRuntimeDto.prototype, "kinds", void 0);
268
+ //# sourceMappingURL=media.dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.dto.js","sourceRoot":"","sources":["../../../../../../apps/api/src/media/dto/media.dto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /** 使用固定的无颜色、非人类单位输出,兼容 aria2 的回车刷新。 */
2
+ export function parseAria2Progress(line) {
3
+ const match = /\[#\w+\s+(\d+)B?\/(\d+)B?\([\d.]+%\)\s+CN:\d+\s+DL:(\d+)B?[^\]]*\]/.exec(line);
4
+ if (!match)
5
+ return null;
6
+ const [downloaded = NaN, total = NaN, speed = NaN] = match.slice(1).map(Number);
7
+ if (![downloaded, total, speed].every(Number.isSafeInteger) || downloaded > total)
8
+ return null;
9
+ return { downloaded, total, speed };
10
+ }
11
+ //# sourceMappingURL=aria2-progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aria2-progress.js","sourceRoot":"","sources":["../../../../../../apps/api/src/media/engines/aria2-progress.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,MAAM,UAAU,kBAAkB,CAChC,IAAY;IAEZ,MAAM,KAAK,GAAG,oEAAoE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9F,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,CAAC,UAAU,GAAG,GAAG,EAAE,KAAK,GAAG,GAAG,EAAE,KAAK,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAChF,IAAI,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,UAAU,GAAG,KAAK;QAAE,OAAO,IAAI,CAAC;IAC/F,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACtC,CAAC"}