googlemaps-kit 0.5.0 → 0.7.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 (343) hide show
  1. package/README.md +56 -3
  2. package/dist/advanced/parsers.d.ts +1 -1
  3. package/dist/advanced/parsers.d.ts.map +1 -1
  4. package/dist/advanced/parsers.js +1 -1
  5. package/dist/advanced/parsers.js.map +1 -1
  6. package/dist/advanced.d.ts +2 -2
  7. package/dist/advanced.d.ts.map +1 -1
  8. package/dist/advanced.js.map +1 -1
  9. package/dist/books.d.ts +30 -0
  10. package/dist/books.d.ts.map +1 -0
  11. package/dist/books.js +77 -0
  12. package/dist/books.js.map +1 -0
  13. package/dist/cli/run.d.ts.map +1 -1
  14. package/dist/cli/run.js +9 -11
  15. package/dist/cli/run.js.map +1 -1
  16. package/dist/cli/tui/app.d.ts.map +1 -1
  17. package/dist/cli/tui/app.js +7 -7
  18. package/dist/cli/tui/app.js.map +1 -1
  19. package/dist/cli.js +14 -11
  20. package/dist/cli.js.map +1 -1
  21. package/dist/client/gmaps-client.d.ts +7 -29
  22. package/dist/client/gmaps-client.d.ts.map +1 -1
  23. package/dist/client/gmaps-client.js +15 -131
  24. package/dist/client/gmaps-client.js.map +1 -1
  25. package/dist/client/http-client.d.ts +3 -1
  26. package/dist/client/http-client.d.ts.map +1 -1
  27. package/dist/client/http-client.js +14 -3
  28. package/dist/client/http-client.js.map +1 -1
  29. package/dist/client/intent.d.ts +1 -11
  30. package/dist/client/intent.d.ts.map +1 -1
  31. package/dist/client/intent.js +17 -13
  32. package/dist/client/intent.js.map +1 -1
  33. package/dist/client/maps-tools.d.ts +8 -4
  34. package/dist/client/maps-tools.d.ts.map +1 -1
  35. package/dist/client/maps-tools.js +20 -11
  36. package/dist/client/maps-tools.js.map +1 -1
  37. package/dist/client/namespaces.d.ts +51 -19
  38. package/dist/client/namespaces.d.ts.map +1 -1
  39. package/dist/client/namespaces.js +82 -28
  40. package/dist/client/namespaces.js.map +1 -1
  41. package/dist/client/place-workflows.d.ts +7 -0
  42. package/dist/client/place-workflows.d.ts.map +1 -0
  43. package/dist/client/place-workflows.js +113 -0
  44. package/dist/client/place-workflows.js.map +1 -0
  45. package/dist/finance/client.d.ts +19 -0
  46. package/dist/finance/client.d.ts.map +1 -0
  47. package/dist/finance/client.js +75 -0
  48. package/dist/finance/client.js.map +1 -0
  49. package/dist/finance/parsers.d.ts +13 -0
  50. package/dist/finance/parsers.d.ts.map +1 -0
  51. package/dist/finance/parsers.js +146 -0
  52. package/dist/finance/parsers.js.map +1 -0
  53. package/dist/finance/types.d.ts +76 -0
  54. package/dist/finance/types.d.ts.map +1 -0
  55. package/dist/finance/types.js +2 -0
  56. package/dist/finance/types.js.map +1 -0
  57. package/dist/finance.d.ts +5 -0
  58. package/dist/finance.d.ts.map +1 -0
  59. package/dist/finance.js +4 -0
  60. package/dist/finance.js.map +1 -0
  61. package/dist/flights/client.d.ts +9 -0
  62. package/dist/flights/client.d.ts.map +1 -0
  63. package/dist/flights/client.js +14 -0
  64. package/dist/flights/client.js.map +1 -0
  65. package/dist/flights/parsers.d.ts +11 -0
  66. package/dist/flights/parsers.d.ts.map +1 -0
  67. package/dist/flights/parsers.js +64 -0
  68. package/dist/flights/parsers.js.map +1 -0
  69. package/dist/flights/types.d.ts +52 -0
  70. package/dist/flights/types.d.ts.map +1 -0
  71. package/dist/flights/types.js +2 -0
  72. package/dist/flights/types.js.map +1 -0
  73. package/dist/flights.d.ts +5 -0
  74. package/dist/flights.d.ts.map +1 -0
  75. package/dist/flights.js +4 -0
  76. package/dist/flights.js.map +1 -0
  77. package/dist/gemini-web/client.d.ts +16 -0
  78. package/dist/gemini-web/client.d.ts.map +1 -0
  79. package/dist/gemini-web/client.js +110 -0
  80. package/dist/gemini-web/client.js.map +1 -0
  81. package/dist/gemini-web/parsers.d.ts +5 -0
  82. package/dist/gemini-web/parsers.d.ts.map +1 -0
  83. package/dist/gemini-web/parsers.js +62 -0
  84. package/dist/gemini-web/parsers.js.map +1 -0
  85. package/dist/gemini-web/types.d.ts +47 -0
  86. package/dist/gemini-web/types.d.ts.map +1 -0
  87. package/dist/gemini-web/types.js +2 -0
  88. package/dist/gemini-web/types.js.map +1 -0
  89. package/dist/gemini-web.d.ts +5 -0
  90. package/dist/gemini-web.d.ts.map +1 -0
  91. package/dist/gemini-web.js +4 -0
  92. package/dist/gemini-web.js.map +1 -0
  93. package/dist/google-search/client.d.ts +16 -0
  94. package/dist/google-search/client.d.ts.map +1 -0
  95. package/dist/google-search/client.js +117 -0
  96. package/dist/google-search/client.js.map +1 -0
  97. package/dist/google-search/errors.d.ts +8 -0
  98. package/dist/google-search/errors.d.ts.map +1 -0
  99. package/dist/google-search/errors.js +13 -0
  100. package/dist/google-search/errors.js.map +1 -0
  101. package/dist/google-search/html.d.ts +12 -0
  102. package/dist/google-search/html.d.ts.map +1 -0
  103. package/dist/google-search/html.js +135 -0
  104. package/dist/google-search/html.js.map +1 -0
  105. package/dist/google-search/parsers.d.ts +6 -0
  106. package/dist/google-search/parsers.d.ts.map +1 -0
  107. package/dist/google-search/parsers.js +177 -0
  108. package/dist/google-search/parsers.js.map +1 -0
  109. package/dist/google-search/types.d.ts +66 -0
  110. package/dist/google-search/types.d.ts.map +1 -0
  111. package/dist/google-search/types.js +2 -0
  112. package/dist/google-search/types.js.map +1 -0
  113. package/dist/google-search.d.ts +6 -0
  114. package/dist/google-search.d.ts.map +1 -0
  115. package/dist/google-search.js +4 -0
  116. package/dist/google-search.js.map +1 -0
  117. package/dist/hotels/client.d.ts +9 -0
  118. package/dist/hotels/client.d.ts.map +1 -0
  119. package/dist/hotels/client.js +14 -0
  120. package/dist/hotels/client.js.map +1 -0
  121. package/dist/hotels/parsers.d.ts +7 -0
  122. package/dist/hotels/parsers.d.ts.map +1 -0
  123. package/dist/hotels/parsers.js +74 -0
  124. package/dist/hotels/parsers.js.map +1 -0
  125. package/dist/hotels/types.d.ts +55 -0
  126. package/dist/hotels/types.d.ts.map +1 -0
  127. package/dist/hotels/types.js +2 -0
  128. package/dist/hotels/types.js.map +1 -0
  129. package/dist/hotels.d.ts +4 -0
  130. package/dist/hotels.d.ts.map +1 -0
  131. package/dist/hotels.js +3 -0
  132. package/dist/hotels.js.map +1 -0
  133. package/dist/index.d.ts +9 -5
  134. package/dist/index.d.ts.map +1 -1
  135. package/dist/index.js +3 -1
  136. package/dist/index.js.map +1 -1
  137. package/dist/known-surfaces.d.ts +35 -5
  138. package/dist/known-surfaces.d.ts.map +1 -1
  139. package/dist/known-surfaces.js +35 -5
  140. package/dist/known-surfaces.js.map +1 -1
  141. package/dist/lens/client.d.ts +14 -0
  142. package/dist/lens/client.d.ts.map +1 -0
  143. package/dist/lens/client.js +116 -0
  144. package/dist/lens/client.js.map +1 -0
  145. package/dist/lens/errors.d.ts +8 -0
  146. package/dist/lens/errors.d.ts.map +1 -0
  147. package/dist/lens/errors.js +13 -0
  148. package/dist/lens/errors.js.map +1 -0
  149. package/dist/lens/types.d.ts +27 -0
  150. package/dist/lens/types.d.ts.map +1 -0
  151. package/dist/lens/types.js +2 -0
  152. package/dist/lens/types.js.map +1 -0
  153. package/dist/lens.d.ts +8 -0
  154. package/dist/lens.d.ts.map +1 -0
  155. package/dist/lens.js +5 -0
  156. package/dist/lens.js.map +1 -0
  157. package/dist/news.d.ts +46 -0
  158. package/dist/news.d.ts.map +1 -0
  159. package/dist/news.js +202 -0
  160. package/dist/news.js.map +1 -0
  161. package/dist/pagespeed/client.d.ts +28 -0
  162. package/dist/pagespeed/client.d.ts.map +1 -0
  163. package/dist/pagespeed/client.js +222 -0
  164. package/dist/pagespeed/client.js.map +1 -0
  165. package/dist/pagespeed/errors.d.ts +9 -0
  166. package/dist/pagespeed/errors.d.ts.map +1 -0
  167. package/dist/pagespeed/errors.js +15 -0
  168. package/dist/pagespeed/errors.js.map +1 -0
  169. package/dist/pagespeed/parsers.d.ts +7 -0
  170. package/dist/pagespeed/parsers.d.ts.map +1 -0
  171. package/dist/pagespeed/parsers.js +236 -0
  172. package/dist/pagespeed/parsers.js.map +1 -0
  173. package/dist/pagespeed/types.d.ts +156 -0
  174. package/dist/pagespeed/types.d.ts.map +1 -0
  175. package/dist/pagespeed/types.js +2 -0
  176. package/dist/pagespeed/types.js.map +1 -0
  177. package/dist/pagespeed/wire.d.ts +10 -0
  178. package/dist/pagespeed/wire.d.ts.map +1 -0
  179. package/dist/pagespeed/wire.js +96 -0
  180. package/dist/pagespeed/wire.js.map +1 -0
  181. package/dist/pagespeed.d.ts +6 -0
  182. package/dist/pagespeed.d.ts.map +1 -0
  183. package/dist/pagespeed.js +4 -0
  184. package/dist/pagespeed.js.map +1 -0
  185. package/dist/parsers/geocode.d.ts.map +1 -1
  186. package/dist/parsers/geocode.js +30 -1
  187. package/dist/parsers/geocode.js.map +1 -1
  188. package/dist/parsers/reviews.d.ts +8 -1
  189. package/dist/parsers/reviews.d.ts.map +1 -1
  190. package/dist/parsers/reviews.js +46 -9
  191. package/dist/parsers/reviews.js.map +1 -1
  192. package/dist/platform/catalog.d.ts +18 -0
  193. package/dist/platform/catalog.d.ts.map +1 -0
  194. package/dist/platform/catalog.js +320 -0
  195. package/dist/platform/catalog.js.map +1 -0
  196. package/dist/platform/parity.d.ts +12 -0
  197. package/dist/platform/parity.d.ts.map +1 -0
  198. package/dist/platform/parity.js +25 -0
  199. package/dist/platform/parity.js.map +1 -0
  200. package/dist/services/elevation.d.ts +6 -4
  201. package/dist/services/elevation.d.ts.map +1 -1
  202. package/dist/services/elevation.js +39 -4
  203. package/dist/services/elevation.js.map +1 -1
  204. package/dist/services/environment/air-quality.d.ts +39 -0
  205. package/dist/services/environment/air-quality.d.ts.map +1 -0
  206. package/dist/services/environment/air-quality.js +82 -0
  207. package/dist/services/environment/air-quality.js.map +1 -0
  208. package/dist/services/environment/weather.d.ts +42 -0
  209. package/dist/services/environment/weather.d.ts.map +1 -0
  210. package/dist/services/environment/weather.js +63 -0
  211. package/dist/services/environment/weather.js.map +1 -0
  212. package/dist/services/geocode.d.ts +5 -1
  213. package/dist/services/geocode.d.ts.map +1 -1
  214. package/dist/services/geocode.js +13 -0
  215. package/dist/services/geocode.js.map +1 -1
  216. package/dist/services/keyed.d.ts +80 -0
  217. package/dist/services/keyed.d.ts.map +1 -0
  218. package/dist/services/keyed.js +152 -0
  219. package/dist/services/keyed.js.map +1 -0
  220. package/dist/services/knowledge.d.ts +6 -2
  221. package/dist/services/knowledge.d.ts.map +1 -1
  222. package/dist/services/knowledge.js +30 -5
  223. package/dist/services/knowledge.js.map +1 -1
  224. package/dist/services/mobility.d.ts.map +1 -1
  225. package/dist/services/mobility.js +13 -2
  226. package/dist/services/mobility.js.map +1 -1
  227. package/dist/services/nearby-search.d.ts +32 -0
  228. package/dist/services/nearby-search.d.ts.map +1 -0
  229. package/dist/services/nearby-search.js +85 -0
  230. package/dist/services/nearby-search.js.map +1 -0
  231. package/dist/services/panorama.d.ts +8 -1
  232. package/dist/services/panorama.d.ts.map +1 -1
  233. package/dist/services/panorama.js +48 -0
  234. package/dist/services/panorama.js.map +1 -1
  235. package/dist/services/photos.d.ts.map +1 -1
  236. package/dist/services/photos.js +9 -2
  237. package/dist/services/photos.js.map +1 -1
  238. package/dist/services/places.d.ts.map +1 -1
  239. package/dist/services/places.js +1 -0
  240. package/dist/services/places.js.map +1 -1
  241. package/dist/services/reviews.d.ts.map +1 -1
  242. package/dist/services/reviews.js +4 -1
  243. package/dist/services/reviews.js.map +1 -1
  244. package/dist/services/search.d.ts +8 -3
  245. package/dist/services/search.d.ts.map +1 -1
  246. package/dist/services/search.js +28 -9
  247. package/dist/services/search.js.map +1 -1
  248. package/dist/translate.d.ts +75 -0
  249. package/dist/translate.d.ts.map +1 -0
  250. package/dist/translate.js +126 -0
  251. package/dist/translate.js.map +1 -0
  252. package/dist/travel-google/common.d.ts +24 -0
  253. package/dist/travel-google/common.d.ts.map +1 -0
  254. package/dist/travel-google/common.js +72 -0
  255. package/dist/travel-google/common.js.map +1 -0
  256. package/dist/trends/client.d.ts +17 -0
  257. package/dist/trends/client.d.ts.map +1 -0
  258. package/dist/trends/client.js +86 -0
  259. package/dist/trends/client.js.map +1 -0
  260. package/dist/trends/errors.d.ts +8 -0
  261. package/dist/trends/errors.d.ts.map +1 -0
  262. package/dist/trends/errors.js +13 -0
  263. package/dist/trends/errors.js.map +1 -0
  264. package/dist/trends/links.d.ts +8 -0
  265. package/dist/trends/links.d.ts.map +1 -0
  266. package/dist/trends/links.js +71 -0
  267. package/dist/trends/links.js.map +1 -0
  268. package/dist/trends/parsers.d.ts +5 -0
  269. package/dist/trends/parsers.d.ts.map +1 -0
  270. package/dist/trends/parsers.js +126 -0
  271. package/dist/trends/parsers.js.map +1 -0
  272. package/dist/trends/types.d.ts +71 -0
  273. package/dist/trends/types.d.ts.map +1 -0
  274. package/dist/trends/types.js +2 -0
  275. package/dist/trends/types.js.map +1 -0
  276. package/dist/trends.d.ts +9 -0
  277. package/dist/trends.d.ts.map +1 -0
  278. package/dist/trends.js +8 -0
  279. package/dist/trends.js.map +1 -0
  280. package/dist/types/common.d.ts +28 -2
  281. package/dist/types/common.d.ts.map +1 -1
  282. package/dist/types/common.js.map +1 -1
  283. package/dist/types/directions.d.ts +1 -1
  284. package/dist/types/directions.d.ts.map +1 -1
  285. package/dist/types/dx.d.ts +23 -10
  286. package/dist/types/dx.d.ts.map +1 -1
  287. package/dist/types/panorama.d.ts +19 -0
  288. package/dist/types/panorama.d.ts.map +1 -1
  289. package/dist/types/reviews.d.ts +3 -4
  290. package/dist/types/reviews.d.ts.map +1 -1
  291. package/dist/types/suggest.d.ts +4 -6
  292. package/dist/types/suggest.d.ts.map +1 -1
  293. package/dist/utils/google-web.d.ts +24 -0
  294. package/dist/utils/google-web.d.ts.map +1 -0
  295. package/dist/utils/google-web.js +150 -0
  296. package/dist/utils/google-web.js.map +1 -0
  297. package/dist/utils/place-ref.d.ts +14 -4
  298. package/dist/utils/place-ref.d.ts.map +1 -1
  299. package/dist/utils/place-ref.js +49 -1
  300. package/dist/utils/place-ref.js.map +1 -1
  301. package/dist/youtube/client.d.ts +19 -0
  302. package/dist/youtube/client.d.ts.map +1 -0
  303. package/dist/youtube/client.js +115 -0
  304. package/dist/youtube/client.js.map +1 -0
  305. package/dist/youtube/errors.d.ts +8 -0
  306. package/dist/youtube/errors.d.ts.map +1 -0
  307. package/dist/youtube/errors.js +13 -0
  308. package/dist/youtube/errors.js.map +1 -0
  309. package/dist/youtube/parsers.d.ts +9 -0
  310. package/dist/youtube/parsers.d.ts.map +1 -0
  311. package/dist/youtube/parsers.js +213 -0
  312. package/dist/youtube/parsers.js.map +1 -0
  313. package/dist/youtube/types.d.ts +90 -0
  314. package/dist/youtube/types.d.ts.map +1 -0
  315. package/dist/youtube/types.js +2 -0
  316. package/dist/youtube/types.js.map +1 -0
  317. package/dist/youtube.d.ts +9 -0
  318. package/dist/youtube.d.ts.map +1 -0
  319. package/dist/youtube.js +6 -0
  320. package/dist/youtube.js.map +1 -0
  321. package/docs/books.md +18 -0
  322. package/docs/environment-research.md +65 -0
  323. package/docs/finance-research.md +153 -0
  324. package/docs/finance.md +43 -0
  325. package/docs/gemini-web.md +36 -0
  326. package/docs/google-ai-books-research.md +53 -0
  327. package/docs/google-media-research.md +105 -0
  328. package/docs/google-search-research.md +36 -0
  329. package/docs/google-search.md +53 -0
  330. package/docs/google-services-research.md +135 -0
  331. package/docs/google-travel-research.md +86 -0
  332. package/docs/internal/reverse-engineering.md +85 -0
  333. package/docs/lens.md +54 -0
  334. package/docs/maps-revalidation.md +31 -0
  335. package/docs/news.md +35 -0
  336. package/docs/pagespeed-research.md +153 -0
  337. package/docs/pagespeed.md +135 -0
  338. package/docs/reviews-research.md +33 -0
  339. package/docs/translate.md +78 -0
  340. package/docs/trends-research.md +82 -0
  341. package/docs/trends.md +75 -0
  342. package/docs/youtube.md +72 -0
  343. package/package.json +77 -2
@@ -0,0 +1,150 @@
1
+ export class GoogleWebError extends Error {
2
+ kind;
3
+ status;
4
+ rpcCode;
5
+ retryAfterMs;
6
+ constructor(message, kind, status, rpcCode, retryAfterMs, options) {
7
+ super(message, options);
8
+ this.kind = kind;
9
+ this.status = status;
10
+ this.rpcCode = rpcCode;
11
+ this.retryAfterMs = retryAfterMs;
12
+ this.name = 'GoogleWebError';
13
+ }
14
+ }
15
+ export function positiveTimeout(value) {
16
+ if (!Number.isFinite(value) || value <= 0 || value > 2_147_483_647)
17
+ throw new RangeError('timeoutMs must be positive and no greater than 2147483647');
18
+ return value;
19
+ }
20
+ export async function googleWebText(fetcher, url, init, timeoutMs, parent) {
21
+ if (parent?.aborted)
22
+ throw parent.reason;
23
+ const controller = new AbortController();
24
+ const abort = () => controller.abort(parent?.reason);
25
+ parent?.addEventListener('abort', abort, { once: true });
26
+ const timer = setTimeout(() => controller.abort(new GoogleWebError('Google web request timed out', 'timeout')), positiveTimeout(timeoutMs));
27
+ timer.unref?.();
28
+ try {
29
+ const response = await fetcher(url.toString(), { ...init, signal: controller.signal });
30
+ const body = await response.text();
31
+ if (controller.signal.aborted)
32
+ throw controller.signal.reason;
33
+ const value = response.headers.get('Retry-After');
34
+ const retryAfterMs = value ? /^\d+(?:\.\d+)?$/.test(value) ? Number(value) * 1000 : Number.isFinite(Date.parse(value)) ? Math.max(0, Date.parse(value) - Date.now()) : undefined : undefined;
35
+ if (!response.ok)
36
+ throw new GoogleWebError(`Google web HTTP ${response.status}`, response.status === 429 || response.status === 403 ? 'blocked' : 'http', response.status, undefined, retryAfterMs);
37
+ if (response.url && (new URL(response.url).hostname === 'consent.google.com' || new URL(response.url).pathname.startsWith('/sorry/'))) {
38
+ throw new GoogleWebError('Google returned a consent or automated-query page', 'blocked', response.status);
39
+ }
40
+ if (/^\s*(?:<!doctype\s+html|<html\b)/i.test(body)) {
41
+ const visible = body.replace(/<script\b[^>]*>[\s\S]*?<\/script>/gi, '').replace(/<style\b[^>]*>[\s\S]*?<\/style>/gi, '');
42
+ if (/Our systems have detected unusual traffic|id=["']captcha-form["']|action=["'][^"']*consent\.google\.com/i.test(visible) || (!/WIZ_global_data\s*=/.test(body) && /\/httpservice\/retry\/enablejs/.test(visible))) {
43
+ throw new GoogleWebError('Google returned an automated-query, consent or JavaScript challenge', 'blocked', response.status);
44
+ }
45
+ }
46
+ return body;
47
+ }
48
+ catch (cause) {
49
+ if (controller.signal.aborted)
50
+ throw controller.signal.reason;
51
+ if (cause instanceof GoogleWebError)
52
+ throw cause;
53
+ throw new GoogleWebError('Google web network request failed', 'network', undefined, undefined, undefined, { cause });
54
+ }
55
+ finally {
56
+ clearTimeout(timer);
57
+ parent?.removeEventListener('abort', abort);
58
+ }
59
+ }
60
+ export function parseGoogleJson(text) {
61
+ try {
62
+ return JSON.parse(text);
63
+ }
64
+ catch (cause) {
65
+ throw new GoogleWebError('Invalid Google web JSON', 'parse', undefined, undefined, undefined, { cause });
66
+ }
67
+ }
68
+ export function googleJsonEnd(text, start) {
69
+ let depth = 0, quoted = false, escaped = false;
70
+ for (let i = start; i < text.length; i++) {
71
+ const char = text[i];
72
+ if (quoted) {
73
+ if (escaped)
74
+ escaped = false;
75
+ else if (char === '\\')
76
+ escaped = true;
77
+ else if (char === '"')
78
+ quoted = false;
79
+ }
80
+ else if (char === '"')
81
+ quoted = true;
82
+ else if (char === '[' || char === '{')
83
+ depth++;
84
+ else if ((char === ']' || char === '}') && --depth === 0)
85
+ return i + 1;
86
+ }
87
+ throw new GoogleWebError('Truncated Google web JSON', 'parse');
88
+ }
89
+ export function googleBootstrap(html) {
90
+ const assignment = /(?:window\.)?WIZ_global_data\s*=\s*/.exec(html);
91
+ if (!assignment)
92
+ throw new GoogleWebError('Google web bootstrap is missing WIZ_global_data', 'parse');
93
+ const start = assignment.index + assignment[0].length;
94
+ if (html[start] !== '{')
95
+ throw new GoogleWebError('Invalid Google web bootstrap', 'parse');
96
+ return parseGoogleJson(html.slice(start, googleJsonEnd(html, start)));
97
+ }
98
+ export function googleBatchBody(id, args, token) {
99
+ const body = new URLSearchParams({ 'f.req': JSON.stringify([[[id, JSON.stringify(args), null, 'generic']]]) });
100
+ if (token)
101
+ body.set('at', token);
102
+ return body.toString();
103
+ }
104
+ export function googleBatchResponse(body, id) {
105
+ const text = body.trim().replace(/^\)\]\}'/, '').trim();
106
+ const found = [];
107
+ let cursor = 0;
108
+ while (cursor < text.length) {
109
+ while (cursor < text.length && /\s/.test(text[cursor]))
110
+ cursor++;
111
+ if (cursor === text.length)
112
+ break;
113
+ const length = /^\d+\r?\n/.exec(text.slice(cursor));
114
+ if (length)
115
+ cursor += length[0].length;
116
+ if (text[cursor] !== '[')
117
+ throw new GoogleWebError('Invalid Google batch framing', 'parse');
118
+ const end = googleJsonEnd(text, cursor);
119
+ const frame = parseGoogleJson(text.slice(cursor, end));
120
+ if (!Array.isArray(frame))
121
+ throw new GoogleWebError('Invalid Google batch frame', 'parse');
122
+ for (const row of typeof frame[0] === 'string' ? [frame] : frame) {
123
+ if (Array.isArray(row) && row[1] === id && (row[0] === 'wrb.fr' || row[0] === 'er'))
124
+ found.push(row);
125
+ }
126
+ cursor = end;
127
+ }
128
+ if (found.length !== 1)
129
+ throw new GoogleWebError(`Expected one Google ${id} response; received ${found.length}`, 'parse');
130
+ const row = found[0];
131
+ if (row[0] === 'er' || row[2] == null) {
132
+ const error = row[0] === 'er' ? row[2] : row[5];
133
+ const code = typeof error === 'number' ? error : Array.isArray(error) && typeof error[0] === 'number' ? error[0] : undefined;
134
+ throw new GoogleWebError(`Google RPC ${id} failed${code == null ? '' : ` (${code})`}`, 'rpc', undefined, code);
135
+ }
136
+ return typeof row[2] === 'string' ? parseGoogleJson(row[2]) : row[2];
137
+ }
138
+ export function xmlText(value) {
139
+ return value.replace(/<!\[CDATA\[([\s\S]*?)\]\]>|&(#x[0-9a-fA-F]+|#\d+|amp|lt|gt|quot|apos);/g, (match, cdata, entity) => {
140
+ if (cdata !== undefined)
141
+ return cdata;
142
+ if (entity === undefined)
143
+ return match;
144
+ if (!entity.startsWith('#'))
145
+ return { amp: '&', lt: '<', gt: '>', quot: '"', apos: "'" }[entity];
146
+ const code = entity.startsWith('#x') ? Number.parseInt(entity.slice(2), 16) : Number.parseInt(entity.slice(1), 10);
147
+ return code > 0 && code <= 0x10ffff && !(code >= 0xd800 && code <= 0xdfff) ? String.fromCodePoint(code) : match;
148
+ });
149
+ }
150
+ //# sourceMappingURL=google-web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-web.js","sourceRoot":"","sources":["../../src/utils/google-web.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * PlaceRef + route endpoint normalization (shared by Intent API and services).
3
3
  */
4
- import type { Coordinates } from '../types/common.js';
4
+ import type { Coordinates, LocationRef } from '../types/common.js';
5
5
  import type { NormalizedPlaceRef, PlaceRef } from '../types/dx.js';
6
6
  /**
7
7
  * Normalize a PlaceRef for service calls.
@@ -16,12 +16,22 @@ type CoordLoose = {
16
16
  latitude?: number;
17
17
  longitude?: number;
18
18
  };
19
+ /**
20
+ * Parse `"12.98,77.64"` into coords. Place names return undefined.
21
+ */
22
+ export declare function parseLatLngString(value: string): Coordinates | undefined;
23
+ /**
24
+ * Resolve a bias center. Coords and `"lat,lng"` strings are sync;
25
+ * place names call `geocode` and use the first hit.
26
+ */
27
+ export declare function resolveBiasCenter(value: LocationRef | CoordLoose | null | undefined, geocode: (query: string) => Promise<Coordinates | null>): Promise<Coordinates>;
19
28
  /**
20
29
  * Resolve search bias center from Intent (`near`) or service (`location`) spelling.
30
+ * Sync — coords or `"lat,lng"` only. Place names need `resolveBiasCenter`.
21
31
  */
22
32
  export declare function resolveSearchCenter(options: {
23
- near?: Coordinates | CoordLoose;
24
- location?: Coordinates | CoordLoose;
33
+ near?: LocationRef | CoordLoose;
34
+ location?: LocationRef | CoordLoose;
25
35
  }): Coordinates;
26
36
  /**
27
37
  * Resolve directions endpoints from Intent (`from`/`to`) or service (`origin`/`destination`).
@@ -61,6 +71,6 @@ export declare function applyCoordAliases<T extends CoordFields>(obj: T): T;
61
71
  export declare function toCoordinates(value: CoordFields | {
62
72
  lat: number;
63
73
  lng: number;
64
- } | null | undefined): CoordinatesLike | undefined;
74
+ } | string | null | undefined): CoordinatesLike | undefined;
65
75
  export {};
66
76
  //# sourceMappingURL=place-ref.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"place-ref.d.ts","sourceRoot":"","sources":["../../src/utils/place-ref.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAcnE;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,QAAQ,GAAG,kBAAkB,CAiDnE;AAED,+EAA+E;AAC/E,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,UAAU,GAClD,MAAM,GAAG,WAAW,CAgCtB;AAED,KAAK,UAAU,GAAG;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAC3C,IAAI,CAAC,EAAE,WAAW,GAAG,UAAU,CAAC;IAChC,QAAQ,CAAC,EAAE,WAAW,GAAG,UAAU,CAAC;CACrC,GAAG,WAAW,CAQd;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE;IAClD,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACvC,EAAE,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACzC,WAAW,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;CAC/C,GAAG;IAAE,MAAM,EAAE,MAAM,GAAG,WAAW,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,WAAW,CAAA;CAAE,CAYtE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAIvD;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,WAAW,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAYlE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,WAAW,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,GACnE,eAAe,GAAG,SAAS,CAa7B"}
1
+ {"version":3,"file":"place-ref.d.ts","sourceRoot":"","sources":["../../src/utils/place-ref.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAgBnE;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,QAAQ,GAAG,kBAAkB,CAiDnE;AAED,+EAA+E;AAC/E,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,UAAU,GAClD,MAAM,GAAG,WAAW,CAgCtB;AAED,KAAK,UAAU,GAAG;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAMxE;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,WAAW,GAAG,UAAU,GAAG,IAAI,GAAG,SAAS,EAClD,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,GACtD,OAAO,CAAC,WAAW,CAAC,CAwBtB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAC3C,IAAI,CAAC,EAAE,WAAW,GAAG,UAAU,CAAC;IAChC,QAAQ,CAAC,EAAE,WAAW,GAAG,UAAU,CAAC;CACrC,GAAG,WAAW,CAgBd;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE;IAClD,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACvC,EAAE,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACzC,WAAW,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;CAC/C,GAAG;IAAE,MAAM,EAAE,MAAM,GAAG,WAAW,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,WAAW,CAAA;CAAE,CAYtE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAIvD;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,WAAW,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAYlE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,WAAW,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GAC5E,eAAe,GAAG,SAAS,CAc7B"}
@@ -5,6 +5,8 @@ import { GMapsError } from '../types/common.js';
5
5
  import { placeIdToFeatureId } from './ids.js';
6
6
  const HEX_ID_RE = /^0x[0-9a-f]+:0x[0-9a-f]+$/i;
7
7
  const PLACE_ID_RE = /^ChIJ[\w-]+$/;
8
+ /** Exact `lat,lng` text — not "Indiranagar, Bengaluru". */
9
+ const LAT_LNG_STRING_RE = /^-?\d+(?:\.\d+)?\s*,\s*-?\d+(?:\.\d+)?$/;
8
10
  function tryPlaceIdToHex(placeId) {
9
11
  try {
10
12
  return placeIdToFeatureId(placeId);
@@ -81,11 +83,55 @@ export function resolveRouteEndpoint(value) {
81
83
  return coords;
82
84
  throw new GMapsError('Invalid route endpoint — expected address string, { lat, lng }, or PlaceRef with coordinates');
83
85
  }
86
+ /**
87
+ * Parse `"12.98,77.64"` into coords. Place names return undefined.
88
+ */
89
+ export function parseLatLngString(value) {
90
+ const trimmed = value.trim();
91
+ if (!LAT_LNG_STRING_RE.test(trimmed))
92
+ return undefined;
93
+ const [lat, lng] = trimmed.split(',').map((s) => Number(s.trim()));
94
+ if (!Number.isFinite(lat) || !Number.isFinite(lng))
95
+ return undefined;
96
+ return { lat: lat, lng: lng };
97
+ }
98
+ /**
99
+ * Resolve a bias center. Coords and `"lat,lng"` strings are sync;
100
+ * place names call `geocode` and use the first hit.
101
+ */
102
+ export async function resolveBiasCenter(value, geocode) {
103
+ if (value == null || value === '') {
104
+ throw new GMapsError('Search requires a bias center — pass near: { lat, lng } or a place name');
105
+ }
106
+ if (typeof value === 'string') {
107
+ const parsed = parseLatLngString(value);
108
+ if (parsed)
109
+ return parsed;
110
+ const hit = await geocode(value.trim());
111
+ if (!hit) {
112
+ throw new GMapsError(`Could not geocode near "${value.trim()}" — pass lat,lng or a more specific place name`);
113
+ }
114
+ return hit;
115
+ }
116
+ const coords = toCoordinates(value);
117
+ if (!coords) {
118
+ throw new GMapsError('Search requires a bias center — pass near: { lat, lng } or a place name');
119
+ }
120
+ return coords;
121
+ }
84
122
  /**
85
123
  * Resolve search bias center from Intent (`near`) or service (`location`) spelling.
124
+ * Sync — coords or `"lat,lng"` only. Place names need `resolveBiasCenter`.
86
125
  */
87
126
  export function resolveSearchCenter(options) {
88
- const coords = toCoordinates(options.near) ?? toCoordinates(options.location);
127
+ const raw = options.near ?? options.location;
128
+ if (typeof raw === 'string') {
129
+ const parsed = parseLatLngString(raw);
130
+ if (parsed)
131
+ return parsed;
132
+ throw new GMapsError('Place names as near/location must be geocoded (resolveBiasCenter). Pass { lat, lng } into resolveSearchCenter.');
133
+ }
134
+ const coords = toCoordinates(raw);
89
135
  if (!coords) {
90
136
  throw new GMapsError('Search requires a bias center — pass near: { lat, lng } (Intent) or location: { lat, lng } (search service)');
91
137
  }
@@ -136,6 +182,8 @@ export function applyCoordAliases(obj) {
136
182
  * Accepts `lat`/`lng` or `latitude`/`longitude`.
137
183
  */
138
184
  export function toCoordinates(value) {
185
+ if (typeof value === 'string')
186
+ return parseLatLngString(value);
139
187
  if (!value || typeof value !== 'object')
140
188
  return undefined;
141
189
  const lat = 'lat' in value && typeof value.lat === 'number'
@@ -1 +1 @@
1
- {"version":3,"file":"place-ref.js","sourceRoot":"","sources":["../../src/utils/place-ref.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"place-ref.js","sourceRoot":"","sources":["../../src/utils/place-ref.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { YouTubeConfig, YouTubeOEmbed, YouTubeRequestOptions, YouTubeSearchCursor, YouTubeSearchPage, YouTubeVideo } from './types.js';
2
+ /** Reads anonymous watch metadata, search results, continuations, and oEmbed responses. */
3
+ export declare class YouTubeClient {
4
+ private readonly fetcher;
5
+ private readonly locale;
6
+ private readonly region;
7
+ private readonly timeoutMs;
8
+ constructor(config?: YouTubeConfig);
9
+ /** Returns metadata and explicit playability status; it never fetches audio or video streams. */
10
+ video(idOrUrl: string, options?: YouTubeRequestOptions): Promise<YouTubeVideo>;
11
+ search(query: string, options?: YouTubeRequestOptions): Promise<YouTubeSearchPage>;
12
+ /** Uses the opaque continuation and anonymous client context returned by search. */
13
+ continueSearch(cursor: YouTubeSearchCursor, options?: YouTubeRequestOptions): Promise<YouTubeSearchPage>;
14
+ oembed(idOrUrl: string, options?: YouTubeRequestOptions): Promise<YouTubeOEmbed>;
15
+ private webUrl;
16
+ private json;
17
+ private request;
18
+ }
19
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/youtube/client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE5I,2FAA2F;AAC3F,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,MAAM,GAAE,aAAkB;IAStC,iGAAiG;IAC3F,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,YAAY,CAAC;IAUlF,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAU5F,oFAAoF;IAC9E,cAAc,CAAC,MAAM,EAAE,mBAAmB,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAW5G,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,aAAa,CAAC;IAU1F,OAAO,CAAC,MAAM;IAOd,OAAO,CAAC,IAAI;YAKE,OAAO;CAwBtB"}
@@ -0,0 +1,115 @@
1
+ import { YouTubeError } from './errors.js';
2
+ import { extractYouTubeClient, extractYouTubeJson, parseSearch, parseVideo, parseYouTubeVideoId, youtubeObject } from './parsers.js';
3
+ /** Reads anonymous watch metadata, search results, continuations, and oEmbed responses. */
4
+ export class YouTubeClient {
5
+ fetcher;
6
+ locale;
7
+ region;
8
+ timeoutMs;
9
+ constructor(config = {}) {
10
+ this.fetcher = config.fetch ?? globalThis.fetch;
11
+ this.locale = config.locale ?? 'en';
12
+ this.region = config.region ?? 'US';
13
+ this.timeoutMs = config.timeoutMs ?? 30_000;
14
+ if (!Number.isFinite(this.timeoutMs) || this.timeoutMs <= 0 || this.timeoutMs > 2_147_483_647)
15
+ throw new RangeError('timeoutMs must be positive and no greater than 2147483647');
16
+ if (!/^[A-Za-z]{2}$/.test(this.region))
17
+ throw new TypeError('region must be a two-letter country code');
18
+ }
19
+ /** Returns metadata and explicit playability status; it never fetches audio or video streams. */
20
+ async video(idOrUrl, options = {}) {
21
+ const id = parseYouTubeVideoId(idOrUrl);
22
+ const url = this.webUrl('/watch');
23
+ url.searchParams.set('v', id);
24
+ const html = await this.request(url, options);
25
+ const raw = extractYouTubeJson(html, 'ytInitialPlayerResponse');
26
+ if (!raw)
27
+ throw new YouTubeError('YouTube did not provide a player response', 'parse');
28
+ return parseVideo(raw, id, extractYouTubeJson(html, 'ytInitialData'));
29
+ }
30
+ async search(query, options = {}) {
31
+ if (typeof query !== 'string' || query.trim().length === 0)
32
+ throw new TypeError('query must be a nonempty string');
33
+ const url = this.webUrl('/results');
34
+ url.searchParams.set('search_query', query);
35
+ const html = await this.request(url, options);
36
+ const raw = extractYouTubeJson(html, 'ytInitialData');
37
+ if (!raw)
38
+ throw new YouTubeError('YouTube did not provide search data', 'parse');
39
+ return parseSearch(raw, extractYouTubeClient(html));
40
+ }
41
+ /** Uses the opaque continuation and anonymous client context returned by search. */
42
+ async continueSearch(cursor, options = {}) {
43
+ if (!cursor || typeof cursor.token !== 'string' || cursor.token.length === 0 || !cursor.client || cursor.client.clientName !== 'WEB' || typeof cursor.client.clientVersion !== 'string' || !cursor.client.clientVersion)
44
+ throw new TypeError('A search continuation with its client context is required');
45
+ const client = { clientName: cursor.client.clientName, clientVersion: cursor.client.clientVersion, hl: cursor.client.hl, gl: cursor.client.gl, visitorData: cursor.client.visitorData };
46
+ const text = await this.request(new URL('https://www.youtube.com/youtubei/v1/search?prettyPrint=false'), options, {
47
+ method: 'POST',
48
+ headers: { 'Content-Type': 'application/json', 'X-Youtube-Client-Name': '1', 'X-Youtube-Client-Version': client.clientVersion },
49
+ body: JSON.stringify({ context: { client }, continuation: cursor.token }),
50
+ });
51
+ return parseSearch(this.json(text), client);
52
+ }
53
+ async oembed(idOrUrl, options = {}) {
54
+ const id = parseYouTubeVideoId(idOrUrl);
55
+ const url = new URL('https://www.youtube.com/oembed');
56
+ url.searchParams.set('url', `https://www.youtube.com/watch?v=${id}`);
57
+ url.searchParams.set('format', 'json');
58
+ const raw = this.json(await this.request(url, options));
59
+ if (!youtubeObject(raw) || ['title', 'author_name', 'author_url', 'type', 'version', 'provider_name', 'provider_url', 'thumbnail_url', 'html'].some(key => typeof raw[key] !== 'string') || ['height', 'width', 'thumbnail_height', 'thumbnail_width'].some(key => typeof raw[key] !== 'number' || !Number.isFinite(raw[key])))
60
+ throw new YouTubeError('Malformed YouTube oEmbed response', 'parse');
61
+ return raw;
62
+ }
63
+ webUrl(path) {
64
+ const url = new URL(path, 'https://www.youtube.com');
65
+ url.searchParams.set('hl', this.locale);
66
+ url.searchParams.set('gl', this.region.toUpperCase());
67
+ return url;
68
+ }
69
+ json(text) {
70
+ try {
71
+ return JSON.parse(text.replace(/^\)\]\}'\s*/, ''));
72
+ }
73
+ catch (cause) {
74
+ throw new YouTubeError('Malformed YouTube JSON response', 'parse', undefined, undefined, { cause });
75
+ }
76
+ }
77
+ async request(url, options, init = {}) {
78
+ if (options.signal?.aborted)
79
+ throw options.signal.reason ?? new DOMException('The operation was aborted', 'AbortError');
80
+ const controller = new AbortController();
81
+ const abort = () => controller.abort(options.signal?.reason ?? new DOMException('The operation was aborted', 'AbortError'));
82
+ options.signal?.addEventListener('abort', abort, { once: true });
83
+ const timer = setTimeout(() => controller.abort(new YouTubeError('YouTube request timed out', 'timeout')), this.timeoutMs);
84
+ timer.unref?.();
85
+ try {
86
+ const response = await this.fetcher(url.toString(), { ...init, signal: controller.signal });
87
+ const body = await response.text();
88
+ if (controller.signal.aborted)
89
+ throw controller.signal.reason;
90
+ const retry = response.headers.get('retry-after');
91
+ const retryAfterMs = retry && /^\d+(?:\.\d+)?$/.test(retry) ? Number(retry) * 1000 : retry && Number.isFinite(Date.parse(retry)) ? Math.max(0, Date.parse(retry) - Date.now()) : undefined;
92
+ if (response.status === 429)
93
+ throw new YouTubeError('YouTube rate limited this request', 'rate-limit', 429, retryAfterMs);
94
+ if (/\/sorry\/|consent\.youtube\.com|consent\.google\.com/.test(response.url) || /<(?:form|div)[^>]+(?:captcha|consent)|<title[^>]*>[^<]*(?:unusual traffic|consent)/i.test(body))
95
+ throw new YouTubeError('YouTube returned a consent or traffic challenge', 'blocked', response.status);
96
+ if (response.status === 401)
97
+ throw new YouTubeError('YouTube requires authentication', 'auth-required', 401);
98
+ if (!response.ok)
99
+ throw new YouTubeError(`YouTube returned HTTP ${response.status}`, 'http', response.status, retryAfterMs);
100
+ return body;
101
+ }
102
+ catch (cause) {
103
+ if (controller.signal.aborted)
104
+ throw controller.signal.reason;
105
+ if (cause instanceof YouTubeError)
106
+ throw cause;
107
+ throw new YouTubeError('YouTube request failed', 'network', undefined, undefined, { cause });
108
+ }
109
+ finally {
110
+ clearTimeout(timer);
111
+ options.signal?.removeEventListener('abort', abort);
112
+ }
113
+ }
114
+ }
115
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/youtube/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export type YouTubeErrorKind = 'http' | 'blocked' | 'auth-required' | 'rate-limit' | 'parse' | 'network' | 'timeout';
2
+ export declare class YouTubeError extends Error {
3
+ readonly kind: YouTubeErrorKind;
4
+ readonly status?: number | undefined;
5
+ readonly retryAfterMs?: number | undefined;
6
+ constructor(message: string, kind: YouTubeErrorKind, status?: number | undefined, retryAfterMs?: number | undefined, options?: ErrorOptions);
7
+ }
8
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/youtube/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,SAAS,GAAG,eAAe,GAAG,YAAY,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;AACrH,qBAAa,YAAa,SAAQ,KAAK;IACR,QAAQ,CAAC,IAAI,EAAE,gBAAgB;IAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM;IAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM;gBAA1G,OAAO,EAAE,MAAM,EAAW,IAAI,EAAE,gBAAgB,EAAW,MAAM,CAAC,EAAE,MAAM,YAAA,EAAW,YAAY,CAAC,EAAE,MAAM,YAAA,EAAE,OAAO,CAAC,EAAE,YAAY;CAI/I"}
@@ -0,0 +1,13 @@
1
+ export class YouTubeError extends Error {
2
+ kind;
3
+ status;
4
+ retryAfterMs;
5
+ constructor(message, kind, status, retryAfterMs, options) {
6
+ super(message, options);
7
+ this.kind = kind;
8
+ this.status = status;
9
+ this.retryAfterMs = retryAfterMs;
10
+ this.name = 'YouTubeError';
11
+ }
12
+ }
13
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/youtube/errors.ts"],"names":[],"mappings":"AACA,MAAM,OAAO,YAAa,SAAQ,KAAK;IACC;IAAiC;IAA0B;IAAjG,YAAY,OAAe,EAAW,IAAsB,EAAW,MAAe,EAAW,YAAqB,EAAE,OAAsB;QAC5I,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QADY,SAAI,GAAJ,IAAI,CAAkB;QAAW,WAAM,GAAN,MAAM,CAAS;QAAW,iBAAY,GAAZ,YAAY,CAAS;QAEpH,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ import type { YouTubeSearchCursor, YouTubeSearchPage, YouTubeVideo } from './types.js';
2
+ export declare function youtubeObject(value: unknown): value is Record<string, unknown>;
3
+ export declare function youtubeText(value: unknown): string | undefined;
4
+ export declare function extractYouTubeJson(html: string, variable: string): Record<string, unknown> | undefined;
5
+ export declare function parseVideo(raw: unknown, id: string, initialData?: Record<string, unknown>): YouTubeVideo;
6
+ export declare function parseSearch(raw: unknown, client: YouTubeSearchCursor['client']): YouTubeSearchPage;
7
+ export declare function extractYouTubeClient(html: string): YouTubeSearchCursor['client'];
8
+ export declare function parseYouTubeVideoId(value: string): string;
9
+ //# sourceMappingURL=parsers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsers.d.ts","sourceRoot":"","sources":["../../src/youtube/parsers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAuB,mBAAmB,EAAqB,iBAAiB,EAAoB,YAAY,EAAE,MAAM,YAAY,CAAC;AAEjJ,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE9E;AAUD,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAM9D;AAOD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAwBtG;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,CAqBxG;AA6CD,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,mBAAmB,CAAC,QAAQ,CAAC,GAAG,iBAAiB,CA+BlG;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAWhF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAUzD"}