@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/README.md +8 -2
- package/dist/index.cjs +49 -21
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +31 -109
- package/dist/index.d.ts +31 -109
- package/dist/index.js +49 -21
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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
|
-
*
|
|
355
|
-
*
|
|
356
|
-
*
|
|
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
|
-
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
355
|
-
*
|
|
356
|
-
*
|
|
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
|
-
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
/**
|