openframe
Version:
Openframe controller process which runs on the machine controlling the frame.
95 lines (83 loc) • 2.77 kB
JavaScript
// 'use strict';
/**
* A small utility for downloading files.
*/
// Dependencies
const fs = require('fs'),
request = require('request'),
progress = require('request-progress'),
mkdirp = require('mkdirp'),
path = require('path'),
logSingleLine = require('single-line-log').stdout,
debug = require('debug')('openframe:downloader'),
status = require('http-status'),
prettyBytes = require('pretty-bytes'),
humanizeDuration = require('humanize-duration');
const artworkDir = '/tmp';
let artworkRequest, finished = false
/**
* Download a file using HTTP get.
*
* @param {String} file_url
* @param {String} file_output_name
*/
function downloadFile(file_url, file_output_name) {
debug('downloading %s', file_url);
return new Promise(function(resolve, reject) {
var file_name = file_output_name,
file_path = artworkDir + '/' + file_name;
mkdirp(artworkDir, function (err) {
if (err) {
console.log('Couldn\'t create artwork directory.')
console.error(err)
}
});
// debug('finished',finished)
if (artworkRequest && !finished) artworkRequest.abort()
finished = false
artworkRequest = request({
url: file_url,
headers: {
'User-Agent': 'request'
}
})
progress(artworkRequest, {
throttle : 500
})
.on('response', function(response) {
// console.log(response.statusCode)
// console.log(response.headers['content-type'])
if (!(/^2/.test('' + response.statusCode))) { // Status Codes other than 2xx
console.log("The artwork is not available.")
console.log("Server responded with this status code:", response.statusCode, status[response.statusCode]);
reject()
}
})
.on('error', function(err) {
console.log("Error downloading artwork")
console.error(err)
reject()
})
.on('abort', function() {
debug("Aborted downloading artwork")
reject()
})
.on('progress', function (state) {
if (debug.enabled) {
if (state.size.total) logSingleLine((state.percent*100).toFixed(2) + '% of ' + prettyBytes(state.size.total)+ ' – ' + humanizeDuration(state.time.remaining * 1000, { round: true }) + ' remaining – ' + (state.speed != null ? prettyBytes(state.speed) : '?') + '/s')
else logSingleLine('Total download size unkown')
}
})
.pipe(fs.createWriteStream(file_path).on("error", function(err) {
console.log("Error saving artwork")
console.log(err)
reject()
}))
.on('finish', function() {
debug('Artwork downloaded')
finished = true
return resolve(file_path);
});
});
}
exports.downloadFile = downloadFile;