@churchapps/content-providers 0.5.0 → 0.6.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.
package/dist/index.d.cts CHANGED
@@ -223,6 +223,8 @@ interface IProvider {
223
223
  url: string;
224
224
  challengeMethod: string;
225
225
  }>;
226
+ /** For environments without Web Crypto (e.g. React Native): caller computes the S256 challenge. */
227
+ buildAuthUrlFromChallenge?(codeChallenge: string, redirectUri: string, state: string): string;
226
228
  exchangeCodeForTokens?(code: string, codeVerifier: string, redirectUri: string): Promise<ContentProviderAuthData | null>;
227
229
  initiateDeviceFlow?(): Promise<DeviceAuthorizationResponse | null>;
228
230
  pollDeviceFlowToken?(deviceCode: string): Promise<DeviceFlowPollResult>;
@@ -235,10 +237,7 @@ interface IProvider {
235
237
  checkMediaLicense?(mediaId: string, auth?: ContentProviderAuthData | null): Promise<MediaLicenseResult | null>;
236
238
  }
237
239
 
238
- /**
239
- * Navigate to a specific item using a dot-notation path.
240
- * Path format: "0.2.1" means items[0].children[2].children[1]
241
- */
240
+ /** Navigate to a specific item using dot-notation path (e.g. "0.2.1" → items[0].children[2].children[1]). */
242
241
  declare function navigateToPath(instructions: Instructions, path: string): InstructionItem | null;
243
242
 
244
243
  declare class OAuthHelper {
@@ -248,6 +247,7 @@ declare class OAuthHelper {
248
247
  url: string;
249
248
  challengeMethod: string;
250
249
  }>;
250
+ buildAuthUrlFromChallenge(config: ContentProviderConfig, codeChallenge: string, redirectUri: string, state: string): string;
251
251
  exchangeCodeForTokens(config: ContentProviderConfig, _providerId: string, code: string, codeVerifier: string, redirectUri: string): Promise<ContentProviderAuthData | null>;
252
252
  }
253
253
 
@@ -269,12 +269,7 @@ declare class DeviceFlowHelper {
269
269
  calculatePollDelay(baseInterval?: number, slowDownCount?: number): number;
270
270
  }
271
271
 
272
- /**
273
- * Shared base for providers: identity metadata, an authenticated fetch wrapper, and a
274
- * config-driven supportsDeviceFlow. Auth-flow methods (initiateDeviceFlow, buildAuthUrl, ...)
275
- * deliberately do NOT live here: consumers feature-detect them with `"method" in provider`,
276
- * so they must exist only on the providers that actually support each flow.
277
- */
272
+ /** Base for providers; auth-flow methods are intentionally not here so consumers can feature-detect with `"method" in provider`. */
278
273
  declare abstract class BaseProvider implements IProvider {
279
274
  abstract readonly id: string;
280
275
  abstract readonly name: string;
@@ -289,17 +284,9 @@ declare abstract class BaseProvider implements IProvider {
289
284
  supportsDeviceFlow(): boolean;
290
285
  }
291
286
 
292
- /**
293
- * APlay Provider
294
- *
295
- * Path structure (variable depth based on module products):
296
- * /modules -> list modules
297
- * /modules/{moduleId} -> list products OR libraries (depends on module)
298
- * /modules/{moduleId}/products/{productId} -> list libraries (if module has multiple products)
299
- * /modules/{moduleId}/products/{productId}/{libraryId} -> media files
300
- * /modules/{moduleId}/libraries/{libraryId} -> media files (if module has 0-1 products)
301
- */
287
+ /** APlay Provider: media curriculum library with OAuth 2.0 auth. */
302
288
  declare class APlayProvider extends BaseProvider {
289
+ private readonly oauthHelper;
303
290
  readonly id = "aplay";
304
291
  readonly name = "APlay";
305
292
  readonly logos: ProviderLogos;
@@ -315,15 +302,16 @@ declare class APlayProvider extends BaseProvider {
315
302
  getPlaylist(path: string, auth?: ContentProviderAuthData | null, _resolution?: number): Promise<ContentFile[] | null>;
316
303
  getInstructions(path: string, auth?: ContentProviderAuthData | null): Promise<Instructions | null>;
317
304
  checkMediaLicense(mediaId: string, auth?: ContentProviderAuthData | null): Promise<MediaLicenseResult | null>;
305
+ generateCodeVerifier(): string;
306
+ buildAuthUrl(codeVerifier: string, redirectUri: string, state?: string): Promise<{
307
+ url: string;
308
+ challengeMethod: string;
309
+ }>;
310
+ buildAuthUrlFromChallenge(codeChallenge: string, redirectUri: string, state: string): string;
311
+ exchangeCodeForTokens(code: string, codeVerifier: string, redirectUri: string): Promise<ContentProviderAuthData | null>;
318
312
  }
319
313
 
320
- /**
321
- * SignPresenter Provider
322
- *
323
- * Path structure:
324
- * /playlists -> list playlists
325
- * /playlists/{playlistId} -> list messages (files)
326
- */
314
+ /** Browses SignPresenter playlists → messages (files). */
327
315
  declare class SignPresenterProvider extends BaseProvider {
328
316
  private readonly oauthHelper;
329
317
  private readonly deviceFlowHelper;
@@ -345,24 +333,16 @@ declare class SignPresenterProvider extends BaseProvider {
345
333
  url: string;
346
334
  challengeMethod: string;
347
335
  }>;
336
+ buildAuthUrlFromChallenge(codeChallenge: string, redirectUri: string, state: string): string;
348
337
  exchangeCodeForTokens(code: string, codeVerifier: string, redirectUri: string): Promise<ContentProviderAuthData | null>;
349
338
  initiateDeviceFlow(): Promise<DeviceAuthorizationResponse | null>;
350
339
  pollDeviceFlowToken(deviceCode: string): Promise<DeviceFlowPollResult>;
351
340
  }
352
341
 
353
342
  /**
354
- * LessonsChurch Provider
355
- *
356
- * Path structure:
357
- * /lessons -> programs
358
- * /lessons/{programId} -> studies
359
- * /lessons/{programId}/{studyId} -> lessons
360
- * /lessons/{programId}/{studyId}/{lessonId} -> venues
361
- * /lessons/{programId}/{studyId}/{lessonId}/{venueId} -> playlist files
362
- *
363
- * /addons -> categories
364
- * /addons/{category} -> individual add-ons
365
- * /addons/{category}/{addOnId} -> single add-on file
343
+ * Path: /lessons → programs, /lessons/{id} → studies, /lessons/{id}/{id} → lessons,
344
+ * /lessons/{id}/{id}/{id} → venues, /lessons/{id}/{id}/{id}/{id} → files;
345
+ * /addons → categories, /addons/{cat} → items, /addons/{cat}/{id} → file.
366
346
  */
367
347
  declare class LessonsChurchProvider extends BaseProvider {
368
348
  readonly id = "lessonschurch";
@@ -398,11 +378,13 @@ declare class B1ChurchProvider extends BaseProvider {
398
378
  readonly requiresAuth = true;
399
379
  readonly authTypes: AuthType[];
400
380
  readonly capabilities: ProviderCapabilities;
381
+ generateCodeVerifier(): string;
401
382
  buildAuthUrl(codeVerifier: string, redirectUri: string, state?: string): Promise<{
402
383
  url: string;
403
384
  challengeMethod: string;
404
385
  }>;
405
- exchangeCodeForTokensWithPKCE(code: string, redirectUri: string, codeVerifier: string): Promise<ContentProviderAuthData | null>;
386
+ buildAuthUrlFromChallenge(codeChallenge: string, redirectUri: string, state: string): string;
387
+ exchangeCodeForTokens(code: string, codeVerifier: string, redirectUri: string): Promise<ContentProviderAuthData | null>;
406
388
  exchangeCodeForTokensWithSecret(code: string, redirectUri: string, clientSecret: string): Promise<ContentProviderAuthData | null>;
407
389
  refreshTokenWithSecret(authData: ContentProviderAuthData, clientSecret: string): Promise<ContentProviderAuthData | null>;
408
390
  initiateDeviceFlow(): Promise<DeviceAuthorizationResponse | null>;
@@ -436,7 +418,6 @@ declare class DropboxProvider extends BaseProvider {
436
418
  private resolveFileLinks;
437
419
  private checkIsLeaf;
438
420
  browse(path?: string | null, auth?: ContentProviderAuthData | null): Promise<ContentItem[]>;
439
- /** Resolve a folder path to playable files (list + media filter + link resolution). */
440
421
  private resolveMediaFiles;
441
422
  getPlaylist(path: string, auth?: ContentProviderAuthData | null, _resolution?: number): Promise<ContentFile[] | null>;
442
423
  getInstructions(path: string, auth?: ContentProviderAuthData | null): Promise<Instructions | null>;
@@ -450,14 +431,7 @@ declare class DropboxProvider extends BaseProvider {
450
431
  exchangeCodeForTokens(code: string, codeVerifier: string, redirectUri: string): Promise<ContentProviderAuthData | null>;
451
432
  }
452
433
 
453
- /**
454
- * PlanningCenter Provider
455
- *
456
- * Path structure:
457
- * /serviceTypes -> list service types
458
- * /serviceTypes/{serviceTypeId} -> list plans
459
- * /serviceTypes/{serviceTypeId}/{planId} -> plan items (leaf)
460
- */
434
+ /** Browses Planning Center service types → plans → items. */
461
435
  declare class PlanningCenterProvider extends BaseProvider {
462
436
  readonly id = "planningcenter";
463
437
  readonly name = "Planning Center";
@@ -472,14 +446,7 @@ declare class PlanningCenterProvider extends BaseProvider {
472
446
  private getPlanItems;
473
447
  }
474
448
 
475
- /**
476
- * BibleProject Provider
477
- *
478
- * Path structure:
479
- * / -> list collections
480
- * /{collectionSlug} -> list videos in collection
481
- * /{collectionSlug}/{videoId} -> single video
482
- */
449
+ /** BibleProject Provider: Bible education video content. */
483
450
  declare class BibleProjectProvider extends BaseProvider {
484
451
  readonly id = "bibleproject";
485
452
  readonly name = "The Bible Project";
@@ -499,13 +466,8 @@ declare class BibleProjectProvider extends BaseProvider {
499
466
  }
500
467
 
501
468
  /**
502
- * HighVoltageKids Provider
503
- *
504
- * Path structure:
505
- * / -> list collections (Elementary, Preschool)
506
- * /{collectionSlug} -> list studies
507
- * /{collectionSlug}/{studyId} -> list lessons
508
- * /{collectionSlug}/{studyId}/{lessonId} -> lesson files (leaf)
469
+ * Path structure: / → collections, /{collection} → studies, /{collection}/{study} → lessons,
470
+ * /{collection}/{study}/{lesson} → files (leaf).
509
471
  */
510
472
  declare class HighVoltageKidsProvider extends BaseProvider {
511
473
  readonly id = "highvoltagekids";
@@ -522,15 +484,8 @@ declare class HighVoltageKidsProvider extends BaseProvider {
522
484
  }
523
485
 
524
486
  /**
525
- * Jesus Film Project Provider
526
- *
527
- * Uses the public Arclight API to browse video content from jesusfilm.org.
528
- *
529
- * Path structure:
530
- * / -> categories (Feature Films, Series, Collections)
531
- * /{category} -> list items in category
532
- * /{category}/{id} -> single video (feature film) or container children (series/collection)
533
- * /{category}/{...containerIds}/{id} -> nested containers or single video (supports arbitrary depth)
487
+ * Path: / → categories, /{category} → items, /{category}/{id} → video or children,
488
+ * /{category}/{...ids}/{id} → nested containers or video.
534
489
  */
535
490
  declare class JesusFilmProvider extends BaseProvider {
536
491
  readonly id = "jesusfilm";
@@ -556,17 +511,7 @@ declare class JesusFilmProvider extends BaseProvider {
556
511
  getInstructions(path: string, _auth?: ContentProviderAuthData | null): Promise<Instructions | null>;
557
512
  }
558
513
 
559
- /**
560
- * CBN Provider
561
- *
562
- * Faith-based kids' video curriculum. Auth uses OAuth 2.0 Device Flow.
563
- *
564
- * Path structure:
565
- * / -> single "Catalog" root folder
566
- * /catalog -> course folders (GET /catalog)
567
- * /catalog/{courseId} -> lesson folders (GET /catalog/{courseId})
568
- * /catalog/{courseId}/{lessonId} -> video files (GET /lesson-playlist/{lessonId})
569
- */
514
+ /** Faith-based kids' video curriculum with OAuth 2.0 Device Flow auth. */
570
515
  declare class CbnProvider extends BaseProvider {
571
516
  private readonly deviceFlowHelper;
572
517
  readonly id = "cbn";
@@ -585,26 +530,7 @@ declare class CbnProvider extends BaseProvider {
585
530
  pollDeviceFlowToken(deviceCode: string): Promise<DeviceFlowPollResult>;
586
531
  }
587
532
 
588
- /**
589
- * Life.Church Provider
590
- *
591
- * Browses the Life.Church kids curriculum from a static catalog generated by
592
- * scripts/scrape-lifechurch.ts (sourced from life.church/media/* + the
593
- * open.life.church weekly calendar).
594
- *
595
- * Path structure:
596
- * / -> "scheduled" folder + 4 series
597
- * /scheduled -> this Sunday's scheduled lessons (one per age group)
598
- * /scheduled/{scheduledId} -> single video file (leaf)
599
- * /{seriesId} -> units within the series
600
- * /{seriesId}/{unitId} -> lessons within the unit
601
- * /{seriesId}/{unitId}/{lessonId} -> single video file (leaf)
602
- *
603
- * Video delivery: ContentFile.url is a direct mp4 on Life.Church's CDN
604
- * (https://d.life.church/.../{slug}_720p.mp4). Public, no auth, supports
605
- * range requests — plays in any standard mp4 player including
606
- * react-native-video.
607
- */
533
+ /** Browses Life.Church's kids curriculum from a static catalog (series → units → lessons), plus a weekly scheduled lesson index. */
608
534
  declare class LifeChurchProvider extends BaseProvider {
609
535
  readonly id = "lifechurch";
610
536
  readonly name = "Life.Church";
@@ -638,11 +564,7 @@ declare function registerProvider(provider: IProvider): void;
638
564
  * Get provider configuration by ID (for backward compatibility).
639
565
  */
640
566
  declare function getProviderConfig(providerId: string): ContentProviderConfig | null;
641
- /**
642
- * Get list of available providers with their info including logos and auth types.
643
- * Includes both implemented providers and coming soon providers.
644
- * @param ids - Optional array of provider IDs to filter the results. If provided, only providers with matching IDs will be returned.
645
- */
567
+ /** Get available providers (implemented and coming soon), optionally filtered by IDs. */
646
568
  declare function getAvailableProviders(ids?: string[]): ProviderInfo[];
647
569
 
648
570
  /**
package/dist/index.d.ts CHANGED
@@ -223,6 +223,8 @@ interface IProvider {
223
223
  url: string;
224
224
  challengeMethod: string;
225
225
  }>;
226
+ /** For environments without Web Crypto (e.g. React Native): caller computes the S256 challenge. */
227
+ buildAuthUrlFromChallenge?(codeChallenge: string, redirectUri: string, state: string): string;
226
228
  exchangeCodeForTokens?(code: string, codeVerifier: string, redirectUri: string): Promise<ContentProviderAuthData | null>;
227
229
  initiateDeviceFlow?(): Promise<DeviceAuthorizationResponse | null>;
228
230
  pollDeviceFlowToken?(deviceCode: string): Promise<DeviceFlowPollResult>;
@@ -235,10 +237,7 @@ interface IProvider {
235
237
  checkMediaLicense?(mediaId: string, auth?: ContentProviderAuthData | null): Promise<MediaLicenseResult | null>;
236
238
  }
237
239
 
238
- /**
239
- * Navigate to a specific item using a dot-notation path.
240
- * Path format: "0.2.1" means items[0].children[2].children[1]
241
- */
240
+ /** Navigate to a specific item using dot-notation path (e.g. "0.2.1" → items[0].children[2].children[1]). */
242
241
  declare function navigateToPath(instructions: Instructions, path: string): InstructionItem | null;
243
242
 
244
243
  declare class OAuthHelper {
@@ -248,6 +247,7 @@ declare class OAuthHelper {
248
247
  url: string;
249
248
  challengeMethod: string;
250
249
  }>;
250
+ buildAuthUrlFromChallenge(config: ContentProviderConfig, codeChallenge: string, redirectUri: string, state: string): string;
251
251
  exchangeCodeForTokens(config: ContentProviderConfig, _providerId: string, code: string, codeVerifier: string, redirectUri: string): Promise<ContentProviderAuthData | null>;
252
252
  }
253
253
 
@@ -269,12 +269,7 @@ declare class DeviceFlowHelper {
269
269
  calculatePollDelay(baseInterval?: number, slowDownCount?: number): number;
270
270
  }
271
271
 
272
- /**
273
- * Shared base for providers: identity metadata, an authenticated fetch wrapper, and a
274
- * config-driven supportsDeviceFlow. Auth-flow methods (initiateDeviceFlow, buildAuthUrl, ...)
275
- * deliberately do NOT live here: consumers feature-detect them with `"method" in provider`,
276
- * so they must exist only on the providers that actually support each flow.
277
- */
272
+ /** Base for providers; auth-flow methods are intentionally not here so consumers can feature-detect with `"method" in provider`. */
278
273
  declare abstract class BaseProvider implements IProvider {
279
274
  abstract readonly id: string;
280
275
  abstract readonly name: string;
@@ -289,17 +284,9 @@ declare abstract class BaseProvider implements IProvider {
289
284
  supportsDeviceFlow(): boolean;
290
285
  }
291
286
 
292
- /**
293
- * APlay Provider
294
- *
295
- * Path structure (variable depth based on module products):
296
- * /modules -> list modules
297
- * /modules/{moduleId} -> list products OR libraries (depends on module)
298
- * /modules/{moduleId}/products/{productId} -> list libraries (if module has multiple products)
299
- * /modules/{moduleId}/products/{productId}/{libraryId} -> media files
300
- * /modules/{moduleId}/libraries/{libraryId} -> media files (if module has 0-1 products)
301
- */
287
+ /** APlay Provider: media curriculum library with OAuth 2.0 auth. */
302
288
  declare class APlayProvider extends BaseProvider {
289
+ private readonly oauthHelper;
303
290
  readonly id = "aplay";
304
291
  readonly name = "APlay";
305
292
  readonly logos: ProviderLogos;
@@ -315,15 +302,16 @@ declare class APlayProvider extends BaseProvider {
315
302
  getPlaylist(path: string, auth?: ContentProviderAuthData | null, _resolution?: number): Promise<ContentFile[] | null>;
316
303
  getInstructions(path: string, auth?: ContentProviderAuthData | null): Promise<Instructions | null>;
317
304
  checkMediaLicense(mediaId: string, auth?: ContentProviderAuthData | null): Promise<MediaLicenseResult | null>;
305
+ generateCodeVerifier(): string;
306
+ buildAuthUrl(codeVerifier: string, redirectUri: string, state?: string): Promise<{
307
+ url: string;
308
+ challengeMethod: string;
309
+ }>;
310
+ buildAuthUrlFromChallenge(codeChallenge: string, redirectUri: string, state: string): string;
311
+ exchangeCodeForTokens(code: string, codeVerifier: string, redirectUri: string): Promise<ContentProviderAuthData | null>;
318
312
  }
319
313
 
320
- /**
321
- * SignPresenter Provider
322
- *
323
- * Path structure:
324
- * /playlists -> list playlists
325
- * /playlists/{playlistId} -> list messages (files)
326
- */
314
+ /** Browses SignPresenter playlists → messages (files). */
327
315
  declare class SignPresenterProvider extends BaseProvider {
328
316
  private readonly oauthHelper;
329
317
  private readonly deviceFlowHelper;
@@ -345,24 +333,16 @@ declare class SignPresenterProvider extends BaseProvider {
345
333
  url: string;
346
334
  challengeMethod: string;
347
335
  }>;
336
+ buildAuthUrlFromChallenge(codeChallenge: string, redirectUri: string, state: string): string;
348
337
  exchangeCodeForTokens(code: string, codeVerifier: string, redirectUri: string): Promise<ContentProviderAuthData | null>;
349
338
  initiateDeviceFlow(): Promise<DeviceAuthorizationResponse | null>;
350
339
  pollDeviceFlowToken(deviceCode: string): Promise<DeviceFlowPollResult>;
351
340
  }
352
341
 
353
342
  /**
354
- * LessonsChurch Provider
355
- *
356
- * Path structure:
357
- * /lessons -> programs
358
- * /lessons/{programId} -> studies
359
- * /lessons/{programId}/{studyId} -> lessons
360
- * /lessons/{programId}/{studyId}/{lessonId} -> venues
361
- * /lessons/{programId}/{studyId}/{lessonId}/{venueId} -> playlist files
362
- *
363
- * /addons -> categories
364
- * /addons/{category} -> individual add-ons
365
- * /addons/{category}/{addOnId} -> single add-on file
343
+ * Path: /lessons → programs, /lessons/{id} → studies, /lessons/{id}/{id} → lessons,
344
+ * /lessons/{id}/{id}/{id} → venues, /lessons/{id}/{id}/{id}/{id} → files;
345
+ * /addons → categories, /addons/{cat} → items, /addons/{cat}/{id} → file.
366
346
  */
367
347
  declare class LessonsChurchProvider extends BaseProvider {
368
348
  readonly id = "lessonschurch";
@@ -398,11 +378,13 @@ declare class B1ChurchProvider extends BaseProvider {
398
378
  readonly requiresAuth = true;
399
379
  readonly authTypes: AuthType[];
400
380
  readonly capabilities: ProviderCapabilities;
381
+ generateCodeVerifier(): string;
401
382
  buildAuthUrl(codeVerifier: string, redirectUri: string, state?: string): Promise<{
402
383
  url: string;
403
384
  challengeMethod: string;
404
385
  }>;
405
- exchangeCodeForTokensWithPKCE(code: string, redirectUri: string, codeVerifier: string): Promise<ContentProviderAuthData | null>;
386
+ buildAuthUrlFromChallenge(codeChallenge: string, redirectUri: string, state: string): string;
387
+ exchangeCodeForTokens(code: string, codeVerifier: string, redirectUri: string): Promise<ContentProviderAuthData | null>;
406
388
  exchangeCodeForTokensWithSecret(code: string, redirectUri: string, clientSecret: string): Promise<ContentProviderAuthData | null>;
407
389
  refreshTokenWithSecret(authData: ContentProviderAuthData, clientSecret: string): Promise<ContentProviderAuthData | null>;
408
390
  initiateDeviceFlow(): Promise<DeviceAuthorizationResponse | null>;
@@ -436,7 +418,6 @@ declare class DropboxProvider extends BaseProvider {
436
418
  private resolveFileLinks;
437
419
  private checkIsLeaf;
438
420
  browse(path?: string | null, auth?: ContentProviderAuthData | null): Promise<ContentItem[]>;
439
- /** Resolve a folder path to playable files (list + media filter + link resolution). */
440
421
  private resolveMediaFiles;
441
422
  getPlaylist(path: string, auth?: ContentProviderAuthData | null, _resolution?: number): Promise<ContentFile[] | null>;
442
423
  getInstructions(path: string, auth?: ContentProviderAuthData | null): Promise<Instructions | null>;
@@ -450,14 +431,7 @@ declare class DropboxProvider extends BaseProvider {
450
431
  exchangeCodeForTokens(code: string, codeVerifier: string, redirectUri: string): Promise<ContentProviderAuthData | null>;
451
432
  }
452
433
 
453
- /**
454
- * PlanningCenter Provider
455
- *
456
- * Path structure:
457
- * /serviceTypes -> list service types
458
- * /serviceTypes/{serviceTypeId} -> list plans
459
- * /serviceTypes/{serviceTypeId}/{planId} -> plan items (leaf)
460
- */
434
+ /** Browses Planning Center service types → plans → items. */
461
435
  declare class PlanningCenterProvider extends BaseProvider {
462
436
  readonly id = "planningcenter";
463
437
  readonly name = "Planning Center";
@@ -472,14 +446,7 @@ declare class PlanningCenterProvider extends BaseProvider {
472
446
  private getPlanItems;
473
447
  }
474
448
 
475
- /**
476
- * BibleProject Provider
477
- *
478
- * Path structure:
479
- * / -> list collections
480
- * /{collectionSlug} -> list videos in collection
481
- * /{collectionSlug}/{videoId} -> single video
482
- */
449
+ /** BibleProject Provider: Bible education video content. */
483
450
  declare class BibleProjectProvider extends BaseProvider {
484
451
  readonly id = "bibleproject";
485
452
  readonly name = "The Bible Project";
@@ -499,13 +466,8 @@ declare class BibleProjectProvider extends BaseProvider {
499
466
  }
500
467
 
501
468
  /**
502
- * HighVoltageKids Provider
503
- *
504
- * Path structure:
505
- * / -> list collections (Elementary, Preschool)
506
- * /{collectionSlug} -> list studies
507
- * /{collectionSlug}/{studyId} -> list lessons
508
- * /{collectionSlug}/{studyId}/{lessonId} -> lesson files (leaf)
469
+ * Path structure: / → collections, /{collection} → studies, /{collection}/{study} → lessons,
470
+ * /{collection}/{study}/{lesson} → files (leaf).
509
471
  */
510
472
  declare class HighVoltageKidsProvider extends BaseProvider {
511
473
  readonly id = "highvoltagekids";
@@ -522,15 +484,8 @@ declare class HighVoltageKidsProvider extends BaseProvider {
522
484
  }
523
485
 
524
486
  /**
525
- * Jesus Film Project Provider
526
- *
527
- * Uses the public Arclight API to browse video content from jesusfilm.org.
528
- *
529
- * Path structure:
530
- * / -> categories (Feature Films, Series, Collections)
531
- * /{category} -> list items in category
532
- * /{category}/{id} -> single video (feature film) or container children (series/collection)
533
- * /{category}/{...containerIds}/{id} -> nested containers or single video (supports arbitrary depth)
487
+ * Path: / → categories, /{category} → items, /{category}/{id} → video or children,
488
+ * /{category}/{...ids}/{id} → nested containers or video.
534
489
  */
535
490
  declare class JesusFilmProvider extends BaseProvider {
536
491
  readonly id = "jesusfilm";
@@ -556,17 +511,7 @@ declare class JesusFilmProvider extends BaseProvider {
556
511
  getInstructions(path: string, _auth?: ContentProviderAuthData | null): Promise<Instructions | null>;
557
512
  }
558
513
 
559
- /**
560
- * CBN Provider
561
- *
562
- * Faith-based kids' video curriculum. Auth uses OAuth 2.0 Device Flow.
563
- *
564
- * Path structure:
565
- * / -> single "Catalog" root folder
566
- * /catalog -> course folders (GET /catalog)
567
- * /catalog/{courseId} -> lesson folders (GET /catalog/{courseId})
568
- * /catalog/{courseId}/{lessonId} -> video files (GET /lesson-playlist/{lessonId})
569
- */
514
+ /** Faith-based kids' video curriculum with OAuth 2.0 Device Flow auth. */
570
515
  declare class CbnProvider extends BaseProvider {
571
516
  private readonly deviceFlowHelper;
572
517
  readonly id = "cbn";
@@ -585,26 +530,7 @@ declare class CbnProvider extends BaseProvider {
585
530
  pollDeviceFlowToken(deviceCode: string): Promise<DeviceFlowPollResult>;
586
531
  }
587
532
 
588
- /**
589
- * Life.Church Provider
590
- *
591
- * Browses the Life.Church kids curriculum from a static catalog generated by
592
- * scripts/scrape-lifechurch.ts (sourced from life.church/media/* + the
593
- * open.life.church weekly calendar).
594
- *
595
- * Path structure:
596
- * / -> "scheduled" folder + 4 series
597
- * /scheduled -> this Sunday's scheduled lessons (one per age group)
598
- * /scheduled/{scheduledId} -> single video file (leaf)
599
- * /{seriesId} -> units within the series
600
- * /{seriesId}/{unitId} -> lessons within the unit
601
- * /{seriesId}/{unitId}/{lessonId} -> single video file (leaf)
602
- *
603
- * Video delivery: ContentFile.url is a direct mp4 on Life.Church's CDN
604
- * (https://d.life.church/.../{slug}_720p.mp4). Public, no auth, supports
605
- * range requests — plays in any standard mp4 player including
606
- * react-native-video.
607
- */
533
+ /** Browses Life.Church's kids curriculum from a static catalog (series → units → lessons), plus a weekly scheduled lesson index. */
608
534
  declare class LifeChurchProvider extends BaseProvider {
609
535
  readonly id = "lifechurch";
610
536
  readonly name = "Life.Church";
@@ -638,11 +564,7 @@ declare function registerProvider(provider: IProvider): void;
638
564
  * Get provider configuration by ID (for backward compatibility).
639
565
  */
640
566
  declare function getProviderConfig(providerId: string): ContentProviderConfig | null;
641
- /**
642
- * Get list of available providers with their info including logos and auth types.
643
- * Includes both implemented providers and coming soon providers.
644
- * @param ids - Optional array of provider IDs to filter the results. If provided, only providers with matching IDs will be returned.
645
- */
567
+ /** Get available providers (implemented and coming soon), optionally filtered by IDs. */
646
568
  declare function getAvailableProviders(ids?: string[]): ProviderInfo[];
647
569
 
648
570
  /**