@steipete/summarize-core 0.12.0 → 0.13.1

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 (43) hide show
  1. package/dist/esm/content/direct-media.js +100 -0
  2. package/dist/esm/content/direct-media.js.map +1 -0
  3. package/dist/esm/content/index.js +1 -1
  4. package/dist/esm/content/index.js.map +1 -1
  5. package/dist/esm/content/link-preview/content/video.js +1 -1
  6. package/dist/esm/content/link-preview/content/video.js.map +1 -1
  7. package/dist/esm/content/local-file.js +58 -0
  8. package/dist/esm/content/local-file.js.map +1 -0
  9. package/dist/esm/content/transcript/providers/generic-direct-media.js +47 -0
  10. package/dist/esm/content/transcript/providers/generic-direct-media.js.map +1 -0
  11. package/dist/esm/content/transcript/providers/generic-embedded.js +126 -0
  12. package/dist/esm/content/transcript/providers/generic-embedded.js.map +1 -0
  13. package/dist/esm/content/transcript/providers/generic-twitter.js +78 -0
  14. package/dist/esm/content/transcript/providers/generic-twitter.js.map +1 -0
  15. package/dist/esm/content/transcript/providers/generic.js +12 -247
  16. package/dist/esm/content/transcript/providers/generic.js.map +1 -1
  17. package/dist/esm/content/transcript/providers/podcast/spotify-flow.js +16 -3
  18. package/dist/esm/content/transcript/providers/podcast/spotify-flow.js.map +1 -1
  19. package/dist/esm/content/transcript/providers/transcription-start.js +3 -2
  20. package/dist/esm/content/transcript/providers/transcription-start.js.map +1 -1
  21. package/dist/esm/content/transcript/providers/youtube/provider-flow.js +43 -8
  22. package/dist/esm/content/transcript/providers/youtube/provider-flow.js.map +1 -1
  23. package/dist/esm/content/transcript/providers/youtube/yt-dlp.js +26 -7
  24. package/dist/esm/content/transcript/providers/youtube/yt-dlp.js.map +1 -1
  25. package/dist/esm/content/url.js +2 -30
  26. package/dist/esm/content/url.js.map +1 -1
  27. package/dist/esm/transcription/whisper/core.js +8 -4
  28. package/dist/esm/transcription/whisper/core.js.map +1 -1
  29. package/dist/esm/transcription/whisper/groq.js +62 -1
  30. package/dist/esm/transcription/whisper/groq.js.map +1 -1
  31. package/dist/esm/transcription/whisper/whisper-cpp.js +21 -18
  32. package/dist/esm/transcription/whisper/whisper-cpp.js.map +1 -1
  33. package/dist/types/content/direct-media.d.ts +9 -0
  34. package/dist/types/content/index.d.ts +1 -1
  35. package/dist/types/content/local-file.d.ts +16 -0
  36. package/dist/types/content/transcript/providers/generic-direct-media.d.ts +11 -0
  37. package/dist/types/content/transcript/providers/generic-embedded.d.ts +16 -0
  38. package/dist/types/content/transcript/providers/generic-twitter.d.ts +11 -0
  39. package/dist/types/content/transcript/providers/transcription-start.d.ts +1 -0
  40. package/dist/types/content/transcript/types.d.ts +1 -0
  41. package/dist/types/content/url.d.ts +2 -3
  42. package/dist/types/transcription/whisper/whisper-cpp.d.ts +4 -3
  43. package/package.json +11 -7
@@ -0,0 +1,100 @@
1
+ const DIRECT_VIDEO_EXTENSIONS = [
2
+ "mp4",
3
+ "mov",
4
+ "m4v",
5
+ "mkv",
6
+ "webm",
7
+ "mpeg",
8
+ "mpg",
9
+ "avi",
10
+ "wmv",
11
+ "flv",
12
+ "m3u8",
13
+ ];
14
+ const DIRECT_AUDIO_EXTENSIONS = [
15
+ "mp3",
16
+ "m4a",
17
+ "wav",
18
+ "flac",
19
+ "aac",
20
+ "ogg",
21
+ "opus",
22
+ "aiff",
23
+ "wma",
24
+ ];
25
+ export const DIRECT_MEDIA_EXTENSIONS = [
26
+ ...DIRECT_VIDEO_EXTENSIONS,
27
+ ...DIRECT_AUDIO_EXTENSIONS,
28
+ ];
29
+ const DIRECT_VIDEO_EXTENSION_SET = new Set(DIRECT_VIDEO_EXTENSIONS);
30
+ const DIRECT_AUDIO_EXTENSION_SET = new Set(DIRECT_AUDIO_EXTENSIONS);
31
+ const DIRECT_MEDIA_EXTENSION_SET = new Set(DIRECT_MEDIA_EXTENSIONS);
32
+ const DIRECT_MEDIA_URL_PATTERN = new RegExp(`\\.(${DIRECT_MEDIA_EXTENSIONS.join("|")})(\\?|#|$)`, "i");
33
+ const DIRECT_MEDIA_TYPE_BY_EXTENSION = new Map([
34
+ ["mp4", "video/mp4"],
35
+ ["mov", "video/quicktime"],
36
+ ["m4v", "video/mp4"],
37
+ ["mkv", "video/x-matroska"],
38
+ ["mpeg", "video/mpeg"],
39
+ ["mpg", "video/mpeg"],
40
+ ["avi", "video/x-msvideo"],
41
+ ["wmv", "video/x-ms-wmv"],
42
+ ["flv", "video/x-flv"],
43
+ ["m3u8", "application/vnd.apple.mpegurl"],
44
+ ["mp3", "audio/mpeg"],
45
+ ["m4a", "audio/mp4"],
46
+ ["wav", "audio/wav"],
47
+ ["flac", "audio/flac"],
48
+ ["aac", "audio/aac"],
49
+ ["ogg", "audio/ogg"],
50
+ ["opus", "audio/ogg"],
51
+ ["aiff", "audio/aiff"],
52
+ ["wma", "audio/x-ms-wma"],
53
+ ]);
54
+ export function normalizePathForExtension(value) {
55
+ try {
56
+ return new URL(value).pathname;
57
+ }
58
+ catch {
59
+ return value.split(/[?#]/, 1)[0] ?? value;
60
+ }
61
+ }
62
+ export function resolveDirectMediaExtension(value) {
63
+ const match = normalizePathForExtension(value)
64
+ .toLowerCase()
65
+ .match(/\.([a-z0-9]+)$/i);
66
+ return match?.[1] ?? null;
67
+ }
68
+ export function isDirectMediaUrl(url) {
69
+ return DIRECT_MEDIA_URL_PATTERN.test(url);
70
+ }
71
+ export function isDirectMediaExtension(ext) {
72
+ const normalized = ext.trim().replace(/^\./, "").toLowerCase();
73
+ return DIRECT_MEDIA_EXTENSION_SET.has(normalized);
74
+ }
75
+ export function inferDirectMediaKind(value) {
76
+ const ext = resolveDirectMediaExtension(value);
77
+ if (!ext)
78
+ return null;
79
+ if (DIRECT_VIDEO_EXTENSION_SET.has(ext))
80
+ return "video";
81
+ if (DIRECT_AUDIO_EXTENSION_SET.has(ext))
82
+ return "audio";
83
+ return null;
84
+ }
85
+ export function isDirectVideoInput(value) {
86
+ return inferDirectMediaKind(value) === "video";
87
+ }
88
+ export function resolveDirectMediaType(value, kindHint = null) {
89
+ const ext = resolveDirectMediaExtension(value);
90
+ if (ext === "webm") {
91
+ return kindHint === "audio" ? "audio/webm" : "video/webm";
92
+ }
93
+ const detected = ext ? (DIRECT_MEDIA_TYPE_BY_EXTENSION.get(ext) ?? null) : null;
94
+ if (detected)
95
+ return detected;
96
+ if (!kindHint)
97
+ return null;
98
+ return kindHint === "video" ? "video/mp4" : "audio/mpeg";
99
+ }
100
+ //# sourceMappingURL=direct-media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"direct-media.js","sourceRoot":"","sources":["../../../src/content/direct-media.ts"],"names":[],"mappings":"AAEA,MAAM,uBAAuB,GAAG;IAC9B,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;CACE,CAAC;AAEX,MAAM,uBAAuB,GAAG;IAC9B,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,KAAK;CACG,CAAC;AAEX,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,GAAG,uBAAuB;IAC1B,GAAG,uBAAuB;CAClB,CAAC;AAEX,MAAM,0BAA0B,GAAG,IAAI,GAAG,CAAS,uBAAuB,CAAC,CAAC;AAC5E,MAAM,0BAA0B,GAAG,IAAI,GAAG,CAAS,uBAAuB,CAAC,CAAC;AAC5E,MAAM,0BAA0B,GAAG,IAAI,GAAG,CAAS,uBAAuB,CAAC,CAAC;AAC5E,MAAM,wBAAwB,GAAG,IAAI,MAAM,CACzC,OAAO,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EACpD,GAAG,CACJ,CAAC;AAEF,MAAM,8BAA8B,GAAG,IAAI,GAAG,CAAiB;IAC7D,CAAC,KAAK,EAAE,WAAW,CAAC;IACpB,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAC1B,CAAC,KAAK,EAAE,WAAW,CAAC;IACpB,CAAC,KAAK,EAAE,kBAAkB,CAAC;IAC3B,CAAC,MAAM,EAAE,YAAY,CAAC;IACtB,CAAC,KAAK,EAAE,YAAY,CAAC;IACrB,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAC1B,CAAC,KAAK,EAAE,gBAAgB,CAAC;IACzB,CAAC,KAAK,EAAE,aAAa,CAAC;IACtB,CAAC,MAAM,EAAE,+BAA+B,CAAC;IACzC,CAAC,KAAK,EAAE,YAAY,CAAC;IACrB,CAAC,KAAK,EAAE,WAAW,CAAC;IACpB,CAAC,KAAK,EAAE,WAAW,CAAC;IACpB,CAAC,MAAM,EAAE,YAAY,CAAC;IACtB,CAAC,KAAK,EAAE,WAAW,CAAC;IACpB,CAAC,KAAK,EAAE,WAAW,CAAC;IACpB,CAAC,MAAM,EAAE,WAAW,CAAC;IACrB,CAAC,MAAM,EAAE,YAAY,CAAC;IACtB,CAAC,KAAK,EAAE,gBAAgB,CAAC;CAC1B,CAAC,CAAC;AAEH,MAAM,UAAU,yBAAyB,CAAC,KAAa;IACrD,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,KAAa;IACvD,MAAM,KAAK,GAAG,yBAAyB,CAAC,KAAK,CAAC;SAC3C,WAAW,EAAE;SACb,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAC5B,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,OAAO,wBAAwB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,GAAW;IAChD,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC/D,OAAO,0BAA0B,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,MAAM,GAAG,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAC;IAC/C,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,0BAA0B,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IACxD,IAAI,0BAA0B,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IACxD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,OAAO,oBAAoB,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,KAAa,EACb,WAAmC,IAAI;IAEvC,MAAM,GAAG,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAC;IAC/C,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,OAAO,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC;IAC5D,CAAC;IACD,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,8BAA8B,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAChF,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,OAAO,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC;AAC3D,CAAC"}
@@ -3,5 +3,5 @@ export { createLinkPreviewClient, } from "./link-preview/client.js";
3
3
  export { DEFAULT_CACHE_MODE, DEFAULT_MAX_CONTENT_CHARACTERS, DEFAULT_TIMEOUT_MS, } from "./link-preview/content/types.js";
4
4
  export { ProgressKind } from "./link-preview/deps.js";
5
5
  export { CACHE_MODES, } from "./link-preview/types.js";
6
- export { DIRECT_MEDIA_EXTENSIONS, extractYouTubeVideoId, isDirectMediaExtension, isDirectMediaUrl, isPodcastHost, isTwitterBroadcastUrl, isTwitterStatusUrl, isYouTubeUrl, isYouTubeVideoUrl, shouldPreferUrlMode, } from "./url.js";
6
+ export { DIRECT_MEDIA_EXTENSIONS, extractYouTubeVideoId, inferDirectMediaKind, isDirectMediaExtension, isDirectMediaUrl, isDirectVideoInput, isPodcastHost, isTwitterBroadcastUrl, isTwitterStatusUrl, isYouTubeUrl, isYouTubeVideoUrl, shouldPreferUrlMode, } from "./url.js";
7
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/content/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EACL,uBAAuB,GAGxB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,kBAAkB,EAClB,8BAA8B,EAC9B,kBAAkB,GAGnB,MAAM,iCAAiC,CAAC;AASzC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EACL,WAAW,GAIZ,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,EACb,qBAAqB,EACrB,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/content/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EACL,uBAAuB,GAGxB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,kBAAkB,EAClB,8BAA8B,EAC9B,kBAAkB,GAGnB,MAAM,iCAAiC,CAAC;AASzC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EACL,WAAW,GAIZ,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EACb,qBAAqB,EACrB,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,UAAU,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { load } from "cheerio";
2
- const VIDEO_EXTENSIONS = new Set([".mp4", ".webm", ".mov", ".m4v"]);
2
+ const VIDEO_EXTENSIONS = new Set([".mp4", ".webm", ".mov", ".m4v", ".m3u8"]);
3
3
  function resolveAbsoluteUrl(candidate, baseUrl) {
4
4
  const trimmed = candidate.trim();
5
5
  if (trimmed.length === 0)
@@ -1 +1 @@
1
- {"version":3,"file":"video.js","sourceRoot":"","sources":["../../../../../src/content/link-preview/content/video.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"video.js","sourceRoot":"","sources":["../../../../../src/content/link-preview/content/video.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,IAAI,EAAE,MAAM,SAAS,CAAC;AAOhD,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAE7E,SAAS,kBAAkB,CAAC,SAAiB,EAAE,OAAe;IAC5D,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAC5C,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;YACnC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;QACvC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,iCAAiC,CAAC,GAAW;IACpD,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACvB,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC5D,IAAI,IAAI,KAAK,aAAa,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAC5D,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAC3D,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;QACxB,CAAC;QACD,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACxB,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAChD,OAAO,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACpD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAClB,CAAa,EACb,SAAmE;IAEnE,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,SAAS,KAAK,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;QAChE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAChC,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACxE,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;IAC1B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,IAAY,EAAE,GAAW;IAClE,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IAErB,wCAAwC;IACxC,MAAM,SAAS,GACb,CAAC,CAAC,6DAA6D,CAAC,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;IAC/F,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,QAAQ,GAAG,kBAAkB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,iCAAiC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9E,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,mCAAmC,OAAO,EAAE,EAAE,CAAC;QAChF,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,EAAE;QAC7B,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;QAC5C,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE;QAChD,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,qBAAqB,EAAE;QACvD,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE;QACxC,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE;QAC5C,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,EAAE;KACpD,CAAC,CAAC;IACH,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAClD,IAAI,QAAQ,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;QAC3C,CAAC;QACD,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,iCAAiC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3E,IAAI,IAAI;YAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,mCAAmC,IAAI,EAAE,EAAE,CAAC;IACvF,CAAC;IAED,kBAAkB;IAClB,MAAM,QAAQ,GACZ,CAAC,CAAC,YAAY,CAAC,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,mBAAmB,CAAC,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;IAC5F,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACnD,IAAI,QAAQ,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,58 @@
1
+ import { statSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath, pathToFileURL } from "node:url";
4
+ import { inferDirectMediaKind, resolveDirectMediaExtension, resolveDirectMediaType, } from "./direct-media.js";
5
+ export function isLocalFileUrl(value) {
6
+ try {
7
+ return new URL(value).protocol === "file:";
8
+ }
9
+ catch {
10
+ return false;
11
+ }
12
+ }
13
+ export function resolveLocalFileReference(value) {
14
+ try {
15
+ const filePath = isLocalFileUrl(value)
16
+ ? fileURLToPath(stripFileUrlSearchAndHash(new URL(value)))
17
+ : path.resolve(value);
18
+ const stat = statSync(filePath);
19
+ if (!stat.isFile())
20
+ return null;
21
+ return {
22
+ filePath,
23
+ fileUrl: pathToFileURL(filePath).href,
24
+ filename: path.basename(filePath),
25
+ mtimeMs: stat.mtimeMs ?? 0,
26
+ };
27
+ }
28
+ catch {
29
+ return null;
30
+ }
31
+ }
32
+ export function resolveLocalFileMtime(value) {
33
+ return resolveLocalFileReference(value)?.mtimeMs ?? null;
34
+ }
35
+ export function resolveLocalDirectMediaSource(value, kindHint = null) {
36
+ const file = resolveLocalFileReference(value);
37
+ if (!file)
38
+ return null;
39
+ const mediaKind = kindHint ?? inferDirectMediaKind(file.filePath) ?? inferDirectMediaKind(file.fileUrl);
40
+ if (!mediaKind)
41
+ return null;
42
+ const mediaType = resolveDirectMediaType(file.filePath, mediaKind) ??
43
+ resolveDirectMediaType(file.fileUrl, mediaKind);
44
+ if (!mediaType)
45
+ return null;
46
+ return {
47
+ ...file,
48
+ extension: resolveDirectMediaExtension(file.filePath),
49
+ mediaKind,
50
+ mediaType,
51
+ };
52
+ }
53
+ function stripFileUrlSearchAndHash(url) {
54
+ url.search = "";
55
+ url.hash = "";
56
+ return url;
57
+ }
58
+ //# sourceMappingURL=local-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-file.js","sourceRoot":"","sources":["../../../src/content/local-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAC3B,sBAAsB,GAEvB,MAAM,mBAAmB,CAAC;AAe3B,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAAa;IACrD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC;YACpC,CAAC,CAAC,aAAa,CAAC,yBAAyB,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1D,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACxB,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE,OAAO,IAAI,CAAC;QAChC,OAAO;YACL,QAAQ;YACR,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI;YACrC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACjC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,CAAC;SAC3B,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,OAAO,yBAAyB,CAAC,KAAK,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,KAAa,EACb,WAAmC,IAAI;IAEvC,MAAM,IAAI,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;IAC9C,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,MAAM,SAAS,GACb,QAAQ,IAAI,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxF,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,MAAM,SAAS,GACb,sBAAsB,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC;QAChD,sBAAsB,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAClD,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,OAAO;QACL,GAAG,IAAI;QACP,SAAS,EAAE,2BAA2B,CAAC,IAAI,CAAC,QAAQ,CAAC;QACrD,SAAS;QACT,SAAS;KACV,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB,CAAC,GAAQ;IACzC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;IAChB,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;IACd,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { normalizeTranscriptText } from "../normalize.js";
2
+ import { resolveTranscriptProviderCapabilities } from "./transcription-capability.js";
3
+ export async function fetchDirectMediaTranscript({ url, options, transcription, notes, attemptedProviders, kind, }) {
4
+ if (!options.ytDlpPath) {
5
+ notes.push("yt-dlp is not configured (set YT_DLP_PATH or ensure yt-dlp is on PATH)");
6
+ return null;
7
+ }
8
+ const transcriptionCapabilities = await resolveTranscriptProviderCapabilities({
9
+ transcription,
10
+ ytDlpPath: options.ytDlpPath,
11
+ });
12
+ if (!transcriptionCapabilities.canTranscribe) {
13
+ notes.push(transcriptionCapabilities.missingProviderNote);
14
+ return null;
15
+ }
16
+ attemptedProviders.push("yt-dlp");
17
+ const mod = await import("./youtube/yt-dlp.js");
18
+ const ytdlpResult = await mod.fetchTranscriptWithYtDlp({
19
+ ytDlpPath: options.ytDlpPath,
20
+ transcription,
21
+ mediaCache: options.mediaCache ?? null,
22
+ url,
23
+ onProgress: options.onProgress ?? null,
24
+ service: "generic",
25
+ mediaKind: kind ?? options.mediaKindHint ?? null,
26
+ });
27
+ if (ytdlpResult.notes.length > 0)
28
+ notes.push(...ytdlpResult.notes);
29
+ if (ytdlpResult.text) {
30
+ return {
31
+ text: normalizeTranscriptText(ytdlpResult.text),
32
+ source: "yt-dlp",
33
+ attemptedProviders,
34
+ metadata: {
35
+ provider: "generic",
36
+ kind: kind ?? "media",
37
+ transcriptionProvider: ytdlpResult.provider,
38
+ },
39
+ notes: notes.length > 0 ? notes.join("; ") : null,
40
+ };
41
+ }
42
+ if (ytdlpResult.error) {
43
+ notes.push(`yt-dlp transcription failed: ${ytdlpResult.error.message}`);
44
+ }
45
+ return null;
46
+ }
47
+ //# sourceMappingURL=generic-direct-media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generic-direct-media.js","sourceRoot":"","sources":["../../../../../src/content/transcript/providers/generic-direct-media.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAG1D,OAAO,EAAE,qCAAqC,EAAE,MAAM,+BAA+B,CAAC;AAEtF,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,EAC/C,GAAG,EACH,OAAO,EACP,aAAa,EACb,KAAK,EACL,kBAAkB,EAClB,IAAI,GAQL;IACC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;QACrF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,yBAAyB,GAAG,MAAM,qCAAqC,CAAC;QAC5E,aAAa;QACb,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAC,CAAC;IACH,IAAI,CAAC,yBAAyB,CAAC,aAAa,EAAE,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,mBAAmB,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAElC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,wBAAwB,CAAC;QACrD,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,aAAa;QACb,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI;QACtC,GAAG;QACH,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI;QACtC,OAAO,EAAE,SAAS;QAClB,SAAS,EAAE,IAAI,IAAI,OAAO,CAAC,aAAa,IAAI,IAAI;KACjD,CAAC,CAAC;IACH,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAEnE,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;QACrB,OAAO;YACL,IAAI,EAAE,uBAAuB,CAAC,WAAW,CAAC,IAAI,CAAC;YAC/C,MAAM,EAAE,QAAQ;YAChB,kBAAkB;YAClB,QAAQ,EAAE;gBACR,QAAQ,EAAE,SAAS;gBACnB,IAAI,EAAE,IAAI,IAAI,OAAO;gBACrB,qBAAqB,EAAE,WAAW,CAAC,QAAQ;aAC5C;YACD,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;SAClD,CAAC;IACJ,CAAC;IAED,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,gCAAgC,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,126 @@
1
+ import { load } from "cheerio";
2
+ import { isDirectMediaUrl } from "../../url.js";
3
+ import { jsonTranscriptToPlainText, jsonTranscriptToSegments, vttToPlainText, vttToSegments, } from "../parse.js";
4
+ export function detectEmbeddedMedia(html, baseUrl) {
5
+ const $ = load(html);
6
+ const trackCandidates = [];
7
+ $('track[kind="captions"], track[kind="subtitles"]').each((_idx, el) => {
8
+ const src = $(el).attr("src")?.trim();
9
+ if (!src)
10
+ return;
11
+ const url = resolveAbsoluteUrl(src, baseUrl);
12
+ if (!url)
13
+ return;
14
+ const type = $(el).attr("type")?.trim() ?? null;
15
+ const language = $(el).attr("srclang")?.trim() ?? $(el).attr("lang")?.trim() ?? null;
16
+ trackCandidates.push({ url, type, language });
17
+ });
18
+ const track = selectPreferredTrack(trackCandidates);
19
+ const videoUrl = resolveFirstMediaUrl($, baseUrl, "video");
20
+ const audioUrl = resolveFirstMediaUrl($, baseUrl, "audio");
21
+ const ogVideo = resolveOgMediaUrl($, baseUrl, "video");
22
+ const ogAudio = resolveOgMediaUrl($, baseUrl, "audio");
23
+ if (videoUrl || ogVideo) {
24
+ return { kind: "video", mediaUrl: pickMediaUrl([videoUrl, ogVideo]), track };
25
+ }
26
+ if (audioUrl || ogAudio) {
27
+ return { kind: "audio", mediaUrl: pickMediaUrl([audioUrl, ogAudio]), track };
28
+ }
29
+ const hasVideoTag = $("video").length > 0;
30
+ const hasAudioTag = !hasVideoTag && $("audio").length > 0;
31
+ if (track || hasVideoTag || hasAudioTag) {
32
+ return { kind: hasAudioTag ? "audio" : "video", mediaUrl: null, track };
33
+ }
34
+ return null;
35
+ }
36
+ export async function fetchCaptionTrack(fetchImpl, track, notes, includeSegments) {
37
+ try {
38
+ const res = await fetchImpl(track.url, {
39
+ headers: { accept: "text/vtt,text/plain,application/json;q=0.9,*/*;q=0.8" },
40
+ });
41
+ if (!res.ok) {
42
+ notes.push(`Embedded captions fetch failed (${res.status})`);
43
+ return null;
44
+ }
45
+ const body = await res.text();
46
+ const contentType = res.headers.get("content-type")?.toLowerCase() ?? "";
47
+ const type = track.type?.toLowerCase() ?? "";
48
+ if (type.includes("application/json") || contentType.includes("application/json")) {
49
+ try {
50
+ const parsed = JSON.parse(body);
51
+ const text = jsonTranscriptToPlainText(parsed);
52
+ if (!text)
53
+ return null;
54
+ const segments = includeSegments ? jsonTranscriptToSegments(parsed) : null;
55
+ return { text, segments };
56
+ }
57
+ catch {
58
+ notes.push("Embedded captions JSON parse failed");
59
+ return null;
60
+ }
61
+ }
62
+ if (type.includes("text/vtt") ||
63
+ contentType.includes("text/vtt") ||
64
+ track.url.toLowerCase().endsWith(".vtt")) {
65
+ const plain = vttToPlainText(body);
66
+ if (plain.length === 0)
67
+ return null;
68
+ const segments = includeSegments ? vttToSegments(body) : null;
69
+ return { text: plain, segments };
70
+ }
71
+ const trimmed = body.trim();
72
+ return trimmed.length > 0 ? { text: trimmed, segments: null } : null;
73
+ }
74
+ catch (error) {
75
+ notes.push(`Embedded captions fetch failed: ${error instanceof Error ? error.message : error}`);
76
+ return null;
77
+ }
78
+ }
79
+ function selectPreferredTrack(tracks) {
80
+ if (tracks.length === 0)
81
+ return null;
82
+ const normalized = tracks.map((track) => ({
83
+ ...track,
84
+ language: track.language?.toLowerCase() ?? null,
85
+ }));
86
+ const english = normalized.find((track) => track.language?.startsWith("en"));
87
+ return english ?? normalized[0] ?? null;
88
+ }
89
+ function resolveFirstMediaUrl($, baseUrl, tag) {
90
+ const direct = $(`${tag}[src]`).first().attr("src") ?? $(`${tag} source[src]`).first().attr("src") ?? null;
91
+ if (!direct)
92
+ return null;
93
+ return resolveAbsoluteUrl(direct, baseUrl);
94
+ }
95
+ function resolveOgMediaUrl($, baseUrl, kind) {
96
+ const meta = $(`meta[property="og:${kind}"], meta[property="og:${kind}:url"], meta[property="og:${kind}:secure_url"], meta[name="og:${kind}"], meta[name="og:${kind}:url"], meta[name="og:${kind}:secure_url"]`)
97
+ .first()
98
+ .attr("content");
99
+ if (!meta)
100
+ return null;
101
+ return resolveAbsoluteUrl(meta, baseUrl);
102
+ }
103
+ function resolveAbsoluteUrl(candidate, baseUrl) {
104
+ const trimmed = candidate.trim();
105
+ if (trimmed.length === 0)
106
+ return null;
107
+ try {
108
+ return new URL(trimmed, baseUrl).toString();
109
+ }
110
+ catch {
111
+ return null;
112
+ }
113
+ }
114
+ function pickMediaUrl(candidates) {
115
+ let fallback = null;
116
+ for (const candidate of candidates) {
117
+ if (!candidate)
118
+ continue;
119
+ if (isDirectMediaUrl(candidate))
120
+ return candidate;
121
+ if (!fallback)
122
+ fallback = candidate;
123
+ }
124
+ return fallback;
125
+ }
126
+ //# sourceMappingURL=generic-embedded.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generic-embedded.js","sourceRoot":"","sources":["../../../../../src/content/transcript/providers/generic-embedded.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import { normalizeTranscriptText } from "../normalize.js";
2
+ import { buildMissingTranscriptionProviderResult, resolveTranscriptProviderCapabilities, } from "./transcription-capability.js";
3
+ export async function fetchTwitterMediaTranscript({ context, options, transcription, attemptedProviders, notes, mediaKindHint, }) {
4
+ if (!options.ytDlpPath) {
5
+ return {
6
+ text: null,
7
+ source: null,
8
+ attemptedProviders,
9
+ metadata: { provider: "generic", kind: "twitter", reason: "missing_yt_dlp" },
10
+ notes: "yt-dlp is not configured (set YT_DLP_PATH or ensure yt-dlp is on PATH)",
11
+ };
12
+ }
13
+ const transcriptionCapabilities = await resolveTranscriptProviderCapabilities({
14
+ transcription,
15
+ ytDlpPath: options.ytDlpPath,
16
+ });
17
+ if (!transcriptionCapabilities.canTranscribe) {
18
+ return buildMissingTranscriptionProviderResult({
19
+ attemptedProviders,
20
+ metadata: { provider: "generic", kind: "twitter", reason: "missing_transcription_keys" },
21
+ });
22
+ }
23
+ attemptedProviders.push("yt-dlp");
24
+ const resolved = options.resolveTwitterCookies
25
+ ? await options.resolveTwitterCookies({ url: context.url })
26
+ : null;
27
+ if (resolved?.warnings?.length)
28
+ notes.push(...resolved.warnings);
29
+ const extraArgs = [];
30
+ if (resolved?.cookiesFromBrowser) {
31
+ extraArgs.push("--cookies-from-browser", resolved.cookiesFromBrowser);
32
+ if (resolved.source)
33
+ notes.push(`Using X cookies from ${resolved.source}`);
34
+ }
35
+ const mod = await import("./youtube/yt-dlp.js");
36
+ const ytdlpResult = await mod.fetchTranscriptWithYtDlp({
37
+ ytDlpPath: options.ytDlpPath,
38
+ transcription,
39
+ mediaCache: options.mediaCache ?? null,
40
+ url: context.url,
41
+ onProgress: options.onProgress ?? null,
42
+ service: "generic",
43
+ extraArgs: extraArgs.length > 0 ? extraArgs : undefined,
44
+ mediaKind: mediaKindHint,
45
+ });
46
+ if (ytdlpResult.notes.length > 0)
47
+ notes.push(...ytdlpResult.notes);
48
+ if (ytdlpResult.text) {
49
+ return {
50
+ text: normalizeTranscriptText(ytdlpResult.text),
51
+ source: "yt-dlp",
52
+ attemptedProviders,
53
+ metadata: {
54
+ provider: "generic",
55
+ kind: "twitter",
56
+ transcriptionProvider: ytdlpResult.provider,
57
+ cookieSource: resolved?.source ?? null,
58
+ },
59
+ notes: notes.length > 0 ? notes.join("; ") : null,
60
+ };
61
+ }
62
+ if (ytdlpResult.error) {
63
+ notes.push(`yt-dlp transcription failed: ${ytdlpResult.error.message}`);
64
+ }
65
+ return {
66
+ text: null,
67
+ source: null,
68
+ attemptedProviders,
69
+ metadata: {
70
+ provider: "generic",
71
+ kind: "twitter",
72
+ reason: ytdlpResult.error ? "yt_dlp_failed" : "no_transcript",
73
+ transcriptionProvider: ytdlpResult.provider,
74
+ },
75
+ notes: notes.length > 0 ? notes.join("; ") : null,
76
+ };
77
+ }
78
+ //# sourceMappingURL=generic-twitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generic-twitter.js","sourceRoot":"","sources":["../../../../../src/content/transcript/providers/generic-twitter.ts"],"names":[],"mappings":"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"}