music-downloader/app/model/StoreModel.js

102 lines
2.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

const fs = require('fs');
const request = require('request');
const _path = require("path");
//var ffmetadata = require("ffmetadata");
const { exec } = require('child_process');
//递归创建目录 同步方法
function mkdirsSync(dirname) {
//console.log(dirname);
if (fs.existsSync(dirname)) {
return true;
} else {
if (mkdirsSync(_path.dirname(dirname))) {
fs.mkdirSync(dirname);
return true;
}
}
}
function storeResource(path, url) {
path = handlePath(path);
return new Promise((resolve, reject) => {
mkdirsSync(_path.dirname(path));
const writeableStream = fs.createWriteStream(path);
request.get({ url: url, timeout: 20000 }).pipe(writeableStream).on('close', () => {
resolve(true);
});
});
}
async function storeMusic(path, url, info) {
await storeResource(path, url);
if(info.extension == 'mp3') {
await modifyMP3Info2(path, info);
}
}
// async function modifyMP3Info(path, info) {
// path = handlePath(path);
// // Read song.mp3 metadata
// ffmetadata.read(path, function(err, data) {
// if (err) console.error("Error reading metadata", err);
// else console.log(data);
// });
// // Set the artist for song.mp3
// var data = {
// title: info.title,
// artist: info.author
// };
// ffmetadata.write(path, data, function(err) {
// if (err) console.error("Error writing metadata", err);
// else console.log("Data written");
// });
// }
async function modifyMP3Info2(path, info) {
path = handlePath(path);
// 要执行的命令行指令
const command = `mp3info -a "${info.author}" -t "${info.title}" "${path}"`;
exec(command, (error, stdout, stderr) => {
if (error) {
console.error(`修改mp3文件信息时发生错误${error}`);
return;
}
console.log(`修改mp3文件信息\n${stdout}`);
});
}
function storeLrc(path, content) {
path = handlePath(path);
return new Promise((resolve, reject) => {
mkdirsSync(_path.dirname(path));
fs.writeFileSync(path, content, { overwrite: true });
resolve(true);
});
}
async function storePic(path, url) {
return await storeResource(path, url);
}
function checkMusicExists(path) {
return fs.existsSync(path);
}
function handlePath(path) {
// 必须保存到downloads目录过滤关键字符防止目录穿越
if(path.indexOf('/downloads/') != 0) path = '/downloads/' + path;
path = path.replace('..', '').replace(/\.+/g, '.').replace(/\/+/g, '/').replace(/\\+/g, '\\');
if(process.cwd()[0] != '/') path = process.cwd()[0] + ':' + path; // 兼容windows盘符
return path;
}
module.exports = {
storeMusic,
storeLrc,
storePic,
checkMusicExists
}