From b7434da429dce6d0d5ee991fc43230373b3cadcd Mon Sep 17 00:00:00 2001 From: Przemyslaw Pluta Date: Sun, 6 Apr 2014 09:49:21 +0100 Subject: [PATCH 1/6] handle videos download from youtube playlist If looks like youtube playlists aren't handled at the moment. This should return an array or videos if playlist have been passed. ``` var video = youtubedl('https://www.youtube.com/playlist?list=PLtl803dIwdQlNse-M9TQxWEguwTgEs3Gl', ['--max-quality=18']); ``` Did not have a time to implement download cue https://github.com/fent/node-youtube-dl/blob/master/lib/youtube-dl.js#L30-64 yet --- lib/youtube-dl.js | 59 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 46 insertions(+), 13 deletions(-) diff --git a/lib/youtube-dl.js b/lib/youtube-dl.js index e455e36..a4d3457 100644 --- a/lib/youtube-dl.js +++ b/lib/youtube-dl.js @@ -89,7 +89,11 @@ function call(video, args, options, callback) { id = details.pathname.slice(1); } - args.push('http://www.youtube.com/watch?v=' + id); + if (id === 'playlist') { + args.push(video); + } else { + args.push('http://www.youtube.com/watch?v=' + id); + } var opt = [file, args, '']; @@ -132,19 +136,45 @@ ytdl.getInfo = function(url, options, callback) { call(url, args, options, function(err, data) { if (err) return callback(err); - var format = data[data.length - 1].split(' - '); - var info = { - title : data[0], - id : data[1], - url : data[2], - thumbnail : data[3], - description : data.slice(4, data.length - 2).join('\n'), - filename : data[data.length - 2], - itag : parseInt(format[0], 10), - resolution : format[1], + var playlist = []; + + var filterData = function filterData(data) { + + var format = data[data.length - 1].split(' - '); + + return { + title : data[0], + id : data[1], + url : data[2], + thumbnail : data[3], + description : data.slice(4, data.length - 2).join('\n'), + filename : data[data.length - 2], + itag : parseInt(format[0], 10), + resolution : format[1], + }; + + }; + + var divideData = function divideData(data) { + + var arr = []; + + for (var i = 0; i < args.length; i++) { + arr.push(data.shift()); + } + + playlist.push(filterData(arr)); + + if (data.length) { divideData(data); } + }; - callback(null, info); + if (data.length === args.length) { return callback(null, filterData(data)); } + + divideData(data); + + return callback(null, playlist); + }); }; @@ -164,11 +194,14 @@ ytdl.getFormats = function(url, options, callback) { call(url, ['--list-formats'], options, function(err, data) { if (err) return callback(err); - var formats = []; + var formats = [], status = ''; + data.map(function(line) { var result = formatsRegex.exec(line); + if (line.match(/\[info\]/)) { status = line.split(' ')[4].slice(0, -1); } if (result) { formats.push({ + id : status, itag : parseInt(result[1], 10), filetype : result[2], resolution : result[3], From 8704b8eae5f99be020bb662b1035e73281f58e41 Mon Sep 17 00:00:00 2001 From: Przemyslaw Pluta Date: Sun, 6 Apr 2014 19:06:45 +0100 Subject: [PATCH 2/6] test update --- test/getFormat.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/getFormat.js b/test/getFormat.js index d96db20..9aca554 100644 --- a/test/getFormat.js +++ b/test/getFormat.js @@ -5,13 +5,13 @@ var video = 'http://www.youtube.com/watch?v=0k2Zzkw_-0I'; var expected = [ - { itag: 171, filetype: 'webm', resolution: 'audio only' }, - { itag: 140, filetype: 'm4a', resolution: 'audio only' }, - { itag: 17, filetype: '3gp', resolution: '176x144' }, - { itag: 36, filetype: '3gp', resolution: '320x240' }, - { itag: 5, filetype: 'flv', resolution: '400x240' }, - { itag: 43, filetype: 'webm', resolution: '640x360' }, - { itag: 18, filetype: 'mp4', resolution: '640x360' } + { id: '0k2Zzkw_-0I', itag: 171, filetype: 'webm', resolution: 'audio only' }, + { id: '0k2Zzkw_-0I', itag: 140, filetype: 'm4a', resolution: 'audio only' }, + { id: '0k2Zzkw_-0I', itag: 17, filetype: '3gp', resolution: '176x144' }, + { id: '0k2Zzkw_-0I', itag: 36, filetype: '3gp', resolution: '320x240' }, + { id: '0k2Zzkw_-0I', itag: 5, filetype: 'flv', resolution: '400x240' }, + { id: '0k2Zzkw_-0I', itag: 43, filetype: 'webm', resolution: '640x360' }, + { id: '0k2Zzkw_-0I', itag: 18, filetype: 'mp4', resolution: '640x360' } ]; vows.describe('getFormats').addBatch({ From 28ed6bbdea4213dfc1d5d359b558222171676719 Mon Sep 17 00:00:00 2001 From: Przemyslaw Pluta Date: Sun, 6 Apr 2014 19:21:23 +0100 Subject: [PATCH 3/6] download first if array of clips --- lib/youtube-dl.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/youtube-dl.js b/lib/youtube-dl.js index a4d3457..d8612ac 100644 --- a/lib/youtube-dl.js +++ b/lib/youtube-dl.js @@ -47,15 +47,17 @@ var ytdl = module.exports = function(url, args) { return; } - var req = request(data.url); + var item = (!data.length) ? data.url : data.shift(); + + var req = request(item.url); req.on('response', function(res) { if (res.statusCode !== 200) { stream.emit('error', new Error('status code ' + res.statusCode)); return; } - data.size = parseInt(res.headers['content-length'], 10); - stream.emit('info', data); + item.size = parseInt(res.headers['content-length'], 10); + stream.emit('info', item); }); stream.resolve(req); }); From 2647ed50fb9c242108db74f686fbf12b8e6084ac Mon Sep 17 00:00:00 2001 From: Przemyslaw Pluta Date: Sun, 6 Apr 2014 19:28:12 +0100 Subject: [PATCH 4/6] typo --- lib/youtube-dl.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/youtube-dl.js b/lib/youtube-dl.js index d8612ac..2209f67 100644 --- a/lib/youtube-dl.js +++ b/lib/youtube-dl.js @@ -47,7 +47,7 @@ var ytdl = module.exports = function(url, args) { return; } - var item = (!data.length) ? data.url : data.shift(); + var item = (!data.length) ? data : data.shift(); var req = request(item.url); req.on('response', function(res) { From 6c5187e4581652e4afe81b4aff9936b274430bf2 Mon Sep 17 00:00:00 2001 From: przemyslawpluta Date: Mon, 7 Apr 2014 20:40:14 +0100 Subject: [PATCH 5/6] refactor --- lib/youtube-dl.js | 53 +++++++++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/lib/youtube-dl.js b/lib/youtube-dl.js index 2209f67..54990b7 100644 --- a/lib/youtube-dl.js +++ b/lib/youtube-dl.js @@ -90,7 +90,7 @@ function call(video, args, options, callback) { // Get possible IDs for youtu.be from urladdr. id = details.pathname.slice(1); } - + if (id === 'playlist') { args.push(video); } else { @@ -109,7 +109,30 @@ function call(video, args, options, callback) { var data = stdout.trim().split(opt[2] + '\n'); callback(null, data); }); - + +} + + +/** + * Filters youtube info data and returns reformated object. + * + * @param {Array.} data + */ +function filterData(data) { + + var format = data[data.length - 1].split(' - '); + + return { + title : data[0], + id : data[1], + url : data[2], + thumbnail : data[3], + description : data.slice(4, data.length - 2).join('\n'), + filename : data[data.length - 2], + itag : parseInt(format[0], 10), + resolution : format[1], + }; + } @@ -140,23 +163,6 @@ ytdl.getInfo = function(url, options, callback) { var playlist = []; - var filterData = function filterData(data) { - - var format = data[data.length - 1].split(' - '); - - return { - title : data[0], - id : data[1], - url : data[2], - thumbnail : data[3], - description : data.slice(4, data.length - 2).join('\n'), - filename : data[data.length - 2], - itag : parseInt(format[0], 10), - resolution : format[1], - }; - - }; - var divideData = function divideData(data) { var arr = []; @@ -176,7 +182,7 @@ ytdl.getInfo = function(url, options, callback) { divideData(data); return callback(null, playlist); - + }); }; @@ -196,11 +202,12 @@ ytdl.getFormats = function(url, options, callback) { call(url, ['--list-formats'], options, function(err, data) { if (err) return callback(err); - var formats = [], status = ''; - + var formats = []; + var status = ''; + data.map(function(line) { var result = formatsRegex.exec(line); - if (line.match(/\[info\]/)) { status = line.split(' ')[4].slice(0, -1); } + if (line.test(/\[info\]/)) { status = line.split(' ')[4].slice(0, -1); } if (result) { formats.push({ id : status, From 540ee034cdfcd8007a367c7c6bc02f860c38995c Mon Sep 17 00:00:00 2001 From: przemyslawpluta Date: Mon, 7 Apr 2014 21:06:46 +0100 Subject: [PATCH 6/6] typo --- lib/youtube-dl.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/youtube-dl.js b/lib/youtube-dl.js index 54990b7..e585e9d 100644 --- a/lib/youtube-dl.js +++ b/lib/youtube-dl.js @@ -207,7 +207,7 @@ ytdl.getFormats = function(url, options, callback) { data.map(function(line) { var result = formatsRegex.exec(line); - if (line.test(/\[info\]/)) { status = line.split(' ')[4].slice(0, -1); } + if (/\[info\]/.test(line)) { status = line.split(' ')[4].slice(0, -1); } if (result) { formats.push({ id : status,