-
-
Save geuis/8b1b2ea57d7f9a9ae22f80d4fbf5b97f to your computer and use it in GitHub Desktop.
// Run from the dev tools console of any Youtube video | |
// Accurate as of July 2, 2020. | |
// | |
// Copy and paste this into the dev console in a browser with the desired video loaded. | |
// | |
// NOTE: Some Youtube videos do not directly expose the video url in the response. | |
// This script doesn't currently attempt to handle those. It will work for most other general video types though. | |
(async () => { | |
const html = await fetch(window.location.href).then((resp) => resp.text()).then((text) => text); | |
const startStr = 'ytplayer.config = {'; | |
const start = html.indexOf(startStr) + startStr.length - 1; | |
const end = html.indexOf('};', start) + 1; | |
const playerObj = JSON.parse(html.slice(start, end)); | |
playerObj.args.player_response = JSON.parse(playerObj.args.player_response); | |
const videoUrls = playerObj.args.player_response.streamingData.adaptiveFormats.reduce((acc, item) => { | |
if (!acc[item.quality]) { | |
acc[item.quality] = {}; | |
} | |
const mimeType = item.mimeType.split(';')[0]; | |
acc[item.quality][mimeType] = item; | |
return acc; | |
}, {}); | |
console.log('!!', videoUrls); | |
})(); |
It works with the updated july 2nd script, thank you @geuis
however the url from every object only contains video stream. Is there a way to get the url for a full video+audio stream?
After running the script what's the field that hold the url? I suppose that is the one named signatureCypher ? It starts with "s=yy.."
so how to extract the url?
For Download video with audio
(async () => {
html = await fetch(window.location.href).then(resp => resp.text()).then(text => text);
startStr = 'ytplayer.config = {';
start = html.indexOf(startStr) + startStr.length - 1;
end = html.indexOf('};', start) + 1;
playerObj = JSON.parse(html.slice(start, end));
playerObj.args.player_response = JSON.parse(playerObj.args.player_response);
videoUrls = playerObj.args.player_response.streamingData.formats[1].url;
videoUrls = videoUrls.replace('"', 'r');
return console.log(videoUrls);
})();
For Download video with audio
(async () => { html = await fetch(window.location.href).then(resp => resp.text()).then(text => text); startStr = 'ytplayer.config = {'; start = html.indexOf(startStr) + startStr.length - 1; end = html.indexOf('};', start) + 1; playerObj = JSON.parse(html.slice(start, end)); playerObj.args.player_response = JSON.parse(playerObj.args.player_response); videoUrls = playerObj.args.player_response.streamingData.formats[1].url; videoUrls = videoUrls.replace('"', 'r'); return console.log(videoUrls); })();
Thank you, this works great!
For Download video with audio
(async () => { html = await fetch(window.location.href).then(resp => resp.text()).then(text => text); startStr = 'ytplayer.config = {'; start = html.indexOf(startStr) + startStr.length - 1; end = html.indexOf('};', start) + 1; playerObj = JSON.parse(html.slice(start, end)); playerObj.args.player_response = JSON.parse(playerObj.args.player_response); videoUrls = playerObj.args.player_response.streamingData.formats[1].url; videoUrls = videoUrls.replace('"', 'r'); return console.log(videoUrls); })();Thank you, this works great!
I've tried the script but I get a reject in promise. Seems not working. TypeError: Cannot read property 'url' of undefined↵ at <anonymous>:8:71
in what language is it written in? I need to rewrite it to swift
@nysander - did you ever get this converted to Swift?
in what language is it written in? I need to rewrite it to swift
@nysander - did you ever get this converted to Swift?
Nope because Apple is very strict with playback rights and I have dropped idea of this script in my app
@Joshuajrodrigues @jarvis1234d script is now updated. Try it out.