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

该博客介绍了如何使用Node.JS读取mp3文件的ID3标签信息,并解决中文编码问题,确保数据正确存储进MySQL数据库。通过设置客户端连接的charset为binary,实现了与服务器端latin1字符集的兼容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意中文编码问题:客户端代码建立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, //20s
			values: [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));
	}
});



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值