2016-12-09 5 views
0

rss 피드를 반환 할 수 있도록 id3-parser npm 모듈을 사용하여 구문 분석하려는 mp3로 가득 찬 폴더가 있습니다.id3-parser를 사용하여 node.js에서 id3 태그를 비동기 적으로 파싱하는 데 도움이 필요합니다.

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

로, ID3 파서 모듈은 약속-A 플러스 모듈을 사용하십시오 ID3 파서 문서는이 구조를 사용했다. 내 코드의 문제는 태그가 스택 맨 끝에 읽히는 것입니다.

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 피드에 넣기 전에 수행해야합니다 (rss 모듈을 사용하여 xml 피드를 작성하는 데 아무런 문제가 없습니다 - 코드는 표시되지 않음). 나는 약속에 대해 읽었으며 나는 뭔가를 놓치고있다. 나는 단지 내 코드를 완전히 리팩터링 할 필요가 있지만 모든 파일 (현재는 readdir과 forEach를 사용)을 읽고 각 파일을 피드에 추가하는 방법을 모르겠다.

답변

1

이 시도 :

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) 
}) 
+0

감사합니다. 솔루션에 연결된 모든 것을 이해하려고합니다. 아직 테스트하지 않았습니다. – dskrad

+0

와우 이것이 내가 필요한 것입니다. 감사 :) – dskrad

관련 문제