Skip to content

Commit

Permalink
Merge pull request #290 from boostcampwm-2024/dev-fe
Browse files Browse the repository at this point in the history
[CI/CD]
  • Loading branch information
jsk3342 authored Dec 4, 2024
2 parents 14fc669 + 9b4971f commit d3b989d
Showing 1 changed file with 68 additions and 61 deletions.
129 changes: 68 additions & 61 deletions frontend/src/hooks/usePlayer.ts
Original file line number Diff line number Diff line change
@@ -1,81 +1,72 @@
import Hls, {
Loader,
LoaderCallbacks,
LoaderConfiguration,
LoaderContext,
LoaderResponse,
LoaderStats,
HlsConfig
} from 'hls.js';
import Hls, { Loader, LoaderCallbacks, LoaderConfiguration, LoaderContext, HlsConfig } from 'hls.js';
import { useEffect, useRef } from 'react';

class CustomLoader implements Loader<LoaderContext> {
private loader: Loader<LoaderContext>;
private retryCount: number = 0;
private maxRetries: number = 6;
private retryDelay: number = 3000;
private DefaultLoader: new (config: HlsConfig) => Loader<LoaderContext>;

constructor(config: HlsConfig) {
const DefaultLoader = Hls.DefaultConfig.loader as new (config: HlsConfig) => Loader<LoaderContext>;
this.loader = new DefaultLoader(config);
this.DefaultLoader = Hls.DefaultConfig.loader as new (config: HlsConfig) => Loader<LoaderContext>;
this.loader = new this.DefaultLoader(config);
}

load(context: LoaderContext, config: LoaderConfiguration, callbacks: LoaderCallbacks<LoaderContext>) {
const { onSuccess, onError, onTimeout, onAbort, onProgress } = callbacks;
private createNewLoader(): Loader<LoaderContext> {
return new this.DefaultLoader({
...Hls.DefaultConfig,
enableWorker: true,
lowLatencyMode: true
});
}

const newCallbacks: LoaderCallbacks<LoaderContext> = {
onSuccess: (response: LoaderResponse, stats: LoaderStats, context: LoaderContext, networkDetails: any = null) => {
onSuccess(response, stats, context, networkDetails);
},
onError: (
error: { code: number; text: string },
context: LoaderContext,
networkDetails: any = null,
stats: LoaderStats
) => {
if (error.code === 404) {
const emptyData = new ArrayBuffer(0);
onSuccess(
{
url: context.url,
data: emptyData
},
{
trequest: performance.now(),
tfirst: performance.now(),
tload: performance.now(),
loaded: 0,
total: 0
} as unknown as LoaderStats,
context,
networkDetails
);
} else {
if (onError) {
onError(error, context, networkDetails, stats);
private retryLoad(context: LoaderContext, config: LoaderConfiguration, callbacks: LoaderCallbacks<LoaderContext>) {
this.loader = this.createNewLoader();

setTimeout(() => {
const retryCallbacks: LoaderCallbacks<LoaderContext> = {
...callbacks,
onError: (error, context, networkDetails, stats) => {
if (error.code === 404 && this.retryCount < this.maxRetries) {
this.retryCount++;
this.retryLoad(context, config, callbacks);
} else {
this.retryCount = 0;
if (callbacks.onError) {
callbacks.onError(error, context, networkDetails, stats);
}
}
}
},
onTimeout: (stats: LoaderStats, context: LoaderContext, networkDetails: any = null) => {
if (onTimeout) {
onTimeout(stats, context, networkDetails);
}
},
onAbort: (stats: LoaderStats, context: LoaderContext, networkDetails: any = null) => {
if (onAbort) {
onAbort(stats, context, networkDetails);
};

this.loader.load(context, config, retryCallbacks);
}, this.retryDelay);
}

load(context: LoaderContext, config: LoaderConfiguration, callbacks: LoaderCallbacks<LoaderContext>) {
const modifiedCallbacks: LoaderCallbacks<LoaderContext> = {
...callbacks,
onSuccess: (response, stats, context, networkDetails) => {
this.retryCount = 0;
if (callbacks.onSuccess) {
callbacks.onSuccess(response, stats, context, networkDetails);
}
},
onProgress: (
stats: LoaderStats,
context: LoaderContext,
data: string | ArrayBuffer,
networkDetails: any = null
) => {
if (onProgress) {
onProgress(stats, context, data, networkDetails);
onError: (error, context, networkDetails, stats) => {
if (error.code === 404 && this.retryCount < this.maxRetries) {
this.retryCount++;
this.retryLoad(context, config, callbacks);
} else {
this.retryCount = 0;
if (callbacks.onError) {
callbacks.onError(error, context, networkDetails, stats);
}
}
}
};

this.loader.load(context, config, newCallbacks);
this.loader.load(context, config, modifiedCallbacks);
}

abort() {
Expand Down Expand Up @@ -124,6 +115,22 @@ export default function usePlayer(url: string) {
videoElement.play();
});

hls.on(Hls.Events.ERROR, (event, data) => {
if (data.fatal) {
switch (data.type) {
case Hls.ErrorTypes.NETWORK_ERROR:
hls.startLoad();
break;
case Hls.ErrorTypes.MEDIA_ERROR:
hls.recoverMediaError();
break;
default:
hls.destroy();
break;
}
}
});

return () => {
hls.destroy();
};
Expand Down

0 comments on commit d3b989d

Please sign in to comment.