commit
f49c3aa379
@ -148,7 +148,7 @@ export class SeekStream {
|
|||||||
this.timer.reuse();
|
this.timer.reuse();
|
||||||
return this.seek();
|
return this.seek();
|
||||||
}
|
}
|
||||||
const bytes = this.stream.seek();
|
const bytes = this.stream.seek(this.content_length);
|
||||||
if (bytes instanceof Error) {
|
if (bytes instanceof Error) {
|
||||||
this.stream.emit('error', bytes);
|
this.stream.emit('error', bytes);
|
||||||
this.bytes_count = 0;
|
this.bytes_count = 0;
|
||||||
|
|||||||
@ -75,7 +75,7 @@ export class WebmSeeker extends Duplex {
|
|||||||
|
|
||||||
_read() {}
|
_read() {}
|
||||||
|
|
||||||
seek(): Error | number {
|
seek(content_length: number): Error | number {
|
||||||
let clusterlength = 0,
|
let clusterlength = 0,
|
||||||
position = 0;
|
position = 0;
|
||||||
let time_left = (this.sec - this.time) * 1000 || 0;
|
let time_left = (this.sec - this.time) * 1000 || 0;
|
||||||
@ -86,8 +86,7 @@ export class WebmSeeker extends Duplex {
|
|||||||
const data = this.header.segment.cues[i];
|
const data = this.header.segment.cues[i];
|
||||||
if (Math.floor((data.time as number) / 1000) === this.time) {
|
if (Math.floor((data.time as number) / 1000) === this.time) {
|
||||||
position = data.position as number;
|
position = data.position as number;
|
||||||
if (this.header.segment.cues.length > 1)
|
clusterlength = (this.header.segment.cues[i + 1]?.position || content_length) - position - 1;
|
||||||
clusterlength = this.header.segment.cues[i + 1].position! - position - 1;
|
|
||||||
break;
|
break;
|
||||||
} else continue;
|
} else continue;
|
||||||
}
|
}
|
||||||
@ -145,6 +144,7 @@ export class WebmSeeker extends Duplex {
|
|||||||
// stop parsing the header once we have found the correct cue
|
// stop parsing the header once we have found the correct cue
|
||||||
if (
|
if (
|
||||||
ebmlID.name === 'cueClusterPosition' &&
|
ebmlID.name === 'cueClusterPosition' &&
|
||||||
|
this.header.segment.cues!.length > 2 &&
|
||||||
this.time === (this.header.segment.cues!.at(-2)!.time as number) / 1000
|
this.time === (this.header.segment.cues!.at(-2)!.time as number) / 1000
|
||||||
)
|
)
|
||||||
this.emit('headComplete');
|
this.emit('headComplete');
|
||||||
|
|||||||
@ -85,19 +85,18 @@ export async function stream_from_info(
|
|||||||
let type: StreamType =
|
let type: StreamType =
|
||||||
final[0].codec === 'opus' && final[0].container === 'webm' ? StreamType.WebmOpus : StreamType.Arbitrary;
|
final[0].codec === 'opus' && final[0].container === 'webm' ? StreamType.WebmOpus : StreamType.Arbitrary;
|
||||||
await request_stream(`https://${new URL(final[0].url).host}/generate_204`);
|
await request_stream(`https://${new URL(final[0].url).host}/generate_204`);
|
||||||
if (options.seek) {
|
if (type === StreamType.WebmOpus) {
|
||||||
if (type === StreamType.WebmOpus) {
|
options.seek ??= 0
|
||||||
if (options.seek >= info.video_details.durationInSec || options.seek <= 0)
|
if (options.seek >= info.video_details.durationInSec || options.seek < 0)
|
||||||
throw new Error(`Seeking beyond limit. [ 1 - ${info.video_details.durationInSec - 1}]`);
|
throw new Error(`Seeking beyond limit. [ 0 - ${info.video_details.durationInSec - 1}]`);
|
||||||
return new SeekStream(
|
return new SeekStream(
|
||||||
final[0].url,
|
final[0].url,
|
||||||
info.video_details.durationInSec,
|
info.video_details.durationInSec,
|
||||||
final[0].indexRange.end,
|
final[0].indexRange.end,
|
||||||
Number(final[0].contentLength),
|
Number(final[0].contentLength),
|
||||||
info.video_details.url,
|
info.video_details.url,
|
||||||
options
|
options
|
||||||
);
|
);
|
||||||
} else throw new Error('Seek is only supported in Webm Opus Files.');
|
|
||||||
} else
|
} else
|
||||||
return new Stream(
|
return new Stream(
|
||||||
final[0].url,
|
final[0].url,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user