Compare commits

...

16 Commits

Author SHA1 Message Date
Iluhadesu 106584cf84 Add v1.44.1 to bs-versions.json 2026-06-25 15:26:38 +00:00
Zagrios 40fdc8ea18 [chore] update patreons.json (#1052) 2026-06-04 20:29:43 +02:00
Iluhadesu d18acda324 Add v1.44.0 to bs-versions.json 2026-05-29 06:40:12 +00:00
Iluhadesu f30a3f6c82 [chore] Update DepotDownloader to upstream (#1051)
Update DepotDownloader to upstream
2026-05-14 19:59:17 +02:00
Zagrios 0da0685ca3 [chore] update patreons.json (#1050) 2026-05-14 09:48:31 +02:00
silentrald 87236ec119 [fix] added OXR_NO_TEXTURE_SOURCE_ALPHA=1 for monado runtime (#1049) 2026-05-13 20:28:25 +02:00
silentrald 2b31a480a1 [fix-1044]: added new wine64 pathing (#1045)
removed static config validation on proton pathing
2026-05-13 17:13:33 +02:00
Zagrios 4bc2870f3b [chore] update patreons.json (#1038) 2026-05-11 13:54:14 +02:00
Mirko Russo abad7dd090 Fix Italian translations for various strings (#1047)
* Fix Italian translations for various strings

* Minor translation fix
2026-05-11 13:53:58 +02:00
Iluhadesu f846a44f74 Add v1.43.0 to bs-versions.json 2026-04-29 14:07:18 +00:00
Iluhadesu 33271bddfa Add v1.42.3 to bs-versions.json 2026-03-26 15:15:51 +00:00
Zagrios 001f033142 [chore] update patreons.json (#1033) 2026-03-25 09:44:21 +01:00
Zagrios e1d0473bbc [chore] update patreons.json (#1026) 2026-03-09 18:10:44 +01:00
Zagrios 18627b5686 [chore] update patreons.json (#1021) 2026-03-08 13:56:33 +01:00
Zagrios 03a6bbede7 [chore] update patreons.json (#1014) 2026-02-14 10:55:04 +01:00
Zagrios a68458c762 Use Mise instead of Volta (Volta is no longer maintained) 2026-02-12 16:06:16 +01:00
11 changed files with 116 additions and 71 deletions
+4 -1
View File
@@ -29,7 +29,10 @@ Hello! Were delighted that youre interested in contributing to **BSManager
### Before You Begin
1. **[Fork the repository][fork]** and **clone** your fork locally.
2. **Install the required Node.js version** (we recommend using [Volta](https://volta.sh/) to manage Node versions).
2. **Install the required tools (Node, etc)** (we recommend using [mise](https://mise.jdx.dev/) to manage tool versions).
```bash
mise install
```
3. **Install project dependencies**:
```bash
npm install
+36
View File
@@ -964,5 +964,41 @@
"ReleaseImg": "https://clan.fastly.steamstatic.com/images/32055887/1161f8316767615d2fbe863673cace231c6d2b6f.png",
"ReleaseDate": "1770303705",
"year": "2026"
},
{
"BSVersion": "1.42.3",
"BSManifest": "5798847223913166210",
"OculusBinaryId": "25563181170021654",
"ReleaseURL": "https://steamcommunity.com/games/620980/announcements/detail/511860284166506401",
"ReleaseImg": "https://clan.fastly.steamstatic.com/images/32055887/c48686febbf5a5c753dc232c4cde48652231b667.png",
"ReleaseDate": "1774534379",
"year": "2026"
},
{
"BSVersion": "1.43.0",
"BSManifest": "6499880290663953435",
"OculusBinaryId": "25964224259917341",
"ReleaseURL": "https://steamcommunity.com/games/620980/announcements/detail/692008075043799325",
"ReleaseImg": "https://clan.fastly.steamstatic.com/images/32055887/79767d59028f454d63c4425a7bfd90913b59b546.png",
"ReleaseDate": "1777467723",
"year": "2026"
},
{
"BSVersion": "1.44.0",
"BSManifest": "4180431244915746363",
"OculusBinaryId": "26135279289478503",
"ReleaseURL": "https://steamcommunity.com/games/620980/announcements/detail/690884711519617603",
"ReleaseImg": "https://clan.fastly.steamstatic.com/images/32055887/335654acc1a5066bb634486a4834368097c84983.png",
"ReleaseDate": "1779973295",
"year": "2026"
},
{
"BSVersion": "1.44.1",
"BSManifest": "7621452421350879947",
"OculusBinaryId": "26497783233228105",
"ReleaseURL": "https://steamcommunity.com/games/620980/announcements/detail/703272148131643814",
"ReleaseImg": "https://clan.fastly.steamstatic.com/images/32055887/30fd358099eb07fe22e429cdf64380d7c2ae28dc.png",
"ReleaseDate": "1782392653",
"year": "2026"
}
]
+10 -14
View File
@@ -15,7 +15,7 @@
"username": "Xero"
},
{
"username": "Rhythm Shade"
"username": "🎵Shade"
},
{
"username": "aatame3",
@@ -38,9 +38,6 @@
"username": "Reflected Chop",
"type": "gold"
},
{
"username": "Sk4venger"
},
{
"username": "Jesper Norsted"
},
@@ -49,7 +46,7 @@
"type": "diamond"
},
{
"username": "Camryn Jackson"
"username": "CamVR the goat"
},
{
"username": "bones",
@@ -61,22 +58,21 @@
{
"username": "minefox54"
},
{
"username": "Elysee Buthidi",
"type": "gold"
},
{
"username": "Tindux",
"type": "diamond"
},
{
"username": "Einherjar",
"type": "diamond"
},
{
"username": "Daniel"
},
{
"username": "lethal_loops"
"username": "Eric McCoy",
"type": "gold"
},
{
"username": "Moenker"
},
{
"username": "Melissa Avery-Weir"
}
]
+17 -17
View File
@@ -21,7 +21,7 @@
"copied": "Copiato!",
"confirm": "Conferma",
"choose-folder": "Scegli cartella",
"unknown": "È accaduto un errore sconosciuto ¯\\_(ツ)_/¯",
"unknown": "Si è verificato un errore sconosciuto ¯\\_(ツ)_/¯",
"warning": "Attenzione",
"continue": "Continua",
"shared": "Condivisi",
@@ -55,9 +55,9 @@
"launch-mods": {
"oculus": "Modalita Oculus",
"oculus-description": "Se stai usando Beat Saber via Steam, questa opzione ti consente di usare il composer VR di Oculus mentre bypassi SteamVR, per un potenziale aumento di performance. Questo non è richiesto per usare i visori Oculus.",
"desktop": "Modalita FPFC",
"desktop": "Modalità FPFC",
"desktop-description": "La modalità FPFC (First Person Flying Controller) consente di usare i pulsanti WASD e il mouse per navigare nel menu del gioco. Questo rende i test molto più facili, perchè non devi indossare il tuo visore!",
"debug": "Modalita Debug",
"debug": "Modalità Debug",
"debug-description": "Abilita la finestra di uscita del log per IPA. Questo mostrerà la console di debug che lo mod usano.",
"outdated-tippy": "Questa versione è obsoleta, e alcune mod o funzioni non potrebbero più funzionare correttamente. Consigliamo di usare la versione raccomandata ({recommendedVersion}) di Beat Saber per godere delle ultime funzioni e bugfix.",
"advanced-launch": {
@@ -66,7 +66,7 @@
"create-launch-option": "Crea un'opzione di lancio"
},
"skipsteam": "Salta Steam",
"skipsteam-description": "Ferma Steam da aprirsi automaticamente con Beat Saber, abilitalo se stai usando un VR runtime differente come WiVRn o Monado con cui SteamVR potrebbe interferire.",
"skipsteam-description": "Impedisce a Steam di aprirsi automaticamente con Beat Saber, abilitalo se stai usando un VR runtime differente come WiVRn o Monado con cui SteamVR potrebbe interferire.",
"map-editor": "Map Editor",
"map-editor-description": "Avvia il map editor di Beat Saber ufficiale invece del gioco.",
"proton-logs": "Log di Proton",
@@ -142,7 +142,7 @@
"status": {
"no-wineprefix": "Impossibile trovare il percorso del WINEPREFIX di BSManager. Per favore avvia prima Beat Saber in BSManager.",
"beatmods-down": "Beatmods non è attualmente raggiungibile. Riprova più tardi. Se il problema persiste, informaci su {links}.",
"unknown": "È accaduto un errore sconosciuto ¯\\_(ツ)_/¯"
"unknown": "Si è verificato un errore sconosciuto ¯\\_(ツ)_/¯"
},
"buttons": {
"more-infos": "Più info",
@@ -163,8 +163,8 @@
}
},
"mod-item": {
"this-is-a-large-mod": "Questo è un mod grande!",
"this-is-a-very-large-mod": "Questo è un mod molto grande!"
"this-is-a-large-mod": "Questa è una mod grande!",
"this-is-a-very-large-mod": "Questa è una mod molto grande!"
}
},
"notifications": {
@@ -174,9 +174,9 @@
},
"outdated-mods": {
"title": "Mod obsoleto",
"title-plural": "Mod obsoleti",
"description": "Il mod {name} è obsoleto. Vuoi aggiornarlo?",
"description-plural": "Questa versione ha {nb} mod obsoleti. Vuoi aggiornarli?",
"title-plural": "Mod obsolete",
"description": "La mod {name} è obsoleta. Vuoi aggiornarla?",
"description-plural": "Questa versione ha {nb} mod obsolete. Vuoi aggiornarle?",
"dont-remind-me": "Non ricordarmelo",
"update": "Aggiorna"
}
@@ -317,7 +317,7 @@
"modal": {
"title": "Riavvio Necessario",
"body": "Cambiare l'impostazione dell'accelerazione hardware causerà un riavvio di BSManager. Sei sicuro di voler procedere?",
"confirm-btn": "Si, sono sicuro"
"confirm-btn": "Sì, sono sicuro"
},
"error-notification": {
"message": "C'è stato un errore, impossibile disattivare l'accelerazione hardware."
@@ -329,7 +329,7 @@
"modal": {
"title": "Permesso Symlink",
"body": "Quando crei dei Symlink, BSManager richiederà accesso amministrativo o la modalità sviluppatore sul tuo sistema. Sei sicuro di voler continuare?",
"confirm-btn": "Si, sono sicuro"
"confirm-btn": "Sì, sono sicuro"
},
"error-notification": {
"message": "C'è stato un errore, impossibile cambiare le impostazioni di Symlinks."
@@ -371,7 +371,7 @@
"file-not-supported": "File non supportato"
},
"msg": {
"operation-running": "Attendi che l'operazione corrente finisca, poi, prova di nuovo.",
"operation-running": "Attendi che l'operazione corrente finisca, poi riprova.",
"no-internet": "Controlla la tua connessione e riprova.",
"file-not-supported": "Solo i file {types} sono supportati."
}
@@ -476,7 +476,7 @@
"transfer-failed": "Trasferimento fallito 😕"
},
"descs": {
"COPY_TO_SUBPATH": "La cartella di destinazione non puo essere una sotto cartella della cartella di origine.",
"COPY_TO_SUBPATH": "La cartella di destinazione non puo essere una sottocartella della cartella di origine.",
"restore-linked-folders": "C'è stato un errore durante il ripristino delle cartelle condivise. Puoi sempre ripristinarle manualmente via il menu 'Cartelle Condivise' nella pagina delle versioni."
}
}
@@ -528,7 +528,7 @@
"SKIPPING_STEAM_LAUNCH": "Saltando l'avvio di Steam..."
},
"msg": {
"BS_LAUNCHING": "Non scordardi ti riscaldarti 😉",
"BS_LAUNCHING": "Non scordarti di riscaldarti 😉",
"STEAM_LAUNCHING": "Beat Saber si avvierà automaticamente dopo Steam.",
"SKIPPING_STEAM_LAUNCH": "Spero che sai cosa stai facendo :)"
}
@@ -758,7 +758,7 @@
"password": {
"label": "Password",
"placeholder": "Inserisci la password",
"max-length-warning": "La password eccede i 64 caratteri! Se la password è invalida, prova ad entrare con solo i primi 64 caretteri."
"max-length-warning": "La password eccede i 64 caratteri! Se la password è invalida, prova ad entrare con solo i primi 64 caratteri."
},
"qr": {
"label": "O con un codice QR",
@@ -1324,7 +1324,7 @@
},
"dateformat": {
"dayNames": ["Dom", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab", "Domenica", "Lunedì", "Martedì", "Mercoledì", "Giovedì", "Venerdì", "Sabato"],
"monthNames": ["Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic", "Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Augosto", "Settembre", "Ottobre", "Novembre", "Dicembre"],
"monthNames": ["Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic", "Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"],
"timeNames": ["a", "p", "am", "pm", "A", "P", "AM", "PM"]
}
}
Binary file not shown.
Binary file not shown.
+3
View File
@@ -0,0 +1,3 @@
[tools]
node = "24"
rust = "1.93"
-3
View File
@@ -248,8 +248,5 @@
".erb/dll/**"
],
"logLevel": "quiet"
},
"volta": {
"node": "24.11.1"
}
}
-2
View File
@@ -19,7 +19,5 @@ export const HTTP_STATUS_CODES = constants;
// Linux related stuff
export const PROTON_BINARY_PREFIX = "proton";
export const WINE_BINARY_PREFIX = path.join("files", "bin", "wine64");
export const IS_FLATPAK = process.env.container === "flatpak";
+46 -10
View File
@@ -1,7 +1,7 @@
import fs from "fs-extra";
import log from "electron-log";
import path from "path";
import { BS_APP_ID, BS_EXECUTABLE, IS_FLATPAK, PROTON_BINARY_PREFIX, WINE_BINARY_PREFIX } from "main/constants";
import { BS_APP_ID, BS_EXECUTABLE, IS_FLATPAK } from "main/constants";
import { InstallationLocationService } from "./installation-location.service";
import { StaticConfigurationService } from "./static-configuration.service";
import { CustomError } from "shared/models/exceptions/custom-error.class";
@@ -22,10 +22,19 @@ export class LinuxService {
return LinuxService.instance;
}
private readonly PROTON_BINARY_PREFIX = "proton";
// Use "wine64" instead of "wine"
// https://github.com/Zagrios/bs-manager/pull/586#issuecomment-2449228826
private readonly WINE_BINARY_PREFIXES = [
path.join("files", "bin", "wine64"),
path.join("files", "lib", "wine", "x86_64-unix", "wine64"),
];
private readonly installLocationService: InstallationLocationService;
private readonly staticConfig: StaticConfigurationService;
private nixOS: boolean | undefined;
private winePath = "";
private constructor() {
this.installLocationService = InstallationLocationService.getInstance();
@@ -55,7 +64,7 @@ export class LinuxService {
}
const protonPath = path.join(
this.staticConfig.get("proton-folder"),
PROTON_BINARY_PREFIX
this.PROTON_BINARY_PREFIX
);
if (!fs.pathExistsSync(protonPath)) {
throw CustomError.fromError(
@@ -93,6 +102,7 @@ export class LinuxService {
"SteamEnv": "1",
// Fix reflections in Monado
"OXR_PARALLEL_VIEWS": "1",
"OXR_NO_TEXTURE_SOURCE_ALPHA": "1",
};
if (launchOptions.launchMods?.includes(LaunchMods.PROTON_LOGS)) {
@@ -112,27 +122,53 @@ export class LinuxService {
protonFolder = this.staticConfig.get("proton-folder");
}
const protonPath = path.join(protonFolder, PROTON_BINARY_PREFIX);
const winePath = path.join(protonFolder, WINE_BINARY_PREFIX);
return fs.pathExistsSync(protonPath) && fs.pathExistsSync(winePath);
// Check if the proton binary exists
const protonPath = path.join(protonFolder, this.PROTON_BINARY_PREFIX);
if (!fs.pathExistsSync(protonPath)) {
return false;
}
// Check if any wine64 here exists
for (const winePath of this.WINE_BINARY_PREFIXES) {
if (fs.pathExistsSync(path.join(protonFolder, winePath))) {
// Reset this, in the case where the user reselects a new proton folder
this.winePath = "";
return true;
}
}
return false;
}
public getWinePath(): string {
if (this.winePath) {
return this.winePath;
}
if (!this.staticConfig.has("proton-folder")) {
throw new Error("proton-folder variable not set");
}
const winePath = path.join(
this.staticConfig.get("proton-folder"),
WINE_BINARY_PREFIX
);
if (!fs.pathExistsSync(winePath)) {
const protonFolder = this.staticConfig.get("proton-folder");
let winePath = "";
for (const prefixes of this.WINE_BINARY_PREFIXES) {
winePath = path.join(protonFolder, prefixes);
if (!fs.pathExistsSync(winePath)) {
winePath = "";
continue;
}
break;
}
if (winePath === "") {
throw new Error(`"${winePath}" binary file not found`);
}
this.winePath = winePath;
return winePath;
}
// Should be different from winePath, this is the "WINEPREFIX" env var
// that points to the wine windows files directory
public getWinePrefixPath(): string {
const compatDataPath = this.getCompatDataPath();
return fs.existsSync(compatDataPath)
@@ -1,9 +1,5 @@
import ElectronStore from "electron-store";
import { pathExistsSync } from "fs-extra";
import path from "path";
import { PROTON_BINARY_PREFIX, WINE_BINARY_PREFIX } from "main/constants";
import { Observable, Subject } from "rxjs";
import { CustomError } from "shared/models/exceptions/custom-error.class";
import { BSVersion } from "shared/bs-version.interface";
import { AutoUpdate } from "shared/models/config";
@@ -40,16 +36,6 @@ export class StaticConfigurationService {
}
public async set<K extends StaticConfigKeys>(key: K, value: StaticConfigKeyValues[K]): Promise<void> {
// Validate the setters
switch (key) {
case "proton-folder":
this.validateProtonFolder(value as string);
break;
default:
break;
}
this.store.set(key, value);
if (this.watchers[key]) {
@@ -57,16 +43,6 @@ export class StaticConfigurationService {
}
}
// Setters with validation
private validateProtonFolder(protonFolder: string): void {
const protonPath = path.join(protonFolder, PROTON_BINARY_PREFIX);
const winePath = path.join(protonFolder, WINE_BINARY_PREFIX);
if (!pathExistsSync(protonPath) || !pathExistsSync(winePath)) {
throw new CustomError("Invalid proton folder path", "invalid-folder");
}
}
public delete<K extends StaticConfigKeys>(key: K): void {
this.store.delete(key);
}