mfbulut / foutube

Youtube video downloader without third party dependencies

Home Page:https://foutube.netlify.app/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

foutube

Youtube video downloader without third party dependencies

How to use

Enter youtube url then click download lastly paste script into powershell

Important note: concating videos requares FFmpeg

Altarnative

javascript:(function()%7Bconst%20fetchText%20%3D%20async%20(url)%20%3D%3E%20%7B%0A%20%20%20%20const%20response%20%3D%20await%20fetch(url)%3B%0A%20%20%20%20const%20responseText%20%3D%20await%20response.text()%3B%0A%20%20%20%20return%20responseText%3B%0A%7D%0A%0Aconst%20retrieveMetadata%20%3D%20async%20(videoId)%20%3D%3E%20%7B%0A%20%20%20%20const%20response%20%3D%20await%20fetch(%22https%3A%2F%2Fwww.youtube.com%2Fyoutubei%2Fv1%2Fplayer%22%2C%20%7B%0A%20%20%20%20%20%20%20%20method%3A%20%22POST%22%2C%0A%20%20%20%20%20%20%20%20headers%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Content-Type%22%3A%20%22application%2Fjson%22%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20body%3A%20JSON.stringify(%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20videoId%3A%20videoId%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20context%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20client%3A%20%7B%20clientName%3A%20%22WEB%22%2C%20clientVersion%3A%20%222.20230810.05.00%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7D)%2C%0A%20%20%20%20%7D)%3B%0A%0A%20%20%20%20if%20(!response.ok)%20%7B%0A%20%20%20%20%20%20%20%20console.error(%22Request%20failed%20with%20status%3A%22%2C%20response.status)%3B%0A%20%20%20%20%20%20%20%20return%20null%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20const%20responseData%20%3D%20await%20response.json()%3B%0A%20%20%20%20const%20formats%20%3D%20responseData.streamingData.adaptiveFormats%3B%0A%20%20%20%20const%20videoFormat%20%3D%20formats.find((w)%20%3D%3E%20w.mimeType.startsWith(%22video%2Fwebm%22))%3B%0A%20%20%20%20const%20audioFormat%20%3D%20formats.find((w)%20%3D%3E%20w.mimeType.startsWith(%22audio%2Fwebm%22))%3B%0A%0A%20%20%20%20return%20%5BresponseData.videoDetails.title%2C%20videoFormat%2C%20audioFormat%5D%3B%0A%7D%0A%0Aconst%20retrieveChallenge%20%3D%20async%20(video_id)%20%3D%3E%20%7B%0A%20%20%20%20async%20function%20retrieve_player_url(video_id)%20%7B%0A%20%20%20%20%20%20%20%20let%20response%20%3D%20await%20fetchText('https%3A%2F%2Fwww.youtube.com%2Fembed%2F'%20%2B%20video_id)%3B%0A%20%20%20%20%20%20%20%20let%20player_hash%20%3D%20%2F%5C%2Fs%5C%2Fplayer%5C%2F(%5Cw%2B)%5C%2Fplayer_ias.vflset%5C%2F%5Cw%2B%5C%2Fbase.js%2F.exec(response)%5B1%5D%0A%20%20%20%20%20%20%20%20return%20%60https%3A%2F%2Fwww.youtube.com%2Fs%2Fplayer%2F%24%7Bplayer_hash%7D%2Fplayer_ias.vflset%2Fen_US%2Fbase.js%60%0A%20%20%20%20%7D%0A%0A%20%20%20%20const%20player_url%20%3D%20await%20retrieve_player_url(video_id)%3B%0A%0A%20%20%20%20const%20response%20%3D%20await%20fetchText(player_url)%3B%0A%20%20%20%20let%20challenge_name%20%3D%20%2F%5C.get%5C(%22n%22%5C)%5C)%26%26%5C(b%3D(%5Ba-zA-Z0-9%24%5D%2B)(%3F%3A%5C%5B(%5Cd%2B)%5C%5D)%3F%5C(%5Ba-zA-Z0-9%5D%5C)%2F.exec(response)%5B1%5D%3B%0A%20%20%20%20challenge_name%20%3D%20new%20RegExp(%60var%20%24%7Bchallenge_name%7D%5C%5Cs*%3D%5C%5Cs*%5C%5C%5B(.%2B%3F)%5C%5C%5D%5C%5Cs*%5B%2C%3B%5D%60).exec(response)%5B1%5D%3B%0A%0A%20%20%20%20const%20challenge%20%3D%20new%20RegExp(%60%24%7Bchallenge_name%7D%5C%5Cs*%3D%5C%5Cs*function%5C%5Cs*%5C%5C((%5B%5C%5Cw%24%5D%2B)%5C%5C)%5C%5Cs*%7B(.%2B%3F%7D%5C%5Cs*return%5C%5C%20%5B%5C%5Cw%24%5D%2B.join%5C%5C(%22%22%5C%5C))%7D%3B%60%2C%20%22s%22).exec(response)%5B2%5D%3B%0A%0A%20%20%20%20return%20challenge%3B%0A%7D%0A%0Aconst%20solveChallenge%20%3D%20(challenge%2C%20formatUrl)%20%3D%3E%20%7B%0A%20%20%20%20const%20url%20%3D%20new%20URL(formatUrl)%3B%0A%20%20%20%20const%20n%20%3D%20url.searchParams.get(%22n%22)%3B%0A%20%20%20%20const%20n_transformed%20%3D%20eval(%60((a)%20%3D%3E%20%7B%24%7Bchallenge%7D%7D)('%24%7Bn%7D')%60)%3B%0A%20%20%20%20url.searchParams.set(%22n%22%2C%20n_transformed)%3B%0A%20%20%20%20return%20url.toString()%3B%0A%7D%0A%0Aconst%20downloadFile%20%3D%20async%20(url%2C%20filename)%20%3D%3E%20%7B%0A%20%20%20%20const%20response%20%3D%20await%20fetch(url)%3B%0A%20%20%20%20const%20reader%20%3D%20response.body.getReader()%3B%0A%0A%20%20%20%20const%20chunks%20%3D%20%5B%5D%3B%0A%20%20%20%20while%20(true)%20%7B%0A%20%20%20%20%20%20%20%20const%20%7B%20done%2C%20value%20%7D%20%3D%20await%20reader.read()%3B%0A%20%20%20%20%20%20%20%20if%20(done)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20chunks.push(value)%3B%0A%20%20%20%20%20%20%20%20console.log(Math.ceil(chunks%5B0%5D.length%20*%20chunks.length%20%2F%201024))%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20const%20blob%20%3D%20new%20Blob(chunks%2C%20%7B%20type%3A%20response.headers.get(%22content-type%22)%20%7D)%3B%0A%20%20%20%20const%20downloadLink%20%3D%20document.createElement(%22a%22)%3B%0A%20%20%20%20downloadLink.href%20%3D%20URL.createObjectURL(blob)%3B%0A%20%20%20%20downloadLink.download%20%3D%20filename%3B%0A%20%20%20%20downloadLink.click()%3B%0A%7D%3B%0A%0Aconst%20main%20%3D%20async%20()%20%3D%3E%20%7B%0A%20%20%20%20const%20urlParams%20%3D%20new%20URLSearchParams(window.location.search)%3B%0A%20%20%20%20let%20videoId%20%3D%20urlParams.get('v')%3B%0A%20%20%20%20if%20(!videoId)%20%7B%0A%20%20%20%20%20%20%20%20throw%20Error(%22Missing%20video%20link%22)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20const%20%5Btitle%2C%20video%2C%20audio%5D%20%3D%20await%20retrieveMetadata(videoId)%3B%0A%20%20%20%20if%20(!title%20%7C%7C%20!video%20%7C%7C%20!audio)%20%7B%0A%20%20%20%20%20%20%20%20throw%20Error(%22Failed%20to%20retrieve%20metadata%22)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20const%20challenge%20%3D%20await%20retrieveChallenge(videoId)%3B%0A%20%20%20%20video.url%20%3D%20solveChallenge(challenge%2C%20video.url)%3B%0A%20%20%20%20audio.url%20%3D%20solveChallenge(challenge%2C%20audio.url)%3B%0A%0A%20%20%20%20await%20downloadFile(video.url%2C%20%22video.webm%22)%3B%0A%20%20%20%20await%20downloadFile(audio.url%2C%20%22audio.webm%22)%3B%0A%7D%3B%0A%0Amain()%3B%7D)()%3B

Resources

How They Bypass YouTube Video Download Throttling

About

Youtube video downloader without third party dependencies

https://foutube.netlify.app/

License:MIT License


Languages

Language:JavaScript 53.8%Language:HTML 46.2%