|
1 | 1 | import { ipcMain, dialog, app, clipboard, shell } from "electron";
|
| 2 | +import { File, Picture, Id3v2Settings } from "node-taglib-sharp"; |
2 | 3 | import { readDirAsync } from "@main/utils/readDirAsync";
|
3 | 4 | import { parseFile } from "music-metadata";
|
4 | 5 | import { download } from "electron-dl";
|
5 | 6 | import getNeteaseMusicUrl from "@main/utils/getNeteaseMusicUrl";
|
6 |
| -import NodeID3 from "node-id3"; |
7 | 7 | import axios from "axios";
|
8 | 8 | import fs from "fs/promises";
|
9 | 9 |
|
@@ -193,37 +193,42 @@ const mainIpcMain = (win) => {
|
193 | 193 | });
|
194 | 194 |
|
195 | 195 | // 下载文件至指定目录
|
196 |
| - ipcMain.handle("downloadFile", async (_, data, song, songName, songType, path) => { |
| 196 | + ipcMain.handle("downloadFile", async (_, songData, options) => { |
197 | 197 | try {
|
| 198 | + const { url, data, lyric, name, type } = JSON.parse(songData); |
| 199 | + const { path, downloadMeta, downloadCover, downloadLyrics } = JSON.parse(options); |
198 | 200 | if (fs.access(path)) {
|
199 |
| - const songData = JSON.parse(song); |
200 |
| - console.info("开始下载:", songData, data); |
| 201 | + console.info("开始下载:", name, url); |
201 | 202 | // 下载歌曲
|
202 |
| - const songDownload = await download(win, data.url, { |
| 203 | + const songDownload = await download(win, url, { |
203 | 204 | directory: path,
|
204 |
| - filename: `${songName}.${songType}`, |
| 205 | + filename: `${name}.${type}`, |
205 | 206 | });
|
206 |
| - // 若不为 mp3,则不进行元信息写入 |
207 |
| - if (songType !== "mp3") return true; |
| 207 | + // 若关闭,则不进行元信息写入 |
| 208 | + if (!downloadMeta) return true; |
208 | 209 | // 下载封面
|
209 |
| - const coverDownload = await download(win, songData.cover, { |
| 210 | + const coverDownload = await download(win, data.cover, { |
210 | 211 | directory: path,
|
211 |
| - filename: `${songName}.jpg`, |
| 212 | + filename: `${name}.jpg`, |
212 | 213 | });
|
213 |
| - // 生成歌曲文件的元数据 |
214 |
| - const songTag = { |
215 |
| - title: songData.name, |
216 |
| - artist: Array.isArray(songData.artists) |
217 |
| - ? songData.artists.map((ar) => ar.name).join(" / ") |
218 |
| - : songData.artists || "未知歌手", |
219 |
| - album: songData.album?.name || songData.album, |
220 |
| - image: coverDownload.getSavePath(), |
221 |
| - }; |
| 214 | + // 读取歌曲文件 |
| 215 | + const songFile = File.createFromPath(songDownload.getSavePath()); |
| 216 | + // 生成图片信息 |
| 217 | + const songCover = Picture.fromPath(coverDownload.getSavePath()); |
222 | 218 | // 保存修改后的元数据
|
223 |
| - const isSuccess = NodeID3.write(songTag, songDownload.getSavePath()); |
| 219 | + Id3v2Settings.forceDefaultVersion = true; |
| 220 | + Id3v2Settings.defaultVersion = 3; |
| 221 | + songFile.tag.title = data.name || "未知曲目"; |
| 222 | + songFile.tag.album = data.album?.name || "未知专辑"; |
| 223 | + songFile.tag.performers = data?.artists?.map((ar) => ar.name) || ["未知艺术家"]; |
| 224 | + if (downloadLyrics) songFile.tag.lyrics = lyric; |
| 225 | + if (downloadCover) songFile.tag.pictures = [songCover]; |
| 226 | + // 保存元信息 |
| 227 | + songFile.save(); |
| 228 | + songFile.dispose(); |
224 | 229 | // 删除封面
|
225 | 230 | await fs.unlink(coverDownload.getSavePath());
|
226 |
| - return isSuccess; |
| 231 | + return true; |
227 | 232 | } else {
|
228 | 233 | console.log(`目录不存在:${path}`);
|
229 | 234 | return false;
|
|
0 commit comments