From 67376afae66b542874dbaa4bc84c9b2002fbff1c Mon Sep 17 00:00:00 2001 From: Luan Date: Sun, 16 Jun 2024 16:22:33 -0300 Subject: [PATCH] chore(Format): Clean up and add some extra fields --- src/parser/classes/misc/Format.ts | 185 ++++++++++++++++++++---------- src/utils/FormatUtils.ts | 2 +- src/utils/StreamingInfo.ts | 4 +- 3 files changed, 126 insertions(+), 65 deletions(-) diff --git a/src/parser/classes/misc/Format.ts b/src/parser/classes/misc/Format.ts index 9e4c47e3..9c199948 100644 --- a/src/parser/classes/misc/Format.ts +++ b/src/parser/classes/misc/Format.ts @@ -6,46 +6,51 @@ export default class Format { #this_response_nsig_cache?: Map; itag: number; + url?: string; + width?: number; + height?: number; + last_modified: Date; + content_length?: number; + quality?: string; + xtags?: string; + drm_families?: string[]; + fps?: number; + quality_label?: string; + projection_type?: 'RECTANGULAR' | 'EQUIRECTANGULAR' | 'EQUIRECTANGULAR_THREED_TOP_BOTTOM' | 'MESH'; + average_bitrate?: number; + bitrate: number; + spatial_audio_type?: 'AMBISONICS_5_1' | 'AMBISONICS_QUAD' | 'FOA_WITH_NON_DIEGETIC'; + target_duration_dec?: number; + fair_play_key_uri?: string; + stereo_layout?: 'LEFT_RIGHT' | 'TOP_BOTTOM'; + max_dvr_duration_sec?: number; + high_replication?: boolean; + audio_quality?: string; + approx_duration_ms: number; + audio_sample_rate?: number; + audio_channels?: number; + loudness_db?: number; + signature_cipher?: string; + is_drc?: boolean; + drm_track_type?: string; + distinct_params?: string; + track_absolute_loudness_lkfs?: number; mime_type: string; is_type_otf: boolean; - bitrate: number; - average_bitrate?: number; - width: number; - height: number; - projection_type?: 'RECTANGULAR' | 'EQUIRECTANGULAR' | 'EQUIRECTANGULAR_THREED_TOP_BOTTOM' | 'MESH'; - stereo_layout?: 'LEFT_RIGHT' | 'TOP_BOTTOM'; - init_range?: { start: number; end: number; }; - index_range?: { start: number; end: number; }; - - last_modified: Date; - content_length?: number; - quality?: string; - quality_label?: string; - fps?: number; - url?: string; cipher?: string; - signature_cipher?: string; - audio_quality?: string; audio_track?: { audio_is_default: boolean; display_name: string; id: string; }; - approx_duration_ms: number; - audio_sample_rate?: number; - audio_channels?: number; - loudness_db?: number; - spatial_audio_type?: 'AMBISONICS_5_1' | 'AMBISONICS_QUAD' | 'FOA_WITH_NON_DIEGETIC'; - max_dvr_duration_sec?: number; - target_duration_dec?: number; has_audio: boolean; has_video: boolean; has_text: boolean; @@ -53,14 +58,11 @@ export default class Format { is_dubbed?: boolean; is_descriptive?: boolean; is_original?: boolean; - is_drc?: boolean; - color_info?: { primaries?: string; transfer_characteristics?: string; matrix_coefficients?: string; }; - caption_track?: { display_name: string; vss_id: string; @@ -79,56 +81,116 @@ export default class Format { this.is_type_otf = data.type === 'FORMAT_STREAM_TYPE_OTF'; this.bitrate = data.bitrate; this.average_bitrate = data.averageBitrate; - this.width = data.width; - this.height = data.height; - this.projection_type = data.projectionType; - this.stereo_layout = data.stereoLayout?.replace('STEREO_LAYOUT_', ''); - this.init_range = data.initRange ? { - start: parseInt(data.initRange.start), - end: parseInt(data.initRange.end) - } : undefined; + if (Reflect.has(data, 'width') && Reflect.has(data, 'height')) { + this.width = parseInt(data.width); + this.height = parseInt(data.height); + } - this.index_range = data.indexRange ? { - start: parseInt(data.indexRange.start), - end: parseInt(data.indexRange.end) - } : undefined; + if (Reflect.has(data, 'projectionType')) + this.projection_type = data.projectionType; + + if (Reflect.has(data, 'stereoLayout')) + this.stereo_layout = data.stereoLayout?.replace('STEREO_LAYOUT_', ''); + + if (Reflect.has(data, 'initRange')) + this.init_range = { + start: parseInt(data.initRange.start), + end: parseInt(data.initRange.end) + }; + + if (Reflect.has(data, 'indexRange')) + this.index_range = { + start: parseInt(data.indexRange.start), + end: parseInt(data.indexRange.end) + }; this.last_modified = new Date(Math.floor(parseInt(data.lastModified) / 1000)); - this.content_length = parseInt(data.contentLength); - this.quality = data.quality; - this.quality_label = data.qualityLabel; - this.fps = data.fps; - this.url = data.url; - this.cipher = data.cipher; - this.signature_cipher = data.signatureCipher; - this.audio_quality = data.audioQuality; + + if (Reflect.has(data, 'contentLength')) + this.content_length = parseInt(data.contentLength); + + if (Reflect.has(data, 'quality')) + this.quality = data.quality; + + if (Reflect.has(data, 'qualityLabel')) + this.quality_label = data.qualityLabel; + + if (Reflect.has(data, 'fps')) + this.fps = data.fps; + + if (Reflect.has(data, 'url')) + this.url = data.url; + + if (Reflect.has(data, 'cipher')) + this.cipher = data.cipher; + + if (Reflect.has(data, 'signatureCipher')) + this.signature_cipher = data.signatureCipher; + + if (Reflect.has(data, 'audioQuality')) + this.audio_quality = data.audioQuality; + this.approx_duration_ms = parseInt(data.approxDurationMs); - this.audio_sample_rate = parseInt(data.audioSampleRate); - this.audio_channels = data.audioChannels; - this.loudness_db = data.loudnessDb; - this.spatial_audio_type = data.spatialAudioType?.replace('SPATIAL_AUDIO_TYPE_', ''); - this.max_dvr_duration_sec = data.maxDvrDurationSec; - this.target_duration_dec = data.targetDurationSec; + + if (Reflect.has(data, 'audioSampleRate')) + this.audio_sample_rate = parseInt(data.audioSampleRate); + + if (Reflect.has(data, 'audioChannels')) + this.audio_channels = data.audioChannels; + + if (Reflect.has(data, 'loudnessDb')) + this.loudness_db = data.loudnessDb; + + if (Reflect.has(data, 'spatialAudioType')) + this.spatial_audio_type = data.spatialAudioType?.replace('SPATIAL_AUDIO_TYPE_', ''); + + if (Reflect.has(data, 'maxDvrDurationSec')) + this.max_dvr_duration_sec = data.maxDvrDurationSec; + + if (Reflect.has(data, 'targetDurationSec')) + this.target_duration_dec = data.targetDurationSec; + this.has_audio = !!data.audioBitrate || !!data.audioQuality; this.has_video = !!data.qualityLabel; this.has_text = !!data.captionTrack; - this.color_info = data.colorInfo ? { - primaries: data.colorInfo.primaries?.replace('COLOR_PRIMARIES_', ''), - transfer_characteristics: data.colorInfo.transferCharacteristics?.replace('COLOR_TRANSFER_CHARACTERISTICS_', ''), - matrix_coefficients: data.colorInfo.matrixCoefficients?.replace('COLOR_MATRIX_COEFFICIENTS_', '') - } : undefined; + if (Reflect.has(data, 'xtags')) + this.xtags = data.xtags; - if (Reflect.has(data, 'audioTrack')) { + if (Reflect.has(data, 'fairPlayKeyUri')) + this.fair_play_key_uri = data.fairPlayKeyUri; + + if (Reflect.has(data, 'drmFamilies')) + this.drm_families = data.drmFamilies; + + if (Reflect.has(data, 'drmTrackType')) + this.drm_track_type = data.drmTrackType; + + if (Reflect.has(data, 'distinctParams')) + this.distinct_params = data.distinctParams; + + if (Reflect.has(data, 'trackAbsoluteLoudnessLkfs')) + this.track_absolute_loudness_lkfs = data.trackAbsoluteLoudnessLkfs; + + if (Reflect.has(data, 'highReplication')) + this.high_replication = data.highReplication; + + if (Reflect.has(data, 'colorInfo')) + this.color_info = { + primaries: data.colorInfo.primaries?.replace('COLOR_PRIMARIES_', ''), + transfer_characteristics: data.colorInfo.transferCharacteristics?.replace('COLOR_TRANSFER_CHARACTERISTICS_', ''), + matrix_coefficients: data.colorInfo.matrixCoefficients?.replace('COLOR_MATRIX_COEFFICIENTS_', '') + }; + + if (Reflect.has(data, 'audioTrack')) this.audio_track = { audio_is_default: data.audioTrack.audioIsDefault, display_name: data.audioTrack.displayName, id: data.audioTrack.id }; - } - if (Reflect.has(data, 'captionTrack')) { + if (Reflect.has(data, 'captionTrack')) this.caption_track = { display_name: data.captionTrack.displayName, vss_id: data.captionTrack.vssId, @@ -136,7 +198,6 @@ export default class Format { kind: data.captionTrack.kind, id: data.captionTrack.id }; - } if (this.has_audio || this.has_text) { const args = new URLSearchParams(this.cipher || this.signature_cipher); diff --git a/src/utils/FormatUtils.ts b/src/utils/FormatUtils.ts index 5b0b9632..4029131c 100644 --- a/src/utils/FormatUtils.ts +++ b/src/utils/FormatUtils.ts @@ -155,7 +155,7 @@ export function chooseFormat(options: FormatOptions, streaming_data?: IStreaming return false; if (!is_best && format.quality_label !== quality) return false; - if (best_width < format.width) + if (format.width && (best_width < format.width)) best_width = format.width; return true; }); diff --git a/src/utils/StreamingInfo.ts b/src/utils/StreamingInfo.ts index b2bb7c4a..db649ee3 100644 --- a/src/utils/StreamingInfo.ts +++ b/src/utils/StreamingInfo.ts @@ -85,8 +85,8 @@ export interface VideoSet { export interface VideoRepresentation { uid: string; bitrate: number; - width: number; - height: number; + width?: number; + height?: number; fps?: number; codecs?: string; segment_info: SegmentInfo;