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,15 @@
1
+ export function browserSupportsProfiles(browser) {
2
+ return ['chrome', 'edge', 'firefox', 'brave', 'chromium'].includes(browser);
3
+ }
4
+ /** 仅保留账号标签;Local State 的加密密钥及其他字段不传输、不缓存。 */
5
+ export function chromiumProfiles(content) {
6
+ const value = JSON.parse(content);
7
+ return Object.entries(value.profile?.info_cache ?? {})
8
+ .filter(([id]) => /^(?:Default|Profile \d+)$/.test(id))
9
+ .map(([id, info]) => {
10
+ const name = (info.name?.trim() || info.gaia_name?.trim() || id).slice(0, 100);
11
+ const account = (info.user_name?.trim() || '').slice(0, 300);
12
+ return { id, name, account, label: account ? `${name} · ${account}` : `${name} · ${id}` };
13
+ });
14
+ }
15
+ //# sourceMappingURL=browser-profiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-profiles.js","sourceRoot":"","sources":["../../../../apps/shared/src/browser-profiles.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACrD,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC9E,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAI/B,CAAC;IACF,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,IAAI,EAAE,CAAC;SACnD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,2BAA2B,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SACtD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE;QAClB,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC/E,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC7D,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,EAAE,EAAE,EAAE,CAAC;IAC5F,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { BRAND } from './brand.js';
2
+ export const API_PREFIX = `/${BRAND.id}/api`;
3
+ export const DOWNLOAD_MODES = ['video', 'audio', 'subtitle'];
4
+ export const TASK_STATES = [
5
+ 'queued',
6
+ 'downloading',
7
+ 'processing',
8
+ 'paused',
9
+ 'completed',
10
+ 'failed',
11
+ 'cancelled',
12
+ ];
13
+ //# sourceMappingURL=contracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../../../apps/shared/src/contracts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGnC,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,KAAK,CAAC,EAAE,MAAM,CAAC;AAC7C,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAAU,CAAC;AACtE,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,QAAQ;IACR,aAAa;IACb,YAAY;IACZ,QAAQ;IACR,WAAW;IACX,QAAQ;IACR,WAAW;CACH,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { browserSupportsProfiles } from './browser-profiles.js';
2
+ export function browserAccountError(preferences) {
3
+ if (preferences.cookieStrategy !== 'auto' &&
4
+ !preferences.cookiesFile &&
5
+ browserSupportsProfiles(preferences.cookieBrowser) &&
6
+ !preferences.cookieProfile?.trim())
7
+ return '请选择要使用的浏览器账号,或提供 Cookie 文件;不会自动使用默认账号。';
8
+ }
9
+ /** 自动模式保留手动表单草稿,但实际请求不使用隐藏的手动来源。 */
10
+ export function effectiveLoginPreferences(preferences) {
11
+ if (preferences.cookieStrategy === 'auto')
12
+ return { ...preferences, cookieBrowser: '', cookieProfile: '', cookiesFile: '' };
13
+ return browserSupportsProfiles(preferences.cookieBrowser)
14
+ ? preferences
15
+ : { ...preferences, cookieProfile: '' };
16
+ }
17
+ export function browserCookieSource(preferences, browser = preferences.cookieBrowser) {
18
+ const profile = preferences.cookieStrategy !== 'auto' && browserSupportsProfiles(browser)
19
+ ? preferences.cookieProfile?.trim()
20
+ : '';
21
+ return profile && browser ? `${browser}:${profile}` : browser;
22
+ }
23
+ //# sourceMappingURL=cookies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookies.js","sourceRoot":"","sources":["../../../../apps/shared/src/cookies.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,MAAM,UAAU,mBAAmB,CAAC,WAAwB;IAC1D,IACE,WAAW,CAAC,cAAc,KAAK,MAAM;QACrC,CAAC,WAAW,CAAC,WAAW;QACxB,uBAAuB,CAAC,WAAW,CAAC,aAAa,CAAC;QAClD,CAAC,WAAW,CAAC,aAAa,EAAE,IAAI,EAAE;QAElC,OAAO,wCAAwC,CAAC;AACpD,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,yBAAyB,CAAC,WAAwB;IAChE,IAAI,WAAW,CAAC,cAAc,KAAK,MAAM;QACvC,OAAO,EAAE,GAAG,WAAW,EAAE,aAAa,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IAEnF,OAAO,uBAAuB,CAAC,WAAW,CAAC,aAAa,CAAC;QACvD,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,EAAE,GAAG,WAAW,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,WAAwB,EACxB,UAAkB,WAAW,CAAC,aAAa;IAE3C,MAAM,OAAO,GACX,WAAW,CAAC,cAAc,KAAK,MAAM,IAAI,uBAAuB,CAAC,OAAO,CAAC;QACvE,CAAC,CAAC,WAAW,CAAC,aAAa,EAAE,IAAI,EAAE;QACnC,CAAC,CAAC,EAAE,CAAC;IAET,OAAO,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;AAChE,CAAC"}
@@ -0,0 +1,7 @@
1
+ /** 从平台分享文案中提取首个链接,页面与 Agent 共用。 */
2
+ export function extractMediaLink(input) {
3
+ const text = input.trim();
4
+ const match = /https?:\/\/[^\s<>"`\u3000-\u303f\u4e00-\u9fff]+/i.exec(text);
5
+ return (match?.[0] ?? text).replace(/[),.;!,。;!)]+$/, '');
6
+ }
7
+ //# sourceMappingURL=links.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"links.js","sourceRoot":"","sources":["../../../../apps/shared/src/links.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAG,kDAAkD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5E,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,17 @@
1
+ const extensions = {
2
+ video: /\.(?:mp4|m4v|mkv|webm|mov|avi|flv|mpeg|mpg|ts|m2ts|wmv|ogv|3gp)$/i,
3
+ audio: /\.(?:mp3|m4a|aac|flac|wav|ogg|opus|wma|aiff|alac)$/i,
4
+ };
5
+ export function mediaFileMode(name) {
6
+ if (extensions.video.test(name))
7
+ return 'video';
8
+ if (extensions.audio.test(name))
9
+ return 'audio';
10
+ return undefined;
11
+ }
12
+ export function playableArtifactIndex(task) {
13
+ if (task.request.mode === 'subtitle')
14
+ return -1;
15
+ return task.artifacts.findIndex((file) => file.exists !== false && mediaFileMode(file.name) === task.request.mode);
16
+ }
17
+ //# sourceMappingURL=media-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-files.js","sourceRoot":"","sources":["../../../../apps/shared/src/media-files.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAAG;IACjB,KAAK,EAAE,mEAAmE;IAC1E,KAAK,EAAE,qDAAqD;CAC7D,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC;IAChD,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC;IAChD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAiD;IACrF,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,CAAC,CAAC,CAAC;IAEhD,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAC7B,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,KAAK,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAClF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,255 @@
1
+ /** Stable business identifiers. Messages are a fallback for older/unknown clients. */
2
+ export const BUSINESS_MESSAGES = {
3
+ RUNTIME_ARCHIVE_INVALID: '安装包格式无效或不包含安全的可执行文件,旧工具已保留。',
4
+ RUNTIME_ARCHIVE_ENTRY_MISSING: '安装包中缺少 {entry},旧工具已保留。',
5
+ RUNTIME_VERSION_MISMATCH: '{kind} 版本不符:需要 {expected},实际为 {actual};旧工具已保留。',
6
+ TASK_FAILED_UNKNOWN: '下载失败。',
7
+ PARSE_WECHAT_RESOLVED: '视频号分享链接已通过腾讯元宝解析。',
8
+ HTTP_ONLY: '只支持 HTTP(S) 请求。',
9
+ RESPONSE_TIMEOUT: '网络请求响应超时。',
10
+ CONNECTION_TIMEOUT: '网络连接超时。',
11
+ TOO_MANY_REDIRECTS: '网络重定向次数过多。',
12
+ PROCESS_TIMEOUT: '运行超时,请检查网络或运行依赖。',
13
+ PROCESS_OUTPUT_LIMIT: '解析结果超过 8 MB,已停止进程。',
14
+ DOWNLOAD_INCOMPLETE: '下载数据不完整',
15
+ HTTP_RANGE_OVERFLOW: '分段数据超出请求范围',
16
+ SEGMENT_INCOMPLETE: '分段数据不完整',
17
+ FILE_WRITE_FAILED: '文件写入失败',
18
+ DOWNLOAD_TIMEOUT: '下载连接读取超时',
19
+ THUMBNAIL_CANCELLED: '图片请求已取消。',
20
+ PARSE_CANCELLED: '解析已取消。',
21
+ MEDIA_URL_INVALID: '请输入完整的 HTTP 或 HTTPS 媒体链接。',
22
+ MEDIA_URL_CREDENTIALS: '仅支持不含账号密码的 HTTP 或 HTTPS 链接。',
23
+ MEDIA_URL_PUBLIC_REQUIRED: '媒体链接必须指向公开网站。',
24
+ MEDIA_URL_PRIVATE: '不支持本机或内网媒体链接。',
25
+ LIVE_UNSUPPORTED: '暂不支持正在直播的媒体,请使用已结束的回放。',
26
+ PARSE_RUNTIME_UNAVAILABLE: '[[parse-error:runtime-unavailable]]YouTube 解析需要可运行的 Node.js 22+ 或 Deno 2.3+。',
27
+ WECHAT_FORMAT_UNAVAILABLE: '视频号没有可用的所选视频格式。',
28
+ ARIA2_RESUME_REQUIRED: '此任务使用 aria2 片段,请安装或重新指定 aria2 后继续,避免混用不兼容的断点。',
29
+ OUTPUT_PATH_ESCAPE: '文件名模板生成了下载目录外的路径。',
30
+ WECHAT_VIDEO_TRACK_MISSING: '视频号下载文件没有可播放的视频轨道。',
31
+ FILENAME_TEMPLATE_INVALID: '文件名模板必须是下载目录内的相对模板,不能包含父目录或控制字符。',
32
+ ARIA2_PATH_INVALID: 'aria2 路径必须为本机绝对路径。',
33
+ BROWSER_PROFILE_INVALID: '浏览器配置目录只支持 Default、Profile 4 等目录名。',
34
+ DOWNLOAD_DIRECTORY_INVALID: '下载目录必须为本机绝对路径。',
35
+ DIRECTORY_SYNC_FAILED: '无法同步下载目录,记录未改动:{reason}',
36
+ DIRECTORY_SYNC_LIMIT: '目录条目超过 50000 个,请缩小下载目录后重试;记录未改动。',
37
+ DIRECTORY_SYNC_CANCELLED: '目录同步已取消。',
38
+ DELETE_CONFIRM_REQUIRED: '请再次确认永久删除所选下载文件,此操作无法撤销。',
39
+ DELETE_COMPLETED_ONLY: '只能删除已完成下载的文件。',
40
+ DELETE_PATH_UNSAFE: '文件路径越界、包含符号链接或不是普通文件,未删除。',
41
+ DELETE_FILE_SHARED: '文件被其他未选中的下载记录或活动任务使用,未删除。',
42
+ DELETE_FAILED: '文件删除失败,记录已保留:{reason}',
43
+ DELETE_CANCELLED: '已停止删除;已删除文件的记录仍会同步。',
44
+ DELETE_SYNC_FAILED: '已删除 {deleted} 个文件,但记录更新失败,请重试或同步目录:{reason}',
45
+ DEPENDENCY_PATH_INVALID: 'Cookie 和运行依赖路径必须为本机绝对路径。',
46
+ PROXY_INVALID: '代理地址无效。',
47
+ PROXY_UNSUPPORTED: '代理仅支持 HTTP(S) / SOCKS5,暂不支持地址内凭据。',
48
+ COOKIE_FILE_TOO_LARGE: 'Cookie 文件必须小于 10 MB。',
49
+ COOKIE_FILE_FORMAT_INVALID: '请选择已导出的 Netscape 格式 cookies.txt,浏览器内部的 Cookies 数据库无法导入。也可以清空此项,直接选择浏览器账号。',
50
+ PAGINATION_INVALID: '分页参数无效:limit 为 1–100,offset 为非负整数。',
51
+ TASK_SCOPE_INVALID: 'scope 无效。',
52
+ TASK_NOT_FOUND: '下载任务不存在。',
53
+ TASK_LIMIT: '已达到 5000 条任务上限,请先备份并整理数据。',
54
+ PARSE_EXPIRED: '解析结果已过期,请重新解析链接。',
55
+ FORMAT_NOT_FOUND: '所选格式不存在。',
56
+ AUDIO_TRACK_NOT_FOUND: '所选音轨不存在。',
57
+ SUBTITLE_NOT_FOUND: '所选字幕语言不存在。',
58
+ AUDIO_FORMAT_NOT_FOUND: '所选音频格式不存在。',
59
+ SUBTITLE_REQUIRED: '请选择至少一种字幕语言。',
60
+ TASK_DUPLICATE: '相同下载任务已在队列中。',
61
+ TASK_ACTION_INVALID: '当前任务状态不支持此操作。',
62
+ TASK_STOPPED: '任务已停止。',
63
+ TASK_ARCHIVE_ACTIVE: '请先完成或取消任务,再归档。',
64
+ TASK_REMOVE_ACTIVE: '请先取消任务,或明确选择停止并移除。',
65
+ TASK_REMOVED: '任务已停止并移除。',
66
+ TASK_RESTORE_LIMIT: '恢复后会超过 5000 条记录上限。',
67
+ DOWNLOAD_OUTPUT_MISSING: '下载未生成可用文件,请检查字幕或格式选择。',
68
+ ARTIFACT_NOT_FOUND: '媒体文件不存在。',
69
+ ARTIFACT_PATH_ESCAPE: '媒体文件路径越界。',
70
+ ARTIFACT_MOVED: '媒体文件已移动。',
71
+ PLUGIN_STOPPING: '插件正在关闭。',
72
+ BROWSER_NOT_FOUND: '未找到 Chrome 或 Edge。请安装浏览器后重试,或使用 yt-dlp 解析。',
73
+ PARSE_CACHE_INVALID: '解析缓存 ID 无效。',
74
+ COOKIE_SNAPSHOT_INVALID: 'Failed to load cookies: 浏览器未生成有效 Cookie 快照。',
75
+ COOKIE_SOURCE_UNAVAILABLE: 'Cookie 来源不可用,请重新选择浏览器或 Cookie 文件。',
76
+ PLATFORM_VIDEO_MISSING: '平台数据没有可下载的视频地址。',
77
+ PLATFORM_VIDEO_ID_MISSING: '分享链接未返回可识别的视频 ID。',
78
+ PLATFORM_DETAILS_MISSING: '平台 API 未返回视频详情,继续尝试兼容解析。',
79
+ BROWSER_VIDEO_MISSING: '浏览器解析未找到已加载的真实视频,继续尝试 yt-dlp。',
80
+ THUMBNAIL_EXPIRED: '缩略图已过期,请重新解析。',
81
+ THUMBNAIL_SOURCE_INVALID: '不支持的缩略图来源。',
82
+ THUMBNAIL_MISSING: '网站没有返回可显示的缩略图。',
83
+ THUMBNAIL_TOO_LARGE: '缩略图超过 8 MB。',
84
+ WECHAT_RESPONSE_EMPTY: '视频号接口没有返回数据。',
85
+ WECHAT_RESPONSE_TOO_LARGE: '视频号接口返回的数据过大。',
86
+ WECHAT_CDN_INVALID: '视频号没有返回受支持的腾讯 CDN 地址。',
87
+ WECHAT_ACCESS_DENIED: '[[parse-error:access-denied]]视频号详情接口拒绝请求,请重新解析或检查访问权限。',
88
+ WECHAT_SINGLE_VIDEO_ONLY: '[[parse-error:format-unavailable]]当前仅支持视频号单个视频,暂不支持图集或直播。',
89
+ WECHAT_VIDEO_MISSING: '视频号没有返回可播放的视频地址。',
90
+ WECHAT_KEY_EXPIRED: '视频号密钥无效,请重新解析。',
91
+ WECHAT_URL_INVALID: '无效的视频号分享链接。',
92
+ YUANBAO_REDIRECT_INVALID: '元宝接口重定向到非预期站点。',
93
+ WECHAT_LOGIN_REQUIRED: '[[parse-error:authentication]]元宝未返回视频号播放信息,请确认登录有效并重新解析。',
94
+ WECHAT_PARAMETERS_MISSING: '元宝返回的视频号播放参数不完整。',
95
+ WECHAT_REDIRECT_INVALID: '视频号接口重定向到非预期站点。',
96
+ WECHAT_KEY_INVALID: '视频号密钥无效。',
97
+ WECHAT_RANGE_INVALID: '视频号解码范围无效。',
98
+ WECHAT_INTEGRITY_FAILED: '视频号文件校验失败,请重新解析;未将无法播放的文件标记为完成。',
99
+ RUNTIME_FILE_INVALID: '指定路径不是可执行文件。',
100
+ RUNTIME_VERSION_INVALID: '无法识别该文件的工具版本。',
101
+ RUNTIME_HASH_MISMATCH: '依赖 SHA-256 校验失败,原工具已保留。',
102
+ RUNTIME_DETECTION_CANCELLED: '依赖检测已取消。',
103
+ RUNTIME_INSTALL_BUSY: '运行依赖正在安装,请等待完成。',
104
+ RUNTIME_KIND_INVALID: '请选择有效的运行依赖。',
105
+ RUNTIME_INSTALL_CANCELLED: '已取消运行依赖安装,旧工具保留。',
106
+ PLUGIN_STOPPED: '插件已停止。',
107
+ VAULT_INVALID: '拾流数据格式无效;原文件已保留,请恢复备份。',
108
+ BACKUP_ID_INVALID: '备份 ID 无效。',
109
+ BACKUP_INVALID: '记录备份格式无效。',
110
+ BROWSER_METADATA_INVALID: '请选择当前浏览器的 Local State 文件。',
111
+ BROWSER_ACCOUNTS_MISSING: '未找到有效浏览器账号。',
112
+ NATIVE_PENDING_LIMIT: '请先完成或取消当前选择。',
113
+ NATIVE_KIND_INVALID: '不支持的原生操作。',
114
+ NATIVE_DESCRIPTION_TOO_LONG: '操作说明过长。',
115
+ NATIVE_NOT_FOUND: '此操作不存在或已过期。',
116
+ NATIVE_ENDED: '此操作已结束。',
117
+ LOCAL_PATH_REQUIRED: '请选择本机绝对路径。',
118
+ LOCAL_PATH_TYPE_INVALID: '所选路径类型不符。',
119
+ CLIPBOARD_URL_MISSING: '剪贴板中没有可用的 HTTP(S) 媒体链接。',
120
+ DIRECTORY_INVALID: '目录必须是绝对路径。',
121
+ PROXY_CREDENTIALS: '请输入不含账号密码的 HTTP(S) 或 SOCKS5 代理地址。',
122
+ TASK_REQUIRED: '请选择下载任务。',
123
+ OPEN_TARGET_INVALID: '不支持的打开目标。',
124
+ AGENT_SESSION_REQUIRED: '修改拾流数据需要当前 Agent 会话。',
125
+ APPROVAL_UNAVAILABLE: '宿主没有审批通道,操作未执行。',
126
+ NONE: '',
127
+ LEGACY_MESSAGE: '{reason}',
128
+ UNEXPECTED_ERROR: '操作失败:{reason}',
129
+ REQUEST_FAILED: '请求失败。',
130
+ SERVICE_UNAVAILABLE: '服务暂时不可用。',
131
+ REQUEST_FORBIDDEN: '仅允许本机同源访问。',
132
+ ROUTE_NOT_FOUND: '接口不存在。',
133
+ VALIDATION_FAILED: '参数校验失败:{fields}。',
134
+ PROCESS_FAILED: '进程执行失败:{reason}',
135
+ DOWNLOAD_HTTP_FAILED: '下载请求失败:HTTP {status} {statusText}',
136
+ DOWNLOAD_RANGE_UNAVAILABLE: '下载范围不可用(HTTP {status})',
137
+ PLATFORM_HTTP_FAILED: '平台 API 返回 HTTP {status}。',
138
+ WECHAT_SHARE_HTTP_FAILED: '视频号分享接口 HTTP {status}',
139
+ WECHAT_DETAILS_HTTP_FAILED: '视频号详情 HTTP {status}',
140
+ RUNTIME_DOWNLOAD_FAILED: '依赖下载失败:HTTP {status}。',
141
+ RUNTIME_UNAVAILABLE: '{kind} 不可用,请安装依赖或手动选择文件。',
142
+ RUNTIME_PLATFORM_UNSUPPORTED: '暂不支持 {platform} 的 {kind} 安装。',
143
+ APPROVAL_DENIED: '操作未获批准({outcome}),未执行;请勿绕过审批。',
144
+ BROWSER_ACCOUNT_REQUIRED: '请选择要使用的浏览器账号,或提供 Cookie 文件;不会自动使用默认账号。',
145
+ TASK_QUEUED: '等待下载。',
146
+ TASK_DOWNLOADING: '正在下载…',
147
+ TASK_PROCESSING: '正在合并或转换媒体…',
148
+ TASK_PAUSED: '任务已暂停。',
149
+ TASK_CANCELLED: '任务已取消。',
150
+ TASK_COMPLETED: '下载已完成。',
151
+ TASK_FAILED: '下载失败:{reason}',
152
+ TASK_INTERRUPTED: '宿主已重启,点击继续以恢复下载。',
153
+ TASK_SAVE_FAILED: '任务已结束,但保存记录失败。请检查数据目录权限。',
154
+ RUNTIME_INSTALL_PREPARING: '正在准备依赖安装…',
155
+ RUNTIME_INSTALL_DOWNLOADING: '正在下载并校验 {kind}…',
156
+ RUNTIME_INSTALL_COMPLETED: '运行依赖已安装,通过 SHA-256 校验与执行检查。',
157
+ RUNTIME_INSTALL_FAILED: '依赖安装失败:{reason}',
158
+ RUNTIME_NOT_FOUND: '未找到可执行文件,请安装依赖或手动选择文件。',
159
+ RUNTIME_STALE: '{kind} 版本 {version} 过旧,请更新。',
160
+ RUNTIME_DETECTION_TIMEOUT: '依赖检测达到时限,请重新检测。',
161
+ NATIVE_CONFIRM: '请在拾流页面确认并完成此操作。',
162
+ NATIVE_EXPIRED: '选择已超时,请重新发起。',
163
+ NATIVE_CANCELLED: '用户已取消。',
164
+ NATIVE_COMPLETED: '操作已完成。',
165
+ PROXY_CONNECTED: '连接成功。',
166
+ PROXY_HTTP_STATUS: '目标返回 HTTP {status}。',
167
+ PROXY_FAILED: '连接失败或超时,请检查网络、代理地址及目标站点。',
168
+ BROWSER_PROFILES_IMPORTED: '账号列表已读取,只保存名称和账号标识。',
169
+ BROWSER_PROFILES_EMPTY: '未找到浏览器账号,请先启动该浏览器。',
170
+ BROWSER_PROFILES_CACHED: '使用上次授权读取的账号列表;新增账号后可重新读取。',
171
+ BROWSER_PROFILES_PERMISSION: 'macOS 限制直接读取浏览器账号,请点击“允许读取账号列表”完成一次授权。',
172
+ BROWSER_PROFILES_NAMES_UNAVAILABLE: '账号名称暂不可读,按浏览器配置名称显示。',
173
+ BROWSER_PROFILES_MISSING: '未找到浏览器配置,请先启动该浏览器。',
174
+ BROWSER_SAFARI_DEFAULT: 'Safari 仅支持默认来源。',
175
+ BROWSER_FIREFOX_MISSING: '未找到 Firefox 配置。',
176
+ BROWSER_PROFILES_UNSUPPORTED: '该浏览器暂不支持账号列表。',
177
+ PARSE_BROWSER_RECOVERED: '已通过浏览器兼容解析恢复。',
178
+ PARSE_COMPATIBILITY_RECOVERED: '已通过兼容解析恢复,下载将复用本次解析和登录来源。',
179
+ PARSE_UNSUPPORTED_URL: '暂不支持该网站或链接类型',
180
+ PARSE_INVALID_URL: '请输入有效的链接',
181
+ PARSE_FORMAT_UNAVAILABLE: '未找到可下载的视频格式,请检查运行依赖或登录状态',
182
+ PARSE_PAGE_RELOAD: 'YouTube 客户端解析失败,请更新 yt-dlp 后重试',
183
+ PARSE_CHALLENGE_FAILED: 'YouTube 验证脚本执行失败,请检查 JS 运行时和 yt-dlp',
184
+ PARSE_VERIFICATION_REQUIRED: '网站要求安全验证,请在所选浏览器中完成验证后重试',
185
+ PARSE_AUTHENTICATION: '该视频需要登录或访问权限,请检查 Cookies 设置',
186
+ PARSE_ACCESS_DENIED: '网站拒绝了访问请求,请检查权限或稍后重试',
187
+ PARSE_NETWORK: '网络请求失败或超时,请检查连接后重试',
188
+ PARSE_NOT_FOUND: '视频不存在、不可用或已被删除',
189
+ PARSE_RATE_LIMIT: '网站请求过于频繁,请稍后重试',
190
+ PARSE_UNKNOWN: '无法解析该链接',
191
+ };
192
+ export function businessMessage(code, params = {}, fallback) {
193
+ return {
194
+ code,
195
+ params: { ...params },
196
+ message: fallback ??
197
+ BUSINESS_MESSAGES[code].replace(/\{(\w+)\}/g, (token, name) => String(params[name] ?? token)),
198
+ };
199
+ }
200
+ export class BusinessError extends Error {
201
+ code;
202
+ params;
203
+ constructor(code, params = {}, fallback) {
204
+ const value = businessMessage(code, params, fallback);
205
+ super(value.message);
206
+ this.name = 'BusinessError';
207
+ this.code = code;
208
+ this.params = value.params;
209
+ }
210
+ }
211
+ export function readBusinessMessage(value) {
212
+ if (!value || typeof value !== 'object')
213
+ return;
214
+ const record = value;
215
+ if (typeof record.code !== 'string' ||
216
+ typeof record.message !== 'string' ||
217
+ !record.params ||
218
+ typeof record.params !== 'object' ||
219
+ Array.isArray(record.params))
220
+ return;
221
+ const entries = Object.entries(record.params);
222
+ if (entries.some(([, item]) => typeof item !== 'string' && (typeof item !== 'number' || !Number.isFinite(item))))
223
+ return;
224
+ return {
225
+ code: record.code,
226
+ params: Object.fromEntries(entries),
227
+ message: record.message,
228
+ };
229
+ }
230
+ export function errorMessage(error, fallback = 'UNEXPECTED_ERROR') {
231
+ const known = readBusinessMessage(error);
232
+ if (known)
233
+ return known;
234
+ const reason = (error instanceof Error ? error.message : String(error)).slice(-2_000);
235
+ return businessMessage(fallback, { reason }, reason);
236
+ }
237
+ const PARSE_CODES = {
238
+ 'unsupported-url': 'PARSE_UNSUPPORTED_URL',
239
+ 'invalid-url': 'PARSE_INVALID_URL',
240
+ 'runtime-unavailable': 'PARSE_RUNTIME_UNAVAILABLE',
241
+ 'format-unavailable': 'PARSE_FORMAT_UNAVAILABLE',
242
+ 'page-reload': 'PARSE_PAGE_RELOAD',
243
+ 'challenge-failed': 'PARSE_CHALLENGE_FAILED',
244
+ 'verification-required': 'PARSE_VERIFICATION_REQUIRED',
245
+ authentication: 'PARSE_AUTHENTICATION',
246
+ 'access-denied': 'PARSE_ACCESS_DENIED',
247
+ network: 'PARSE_NETWORK',
248
+ 'not-found': 'PARSE_NOT_FOUND',
249
+ 'rate-limit': 'PARSE_RATE_LIMIT',
250
+ unknown: 'PARSE_UNKNOWN',
251
+ };
252
+ export function parseMessage(kind, fallback) {
253
+ return businessMessage(PARSE_CODES[kind], { category: kind }, fallback);
254
+ }
255
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../../apps/shared/src/messages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ export function classifyParseError(raw) {
2
+ const marked = /(?:\[\[parse-error:|错误类别:)([\w-]+)/.exec(raw)?.[1];
3
+ if (marked && Object.prototype.hasOwnProperty.call(PARSE_MESSAGES, marked))
4
+ return marked;
5
+ if (/Unsupported URL/i.test(raw))
6
+ return 'unsupported-url';
7
+ if (/need captcha|captcha required|验证码|安全验证/i.test(raw))
8
+ return 'verification-required';
9
+ if (/not a valid URL|请输入有效的链接/i.test(raw))
10
+ return 'invalid-url';
11
+ if (/Requested format is not available|No video formats found|Only images are available/i.test(raw))
12
+ return 'format-unavailable';
13
+ if (/The page needs to be reloaded/i.test(raw))
14
+ return 'page-reload';
15
+ if (/challenge.*fail|signature.*fail|No supported JavaScript runtime/i.test(raw))
16
+ return 'challenge-failed';
17
+ if (/Sign in|need login|login required|not logged in|private video|登录|authentication/i.test(raw))
18
+ return 'authentication';
19
+ if (/429|Too Many Requests/i.test(raw))
20
+ return 'rate-limit';
21
+ if (/403|Forbidden/i.test(raw))
22
+ return 'access-denied';
23
+ if (/timed? out|timeout|network|Unable to download.*page|ConnectionError/i.test(raw))
24
+ return 'network';
25
+ if (/video (?:is )?unavailable|404|not found|已被删除/i.test(raw))
26
+ return 'not-found';
27
+ return 'unknown';
28
+ }
29
+ export const PARSE_MESSAGES = {
30
+ 'unsupported-url': '暂不支持该网站或链接类型',
31
+ 'invalid-url': '请输入有效的链接',
32
+ 'runtime-unavailable': 'YouTube 解析需要可运行的 Node.js 22+ 或 Deno 2.3+',
33
+ 'format-unavailable': '未找到可下载的视频格式,请检查运行依赖或登录状态',
34
+ 'page-reload': 'YouTube 客户端解析失败,请更新 yt-dlp 后重试',
35
+ 'challenge-failed': 'YouTube 验证脚本执行失败,请检查 JS 运行时和 yt-dlp',
36
+ 'verification-required': '网站要求安全验证,请在所选浏览器中完成验证后重试',
37
+ authentication: '该视频需要登录或访问权限,请检查 Cookies 设置',
38
+ 'access-denied': '网站拒绝了访问请求,请检查权限或稍后重试',
39
+ network: '网络请求失败或超时,请检查连接后重试',
40
+ 'not-found': '视频不存在、不可用或已被删除',
41
+ 'rate-limit': '网站请求过于频繁,请稍后重试',
42
+ unknown: '无法解析该链接',
43
+ };
44
+ /** 诊断只输出允许公开的类别和版本,绝不拼接原始子进程输出。 */
45
+ export function parseDiagnostic(raw, versions = {}) {
46
+ const kind = classifyParseError(raw);
47
+ const lines = [`错误类别:${kind}`, PARSE_MESSAGES[kind]];
48
+ const safeVersions = {
49
+ ytdlp: versions.ytdlp || /(?:^|\n)ytdlp:([^\n]+)/.exec(raw)?.[1],
50
+ runtime: versions.runtime || /(?:^|\n)runtime:([^\n]+)/.exec(raw)?.[1],
51
+ };
52
+ for (const [name, value] of Object.entries(safeVersions)) {
53
+ if (value && /^(?:node|deno)@\d+\.\d+\.\d+$|^\d{4}\.\d{2}\.\d{2}(?:\.\d+)?$/.test(value))
54
+ lines.push(`${name}:${value}`);
55
+ }
56
+ if (/challenge.*fail|signature.*fail|No supported JavaScript runtime|诊断:JS 验证脚本未成功执行/i.test(raw))
57
+ lines.push('诊断:JS 验证脚本未成功执行');
58
+ if (/PO Token|SABR|诊断:站点限制了部分流格式/i.test(raw))
59
+ lines.push('诊断:站点限制了部分流格式');
60
+ return lines.join('\n');
61
+ }
62
+ export function safeIssueReport(message, detail) {
63
+ const kind = classifyParseError(`${detail}\n${message}`);
64
+ return {
65
+ title: `[Bug] ${PARSE_MESSAGES[kind]}`,
66
+ body: `## 问题描述\n\n${PARSE_MESSAGES[kind]}\n\n## 脱敏诊断\n\n${parseDiagnostic(`${detail}\n${message}`)}\n\n## 复现步骤\n\n请补充不含个人信息的复现步骤。`,
67
+ };
68
+ }
69
+ //# sourceMappingURL=parse-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-errors.js","sourceRoot":"","sources":["../../../../apps/shared/src/parse-errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export function normalizeAcceleration(value) {
2
+ const count = Number(value?.maxConnections);
3
+ return {
4
+ enabled: value?.enabled !== false,
5
+ maxConnections: Number.isFinite(count) ? Math.max(1, Math.min(16, Math.trunc(count))) : 8,
6
+ aria2Path: typeof value?.aria2Path === 'string' ? value.aria2Path.trim() : '',
7
+ };
8
+ }
9
+ export function accelerationConnections(value) {
10
+ const normalized = normalizeAcceleration(value);
11
+ return normalized.enabled ? normalized.maxConnections : 1;
12
+ }
13
+ /** 新字段补默认值,旧任务保留原保存目录与显式 Cookie 设置。 */
14
+ export function normalizePreferences(value) {
15
+ const binaryPaths = Object.fromEntries(Object.entries(value.binaryPaths ?? {}).filter(([, file]) => typeof file === 'string' && file.trim()));
16
+ return {
17
+ ...value,
18
+ binaryPaths,
19
+ filenameTemplate: value.filenameTemplate ?? '%(title).160B [%(id)s].%(ext)s',
20
+ preferredQuality: value.preferredQuality ?? 'best',
21
+ language: value.language ?? 'system',
22
+ cookieStrategy: value.cookieStrategy ?? 'selected',
23
+ acceleration: normalizeAcceleration(value.acceleration),
24
+ };
25
+ }
26
+ //# sourceMappingURL=preferences.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preferences.js","sourceRoot":"","sources":["../../../../apps/shared/src/preferences.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,qBAAqB,CAAC,KAAqC;IACzE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IAE5C,OAAO;QACL,OAAO,EAAE,KAAK,EAAE,OAAO,KAAK,KAAK;QACjC,cAAc,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzF,SAAS,EAAE,OAAO,KAAK,EAAE,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE;KAC9E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAA4B;IAClE,MAAM,UAAU,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAChD,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,oBAAoB,CAAC,KAAkB;IACrD,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CACpC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,MAAM,CAC5C,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CACtD,CACF,CAAC;IAEF,OAAO;QACL,GAAG,KAAK;QACR,WAAW;QACX,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,IAAI,gCAAgC;QAC5E,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,IAAI,MAAM;QAClD,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,QAAQ;QACpC,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,UAAU;QAClD,YAAY,EAAE,qBAAqB,CAAC,KAAK,CAAC,YAAY,CAAC;KACxD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ export const NATIVE_KINDS = [
2
+ 'pick-folder',
3
+ 'pick-file',
4
+ 'clipboard-read',
5
+ 'clipboard-write',
6
+ ];
7
+ //# sourceMappingURL=system.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system.js","sourceRoot":"","sources":["../../../../apps/shared/src/system.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,aAAa;IACb,WAAW;IACX,gBAAgB;IAChB,iBAAiB;CACT,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { businessMessage, readBusinessMessage, } from './messages.js';
2
+ const STATE_CODES = {
3
+ queued: 'TASK_QUEUED',
4
+ downloading: 'TASK_DOWNLOADING',
5
+ processing: 'TASK_PROCESSING',
6
+ paused: 'TASK_PAUSED',
7
+ completed: 'TASK_COMPLETED',
8
+ failed: 'TASK_FAILED_UNKNOWN',
9
+ cancelled: 'TASK_CANCELLED',
10
+ };
11
+ export function taskMessage(state) {
12
+ return businessMessage(STATE_CODES[state]);
13
+ }
14
+ /** Version 1 records may predate codes; preserve their message without interpreting it. */
15
+ export function storedTaskMessage(task) {
16
+ return (readBusinessMessage(task) ??
17
+ (task.message
18
+ ? businessMessage('LEGACY_MESSAGE', { reason: task.message }, task.message)
19
+ : taskMessage(task.state)));
20
+ }
21
+ //# sourceMappingURL=task-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-messages.js","sourceRoot":"","sources":["../../../../apps/shared/src/task-messages.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EACf,mBAAmB,GAGpB,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,GAAoC;IACnD,MAAM,EAAE,aAAa;IACrB,WAAW,EAAE,kBAAkB;IAC/B,UAAU,EAAE,iBAAiB;IAC7B,MAAM,EAAE,aAAa;IACrB,SAAS,EAAE,gBAAgB;IAC3B,MAAM,EAAE,qBAAqB;IAC7B,SAAS,EAAE,gBAAgB;CAC5B,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,KAAgB;IAC1C,OAAO,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,iBAAiB,CAAC,IAA2C;IAC3E,OAAO,CACL,mBAAmB,CAAC,IAAI,CAAC;QACzB,CAAC,IAAI,CAAC,OAAO;YACX,CAAC,CAAC,eAAe,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC;YAC3E,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAC7B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { API_PREFIX } from './contracts.js';
2
+ export function isRefererThumbnail(value) {
3
+ try {
4
+ const url = new URL(value);
5
+ return (['http:', 'https:'].includes(url.protocol) &&
6
+ !url.username &&
7
+ !url.password &&
8
+ /(^|\.)(hdslb\.com|biliimg\.com)$/.test(url.hostname));
9
+ }
10
+ catch {
11
+ return false;
12
+ }
13
+ }
14
+ export const thumbnailPath = (id) => `${API_PREFIX}/media/${id}/thumbnail`;
15
+ export const taskThumbnailPath = (id) => `${API_PREFIX}/tasks/${id}/thumbnail`;
16
+ //# sourceMappingURL=thumbnail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thumbnail.js","sourceRoot":"","sources":["../../../../apps/shared/src/thumbnail.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3B,OAAO,CACL,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;YAC1C,CAAC,GAAG,CAAC,QAAQ;YACb,CAAC,GAAG,CAAC,QAAQ;YACb,kCAAkC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CACtD,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,GAAG,UAAU,UAAU,EAAE,YAAY,CAAC;AACnF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,GAAG,UAAU,UAAU,EAAE,YAAY,CAAC"}