From 95a3b9fd07fc84c5546db78ab0ce39daed430b3b Mon Sep 17 00:00:00 2001 From: Alexander Kuhta Date: Tue, 19 Jan 2016 21:11:24 +0300 Subject: [PATCH 1/2] Add option to set MediaInfo explicitly, add accepting single array --- lib/mediainfo.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/mediainfo.js b/lib/mediainfo.js index 27d8550..1ff330d 100644 --- a/lib/mediainfo.js +++ b/lib/mediainfo.js @@ -2,12 +2,13 @@ var child_process = require("child_process"), filesizeParser = require("filesize-parser"), expat = require("node-expat"); -module.exports = function() { - var files = Array.prototype.slice.apply(arguments); +module.exports = function(files) { + files = files||Array.prototype.slice.apply(arguments); + mediainfoPath = process.env.MEDIAINFO_PATH||"mediainfo"; var done = files.pop(); - child_process.execFile("mediainfo", ["--Output=XML"].concat(files), function(err, stdout, stderr) { + child_process.execFile(mediainfoPath, ["--Output=XML"].concat(files), function(err, stdout, stderr) { if (err) { return done(err); } From 1809819f60c2334a21b2616f56c78b689d643a65 Mon Sep 17 00:00:00 2001 From: RiderSx Date: Tue, 19 Jan 2016 22:37:05 +0300 Subject: [PATCH 2/2] Bump deps versions, migrate to promises --- .gitignore | 3 +- index.js | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 23 +++++++---- 3 files changed, 128 insertions(+), 9 deletions(-) create mode 100644 index.js diff --git a/.gitignore b/.gitignore index 07e6e47..7a1537b 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -/node_modules +.idea +node_modules diff --git a/index.js b/index.js new file mode 100644 index 0000000..29250db --- /dev/null +++ b/index.js @@ -0,0 +1,111 @@ +'use strict'; + +const expat = require('expat'); +const childProcess = require('child_process'); +const fileSizeParser = require('filesize-parser'); + +const mediaInfoPath = process.env.MEDIAINFO_PATH || 'mediainfo'; + +/** + * @param {string[]} files + * @returns {Promise} + */ +function mediaInfo (files) { + const promise = new Promise((resolve, reject) => { + childProcess.execFile( + mediaInfoPath, + ['--Output=XML'].concat(files), + (err, stdout) => { + if (err) { + reject(err); + } else { + resolve(stdout); + } + } + ); + }); + + return promise.then(stdout => parse); +} + +/** + * @param stdout + * @returns {Promise} + */ +function parse (stdout) { + return new Promise((resolve, reject) => { + const parser = new expat.Parser(); + const files = []; + + let file = null; + let track = null; + let key = null; + + parser.on('startElement', (name, attributes) => { + name = name.toLowerCase(); + + if (file === null && name === "file") { + file = {tracks: []}; + + for (var k in attribs) { + file[k.toLowerCase()] = attribs[k]; + } + + return; + } + + if (track === null && name === "track") { + if (attributes.type === "General") { + track = file; + } else { + track = {}; + + for (var k in attributes) { + track[k.toLowerCase()] = attribs[k]; + } + } + + return; + } + + if (track !== null) { + key = name; + } + }); + + parser.on("endElement", name => { + name = name.toLowerCase(); + + if (track !== null && name === "track") { + if (track !== file) { file.tracks.push(track); } + track = null; + } + + if (file !== null && name === "file") { + if (file.file_size) { + file.file_size_bytes = fileSizeParser(file.file_size); + } + + files.push(file); + + file = null; + } + + key = null; + }); + + parser.on("text", text => { + if (track !== null && key !== null) { + track[key] = (track[key] || "") + text; + } + }); + + if (parser.parse(stdout)) { + resolve(files); + } else { + reject(parser.getError()); + } + }); +} + +module.exports = mediaInfo; \ No newline at end of file diff --git a/package.json b/package.json index fcedc56..0b0ec70 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,23 @@ { - "name": "mediainfo", + "name": "bakaru-mediainfo", "description": "Wrapper around the `mediainfo' program for obtaining information about media files", - "version": "0.0.2", + "version": "0.0.9", "author": { "name": "Conrad Pankoff", "email": "deoxxa@fknsrs.biz", "url": "http://www.fknsrs.biz/" }, - "url": "http://github.com/deoxxa/node-mediainfo", + "contributors": [ + { + "name": "Alexander Kukhta", + "email": "me@thers.io" + } + ], + "url": "http://github.com/bakaru/node-mediainfo", "license": "BSD", "repository": { "type": "git", - "url": "git://github.com/deoxxa/node-mediainfo.git" + "url": "git://github.com/bakaru/node-mediainfo.git" }, "keywords": [ "mediainfo", @@ -24,12 +30,13 @@ "mkv", "avi" ], - "main": "./lib/mediainfo", + "main": "index", "engines": { - "node": ">=0.6.11" + "node": ">=5" }, "dependencies": { - "node-expat": "2.0.x", - "filesize-parser": "~0.0.2" + "bluebird": "3.1.x", + "filesize-parser": "1.3.x", + "node-expat": "2.3.x" } }