diff --git a/src/lib/server/helpers.ts b/src/lib/server/helpers.ts index af5111d..b334c5b 100644 --- a/src/lib/server/helpers.ts +++ b/src/lib/server/helpers.ts @@ -1,7 +1,15 @@ import formats from '$lib/common/supportedFormats.json'; const formatMime = new Map(Object.entries(formats)) +export const isURLValid = (url: string) => { + try { + new URL(url) + } catch { + return false + } + return true; +} export const mimeTypeMap = formatMime; export const contentTypeFromFormat = (format: string): string => { const toReturn: string | undefined = formatMime.get(format) diff --git a/src/routes/download/+server.ts b/src/routes/download/+server.ts index 305f0b4..5d5c6aa 100644 --- a/src/routes/download/+server.ts +++ b/src/routes/download/+server.ts @@ -1,9 +1,9 @@ import { error } from '@sveltejs/kit'; import type { RequestHandler } from './$types'; import { getYouTubeMetadata, streamYouTube, ytdl } from '$lib/server/ytdlp'; -import { contentTypeFromFormat, mimeTypeMap } from '$lib/server/helpers'; +import { contentTypeFromFormat, isURLValid, mimeTypeMap } from '$lib/server/helpers'; -export const GET: RequestHandler = async ({ url }) => { +const validateRequest = (url) => { // Get query params const link = url.searchParams.get('link'); const format = url.searchParams.get('format'); // mp3, mp4 @@ -19,16 +19,37 @@ export const GET: RequestHandler = async ({ url }) => { throw error(400, 'Currently, only YouTube is supported'); } - try { - let filename = `you-clicked-no-metadata-so-i-cant-put-a-correct-name.${format}`; + if (!isURLValid(link)) { + throw error(400, 'URL not valid'); + } - if (metadata) { + if (!mimeTypeMap.get(format)) { + throw error(400, 'format not valid'); + } + + return { + link, format, source, metadata + } +} +export const GET: RequestHandler = async ({ url }) => { + const { format, source, metadata, link } = validateRequest(url) + let filename = `you-clicked-no-metadata-so-i-cant-put-a-correct-name.${format}`; + + if (metadata) { + try { // Fetch metadata for filename const metadata = await getYouTubeMetadata(link); const { title, uploader } = metadata; const safeTitle = `${uploader} - ${title}`; filename = `${safeTitle}.${format}`; + } catch (err) { + console.error(err) + console.error('Error fetching metadata:'); + throw error(500, 'Failed to fetch video metadata'); } + } + + try { // Stream video/audio return new Response(streamYouTube(link, format), { @@ -38,9 +59,10 @@ export const GET: RequestHandler = async ({ url }) => { 'Set-Cookie': 'downloading=0' } }); + } catch (err) { console.error(err) - console.error('Error fetching metadata:'); - throw error(500, 'Failed to fetch video metadata'); + console.error('Filed to stream file'); + throw error(500, 'Failed to stream file'); } };