需要帮助使用id3-parser在node.js中异步解析id3标签

戴斯拉德

我有一个完整的mp3文件夹,我想使用id3-parser npm模块进行解析,以便返回rss提要。id3-parser文档说使用这种结构:

id3.parse(filebuffer).then(function(tag){
  console.log(tag.title);
});

id3-parser模块使用promise-a-plus模块。我的代码的问题在于,该标记在堆栈的最后被读取。这是我的测试代码:

var id3 = require('id3-parser');
var fs = require('fs');

fs.readdir("podcasts", function (err, files) {
  files.forEach( function (file) {
    var stats = fs.statSync("podcasts/" + file);
    if (stats.isFile()) {
      var fbuff = fs.readFileSync("podcasts/" + file);
      id3.parse(fbuff).then( function (tag) {
        console.log("***"+tag.title);
      });
      console.log("Parsed id3 tag " + file);
    }
    console.log("Done file");
  });
  console.log("Done readdir");
});

输出为:

Parsed id3 tag test.mp3
Done file
Done readdir
***Title tag

我一辈子都无法弄清楚如何正确等待标记被解析。解析应该在我将其放入rss feed中之前进行(使用rss模块创建该xml feed不会有麻烦-代码未显示)。我一直在阅读有关诺言的内容,但我缺少一些东西。我确定我只需要完全重构代码,但不确定如何读取每个文件(当前使用readdir和forEach)并将每个文件添加到Feed中。

保留

试试这个:

var id3 = require('id3-parser')
var fs = require('fs')
var path = require('path')

function promiseFromCallback (fn) {
  return new Promise(function (resolve, reject) {
    return fn(function (err, result) {
      return err ? reject(err) : resolve(result)
    })
  })
}

function dirID3 (directory) {
  return promiseFromCallback(function (gotDir) {
    return fs.readdir(directory, gotDir)
  }).then(function (files) {
    return Promise.all(files.map(function (file) {
      var filePath = path.join(directory, file)
      return promiseFromCallback(function (gotStat) {
        return fs.stat(filePath, gotStat)
      }).then(function (stat) {
        return stat.isFile() ? promiseFromCallback(function (gotBuffer) {
          return fs.readFile(filePath, gotBuffer)
        }).then(function (fbuff) {
          return id3.parse(fbuff)
        }).then(function (tag) {
          return { path: filePath, tag: tag }
        }) : null
      })
    }))
  }).then(function (id3Items) {
    var result = {}
    id3Items.forEach(function (id3Item) {
      if (id3Item) result[id3Item.path] = id3Item.tag
    })
    return result
  })
}

然后像这样使用它:

dirID3('podcasts').then(function (dirInfo) {
  console.log('ID3 info for directory', dirInfo)
})

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章