@@ -4,6 +4,7 @@ import { DownloadPathTemplateEngine } from "./TemplateEngine";
44import type { Episode } from "./types/Episode" ;
55import type { LocalEpisode } from "./types/LocalEpisode" ;
66import { isLocalFile } from "./utility/isLocalFile" ;
7+ import { encodeUrlForRequest } from "./utility/encodeUrlForRequest" ;
78import getUrlExtension from "./utility/getUrlExtension" ;
89import getExtensionFromContentType from "./utility/getExtensionFromContentType" ;
910
@@ -18,8 +19,9 @@ async function downloadFile(
1819 onError : ( error : Error ) => void ;
1920 } > ,
2021) {
22+ const encodedUrl = encodeUrlForRequest ( url ) ;
2123 try {
22- const response = await requestUrl ( { url, method : "GET" } ) ;
24+ const response = await requestUrl ( { url : encodedUrl , method : "GET" } ) ;
2325
2426 if ( response . status !== 200 ) {
2527 throw new Error ( "Could not download episode." ) ;
@@ -38,7 +40,7 @@ async function downloadFile(
3840 } ) ,
3941 contentLength,
4042 receivedLength : contentLength ,
41- responseUrl : url ,
43+ responseUrl : encodedUrl ,
4244 } ;
4345 } catch ( error : unknown ) {
4446 const err = new Error (
@@ -292,16 +294,21 @@ export async function downloadEpisode(
292294}
293295
294296async function getFileExtension ( url : string ) : Promise < string > {
295- const urlExtension = getUrlExtension ( url ) ;
297+ const encodedUrl = encodeUrlForRequest ( url ) ;
298+ const urlExtension = getUrlExtension ( encodedUrl ) ;
296299 if ( urlExtension ) return urlExtension ;
297300
298301 // If URL doesn't have an extension, fetch headers to determine content type
299- const response = await fetch ( url , { method : "HEAD" } ) ;
300- const contentType = response . headers . get ( "content-type" ) ;
302+ try {
303+ const response = await fetch ( encodedUrl , { method : "HEAD" } ) ;
304+ const contentType = response . headers . get ( "content-type" ) ;
301305
302- const extensionFromContentType = getExtensionFromContentType ( contentType ) ;
303- if ( extensionFromContentType ) {
304- return extensionFromContentType ;
306+ const extensionFromContentType = getExtensionFromContentType ( contentType ) ;
307+ if ( extensionFromContentType ) {
308+ return extensionFromContentType ;
309+ }
310+ } catch ( error ) {
311+ console . error ( `HEAD request failed for ${ encodedUrl } ` , error ) ;
305312 }
306313
307314 // Default to mp3 if we can't determine the type
0 commit comments