基于Node.JS索引mp3 ID3 tag信息并存储入MySQL数据库

来源:互联网 发布:2017亚吉铁路现状知乎 编辑:程序博客网 时间:2024/06/05 15:50

注意中文编码问题:客户端代码建立connection时将charset设置为binary,这个与服务器端的默认latin1是兼容的。


var id3 = require("node-id3"),path = require("path"),fs_walk = require('fs-walk'),mysql = require('mysql');var pool = mysql.createPool({host     : 'localhost',    user     : 'root',    password : '',    database : 'musicDB', //一般sql数据库名称需要在外部创建,里面的table可以在代码里创建connectionLimit: 10,charset: 'binary'});/*CREATE TABLE music_info(    id INTEGER PRIMARY KEY AUTO_INCREMENT,    absPath VARCHAR(512) NOT NULL,    album VARCHAR(512),    artist VARCHAR(512),    title VARCHAR(512),    trackNumber INTEGER,    albumType CHAR    );*///debug:pool.on('acquire', function (connection) {  console.log('Connection %d acquired', connection.threadId);});pool.on('release', function (connection) {  console.log('Connection %d released', connection.threadId);});fs_walk.walkSync('d:/Music', function(basedir, filename, stat) {console.log("walkSync: basedir="+basedir+" filename="+filename);if(stat.isDirectory()){console.log("walkSync: skip dir");}else if(!filename.endsWith(".mp3")){console.log("walkSync: skip non-mp3 file");}else{var absPath = path.join(basedir, filename)var tags = id3.read(absPath)//console.log("walkSync: tags="+JSON.stringify(tags));var album = tags.album;var title = tags.title;var artist = tags.artist;var trackNumber = Number(tags.trackNumber);//怎么获得SQL INSERT返回的id主键值?//TODO: 尽管使用了pool,但假如每个INSERT请求都要创建一个connection,显然有性能问题//而且这里应该使用批量插入BULK INSERT模式以提高性能var query = pool.query(/*{sql: "INSERT INTO `music_info`(`absPath`, `album`, `artist`, `title`, `trackNumber`) VALUES(?,?,?,?,?)",timeout: 20000, //20svalues: [absPath, album, artist, title, trackNumber]  }*/"INSERT INTO `music_info` SET ?",{absPath: absPath, album: album, artist: artist, title: title, trackNumber: trackNumber},function(err, rows, fields){if(err){console.log("pool.query INSERT ERROR "+err);}else{console.log("pool.query INSERT SUCCESS");}});console.log("walkSync: query="+JSON.stringify(query));}});