mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-30 18:12:25 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			163 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			163 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * archiver-utils
 | |
|  *
 | |
|  * Copyright (c) 2015 Chris Talkington.
 | |
|  * Licensed under the MIT license.
 | |
|  * https://github.com/archiverjs/archiver-utils/blob/master/LICENSE
 | |
|  */
 | |
| var fs = require('graceful-fs');
 | |
| var path = require('path');
 | |
| // var lazystream = require('./lazystream');
 | |
| var lazystream = require('./lazystream')
 | |
| var normalizePath = require('../normalize-path');
 | |
| 
 | |
| var Stream = require('stream').Stream;
 | |
| var PassThrough = require('./readableStream').PassThrough;
 | |
| 
 | |
| var utils = module.exports = {};
 | |
| utils.file = require('./file.js');
 | |
| 
 | |
| utils.collectStream = function (source, callback) {
 | |
|   var collection = [];
 | |
|   var size = 0;
 | |
| 
 | |
|   source.on('error', callback);
 | |
| 
 | |
|   source.on('data', function (chunk) {
 | |
|     collection.push(chunk);
 | |
|     size += chunk.length;
 | |
|   });
 | |
| 
 | |
|   source.on('end', function () {
 | |
|     var buf = Buffer.alloc(size);
 | |
|     var offset = 0;
 | |
| 
 | |
|     collection.forEach(function (data) {
 | |
|       data.copy(buf, offset);
 | |
|       offset += data.length;
 | |
|     });
 | |
| 
 | |
|     callback(null, buf);
 | |
|   });
 | |
| };
 | |
| 
 | |
| utils.dateify = function (dateish) {
 | |
|   dateish = dateish || new Date();
 | |
| 
 | |
|   if (dateish instanceof Date) {
 | |
|     dateish = dateish;
 | |
|   } else if (typeof dateish === 'string') {
 | |
|     dateish = new Date(dateish);
 | |
|   } else {
 | |
|     dateish = new Date();
 | |
|   }
 | |
| 
 | |
|   return dateish;
 | |
| };
 | |
| 
 | |
| // this is slightly different from lodash version
 | |
| utils.defaults = function (object, source) {
 | |
|   object = Object(object)
 | |
|   const sources = [source]
 | |
|   const objectProto = Object.prototype
 | |
|   const hasOwnProperty = objectProto.hasOwnProperty
 | |
|   sources.forEach((source) => {
 | |
|     if (source != null) {
 | |
|       source = Object(source)
 | |
|       for (const key in source) {
 | |
|         const value = object[key]
 | |
|         if (value === undefined ||
 | |
|           (value == objectProto[key] && !hasOwnProperty.call(object, key))) {
 | |
|           object[key] = source[key]
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   })
 | |
|   return object
 | |
| };
 | |
| 
 | |
| utils.isStream = function (source) {
 | |
|   return source instanceof Stream;
 | |
| };
 | |
| 
 | |
| utils.lazyReadStream = function (filepath) {
 | |
|   return new lazystream.Readable(function () {
 | |
|     return fs.createReadStream(filepath);
 | |
|   });
 | |
| };
 | |
| 
 | |
| utils.normalizeInputSource = function (source) {
 | |
|   if (source === null) {
 | |
|     return Buffer.alloc(0);
 | |
|   } else if (typeof source === 'string') {
 | |
|     return Buffer.from(source);
 | |
|   } else if (utils.isStream(source)) {
 | |
|     // Always pipe through a PassThrough stream to guarantee pausing the stream if it's already flowing,
 | |
|     // since it will only be processed in a (distant) future iteration of the event loop, and will lose
 | |
|     // data if already flowing now.
 | |
|     return source.pipe(new PassThrough());
 | |
|   }
 | |
| 
 | |
|   return source;
 | |
| };
 | |
| 
 | |
| utils.sanitizePath = function (filepath) {
 | |
|   return normalizePath(filepath, false).replace(/^\w+:/, '').replace(/^(\.\.\/|\/)+/, '');
 | |
| };
 | |
| 
 | |
| utils.trailingSlashIt = function (str) {
 | |
|   return str.slice(-1) !== '/' ? str + '/' : str;
 | |
| };
 | |
| 
 | |
| utils.unixifyPath = function (filepath) {
 | |
|   return normalizePath(filepath, false).replace(/^\w+:/, '');
 | |
| };
 | |
| 
 | |
| utils.walkdir = function (dirpath, base, callback) {
 | |
|   var results = [];
 | |
| 
 | |
|   if (typeof base === 'function') {
 | |
|     callback = base;
 | |
|     base = dirpath;
 | |
|   }
 | |
| 
 | |
|   fs.readdir(dirpath, function (err, list) {
 | |
|     var i = 0;
 | |
|     var file;
 | |
|     var filepath;
 | |
| 
 | |
|     if (err) {
 | |
|       return callback(err);
 | |
|     }
 | |
| 
 | |
|     (function next() {
 | |
|       file = list[i++];
 | |
| 
 | |
|       if (!file) {
 | |
|         return callback(null, results);
 | |
|       }
 | |
| 
 | |
|       filepath = path.join(dirpath, file);
 | |
| 
 | |
|       fs.stat(filepath, function (err, stats) {
 | |
|         results.push({
 | |
|           path: filepath,
 | |
|           relative: path.relative(base, filepath).replace(/\\/g, '/'),
 | |
|           stats: stats
 | |
|         });
 | |
| 
 | |
|         if (stats && stats.isDirectory()) {
 | |
|           utils.walkdir(filepath, base, function (err, res) {
 | |
|             res.forEach(function (dirEntry) {
 | |
|               results.push(dirEntry);
 | |
|             });
 | |
|             next();
 | |
|           });
 | |
|         } else {
 | |
|           next();
 | |
|         }
 | |
|       });
 | |
|     })();
 | |
|   });
 | |
| };
 |