youtube-knowledge-mcp 2.1.0 → 2.2.0

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 (344) hide show
  1. package/README.md +105 -34
  2. package/dist/brain-schemas.d.ts +10 -10
  3. package/dist/brain-schemas.d.ts.map +1 -1
  4. package/dist/brain-schemas.js +0 -4
  5. package/dist/brain-schemas.js.map +1 -1
  6. package/dist/http/app.d.ts +16 -0
  7. package/dist/http/app.d.ts.map +1 -0
  8. package/dist/http/app.js +176 -0
  9. package/dist/http/app.js.map +1 -0
  10. package/dist/http/auth.d.ts +38 -0
  11. package/dist/http/auth.d.ts.map +1 -0
  12. package/dist/http/auth.js +79 -0
  13. package/dist/http/auth.js.map +1 -0
  14. package/dist/http/config.d.ts +41 -0
  15. package/dist/http/config.d.ts.map +1 -0
  16. package/dist/http/config.js +65 -0
  17. package/dist/http/config.js.map +1 -0
  18. package/dist/http/rate-limiter.d.ts +24 -0
  19. package/dist/http/rate-limiter.d.ts.map +1 -0
  20. package/dist/http/rate-limiter.js +55 -0
  21. package/dist/http/rate-limiter.js.map +1 -0
  22. package/dist/http/sessions.d.ts +34 -0
  23. package/dist/http/sessions.d.ts.map +1 -0
  24. package/dist/http/sessions.js +62 -0
  25. package/dist/http/sessions.js.map +1 -0
  26. package/dist/http.d.ts +6 -48
  27. package/dist/http.d.ts.map +1 -1
  28. package/dist/http.js +35 -252
  29. package/dist/http.js.map +1 -1
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +11 -517
  32. package/dist/index.js.map +1 -1
  33. package/dist/prompts-brain.d.ts +4 -0
  34. package/dist/prompts-brain.d.ts.map +1 -0
  35. package/dist/prompts-brain.js +48 -0
  36. package/dist/prompts-brain.js.map +1 -0
  37. package/dist/prompts-research.d.ts +4 -0
  38. package/dist/prompts-research.d.ts.map +1 -0
  39. package/dist/prompts-research.js +74 -0
  40. package/dist/prompts-research.js.map +1 -0
  41. package/dist/prompts-shared.d.ts +13 -0
  42. package/dist/prompts-shared.d.ts.map +1 -0
  43. package/dist/prompts-shared.js +7 -0
  44. package/dist/prompts-shared.js.map +1 -0
  45. package/dist/prompts.d.ts.map +1 -1
  46. package/dist/prompts.js +5 -100
  47. package/dist/prompts.js.map +1 -1
  48. package/dist/registry/brain-tools.d.ts +4 -0
  49. package/dist/registry/brain-tools.d.ts.map +1 -0
  50. package/dist/registry/brain-tools.js +104 -0
  51. package/dist/registry/brain-tools.js.map +1 -0
  52. package/dist/registry/channel-tools.d.ts +4 -0
  53. package/dist/registry/channel-tools.d.ts.map +1 -0
  54. package/dist/registry/channel-tools.js +53 -0
  55. package/dist/registry/channel-tools.js.map +1 -0
  56. package/dist/registry/health-tools.d.ts +4 -0
  57. package/dist/registry/health-tools.d.ts.map +1 -0
  58. package/dist/registry/health-tools.js +21 -0
  59. package/dist/registry/health-tools.js.map +1 -0
  60. package/dist/registry/index.d.ts +8 -0
  61. package/dist/registry/index.d.ts.map +1 -0
  62. package/dist/registry/index.js +27 -0
  63. package/dist/registry/index.js.map +1 -0
  64. package/dist/registry/library-tools.d.ts +4 -0
  65. package/dist/registry/library-tools.d.ts.map +1 -0
  66. package/dist/registry/library-tools.js +116 -0
  67. package/dist/registry/library-tools.js.map +1 -0
  68. package/dist/registry/media-tools.d.ts +4 -0
  69. package/dist/registry/media-tools.d.ts.map +1 -0
  70. package/dist/registry/media-tools.js +100 -0
  71. package/dist/registry/media-tools.js.map +1 -0
  72. package/dist/registry/thumbnail-tools.d.ts +7 -0
  73. package/dist/registry/thumbnail-tools.d.ts.map +1 -0
  74. package/dist/registry/thumbnail-tools.js +72 -0
  75. package/dist/registry/thumbnail-tools.js.map +1 -0
  76. package/dist/registry/transcript-tools.d.ts +4 -0
  77. package/dist/registry/transcript-tools.d.ts.map +1 -0
  78. package/dist/registry/transcript-tools.js +68 -0
  79. package/dist/registry/transcript-tools.js.map +1 -0
  80. package/dist/registry/types.d.ts +41 -0
  81. package/dist/registry/types.d.ts.map +1 -0
  82. package/dist/registry/types.js +17 -0
  83. package/dist/registry/types.js.map +1 -0
  84. package/dist/registry/video-tools.d.ts +4 -0
  85. package/dist/registry/video-tools.d.ts.map +1 -0
  86. package/dist/registry/video-tools.js +101 -0
  87. package/dist/registry/video-tools.js.map +1 -0
  88. package/dist/resources.d.ts.map +1 -1
  89. package/dist/resources.js +13 -10
  90. package/dist/resources.js.map +1 -1
  91. package/dist/schemas.d.ts +11 -2
  92. package/dist/schemas.d.ts.map +1 -1
  93. package/dist/schemas.js +5 -0
  94. package/dist/schemas.js.map +1 -1
  95. package/dist/thumbnail-resource.d.ts +8 -0
  96. package/dist/thumbnail-resource.d.ts.map +1 -0
  97. package/dist/thumbnail-resource.js +38 -0
  98. package/dist/thumbnail-resource.js.map +1 -0
  99. package/dist/thumbnail-schemas.d.ts +512 -0
  100. package/dist/thumbnail-schemas.d.ts.map +1 -0
  101. package/dist/thumbnail-schemas.js +95 -0
  102. package/dist/thumbnail-schemas.js.map +1 -0
  103. package/dist/tools/batch.js +1 -1
  104. package/dist/tools/batch.js.map +1 -1
  105. package/dist/tools/build-brain.js +1 -1
  106. package/dist/tools/build-brain.js.map +1 -1
  107. package/dist/tools/check-health.d.ts +2 -0
  108. package/dist/tools/check-health.d.ts.map +1 -1
  109. package/dist/tools/check-health.js +9 -0
  110. package/dist/tools/check-health.js.map +1 -1
  111. package/dist/tools/clips.d.ts +9 -41
  112. package/dist/tools/clips.d.ts.map +1 -1
  113. package/dist/tools/clips.js +52 -128
  114. package/dist/tools/clips.js.map +1 -1
  115. package/dist/tools/fetch-channel-thumbnails.d.ts +179 -0
  116. package/dist/tools/fetch-channel-thumbnails.d.ts.map +1 -0
  117. package/dist/tools/fetch-channel-thumbnails.js +123 -0
  118. package/dist/tools/fetch-channel-thumbnails.js.map +1 -0
  119. package/dist/tools/fetch-videos.d.ts +3 -0
  120. package/dist/tools/fetch-videos.d.ts.map +1 -1
  121. package/dist/tools/fetch-videos.js +3 -0
  122. package/dist/tools/fetch-videos.js.map +1 -1
  123. package/dist/tools/frames-subtitles.d.ts +44 -0
  124. package/dist/tools/frames-subtitles.d.ts.map +1 -0
  125. package/dist/tools/frames-subtitles.js +104 -0
  126. package/dist/tools/frames-subtitles.js.map +1 -0
  127. package/dist/tools/get-channel-info.d.ts +2 -0
  128. package/dist/tools/get-channel-info.d.ts.map +1 -1
  129. package/dist/tools/get-channel-info.js +8 -1
  130. package/dist/tools/get-channel-info.js.map +1 -1
  131. package/dist/tools/get-playlist-info.d.ts.map +1 -1
  132. package/dist/tools/get-playlist-info.js +1 -0
  133. package/dist/tools/get-playlist-info.js.map +1 -1
  134. package/dist/tools/get-thumbnail.d.ts +38 -0
  135. package/dist/tools/get-thumbnail.d.ts.map +1 -0
  136. package/dist/tools/get-thumbnail.js +152 -0
  137. package/dist/tools/get-thumbnail.js.map +1 -0
  138. package/dist/tools/get-transcript.d.ts.map +1 -1
  139. package/dist/tools/get-transcript.js +2 -14
  140. package/dist/tools/get-transcript.js.map +1 -1
  141. package/dist/tools/library.d.ts.map +1 -1
  142. package/dist/tools/library.js +13 -3
  143. package/dist/tools/library.js.map +1 -1
  144. package/dist/tools/list-channel-thumbnails.d.ts +235 -0
  145. package/dist/tools/list-channel-thumbnails.d.ts.map +1 -0
  146. package/dist/tools/list-channel-thumbnails.js +79 -0
  147. package/dist/tools/list-channel-thumbnails.js.map +1 -0
  148. package/dist/tools/save-to-library.d.ts.map +1 -1
  149. package/dist/tools/save-to-library.js +5 -1
  150. package/dist/tools/save-to-library.js.map +1 -1
  151. package/dist/tools/search-channels.d.ts +6 -0
  152. package/dist/tools/search-channels.d.ts.map +1 -1
  153. package/dist/tools/search-transcript.d.ts.map +1 -1
  154. package/dist/tools/search-transcript.js +6 -13
  155. package/dist/tools/search-transcript.js.map +1 -1
  156. package/dist/tools/search-videos.d.ts +3 -0
  157. package/dist/tools/search-videos.d.ts.map +1 -1
  158. package/dist/utils/batches.d.ts +15 -0
  159. package/dist/utils/batches.d.ts.map +1 -0
  160. package/dist/utils/batches.js +31 -0
  161. package/dist/utils/batches.js.map +1 -0
  162. package/dist/utils/brain-build.d.ts.map +1 -1
  163. package/dist/utils/brain-build.js +1 -12
  164. package/dist/utils/brain-build.js.map +1 -1
  165. package/dist/utils/brain-index.d.ts.map +1 -1
  166. package/dist/utils/brain-index.js +3 -2
  167. package/dist/utils/brain-index.js.map +1 -1
  168. package/dist/utils/brain-lock.d.ts +2 -18
  169. package/dist/utils/brain-lock.d.ts.map +1 -1
  170. package/dist/utils/brain-lock.js +4 -80
  171. package/dist/utils/brain-lock.js.map +1 -1
  172. package/dist/utils/brain-lookup.d.ts +8 -0
  173. package/dist/utils/brain-lookup.d.ts.map +1 -1
  174. package/dist/utils/brain-lookup.js +5 -31
  175. package/dist/utils/brain-lookup.js.map +1 -1
  176. package/dist/utils/brain-storage.d.ts.map +1 -1
  177. package/dist/utils/brain-storage.js +5 -5
  178. package/dist/utils/brain-storage.js.map +1 -1
  179. package/dist/utils/caption-probe.d.ts +7 -0
  180. package/dist/utils/caption-probe.d.ts.map +1 -0
  181. package/dist/utils/caption-probe.js +36 -0
  182. package/dist/utils/caption-probe.js.map +1 -0
  183. package/dist/utils/channel-images.d.ts +16 -0
  184. package/dist/utils/channel-images.d.ts.map +1 -0
  185. package/dist/utils/channel-images.js +35 -0
  186. package/dist/utils/channel-images.js.map +1 -0
  187. package/dist/utils/channel-lookup.d.ts +5 -0
  188. package/dist/utils/channel-lookup.d.ts.map +1 -0
  189. package/dist/utils/channel-lookup.js +37 -0
  190. package/dist/utils/channel-lookup.js.map +1 -0
  191. package/dist/utils/chapters.d.ts +11 -0
  192. package/dist/utils/chapters.d.ts.map +1 -0
  193. package/dist/utils/chapters.js +24 -0
  194. package/dist/utils/chapters.js.map +1 -0
  195. package/dist/utils/clips.d.ts.map +1 -1
  196. package/dist/utils/clips.js +18 -26
  197. package/dist/utils/clips.js.map +1 -1
  198. package/dist/utils/env.d.ts +26 -0
  199. package/dist/utils/env.d.ts.map +1 -0
  200. package/dist/utils/env.js +72 -0
  201. package/dist/utils/env.js.map +1 -0
  202. package/dist/utils/errors.d.ts +1 -1
  203. package/dist/utils/errors.d.ts.map +1 -1
  204. package/dist/utils/errors.js +20 -2
  205. package/dist/utils/errors.js.map +1 -1
  206. package/dist/utils/file-lock.d.ts +34 -0
  207. package/dist/utils/file-lock.d.ts.map +1 -0
  208. package/dist/utils/file-lock.js +91 -0
  209. package/dist/utils/file-lock.js.map +1 -0
  210. package/dist/utils/flat-listing.d.ts +89 -0
  211. package/dist/utils/flat-listing.d.ts.map +1 -0
  212. package/dist/utils/flat-listing.js +68 -0
  213. package/dist/utils/flat-listing.js.map +1 -0
  214. package/dist/utils/format.d.ts +1 -3
  215. package/dist/utils/format.d.ts.map +1 -1
  216. package/dist/utils/format.js +1 -5
  217. package/dist/utils/format.js.map +1 -1
  218. package/dist/utils/guard.d.ts +21 -0
  219. package/dist/utils/guard.d.ts.map +1 -0
  220. package/dist/utils/guard.js +105 -0
  221. package/dist/utils/guard.js.map +1 -0
  222. package/dist/utils/image-dimensions.d.ts +19 -0
  223. package/dist/utils/image-dimensions.d.ts.map +1 -0
  224. package/dist/utils/image-dimensions.js +93 -0
  225. package/dist/utils/image-dimensions.js.map +1 -0
  226. package/dist/utils/image-fetch.d.ts +31 -0
  227. package/dist/utils/image-fetch.d.ts.map +1 -0
  228. package/dist/utils/image-fetch.js +141 -0
  229. package/dist/utils/image-fetch.js.map +1 -0
  230. package/dist/utils/json-file.d.ts +14 -5
  231. package/dist/utils/json-file.d.ts.map +1 -1
  232. package/dist/utils/json-file.js +24 -9
  233. package/dist/utils/json-file.js.map +1 -1
  234. package/dist/utils/paths.d.ts +10 -0
  235. package/dist/utils/paths.d.ts.map +1 -1
  236. package/dist/utils/paths.js +14 -0
  237. package/dist/utils/paths.js.map +1 -1
  238. package/dist/utils/pattern.d.ts +30 -0
  239. package/dist/utils/pattern.d.ts.map +1 -0
  240. package/dist/utils/pattern.js +130 -0
  241. package/dist/utils/pattern.js.map +1 -0
  242. package/dist/utils/search-index.d.ts.map +1 -1
  243. package/dist/utils/search-index.js +9 -4
  244. package/dist/utils/search-index.js.map +1 -1
  245. package/dist/utils/storage.d.ts.map +1 -1
  246. package/dist/utils/storage.js +14 -8
  247. package/dist/utils/storage.js.map +1 -1
  248. package/dist/utils/subtitles.d.ts +7 -0
  249. package/dist/utils/subtitles.d.ts.map +1 -0
  250. package/dist/utils/subtitles.js +30 -0
  251. package/dist/utils/subtitles.js.map +1 -0
  252. package/dist/utils/thumbnail-entry.d.ts +19 -0
  253. package/dist/utils/thumbnail-entry.d.ts.map +1 -0
  254. package/dist/utils/thumbnail-entry.js +119 -0
  255. package/dist/utils/thumbnail-entry.js.map +1 -0
  256. package/dist/utils/thumbnail-fetch.d.ts +37 -0
  257. package/dist/utils/thumbnail-fetch.d.ts.map +1 -0
  258. package/dist/utils/thumbnail-fetch.js +89 -0
  259. package/dist/utils/thumbnail-fetch.js.map +1 -0
  260. package/dist/utils/thumbnail-ladder.d.ts +44 -0
  261. package/dist/utils/thumbnail-ladder.d.ts.map +1 -0
  262. package/dist/utils/thumbnail-ladder.js +68 -0
  263. package/dist/utils/thumbnail-ladder.js.map +1 -0
  264. package/dist/utils/thumbnail-listing.d.ts +16 -0
  265. package/dist/utils/thumbnail-listing.d.ts.map +1 -0
  266. package/dist/utils/thumbnail-listing.js +26 -0
  267. package/dist/utils/thumbnail-listing.js.map +1 -0
  268. package/dist/utils/thumbnail-paths.d.ts +20 -0
  269. package/dist/utils/thumbnail-paths.d.ts.map +1 -0
  270. package/dist/utils/thumbnail-paths.js +35 -0
  271. package/dist/utils/thumbnail-paths.js.map +1 -0
  272. package/dist/utils/thumbnail-store.d.ts +19 -0
  273. package/dist/utils/thumbnail-store.d.ts.map +1 -0
  274. package/dist/utils/thumbnail-store.js +125 -0
  275. package/dist/utils/thumbnail-store.js.map +1 -0
  276. package/dist/utils/transcript-cache.d.ts +20 -0
  277. package/dist/utils/transcript-cache.d.ts.map +1 -0
  278. package/dist/utils/transcript-cache.js +127 -0
  279. package/dist/utils/transcript-cache.js.map +1 -0
  280. package/dist/utils/transcript-search.d.ts +20 -0
  281. package/dist/utils/transcript-search.d.ts.map +1 -0
  282. package/dist/utils/transcript-search.js +35 -0
  283. package/dist/utils/transcript-search.js.map +1 -0
  284. package/dist/utils/transcript.d.ts +10 -31
  285. package/dist/utils/transcript.d.ts.map +1 -1
  286. package/dist/utils/transcript.js +2 -64
  287. package/dist/utils/transcript.js.map +1 -1
  288. package/dist/utils/validate-youtube.d.ts +35 -0
  289. package/dist/utils/validate-youtube.d.ts.map +1 -0
  290. package/dist/utils/validate-youtube.js +87 -0
  291. package/dist/utils/validate-youtube.js.map +1 -0
  292. package/dist/utils/validate.d.ts +11 -4
  293. package/dist/utils/validate.d.ts.map +1 -1
  294. package/dist/utils/validate.js +43 -36
  295. package/dist/utils/validate.js.map +1 -1
  296. package/dist/utils/version.d.ts +2 -0
  297. package/dist/utils/version.d.ts.map +1 -0
  298. package/dist/utils/version.js +19 -0
  299. package/dist/utils/version.js.map +1 -0
  300. package/dist/utils/youtube-channel.d.ts +44 -0
  301. package/dist/utils/youtube-channel.d.ts.map +1 -0
  302. package/dist/utils/youtube-channel.js +61 -0
  303. package/dist/utils/youtube-channel.js.map +1 -0
  304. package/dist/utils/youtube-download.d.ts +27 -0
  305. package/dist/utils/youtube-download.d.ts.map +1 -0
  306. package/dist/utils/youtube-download.js +118 -0
  307. package/dist/utils/youtube-download.js.map +1 -0
  308. package/dist/utils/youtube-schemas.d.ts +394 -0
  309. package/dist/utils/youtube-schemas.d.ts.map +1 -0
  310. package/dist/utils/youtube-schemas.js +118 -0
  311. package/dist/utils/youtube-schemas.js.map +1 -0
  312. package/dist/utils/youtube-search.d.ts +14 -0
  313. package/dist/utils/youtube-search.d.ts.map +1 -0
  314. package/dist/utils/youtube-search.js +39 -0
  315. package/dist/utils/youtube-search.js.map +1 -0
  316. package/dist/utils/youtube-url.d.ts +25 -0
  317. package/dist/utils/youtube-url.d.ts.map +1 -0
  318. package/dist/utils/youtube-url.js +75 -0
  319. package/dist/utils/youtube-url.js.map +1 -0
  320. package/dist/utils/youtube-video.d.ts +47 -0
  321. package/dist/utils/youtube-video.d.ts.map +1 -0
  322. package/dist/utils/youtube-video.js +98 -0
  323. package/dist/utils/youtube-video.js.map +1 -0
  324. package/dist/utils/youtube.d.ts +10 -122
  325. package/dist/utils/youtube.d.ts.map +1 -1
  326. package/dist/utils/youtube.js +11 -486
  327. package/dist/utils/youtube.js.map +1 -1
  328. package/dist/utils/ytdlp-env.d.ts +33 -0
  329. package/dist/utils/ytdlp-env.d.ts.map +1 -0
  330. package/dist/utils/ytdlp-env.js +121 -0
  331. package/dist/utils/ytdlp-env.js.map +1 -0
  332. package/dist/utils/ytdlp-limiter.d.ts +24 -0
  333. package/dist/utils/ytdlp-limiter.d.ts.map +1 -0
  334. package/dist/utils/ytdlp-limiter.js +69 -0
  335. package/dist/utils/ytdlp-limiter.js.map +1 -0
  336. package/dist/utils/ytdlp-parse.d.ts +13 -0
  337. package/dist/utils/ytdlp-parse.d.ts.map +1 -0
  338. package/dist/utils/ytdlp-parse.js +48 -0
  339. package/dist/utils/ytdlp-parse.js.map +1 -0
  340. package/dist/utils/ytdlp.d.ts +13 -18
  341. package/dist/utils/ytdlp.d.ts.map +1 -1
  342. package/dist/utils/ytdlp.js +21 -110
  343. package/dist/utils/ytdlp.js.map +1 -1
  344. package/package.json +2 -1
@@ -20,6 +20,7 @@ export declare const searchVideosOutputSchema: {
20
20
  channel: z.ZodOptional<z.ZodString>;
21
21
  viewCount: z.ZodOptional<z.ZodNumber>;
22
22
  uploadDate: z.ZodOptional<z.ZodString>;
23
+ thumbnailUrl: z.ZodOptional<z.ZodString>;
23
24
  }, "strip", z.ZodTypeAny, {
24
25
  id: string;
25
26
  title: string;
@@ -29,6 +30,7 @@ export declare const searchVideosOutputSchema: {
29
30
  channel?: string | undefined;
30
31
  viewCount?: number | undefined;
31
32
  uploadDate?: string | undefined;
33
+ thumbnailUrl?: string | undefined;
32
34
  }, {
33
35
  id: string;
34
36
  title: string;
@@ -38,6 +40,7 @@ export declare const searchVideosOutputSchema: {
38
40
  channel?: string | undefined;
39
41
  viewCount?: number | undefined;
40
42
  uploadDate?: string | undefined;
43
+ thumbnailUrl?: string | undefined;
41
44
  }>, "many">;
42
45
  };
43
46
  export declare function searchVideosHandler({ query, limit, }: {
@@ -1 +1 @@
1
- {"version":3,"file":"search-videos.d.ts","sourceRoot":"","sources":["../../src/tools/search-videos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE,eAAO,MAAM,kBAAkB;;;CAU9B,CAAC;AAEF,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAIpC,CAAC;AAEF,wBAAsB,mBAAmB,CAAC,EACxC,KAAK,EACL,KAAK,GACN,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,cAAc,CAAC,CA6B1B"}
1
+ {"version":3,"file":"search-videos.d.ts","sourceRoot":"","sources":["../../src/tools/search-videos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE,eAAO,MAAM,kBAAkB;;;CAU9B,CAAC;AAEF,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAIpC,CAAC;AAEF,wBAAsB,mBAAmB,CAAC,EACxC,KAAK,EACL,KAAK,GACN,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,cAAc,CAAC,CA6B1B"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Run `work` over the items, `size` at a time.
3
+ *
4
+ * Deliberately not a rolling window: a batch boundary is a natural place for a
5
+ * checkpoint and a cancellation check, and the limiter inside yt-dlp is what
6
+ * actually paces the network. Results come back in item order, whichever
7
+ * finished first.
8
+ *
9
+ * A batch always settles before a failure propagates. `Promise.all` would
10
+ * reject the moment one item did — on a cancelled request, before the items
11
+ * already in flight had finished — and a checkpoint taken in that instant
12
+ * would record none of them.
13
+ */
14
+ export declare function inBatches<T, R>(items: T[], size: number, work: (item: T, index: number) => Promise<R>): Promise<R[]>;
15
+ //# sourceMappingURL=batches.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batches.d.ts","sourceRoot":"","sources":["../../src/utils/batches.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAAE,CAAC,EAClC,KAAK,EAAE,CAAC,EAAE,EACV,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAC3C,OAAO,CAAC,CAAC,EAAE,CAAC,CAiBd"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Run `work` over the items, `size` at a time.
3
+ *
4
+ * Deliberately not a rolling window: a batch boundary is a natural place for a
5
+ * checkpoint and a cancellation check, and the limiter inside yt-dlp is what
6
+ * actually paces the network. Results come back in item order, whichever
7
+ * finished first.
8
+ *
9
+ * A batch always settles before a failure propagates. `Promise.all` would
10
+ * reject the moment one item did — on a cancelled request, before the items
11
+ * already in flight had finished — and a checkpoint taken in that instant
12
+ * would record none of them.
13
+ */
14
+ export async function inBatches(items, size, work) {
15
+ const results = [];
16
+ const width = Math.max(1, size);
17
+ for (let start = 0; start < items.length; start += width) {
18
+ const slice = items.slice(start, start + width);
19
+ const settled = await Promise.allSettled(slice.map((item, offset) => work(item, start + offset)));
20
+ for (const outcome of settled) {
21
+ if (outcome.status === 'rejected')
22
+ throw asError(outcome.reason);
23
+ results.push(outcome.value);
24
+ }
25
+ }
26
+ return results;
27
+ }
28
+ function asError(reason) {
29
+ return reason instanceof Error ? reason : new Error(String(reason));
30
+ }
31
+ //# sourceMappingURL=batches.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batches.js","sourceRoot":"","sources":["../../src/utils/batches.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,KAAU,EACV,IAAY,EACZ,IAA4C;IAE5C,MAAM,OAAO,GAAQ,EAAE,CAAC;IACxB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAEhC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,KAAK,EAAE,CAAC;QACzD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC,CACxD,CAAC;QAEF,KAAK,MAAM,OAAO,IAAI,OAAO,EAAE,CAAC;YAC9B,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU;gBAAE,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACjE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,OAAO,CAAC,MAAe;IAC9B,OAAO,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;AACtE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"brain-build.d.ts","sourceRoot":"","sources":["../../src/utils/brain-build.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,aAAa,EAAmB,MAAM,qBAAqB,CAAC;AAEtF,OAAO,EAKL,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;AAK3B,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE/D;;;;;;;;;;;;GAYG;AAEH,6EAA6E;AAC7E,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAc1C,kEAAkE;AAClE,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC,MAAM,WAAW,iBAAkB,SAAQ,YAAY;IACrD,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,QAAQ,EAAE,aAAa,GAAG,SAAS,CAAC;IACpC,8EAA8E;IAC9E,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,aAAa,CAAC;IACxB,0EAA0E;IAC1E,UAAU,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA4EtF"}
1
+ {"version":3,"file":"brain-build.d.ts","sourceRoot":"","sources":["../../src/utils/brain-build.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,aAAa,EAAmB,MAAM,qBAAqB,CAAC;AAEtF,OAAO,EAKL,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;AAM3B,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE/D;;;;;;;;;;;;GAYG;AAEH,6EAA6E;AAC7E,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAc1C,kEAAkE;AAClE,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC,MAAM,WAAW,iBAAkB,SAAQ,YAAY;IACrD,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,QAAQ,EAAE,aAAa,GAAG,SAAS,CAAC;IACpC,8EAA8E;IAC9E,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,aAAa,CAAC;IACxB,0EAA0E;IAC1E,UAAU,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA4EtF"}
@@ -4,6 +4,7 @@ import { computeStats } from './brain-stats.js';
4
4
  import { BRAIN_MANIFEST_VERSION, writeManifest } from './brain-storage.js';
5
5
  import { reportProgress, throwIfAborted } from './context.js';
6
6
  import { concurrencyState } from './ytdlp.js';
7
+ import { inBatches } from './batches.js';
7
8
  /**
8
9
  * Reading a channel into a brain.
9
10
  *
@@ -196,16 +197,4 @@ function toManifest(channel, states, passages, createdAt, language, phrases) {
196
197
  stats: computeStats([...states.values()], passages, { phrases }),
197
198
  };
198
199
  }
199
- /**
200
- * Run `work` over the items, `size` at a time.
201
- *
202
- * Deliberately not a rolling window: a batch boundary is a natural place for
203
- * the checkpoint and the cancellation check, and the limiter inside yt-dlp is
204
- * what actually paces the network.
205
- */
206
- async function inBatches(items, size, work) {
207
- for (let start = 0; start < items.length; start += size) {
208
- await Promise.all(items.slice(start, start + size).map(work));
209
- }
210
- }
211
200
  //# sourceMappingURL=brain-build.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"brain-build.js","sourceRoot":"","sources":["../../src/utils/brain-build.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"brain-build.js","sourceRoot":"","sources":["../../src/utils/brain-build.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"brain-index.d.ts","sourceRoot":"","sources":["../../src/utils/brain-index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAwB,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAM/F;;;;;;;;;;;;;GAaG;AAEH,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAoB1C,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAEzD;AAED,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAGzE;AAED,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CASxF;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;CACf;AAED,2EAA2E;AAC3E,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,MAAM,SAAI,GACT,OAAO,CAAC,kBAAkB,CAAC,CAuB7B"}
1
+ {"version":3,"file":"brain-index.d.ts","sourceRoot":"","sources":["../../src/utils/brain-index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAwB,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAO/F;;;;;;;;;;;;;GAaG;AAEH,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAoB1C,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAEzD;AAED,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAGzE;AAED,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CASxF;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;CACf;AAED,2EAA2E;AAC3E,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,MAAM,SAAI,GACT,OAAO,CAAC,kBAAkB,CAAC,CAuB7B"}
@@ -1,7 +1,8 @@
1
1
  import { existsSync } from 'node:fs';
2
- import { mkdir, stat } from 'node:fs/promises';
2
+ import { stat } from 'node:fs/promises';
3
3
  import { brainChunkFileSchema } from '../brain-schemas.js';
4
4
  import { brainDir, chunksPath } from './brain-paths.js';
5
+ import { ensurePrivateDir } from './paths.js';
5
6
  import { readJsonFile, writeJsonAtomic } from './json-file.js';
6
7
  import { SearchIndex } from './search-index.js';
7
8
  import { deepLink, formatTimestamp } from './transcript.js';
@@ -35,7 +36,7 @@ export async function readChunks(channelId) {
35
36
  return file?.chunks ?? [];
36
37
  }
37
38
  export async function writeChunks(channelId, chunks) {
38
- await mkdir(brainDir(channelId), { recursive: true });
39
+ await ensurePrivateDir(brainDir(channelId));
39
40
  // Not pretty-printed: indentation would be a fifth of a file nobody reads.
40
41
  await writeJsonAtomic(chunksPath(channelId), { version: BRAIN_CHUNK_FILE_VERSION, chunks }, { pretty: false });
41
42
  forgetBrainCorpus(channelId);
@@ -1 +1 @@
1
- {"version":3,"file":"brain-index.js","sourceRoot":"","sources":["../../src/utils/brain-index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"brain-index.js","sourceRoot":"","sources":["../../src/utils/brain-index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAsC,MAAM,qBAAqB,CAAC;AAC/F,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE5D;;;;;;;;;;;;;GAaG;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAY1C;;;;;GAKG;AACH,MAAM,KAAK,GAAG,IAAI,GAAG,EAAwB,CAAC;AAE9C,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,SAAiB;IAChD,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,oBAAoB,CAAC,CAAC;IAC7E,OAAO,IAAI,EAAE,MAAM,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,SAAiB,EAAE,MAAoB;IACvE,MAAM,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5C,2EAA2E;IAC3E,MAAM,eAAe,CACnB,UAAU,CAAC,SAAS,CAAC,EACrB,EAAE,OAAO,EAAE,wBAAwB,EAAE,MAAM,EAAE,EAC7C,EAAE,MAAM,EAAE,KAAK,EAAE,CAClB,CAAC;IACF,iBAAiB,CAAC,SAAS,CAAC,CAAC;AAC/B,CAAC;AAQD,2EAA2E;AAC3E,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,SAAiB,EACjB,KAAa,EACb,KAAa,EACb,MAAM,GAAG,CAAC;IAEV,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,CAAC;IAClD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAE3D,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,EAAE,CAAC;QAEnC,OAAO;YACL;gBACE,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,cAAc,EAAE,eAAe,CAAC,KAAK,CAAC,YAAY,CAAC;gBACnD,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,CAAC;aACjD;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,SAAiB;IACvC,MAAM,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IACnC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,WAAW,EAAE,CAAC;IAE5C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACpC,IAAI,MAAM,EAAE,OAAO,KAAK,OAAO;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC;IAEtD,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;IACxD,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,WAAW;IAClB,OAAO,EAAE,KAAK,EAAE,IAAI,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;AACvD,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW,CAAC,MAAoB;IACvC,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;IAE7B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;YACf,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,KAAK,CAAC,IAAI;SACjB,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1,20 +1,4 @@
1
- /**
2
- * Exclusive access to a brain while it is being built.
3
- *
4
- * Two builds of one channel would interleave their manifest checkpoints, and
5
- * the later write would silently drop whatever the other had recorded since it
6
- * last read. A lock file rather than an in-process mutex because a second
7
- * server process — a second editor window, a stray `npm start` — is the case
8
- * that actually happens.
9
- */
10
- /** Long enough that a slow build is never mistaken for a dead one. */
11
- export declare const LOCK_STALE_MS: number;
12
- /**
13
- * Run `build` holding the lock.
14
- *
15
- * It is released on any exit, including cancellation. A process killed outright
16
- * leaves one behind, which is why a lock is also broken when its owner is gone
17
- * or when it is simply too old to be real.
18
- */
1
+ export { LOCK_STALE_MS } from './file-lock.js';
2
+ /** Exclusive access to a brain while it is being built. See `withFileLock`. */
19
3
  export declare function withBuildLock<T>(channelId: string, build: () => Promise<T>): Promise<T>;
20
4
  //# sourceMappingURL=brain-lock.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"brain-lock.d.ts","sourceRoot":"","sources":["../../src/utils/brain-lock.ts"],"names":[],"mappings":"AAQA;;;;;;;;GAQG;AAEH,sEAAsE;AACtE,eAAO,MAAM,aAAa,QAAiB,CAAC;AAE5C;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAyB7F"}
1
+ {"version":3,"file":"brain-lock.d.ts","sourceRoot":"","sources":["../../src/utils/brain-lock.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,+EAA+E;AAC/E,wBAAsB,aAAa,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAK7F"}
@@ -1,50 +1,12 @@
1
- import { rm, writeFile } from 'node:fs/promises';
2
- import { brainLockSchema } from '../brain-schemas.js';
3
1
  import { ensureBrainDir } from './brain-storage.js';
4
2
  import { lockPath } from './brain-paths.js';
5
3
  import { YouTubeError } from './errors.js';
6
- import { readJsonFile } from './json-file.js';
7
- import { isRecord } from './ytdlp.js';
8
- /**
9
- * Exclusive access to a brain while it is being built.
10
- *
11
- * Two builds of one channel would interleave their manifest checkpoints, and
12
- * the later write would silently drop whatever the other had recorded since it
13
- * last read. A lock file rather than an in-process mutex because a second
14
- * server process — a second editor window, a stray `npm start` — is the case
15
- * that actually happens.
16
- */
17
- /** Long enough that a slow build is never mistaken for a dead one. */
18
- export const LOCK_STALE_MS = 30 * 60 * 1000;
19
- /**
20
- * Run `build` holding the lock.
21
- *
22
- * It is released on any exit, including cancellation. A process killed outright
23
- * leaves one behind, which is why a lock is also broken when its owner is gone
24
- * or when it is simply too old to be real.
25
- */
4
+ import { withFileLock } from './file-lock.js';
5
+ export { LOCK_STALE_MS } from './file-lock.js';
6
+ /** Exclusive access to a brain while it is being built. See `withFileLock`. */
26
7
  export async function withBuildLock(channelId, build) {
27
8
  await ensureBrainDir(channelId);
28
- const path = lockPath(channelId);
29
- if (!(await acquire(path))) {
30
- const existing = await readJsonFile(path, brainLockSchema);
31
- // An unreadable lock is one being written this instant, which is as held as
32
- // it gets. Only a lock whose owner is demonstrably gone gets broken.
33
- if (existing === undefined || !isStale(existing.pid, existing.startedAt)) {
34
- throw alreadyRunning(channelId, existing);
35
- }
36
- await rm(path, { force: true });
37
- // Losing this second race means another caller broke the same stale lock
38
- // first, and is now the legitimate owner.
39
- if (!(await acquire(path)))
40
- throw alreadyRunning(channelId, undefined);
41
- }
42
- try {
43
- return await build();
44
- }
45
- finally {
46
- await rm(path, { force: true });
47
- }
9
+ return withFileLock(lockPath(channelId), build, (existing) => alreadyRunning(channelId, existing));
48
10
  }
49
11
  function alreadyRunning(channelId, existing) {
50
12
  const owner = existing === undefined ? '' : `Started at ${existing.startedAt} by process ${existing.pid}. `;
@@ -52,42 +14,4 @@ function alreadyRunning(channelId, existing) {
52
14
  nextStep: `${owner}Wait for it to finish, then call build_brain again to continue where it stopped.`,
53
15
  });
54
16
  }
55
- /**
56
- * Create the lock file, or report that someone else already has.
57
- *
58
- * `wx` fails when the file exists, and that check and the creation are one
59
- * operation in the kernel. Reading first and writing after is not a lock: two
60
- * builds starting together both see nothing and both proceed.
61
- */
62
- async function acquire(path) {
63
- const lock = { pid: process.pid, startedAt: new Date().toISOString() };
64
- try {
65
- await writeFile(path, JSON.stringify(lock), { encoding: 'utf-8', flag: 'wx' });
66
- return true;
67
- }
68
- catch (error) {
69
- if (isRecord(error) && error.code === 'EEXIST')
70
- return false;
71
- throw error;
72
- }
73
- }
74
- function isStale(pid, startedAt) {
75
- const started = Date.parse(startedAt);
76
- if (Number.isNaN(started) || Date.now() - started > LOCK_STALE_MS)
77
- return true;
78
- return !isProcessAlive(pid);
79
- }
80
- function isProcessAlive(pid) {
81
- try {
82
- // Signal 0 performs the permission and existence checks without delivering
83
- // anything.
84
- process.kill(pid, 0);
85
- return true;
86
- }
87
- catch (error) {
88
- // EPERM means the process exists but belongs to another user, which for
89
- // this purpose is very much alive.
90
- return isRecord(error) && error.code === 'EPERM';
91
- }
92
- }
93
17
  //# sourceMappingURL=brain-lock.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"brain-lock.js","sourceRoot":"","sources":["../../src/utils/brain-lock.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"brain-lock.js","sourceRoot":"","sources":["../../src/utils/brain-lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAmB,MAAM,gBAAgB,CAAC;AAE/D,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,aAAa,CAAI,SAAiB,EAAE,KAAuB;IAC/E,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,CAC3D,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC,CACpC,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,SAAiB,EAAE,QAAgC;IACzE,MAAM,KAAK,GACT,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,QAAQ,CAAC,SAAS,eAAe,QAAQ,CAAC,GAAG,IAAI,CAAC;IAEhG,OAAO,IAAI,YAAY,CAAC,eAAe,EAAE,eAAe,SAAS,sBAAsB,EAAE;QACvF,QAAQ,EAAE,GAAG,KAAK,kFAAkF;KACrG,CAAC,CAAC;AACL,CAAC"}
@@ -1,3 +1,11 @@
1
1
  import type { BrainManifest } from '../brain-schemas.js';
2
+ /**
3
+ * Find a brain from whatever the caller called the channel.
4
+ *
5
+ * Every brain tool except `build_brain` answers from disk, so none of them
6
+ * should need the network to work out which brain is meant. The matching
7
+ * itself is shared with every other channel-keyed store; what is specific here
8
+ * is what to say when there is no brain, or more than one.
9
+ */
2
10
  export declare function resolveBrain(channel: string): Promise<BrainManifest>;
3
11
  //# sourceMappingURL=brain-lookup.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"brain-lookup.d.ts","sourceRoot":"","sources":["../../src/utils/brain-lookup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAmBzD,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAY1E"}
1
+ {"version":3,"file":"brain-lookup.d.ts","sourceRoot":"","sources":["../../src/utils/brain-lookup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAKzD;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAU1E"}
@@ -1,22 +1,17 @@
1
1
  import { listManifests } from './brain-storage.js';
2
+ import { findByChannel } from './channel-lookup.js';
2
3
  import { YouTubeError } from './errors.js';
3
4
  /**
4
5
  * Find a brain from whatever the caller called the channel.
5
6
  *
6
7
  * Every brain tool except `build_brain` answers from disk, so none of them
7
- * should need the network to work out which brain is meant — asking YouTube to
8
- * resolve a handle before every search would put a round trip in front of a
9
- * lookup that is otherwise instant, and would make a brain unusable offline.
10
- *
11
- * The manifest already records the channel's id, handle, name and URL, which is
12
- * everything a caller is likely to type.
8
+ * should need the network to work out which brain is meant. The matching
9
+ * itself is shared with every other channel-keyed store; what is specific here
10
+ * is what to say when there is no brain, or more than one.
13
11
  */
14
- const CHANNEL_ID_IN_TEXT = /UC[A-Za-z0-9_-]{22}/;
15
- const HANDLE_IN_TEXT = /@[\w.-]+/;
16
12
  export async function resolveBrain(channel) {
17
13
  const manifests = await listManifests();
18
- const wanted = candidates(channel);
19
- const matches = manifests.filter((manifest) => keysOf(manifest).some((key) => wanted.has(key)));
14
+ const matches = findByChannel(manifests, channel);
20
15
  const [first, second] = matches;
21
16
  if (first === undefined)
22
17
  throw noBrain(channel, manifests);
@@ -24,27 +19,6 @@ export async function resolveBrain(channel) {
24
19
  throw ambiguous(channel, matches);
25
20
  return first;
26
21
  }
27
- function candidates(channel) {
28
- const keys = new Set([normalize(channel)]);
29
- const id = CHANNEL_ID_IN_TEXT.exec(channel)?.[0];
30
- if (id !== undefined)
31
- keys.add(normalize(id));
32
- const handle = HANDLE_IN_TEXT.exec(channel)?.[0];
33
- if (handle !== undefined) {
34
- keys.add(normalize(handle));
35
- keys.add(normalize(handle.slice(1)));
36
- }
37
- return keys;
38
- }
39
- function keysOf(manifest) {
40
- const { channelId, handle, name, channelUrl } = manifest.channel;
41
- return [channelId, handle, handle.replace(/^@/, ''), name, channelUrl]
42
- .map(normalize)
43
- .filter((key) => key !== '');
44
- }
45
- function normalize(value) {
46
- return value.trim().toLowerCase().replace(/\/+$/, '');
47
- }
48
22
  function noBrain(channel, manifests) {
49
23
  const built = manifests.map((manifest) => manifest.channel.handle || manifest.channel.name);
50
24
  return new YouTubeError('NOT_FOUND', `No brain has been built for "${channel}".`, {
@@ -1 +1 @@
1
- {"version":3,"file":"brain-lookup.js","sourceRoot":"","sources":["../../src/utils/brain-lookup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"brain-lookup.js","sourceRoot":"","sources":["../../src/utils/brain-lookup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAe;IAChD,MAAM,SAAS,GAAG,MAAM,aAAa,EAAE,CAAC;IACxC,MAAM,OAAO,GAAG,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAElD,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;IAEhC,IAAI,KAAK,KAAK,SAAS;QAAE,MAAM,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC3D,IAAI,MAAM,KAAK,SAAS;QAAE,MAAM,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAE5D,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,OAAO,CAAC,OAAe,EAAE,SAA0B;IAC1D,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5F,OAAO,IAAI,YAAY,CAAC,WAAW,EAAE,gCAAgC,OAAO,IAAI,EAAE;QAChF,QAAQ,EACN,KAAK,CAAC,MAAM,KAAK,CAAC;YAChB,CAAC,CAAC,+DAA+D;YACjE,CAAC,CAAC,oDAAoD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;KAC9E,CAAC,CAAC;AACL,CAAC;AAED,SAAS,SAAS,CAAC,OAAe,EAAE,OAAwB;IAC1D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEpE,OAAO,IAAI,YAAY,CAAC,eAAe,EAAE,IAAI,OAAO,gCAAgC,EAAE;QACpF,QAAQ,EAAE,+BAA+B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;KAC7D,CAAC,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"brain-storage.d.ts","sourceRoot":"","sources":["../../src/utils/brain-storage.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAM9E;;;;;;;GAOG;AAEH,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAIvE;AAID,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAExF;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAW/E;AAED,wBAAsB,aAAa,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAG1E;AAED,6EAA6E;AAC7E,wBAAsB,aAAa,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAmB9D;AAED,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQrE;AAID,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAIhF;AAED,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKtF;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAErD"}
1
+ {"version":3,"file":"brain-storage.d.ts","sourceRoot":"","sources":["../../src/utils/brain-storage.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAO9E;;;;;;;GAOG;AAEH,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGvE;AAID,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAExF;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAW/E;AAED,wBAAsB,aAAa,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAG1E;AAED,6EAA6E;AAC7E,wBAAsB,aAAa,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAmB9D;AAED,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQrE;AAID,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAIhF;AAED,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKtF;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAErD"}
@@ -1,9 +1,10 @@
1
1
  import { existsSync } from 'node:fs';
2
- import { mkdir, readFile, readdir, rm, writeFile } from 'node:fs/promises';
2
+ import { readFile, readdir, rm } from 'node:fs/promises';
3
3
  import { join } from 'node:path';
4
4
  import { brainManifestSchema } from '../brain-schemas.js';
5
5
  import { YouTubeError } from './errors.js';
6
- import { readJsonFile, writeJsonAtomic } from './json-file.js';
6
+ import { readJsonFile, writeFileAtomic, writeJsonAtomic } from './json-file.js';
7
+ import { ensurePrivateDir } from './paths.js';
7
8
  import { brainDir, brainsDir, manifestPath, profilePath } from './brain-paths.js';
8
9
  import { forgetBrainCorpus } from './brain-index.js';
9
10
  /**
@@ -17,8 +18,7 @@ import { forgetBrainCorpus } from './brain-index.js';
17
18
  export const BRAIN_MANIFEST_VERSION = 1;
18
19
  export async function ensureBrainDir(channelId) {
19
20
  const directory = brainDir(channelId);
20
- await mkdir(directory, { recursive: true });
21
- return directory;
21
+ return ensurePrivateDir(directory);
22
22
  }
23
23
  // -- Manifest ------------------------------------------------------------
24
24
  export async function readManifest(channelId) {
@@ -78,7 +78,7 @@ export async function readProfile(channelId) {
78
78
  export async function writeProfile(channelId, content) {
79
79
  await ensureBrainDir(channelId);
80
80
  const path = profilePath(channelId);
81
- await writeFile(path, content, 'utf-8');
81
+ await writeFileAtomic(path, content);
82
82
  return path;
83
83
  }
84
84
  export function hasProfile(channelId) {
@@ -1 +1 @@
1
- {"version":3,"file":"brain-storage.js","sourceRoot":"","sources":["../../src/utils/brain-storage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"brain-storage.js","sourceRoot":"","sources":["../../src/utils/brain-storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { YouTubeError } from './errors.js';
2
+ /**
3
+ * Ask yt-dlp which caption tracks the video actually has, so the error can name
4
+ * the languages that would work instead of just saying "not found".
5
+ */
6
+ export declare function noCaptionsError(url: string, requested: string): Promise<YouTubeError>;
7
+ //# sourceMappingURL=caption-probe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caption-probe.d.ts","sourceRoot":"","sources":["../../src/utils/caption-probe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C;;;GAGG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAmC3F"}
@@ -0,0 +1,36 @@
1
+ import { YouTubeError } from './errors.js';
2
+ import { parseYtDlpJson, runYtDlp } from './ytdlp.js';
3
+ import { captionTracksSchema } from './youtube-schemas.js';
4
+ /**
5
+ * Ask yt-dlp which caption tracks the video actually has, so the error can name
6
+ * the languages that would work instead of just saying "not found".
7
+ */
8
+ export async function noCaptionsError(url, requested) {
9
+ let available = [];
10
+ try {
11
+ const stdout = await runYtDlp(['-j', '--skip-download'], {
12
+ label: 'get_transcript (caption probe)',
13
+ target: url,
14
+ });
15
+ const data = parseYtDlpJson(stdout, captionTracksSchema, 'caption tracks');
16
+ available = [
17
+ ...Object.keys(data.subtitles ?? {}),
18
+ ...Object.keys(data.automatic_captions ?? {}),
19
+ ]
20
+ .filter((code) => !code.endsWith('-orig'))
21
+ .filter((code, index, all) => all.indexOf(code) === index)
22
+ .sort();
23
+ }
24
+ catch {
25
+ // The probe is a nicety; never let it mask the original problem.
26
+ }
27
+ if (available.length === 0) {
28
+ return new YouTubeError('NO_CAPTIONS', 'This video has no captions in any language.', {
29
+ nextStep: 'Try get_video_info for the description, or get_comments for viewer discussion instead.',
30
+ });
31
+ }
32
+ const shown = available.slice(0, 25).join(', ');
33
+ const more = available.length > 25 ? `, and ${available.length - 25} more` : '';
34
+ return new YouTubeError('NO_CAPTIONS', `No "${requested}" captions are available for this video.`, { nextStep: `Call get_transcript again with one of: ${shown}${more}.` });
35
+ }
36
+ //# sourceMappingURL=caption-probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caption-probe.js","sourceRoot":"","sources":["../../src/utils/caption-probe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW,EAAE,SAAiB;IAClE,IAAI,SAAS,GAAa,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE;YACvD,KAAK,EAAE,gCAAgC;YACvC,MAAM,EAAE,GAAG;SACZ,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,EAAE,mBAAmB,EAAE,gBAAgB,CAAC,CAAC;QAE3E,SAAS,GAAG;YACV,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;YACpC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAAI,EAAE,CAAC;SAC9C;aACE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;aACzC,MAAM,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC;aACzD,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,iEAAiE;IACnE,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,YAAY,CAAC,aAAa,EAAE,6CAA6C,EAAE;YACpF,QAAQ,EACN,wFAAwF;SAC3F,CAAC,CAAC;IACL,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,SAAS,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAChF,OAAO,IAAI,YAAY,CACrB,aAAa,EACb,OAAO,SAAS,0CAA0C,EAC1D,EAAE,QAAQ,EAAE,0CAA0C,KAAK,GAAG,IAAI,GAAG,EAAE,CACxE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Picking a channel's avatar and banner out of the thumbnails yt-dlp lists for
3
+ * the channel page.
4
+ *
5
+ * Verified against yt-dlp 2026.07.04: the array holds banner crops at several
6
+ * widths, one `banner_uncropped`, a square avatar, and one `avatar_uncropped`.
7
+ * The uncropped ids are preferred; should they ever be renamed, the fallback
8
+ * needs nothing but widths and heights — the largest square is the avatar and
9
+ * the widest image more than twice as wide as it is tall is the banner.
10
+ */
11
+ export interface ChannelImages {
12
+ avatarUrl?: string;
13
+ bannerUrl?: string;
14
+ }
15
+ export declare function selectChannelImages(thumbnails: unknown): ChannelImages;
16
+ //# sourceMappingURL=channel-images.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-images.d.ts","sourceRoot":"","sources":["../../src/utils/channel-images.ts"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AAEH,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA8BD,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,OAAO,GAAG,aAAa,CAkBtE"}
@@ -0,0 +1,35 @@
1
+ import { z } from 'zod';
2
+ import { listedImageSchema } from './flat-listing.js';
3
+ import { IMAGE_HOSTS } from './image-fetch.js';
4
+ const HOSTS = new Set(IMAGE_HOSTS);
5
+ function onAllowedHost(image) {
6
+ try {
7
+ const url = new URL(image.url);
8
+ return url.protocol === 'https:' && HOSTS.has(url.hostname.toLowerCase());
9
+ }
10
+ catch {
11
+ return false;
12
+ }
13
+ }
14
+ function sized(images) {
15
+ return images.flatMap(({ url, width, height }) => typeof width === 'number' && typeof height === 'number' ? [{ url, width, height }] : []);
16
+ }
17
+ function largest(images, keep) {
18
+ return images.filter(keep).sort((a, b) => b.width * b.height - a.width * a.height)[0];
19
+ }
20
+ export function selectChannelImages(thumbnails) {
21
+ const parsed = z.array(listedImageSchema).safeParse(thumbnails);
22
+ if (!parsed.success)
23
+ return {};
24
+ const images = parsed.data.filter(onAllowedHost);
25
+ const measured = sized(images);
26
+ const avatar = images.find((image) => image.id === 'avatar_uncropped') ??
27
+ largest(measured, (image) => image.width === image.height);
28
+ const banner = images.find((image) => image.id === 'banner_uncropped') ??
29
+ largest(measured, (image) => image.width > 2 * image.height);
30
+ return {
31
+ ...(avatar === undefined ? {} : { avatarUrl: avatar.url }),
32
+ ...(banner === undefined ? {} : { bannerUrl: banner.url }),
33
+ };
34
+ }
35
+ //# sourceMappingURL=channel-images.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-images.js","sourceRoot":"","sources":["../../src/utils/channel-images.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAoB,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAyB/C,MAAM,KAAK,GAAG,IAAI,GAAG,CAAS,WAAW,CAAC,CAAC;AAE3C,SAAS,aAAa,CAAC,KAAkB;IACvC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,MAAqB;IAClC,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAC/C,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CACxF,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,MAAe,EAAE,IAA+B;IAC/D,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AACxF,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,UAAmB;IACrD,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAChE,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAE/B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAE/B,MAAM,MAAM,GACV,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,kBAAkB,CAAC;QACvD,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7D,MAAM,MAAM,GACV,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,kBAAkB,CAAC;QACvD,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAE/D,OAAO;QACL,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;QAC1D,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;KAC3D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { ChannelInfo } from './youtube.js';
2
+ export declare function findByChannel<T extends {
3
+ channel: ChannelInfo;
4
+ }>(items: T[], channel: string): T[];
5
+ //# sourceMappingURL=channel-lookup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-lookup.d.ts","sourceRoot":"","sources":["../../src/utils/channel-lookup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAgBhD,wBAAgB,aAAa,CAAC,CAAC,SAAS;IAAE,OAAO,EAAE,WAAW,CAAA;CAAE,EAC9D,KAAK,EAAE,CAAC,EAAE,EACV,OAAO,EAAE,MAAM,GACd,CAAC,EAAE,CAGL"}