Fix error when playing legacy streams caused by the content length missing

This commit is contained in:
absidue 2022-02-26 21:50:51 +01:00
parent e6ef793465
commit 258ef03aaa
2 changed files with 44 additions and 5 deletions

View File

@ -136,9 +136,8 @@ export function request_resolve_redirect(url: string): Promise<string> {
resolve(url);
} else if (statusCode < 400) {
const resolved = await request_resolve_redirect(res.headers.location as string).catch((err) => err);
if (res instanceof Error) {
reject(res);
if (resolved instanceof Error) {
reject(resolved);
return;
}
@ -149,6 +148,38 @@ export function request_resolve_redirect(url: string): Promise<string> {
});
}
export function request_content_length(url: string): Promise<number> {
return new Promise(async (resolve, reject) => {
let res = await https_getter(url, { method: 'HEAD' }).catch((err: Error) => err);
if (res instanceof Error) {
reject(res);
return;
}
const statusCode = Number(res.statusCode);
if (statusCode < 300) {
resolve(Number(res.headers['content-length']));
} else if (statusCode < 400) {
const newURL = await request_resolve_redirect(res.headers.location as string).catch((err) => err);
if (newURL instanceof Error) {
reject(newURL);
return;
}
const res2 = await request_content_length(newURL).catch((err) => err);
if (res2 instanceof Error) {
reject(res2);
return;
}
resolve(res2);
} else {
reject(
new Error(`Failed to get content length with error: ${res.statusCode}, ${res.statusMessage}, ${url}`)
);
}
});
}
/**
* Main module that play-dl uses for making a https request
* @param req_url URL to make https request to

View File

@ -1,4 +1,4 @@
import { request_stream } from '../Request';
import { request_content_length, request_stream } from '../Request';
import { LiveStream, Stream } from './classes/LiveStream';
import { SeekStream } from './classes/SeekStream';
import { InfoData, StreamInfoData } from './utils/constants';
@ -104,11 +104,19 @@ export async function stream_from_info(
);
} else if (options.seek) throw new Error('Can not seek with discordPlayerCompatibility set to true.');
}
let contentLength;
if (final[0].contentLength) {
contentLength = Number(final[0].contentLength);
} else {
contentLength = await request_content_length(final[0].url);
}
return new Stream(
final[0].url,
type,
info.video_details.durationInSec,
Number(final[0].contentLength),
contentLength,
info.video_details.url,
options
);