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,52 @@
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 AppModule_1;
8
+ import { Module } from '@nestjs/common';
9
+ import { WechatService } from './media/wechat/wechat.service.js';
10
+ import { MediaController } from './media/media.controller.js';
11
+ import { MediaEngine } from './media/media.engine.js';
12
+ import { MediaService } from './media/media.service.js';
13
+ import { RuntimeService } from './runtime/runtime.service.js';
14
+ import { DATA_DIRECTORY, VaultStore } from './storage/vault.store.js';
15
+ import { ParseCache } from './media/parsing/cache.service.js';
16
+ import { CookieService } from './media/parsing/cookie.service.js';
17
+ import { PlatformParser } from './media/parsing/platform-parser.service.js';
18
+ import { BrowserPool } from './media/parsing/browser-pool.service.js';
19
+ import { NativeService } from './system/native.service.js';
20
+ import { SystemService } from './system/system.service.js';
21
+ import { JournalService } from './system/journal.service.js';
22
+ import { SystemController } from './system/system.controller.js';
23
+ import { ThumbnailService } from './media/thumbnail.service.js';
24
+ let AppModule = AppModule_1 = class AppModule {
25
+ static register(directory) {
26
+ return {
27
+ module: AppModule_1,
28
+ controllers: [MediaController, SystemController],
29
+ providers: [
30
+ { provide: DATA_DIRECTORY, useValue: directory },
31
+ VaultStore,
32
+ RuntimeService,
33
+ ParseCache,
34
+ CookieService,
35
+ BrowserPool,
36
+ PlatformParser,
37
+ WechatService,
38
+ JournalService,
39
+ NativeService,
40
+ SystemService,
41
+ MediaEngine,
42
+ ThumbnailService,
43
+ MediaService,
44
+ ],
45
+ };
46
+ }
47
+ };
48
+ AppModule = AppModule_1 = __decorate([
49
+ Module({})
50
+ ], AppModule);
51
+ export { AppModule };
52
+ //# sourceMappingURL=app.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.module.js","sourceRoot":"","sources":["../../../../apps/api/src/app.module.ts"],"names":[],"mappings":";;;;;;;AAAA,OAAO,EAAE,MAAM,EAAsB,MAAM,gBAAgB,CAAC;AAE5D,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAGzD,IAAM,SAAS,iBAAf,MAAM,SAAS;IACpB,MAAM,CAAC,QAAQ,CAAC,SAAiB;QAC/B,OAAO;YACL,MAAM,EAAE,WAAS;YACjB,WAAW,EAAE,CAAC,eAAe,EAAE,gBAAgB,CAAC;YAChD,SAAS,EAAE;gBACT,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,EAAE;gBAChD,UAAU;gBACV,cAAc;gBACd,UAAU;gBACV,aAAa;gBACb,WAAW;gBACX,cAAc;gBACd,aAAa;gBACb,cAAc;gBACd,aAAa;gBACb,aAAa;gBACb,WAAW;gBACX,gBAAgB;gBAChB,YAAY;aACb;SACF,CAAC;IACJ,CAAC;CACF,CAAA;AAvBY,SAAS;IADrB,MAAM,CAAC,EAAE,CAAC;GACE,SAAS,CAuBrB"}
@@ -0,0 +1,22 @@
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
+ import { Catch, HttpException } from '@nestjs/common';
8
+ import { businessErrorResponse } from './business-error.js';
9
+ /** Preserve actionable dependency/extractor messages without exposing a stack. */
10
+ let ApiErrorFilter = class ApiErrorFilter {
11
+ catch(error, host) {
12
+ const response = host.switchToHttp().getResponse();
13
+ response
14
+ .status(error instanceof HttpException ? error.getStatus() : 503)
15
+ .json(businessErrorResponse(error));
16
+ }
17
+ };
18
+ ApiErrorFilter = __decorate([
19
+ Catch()
20
+ ], ApiErrorFilter);
21
+ export { ApiErrorFilter };
22
+ //# sourceMappingURL=api-error.filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-error.filter.js","sourceRoot":"","sources":["../../../../../apps/api/src/common/api-error.filter.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,KAAK,EAAE,aAAa,EAA4C,MAAM,gBAAgB,CAAC;AAEhG,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,kFAAkF;AAE3E,IAAM,cAAc,GAApB,MAAM,cAAc;IACzB,KAAK,CAAC,KAAc,EAAE,IAAmB;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,WAAW,EAAY,CAAC;QAC7D,QAAQ;aACL,MAAM,CAAC,KAAK,YAAY,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;aAChE,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC;IACxC,CAAC;CACF,CAAA;AAPY,cAAc;IAD1B,KAAK,EAAE;GACK,cAAc,CAO1B"}
@@ -0,0 +1,21 @@
1
+ import { HttpException } from '@nestjs/common';
2
+ import { businessMessage, errorMessage, readBusinessMessage, } from '../../../shared/src/messages.js';
3
+ /** The HTTP and Agent boundaries serialize the same service errors. */
4
+ export function businessErrorResponse(error, fallback) {
5
+ if (!(error instanceof HttpException))
6
+ return errorMessage(error, fallback);
7
+ const response = error.getResponse();
8
+ const known = readBusinessMessage(response);
9
+ if (known)
10
+ return known;
11
+ const status = error.getStatus();
12
+ const code = status === 400 ? 'VALIDATION_FAILED' : status === 404 ? 'ROUTE_NOT_FOUND' : 'REQUEST_FAILED';
13
+ const value = typeof response === 'string' ? response : response.message;
14
+ const detail = Array.isArray(value)
15
+ ? value.join('; ')
16
+ : typeof value === 'string'
17
+ ? value
18
+ : error.message;
19
+ return businessMessage(code, { fields: detail }, detail);
20
+ }
21
+ //# sourceMappingURL=business-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"business-error.js","sourceRoot":"","sources":["../../../../../apps/api/src/common/business-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EACL,eAAe,EACf,YAAY,EACZ,mBAAmB,GAGpB,MAAM,iCAAiC,CAAC;AAEzC,uEAAuE;AACvE,MAAM,UAAU,qBAAqB,CAAC,KAAc,EAAE,QAAuB;IAC3E,IAAI,CAAC,CAAC,KAAK,YAAY,aAAa,CAAC;QAAE,OAAO,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAE5E,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IAExB,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;IACjC,MAAM,IAAI,GACR,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAC/F,MAAM,KAAK,GACT,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAE,QAAkC,CAAC,OAAO,CAAC;IACxF,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACjC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAClB,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ;YACzB,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;IACpB,OAAO,eAAe,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,89 @@
1
+ import { BusinessError } from '../../../shared/src/messages.js';
2
+ import { request as requestHttp } from 'node:http';
3
+ import { request as requestHttps } from 'node:https';
4
+ import { Readable } from 'node:stream';
5
+ import { createBrotliDecompress, createGunzip, createInflate } from 'node:zlib';
6
+ import { HttpProxyAgent } from 'http-proxy-agent';
7
+ import { HttpsProxyAgent } from 'https-proxy-agent';
8
+ import { SocksProxyAgent } from 'socks-proxy-agent';
9
+ /** 同一传输层用于平台 API、CDN、缩略图与代理测试;保留证书校验。 */
10
+ async function requestOnce(url, options) {
11
+ options.signal?.throwIfAborted();
12
+ if (!['http:', 'https:'].includes(url.protocol))
13
+ throw new BusinessError('HTTP_ONLY');
14
+ const agent = !options.proxy
15
+ ? undefined
16
+ : options.proxy.startsWith('socks')
17
+ ? new SocksProxyAgent(options.proxy)
18
+ : url.protocol === 'https:'
19
+ ? new HttpsProxyAgent(options.proxy)
20
+ : new HttpProxyAgent(options.proxy);
21
+ return new Promise((resolve, reject) => {
22
+ const send = url.protocol === 'https:' ? requestHttps : requestHttp;
23
+ const request = send(url, { method: options.method ?? 'GET', headers: options.headers, agent, signal: options.signal }, (incoming) => {
24
+ clearTimeout(headerTimer);
25
+ const headers = new Headers();
26
+ for (let index = 0; index < incoming.rawHeaders.length; index += 2) {
27
+ headers.append(incoming.rawHeaders[index], incoming.rawHeaders[index + 1]);
28
+ }
29
+ incoming.once('close', () => agent?.destroy());
30
+ const status = incoming.statusCode ?? 502;
31
+ const withoutBody = options.method === 'HEAD' || [204, 205, 304].includes(status);
32
+ const encoding = incoming.headers['content-encoding'];
33
+ const decompressor = encoding === 'gzip'
34
+ ? createGunzip()
35
+ : encoding === 'br'
36
+ ? createBrotliDecompress()
37
+ : encoding === 'deflate'
38
+ ? createInflate()
39
+ : undefined;
40
+ if (decompressor) {
41
+ incoming.once('error', (error) => decompressor.destroy(error));
42
+ headers.delete('content-encoding');
43
+ headers.delete('content-length');
44
+ }
45
+ const stream = decompressor ? incoming.pipe(decompressor) : incoming;
46
+ const body = withoutBody ? null : Readable.toWeb(stream);
47
+ if (withoutBody)
48
+ incoming.resume();
49
+ const result = new Response(body, { status, statusText: incoming.statusMessage, headers });
50
+ Object.defineProperty(result, 'url', { value: url.href });
51
+ resolve(result);
52
+ });
53
+ const headerTimer = setTimeout(() => request.destroy(new BusinessError('RESPONSE_TIMEOUT')), options.timeoutMs ?? 30_000);
54
+ headerTimer.unref();
55
+ request.setTimeout(options.timeoutMs ?? 30_000, () => request.destroy(new BusinessError('CONNECTION_TIMEOUT')));
56
+ request.once('error', (error) => {
57
+ clearTimeout(headerTimer);
58
+ agent?.destroy();
59
+ reject(error);
60
+ });
61
+ if (options.body)
62
+ request.write(options.body);
63
+ request.end();
64
+ });
65
+ }
66
+ export async function fetchNetwork(input, options = {}) {
67
+ let url = new URL(input);
68
+ let current = { ...options, headers: { ...options.headers } };
69
+ for (let redirects = 0; redirects <= 8; redirects++) {
70
+ await current.validateUrl?.(url);
71
+ const response = await requestOnce(url, current);
72
+ if (![301, 302, 303, 307, 308].includes(response.status))
73
+ return response;
74
+ const location = response.headers.get('location');
75
+ if (!location)
76
+ return response;
77
+ await response.body?.cancel();
78
+ const next = new URL(location, url);
79
+ if (next.origin !== url.origin) {
80
+ current.headers = Object.fromEntries(Object.entries(current.headers).filter(([name]) => !['cookie', 'authorization'].includes(name.toLowerCase())));
81
+ }
82
+ if (response.status === 303 ||
83
+ ([301, 302].includes(response.status) && current.method === 'POST'))
84
+ current = { ...current, method: 'GET', body: undefined };
85
+ url = next;
86
+ }
87
+ throw new BusinessError('TOO_MANY_REDIRECTS');
88
+ }
89
+ //# sourceMappingURL=network.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.js","sourceRoot":"","sources":["../../../../../apps/api/src/common/network.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ import { BusinessError } from '../../../shared/src/messages.js';
2
+ import { spawn } from 'node:child_process';
3
+ import { createInterface } from 'node:readline';
4
+ import { StringDecoder } from 'node:string_decoder';
5
+ /** Kill the full process group, including FFmpeg, and settle only after close. */
6
+ function terminate(child) {
7
+ if (!child.pid)
8
+ return;
9
+ if (process.platform === 'win32') {
10
+ const killer = spawn('taskkill', ['/pid', String(child.pid), '/T', '/F'], {
11
+ windowsHide: true,
12
+ stdio: 'ignore',
13
+ });
14
+ killer.on('error', () => child.kill());
15
+ return;
16
+ }
17
+ try {
18
+ process.kill(-child.pid, 'SIGTERM');
19
+ }
20
+ catch {
21
+ child.kill('SIGTERM');
22
+ }
23
+ }
24
+ export function runProcess(binary, args, options = {}) {
25
+ options.signal?.throwIfAborted();
26
+ return new Promise((resolve, reject) => {
27
+ const child = spawn(binary, args, {
28
+ windowsHide: true,
29
+ detached: process.platform !== 'win32',
30
+ stdio: ['ignore', 'pipe', 'pipe'],
31
+ });
32
+ let stdout = '';
33
+ let stderr = '';
34
+ let failure;
35
+ let killTimer;
36
+ const decoder = new StringDecoder('utf8');
37
+ const stop = () => {
38
+ terminate(child);
39
+ killTimer ??= setTimeout(() => {
40
+ if (!child.pid || process.platform === 'win32')
41
+ return;
42
+ try {
43
+ process.kill(-child.pid, 'SIGKILL');
44
+ }
45
+ catch {
46
+ /* Already closed. */
47
+ }
48
+ }, 3_000);
49
+ killTimer.unref();
50
+ };
51
+ const timer = options.timeoutMs === 0
52
+ ? undefined
53
+ : setTimeout(() => {
54
+ failure = new BusinessError('PROCESS_TIMEOUT');
55
+ stop();
56
+ }, options.timeoutMs ?? 3_600_000);
57
+ timer?.unref();
58
+ options.signal?.addEventListener('abort', stop, { once: true });
59
+ child.stdout.on('data', (chunk) => {
60
+ stdout += decoder.write(chunk);
61
+ if (stdout.length > 8 * 1024 * 1024) {
62
+ if (options.line)
63
+ stdout = stdout.slice(-512_000);
64
+ else {
65
+ failure = new BusinessError('PROCESS_OUTPUT_LIMIT');
66
+ stop();
67
+ }
68
+ }
69
+ });
70
+ child.stderr.on('data', (chunk) => {
71
+ stderr = (stderr + chunk.toString('utf8')).slice(-16_000);
72
+ });
73
+ const readers = options.line
74
+ ? [child.stdout, child.stderr].map((stream) => {
75
+ const reader = createInterface({ input: stream });
76
+ reader.on('line', options.line);
77
+ return reader;
78
+ })
79
+ : [];
80
+ child.on('error', (error) => {
81
+ failure = error;
82
+ });
83
+ child.on('close', (code) => {
84
+ clearTimeout(timer);
85
+ clearTimeout(killTimer);
86
+ options.signal?.removeEventListener('abort', stop);
87
+ readers.forEach((reader) => reader.close());
88
+ if (options.signal?.aborted)
89
+ return reject(options.signal.reason);
90
+ if (failure)
91
+ return reject(failure);
92
+ if (code !== 0)
93
+ return reject(new BusinessError('PROCESS_FAILED', {
94
+ reason: stderr.trim().slice(-2_000) || String(code),
95
+ exitCode: code ?? -1,
96
+ }));
97
+ resolve({ stdout: stdout + decoder.end(), stderr });
98
+ });
99
+ });
100
+ }
101
+ //# sourceMappingURL=process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["../../../../../apps/api/src/common/process.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { BadRequestException } from '@nestjs/common';
2
+ import { plainToInstance } from 'class-transformer';
3
+ import { isUUID, validate } from 'class-validator';
4
+ import { businessMessage } from '../../../shared/src/messages.js';
5
+ export function validateUuid(value, field) {
6
+ if (!isUUID(value))
7
+ throw new BadRequestException(businessMessage('VALIDATION_FAILED', { fields: field }));
8
+ }
9
+ export function invalidDto(errors) {
10
+ const fields = (items, prefix = '') => items.flatMap((error) => {
11
+ const property = prefix ? `${prefix}.${error.property}` : error.property;
12
+ return [...(error.constraints ? [property] : []), ...fields(error.children ?? [], property)];
13
+ });
14
+ return new BadRequestException(businessMessage('VALIDATION_FAILED', {
15
+ fields: [...new Set(fields(errors))].sort().join(', '),
16
+ }));
17
+ }
18
+ /** The Agent boundary uses the same DTO validation as HTTP controllers. */
19
+ export async function validateDto(type, value) {
20
+ const dto = plainToInstance(type, value);
21
+ const errors = await validate(dto, {
22
+ whitelist: true,
23
+ forbidNonWhitelisted: true,
24
+ forbidUnknownValues: true,
25
+ });
26
+ if (errors.length)
27
+ throw invalidDto(errors);
28
+ return dto;
29
+ }
30
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../../../apps/api/src/common/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAyB,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAwB,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAElE,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,KAAa;IACvD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QAChB,MAAM,IAAI,mBAAmB,CAAC,eAAe,CAAC,mBAAmB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AAC3F,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAyB;IAClD,MAAM,MAAM,GAAG,CAAC,KAAwB,EAAE,MAAM,GAAG,EAAE,EAAY,EAAE,CACjE,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QACtB,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC/F,CAAC,CAAC,CAAC;IAEL,OAAO,IAAI,mBAAmB,CAC5B,eAAe,CAAC,mBAAmB,EAAE;QACnC,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;KACvD,CAAC,CACH,CAAC;AACJ,CAAC;AAED,2EAA2E;AAC3E,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAyB,EACzB,KAAc;IAEd,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE;QACjC,SAAS,EAAE,IAAI;QACf,oBAAoB,EAAE,IAAI;QAC1B,mBAAmB,EAAE,IAAI;KAC1B,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,MAAM;QAAE,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;IAE5C,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,65 @@
1
+ import 'reflect-metadata';
2
+ import { NestFactory } from '@nestjs/core';
3
+ import { ValidationPipe } from '@nestjs/common';
4
+ import { ExpressAdapter } from '@nestjs/platform-express';
5
+ import express from 'express';
6
+ import { API_PREFIX } from '../../shared/src/contracts.js';
7
+ import { AppModule } from './app.module.js';
8
+ import { MediaService } from './media/media.service.js';
9
+ import { ApiErrorFilter } from './common/api-error.filter.js';
10
+ import { invalidDto } from './common/validation.js';
11
+ import { businessMessage } from '../../shared/src/messages.js';
12
+ export function localRequestPolicy(request, response, next) {
13
+ const allowed = new Set(['127.0.0.1', 'localhost', '[::1]']);
14
+ let target;
15
+ try {
16
+ target = new URL(`http://${request.headers.host ?? ''}`);
17
+ }
18
+ catch {
19
+ response.status(403).json(businessMessage('REQUEST_FORBIDDEN'));
20
+ return;
21
+ }
22
+ if (!allowed.has(target.hostname) ||
23
+ !['127.0.0.1', '::1', '::ffff:127.0.0.1'].includes(request.socket.remoteAddress ?? '') ||
24
+ (request.headers.origin !== undefined && request.headers.origin !== target.origin) ||
25
+ request.headers['sec-fetch-site'] === 'cross-site') {
26
+ response.status(403).json(businessMessage('REQUEST_FORBIDDEN'));
27
+ return;
28
+ }
29
+ next();
30
+ }
31
+ export async function createApplication(directory, standalone = false) {
32
+ const http = express();
33
+ http.disable('x-powered-by');
34
+ if (standalone)
35
+ http.use(API_PREFIX, localRequestPolicy);
36
+ http.use((_request, response, next) => {
37
+ response.setHeader('Cache-Control', 'no-store');
38
+ response.setHeader('X-Content-Type-Options', 'nosniff');
39
+ next();
40
+ });
41
+ const app = await NestFactory.create(AppModule.register(directory), new ExpressAdapter(http), {
42
+ logger: ['error', 'warn'],
43
+ bodyParser: false,
44
+ });
45
+ app.use(express.json({ limit: '64kb' }));
46
+ app.setGlobalPrefix(API_PREFIX.slice(1));
47
+ app.useGlobalPipes(new ValidationPipe({
48
+ transform: true,
49
+ whitelist: true,
50
+ forbidNonWhitelisted: true,
51
+ forbidUnknownValues: true,
52
+ exceptionFactory: invalidDto,
53
+ }));
54
+ app.useGlobalFilters(new ApiErrorFilter());
55
+ await app.init();
56
+ try {
57
+ await app.get(MediaService).initialize();
58
+ }
59
+ catch (error) {
60
+ await app.close();
61
+ throw error;
62
+ }
63
+ return { app, http };
64
+ }
65
+ //# sourceMappingURL=create-application.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-application.js","sourceRoot":"","sources":["../../../../apps/api/src/create-application.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { resolve } from 'node:path';
2
+ import { createApplication } from './create-application.js';
3
+ import { API_PREFIX } from '../../shared/src/contracts.js';
4
+ const { app } = await createApplication(resolve(process.env.STREAMNEST_DATA_DIR ?? '.data'), true);
5
+ const port = Number(process.env.STREAMNEST_PORT ?? 4322);
6
+ app.enableShutdownHooks();
7
+ await app.listen(port, '127.0.0.1');
8
+ console.log(`拾流 API:http://127.0.0.1:${port}${API_PREFIX}`);
9
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../../../apps/api/src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;AACnG,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,CAAC;AAEzD,GAAG,CAAC,mBAAmB,EAAE,CAAC;AAC1B,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;AACpC,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,GAAG,UAAU,EAAE,CAAC,CAAC"}
@@ -0,0 +1,120 @@
1
+ import { dirname } from 'node:path';
2
+ import { browserCookieSource, effectiveLoginPreferences } from '../../../shared/src/cookies.js';
3
+ export const PROGRESS_PREFIX = '[mv-progress]';
4
+ export const FILE_PREFIX = '[mv-file]';
5
+ export const POSTPROCESS_PREFIX = '[mv-process]';
6
+ export const ENGINE_PREFIX = '[mv-engine]';
7
+ export function commonArguments(preferences, options = {}) {
8
+ preferences = effectiveLoginPreferences(preferences);
9
+ const args = [
10
+ '--ignore-config',
11
+ '--no-playlist',
12
+ '--playlist-items',
13
+ '1',
14
+ '--encoding',
15
+ 'utf-8',
16
+ '--socket-timeout',
17
+ '20',
18
+ '--retries',
19
+ '3',
20
+ ];
21
+ if (preferences.proxy)
22
+ args.push('--proxy', preferences.proxy);
23
+ if (options.cookies !== false && preferences.cookiesFile)
24
+ args.push('--cookies', preferences.cookiesFile);
25
+ else if (options.cookies !== false && preferences.cookieBrowser)
26
+ args.push('--cookies-from-browser', browserCookieSource(preferences));
27
+ // Harness runs on Node; never use the Electron launcher as a JS runtime.
28
+ if (options.runtime !== false && !process.versions.electron)
29
+ args.push('--js-runtimes', `node:${process.execPath}`);
30
+ return args;
31
+ }
32
+ export function downloadArguments(media, request, preferences, outputDirectory, ffmpeg, context) {
33
+ const format = media.formats.find((entry) => entry.id === request.formatId);
34
+ const track = media.audioTracks.find((entry) => entry.id === request.audioTrackId);
35
+ const audio = track?.id ?? 'bestaudio';
36
+ const preferredHeight = Number(preferences.preferredQuality);
37
+ const bestVideo = preferredHeight > 0
38
+ ? `bv*[height<=${preferredHeight}]+${audio}/b[height<=${preferredHeight}]`
39
+ : `bv*+${audio}/b`;
40
+ const selector = track?.isM3u8
41
+ ? (track.formatId ?? track.id)
42
+ : !format
43
+ ? bestVideo
44
+ : format.hasAudio && !track
45
+ ? `${format.id}/bv*+ba/b`
46
+ : `${format.id}+${audio}/${format.id}/bv*+ba/b`;
47
+ const args = [
48
+ ...commonArguments(preferences, context ? { cookies: false, runtime: !context.jsRuntime } : {}),
49
+ '--no-overwrites',
50
+ '--continue',
51
+ '--newline',
52
+ '--progress',
53
+ '--progress-template',
54
+ `download:${PROGRESS_PREFIX}%(progress.downloaded_bytes)s|%(progress.total_bytes)s|%(progress.total_bytes_estimate)s|%(progress.speed)s|%(progress.eta)s`,
55
+ '--progress-template',
56
+ `postprocess:${POSTPROCESS_PREFIX}%(progress.status)s`,
57
+ '--print',
58
+ `after_move:${FILE_PREFIX}%(filepath)s`,
59
+ '--concurrent-fragments',
60
+ String(preferences.fragments),
61
+ '--http-chunk-size',
62
+ '10M',
63
+ '--paths',
64
+ outputDirectory,
65
+ '-o',
66
+ completeFilenameTemplate(preferences.filenameTemplate),
67
+ ];
68
+ if (ffmpeg)
69
+ args.push('--ffmpeg-location', dirname(ffmpeg));
70
+ if (request.mode === 'subtitle')
71
+ args.push('--skip-download');
72
+ else if (request.mode === 'audio')
73
+ args.push('-f', request.audioFormatId ?? track?.id ?? 'bestaudio/best', '-x', '--audio-format', 'mp3', '--audio-quality', '0');
74
+ else
75
+ args.push('-f', selector, '--merge-output-format', 'mp4');
76
+ if (request.subtitles?.length)
77
+ args.push('--write-subs', '--write-auto-subs', '--sub-langs', request.subtitles.join(','), '--sub-format', 'srt/best');
78
+ if (request.subtitles?.length && request.subtitleFormat !== 'source')
79
+ args.push('--convert-subs', 'srt');
80
+ if (context) {
81
+ args.push(...context.cookieArgs, ...context.extractorArgs);
82
+ if (context.jsRuntime)
83
+ args.push('--js-runtimes', `${context.jsRuntime.kind}:${context.jsRuntime.path}`);
84
+ if (context.aria2Path) {
85
+ const connections = preferences.acceleration?.enabled === false
86
+ ? 1
87
+ : (preferences.acceleration?.maxConnections ?? 8);
88
+ args.push('--downloader', `http:${context.aria2Path}`, '--downloader', 'dash,m3u8:native', '--downloader-args', `aria2c:--no-conf=true --max-connection-per-server=${connections} --split=${connections} --min-split-size=1M --file-allocation=none --max-tries=3 --retry-wait=2 --connect-timeout=15 --timeout=30 --auto-save-interval=1 --check-certificate=true --enable-color=false --human-readable=false --summary-interval=1`, '--paths', `temp:${outputDirectory}/.aria2`);
89
+ }
90
+ }
91
+ if (context?.cachePath)
92
+ args.push('--load-info-json', context.cachePath);
93
+ else
94
+ args.push('--', media.url);
95
+ return args;
96
+ }
97
+ export function completeFilenameTemplate(template = '%(title).160B [%(id)s].%(ext)s') {
98
+ return template.includes('%(ext)') ? template : `${template}.%(ext)s`;
99
+ }
100
+ export function parseProgress(line) {
101
+ if (!line.startsWith(PROGRESS_PREFIX))
102
+ return undefined;
103
+ const values = line
104
+ .slice(PROGRESS_PREFIX.length)
105
+ .split('|')
106
+ .map((value) => {
107
+ const number = Number(value);
108
+ return Number.isFinite(number) ? Math.max(0, number) : 0;
109
+ });
110
+ const [downloadedBytes = 0, exact = 0, estimate = 0, speed = 0, eta = 0] = values;
111
+ const totalBytes = exact || estimate;
112
+ return {
113
+ downloadedBytes,
114
+ totalBytes,
115
+ speed,
116
+ eta,
117
+ progress: totalBytes ? Math.min(99, (downloadedBytes / totalBytes) * 100) : 0,
118
+ };
119
+ }
120
+ //# sourceMappingURL=arguments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arguments.js","sourceRoot":"","sources":["../../../../../apps/api/src/media/arguments.ts"],"names":[],"mappings":"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"}