Skip to content
This repository has been archived by the owner on Dec 3, 2023. It is now read-only.

Commit

Permalink
when finished downloading, statistics data will be passed
Browse files Browse the repository at this point in the history
  • Loading branch information
fent committed Aug 5, 2011
1 parent 6b7a1dc commit 77a99e5
Show file tree
Hide file tree
Showing 8 changed files with 168 additions and 36 deletions.
8 changes: 6 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,18 @@ Usage

// will be called during download progress of a video
function(data) {
console.log(data.eta + ' ' + data.percent + '% at ' + data.speed);
process.stdout.write(data.eta + ' ' + data.percent + '% at ' + data.speed + '\r');
},

// called when youtube-dl finishes
function(err) {
function(err, data) {
if (err)
throw err;
console.log('Download finished!')
console.log('Time Taken: ' + data.timeTaken);
console.log('Time Taken in ms: ' + data.timeTakenms);
console.log('Average Speed: ' + data.averageSpeed);
console.log('Average Speed in Bytes: ' + data.averageSpeedBytes);
},

// optional arguments passed to youtube-dl
Expand Down
11 changes: 7 additions & 4 deletions example/download.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
youtubedl = require('youtube-dl');
youtubedl = require('./../lib/youtube-dl');


// will be called when a state changes
stateChange = function(state, data) {
Expand All @@ -10,14 +11,16 @@ stateChange = function(state, data) {

// will be called during download progress of a video
progress = function(data) {
console.log(data.eta + ' ' + data.percent + '% at ' + data.speed);
process.stdout.write(data.eta + ' ' + data.percent + '% at ' + data.speed + '\r');
}

// called when youtube-dl finishes
finished = function(err) {
finished = function(err, data) {
if (err)
throw err;
console.log('Download finished!')
console.log('\nDownload finished!');
console.log('Time Taken: ' + data.timeTaken);
console.log('Average Speed: ' + data.averageSpeed);
},

youtubedl.download('http://www.youtube.com/watch?v=90AiXO1pAiA', './',
Expand Down
2 changes: 1 addition & 1 deletion example/info.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
youtube = require('youtube-dl');
youtube = require('./../lib/youtube-dl');

youtube.info('http://www.youtube.com/watch?v=WKsjaOqDXgg',

Expand Down
85 changes: 78 additions & 7 deletions lib/youtube-dl.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "youtube-dl",
"description": "youtube-dl driver for node",
"keywords": ["youtube", "download"],
"version": "1.0.3",
"version": "1.0.4",
"homepage": "https://github.com/fent/node-youtube-dl",
"repository": {
"type": "git",
Expand Down
81 changes: 74 additions & 7 deletions src/youtube-dl.coffee
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# module dependencies
spawn = require('child_process').spawn
{spawn} = require 'child_process'
fs = require 'fs'
path = require 'path'

Expand Down Expand Up @@ -46,21 +46,75 @@ fs.stat file, (err, stats) ->
throw new Error 'youtube-dl file does not exist. tried to download it but failed.'


# command to be called
cmd = file
# rounds a number to n decimal places
round = (num, n) ->
dec = Math.pow 10, n
Math.round(num * dec + 0.1) / dec


# converts from bytes, kb, mb, and gb to bytes
toBytes = (s) ->
speed = parseFloat(s.substring 0, s.length - 3)
switch s.substr(-3, 1).toLowerCase()
when 'b'
speed
when 'k'
speed * 1024
when 'm'
speed * 1024 * 1024
when 'g'
speed * 1024 * 1024 * 1024


# converts bytes to human readable unit
# thank you Amir from StackOverflow
units = ' KMGTPEZYXWVU'
getHumanSize = (bytes) ->
return 0 if bytes <= 0
t2 = Math.min(Math.floor(Math.log(bytes) / Math.log(1024)), 12)
(Math.round(bytes * 100 / Math.pow(1024, t2)) / 100) +
units.charAt(t2).replace(' ', '') + 'B'


# converts ms to human readable time
getHumanTime = (ms) ->
x = ms / 1000
ms %= 1000
s = Math.round(x % 60)
x /= 60
m = Math.round(x % 60)
x /= 60
h = Math.round(x % 24)
d = Math.round(x / 24)

str = ''
if d > 0
str += "#{d} day#{if d > 1 then 's'}, "
set = true
if set or h > 0
str += "#{h} hour#{if h > 1 then 's'}, "
set = true
if set or m > 0
str += "#{m} minute#{if m > 1 then 's'}, "
set = true
if set or s > 0
str += "#{s} second#{if s > 1 then 's'}, "
"#{str}#{ms} ms"


# main download function
regex = /(\d+\.\d)% of (\d+\.\d+\w) at\s+([^\s]+) ETA ((\d|-)+:(\d|-)+)/
module.exports.download = (url, dest, stateChange, download, callback, args) ->
# setup settings
args = parseOpts args
args.push url

# call youtube-dl
youtubedl = spawn cmd, args, { cwd: dest }
youtubedl = spawn file, args, { cwd: dest }
speed = []
start = new Date().getTime()

err = video = size = state = false
regex = /(\d+\.\d)% of (\d+\.\d+\w) at\s+([^\s]+) ETA ((\d|-)+:(\d|-)+)/

youtubedl.stdout.on 'data', (data) ->
data = data.toString()
Expand All @@ -73,6 +127,8 @@ module.exports.download = (url, dest, stateChange, download, callback, args) ->
stateChange state,
video: video
size: size = result[2]

speed.push toBytes result[3]
download
percent: result[1]
speed: result[3]
Expand All @@ -97,7 +153,18 @@ module.exports.download = (url, dest, stateChange, download, callback, args) ->
err = data.substring 7, data.length - 1

youtubedl.on 'exit', (code) ->
callback err
averageSpeed = 0
for i in speed
averageSpeed += i
averageSpeed /= speed.length

timeTaken = new Date().getTime() - start

callback err,
timeTakenms: timeTaken
timeTaken: getHumanTime timeTaken
averageSpeedBytes: round averageSpeed, 2
averageSpeed: getHumanSize(averageSpeed) + '/s'


# gets info from a video
Expand All @@ -113,7 +180,7 @@ module.exports.info = (url, callback, args) ->
args.push url

# call youtube-dl
youtubedl = spawn cmd, args
youtubedl = spawn file, args

err = info = false

Expand Down
2 changes: 1 addition & 1 deletion test/download.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ youtube.download process.argv[2], './', ((state, data) ->
if data
console.log 'data: ' + data
), ((data) ->
console.log "Downloading: #{data.percent}%, #{data.speed}, #{data.eta}"
process.stdout.write "Downloading: #{data.percent}%, #{data.speed}, #{data.eta}\r"
), ((err) ->
if err
console.log 'error: ' + err
Expand Down
13 changes: 0 additions & 13 deletions test/info.js

This file was deleted.

0 comments on commit 77a99e5

Please sign in to comment.