Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
/node_modules
.idea
node_modules
111 changes: 111 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
@@ -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;
7 changes: 4 additions & 3 deletions lib/mediainfo.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
23 changes: 15 additions & 8 deletions package.json
Original file line number Diff line number Diff line change
@@ -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",
Expand All @@ -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"
}
}