Skip to content
This repository was archived by the owner on Feb 9, 2026. It is now read-only.

Commit 3bfb2c3

Browse files
fix: Make utils.js/copy recursive
1 parent c60d87e commit 3bfb2c3

File tree

3 files changed

+19
-15
lines changed

3 files changed

+19
-15
lines changed

src/main/constants/paths.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import electron from 'electron';
55
export const TMP_PATH = path.join(electron.app.getPath('userData'), '/temp');
66
export const ASAR_TMP_PATH = path.join(TMP_PATH, 'app.asar');
77
export const ASAR_UNPACKED_ZIP_TMP_PATH = path.join(TMP_PATH, 'app.asar.unpacked.zip');
8+
export const ASAR_UNPACKED_TMP_PATH = path.join(TMP_PATH, 'app.asar.unpacked');
89
export const ASAR_GZ_TMP_PATH = path.join(TMP_PATH, 'app.asar.gz');
910
export const ASAR_ZST_TMP_PATH = path.join(TMP_PATH, 'app.asar.zst');
1011
export const ASAR_TMP_BACKUP_PATH = path.join(TMP_PATH, 'app.asar.backup');

src/main/modules/patcher.js

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import plist from 'plist';
1313
import { getState } from "./state.js";
1414
import Events from "../types/Events.js";
1515
import PatchTypes from '../types/PatchTypes.js';
16-
import { ASAR_ZST_TMP_PATH, ASAR_GZ_TMP_PATH, ASAR_TMP_PATH, EXTRACTED_ENTITLEMENTS_PATH, TMP_PATH, ASAR_TMP_BACKUP_PATH, YM_EXE_TMP_BACKUP_PATH, ASAR_UNPACKED_ZIP_TMP_PATH } from '../constants/paths.js';
16+
import { ASAR_ZST_TMP_PATH, ASAR_GZ_TMP_PATH, ASAR_TMP_PATH, EXTRACTED_ENTITLEMENTS_PATH, TMP_PATH, ASAR_TMP_BACKUP_PATH, YM_EXE_TMP_BACKUP_PATH, ASAR_UNPACKED_ZIP_TMP_PATH, ASAR_UNPACKED_TMP_PATH } from '../constants/paths.js';
1717
import { Logger } from "./Logger.js";
1818
import { execFile } from 'child_process';
1919

@@ -28,7 +28,7 @@ import {
2828
launchYandexMusic,
2929
unzipFolder,
3030
createDirIfNotExist,
31-
copyFile,
31+
copy,
3232
decompressFile,
3333
} from "./utils.js";
3434
import { LATEST_MOD_RELEASE_URL, YM_RELEASE_METADATA_URL } from '../constants/urls.js';
@@ -81,6 +81,7 @@ async function clearCaches(callback) {
8181
if (fso.existsSync(ASAR_ZST_TMP_PATH)) await fso.promises.unlink(ASAR_ZST_TMP_PATH);
8282
if (fso.existsSync(ASAR_GZ_TMP_PATH)) await fso.promises.unlink(ASAR_GZ_TMP_PATH);
8383
if (fso.existsSync(ASAR_TMP_PATH)) await fso.promises.unlink(ASAR_TMP_PATH);
84+
if (fso.existsSync(ASAR_UNPACKED_TMP_PATH)) await fso.promises.unlink(ASAR_UNPACKED_TMP_PATH);
8485
if (fso.existsSync(ASAR_UNPACKED_ZIP_TMP_PATH)) await fso.promises.unlink(ASAR_UNPACKED_ZIP_TMP_PATH);
8586
if (fso.existsSync(ASAR_TMP_BACKUP_PATH)) await fso.promises.unlink(ASAR_TMP_BACKUP_PATH);
8687
if (fso.existsSync(YM_EXE_TMP_BACKUP_PATH)) await fso.promises.unlink(YM_EXE_TMP_BACKUP_PATH);
@@ -111,25 +112,25 @@ async function postInstallTasks(ymMetadata, wasYmClosed, callback) {
111112
async function applyBackups(callback, asarPath) {
112113

113114
callback(-1, 'Reverting ASAR replace...');
114-
await copyFile(ASAR_TMP_BACKUP_PATH, asarPath);
115+
await copy(ASAR_TMP_BACKUP_PATH, asarPath);
115116
callback(-1, 'ASAR replace reverted.');
116117

117118
if (isWin && YM_EXE_PATH && fs.existsSync(YM_EXE_PATH) && fs.existsSync(YM_EXE_TMP_BACKUP_PATH)) {
118119
callback(-1, 'Reverting EXE patch...');
119-
await copyFile(YM_EXE_TMP_BACKUP_PATH, YM_EXE_PATH);
120+
await copy(YM_EXE_TMP_BACKUP_PATH, YM_EXE_PATH);
120121
callback(-1, 'EXE patch reverted.');
121122
}
122123
}
123124

124125
async function createBackups(callback, asarPath) {
125126
callback(0.9, 'Creating ASAR backup...', undefined, 'vrb');
126-
await copyFile(asarPath, ASAR_TMP_BACKUP_PATH);
127+
await copy(asarPath, ASAR_TMP_BACKUP_PATH);
127128
callback(0.9, 'ASAR backup created.', undefined, 'vrb');
128129
}
129130

130131
async function replaceAsar(callback, patchType, fromAsarSrc, asarPath) {
131132
callback(0.9, 'Replacing ASAR...');
132-
await copyFile((patchType === PatchTypes.FROM_MOD && fromAsarSrc) ? fromAsarSrc : ASAR_TMP_PATH, asarPath);
133+
await copy((patchType === PatchTypes.FROM_MOD && fromAsarSrc) ? fromAsarSrc : ASAR_TMP_PATH, asarPath);
133134
callback(0.9, 'ASAR replaced.');
134135
}
135136

@@ -174,9 +175,14 @@ async function prepareModAsarFile(patchType, asarPath, callback) {
174175

175176
callback(0.8, 'Unzipping app.asar.unpacked.zip file...', undefined, 'vrb');
176177

177-
await unzipFolder(ASAR_UNPACKED_ZIP_TMP_PATH, path.join(path.dirname(asarPath), 'app.asar.unpacked'));
178+
await unzipFolder(ASAR_UNPACKED_ZIP_TMP_PATH, ASAR_UNPACKED_TMP_PATH);
178179

179180
callback(0.9, 'Asar.unpacked unzipped...');
181+
182+
183+
callback(0.9, 'Copying asar.unpacked to app directory...', undefined, 'vrb');
184+
await copy(ASAR_UNPACKED_TMP_PATH, path.join(path.dirname(asarPath), 'app.asar.unpacked'));
185+
callback(0.9, 'Asar.unpacked copied.');
180186
}
181187

182188
export async function installMod(callback, { patchType = PatchTypes.DEFAULT, fromAsarSrc = undefined, customPathToYMAsar = undefined }) {
@@ -321,7 +327,7 @@ export async function checkMacPermissions() {
321327
if (!isMac) return true
322328
const asarPath = getYMAsarDefaultPath();
323329
try {
324-
await copyFile(asarPath, asarPath);
330+
await copy(asarPath, asarPath);
325331
return true;
326332
} catch(e) {
327333
return false

src/main/modules/utils.js

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -203,16 +203,16 @@ export function formatTimeStampDiff(date1, date2) {
203203
return result;
204204
}
205205

206-
export async function copyFile(target, dest) {
206+
export async function copy(target, dest) {
207207
try {
208-
await fso.promises.copyFile(target, dest);
208+
await fso.promises.cp(target, dest, { recursive: true });
209209
} catch (error) {
210210
if (process.platform === 'linux' && error.code === 'EACCES') {
211211
const encodedTarget = target.replaceAll("'", "\\'");
212212
const encodedDest = dest.replaceAll("'", "\\'");
213-
await execFileAsync('pkexec', ['bash', '-c', `cp '${encodedTarget}' '${encodedDest}'`]);
213+
await execFileAsync('pkexec', ['bash', '-c', `cp '${encodedTarget}' '${encodedDest}' -r`]);
214214
} else {
215-
logger.error('File copying failed:', error);
215+
logger.error('Copying failed:', error);
216216
}
217217
}
218218
}
@@ -241,9 +241,6 @@ export async function decompressFile(target, dest, compressionType) {
241241
}
242242

243243
export async function unzipFolder(zipPath, outputFolder) {
244-
245-
await createDirIfNotExist(outputFolder);
246-
247244
await new Promise((resolve, reject) => {
248245
fs.createReadStream(zipPath)
249246
.pipe(unzipper.Extract({ path: outputFolder }))

0 commit comments

Comments
 (0)