mirror of
https://github.com/ZHANGTIANYAO1/teamspeak-music-bot.git
synced 2026-10-03 05:22:49 +08:00
fix(local): keep the original size when the source video can't be deleted (#149)
After extracting the audio track, uploadAudio assigned the record's `size`
from the new .mka BEFORE deleting the source video:
size = statSync(extracted).size;
rmSync(filePath, { force: true }); // can throw EBUSY/EPERM on Windows
filePath = extracted;
rmSync with force:true only swallows ENOENT — a briefly locked file (exactly
what the existing scheduleRetry machinery in this file exists to handle)
throws. The catch then discards the extract and keeps playing the original
container, which is correct, but `size` had already been overwritten with the
much smaller extracted size while the whole video stayed on disk. That makes
totalBytes() under-count and lets the upload directory grow past its quota.
Commit filePath and size together, only once the source is actually gone.
Adds a regression test that partially mocks node:fs to make rmSync throw for
the source .mp4 and asserts the persisted record (index.json — `size` is not
exposed through search()/toSong) still describes the retained file. With the
old ordering it records 27894 bytes for a 104544-byte file.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
c79a9a6dee
commit
19ad48c4ab
2 files changed
+116
-1
No files matched your search
+8
-1
@@ -330,9 +330,16 @@ export class LocalMusicProvider implements MusicProvider {
|
||||
const extracted = path.join(this.uploadDir, `${id}${EXTRACTED_AUDIO_EXT}`);
|
||||
if (await extractAudioTrack(filePath, extracted)) {
|
||||
try {
|
||||
size = statSync(extracted).size;
|
||||
// Commit filePath and size TOGETHER, and only after the source is
|
||||
// actually gone. rmSync(force) still throws EBUSY/EPERM on Windows,
|
||||
// and assigning size first would leave the record claiming the
|
||||
// small extracted size while still pointing at the whole video —
|
||||
// which makes totalBytes() under-count and lets the upload
|
||||
// directory grow past its quota.
|
||||
const extractedSize = statSync(extracted).size;
|
||||
rmSync(filePath, { force: true });
|
||||
filePath = extracted;
|
||||
size = extractedSize;
|
||||
} catch {
|
||||
// Could not stat/remove (Windows lock) — keep playing the original
|
||||
// container and drop the half-finished extract.
|
||||
|
||||
Reference in new issue
Block a user