@phont-ai/subtitles-core 0.2.2 → 0.2.4
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/browser.d.mts +2 -0
- package/dist/browser.d.ts +2 -0
- package/dist/browser.js +1 -1
- package/dist/browser.mjs +1 -1
- package/dist/index.d.mts +305 -2
- package/dist/index.d.ts +305 -2
- package/dist/index.js +4 -3
- package/dist/index.mjs +4 -3
- package/dist/phont-subtitles.global.js +1 -1
- package/package.json +3 -2
package/dist/index.d.ts
CHANGED
|
@@ -381,8 +381,17 @@ declare class SubtitleManager {
|
|
|
381
381
|
normalizeSubtitles(data: any): any;
|
|
382
382
|
normalizeSoundbites(arr: any[]): any[];
|
|
383
383
|
getAudioSegmentDuration(sequenceNumber: number): Promise<number>;
|
|
384
|
+
/**
|
|
385
|
+
* Configure the live HLS master URL at runtime. Required for SDK consumers
|
|
386
|
+
* who don't set NEXT_PUBLIC_API_LIVE_URL at build time. When set, fetches
|
|
387
|
+
* use sidecar mode against this URL.
|
|
388
|
+
*/
|
|
389
|
+
setLiveMasterUrl(url: string | null): void;
|
|
384
390
|
getInitialLiveSequenceNumber(): Promise<number>;
|
|
385
|
-
|
|
391
|
+
recordSegmentDuration(sequenceNumber: number, duration: number): void;
|
|
392
|
+
recordInitialSequenceOffset(sequenceNumber: number): void;
|
|
393
|
+
fetchSubtitles(sequenceNumber: number, fragStart: number): Promise<any | null>;
|
|
394
|
+
updateLiveTimeFromVideo(videoTime: number): void;
|
|
386
395
|
loadVodSubtitles(urlOrVodId: string, languageCode?: string | null): Promise<void>;
|
|
387
396
|
_processVodData(data: any, url: string, languageCode: string | null, originalSubtitles?: any[]): void;
|
|
388
397
|
getSubtitleForTime(time: number): any;
|
|
@@ -414,6 +423,145 @@ declare class SubtitleManager {
|
|
|
414
423
|
}
|
|
415
424
|
declare const subtitleManager: SubtitleManager;
|
|
416
425
|
|
|
426
|
+
/**
|
|
427
|
+
* LiveSegmentSource — player-agnostic interface for the live subtitle
|
|
428
|
+
* pipeline.
|
|
429
|
+
*
|
|
430
|
+
* Each concrete adapter (hls.js / Shaka / Bitmovin) wraps a player
|
|
431
|
+
* instance and normalizes its segment-lifecycle events into the two
|
|
432
|
+
* callbacks below. The subtitle hook subscribes to a `LiveSegmentSource`
|
|
433
|
+
* and never imports a player SDK directly, so swapping players is a
|
|
434
|
+
* one-file change.
|
|
435
|
+
*
|
|
436
|
+
* Contract:
|
|
437
|
+
* - `onInitialPlaylist` MUST fire exactly once, with the fragments
|
|
438
|
+
* visible in the first playlist the player parses. Subscribers use
|
|
439
|
+
* it for backfill.
|
|
440
|
+
* - `onSegmentLoaded` fires once per audio-aligned segment as the
|
|
441
|
+
* player loads it. Adapters MUST dedupe by `sn` so subscribers see
|
|
442
|
+
* each segment at most once across the lifetime of the source.
|
|
443
|
+
* - Sequence numbers (`sn`) are the HLS media-sequence integer. For
|
|
444
|
+
* DASH or other manifest formats, the adapter is responsible for
|
|
445
|
+
* synthesizing an equivalent monotonically-increasing integer.
|
|
446
|
+
*/
|
|
447
|
+
interface SegmentInfo {
|
|
448
|
+
/** HLS media sequence number. */
|
|
449
|
+
sn: number;
|
|
450
|
+
/** Segment duration in seconds. */
|
|
451
|
+
duration: number;
|
|
452
|
+
/**
|
|
453
|
+
* Presentation-timeline start of this fragment, in the same space as
|
|
454
|
+
* `video.currentTime`. Used to anchor subtitle cues directly to media
|
|
455
|
+
* time.
|
|
456
|
+
*/
|
|
457
|
+
start?: number;
|
|
458
|
+
/** Resolved segment URL (debugging only). */
|
|
459
|
+
uri?: string;
|
|
460
|
+
/** `'main'` | `'audio'` | `'subtitle'`. */
|
|
461
|
+
type?: string;
|
|
462
|
+
}
|
|
463
|
+
interface InitialPlaylist {
|
|
464
|
+
/** Media-sequence of the first fragment. */
|
|
465
|
+
startSn: number;
|
|
466
|
+
/** All fragments in the initial window. */
|
|
467
|
+
fragments: SegmentInfo[];
|
|
468
|
+
/** URI of the playlist these came from. */
|
|
469
|
+
playlistUri?: string;
|
|
470
|
+
}
|
|
471
|
+
type SegmentListener = (info: SegmentInfo) => void;
|
|
472
|
+
type InitialPlaylistListener = (info: InitialPlaylist) => void;
|
|
473
|
+
interface LiveSegmentSource {
|
|
474
|
+
/**
|
|
475
|
+
* Subscribe to per-segment-loaded events. Returns a teardown function
|
|
476
|
+
* that unregisters the listener.
|
|
477
|
+
*/
|
|
478
|
+
onSegmentLoaded(cb: SegmentListener): () => void;
|
|
479
|
+
/**
|
|
480
|
+
* Subscribe to the once-per-stream initial-playlist event. Returns a
|
|
481
|
+
* teardown function that unregisters the listener.
|
|
482
|
+
*/
|
|
483
|
+
onInitialPlaylist(cb: InitialPlaylistListener): () => void;
|
|
484
|
+
/**
|
|
485
|
+
* Tear down the adapter — unhook all player events, clear listener
|
|
486
|
+
* sets. Safe to call multiple times.
|
|
487
|
+
*/
|
|
488
|
+
destroy(): void;
|
|
489
|
+
}
|
|
490
|
+
/**
|
|
491
|
+
* Build a `LiveSegmentSource` with shared listener bookkeeping. Concrete
|
|
492
|
+
* adapters call `emitSegment` / `emitInitial` when their underlying
|
|
493
|
+
* player fires the corresponding event, and register cleanup hooks via
|
|
494
|
+
* `addTeardown`.
|
|
495
|
+
*/
|
|
496
|
+
declare function createLiveSegmentSource(): {
|
|
497
|
+
source: LiveSegmentSource;
|
|
498
|
+
emitSegment: (info: SegmentInfo) => void;
|
|
499
|
+
emitInitial: (info: InitialPlaylist) => void;
|
|
500
|
+
addTeardown: (fn: () => void) => void;
|
|
501
|
+
};
|
|
502
|
+
|
|
503
|
+
/**
|
|
504
|
+
* Wrap an hls.js instance into a LiveSegmentSource.
|
|
505
|
+
*
|
|
506
|
+
* Most AMS HLS output is muxed (combined A+V under one playlist,
|
|
507
|
+
* `frag.type === 'main'`) but split-audio renditions also exist
|
|
508
|
+
* (`frag.type === 'audio'`). We accept both and dedupe by `sn`, so
|
|
509
|
+
* whichever fires first per sequence wins.
|
|
510
|
+
*
|
|
511
|
+
* Initial playlist comes from `LEVEL_LOADED` (muxed) or
|
|
512
|
+
* `AUDIO_TRACK_LOADED` (split). First one with fragments wins.
|
|
513
|
+
*
|
|
514
|
+
* @param hls The hls.js instance (from `new Hls()`).
|
|
515
|
+
* @param Hls The hls.js namespace (for `Hls.Events`). hls.js doesn't
|
|
516
|
+
* re-export `Events` off instances; callers pass the
|
|
517
|
+
* imported module's default.
|
|
518
|
+
*/
|
|
519
|
+
declare function createHlsLiveSegmentSource(hls: any, Hls: any): LiveSegmentSource;
|
|
520
|
+
|
|
521
|
+
/**
|
|
522
|
+
* Wrap a shaka.Player instance into a LiveSegmentSource.
|
|
523
|
+
*
|
|
524
|
+
* NOT YET IMPLEMENTED — placeholder so the adapter layout is in place.
|
|
525
|
+
*
|
|
526
|
+
* Implementation outline:
|
|
527
|
+
* - Segment-loaded:
|
|
528
|
+
* Use `player.getNetworkingEngine().registerResponseFilter((type, response) => …)`
|
|
529
|
+
* and filter `type === shaka.net.NetworkingEngine.RequestType.SEGMENT`.
|
|
530
|
+
* Shaka does not surface an HLS media-sequence number directly;
|
|
531
|
+
* parse it out of `response.uri` (the AMS segment filenames carry
|
|
532
|
+
* the sn), or compute it as
|
|
533
|
+
* `Math.round(response.timeMs * 1000 / segmentDurationMs)`.
|
|
534
|
+
* - Initial playlist:
|
|
535
|
+
* Listen for the `manifestparsed` event on the player. Walk
|
|
536
|
+
* `player.getVariantTracks()` / the parsed manifest to gather the
|
|
537
|
+
* initial fragments. Shaka's HLS parser keeps the sn in the
|
|
538
|
+
* segment references; you may need to dip into private API or
|
|
539
|
+
* parse the playlist text yourself.
|
|
540
|
+
* - Don't forget to remove the response filter in `destroy`.
|
|
541
|
+
*/
|
|
542
|
+
declare function createShakaLiveSegmentSource(_player: any, _shaka: any): LiveSegmentSource;
|
|
543
|
+
|
|
544
|
+
/**
|
|
545
|
+
* Wrap a Bitmovin Player instance into a LiveSegmentSource.
|
|
546
|
+
*
|
|
547
|
+
* NOT YET IMPLEMENTED — placeholder so the adapter layout is in place.
|
|
548
|
+
*
|
|
549
|
+
* Implementation outline:
|
|
550
|
+
* - Segment-loaded:
|
|
551
|
+
* Subscribe to `PlayerEvent.SegmentRequestFinished`. The event
|
|
552
|
+
* payload includes `mediaType` (audio/video) and a `url`. Parse
|
|
553
|
+
* the HLS sn out of the segment URL (AMS encodes it in the
|
|
554
|
+
* filename), or maintain a counter keyed off the playlist start
|
|
555
|
+
* sn.
|
|
556
|
+
* - Initial playlist:
|
|
557
|
+
* Subscribe to `PlayerEvent.SourceLoaded` and read the parsed
|
|
558
|
+
* manifest via the player's manifest API. Walk audio (or muxed)
|
|
559
|
+
* segments to build the initial-window list.
|
|
560
|
+
* - `destroy` MUST `player.off(...)` everything to avoid leaks across
|
|
561
|
+
* hot reloads.
|
|
562
|
+
*/
|
|
563
|
+
declare function createBitmovinLiveSegmentSource(_player: any): LiveSegmentSource;
|
|
564
|
+
|
|
417
565
|
/**
|
|
418
566
|
* URL Decoder for Animation Parameters
|
|
419
567
|
*
|
|
@@ -484,6 +632,8 @@ interface AnimationParameterState {
|
|
|
484
632
|
textColor: string;
|
|
485
633
|
opacity: number;
|
|
486
634
|
textShadow: string;
|
|
635
|
+
shadowX?: number;
|
|
636
|
+
shadowY?: number;
|
|
487
637
|
blur: number;
|
|
488
638
|
outlineWidth: number;
|
|
489
639
|
outlineColor: string;
|
|
@@ -739,6 +889,15 @@ declare const ANIMATION_STYLING: {
|
|
|
739
889
|
minDisplayTime: number;
|
|
740
890
|
allowOverlap: boolean;
|
|
741
891
|
};
|
|
892
|
+
subtitleBackground: {
|
|
893
|
+
background: string;
|
|
894
|
+
border: string;
|
|
895
|
+
borderRadius: number;
|
|
896
|
+
boxShadow: string;
|
|
897
|
+
backdropFilter: string;
|
|
898
|
+
paddingX: number;
|
|
899
|
+
paddingY: number;
|
|
900
|
+
};
|
|
742
901
|
};
|
|
743
902
|
|
|
744
903
|
/**
|
|
@@ -889,6 +1048,107 @@ declare function generateTextShadow(shadowColor: string | undefined, _fontFamily
|
|
|
889
1048
|
* @returns CSS em value for marginRight
|
|
890
1049
|
*/
|
|
891
1050
|
declare function calculateDynamicWordSpacing(currentScale?: number, fontFamily?: string, gtsIntensity?: number, emotion?: string): string;
|
|
1051
|
+
/**
|
|
1052
|
+
* Tighter spacing for a single animated word in an otherwise normal line.
|
|
1053
|
+
* Full calculateDynamicWordSpacing assumes the whole line scales together;
|
|
1054
|
+
* per-word pops (e.g. spain-goal on one word) only need room for local overflow.
|
|
1055
|
+
*/
|
|
1056
|
+
declare function calculatePerWordSpacing(currentScale?: number, fontFamily?: string, gtsIntensity?: number, emotion?: string): string;
|
|
1057
|
+
|
|
1058
|
+
/**
|
|
1059
|
+
* Resolve which animation URL / emotion / intensity apply to a single word.
|
|
1060
|
+
* Word-level fields override segment defaults when present.
|
|
1061
|
+
*/
|
|
1062
|
+
interface WordAnimationFields {
|
|
1063
|
+
animation_url?: string | null;
|
|
1064
|
+
emotion?: string | null;
|
|
1065
|
+
emotion_intensity?: number | null;
|
|
1066
|
+
}
|
|
1067
|
+
interface WordAnimationSource {
|
|
1068
|
+
animationUrl: string | null;
|
|
1069
|
+
emotion: string | null;
|
|
1070
|
+
emotionIntensity: number | null;
|
|
1071
|
+
hasWordOverride: boolean;
|
|
1072
|
+
}
|
|
1073
|
+
declare function hasWordAnimationOverride(word: WordAnimationFields | null | undefined): boolean;
|
|
1074
|
+
declare function resolveWordAnimationSource(word: WordAnimationFields | null | undefined, segment: WordAnimationFields | null | undefined): WordAnimationSource;
|
|
1075
|
+
|
|
1076
|
+
/**
|
|
1077
|
+
* Helpers for author-assigned vs auto-detected subtitle animations.
|
|
1078
|
+
*/
|
|
1079
|
+
|
|
1080
|
+
declare const NORMAL_ANIMATION_EMOTIONS: Set<string>;
|
|
1081
|
+
declare function isNormalAnimationEmotion(emotion: string | null | undefined): boolean;
|
|
1082
|
+
/**
|
|
1083
|
+
* Segment has an explicit author animation assignment (metadata panel save).
|
|
1084
|
+
* Backend-only emotion labels without author fields do not count.
|
|
1085
|
+
*/
|
|
1086
|
+
declare function hasSegmentAnimationOverride(segment: WordAnimationFields | null | undefined): boolean;
|
|
1087
|
+
declare function clearWordAnimationFields<T extends WordAnimationFields>(word: T): T;
|
|
1088
|
+
declare function clearSegmentAnimationFields<T extends WordAnimationFields>(segment: T): T;
|
|
1089
|
+
declare function resetSubtitleToNormal<T extends WordAnimationFields & {
|
|
1090
|
+
words?: WordAnimationFields[];
|
|
1091
|
+
}>(subtitle: T): T;
|
|
1092
|
+
declare function subtitleHasAnyAnimationOverride(subtitle: WordAnimationFields & {
|
|
1093
|
+
words?: WordAnimationFields[];
|
|
1094
|
+
} | null | undefined): boolean;
|
|
1095
|
+
declare function getManualAnimationsStorageKey(videoId: string | null | undefined): string | null;
|
|
1096
|
+
declare function readManualAnimationsPreference(videoId: string | null | undefined): boolean;
|
|
1097
|
+
declare function writeManualAnimationsPreference(videoId: string | null | undefined, enabled: boolean): void;
|
|
1098
|
+
/**
|
|
1099
|
+
* "Manual soundbites only" mode: when enabled, auto-detected soundbites are
|
|
1100
|
+
* suppressed (no text, no animation) and only soundbites the author added by
|
|
1101
|
+
* hand (tagged `manual: true`) are shown. Mirrors the manual-animations pref.
|
|
1102
|
+
*/
|
|
1103
|
+
declare function getManualSoundbitesStorageKey(videoId: string | null | undefined): string | null;
|
|
1104
|
+
declare function readManualSoundbitesPreference(videoId: string | null | undefined): boolean;
|
|
1105
|
+
declare function writeManualSoundbitesPreference(videoId: string | null | undefined, enabled: boolean): void;
|
|
1106
|
+
/** Clamp and round intensity to 0–1 (3 decimal places). */
|
|
1107
|
+
declare function clampAnimationIntensity(value: number): number;
|
|
1108
|
+
/**
|
|
1109
|
+
* Multiply author-set emotion_intensity on segments and words by `factor`.
|
|
1110
|
+
* Only touches overrides that already have an explicit intensity (GTS-independent).
|
|
1111
|
+
*/
|
|
1112
|
+
declare function scaleAuthorAnimationIntensities<T extends WordAnimationFields & {
|
|
1113
|
+
words?: WordAnimationFields[];
|
|
1114
|
+
}>(subtitles: T[], factor: number): {
|
|
1115
|
+
segmentCount: number;
|
|
1116
|
+
wordCount: number;
|
|
1117
|
+
};
|
|
1118
|
+
|
|
1119
|
+
/**
|
|
1120
|
+
* Word-level expressive animation scheduling.
|
|
1121
|
+
*
|
|
1122
|
+
* When `ANIMATION_STYLING.wordAnimation.allowOverlap` is false, each word's
|
|
1123
|
+
* URL curve runs only after the previous word finishes — then returns to rest
|
|
1124
|
+
* (t = 0) before the next word begins.
|
|
1125
|
+
*/
|
|
1126
|
+
interface WordTimingWindow {
|
|
1127
|
+
start: number;
|
|
1128
|
+
end: number;
|
|
1129
|
+
}
|
|
1130
|
+
interface SequentialWordExpressiveSlot {
|
|
1131
|
+
expressiveStart: number;
|
|
1132
|
+
expressiveDuration: number;
|
|
1133
|
+
}
|
|
1134
|
+
declare function getWordExpressiveDuration(word: WordTimingWindow): number;
|
|
1135
|
+
type WordExpressiveSchedule = Array<SequentialWordExpressiveSlot | null>;
|
|
1136
|
+
declare function buildSequentialExpressiveSchedule(words: WordTimingWindow[], shouldAnimate?: (word: WordTimingWindow, index: number) => boolean): WordExpressiveSchedule;
|
|
1137
|
+
declare function isWordAnimationOverlapAllowed(): boolean;
|
|
1138
|
+
/**
|
|
1139
|
+
* Progress along the authored URL curve (0–1).
|
|
1140
|
+
* Overlap allowed: progress follows backend word.start and holds at 1 after the curve completes.
|
|
1141
|
+
* Sequential: each word waits for the previous slot, then returns to 0 after its curve completes.
|
|
1142
|
+
*/
|
|
1143
|
+
declare function calculateWordExpressiveProgress(currentTime: number, word: WordTimingWindow, slot: SequentialWordExpressiveSlot | null | undefined, allowOverlap?: boolean): number;
|
|
1144
|
+
declare function getSegmentAnimationPreviewTime(startTime: number | null | undefined, endTime: number | null | undefined): number;
|
|
1145
|
+
/**
|
|
1146
|
+
* Time (seconds) at the midpoint of a word's expressive URL curve — matches playback scheduling.
|
|
1147
|
+
*/
|
|
1148
|
+
declare function getWordAnimationPreviewTime(words: WordTimingWindow[], wordIndex: number, options?: {
|
|
1149
|
+
shouldAnimate?: (word: WordTimingWindow, index: number) => boolean;
|
|
1150
|
+
allowOverlap?: boolean;
|
|
1151
|
+
}): number | null;
|
|
892
1152
|
|
|
893
1153
|
/**
|
|
894
1154
|
* Prosody Weight — Natural Voice Intonation for Animations
|
|
@@ -1463,4 +1723,47 @@ declare class PhontClient {
|
|
|
1463
1723
|
clearCredentials(): void;
|
|
1464
1724
|
}
|
|
1465
1725
|
|
|
1466
|
-
|
|
1726
|
+
/**
|
|
1727
|
+
* Get auth token for the current active user
|
|
1728
|
+
* Used by API client
|
|
1729
|
+
* @returns {string | null}
|
|
1730
|
+
*/
|
|
1731
|
+
declare function getCurrentAuthToken(): string | null;
|
|
1732
|
+
/**
|
|
1733
|
+
* Get session ID for the current active user
|
|
1734
|
+
* Used by API client
|
|
1735
|
+
* @returns {string | null}
|
|
1736
|
+
*/
|
|
1737
|
+
declare function getCurrentSessionId(): string | null;
|
|
1738
|
+
|
|
1739
|
+
/**
|
|
1740
|
+
* Opt-in: one pretty console dump per VOD fetch (no per-frame spam).
|
|
1741
|
+
*
|
|
1742
|
+
* Enable: `?debug=subtitles` or `?stage_debug=subtitles` or
|
|
1743
|
+
* `localStorage.setItem('phont_debug_subtitles', '1')`
|
|
1744
|
+
*/
|
|
1745
|
+
type SubtitleDebugEntry = {
|
|
1746
|
+
at: string;
|
|
1747
|
+
vodId?: string | null;
|
|
1748
|
+
url?: string;
|
|
1749
|
+
raw: unknown;
|
|
1750
|
+
};
|
|
1751
|
+
type SubtitleDebugStore = {
|
|
1752
|
+
enabled: boolean;
|
|
1753
|
+
last: SubtitleDebugEntry | null;
|
|
1754
|
+
dumpLast: () => SubtitleDebugEntry | null;
|
|
1755
|
+
copyLast: () => Promise<string>;
|
|
1756
|
+
};
|
|
1757
|
+
declare global {
|
|
1758
|
+
interface Window {
|
|
1759
|
+
__phontSubtitleDebug?: SubtitleDebugStore;
|
|
1760
|
+
}
|
|
1761
|
+
}
|
|
1762
|
+
declare function isSubtitleDebugEnabled(): boolean;
|
|
1763
|
+
/** One styled log per vodId (+ optional url key); stores payload on window.__phontSubtitleDebug */
|
|
1764
|
+
declare function logSubtitleData(data: unknown, meta?: {
|
|
1765
|
+
vodId?: string | null;
|
|
1766
|
+
url?: string;
|
|
1767
|
+
}): void;
|
|
1768
|
+
|
|
1769
|
+
export { ANIMATION_STYLING, ANIMATION_URLS, AUTHORED_PLAYBACK_OPTIONS, type AnimationFetcher, type AnimationOptions, type AnimationParameterState, type AnimationParameterStates, type AnimationRecord, type AnimationState, type CurvePoint, EMOTION_ANIMATION_URLS, type Emotion, type EmotionSelectionResult, type EmotionStyle, type EmphasisEffect, type FontAxisConfig, type FontConfig, type InitialPlaylist, type InitialPlaylistListener, type JoyEffect, type Letter, type LiveSegmentSource, type LoginResponse, NORMAL_ANIMATION_EMOTIONS, type ParameterState, type ParameterStates, PhontClient, type PhontClientOptions, type PublishedAnimationResolver, REFERENCE_GTS, REFERENCE_INTENSITY, RENDERING_CONTROL, type RegisterResponse, type SegmentInfo, type SegmentListener, type SentenceAnimationState, type SequentialWordExpressiveSlot, type StateCallback, type StrongEmphasisData, type Stylesheet, type SubtitleDebugEntry, type SubtitleDebugStore, type SubtitleEngineState, type SubtitleLine, SubtitleManager, type SubtitleSegment, type SubtitleState$1 as SubtitleState, SubtitleStateManager, type SubtitleTrack, type SubtitleWord, type VodMetadata, type VodState$1 as VodState, type Word, type WordAnimationFields, type WordAnimationSource, type WordAnimationState, type WordExpressiveSchedule, type WordLetterSpacingParams, type WordTimingWindow, buildSequentialExpressiveSchedule, calculateAnimationParameters, calculateAnimationState, calculateDynamicWordSpacing, calculateEmphasisMultiplier, calculateGTSValues, calculateJoy, calculateJoyBulge, calculateNormalizedTime, calculatePerWordSpacing, calculateWeightFromVolume, calculateWidthFromSpeechRate, calculateWordEmphasisEffects, calculateWordExpressiveProgress, calculateWordLetterSpacing, capEmotionIntensity, clampAnimationIntensity, clearSegmentAnimationFields, clearWordAnimationFields, computeProsodyWeight, createBitmovinLiveSegmentSource, createHlsLiveSegmentSource, createLiveSegmentSource, createPublishedAnimationResolver, createShakaLiveSegmentSource, decodeAnimationUrl, ensureFont, findSubtitleForWord, generateTextShadow, getAnimationUrlForEmotion, getCombinedBlurAmount, getCurrentAuthToken, getCurrentSessionId, getFontFamilyCSS, getJoyAnimationMode, getJoyFilter, getJoyTransform, getManualAnimationsStorageKey, getManualSoundbitesStorageKey, getMergedSubtitles, getMotionBlurAmount, getSegmentAnimationPreviewTime, getSubtitleAnimations, getSubtitleText, getSubtitleTiming, getSubtitleWords, getWordAnimationPreviewTime, getWordEmphasis, getWordExpressiveDuration, hasMergedSubtitles, hasSegmentAnimationOverride, hasWordAnimationOverride, hockeyStickIntensity, isInEmphasisRange, isInStrongEmphasisRange, isNormalAnimationEmotion, isSubtitleDebugEnabled, isWordAnimationOverlapAllowed, logSubtitleData, meetsEmotionThreshold, preloadAnimationFonts, processEmotionsWithImportance, readManualAnimationsPreference, readManualSoundbitesPreference, resetSubtitleToNormal, resolveEffectiveGts, resolveWordAnimationSource, sampleParameterCurve, scaleAuthorAnimationIntensities, selectEmotion, selectFontFamily, shouldUseAngryFont, shouldUseJoyFont, shouldUseSadnessFont, splitTextIntoLetters, subtitleHasAnyAnimationOverride, subtitleManager, writeManualAnimationsPreference, writeManualSoundbitesPreference };
|