From 28774699cf6252b28a66f054572fd90eb7f2cc86 Mon Sep 17 00:00:00 2001 From: Adam Waldron Date: Tue, 4 Feb 2025 17:21:03 -0800 Subject: [PATCH] fix: make parser static member --- .../src/lib/pipelines/mse/hls-pipeline.ts | 16 ++++++ .../src/lib/pipelines/mse/mse-pipeline.ts | 51 ++++++++++++++++++- packages/playback/src/lib/service-locator.ts | 11 ++-- .../playback/test/lib/service-locator.test.ts | 11 ++-- 4 files changed, 78 insertions(+), 11 deletions(-) create mode 100644 packages/playback/src/lib/pipelines/mse/hls-pipeline.ts diff --git a/packages/playback/src/lib/pipelines/mse/hls-pipeline.ts b/packages/playback/src/lib/pipelines/mse/hls-pipeline.ts new file mode 100644 index 0000000..14192b4 --- /dev/null +++ b/packages/playback/src/lib/pipelines/mse/hls-pipeline.ts @@ -0,0 +1,16 @@ +import type { IPipelineDependencies } from '../../types/pipeline.declarations'; +import MsePipeline from './mse-pipeline'; +import { ChunkPlaylistParser, type FullPlaylistParser } from '@videojs/hls-parser'; + +export class HlsPipeline extends MsePipeline { + public static parser: ChunkPlaylistParser | FullPlaylistParser; + + public static create(dependencies: IPipelineDependencies): HlsPipeline { + dependencies.logger = dependencies.logger.createSubLogger('HlsPipeline'); + this.parser = ChunkPlaylistParser.create({ + debugCallback: dependencies.logger.debug, + warnCallback: dependencies.logger.warn, + }); + return new HlsPipeline(dependencies); + } +} diff --git a/packages/playback/src/lib/pipelines/mse/mse-pipeline.ts b/packages/playback/src/lib/pipelines/mse/mse-pipeline.ts index 3b462b2..0a42cdd 100644 --- a/packages/playback/src/lib/pipelines/mse/mse-pipeline.ts +++ b/packages/playback/src/lib/pipelines/mse/mse-pipeline.ts @@ -1,3 +1,52 @@ +import type { IQualityLevel } from 'src/lib/types/quality-level.declarations'; import { BasePipeline } from '../base-pipeline'; +import type { IPlayerAudioTrack } from 'src/lib/types/audio-track.declarations'; +import type { + IPlayerTextTrack, + IRemoteVttThumbnailTrackOptions, + IPlayerThumbnailTrack, +} from 'src/entry-points/api-reference'; +import type { PlaybackState } from 'src/lib/consts/playback-state'; -export default abstract class MsePipeline extends BasePipeline {} +/* eslint-disable */ +export default abstract class MsePipeline extends BasePipeline { + public dispose(): void { + throw new Error('Method not implemented.'); + } + public getAudioTracks(): Array { + throw new Error('Method not implemented.'); + } + public selectAudioTrack(id: string): boolean { + throw new Error('Method not implemented.'); + } + public getQualityLevels(): Array { + throw new Error('Method not implemented.'); + } + public selectQualityLevel(): boolean { + throw new Error('Method not implemented.'); + } + public selectAutoQualityLevel(): boolean { + throw new Error('Method not implemented.'); + } + public getTextTracks(): Array { + throw new Error('Method not implemented.'); + } + public removeRemoteThumbnailTrack(id: string): boolean { + throw new Error('Method not implemented.'); + } + public addRemoteVttThumbnailTrack(options: IRemoteVttThumbnailTrackOptions): boolean { + throw new Error('Method not implemented.'); + } + public selectThumbnailTrack(id: string): boolean { + throw new Error('Method not implemented.'); + } + public getThumbnailTracks(): Array { + throw new Error('Method not implemented.'); + } + public getPlaybackState(): PlaybackState { + throw new Error('Method not implemented.'); + } + public start(): void { + throw new Error('Method not implemented.'); + } +} diff --git a/packages/playback/src/lib/service-locator.ts b/packages/playback/src/lib/service-locator.ts index 262cb9b..a0c2389 100644 --- a/packages/playback/src/lib/service-locator.ts +++ b/packages/playback/src/lib/service-locator.ts @@ -18,7 +18,8 @@ import { EventEmitter } from './utils/event-emitter'; import { NetworkManager } from './network/network-manager'; import { PlayerEventType } from './consts/events'; import { PipelineLoaderFactoryStorage } from './utils/pipeline-loader-factory-storage'; -import { FullPlaylistParser } from '@videojs/hls-parser'; +import type { ChunkPlaylistParser, FullPlaylistParser } from '@videojs/hls-parser'; +import { HlsPipeline } from './pipelines/mse/hls-pipeline'; export class ServiceLocator { public readonly logger: ILogger; @@ -68,11 +69,7 @@ export class ServiceLocator { return new NetworkManager(dependencies); } - public getHlsParser(): FullPlaylistParser { - const hlsParserLogger = this.logger.createSubLogger('HLSFullPlaylistParser'); - return FullPlaylistParser.create({ - debugCallback: hlsParserLogger.debug, - warnCallback: hlsParserLogger.warn, - }); + public getHlsParser(): FullPlaylistParser | ChunkPlaylistParser { + return HlsPipeline.parser; } } diff --git a/packages/playback/test/lib/service-locator.test.ts b/packages/playback/test/lib/service-locator.test.ts index 91250aa..778a964 100644 --- a/packages/playback/test/lib/service-locator.test.ts +++ b/packages/playback/test/lib/service-locator.test.ts @@ -1,6 +1,8 @@ -import { FullPlaylistParser } from '@videojs/hls-parser'; +import { ChunkPlaylistParser } from '@videojs/hls-parser'; import { ServiceLocator } from '../../src/lib/service-locator'; import { beforeEach, describe, expect, it } from 'vitest'; +import { HlsPipeline } from '../../src/lib/pipelines/mse/hls-pipeline'; +import type { IPipelineDependencies } from '../../src/entry-points/api-reference'; describe('Service locator spec', () => { let serviceLocator: ServiceLocator; beforeEach(() => { @@ -11,7 +13,10 @@ describe('Service locator spec', () => { expect(serviceLocator).toBeInstanceOf(ServiceLocator); }); - it('should return the full hls parser', () => { - expect(serviceLocator.getHlsParser()).toBeInstanceOf(FullPlaylistParser); + it('should return the chunk hls parser', () => { + HlsPipeline.create({ + logger: serviceLocator.logger, + } as IPipelineDependencies); + expect(serviceLocator.getHlsParser()).toBeInstanceOf(ChunkPlaylistParser); }); });