mirror of
https://github.com/4gray/iptvnator.git
synced 2026-10-10 10:06:15 -08:00
91 lines
2.6 KiB
TypeScript
91 lines
2.6 KiB
TypeScript
import type { MpegTsPlaybackErrorInput } from './playback-diagnostics.model';
|
|
|
|
export function normalizeErrorDetails(
|
|
error: MpegTsPlaybackErrorInput
|
|
): string {
|
|
const info = normalizeErrorPayload(error.info);
|
|
|
|
return [error.details, error.message, info]
|
|
.filter((part): part is string => Boolean(part))
|
|
.join(' ');
|
|
}
|
|
|
|
export function isNetworkFailure(type: string, details: string): boolean {
|
|
return (
|
|
type.includes('network') ||
|
|
details.includes('network') ||
|
|
details.includes('loaderror') ||
|
|
details.includes('timeout') ||
|
|
details.includes('status')
|
|
);
|
|
}
|
|
|
|
export function isBrowserAccessFailure(details: string): boolean {
|
|
return (
|
|
details.includes('cors') ||
|
|
details.includes('cross-origin') ||
|
|
details.includes('cross origin') ||
|
|
details.includes('access-control') ||
|
|
details.includes('access control') ||
|
|
details.includes('content security policy') ||
|
|
details.includes('mixed content') ||
|
|
details.includes('private network access') ||
|
|
details.includes('blocked by content security') ||
|
|
details.includes('blocked by cors') ||
|
|
details.includes('blocked by mixed content') ||
|
|
details.includes('not allowed to load local resource') ||
|
|
details.includes('err_blocked') ||
|
|
details.includes('err_cleartext')
|
|
);
|
|
}
|
|
|
|
export function isEarlyEofFailure(details: string): boolean {
|
|
const compactDetails = details.replace(/[^a-z0-9]/g, '');
|
|
return compactDetails.includes('earlyeof');
|
|
}
|
|
|
|
export function isCodecFailure(details: string): boolean {
|
|
return (
|
|
details.includes('codec') ||
|
|
details.includes('incompatiblecodecs') ||
|
|
details.includes('addcodec')
|
|
);
|
|
}
|
|
|
|
export function isDrmOrEncryptionFailure(details: string): boolean {
|
|
return (
|
|
details.includes('decrypt') ||
|
|
details.includes('keysystem') ||
|
|
details.includes('keyload') ||
|
|
details.includes('license') ||
|
|
details.includes('drm')
|
|
);
|
|
}
|
|
|
|
function normalizeErrorPayload(payload: unknown): string {
|
|
if (!payload) {
|
|
return '';
|
|
}
|
|
|
|
if (typeof payload === 'string') {
|
|
return payload;
|
|
}
|
|
|
|
if (payload instanceof Error) {
|
|
const extraDetails = stringifyUnknown(payload);
|
|
return [payload.message, extraDetails === '{}' ? '' : extraDetails]
|
|
.filter(Boolean)
|
|
.join(' ');
|
|
}
|
|
|
|
return stringifyUnknown(payload);
|
|
}
|
|
|
|
function stringifyUnknown(value: unknown): string {
|
|
try {
|
|
return JSON.stringify(value) || '';
|
|
} catch {
|
|
return String(value);
|
|
}
|
|
}
|