Skip to content

Instantly share code, notes, and snippets.

@vinz243
Last active August 29, 2015 14:02
Show Gist options
  • Save vinz243/7a40108a3faece48033b to your computer and use it in GitHub Desktop.
Save vinz243/7a40108a3faece48033b to your computer and use it in GitHub Desktop.
Download any track on youtube from cmd
var request = require('request');
var prompt = require('prompt');
var fs = require('fs');
var ytdl = require('ytdl');
var flv = require('flv');
require('colors');
var shortId = require('shortid');
var request = require('request');
var progress = require('request-progress');
var ProgressBar = require('progress');
//
// Start the prompt
//
prompt.start();
prompt.get(["query"], function (err, prompted) {
request({
url: "http://itunes.apple.com/search?media=music&entity=song&limit=10&term=" + encodeURIComponent(prompted.query),
json: true
}, function (dataAndEvents, r, data) {
for (var result in data.results) {
console.log(result, ": ", data.results[result].trackName, " - ", data.results[result].artistName);
}
prompt.get(["track"], function (err, prompted) {
var trackName = data.results[prompted.track - 0].trackName + " - " + data.results[prompted.track - 0].artistName;
console.log(trackName);
request({
url: "http://gdata.youtube.com/feeds/api/videos?alt=json&max-results=1&q=" + encodeURIComponent(trackName),
json: true
}, function (dataAndEvents, deepDataAndEvents, data) {
var url = data.feed.entry[0].link[0].href;
console.log(data.feed.entry[0].link[0].href);
console.log("=> Downloading video...");
var fileName = shortId.generate();
ytdl.getInfo(data.feed.entry[0].link[0].href, {
downloadURL: true
}, function (err, info) {
info.formats = info.formats.filter(function (el) {
return el.container === "flv";
}).sort(function (a, b) {
if (a.audioBitrate && b.audioBitrate) {
if (a.audioBitrate > b.audioBitrate)
return -1;
else
return 1;
}
if (a.resolution && b.resolution) {
if (/(\d+)p/.exec(a.resolution)[1] > /(\d+)p/.exec(b.resolution)[1])
return -1;
else
return 1;
}
return 0;
});
var url = info.formats[0].url;
console.log();
var bar = new ProgressBar(' downloading [:bar] :percent :etas', {
complete: '=',
incomplete: ' ',
width: 20,
total: 100
});
// Note that the options argument is optional
progress(request(url), {})
.on('progress', function (state) {
if (!bar.complete)
bar.tick(state.percent);
})
.on('error', function (err) {
throw err;
})
.pipe(fs.createWriteStream(fileName))
.on('error', function (err) {
throw err;
})
.on('close', function (err) {
console.log('\ncomplete\n');
process.stdout.write("=> Done".green + "\r");
console.log("=> Starting conversion to mp3...");
// create a readable stream to some FLV file
var file = fs.createReadStream(fileName);
var decoder = new flv.Decoder();
decoder.on('audio', function (audio) {
// "audio" is a Readable stream of audio data
// the type of audio data depends on the FLV file, could be AAC, MP3, etc.
audio.pipe(fs.createWriteStream(trackName.replace(/["\/\\']/g, "") + ".mp3")).on('close', function () {
console.log(' > MP3 extracted');
fs.unlinkSync(fileName);
console.log('=> Done'.green);
});
});
file.pipe(decoder).on('close', function () {
console.log(' > FLV Video loaded');
});
});
});
});
});
});
});
@vinz243
Copy link
Author

vinz243 commented Jun 13, 2014

Inspired from late HipHopApp

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment