This commit is contained in:
吴璨
2026-08-04 09:40:15 +08:00
parent 536685e327
commit 839ec8eb2e
8 changed files with 68 additions and 31 deletions
+17 -14
View File
@@ -2,6 +2,7 @@ const fs = require('fs');
const path = require('path');
const { execSync, execFileSync } = require('child_process');
const { downloadBuffer } = require('./network');
const { formatPersonNames } = require('./utils');
function hasFFmpeg() {
try { execSync('ffmpeg -version', { stdio: 'ignore' }); return true; } catch { return false; }
@@ -23,24 +24,25 @@ async function embedCover(audioPath, coverUrl, meta) {
const NodeID3 = require('node-id3');
const tags = {
title: meta.name,
artist: meta.artist,
artist: formatPersonNames(meta.artist),
album: meta.album,
image: coverPath,
};
if (meta.albumArtist) tags.performerInfo = meta.albumArtist;
if (meta.albumArtist) tags.performerInfo = formatPersonNames(meta.albumArtist);
if (meta.compilation) tags.TCMP = '1';
if (meta.year) tags.year = String(meta.year);
if (meta.date) tags.date = String(meta.date);
if (meta.trackNo) tags.trackNumber = String(meta.trackNo);
if (meta.disc) tags.partOfSet = String(meta.disc);
if (meta.genre) tags.genre = meta.genre;
if (meta.composer) tags.composer = meta.composer;
if (meta.lyricist) tags.textWriter = meta.lyricist;
if (meta.composer) tags.composer = formatPersonNames(meta.composer);
if (meta.lyricist) tags.textWriter = formatPersonNames(meta.lyricist);
if (meta.publisher) tags.publisher = meta.publisher;
const userTexts = [];
if (meta.arranger) userTexts.push({ description: 'ARRANGER', value: meta.arranger });
if (meta.producer) userTexts.push({ description: 'PRODUCER', value: meta.producer });
if (meta.mixer) userTexts.push({ description: 'MIXER', value: meta.mixer });
if (meta.arranger) userTexts.push({ description: 'ARRANGER', value: formatPersonNames(meta.arranger) });
if (meta.producer) userTexts.push({ description: 'PRODUCER', value: formatPersonNames(meta.producer) });
if (meta.mixer) userTexts.push({ description: 'MIXER', value: formatPersonNames(meta.mixer) });
if (userTexts.length) tags.userDefinedText = userTexts;
if (meta.lyrics) tags.unsynchronisedLyrics = { language: 'chi', text: meta.lyrics };
const ok = NodeID3.write(tags, audioPath);
@@ -63,19 +65,20 @@ async function embedCover(audioPath, coverUrl, meta) {
}
};
addMeta('title', meta.name);
addMeta('artist', meta.artist);
addMeta('artist', formatPersonNames(meta.artist));
addMeta('album', meta.album);
addMeta('album_artist', meta.albumArtist || meta.artist);
addMeta('album_artist', formatPersonNames(meta.albumArtist || meta.artist));
addMeta('compilation', meta.compilation ? '1' : undefined);
addMeta('date', meta.date || meta.year);
addMeta('track', meta.trackNo);
addMeta('disc', meta.disc);
addMeta('genre', meta.genre);
addMeta('composer', meta.composer);
addMeta('composer', formatPersonNames(meta.composer));
addMeta('publisher', meta.publisher);
addMeta('lyricist', meta.lyricist);
addMeta('arranger', meta.arranger);
addMeta('producer', meta.producer);
addMeta('mixer', meta.mixer);
addMeta('lyricist', formatPersonNames(meta.lyricist));
addMeta('arranger', formatPersonNames(meta.arranger));
addMeta('producer', formatPersonNames(meta.producer));
addMeta('mixer', formatPersonNames(meta.mixer));
if (meta.lyrics && meta.lyrics.length <= 8000) addMeta('lyrics', meta.lyrics);
args.push('-metadata:s:v', 'title=Album cover', '-metadata:s:v', 'comment=Cover (front)');
if (ext === '.mp3') args.push('-id3v2_version', '3');