Compare commits

..

585 Commits

Author SHA1 Message Date
MathieuG-P 6e3d8852de update certificate sha 2024-12-01 19:59:12 +01:00
MathieuG-P e2c2aa7a84 update to 1.5.0-alpha.5 2024-12-01 19:53:33 +01:00
MathieuG-P 2a0de5f2ad update to 1.5.0-alpha.5 2024-12-01 19:52:55 +01:00
MathieuG-P 214f0494c1 Merge pull request #677 from Zagrios/bugfix/error-when-verifying-bs-files
[bugfix] Fix DepotDownloader error when verifying bs files
2024-12-01 19:48:58 +01:00
MathieuG-P 19f2a57c37 [bugfix] Fix DepotDownloader error when verifying bs files 2024-12-01 19:43:14 +01:00
MathieuG-P 922bcf30b4 Build flatpak in the build action 2024-12-01 14:54:09 +01:00
MathieuG-P f31ade5754 Change the app id 2024-12-01 13:09:58 +01:00
MathieuG-P c8e4d8c359 Merge pull request #676 from Zagrios/bugfix/mod-dependencies-are-not-always-installed
[bugfix] Mod dependencies are not always installed
2024-12-01 12:38:37 +01:00
MathieuG-P fc44dcba65 [bugfix] Mod dependencies are not always installed 2024-12-01 12:33:09 +01:00
MathieuG-P b02311456f Add "--publish never" for the package script 2024-12-01 10:22:54 +01:00
MathieuG-P 5462c8821e Merge pull request #629 from silentrald/bugfix/627
[bugfix-627] build BSM with deb and flatpak for linux
2024-11-30 20:02:27 +01:00
silentrald 4afad63753 [chore-627] added electron-builder.config.js to release-linux.yaml 2024-11-29 05:23:19 +08:00
silentrald 438611f4ca [bugfix-627] added original Beat Saber location in flatpak permissions 2024-11-29 05:23:19 +08:00
silentrald 1fdf1f0247 [bugfix-627] fix bsmSpawn for launching game on windows 2024-11-29 05:23:12 +08:00
MathieuG-P 877879f335 Merge pull request #673 from Zagrios/chore/add-bs-version-outated-alert-in-version-view
[chore] added a beat saber version outdated warning in the version view
2024-11-24 21:33:15 +01:00
MathieuG-P 7b658de727 [chore] added a beat saber version outdated warning in the version view 2024-11-24 21:26:47 +01:00
MathieuG-P 229a149f00 Merge pull request #671 from Zagrios/bugfix/close-btn-supporters-view-wrong-color
[bugfix] Close button in the supporters view had the wrong color in the white theme
2024-11-22 22:57:53 +01:00
MathieuG-P be2597fc85 [bugfix] Close button in the supporters view had the wrong color in the white theme 2024-11-22 22:50:23 +01:00
MathieuG-P c8d888ee1a Merge pull request #669 from AltyFox/patch-2
That was a quick recommendation change.
2024-11-22 08:04:08 +01:00
Alteran 9033b1ef8f That was a quick recommendation change. 2024-11-21 23:08:35 -06:00
MathieuG-P 4a9f79c561 1.39.0 is the recommended version 2024-11-21 21:07:19 +01:00
silentrald 5721891e28 [chore-627] fixed actions with electron-builder 2024-11-22 00:57:31 +08:00
silentrald cba001dc97 [test-627] added test cases for os.helpers.ts 2024-11-22 00:57:31 +08:00
silentrald 38ea360ee6 [bugfix-627] support host calls for flatpak with spawn/exec
* created wrapper calls for spawn and exec for all os support
* refactored names for isProcessRunning, getProcessId, and isSteamRunning
2024-11-22 00:57:31 +08:00
silentrald 8096b3ec76 [chore-627] fix issue with chrome-sandbox permissions 2024-11-22 00:57:31 +08:00
MathieuG-P 8844e7cec3 [bugfix-627] Fix couldn't package and/or publish on windows 2024-11-22 00:57:31 +08:00
silentrald 403995612c [chore] added silentrald and Insprill in credits and linux installation in README file 2024-11-22 00:57:31 +08:00
silentrald 58656294df [bugfix-627] added finer permissions for flatpak
handled issue with write only directory with bs-versions.json
2024-11-22 00:57:31 +08:00
silentrald 84ea7a26b6 [bugfix-627] fixed issue with running the BS exe in flatpak
moved all launching logic to the LinuxService
2024-11-22 00:57:31 +08:00
silentrald 82a19c0c8b [docs-627] updated docs on review
- updated flatpak installation
- moved deb and AUR above flatpak so users with appropriate distros will install those first
- idiot-proofing on how to install flatpak on different distros
2024-11-22 00:57:31 +08:00
silentrald 15f8d83c8d [chore-627] drop rpm and pacman in favor of flatpak 2024-11-22 00:57:31 +08:00
silentrald 196bdc04f5 [docs-627] removed wine installation and updated proton setup 2024-11-22 00:57:31 +08:00
silentrald e6bdf56c6d [chore] move build config to electron-builder.ts for better typing 2024-11-22 00:57:31 +08:00
silentrald 7a85171cd3 [docs] added linux documentation 2024-11-22 00:57:31 +08:00
silentrald 38e0cc56d0 [chore] add write permissions to bs-versions.json after install 2024-11-22 00:57:31 +08:00
silentrald a345a3ee7c [bugfix-627] reverted #577 PR 2024-11-22 00:57:31 +08:00
silentrald cb121a9442 [chore] change target builds to deb, rpm, and pacman 2024-11-22 00:57:31 +08:00
MathieuG-P fd30709af9 Merge pull request #667 from Zagrios/bugfix/do-no-apply-no-yeet-on-original-copies-of-bs
[bugfix] Do not launch BS with the --no-yeet arg when launching original copies of BS (Steam/Oculus)
2024-11-20 20:54:02 +01:00
MathieuG-P c73bde2cd9 Merge pull request #666 from Zagrios/feature/add-unselect-all-mods-button
[feature] add "unselect all" action in mods panel
2024-11-20 20:49:50 +01:00
MathieuG-P 3027331924 [bugfix] Do not apply --no-yeet on original copies of BS (Steam/Oculus) 2024-11-20 20:49:23 +01:00
MathieuG-P 66bab1176b [feature] add unselect all action in mods panel 2024-11-20 20:11:31 +01:00
Iluhadesu 6c6d47333d Add v1.39.1 to bs-versions.json 2024-11-20 18:48:14 +00:00
MathieuG-P c9286c5419 Merge pull request #661 from beatmaps-io/master
Use correct beatsaver api url
2024-11-18 19:38:11 +01:00
MathieuG-P 39739dfb49 Merge pull request #662 from beatmaps-io/default-bsv-map-sort
Set default beat saver map sort order to Relevance
2024-11-18 19:32:56 +01:00
Thomas Cheyney 5d4f12f72f Set default sort order to Relevance 2024-11-18 16:31:51 +00:00
Thomas Cheyney 7b1defcb76 Use correct beatsaver api url 2024-11-18 16:13:42 +00:00
MathieuG-P f7f5f768fc Merge pull request #649 from silentrald/bugfix/non-standard-zip-extraction
[bugfix] handle extracting non-conformant zip files
2024-11-17 13:10:15 +01:00
MathieuG-P 9340f4635d [bugfix] renormalize 2024-11-17 12:57:07 +01:00
MathieuG-P 5aacb34ef4 [bugfix] all zips as binary 2024-11-17 12:54:21 +01:00
MathieuG-P 4ee3f472ec [bugfix] remove matchesGlob 2024-11-17 12:32:45 +01:00
MathieuG-P 59b7b9aedb [bugfix] some adjutments + some fixes + add zip tests 2024-11-17 12:20:50 +01:00
MathieuG-P e1f421831b Merge pull request #657 from LiamillionSS/bugfix/527
[bugfix/527] Prevents oculus version from launching if the original oculus version is not present
2024-11-17 09:14:53 +01:00
LiamillionSS 4f42b3ffcf [bugfix/527] better wording for user messages 2024-11-17 18:18:35 +11:00
MathieuG-P a4192ef411 Merge branch 'master' into bugfix/527 2024-11-16 20:17:28 +01:00
MathieuG-P 2744df6803 fix json error 2024-11-16 20:04:05 +01:00
MathieuG-P c4ee9ba155 Add patreon 2024-11-16 20:02:46 +01:00
MathieuG-P 5e981e5a20 Merge pull request #659 from izunya/master
[Transation] Correction of awkward Korean :D
2024-11-16 19:52:04 +01:00
MathieuG-P 578e79edac Merge pull request #660 from chk1/bugfix/658
[bugfix-658] Change background color of Mods search box for light mode
2024-11-16 19:48:54 +01:00
silentrald 07d94962c4 [chore] fixed sonarqube issues 2024-11-16 09:42:58 +08:00
Christoph Kisfeld 57cd955780 [bugfix-658] Change background color of Mods search box for light mode 2024-11-15 20:07:31 +01:00
izunya 1b33b29847 Fix korean 2024-11-16 03:42:26 +09:00
izunya f523e34867 Fix korean 2024-11-16 03:32:37 +09:00
LiamillionSS 5de1b7c3fb Updated Oculus must-be-installed-once msg 2024-11-15 09:43:25 +11:00
LiamillionSS 2f4bca108b [bugfix/527] Prevents a downloaded oculus version from launching the original oculus version is not present 2024-11-15 07:18:29 +11:00
silentrald bfb6d28a34 [bugfix] use YauzlZip class wrapper for extracting files
* fixed issue where yauzl just closes after reading all files
2024-11-14 14:24:45 +08:00
MathieuG-P 8c6f3b0aa8 [bugfix] Create YauzlZip class to manager zip extraction (not finished) 2024-11-14 00:52:52 +01:00
Iluhadesu 6bb90c580d Add v1.39.0 to bs-versions.json 2024-11-12 16:58:16 +00:00
MathieuG-P 4bf2da1065 Merge pull request #652 from LiamillionSS/bugfix/452
[bugfix-452] fix to "launch game when steam is not running" on linux
2024-11-12 15:40:29 +01:00
MathieuG-P e17b7f70fd Merge pull request #654 from Zagrios/chore/add-outdate-bs-version-warn-modal
[chore] Added a pre-download warning modal for outdated BS versions
2024-11-12 15:25:40 +01:00
MathieuG-P 99b5dcd527 [chore] Added a pre-download warning modal for outdated BS versions 2024-11-12 15:20:48 +01:00
MathieuG-P 6c39e5f43d Merge pull request #653 from Zagrios/chore/add-beatleader-icon-to-playlist-oneclickt-setting
[chore] Added beatleader icon to playlist oneclick setting + change tippys color
2024-11-11 14:06:38 +01:00
MathieuG-P 58788b0ebc Added beatleader icon to playlist oneclick setting + change tippys color 2024-11-11 13:58:42 +01:00
LiamillionSS db616c6bd7 [bugfix-452] PROCESS_NAME now uses steam-runtime-launcher-service on linux to avoid steamProcessRunning false positives 2024-11-10 19:20:46 +11:00
silentrald 0fd4d51898 [bugfix] fixed logic with folder extraction events 2024-11-10 15:36:03 +08:00
silentrald d0831f2e44 [bugfix] created a get files' buffer from zip helper 2024-11-10 11:23:13 +08:00
LiamillionSS c54d1491e6 [bugfix-452] fix to launch game when steam is not running on linux 2024-11-10 00:57:28 +11:00
silentrald dd08f418d5 [chore] removed jszip and node-stream-zip packages 2024-11-09 01:28:43 +08:00
silentrald 2b37972dd4 [bugfix] use yauzl for extracting map files for importing maps 2024-11-09 00:55:52 +08:00
silentrald 68559add5d [bugfix] use yauzl for extracting zips 2024-11-09 00:55:52 +08:00
MathieuG-P 7c6c6147a6 Merge pull request #647 from Zagrios/bugfix/fix-ip-family-issues
[bugfix] Fix ipv4/ipv6 issues
2024-11-07 20:32:36 +01:00
MathieuG-P 0a1b1752f0 [bugfix] implement rety strategie for ip families 2024-11-07 20:24:48 +01:00
MathieuG-P f594b0900f [bugfix] try fix ip family issues with dnslookup 2024-11-06 16:47:26 +01:00
MathieuG-P 5cbc480e24 Merge pull request #646 from Zagrios/revert/changelogs-modal
[revert] revert changelogs modal feature
2024-11-06 15:40:33 +01:00
MathieuG-P 8208874527 [revert] delete changelogs.json 2024-11-06 15:28:59 +01:00
MathieuG-P 2d2fbec858 [revert] revert changelogs modal | was too buggy + It was too much work to create a changelog; we wouldn't have done it more than once 2024-11-06 15:26:49 +01:00
MathieuG-P d5f2ba3b21 Merge pull request #645 from Zagrios/bugfix/fix-oneclick-download-playlist-broken
[bugfix] Fix broken oneclick playlist download + issue with specials chars in playlists filenames
2024-11-05 20:42:23 +01:00
MathieuG-P 9e60dc4e0e [bugfix] prevent bug with special chars when using "preferContentDisposition" 2024-11-05 20:34:26 +01:00
MathieuG-P 57e1029b75 [bugfix] Unable to download playlist if its filename was containing special chars 2024-11-05 20:33:18 +01:00
MathieuG-P 0d913641d7 [bugfix] do not encode url query params 2024-11-05 20:32:23 +01:00
MathieuG-P b7eb136395 Merge pull request #644 from izunya/master
[Bugfix&Add-#641] Added kr translations | Text wrap bug and incorrect translation of "Curated"
2024-11-05 20:03:08 +01:00
izunya a79a6c2c13 Added kr translations | Text wrap bug and incorrect translation of "Curated" 2024-11-06 03:40:11 +09:00
izunya d01edbe2a8 Text wrap bug and incorrect translation of "Curated" 2024-11-06 03:18:24 +09:00
MathieuG-P 893b244eb1 Merge pull request #586 from silentrald/feat/578
[feat-578] remove dotnet and screen dependency on linux
2024-11-05 14:39:11 +01:00
MathieuG-P b45c37d774 Merge pull request #641 from izunya/master
[Transation] Add Korean Languages
2024-11-05 14:04:30 +01:00
MathieuG-P c18acb5fed Update korea-icon.component.tsx 2024-11-05 13:42:48 +01:00
izunya 7211798c74 some update pls 2024-11-05 07:30:27 +09:00
izunya 589904f813 korean locale add 2024-11-05 07:19:23 +09:00
MathieuG-P 8181cb3eec Merge pull request #640 from Zagrios/chore/remove-broken-models-notification
[chore] remove the "Broken models" notification
2024-11-04 20:13:50 +01:00
MathieuG-P ec09ee257c [chore-640] remove unused import 2024-11-04 20:09:31 +01:00
MathieuG-P d378aea1e7 [chore] remove "models broken" notification 2024-11-04 20:07:13 +01:00
silentrald b04f199fff [feat-578] simplified getting the wine binary 2024-11-02 10:48:13 +08:00
MathieuG-P 83f23c5c16 [chore] Add support for mapinfo v3 (which is essentially the same thing as version 2) 2024-11-02 00:25:38 +01:00
MathieuG-P 6666685c43 Merge pull request #636 from Zagrios/bugfix/unable-to-load-bsm-files-if-path-to-bsm-contains-url-special-chars
[bugfix] Unable to load bsm's files if path to bsm contain url special chars
2024-11-01 17:35:11 +01:00
MathieuG-P e07aacc9e8 [bugfix] Unable to load bsm's files if path to bsm contains url special chars 2024-11-01 17:20:23 +01:00
MathieuG-P 681ddc6b0b Merge pull request #635 from Zagrios/bugfix/updating-naming-sheme-of-downloaded-maps-and-playlists
[bugfix] updating naming sheme of downloaded maps and playlists
2024-11-01 16:30:44 +01:00
MathieuG-P aa69b3c683 [bugfix] updating naming sheme of downloaded maps and playlists 2024-11-01 16:25:50 +01:00
MathieuG-P 599161b7b2 [578] Some adjustments 2024-10-29 21:24:56 +01:00
MathieuG-P ed1960c469 Merge pull request #628 from Zagrios/chore/remove-dlc-folder-from-default-shared-folders
[chore] remove DLC folder from default shared folders
2024-10-23 21:10:03 +02:00
MathieuG-P dc9e181c54 [chore] remove DLC folder from default shared folders 2024-10-23 20:52:57 +02:00
silentrald 77987181de [feat-578] open steam common folder for selecting a proton folder 2024-10-23 10:49:46 +08:00
silentrald 3812ea18e4 [feat-578] use installed wine first then fallback to proton's wine bin
* explicitly tell BSIPA where `Beat Saber.exe` is located
2024-10-23 09:34:11 +08:00
silentrald 3797c1b156 [refactor] unified choose folder text translation 2024-10-23 07:51:25 +08:00
silentrald a1082edcde [feat-578] added translations 2024-10-23 07:51:25 +08:00
silentrald de7a054f89 [feat-578] setup protonFolder on startup 2024-10-23 07:51:25 +08:00
silentrald 0398a957ad [feat-578] store protonFolder in static config
* changed protonPath to protonFolder
* log stdout for running bsipa executable
2024-10-23 07:51:21 +08:00
MathieuG-P 4a91fa04e7 Merge pull request #626 from Zagrios/bugfix/download-from-steam-all-errors-are-unknown-errors
[bugfix] Fixed all errors from depotdownloader was unknown errors
2024-10-22 22:09:28 +02:00
MathieuG-P af3e5d1a56 [bugfix] Fixed all errors from depotdownloader was unknown errors 2024-10-22 21:55:34 +02:00
MathieuG-P 7b4e6340ca Merge pull request #600 from silentrald/bugfix/remember-playlist-sort
[bugfix] remember option for map and playlist sorting
2024-10-22 20:00:58 +02:00
MathieuG-P 2e3febf66a [bugfix] added missing translations 2024-10-22 14:11:53 +02:00
MathieuG-P a5ff3482e5 [bugfix] added missing bl-ranked indicator on maps items 2024-10-22 14:08:04 +02:00
MathieuG-P 8de279ac90 Merge pull request #625 from Zagrios/chore/feat-move-create-playlist-button/521
[chore-521] Move create playlist action
2024-10-22 13:57:37 +02:00
MathieuG-P 0efc56f8d6 [chore-521] Move create playlist action 2024-10-22 13:45:10 +02:00
MathieuG-P b59c37ebbd add patreon 2024-10-19 09:06:35 +02:00
MathieuG-P ff194e724b [bugfix] fix potential issue when adding a map to a playlist 2024-10-18 15:59:07 +02:00
MathieuG-P ca636c86e6 Merge pull request #622 from Zagrios/bugfix/bug-advanced-launch-unable-to-be-deactivated/620
[bugfix-620] fix weird UX with advanced launch args
2024-10-18 15:54:46 +02:00
MathieuG-P 8b1117543e Merge pull request #621 from silentrald/bugfix/618
[bugfix-618] support json files for playlists
2024-10-18 15:54:07 +02:00
silentrald ef123d8513 [bugfix-618] support json files for playlists
* fixed some issues from #616
2024-10-18 21:39:48 +08:00
MathieuG-P 5aac3ba47e [bugfix-620] fix weird UX with advanced launch args 2024-10-18 15:01:10 +02:00
MathieuG-P d2f3bdf29a Merge pull request #619 from silentrald/bugfix/song-filters
[bugfix] updated tags to the correct names
2024-10-18 11:13:15 +02:00
MathieuG-P e70313f66a [bugfix-619] update translations 2024-10-17 20:13:37 +02:00
silentrald 70926283ff [bugfix] updated tags to the correct names
* fixed issue where enabledTags and excludedTags are appended to the query string
2024-10-18 00:45:57 +08:00
MathieuG-P 8357c09e9f Merge pull request #575 from silentrald/feat/75
[feat-75] support drag and drop for map zip files
2024-10-17 15:16:01 +02:00
MathieuG-P 21f97df788 [feature-75] fix regex 2024-10-17 14:00:06 +02:00
MathieuG-P 00d6d7de30 [feature-75] fix some sonarcloud issues + other potentials issues + add logs 2024-10-17 13:31:41 +02:00
MathieuG-P b10900618a [feature-75] update translations + fix error notification translations 2024-10-17 12:52:36 +02:00
MathieuG-P 9b8d6ddda0 [feature-75] rework fontend functions to import maps 2024-10-16 20:35:34 +02:00
MathieuG-P 4e6948693d [feature-75] update drop zone UI 2024-10-16 19:11:57 +02:00
MathieuG-P 6e3c65cced Merge pull request #616 from silentrald/bugfix/614
[bugfix-614] handle bplist source string within readPlaylistFromSource
2024-10-16 09:49:40 +02:00
silentrald c499fb83e7 [bugfix-614] handle bplist source string within readPlaylistFromSource
* refactored to just use bplistSource each time it gets passed into another function
* removed unused songCache variable
2024-10-16 13:38:20 +08:00
silentrald be347dc6ba [feat-75] removed unused variable 2024-10-16 08:33:57 +08:00
MathieuG-P 716f068adf [feat-75] way to much RAM was used + some indirect fixes 2024-10-16 08:12:04 +08:00
MathieuG-P e9d2cb1482 [feat-75] fix paths of dropped zips are undefined 2024-10-16 08:11:15 +08:00
silentrald 132394524e [feat-75] added fix on rebasing 1 2024-10-16 08:11:15 +08:00
silentrald 20499b821e [feat-75] fix issue with Windows pathing on jsZip pattern 2024-10-16 08:11:15 +08:00
silentrald 803842d579 [feat-75] use map hash for comparing 2024-10-16 08:11:15 +08:00
silentrald eb119a31f0 [feat-75] support import for maps exported by BSM 2024-10-16 08:11:13 +08:00
silentrald 9d4acea654 [feat-75] applied PR comments 1 2024-10-16 08:10:24 +08:00
silentrald 6a2f982292 [feat-75] add translations 2024-10-16 08:10:24 +08:00
silentrald 7c88ea46e0 [feat-75] support multiple drag and drop zip files for maps
fixed issue in map downloads where download listener in MapsDownloaderService was not being removed
2024-10-16 08:10:24 +08:00
silentrald 0f3de55e9e [feat-75] support drag and drop for map zip files 2024-10-16 08:10:21 +08:00
MathieuG-P d5b7dff7a9 Merge pull request #615 from Zagrios/feat/feat-schema-v4-support-for-mapssongs/607
[feat-607] add support for map info v4
2024-10-15 20:36:04 +02:00
MathieuG-P 7468554ea0 [feat-607] add support for map info v4 2024-10-15 20:29:56 +02:00
MathieuG-P 0d93c984be Add patreon 2024-10-15 16:20:44 +02:00
MathieuG-P 87f134ebb5 Merge pull request #609 from Zagrios/bugfix/update-depot-downloader
[bugfix] update DepotDownloader to fix connection to steam errors
2024-10-14 13:04:50 +02:00
MathieuG-P 8fe346b1a7 [bugfix] update depotdownloader to fix connection to steam errors 2024-10-13 19:57:43 +02:00
MathieuG-P e9ca4bb7ac For certificate verification 2024-10-13 11:19:27 +02:00
MathieuG-P eac6192afb nothing 2024-10-12 02:04:04 +02:00
MathieuG-P 679b28e44f [chore] new code sign certificate 2024-10-12 02:02:29 +02:00
MathieuG-P 36e95d0d96 1.38.0 as recommended 2024-10-11 20:33:53 +02:00
Iluhadesu 59bd480445 Add v1.38.0 to bs-versions.json 2024-10-08 15:24:05 +00:00
MathieuG-P d38a3b5720 Merge pull request #605 from Zagrios/feature/593/feat-cleanup-duplicate-songs
[feature-593] We can now delete duplicates maps
2024-10-06 18:42:28 +02:00
MathieuG-P 9d59bfb956 [feature-593] We can now delete duplicates maps 2024-10-06 18:22:28 +02:00
silentrald 50322b69cc [refactor] refactored DefaultConfig on client side to resemble typing in StaticConfig 2024-10-06 00:33:50 +08:00
silentrald fc212cecb4 [bugfix] remember option for map sorting 2024-10-06 00:13:57 +08:00
silentrald 3d6a9b59bf [bugfix] remember option for playlist sorting 2024-10-06 00:13:57 +08:00
MathieuG-P b97a58c278 Merge pull request #604 from Zagrios/bugfix/602/bug-error-linking-playlist-folder
[bugfix-602] fix link playlists error
2024-10-05 17:38:36 +02:00
MathieuG-P 6f55f4283d Merge pull request #598 from silentrald/chore/improve-feature-request
[chore] improved user experience for creating feature request
2024-10-05 17:38:23 +02:00
MathieuG-P 9ee33f2c7d Merge pull request #599 from silentrald/chore/linux-labeler
[chore] properly add correct label for linux
2024-10-05 17:37:47 +02:00
MathieuG-P 55f45e438c [bugfix-602] fix link playlists error 2024-10-05 17:29:34 +02:00
silentrald cce6b71993 [chore] improved user experience for creating feature request 2024-10-05 08:52:25 +08:00
silentrald 3d24e97abd [chore] properly add correct label for linux 2024-10-02 08:50:18 +08:00
MathieuG-P 1eea031438 Merge pull request #596 from silentrald/chore/improve-bug-reporting
[chore] improved user experience for bug reporting
2024-10-01 21:10:44 +02:00
MathieuG-P dcb45927a1 Merge pull request #597 from Zagrios/chore/remove-unnecessary-code-from-progress-bar-service
[chore] remove unnecessary code from progress bar service
2024-10-01 21:01:37 +02:00
MathieuG-P d234a504b5 Merge pull request #595 from silentrald/chore/discord-support-link
[chore] added discord link in issue template
2024-10-01 20:57:39 +02:00
MathieuG-P cac09cf032 [chore] remove unnecessary code from progress bar service 2024-10-01 20:51:53 +02:00
silentrald 6d6f7d492e [chore] improved user experience for bug reporting 2024-09-30 09:13:08 +08:00
silentrald 01bae7c59b [chore] added discord link in issue template 2024-09-30 08:25:48 +08:00
MathieuG-P db5af48250 [chore] remove unused functions 2024-09-29 19:46:53 +02:00
MathieuG-P 0576ea0159 Merge pull request #594 from Zagrios/chore/some-reworks-to-remove-watch-functions
[chore] Some reworks to remove watch functions
2024-09-29 19:41:59 +02:00
MathieuG-P f73ab4a6a4 [chore-594] remove unused import 2024-09-29 18:37:54 +02:00
MathieuG-P 501c0d9ae1 [chore] Some reworks to remove watch functions 2024-09-29 18:29:59 +02:00
MathieuG-P cc810ae84e Merge pull request #590 from silentrald/bugfix/585
[bugfix-585] fixed unicode song titles not showing in game
2024-09-28 13:09:26 +02:00
MathieuG-P 3533402197 Merge pull request #589 from silentrald/bugfix/broken-app-icon
[bugfix] show bsm icon properly
2024-09-28 12:22:53 +02:00
silentrald 03a8377773 [bugfix-585] fixed unicode song titles not showing in game
Added SteamEnv=1 in environment variable when launching the "Beat
Saber.exe" file
2024-09-25 21:46:09 +08:00
silentrald 138002d7a0 [bugfix] show bsm icon properly 2024-09-23 20:58:20 +08:00
MathieuG-P 18854650ab Merge pull request #588 from kevin-wijnen/master
[feature] Automating the wiki via GitHub Actions
2024-09-22 15:50:36 +02:00
MathieuG-P e51d47ac73 Merge pull request #587 from silentrald/feat/543
[feat-543] added notification when logging out
2024-09-22 15:42:27 +02:00
MathieuG-P 32bf20a55f [feature-543] add translations 2024-09-22 15:36:23 +02:00
Kevin Wijnen b702b33def Merge branch 'Zagrios:master' into master 2024-09-22 14:55:02 +02:00
MathieuG-P d74a730a04 [chore] update deps 2024-09-22 14:54:02 +02:00
Kevin Wijnen 793af822ce [docs] Specify how to contribute to the wiki 2024-09-22 14:33:42 +02:00
silentrald c05b9a4b8e [feat-543] added notification when logging out 2024-09-22 20:32:58 +08:00
Kevin Wijnen 883f7594b0 [bugfix] Trigger path for wiki automation 2024-09-22 14:32:23 +02:00
Kevin Wijnen 7161f0861e [bugfix] Target path for wiki automation 2024-09-22 14:30:28 +02:00
Kevin Wijnen 5f35a43098 [chore] Trigger wiki automation 2024-09-22 14:22:48 +02:00
Kevin Wijnen 63ef3acc72 [bugfix] Fix target branch wiki automation 2024-09-22 14:21:28 +02:00
Kevin Wijnen 3ff3c5af67 [docs] Add explainer for wiki automation 2024-09-22 14:19:23 +02:00
Kevin Wijnen 50ebef30fb Merge pull request #1 from kevin-wijnen/github-actions-docs
GitHub actions docs
2024-09-22 14:16:54 +02:00
Kevin Wijnen 6d6da765a6 [chore] wiki article migration 2024-09-22 14:14:44 +02:00
Kevin Wijnen 031312e90e Merge branch 'Zagrios:master' into github-actions-docs 2024-09-22 14:07:16 +02:00
Kevin Wijnen f0e32bdae1 [chore] Fix spelling 2024-09-22 14:06:00 +02:00
Kevin Wijnen 81071d920e [feature] GitHub Actions wiki automation
Initial concept for automating the BSManager Wiki via PR's to the docs/wiki folder.

Requires locking the Wiki's writing to none of the public, to prevent vandalism, desyncs and losing wiki-only information, with what is on the repository.
2024-09-22 14:05:03 +02:00
MathieuG-P ea320c0e08 remove lowerCase 2024-09-22 14:02:47 +02:00
MathieuG-P 8335494a9f Merge branch 'master' of https://github.com/Zagrios/bs-manager 2024-09-22 13:59:31 +02:00
MathieuG-P 96fc2b4efb Add labeler workflow for Linux issues 2024-09-22 13:59:28 +02:00
MathieuG-P 3280ca1984 Merge pull request #584 from silentrald/bugfix/modal-options-undefined
[bugfix] handle undefined modal options properly
2024-09-21 21:07:24 +02:00
silentrald aae23c18d6 [bugfix] handle undefined modal options properly 2024-09-21 22:46:54 +08:00
MathieuG-P 7a8eee9266 Merge pull request #582 from Zagrios/bugfix/playlist-download-status-not-updating
[bugfix] Downloading a playlist from its details modal was not updati…
2024-09-20 11:01:16 +02:00
MathieuG-P 757069d657 [bugfix] Downloading a playlist from its details modal was not updating the playlist's download status in the playlists list 2024-09-20 10:48:49 +02:00
MathieuG-P 15178f0e60 Merge branch 'master' of https://github.com/Zagrios/bs-manager 2024-09-19 21:42:52 +02:00
MathieuG-P 02d0aef497 [bugfix] fix overflow hidden causing weird blury issue 2024-09-19 21:42:50 +02:00
MathieuG-P ee6b49f028 Merge pull request #580 from Zagrios/feature/fix-version-issue
Feature/fix version issue
2024-09-19 13:56:48 +02:00
MathieuG-P 5c383b66a7 Merge pull request #581 from Zagrios/bugfix/487/bug-when-i-clone-the-version-weird-stuff-happens
[bugfix-487] Cloning a version was changing its color even if an error was occuring
2024-09-18 16:38:36 +02:00
MathieuG-P 50cef104f0 [bugfix-487] Cloning a version was changing its color even if an error was occurring 2024-09-18 14:56:34 +02:00
Shidorien 37a44b54f3 Skip showing changelog for alpha versions 2024-09-17 15:31:28 +02:00
Shidorien 0027832bdb Remove posibility to store alpha version in LastAppVersion and clear this var when user already stored an alpha version 2024-09-17 15:20:44 +02:00
MathieuG-P ad4da530eb bumb to 1.5.0-alpha.4 2024-09-16 22:07:15 +02:00
MathieuG-P e4a894f75a [bugfix] Choose content folder was asked after each restart of BSM + add a log 2024-09-16 22:06:59 +02:00
MathieuG-P 1a62ae67c9 add patreon 2024-09-12 21:11:06 +02:00
MathieuG-P 78951f0de1 [chore] temporary add my name in readme for code signing certificate verification 2024-09-11 20:45:58 +02:00
MathieuG-P fd52fb8d78 Merge pull request #566 from silentrald/feat/560
[feat-560] ask user for installation folder/path
2024-09-11 12:45:37 +02:00
MathieuG-P e14ba2727b [feature-560] translations 2024-09-10 21:18:46 +02:00
MathieuG-P f6cd2fc316 Merge pull request #577 from silentrald/bugfix/linux-bs-version-readonly
[bugfix] use static config for version list in linux
2024-09-10 20:25:18 +02:00
silentrald 57f0679f57 [bugfix] use static config for version list in linux 2024-09-10 00:47:25 +08:00
Iluhadesu d407b396cf Add v1.37.5 to bs-versions.json 2024-09-07 01:35:36 +00:00
Iluhadesu 4bfc00d698 Add v1.37.4 to bs-versions.json 2024-09-05 16:02:25 +00:00
silentrald bd371b56e1 [bugfix-560] don't move old installation path if it doesn't exist 2024-09-05 09:37:32 +08:00
MathieuG-P 7ae097b990 [feature-560] some adjustments 2024-09-04 20:45:28 +02:00
silentrald 9734d714d7 [refactor] created installation-location.service.ts on client side 2024-09-04 08:57:19 +08:00
silentrald 9c86adf2d4 [feat-560] applied PR comments 2024-09-04 08:52:43 +08:00
silentrald 6258de5b06 [feat-560] added description text and default button tooltip
added tooltip support in BsmButton component
2024-09-04 08:52:43 +08:00
silentrald d3c797041f [feat-560] delay song details cache loading after user setup is done
added check if ElectronStore is null
2024-09-04 08:52:40 +08:00
silentrald 5e6837b8cd [feat-560] ask user for installation folder/path 2024-09-04 08:21:26 +08:00
MathieuG-P eba2b6fb03 Add patreon 2024-09-02 23:17:03 +02:00
MathieuG-P 1b2b8baa48 Merge pull request #572 from Zagrios/feature/add-advanced-settings
[feature] add advanced settings
2024-09-01 22:58:40 +02:00
MathieuG-P 846945b75a [feature] fix sonarlint issues 2024-09-01 22:55:21 +02:00
MathieuG-P f84758c42d [feature] translate + simplify code 2024-09-01 22:46:08 +02:00
MathieuG-P 55aeab896c [feature] disable hardware acceleration and use symlinks work, just still need to translate 2024-09-01 18:08:03 +02:00
MathieuG-P ac62926f8d [feature] create toogle gid for advanced settings 2024-08-29 22:30:29 +02:00
MathieuG-P 98bfbfa868 remove console log 2024-08-29 19:37:16 +02:00
MathieuG-P 150efb1a5c nothing 2024-08-29 19:34:56 +02:00
Iluhadesu b68c84dd6a Bump Beat Saber recommended version to 1.37.1 2024-08-26 17:05:22 +00:00
MathieuG-P 3145d2fdfa Merge pull request #568 from Zagrios/bugfix/improve-folder-linking-reliability
[bugfix] Improve folder linking reliability
2024-08-25 16:32:22 +02:00
MathieuG-P dac67ebe4e [bugfix] dont move the folder if all subitem in the folder already exist in the destination 2024-08-25 16:21:04 +02:00
MathieuG-P aea325a254 [bugfix] Improve folder linking reliability 2024-08-25 15:03:08 +02:00
MathieuG-P 462499fe81 Merge pull request #567 from silentrald/bugfix/bsipa-linux
[bugfix] wrap dotnet cmdlet's path argument with double quotes for installing bsipa
2024-08-24 15:57:56 +02:00
silentrald f6f69e2f13 [bugfix] wrap dotnet cmdlet's path argument with double quotes for installing bsipa 2024-08-24 21:41:10 +08:00
MathieuG-P c7ac3f2d9c Merge pull request #564 from Zagrios/bugfix/mods-using-manifests-sometimes-was-not-recognised-as-installed
[bugfix] Sometime mods using manifests were not recognised as installed + remove dead code
2024-08-20 21:16:11 +02:00
MathieuG-P cb95d5d88d [bugfix] Sometime mods using manifests were not recognised as installed + remove dead code 2024-08-20 21:06:37 +02:00
MathieuG-P 388ad76780 Merge pull request #563 from Zagrios/bugfix/translate-all-mods-already-notification
[bugfix] translate all mods already notification
2024-08-19 21:12:23 +02:00
MathieuG-P be4afb71e3 Merge pull request #562 from joriskleiber/window-restore-icon
Add window restore icon
2024-08-19 20:35:35 +02:00
MathieuG-P 11ddfc29b5 [bugfix] translate all mods already notification 2024-08-19 20:30:06 +02:00
joriskleiber b1eaad8df0 add window restore icon 2024-08-19 20:20:15 +02:00
Iluhadesu 36fc7cb9e2 Remove the . in the version name once again... 2024-08-19 10:28:48 +00:00
Iluhadesu 8df9516c11 Add v.1.37.3 to bs-versions.json 2024-08-19 10:27:39 +00:00
MathieuG-P 6bd8727067 Merge pull request #559 from kgabriel-dev/chore/improved-german-language/544
Improving the German language file
2024-08-17 21:51:56 +02:00
GabiKleebi02 b620b11eb5 improve German language file 2024-08-12 22:23:09 +02:00
MathieuG-P 3ff3ec7410 Merge pull request #558 from Zagrios/bugfix/466/bsmanager-does-not-handle-mods-with-missing-dependencies-on-beatmods
[bugfix-466] fix potential crashs when beatmods mod has invalid dependencies
2024-08-12 21:02:57 +02:00
MathieuG-P 8f9b3405bc Merge pull request #557 from Zagrios/bugfix/520/bug-unselect-item-when-you-switch-tab
[bugfix-520] clear selected items when switching BS version tab
2024-08-12 20:54:53 +02:00
MathieuG-P 698058710f [bugfix-466] fix potential crashs when beatmods mod has invalid dependencies 2024-08-12 20:53:51 +02:00
MathieuG-P 5fbc69e772 [bugfix-520] clear selected items when switching BS version tab + remove a console log 2024-08-12 20:22:33 +02:00
MathieuG-P daa2f864cc Merge pull request #555 from Insprill/fix/linux-admin
Fix Steam elevated check on Linux
2024-08-12 19:10:34 +02:00
Pierce Thompson f073f66533 Fix Steam elevated check on Linux 2024-08-10 18:00:07 -04:00
MathieuG-P ff9bede111 Merge pull request #554 from Zagrios/bugfix/542/exclude-tag-result-in-javascript-error
[bugfix-542] Fix crash when exclude map tag when browsing for new maps
2024-08-10 15:37:55 +02:00
MathieuG-P 650338d25b [bugfix-542] Fix crash when exclude map tag when browsing for new maps 2024-08-10 15:34:07 +02:00
MathieuG-P be32418b93 nothing 2024-08-10 15:19:02 +02:00
MathieuG-P 3bb9250269 Merge pull request #553 from Zagrios/feature/550/feat-show-any-number-stats-for-unranked-maps-difficulty
[feature-550] When its possible display the NPS ou NJS of the map instead of just the difficulty
2024-08-10 15:16:37 +02:00
MathieuG-P 13da659c0d [feature-550] When its possible display the NPS ou NJS of the map instead of just the difficulty 2024-08-10 15:10:49 +02:00
MathieuG-P 9f4a133b74 Update package-lock.json and release/app/package-lock.json to version 1.5.0-alpha.3 2024-08-07 10:53:24 +02:00
MathieuG-P 25b647630f [chore] add step to install correct Node version in the contributing guide 2024-08-07 10:53:12 +02:00
Iluhadesu 373c6b979d Correct version typo because they can't type 2024-08-06 12:56:57 +00:00
Iluhadesu ded5b58020 Add v.1.37.2 to bs-versions.json 2024-08-06 12:55:33 +00:00
Zagrios 763b3c65f5 fix depotdownload on linux again 2024-08-04 15:20:12 +02:00
Zagrios ef69e64ad7 all file in script is binary 2024-08-04 15:13:56 +02:00
Zagrios d82b7bab54 fix depotdownloader on linux 2024-08-04 14:59:11 +02:00
Zagrios 095ceccc19 should fix depotdownload on linux 2024-08-04 14:36:06 +02:00
MathieuG-P 32e5ee98ad Merge pull request #547 from silentrald/fix/issue-546
[bugfix] exclude regedit-rs on externals when webpack bundles it in linux
2024-08-04 11:19:34 +02:00
silentrald b2a57ea307 [bugfix] exclude regedit-rs on externals when webpack bundles it in linux 2024-08-03 12:00:03 +08:00
MathieuG-P eb30400b7c update to 1.5.0-alpha.3 2024-08-01 01:06:38 +02:00
MathieuG-P 0fd1e211ba Merge pull request #541 from Zagrios/chore/filter-sensitive-data-in-logs
[chore] filter sensitive data in logs
2024-08-01 00:55:39 +02:00
MathieuG-P 64484bfd4e Merge branch 'master' into chore/filter-sensitive-data-in-logs 2024-08-01 00:51:27 +02:00
MathieuG-P 2e750f3d5a chore : use name instead of "_id" beacause BeatMods is broken 2024-07-30 22:29:58 +02:00
MathieuG-P e1c3115668 Merge pull request #540 from Zagrios/qol/dont-reinstall-all-mods-by-default
[qol] dont reinstall all mods by default
2024-07-29 21:32:57 +02:00
MathieuG-P a6462530bb [qol] reinstall all translations + fix buttons sizing 2024-07-29 21:11:14 +02:00
MathieuG-P 8316a9ef80 [qol] fix transform style not working 2024-07-29 20:31:06 +02:00
MathieuG-P 152313289c [qol] install only mods not already installed (not finished) 2024-07-28 21:40:09 +02:00
MathieuG-P c96ad6f7cd Merge branch 'master' into qol/dont-reinstall-all-mods-by-default 2024-07-28 19:46:43 +02:00
MathieuG-P b7cf3c5d20 Merge pull request #539 from Zagrios/chore/update-to-electron-31
[chore] update to electron 31 + update deps
2024-07-28 16:51:24 +02:00
MathieuG-P 97d3c2a3ae [chore] update to electron 31 + update deps 2024-07-28 16:41:16 +02:00
MathieuG-P a20ebe2075 Merge pull request #537 from Zagrios/bugfix/536/bug-no-maps-found-for-tag-dance
[bugfix-536] Fix dance-style filter
2024-07-27 16:12:00 +02:00
MathieuG-P 2f5a74b155 [bugfix-536] Fix dance-style filter 2024-07-27 16:06:07 +02:00
MathieuG-P a20c73d0e9 [qol] dont reinstall all mods by default (not finnished) 2024-07-27 15:51:06 +02:00
MathieuG-P aeca1c1e9e Merge pull request #535 from Zagrios/qol/dont-select-default-mods-when-mods-are-installed
[QOL] Do not reselect default mods when mods are already installed
2024-07-25 20:50:12 +02:00
MathieuG-P b9ce95968c Merge pull request #530 from Zagrios/feature/feature/small-addition-to-the-version-list
[bugfix] fix incorrect active state in shared nav bar item
2024-07-25 20:39:38 +02:00
MathieuG-P 490ccfdc1e [qol] Do not reselect default mods when mods are already installed 2024-07-24 15:45:35 +02:00
Shidorien 6d0c6b4f64 remove useless console.log 2024-07-23 21:13:22 +02:00
Shidorien 89c3b0906b fix little issue 2024-07-23 21:06:22 +02:00
Shidorien 8cd74c3b0b fix incorrect active state in shared nav bar item 2024-07-23 20:31:33 +02:00
MathieuG-P 769dab2896 Add changelog for 1.5.0-alpha.2 2024-07-22 18:26:13 +02:00
MathieuG-P 8f1f998c5a Update to 1.5.0-alpha.2 2024-07-22 17:59:22 +02:00
MathieuG-P 48d03cccbb Merge pull request #524 from Zagrios/bugfix/fix-timeout-when-downloading-maps-from-bsv
[bugfix] Downloading maps sometimes times out
2024-07-21 15:44:30 +02:00
MathieuG-P 7d54ae79f7 Merge pull request #523 from Zagrios/bugfix/unable-to-install-bsipa-when-its-path-contain-spaces
[bugfix] unable to install BSIPA if BSIPA path was containing spaces
2024-07-21 15:41:23 +02:00
MathieuG-P c46fdd56f6 Merge pull request #522 from Zagrios/bugfix/495/bug-custom-map-runtime-not-displaying-correctly-in-bsmanager
[bugfix] fix sometimes maps duration were wrong
2024-07-21 15:41:10 +02:00
MathieuG-P 22dc1ca511 [bugfix] fix timeout when downloading maps 2024-07-21 15:36:33 +02:00
MathieuG-P 709105b9f4 [bugfix] fixed : unable to install BSIPA if BSIPA path was containing spaces + wrong translation when bsipa was throwing errors 2024-07-21 14:53:49 +02:00
MathieuG-P 1c0cfb6b89 [bugfix] playlist duraction was always NaN 2024-07-21 14:10:30 +02:00
MathieuG-P 7ebc1bff16 [bugfix] fix sometimes maps duration were wrong 2024-07-21 14:09:14 +02:00
MathieuG-P 0e1cda5050 Merge pull request #517 from Zagrios/bugfix/playlist-maps-with-malformed-hash-doesnt-get-loaded
[bugfix] fix playlist maps with malformed hash doesnt get loaded + improve playlist maps reading reliability
2024-07-17 20:42:12 +02:00
MathieuG-P 331626bd1e Merge pull request #518 from Zagrios/bugfix/crash-when-changing-audio-volume
[bugfix] fix crash when changing audio volume
2024-07-17 20:41:31 +02:00
MathieuG-P ea62f2443f [bugfix-517] use regex.exec instead of .match 2024-07-17 20:35:31 +02:00
MathieuG-P 532ab08e46 [bugfix] fix crash when changing audio volume 2024-07-17 20:32:53 +02:00
MathieuG-P a6fa55719d [bugfix] fix playlist maps with malformed hash doesnt get loaded + improve playlist maps reading reliability 2024-07-17 20:26:54 +02:00
MathieuG-P 163857a14f Merge pull request #513 from Zagrios/bugfix/bsm-crashs-when-loading-playlists-with-an-invalid-playlist-file
[bugfix] Bsm crashs when loading playlists with an invalid playlist file
2024-07-15 21:54:53 +02:00
MathieuG-P 854e0e2761 Merge branch 'master' into bugfix/bsm-crashs-when-loading-playlists-with-an-invalid-playlist-file 2024-07-15 21:50:13 +02:00
MathieuG-P eba6f916a3 Merge pull request #514 from Zagrios/bugfix/read-playlists-in-sub-folders
[bugfix] Playlists in sub folders doesn't get loaded
2024-07-15 21:43:03 +02:00
MathieuG-P 9790f35749 [bugfix] Playlists in sub folders doesn't get loaded 2024-07-15 21:35:26 +02:00
MathieuG-P 93d3cbc8bf [bugfix] Bsm crashs when loading playlists with an invalid playlist file 2024-07-15 20:59:26 +02:00
MathieuG-P 51ea1b130b Merge pull request #512 from Zagrios/chore/update-changelog
Chore/update changelog
2024-07-15 15:58:10 +02:00
shidorien d020b72f20 Add web site button to ChangelogModal component 2024-07-15 15:51:19 +02:00
shidorien f2ac952cd9 Update changelogs.json with new features, fixes, and improvements 2024-07-15 15:23:38 +02:00
shidorien 189d2388fb add missing scrollbar 2024-07-15 15:16:42 +02:00
shidorien 1c989a2402 Update changelog for BSManager 1.5.0-alpha.1 release 2024-07-15 15:11:17 +02:00
shidorien 959e60127d Update changelog for BSManager 1.5.0-alpha.1 2024-07-15 15:08:22 +02:00
shidorien 0faa0f1288 Update changelog for BSManager 1.5.0-alpha.1 2024-07-15 15:00:53 +02:00
shidorien 5ad25f58d5 Update changelogs.json with BSManager 1.5.0-alpha.1 release 2024-07-15 14:57:39 +02:00
shidorien 8ace5e6a7a Add changelog fort 1.5.0-alpha.1 2024-07-15 14:46:14 +02:00
MathieuG-P 185d01e7b4 version to 1.5.0-alpha.1 2024-07-14 22:34:29 +02:00
MathieuG-P 755e407372 Merge pull request #511 from Zagrios/bugfix/bsipa-installation-never-throw-error-even-if-bsipa-process-errors
[bugfix] During the BSIPA installation, no errors are displayed, even if BSIPA generates errors
2024-07-14 21:27:01 +02:00
MathieuG-P 4f123b69ef [bugfix] bsipa installation never show error even if bsipa throw errors 2024-07-14 21:22:25 +02:00
MathieuG-P 7e2334f8fc Merge pull request #509 from Insprill/fix/linux-build
Fix Linux build & crash on startup
2024-07-14 17:46:13 +02:00
MathieuG-P 5be533ccfb chore: Update Linux publishing command in package.json 2024-07-14 17:32:45 +02:00
MathieuG-P b8eafd5f9b chore: Update Linux publishing command in package.json 2024-07-14 17:23:19 +02:00
MathieuG-P 3f3bb959c4 Merge branch 'github-action/build-linux' 2024-07-14 17:17:21 +02:00
MathieuG-P f30cad74d7 chore: Add GitHub Actions workflow for releasing Linux 2024-07-14 17:15:31 +02:00
MathieuG-P ede82393da chore: update category in package.json 2024-07-14 17:11:19 +02:00
MathieuG-P 9ee468af03 add icons for linux 2024-07-14 16:41:07 +02:00
MathieuG-P c4d5db809b build for linux 2024-07-14 15:52:51 +02:00
Pierce Thompson 8ecc9d30b3 Fix Linux build 2024-07-13 15:13:15 -04:00
MathieuG-P ca722b2a18 fix displaying "no playlist found" when playlists is loading 2024-07-13 18:50:12 +02:00
MathieuG-P c219e9655d update deps 2024-07-13 18:45:50 +02:00
MathieuG-P a6c1ba9fee Merge pull request #508 from Zagrios/qol/mods-load-faster
[QOL] Mods load faster
2024-07-13 17:31:03 +02:00
MathieuG-P 6e9ea1bd9a Merge branch 'master' into qol/mods-load-faster 2024-07-13 17:21:48 +02:00
MathieuG-P 84f27d571b nothing 2024-07-13 17:21:32 +02:00
MathieuG-P 51549161cd [qol] change use hash cache to load installed mods faster 2024-07-13 17:17:43 +02:00
MathieuG-P 198002238e change recommended version to 1.37.0 2024-07-13 15:58:03 +02:00
MathieuG-P ae0ad4d2f6 Merge pull request #507 from Zagrios/qol/display-bs-version-when-no-mods-are-available
[qol] Display version string when saying "No mods available for this …
2024-07-11 21:51:46 +02:00
MathieuG-P e470782bea [qol] Display version string when saying "No mods available for this version of Beat Saber" 2024-07-11 21:46:00 +02:00
MathieuG-P b440c1b9e9 Merge pull request #506 from Zagrios/bugfix/499/cannot-uninstall-versions
[bugfix-499] unable to uninstall a bs version
2024-07-11 21:37:26 +02:00
MathieuG-P 163b95ff26 [bugfix-499] unable to uninstall a bs version 2024-07-11 21:28:28 +02:00
MathieuG-P 6fa3b95f32 Merge pull request #505 from Zagrios/v1.5.0
v1.5.0
2024-07-11 21:11:03 +02:00
MathieuG-P 773432a407 [playlist] fix error when cloning a playlist and some songs are missing 2024-07-11 20:58:37 +02:00
MathieuG-P 45bab6ccce Fix some sonarcloud issues 2024-07-11 20:57:30 +02:00
Iluhadesu 748b75ef3b Add v1.37.1 to bs-versions.json 2024-07-11 15:27:02 +00:00
MathieuG-P 116e4d77fa Fix lint errors 2024-07-10 21:30:05 +02:00
MathieuG-P c1322c4ed7 fix npm run lint 2024-07-10 20:26:50 +02:00
MathieuG-P f2ecd34672 Not blur models when they are installed 2024-07-10 20:26:41 +02:00
MathieuG-P 657a683d13 Merge pull request #451 from Insprill/feature/linux-launch
Add support for launching Beat Saber on Linux
2024-07-10 19:38:39 +02:00
MathieuG-P 0f038ccdc2 Merge pull request #503 from Zagrios/feature/playlists/107
Feature/playlists/107
2024-07-05 20:28:03 +02:00
MathieuG-P 6d38985581 [feature-107] some fixes 2024-07-04 21:25:36 +02:00
MathieuG-P 0edee845d7 Add patreon 2024-07-03 11:39:29 +02:00
MathieuG-P 517db1d056 [feature] fix light theme issues 2024-07-01 20:54:10 +02:00
MathieuG-P 65bf528a11 [feature-107] translations 2024-06-30 16:03:06 +02:00
MathieuG-P 07e32df91a add japanese dateformat 2024-06-29 21:38:03 +02:00
MathieuG-P 05a4386479 [feature-107] remove useless things 2024-06-28 07:45:44 +02:00
MathieuG-P 8c242e607b add patreon 2024-06-27 22:06:24 +02:00
MathieuG-P a721c16c85 [feature-107] Add loading/empty state texts for lists in playlist creation + minor fixes 2024-06-24 21:03:21 +02:00
MathieuG-P 0957080e22 [feature-107] Change the color of highlighted difficulties + other minor fixes 2024-06-24 19:51:17 +02:00
MathieuG-P 3427cae437 [feature-107] add diffictulties hightlight for playlist maps 2024-06-22 19:40:49 +02:00
MathieuG-P 33be4de2ff [feature-107] add drag and drop to playlist maps 2024-06-21 21:08:41 +02:00
MathieuG-P d83507a865 Merge pull request #498 from Insprill/fix/linux-build
Fix Linux crash on startup
2024-06-21 17:46:26 +02:00
MathieuG-P 44c63a63c6 [feature-107] playlist creation and edition is finished 2024-06-19 22:25:00 +02:00
MathieuG-P d299553d1e [feature-107] Advancement on playlist creation 2024-06-18 21:03:13 +02:00
Pierce Thompson 415d47a9e5 Don't try to start the game as admin on linux
Isn't supported
2024-06-16 23:59:37 -04:00
Pierce Thompson 9b8f1a7c42 Launch Beat Saber with Proton on Linux 2024-06-16 23:41:10 -04:00
Pierce Thompson 12a8a49ccb Add Proton path setting 2024-06-16 23:37:27 -04:00
Pierce Thompson 3cfc59982b Add x64 Linux GNU version of resvg to package-lock.json 2024-06-16 23:28:01 -04:00
MathieuG-P 5e1a021c3a [feature-107] progress on the modal for creating and editing playlists 2024-06-16 21:13:54 +02:00
MathieuG-P d6ba587db0 Merge pull request #496 from Zagrios/bugfix/494/advanced-launch-args-not-being-used-when-input-is-closed
[bugfix-494] use advanced args even if the input is closed
2024-06-15 18:14:23 +02:00
MathieuG-P 4075b2fcde [bugfix-494] use advanced args even if the input is closed + add a glow effect to show if an advanced arg is present 2024-06-15 18:07:37 +02:00
MathieuG-P b1ee9f054d [feature-107] start modal to create and edit playlists 2024-06-13 21:54:22 +02:00
MathieuG-P 15ebe8e929 [feature-107] minor fixes + use virtual scroll in playlists details view 2024-06-10 16:22:52 +02:00
MathieuG-P 901137ada9 [feature-107] local playlist filtering & can select playlist to perform actions : export, delete, sync 2024-06-09 22:45:03 +02:00
MathieuG-P ab07334cb8 Merge branch 'v1.5.0' into feature/playlists/107 2024-06-08 16:38:13 +02:00
MathieuG-P 7407b7dc83 Merge branch 'master' into v1.5.0 2024-06-08 16:34:17 +02:00
MathieuG-P 46824eb3ed Merge pull request #493 from Zagrios/chore/blur-nsfw-models-received-from-modelsaber
[chore] blur nsfw models received from modelsaber
2024-06-08 16:15:11 +02:00
MathieuG-P 1c9289f989 [chore] remove brigtness filter 2024-06-08 16:12:04 +02:00
MathieuG-P 64d6aa25e3 [chore] blur nsfw models 2024-06-08 16:09:28 +02:00
MathieuG-P 126024b70b spaces to tabs 2024-06-08 16:08:59 +02:00
MathieuG-P cb08374cbb fix import 2024-06-08 16:08:36 +02:00
MathieuG-P 22a217528c Merge branch 'master' into v1.5.0 2024-06-05 20:31:21 +02:00
MathieuG-P e9f297f186 update patreon name 2024-06-05 20:30:09 +02:00
MathieuG-P 934f857f96 Merge pull request #491 from Zagrios/feature/fix-changelog-issues
Feature/fix changelog issues
2024-06-05 20:05:52 +02:00
Shidorien 56dbeea691 Merge branch 'feature/fix-changelog-issues' of https://github.com/Zagrios/bs-manager into feature/fix-changelog-issues 2024-06-05 19:51:44 +02:00
Shidorien bff5123373 Fix error handling and logging in SettingsPage and AutoUpdaterService 2024-06-05 19:51:40 +02:00
GaetanGrd a48db98001 Update auto-updater.service.ts 2024-06-05 14:29:21 +02:00
MathieuG-P 850f39339a Add patreon 2024-06-05 12:31:33 +02:00
MathieuG-P f0cbb066e4 Merge pull request #489 from Zagrios/chore/use-self-contained-depot-downloader
[chore] use self contained depot downloader
2024-06-04 21:09:45 +02:00
Shidorien 8fefefd5ac Update bs-versions.json with new version 2024-06-04 21:08:56 +02:00
Shidorien 365818266c update translations for changelog not found messages 2024-06-04 21:08:31 +02:00
MathieuG-P 764eeff57a [chore] remove functions and translations that or no longer needed 2024-06-04 20:59:58 +02:00
MathieuG-P e713782b9f nothing 2024-06-04 20:59:29 +02:00
Zagrios d8cfad32a6 [chore] self-contained depotdownload works on linux 2024-06-04 20:57:08 +02:00
MathieuG-P 86c73239c9 [chore] use self contained DepotDownloader on windows 2024-06-04 20:57:08 +02:00
MathieuG-P 9af6c9a94a add 1.37.0 2024-06-04 17:55:17 +02:00
shidorien 9ffa0db43e Fix error handling in AutoUpdaterService and add error logging in SettingsPage 2024-06-02 19:16:39 +02:00
shidorien 5cf80ec6f2 Update bs-versions.json and package-lock.json 2024-06-02 19:16:28 +02:00
MathieuG-P 0ea355d75c [feature-107] multiple lists now uses virtual scroll 2024-06-01 20:25:50 +02:00
MathieuG-P 044174c711 [feature-107] Fix issues with virtualScroll + add on scrollEnd on virtualScroll + Fix issue with submit playlists filter 2024-05-30 20:20:40 +02:00
MathieuG-P 7562b07832 [feature-107] create generic component for virtual scrolling 2024-05-28 22:10:02 +02:00
MathieuG-P 0196206ec1 [feature-107] open playlist details from download modal + use new proto format for maps details cache 2024-05-27 00:25:36 +02:00
MathieuG-P d54464401f [feature-107] advancements on playlist filter panel 2024-05-23 23:11:35 +02:00
MathieuG-P 969be1e816 Merge branch 'v1.5.0' into feature/playlists/107 2024-05-21 20:38:38 +02:00
MathieuG-P d91a95ec0b Merge branch 'v1.5.0' of https://github.com/Zagrios/bs-manager into v1.5.0 2024-05-21 20:37:08 +02:00
MathieuG-P 89066411b1 Merge branch 'master' into v1.5.0 2024-05-21 20:37:06 +02:00
MathieuG-P 604dec8540 Merge pull request #485 from Zagrios/bugfix/launch-shortcut-windows-not-closing
[bugfix] Fix the issue where the launch shortcut window never closes after launching BS
2024-05-20 21:52:05 +02:00
MathieuG-P 32f03eaaa2 [bugfix] Fix the issue where the launch shortcut window never closes after launching BS 2024-05-20 21:43:11 +02:00
MathieuG-P 22769da7c5 Merge pull request #483 from Zagrios/revert-464-chore/use-winhttp-dll-to-detect-bsipa-installation
Revert "[chore] use winhttp.dll to detect bsipa installation"
2024-05-19 20:11:14 +02:00
MathieuG-P 69e573a12c Revert "[chore] use winhttp.dll to detect bsipa installation" 2024-05-19 20:07:58 +02:00
MathieuG-P 7f726537ff [feature-107] sorting works for download playlist modal 2024-05-19 20:07:03 +02:00
MathieuG-P 40b12c6285 Merge pull request #482 from Zagrios/bugfix/450/crash-on-launch-when-developing-with-v150
Bugfix/450/crash-on-launch-when-developing-with-v150
2024-05-19 10:52:58 +02:00
Zagrios 28f0a4d8c6 [bugfix-450] fix crash due to wrong app version on Linux 2024-05-19 10:49:10 +02:00
MathieuG-P 6e9c6e6c9e Merge pull request #477 from eliasbenb/feature/github-actions-build-workflow
GitHub Actions Build Workflow
2024-05-18 20:29:50 +02:00
MathieuG-P 281ae0bbc6 Merge pull request #480 from Zagrios/chore/update-readme
Add website bouton 👀and update twitter logo
2024-05-18 20:24:36 +02:00
GaetanGrd aad4cb9a2e Add website bouton 👀and update twitter logo 2024-05-18 19:12:06 +02:00
MathieuG-P cc0ec76d83 Merge pull request #478 from Zagrios/chore/update-readme
Update README.md
2024-05-15 20:44:48 +02:00
GaetanGrd 7b7cdd5559 Update README.md 2024-05-15 20:21:15 +02:00
MathieuG-P 4a2f7697f9 Merge branch 'master' of https://github.com/Zagrios/bs-manager 2024-05-15 16:46:58 +02:00
MathieuG-P cbab039ca4 add patreon 2024-05-15 16:46:56 +02:00
Elias Benbourenane 576cd2dec5 Initial test of a GH Actions build workflow 2024-05-14 20:56:12 +00:00
MathieuG-P c02ac39184 [feature-107] we can now download playlist from beatsaver + other internal changes 2024-05-12 19:32:54 +02:00
MathieuG-P 5eda9463c4 Merge pull request #476 from Aeywoo/patch-1
Clearer English translation for Steam Credentials popup
2024-05-09 15:49:08 +02:00
Aeywoo 41ef0164fd Update en.json
Clearer sentence structure, outlying why their credentials are required more clearly, how they are used and ensuring users are aware that their Steam credentials are only being used through DepotDownloader.
2024-05-09 02:49:39 -04:00
MathieuG-P c833df9884 Merge branch 'v1.5.0' into feature/playlists/107 2024-05-08 16:57:29 +02:00
MathieuG-P ba3cca79b4 Merge branch 'master' into v1.5.0 2024-05-08 16:56:27 +02:00
MathieuG-P ad6d9b57f8 Add 1.36.2 2024-05-06 18:25:08 +02:00
MathieuG-P d21271693e Merge pull request #472 from Zagrios/bugfix/wrong-mods-for-a-bs-version-shown
[bugfix] Fix wrong mods shown for a BS version
2024-04-30 23:21:08 +02:00
MathieuG-P 589c191ac2 Fix wrong mods shown for a BS version 2024-04-30 23:16:53 +02:00
MathieuG-P 6a326fd584 add patreon 2024-04-26 19:57:17 +02:00
MathieuG-P 0f430293a5 Merge pull request #464 from Zagrios/chore/use-winhttp-dll-to-detect-bsipa-installation
[chore] use winhttp.dll to detect bsipa installation
2024-04-20 16:33:20 +02:00
MathieuG-P 61ad8ba75b [chore] use winhttp.dll to detect bsipa installation 2024-04-20 16:27:32 +02:00
MathieuG-P 0cea1cd89f [feature-107] use size optimized song details cache 2024-04-20 16:22:07 +02:00
MathieuG-P 6836f18e89 Merge branch 'v1.5.0' into feature/playlists/107 2024-04-18 15:25:21 +02:00
MathieuG-P 0093c3970c Merge branch 'master' into v1.5.0 2024-04-18 15:24:51 +02:00
MathieuG-P 644a0c4e43 1.34.2 is now the recommended version 2024-04-16 16:21:48 +02:00
MathieuG-P c71c7a96e3 Add patreon 2024-04-15 12:39:16 +02:00
MathieuG-P 0e02e2e2b9 Merge branch 'v1.5.0' into feature/playlists/107 2024-04-11 19:11:51 +02:00
MathieuG-P 4537cbd539 Merge branch 'v1.5.0' of https://github.com/Zagrios/bs-manager into v1.5.0 2024-04-11 19:10:01 +02:00
MathieuG-P 0c185066f6 Merge branch 'master' into v1.5.0 2024-04-11 19:09:55 +02:00
MathieuG-P 5d5985f305 Merge pull request #453 from Zagrios/chore/sharp-to-resvg-js
[CHORE] migrate from sharp to resvg-js
2024-04-11 19:03:18 +02:00
MathieuG-P 744c3f18c7 Update @resvg/resvg-js version to 2.6.2 2024-04-11 18:55:30 +02:00
MathieuG-P 2a52ae3644 Merge branch 'master' into chore/sharp-to-resvg-js 2024-04-11 18:52:42 +02:00
MathieuG-P e822738a3b oups 2024-04-09 18:50:59 +02:00
MathieuG-P d185614d3b add 1.36.0 2024-04-09 18:50:45 +02:00
MathieuG-P c1a6a43825 Merge pull request #449 from Insprill/fix/linux-admin
Fix Steam elevated check on Linux
2024-03-29 03:35:18 +01:00
MathieuG-P b98e1ccdfa [feature-107] Advancement on playlists feature 2024-03-27 21:33:19 +01:00
Pierce Thompson 4797aab0aa Fix Steam elevated check on Linux 2024-03-26 18:43:04 -04:00
MathieuG-P 0460a0dab3 [feature-107] advancement on playlists feature 2024-03-24 17:51:18 +01:00
MathieuG-P 9cd5c48831 remove patreons 2024-03-23 14:01:54 +01:00
MathieuG-P e0f597e252 add patreon 2024-03-23 13:38:33 +01:00
MathieuG-P ebbe2963b1 Merge branch 'v1.5.0' into feature/playlists/107 2024-03-22 15:12:26 +01:00
MathieuG-P 541a14d2a7 Merge pull request #445 from Zagrios/chore/improve-ipc-robustness-and-remove-dead-code
[chore] improve ipc robustness and remove dead code
2024-03-22 14:45:06 +01:00
MathieuG-P 169a6e99b0 [chore] add routes for IPCs + migrate all old ipc.send to sendV2 + remove some dead code 2024-03-20 19:00:35 +01:00
MathieuG-P 3da5af354e [feature-107] We can now download playlist's missing maps 2024-03-19 18:01:07 +01:00
MathieuG-P 031c9044a1 Merge pull request #438 from Liborsaf/feature/edit-modal-name-reset-button
[feature] Add reset button for name to version edit modal
2024-03-19 14:17:26 +01:00
MathieuG-P 6d271d8c48 Merge branch 'master' into v1.5.0 2024-03-19 14:15:12 +01:00
MathieuG-P 8bc37ef3f1 Merge pull request #439 from Insprill/fix/linux-mods
Fix BSIPA not running on Linux
2024-03-18 19:20:30 +01:00
Pierce Thompson d7f3936619 Fix BSIPA not running on Linux 2024-03-16 21:07:05 -04:00
Libor Šafář 49358b7006 Add reset button for name to version edit modal 2024-03-15 17:44:22 +01:00
MathieuG-P 067b967da1 add patreon 2024-03-15 11:55:16 +01:00
MathieuG-P 31e1ae2273 [chore] use resvg-js@2.6.1-beta.0 instead of sharp; Waiting the release of v2.6.1 to merge into master 2024-03-12 07:35:23 +01:00
MathieuG-P 7237e49c7f [feature-107] progress on playlists (lot of things, i don't remember all things i've done in this commit) 2024-03-12 06:49:32 +01:00
MathieuG-P 501def3a94 [feature-107] Audio player can now take list of songs to play 2024-03-08 18:21:05 +01:00
MathieuG-P f2cd9a1174 Merge branch 'v1.5.0' into feature/playlists/107 2024-03-08 16:33:10 +01:00
MathieuG-P d0fee6aaca [chore] add script to build all rust scripts 2024-03-08 16:31:20 +01:00
MathieuG-P 7c034550fb Merge branch 'master' into v1.5.0 2024-03-08 16:03:32 +01:00
MathieuG-P 1e6f051f59 [feature-107] can now list maps of playlist + lot of other things 2024-03-02 17:50:08 +01:00
MathieuG-P 08bdc03745 [feature-107] Make playlist discoverable in shared tab + quik fix miss handle params in html file url 2024-02-27 22:52:18 +01:00
MathieuG-P de0575aea4 Merge branch 'v1.5.0' into feature/playlists/107 2024-02-26 15:33:13 +01:00
MathieuG-P 487d0c1f8b [feature-107] Implement playlists linking + remove possibility to play a playlist for now + some refacto 2024-02-26 15:24:51 +01:00
MathieuG-P ac5a9b16e5 Merge branch 'master' into v1.5.0 2024-02-24 21:19:18 +01:00
MathieuG-P e7f5e98fcd Add volta for release package.json + Update package.json dependencies and version numbers 2024-02-24 21:17:56 +01:00
MathieuG-P a36ccb0c13 [feature-107] Fix various bugs and add new features for playlists 2024-02-23 21:49:29 +01:00
MathieuG-P 59b04ee33e nothing 2024-02-20 14:04:45 +01:00
MathieuG-P b42231b134 [feature-107] lot of changes but mainly, maps now use a cache and load almost instantly after first load 2024-02-18 22:24:57 +01:00
MathieuG-P 11661cc1da Merge pull request #381 from Zagrios/feature/add-changelog-modal/178
Feature/add changelog modal/178
2024-02-12 15:22:39 +01:00
Shidorien d7c43a2ba9 Add query-process package 2024-02-12 14:54:19 +01:00
Shidorien 14a65f1d69 Update dompurify version to 3.0.8 2024-02-12 14:52:17 +01:00
Shidorien bc9ab121b9 Merge branch 'v1.5.0' of https://github.com/Zagrios/bs-manager into feature/add-changelog-modal/178 2024-02-12 14:50:44 +01:00
Shidorien 0f0f7c1abb Remove unnecessary line in handleVersionClick function 2024-02-12 14:38:29 +01:00
Shidorien 1d9a261bc5 Merge branch 'master' into feature/add-changelog-modal/178 2024-02-12 14:36:52 +01:00
MathieuG-P 9a3ebf2971 [feature-107] moving files around and create Playlist panel component 2024-02-07 16:36:25 +01:00
Shidorien e51ef0992c Merge branch 'master' into feature/add-changelog-modal/178 2024-02-07 12:33:44 +01:00
shidorien d9f025e28b Update translation strings for "not-found" in multiple languages 2024-02-05 11:14:32 +01:00
shidorien b4efa9583e Merge branch 'master' into feature/add-changelog-modal/178 2024-02-05 11:14:24 +01:00
MathieuG-P 1b4b59fbf0 Merge branch 'v1.5.0' into feature/playlists/107 2024-02-03 23:34:07 +01:00
MathieuG-P 8394581544 Disable react/function-component-definition rule in ESLint configuration 2024-02-03 23:32:58 +01:00
MathieuG-P 159d478e94 Merge branch 'v1.5.0' into feature/playlists/107 2024-02-03 23:22:36 +01:00
MathieuG-P 90bb8f2c19 Fix eslint rule for no-shadow 2024-02-03 23:22:28 +01:00
MathieuG-P 097b18e72f Merge branch 'v1.5.0' into feature/playlists/107 2024-02-03 23:20:23 +01:00
MathieuG-P 9b744fb1e2 Add react/jsx-filename-extension rule to .eslintrc.js 2024-02-03 23:20:09 +01:00
MathieuG-P 31f1ee1549 Merge branch 'v1.5.0' into feature/playlists/107 2024-02-03 16:04:11 +01:00
MathieuG-P c540308c2c Update ESLint rules 2024-02-03 16:03:37 +01:00
MathieuG-P 778b4f6ee6 [feature-107] Can now open .bplist file with BSManager 2024-02-03 16:03:17 +01:00
MathieuG-P df057cf82e Merge branch 'v1.5.0' into feature/playlists/107 2024-02-03 13:39:46 +01:00
MathieuG-P 5f94190b68 Merge branch 'master' into v1.5.0 2024-02-02 20:24:16 +01:00
MathieuG-P 7718d239b2 use volta 2024-02-01 18:47:53 +01:00
MathieuG-P b29c9515d3 Merge pull request #414 from Zagrios/chore/migrate-to-electron-v28
[chore] migrate to electron v28 + esm support + updated deps + remove decorators (incompatible)
2024-02-01 18:33:00 +01:00
MathieuG-P 535831c03a [chore] migrate to electron v28 + esm support + update deps + remove decorators 2024-02-01 18:29:20 +01:00
MathieuG-P b03b670d56 [feature-107] add file associations for .bplist (not completed) 2024-02-01 10:45:39 +01:00
Shidorien 1fd185fe88 Complete Review change 2024-01-10 21:57:45 +01:00
Shidorien 05154f577f spam mails 👀 2024-01-08 15:32:01 +01:00
Shidorien c62896f078 fix timeout and indent on handleVersionClick 2024-01-08 15:05:42 +01:00
Shidorien 2403f02851 Remove unnecessary blank line in handleVersionClick function 2024-01-08 10:18:16 +01:00
Shidorien b8262a941d Fix timestamp field name in changelogs.json and ChangelogVersion interface 2024-01-08 10:17:19 +01:00
Shidorien 8e8d608120 Refactor handleVersionClick function in SettingsPage component 2024-01-08 10:15:21 +01:00
Shidorien c92ca87c4c Refactor date variable in ChangelogModal component 2024-01-08 10:01:25 +01:00
Shidorien b02cd7fc77 Merge branch 'master' into feature/add-changelog-modal/178 2024-01-08 09:43:59 +01:00
Shidorien 86c1f5aa7b Update path to get changelog 2024-01-05 17:56:41 +01:00
shidorien cd5237aff3 👀 2024-01-05 17:39:12 +01:00
shidorien 5449792294 Change checkisUpdated to fix a bug 2024-01-05 17:38:05 +01:00
shidorien 5c35eae53a Fix changelog loading issue and update version check 2024-01-05 17:29:48 +01:00
shidorien 61889c0b5b Refactor auto-updater service and App component 2024-01-05 17:16:35 +01:00
Shidorien 4cf242f683 Add autoUpdater check in useEffect 2024-01-05 16:43:08 +01:00
Shidorien 3217addaa6 Add checkIsUpdated method to AutoUpdaterService 2024-01-05 16:38:22 +01:00
Shidorien 76ed1b09a1 add modification after firt review part 1 2024-01-05 16:31:17 +01:00
Shidorien 9401f1cf4a Update configuration key for last app version 2024-01-05 13:44:34 +01:00
Shidorien 6b4d919afe Add version check before showing changelog 2024-01-05 13:27:08 +01:00
Shidorien e92efa0ada Merge branch 'master' into feature/add-changelog-modal/178 2024-01-05 12:21:13 +01:00
shidorien 99a9f5b1de Fix conditional return in BsmButton component 2023-12-28 15:32:50 +01:00
shidorien 98bdbba23c Add tooltips to social media buttons in ChangelogModal 2023-12-28 15:32:37 +01:00
shidorien ddde1f8b8a Update package version to 1.4.3 2023-12-28 15:32:30 +01:00
shidorien b951be9511 Merge branch 'master' into feature/add-changelog-modal/178 2023-12-28 15:07:48 +01:00
shidorien b91d74f3a3 Fix xlink namespace in PatreonIcon component 2023-12-23 22:38:38 +01:00
shidorien 002b11d54c Refactor handleVersionClick function in SettingsPage component 2023-12-23 22:33:46 +01:00
shidorien 4e15d1c1b6 Update Patreon and Twitter icons 2023-12-23 22:33:31 +01:00
shidorien 961e629de8 Refactor ChangelogModal component 2023-12-23 22:31:27 +01:00
shidorien 02ad4b9c68 change location of changelogs an dremove unused import 2023-12-22 13:51:43 +01:00
shidorien a981adede0 Delete changelog files for multiple languages 2023-12-22 13:49:38 +01:00
Shidorien 33bab3ea0e reset useless change 2023-12-22 02:00:05 +01:00
Shidorien 7dae25ce32 Fix formatting in bs-launcher-ipcs.ts 2023-12-22 01:55:32 +01:00
Shidorien 71f317dd37 Update translations for changelogs 2023-12-22 01:39:19 +01:00
Shidorien 8333e238a6 Add "none" as a BsmButtonType option 2023-12-22 01:31:21 +01:00
Shidorien 39f2a16c96 Optimise and refactor changelog loading 2023-12-22 01:30:59 +01:00
Shidorien 2c08f1e07c Add cache for changelog and refactor methods in AutoUpdaterService 2023-12-22 01:28:58 +01:00
Shidorien f4560b9190 Refactor autoUpdater logic in App component 2023-12-22 01:28:42 +01:00
Shidorien f0f83e2b3b Update indent size to 4 spaces in .editorconfig 2023-12-22 01:28:29 +01:00
Shidorien 0776de8d79 Remove unused imports and styling in ChangelogModal component 2023-12-22 01:24:37 +01:00
Shidorien 504462258a Refactor AutoUpdaterService methods to use LAST_VERSION instead of have-been-updated 2023-12-21 21:17:15 +01:00
Shidorien fdef870e83 remove unnecessary code 2023-12-21 21:17:00 +01:00
Shidorien 7d58fec63b Fix autoUpdater showChangelog condition 2023-12-21 21:16:40 +01:00
Shidorien c77f4a9448 Refactor changelog modal component layout and styling 2023-12-21 21:03:53 +01:00
Shidorien 37a3951f7b Update changelog formatting 2023-12-21 19:41:11 +01:00
Shidorien e5599b78d8 Update changelog formatting 2023-12-21 19:33:30 +01:00
Shidorien 2da329367f Update changelog for version 27.1.3 2023-12-21 19:27:16 +01:00
Shidorien 0b64722092 update AutoUpdaterService status 2023-12-21 04:09:38 +01:00
Shidorien fbec5a0e46 Add logic to show changelog if available 2023-12-21 04:08:57 +01:00
Shidorien e21b731e10 Remove unnecessary code in window-manager-ipcs.ts 2023-12-21 04:08:45 +01:00
Shidorien 19998facc7 Update Patreon icon viewBox 2023-12-21 04:08:34 +01:00
Shidorien c8017939da Remove unnecessary code in launcher-ipcs.ts 2023-12-21 04:08:03 +01:00
Shidorien 75100e6919 Add AutoUpdaterService and show changelog when available 2023-12-21 02:59:22 +01:00
Shidorien 834dad0cc0 Refactor AutoUpdaterService imports and add error handling for getChangelog() and isChangelogAvailable() 2023-12-21 02:59:13 +01:00
Shidorien f57926e41b Remove unnecessary imports and variables 2023-12-21 02:58:12 +01:00
Shidorien 57157b4553 Remove unnecessary blank lines 2023-12-21 01:27:57 +01:00
Shidorien b2c1338650 Refactor AutoUpdaterService and remove unused code 2023-12-21 01:27:29 +01:00
Shidorien 1dde1b8916 Remove unused import and commented code in AutoUpdaterService 2023-12-21 00:58:24 +01:00
Shidorien 7e9b8ec86d Add @types/dompurify package 2023-12-21 00:57:01 +01:00
Shidorien ec0d2fb8c6 Add Changelog Modal component and fix import path in AutoUpdaterService 2023-12-21 00:48:21 +01:00
Shidorien 214ffc243d Update package-lock.json version to 1.4.2 2023-12-21 00:48:08 +01:00
Shidorien d243475bf8 Add dompurify library to package.json and package-lock.json 2023-12-21 00:47:59 +01:00
Shidorien 9872fcb856 Update changelog to version 27.1.3 2023-12-21 00:09:32 +01:00
Shidorien 29f7754ba9 Merge branch 'master' into feature/add-changelog-modal/178 2023-12-21 00:00:00 +01:00
GaetanGrd 9c440a0430 Update changelog for version 27.0.0 2023-11-24 10:48:54 +01:00
Shidorien aaf75278d0 Add ChangelogModal component (WIP) 2023-11-24 06:59:55 +01:00
Shidorien ae2cf08c7d Add changelog functionality to AutoUpdaterService 2023-11-24 06:59:44 +01:00
Shidorien 4a0848fb41 Add AutoUpdaterService and show changelog 2023-11-24 06:59:35 +01:00
Shidorien 76c863608e Update version numbers in changelog 2023-11-24 06:46:08 +01:00
Shidorien 8963c08e64 Add data test 2023-11-24 06:04:17 +01:00
Shidorien ba51e76691 add getHaveBeenUpdated method 2023-11-24 04:23:39 +01:00
Shidorien cb0faad418 Fix reply type in bs-launcher-ipcs.ts 2023-11-24 04:22:57 +01:00
Shidorien 00bf26081b move Update "haveBeenUpdated" when update is available 2023-11-24 03:06:22 +01:00
Shidorien 385c403bee Update "havebeenupdated" when close index.html 2023-11-24 03:03:38 +01:00
Shidorien 6c3a241481 Update "haveBeenUpdated" when update is available 2023-11-24 02:59:08 +01:00
Shidorien 34c0ad03d3 Add ipc "have-been-updated" 2023-11-24 02:53:36 +01:00
Shidorien 8c9846d751 Add ConfigurationService and methods for getting
and setting haveBeenUpdated flag
2023-11-24 02:46:34 +01:00
Shidorien 0d7c160b24 Adding JSON changelog 2023-11-24 02:22:58 +01:00
335 changed files with 23741 additions and 31383 deletions
+13 -1
View File
@@ -6,8 +6,20 @@ import webpack from "webpack";
import webpackPaths from "./webpack.paths";
import { dependencies as externals } from "../../release/app/package.json";
function createExternals(): string[] {
const webpackExternals: string[] = [...Object.keys(externals || {})];
const excludedExternals: string[] = [];
if (process.platform === "linux") {
// Linux only uses regedit-rs types
excludedExternals.push("regedit-rs");
}
return webpackExternals.filter(external => !excludedExternals.includes(external));
}
const configuration: webpack.Configuration = {
externals: [...Object.keys(externals || {})],
externals: createExternals(),
stats: "errors-only",
+64
View File
@@ -0,0 +1,64 @@
/**
* Webpack config for development electron main process
*/
import path from 'path';
import webpack from 'webpack';
import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
import { merge } from 'webpack-merge';
import checkNodeEnv from '../scripts/check-node-env';
import baseConfig from './webpack.config.base';
import webpackPaths from './webpack.paths';
// When an ESLint server is running, we can't set the NODE_ENV so we'll check if it's
// at the dev webpack config is not accidentally run in a production environment
if (process.env.NODE_ENV === 'production') {
checkNodeEnv('development');
}
const configuration: webpack.Configuration = {
devtool: 'inline-source-map',
mode: 'development',
target: 'electron-main',
entry: {
main: path.join(webpackPaths.srcMainPath, 'main.ts'),
preload: path.join(webpackPaths.srcMainPath, 'preload.ts'),
},
output: {
path: webpackPaths.dllPath,
filename: '[name].bundle.dev.js',
library: {
type: 'umd',
},
},
plugins: [
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
new BundleAnalyzerPlugin({
analyzerMode: process.env.ANALYZE === 'true' ? 'server' : 'disabled',
analyzerPort: 8888,
}),
new webpack.DefinePlugin({
'process.type': '"browser"',
}),
],
/**
* Disables webpack processing of __dirname and __filename.
* If you run the bundle in node.js it falls back to these values of node.js.
* https://github.com/webpack/webpack/issues/2010
*/
node: {
__dirname: false,
__filename: false,
},
};
export default merge(baseConfig, configuration);
+1
View File
@@ -40,6 +40,7 @@ const configuration: webpack.Configuration = {
},
optimization: {
minimize: true,
minimizer: [
new TerserPlugin({
parallel: true,
@@ -1,3 +1,4 @@
/* eslint-disable import/no-import-module-exports */
import "webpack-dev-server";
import path from "path";
import fs from "fs";
+4
View File
@@ -2,6 +2,9 @@ const path = require("path");
const rootPath = path.join(__dirname, "../..");
const erbPath = path.join(__dirname, '..');
const erbNodeModulesPath = path.join(erbPath, 'node_modules');
const dllPath = path.join(__dirname, "../dll");
const srcPath = path.join(rootPath, "src");
@@ -22,6 +25,7 @@ const buildPath = path.join(releasePath, "build");
export default {
rootPath,
erbNodeModulesPath,
dllPath,
srcPath,
srcMainPath,
+33
View File
@@ -0,0 +1,33 @@
import path from 'path';
import { copyFileSync, existsSync, readdirSync } from 'fs-extra';
import { execSync } from 'child_process';
const eternalsFolder = path.join(__dirname, '..', '..', 'externals');
// Get rust project folders from externals
const rustProjects = readdirSync(eternalsFolder).filter(folder => existsSync(path.join(eternalsFolder, folder, 'Cargo.toml')));
// Build each rust project in release mode
rustProjects.forEach(project => {
console.log(`Building ${project}`);
execSync(`cargo build --release`, {
cwd: path.join(eternalsFolder, project),
stdio: 'inherit',
});
});
// Copy the built files exe to the assests/scripts folder
rustProjects.forEach(project => {
// read the project name from Cargo.toml using toml parser
const projectMetadata = execSync('cargo metadata --no-deps --format-version 1', {
cwd: path.join(eternalsFolder, project),
stdio: 'pipe',
});
const projectMetadataJson = JSON.parse(projectMetadata);
const projectName = projectMetadataJson.packages[0].name;
const source = path.join(eternalsFolder, project, 'target', 'release', `${projectName}.exe`);
const destination = path.join(__dirname, '..', '..', 'assets', 'scripts', `${projectName}.exe`);
console.log(`Copying ${source} to ${destination}`);
copyFileSync(source, destination);
});
+10 -14
View File
@@ -1,17 +1,13 @@
import rimraf from "rimraf";
import process from "process";
import webpackPaths from "../configs/webpack.paths";
import { rimrafSync } from 'rimraf';
import fs from 'fs';
import webpackPaths from '../configs/webpack.paths';
const args = process.argv.slice(2);
const commandMap = {
dist: webpackPaths.distPath,
release: webpackPaths.releasePath,
dll: webpackPaths.dllPath,
};
const foldersToRemove = [
webpackPaths.distPath,
webpackPaths.buildPath,
webpackPaths.dllPath,
];
args.forEach(x => {
const pathToRemove = commandMap[x];
if (pathToRemove !== undefined) {
rimraf.sync(pathToRemove);
}
foldersToRemove.forEach((folder) => {
if (fs.existsSync(folder)) rimrafSync(folder);
});
+12 -5
View File
@@ -1,8 +1,15 @@
import path from "path";
import rimraf from "rimraf";
import webpackPaths from "../configs/webpack.paths";
import fs from 'fs';
import path from 'path';
import { rimrafSync } from 'rimraf';
import webpackPaths from '../configs/webpack.paths';
export default function deleteSourceMaps() {
rimraf.sync(path.join(webpackPaths.distMainPath, "*.js.map"));
rimraf.sync(path.join(webpackPaths.distRendererPath, "*.js.map"));
if (fs.existsSync(webpackPaths.distMainPath))
rimrafSync(path.join(webpackPaths.distMainPath, '*.js.map'), {
glob: true,
});
if (fs.existsSync(webpackPaths.distRendererPath))
rimrafSync(path.join(webpackPaths.distRendererPath, '*.js.map'), {
glob: true,
});
}
+8 -5
View File
@@ -1,9 +1,12 @@
import fs from "fs";
import webpackPaths from "../configs/webpack.paths";
import fs from 'fs';
import webpackPaths from '../configs/webpack.paths';
const { srcNodeModulesPath } = webpackPaths;
const { appNodeModulesPath } = webpackPaths;
const { srcNodeModulesPath, appNodeModulesPath, erbNodeModulesPath } = webpackPaths;
if (!fs.existsSync(srcNodeModulesPath) && fs.existsSync(appNodeModulesPath)) {
fs.symlinkSync(appNodeModulesPath, srcNodeModulesPath, "junction");
fs.symlinkSync(appNodeModulesPath, srcNodeModulesPath, 'junction');
}
if (!fs.existsSync(erbNodeModulesPath) && fs.existsSync(appNodeModulesPath)) {
fs.symlinkSync(appNodeModulesPath, erbNodeModulesPath, 'junction');
}
+25 -21
View File
@@ -1,28 +1,32 @@
const { notarize } = require("electron-notarize");
const { build } = require("../../package.json");
const { notarize } = require('@electron/notarize');
const { build } = require('../../package.json');
exports.default = async function notarizeMacos(context) {
const { electronPlatformName, appOutDir } = context;
if (electronPlatformName !== "darwin") {
return;
}
const { electronPlatformName, appOutDir } = context;
if (electronPlatformName !== 'darwin') {
return;
}
if (process.env.CI !== "true") {
console.warn("Skipping notarizing step. Packaging is not running in CI");
return;
}
if (process.env.CI !== 'true') {
console.warn('Skipping notarizing step. Packaging is not running in CI');
return;
}
if (!("APPLE_ID" in process.env && "APPLE_ID_PASS" in process.env)) {
console.warn("Skipping notarizing step. APPLE_ID and APPLE_ID_PASS env variables must be set");
return;
}
if (
!('APPLE_ID' in process.env && 'APPLE_APP_SPECIFIC_PASSWORD' in process.env)
) {
console.warn(
'Skipping notarizing step. APPLE_ID and APPLE_APP_SPECIFIC_PASSWORD env variables must be set',
);
return;
}
const appName = context.packager.appInfo.productFilename;
const appName = context.packager.appInfo.productFilename;
await notarize({
appBundleId: build.appId,
appPath: `${appOutDir}/${appName}.app`,
appleId: process.env.APPLE_ID,
appleIdPassword: process.env.APPLE_ID_PASS,
});
await notarize({
appBundleId: build.appId,
appPath: `${appOutDir}/${appName}.app`,
appleId: process.env.APPLE_ID,
appleIdPassword: process.env.APPLE_APP_SPECIFIC_PASSWORD,
});
};
+6 -6
View File
@@ -47,11 +47,6 @@ module.exports = {
"import/no-cycle": "off",
"prefer-promise-reject-errors": "off",
"react/jsx-no-target-blank": "off",
"@typescript-eslint/ban-types": ["error", {
types: {
Function: false,
}
}]
"import/extensions": "off",
"lines-between-class-members": "off",
"no-throw-literal": "warn",
@@ -65,14 +60,18 @@ module.exports = {
"jsx-a11y/control-has-associated-label": "off",
"react/button-has-type": "off",
"max-classes-per-file": "off",
"jest/no-standalone-expect": "off",
},
parserOptions: {
ecmaVersion: 2020,
sourceType: "module",
project: "./tsconfig.json",
tsconfigRootDir: __dirname,
createDefaultProgram: true,
},
globals: {
JSX: true,
NodeJS: true
},
settings: {
"import/resolver": {
// See https://github.com/benmosher/eslint-plugin-import/issues/1396#issuecomment-575727774 for line below
@@ -86,4 +85,5 @@ module.exports = {
"@typescript-eslint/parser": [".ts", ".tsx"],
},
},
"plugins": ["@typescript-eslint"]
};
@@ -1,35 +0,0 @@
---
name: "[BUG] Bug report"
about: Create a report to help us improve
title: "[BUG] : "
labels: bug
assignees: Zagrios
---
## Bug Description
<!-- A clear and concise description of what the bug is. -->
## Reproduction Steps
<!-- Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
-->
## Expected Behavior
<!-- A clear and concise description of what you expected to happen. -->
## Screenshots
<!-- If applicable, add screenshots to help explain your problem. -->
## System Specs
<!-- **Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Version [e.g. 22]
-->
## Additional context
<!-- Add any other context about the problem here. -->
@@ -1,22 +0,0 @@
---
name: "[FEAT.] Feature request"
about: Suggest an idea for this project
title: "[FEAT.] : "
labels: enhancement
assignees: Zagrios
---
## Problem
<!-- **Is your feature request related to a problem? Please describe.** -->
<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->
## Solution
<!-- **Describe the solution you'd like** -->
<!-- A clear and concise description of what you want to happen. -->
## Alternative solutions (if any)
<!-- **Describe alternatives you've considered** -->
<!-- A clear and concise description of any alternative solutions or features you've considered. -->
## Additional context
<!-- Add any other context or screenshots about the feature request here. -->
+54
View File
@@ -0,0 +1,54 @@
name: "[BUG] Bug report"
description: Create a report to help us improve
title: "[BUG] : "
labels: bug
assignees: Zagrios
body:
- type: markdown
attributes:
value: |
## Thanks for taking the time to fill out this bug report! 😊
- type: textarea
id: description
attributes:
label: Issue encountered
description: Tell us what issue you've encountered.
validations:
required: true
- type: textarea
id: expected
attributes:
label: Expected Behavior
description: Tell us what should expected to happen.
- type: textarea
id: replication
attributes:
label: Steps to Reproduce
description: Provide a link to a live example, or an unambiguous set of steps to reproduce this bug. Include code to reproduce, if relevant.
placeholder: |
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
- type: dropdown
id: os
attributes:
label: Operating System
options:
- Windows 10
- Windows 11
- Linux
- type: input
id: version
attributes:
label: Version
description: What version of BSManager are you running?
placeholder: eg. 1.4.8 or 1.5.0-alpha-4
- type: textarea
id: additional-context
attributes:
label: Additional Context
description: Any other context that you may share about the issue. You may add your log files here.
@@ -0,0 +1,45 @@
name: "[FEAT.] Feature request"
description: Suggest an idea for this project
title: "[FEAT.] : "
labels: enhancement
assignees: Zagrios
body:
- type: markdown
attributes:
value: |
## Thanks for taking the time to fill out this feature request! 😊
- type: textarea
id: problem
attributes:
label: Problem
description: Is your feature request related to a problem? Please describe.
placeholder: Ex. I'm always frustrated when [...]
validations:
required: true
- type: textarea
id: solution
attributes:
label: Solution
description: Describe the solution you'd like.
validations:
required: true
- type: textarea
id: alternative-solution
attributes:
label: Alternative Solution
description: Describe alternatives you've considered.
- type: dropdown
id: os
attributes:
label: Operating System
description: If the feature is only applicable to a specific OS. Leave it to `None` if it's applicable to all OS'es.
options:
- Windows
- Linux
- type: textarea
id: additional-context
attributes:
label: Additional Context
description: Add any other context or screenshots about the feature request here.
+5
View File
@@ -0,0 +1,5 @@
lank_issues_enabled: true
contact_links:
- name: Discord Support
url: https://discord.gg/uSqbHVpKdV
about: You can join our Discord server for a quick and interactive support.
+52
View File
@@ -0,0 +1,52 @@
# This workflow will...
name: Build
on:
push:
branches: ["master"]
workflow_dispatch:
jobs:
release:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [windows-latest, ubuntu-latest]
steps:
- name: Check out Git repository
uses: actions/checkout@v4
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: 22.11.0
cache: "npm"
- run: npm ci
- run: npm run package
# Install and setup Flatpak for Ubuntu
- name: Install flatpak packages (Ubuntu only)
if: matrix.os == 'ubuntu-latest'
run: sudo apt-get install -y flatpak flatpak-builder
- name: Setup flatpak repo (Ubuntu only)
if: matrix.os == 'ubuntu-latest'
run: |
flatpak remote-add --if-not-exists --user \
flathub https://flathub.org/repo/flathub.flatpakrepo
# Build Flatpak package
- name: Build Flatpak (Ubuntu only)
if: matrix.os == 'ubuntu-latest'
run: |
env DEBUG="@malept/flatpak-bundler" \
npx electron-builder --config electron-builder.config.js --publish never --linux flatpak
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: release-${{ matrix.os }}
path: release
+20
View File
@@ -0,0 +1,20 @@
name: Publish wiki
on:
push:
branches: [master]
paths:
- docs/wiki/**
- .github/workflows/docs.yml
concurrency:
group: publish-wiki
cancel-in-progress: true
permissions:
contents: write
jobs:
publish-wiki:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: Andrew-Chen-Wang/github-wiki-action@v4
with:
path: docs/wiki/
+26
View File
@@ -0,0 +1,26 @@
name: Labeler
on:
issues:
types: [opened, edited]
jobs:
label-linux:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Search Linux Term
uses: actions-ecosystem/action-regex-match@v2
id: regex-match
with:
text: ${{ github.event.issue.body }}
regex: '\# Operating System(\s*)Linux'
flags: m
- name: Add Linux label
uses: actions-ecosystem/action-add-labels@v1
if: ${{ steps.regex-match.outputs.match != '' }}
with:
github_token: ${{ secrets.GH_TOKEN }}
labels: linux
+3 -3
View File
@@ -14,11 +14,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Use Node.js
uses: actions/setup-node@v3
uses: actions/setup-node@v4
with:
node-version: 18.x
node-version: 22.11.0
cache: "npm"
- run: npm ci
- run: npm run lint
+3 -3
View File
@@ -18,11 +18,11 @@ jobs:
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Use Node.js
uses: actions/setup-node@v3
uses: actions/setup-node@v4
with:
node-version: 18.x
node-version: 22.11.0
cache: "npm"
- run: npm ci
- run: npm run build
+49
View File
@@ -0,0 +1,49 @@
# This workflow will...
name: Release Linux
env:
GH_TOKEN: ${{ secrets.GH_TOKEN }}
on:
workflow_dispatch:
jobs:
release:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest]
steps:
- name: Check out Git repository
uses: actions/checkout@v4
- name: Install flatpak packages
run: sudo apt-get install -y flatpak flatpak-builder
- name: Setup flatpak repo
run: |
flatpak remote-add --if-not-exists --user \
flathub https://flathub.org/repo/flathub.flatpakrepo
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: 22.11.0
cache: "npm"
- run: npm ci
- run: npm run build
- name: Build deb
run: npx electron-builder --config electron-builder.config.js --publish always --linux deb --x64
- name: Build flatpak
run: env DEBUG="@malept/flatpak-bundler" npx electron-builder --config electron-builder.config.js --publish always --linux flatpak
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: release
path: release
+1
View File
@@ -0,0 +1 @@
20.11.0
+1
View File
@@ -18,6 +18,7 @@ We'd also love PRs. If you're thinking of a large PR, we advise opening up an is
## Submitting a pull request
1. [Fork][fork] and clone the repository.
1. Install the correct NodeJS version (highly recommend installing [Volta](https://volta.sh/) for that).
1. Configure and install the dependencies: `npm install`.
1. Create a new branch following naming convention: `git checkout -b (feature|bugfix|hotfix|chore)/(short-description)(/issue-id)`.
1. Make your change, test, and make sure BSManager work fine.
+17 -7
View File
@@ -57,10 +57,12 @@
<a href="https://discord.gg/uSqbHVpKdV"><img
src="https://img.shields.io/badge/-DISCORD-5865f2?style=for-the-badge&logo=discord&logoColor=ffffff"
alt="discord" /></a>
<a href="https://www.patreon.com/bsmanager"><img
src="https://img.shields.io/badge/-🥰%20Support%20BSM-EC4546?style=for-the-badge" alt="Donation" /></a>
<a href="https://twitter.com/BSManager_"><img
src="https://img.shields.io/badge/-Twitter-F5F8FA?style=for-the-badge&logo=Twitter" alt="Twitter" /></a>
src="https://img.shields.io/badge/-Twitter-black?style=for-the-badge&logo=X" alt="Twitter" /></a>
<a href="https://www.bsmanager.io">
<img src="https://img.shields.io/badge/-WebSite-00649c?style=for-the-badge&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAwIDEwMDAiPgogIDxnIGZpbGw9IiMzYjgyZmYiPgogICAgPHBhdGggZD0ibTYyNi43NSA0ODUuOTEgMjAuODIgMzUxLjk0YTM1LjIxIDM1LjIxIDAgMCAxLTE1LjQ5IDMxLjM2bC0xNDQuNzEgOTYuMTRoLS4wNmEzNS41NiAzNS41NiAwIDAgMS0xMS4zMSA0Ljc3IDM0Ljg1IDM0Ljg1IDAgMCAxLTIzLjUxLTIuODdMMTM2LjU4IDgwOS45YTExNS40NSAxMTUuNDUgMCAwIDEtNjMuNzUtOTYuNDlMNTIgMzYxLjQ2YTM1LjI2IDM1LjI2IDAgMCAxIDE1LjIzLTMxLjIxbDE0NS4wNS05Ni4zNmEzNS43MiAzNS43MiAwIDAgMSAxMS4yNy00LjcgMzQuODcgMzQuODcgMCAwIDEgMjMuNTEgMi44N0w1NjMgMzg5LjQyYTExNS40MSAxMTUuNDEgMCAwIDEgNjMuNzUgOTYuNDlaIi8+CiAgICA8cGF0aCBmaWx0ZXI9ImJyaWdodG5lc3MoMzAlKSIgZD0ibTYxMy43OCA0ODYuNjcgMjAuODIgMzUyYTIyLjM0IDIyLjM0IDAgMCAxLTMyLjI2IDIxLjMxTDI4Ni40IDcwMi41N0ExMDIuNDMgMTAyLjQzIDAgMCAxIDIyOS44MyA2MTdMMjA5IDI2NWEyMi4zNSAyMi4zNSAwIDAgMSAzMi4yNi0yMS4zMkw1NTcuMiA0MDEuMDVhMTAyLjQyIDEwMi40MiAwIDAgMSA1Ni41OCA4NS42MloiLz4KICA8L2c+CiAgPHBhdGggZD0iTTcxOC4yOSA3NzYuNDggNzAwIDgwNC4xOGMtNDAuNjMgMzkuNS04Ny4wNiA2Ny4yNS0xMzMuODEgOTAuNzUtODcuMzIgNDMuOS0yMDMuNjcgNzcuMTktMjQ5IDkwLjM0YTQ4IDQ4IDAgMCAxLTI2LjE3LjE2Yy02NC0xNy43Mi0xODguNjItNzItMjM2LjI4LTEyNS40OWE0LjIzIDQuMjMgMCAwIDEgNS4zLTYuNDVjMzUuNjQgMjAuODcgMTExLjIyIDU3LjY0IDE1Ni4zNyA3NC4yMiA0OS4xOCAxOC4wNiA4MS4yOSA4Ljc0IDkyLjI4LTMuMjZhNC43NyA0Ljc3IDAgMCAxIDcuMjQuMjFjMTkuNTEgMjQgMTA3LjI2IDQuNiAxNjYuNjQtMTMgNjQuMzQtMTkgMTg1Ljg1LTc2LjU2IDIzNS43Mi0xMzUuMThabS0xOTYuMiAxNTcuMzMtMTQ3LjQ1IDU1LjY4YTMuOTIgMy45MiAwIDAgMCAxLjQ0IDcuNThsNTQuNjItLjc3YTM1LjYzIDM1LjYzIDAgMCAwIDE5LTUuNzlsNzYtNDkuNTVhNCA0IDAgMCAwLTMuNjEtNy4xNVpNMjE4LjkyIDE5NS41NmMtMjEuMTQuMDctMzMuNTUgMzUuODYtMzMuMTYgODkuMDguMiAyOCAyLjU4IDkyLjc0IDQuNzkgMTQ3LjczLjIzIDUuNzEtOC4xOCA2LjQ4LTkgLjgxbC0zOC40Mi0yNzAuNzFhNC4zOCA0LjM4IDAgMCAxIDcuMTItNCA2My42MyA2My42MyAwIDAgMCAyMS45MyAxMS44NSA0LjYxIDQuNjEgMCAwIDAgNS45LTMuNzJjNC4yLTI3LjcgMTYuNjMtNTguNzQgMzcuMzUtODguNzRhNC4zNiA0LjM2IDAgMCAxIDcuNTYuNjljMTAuODYgMjMuODcgNDkgMTAzLjggOTMuMzQgMTUyLjc5YTQuNjUgNC42NSAwIDAgMS01LjYyIDcuMjJjLTM2LjU3LTE5LjM4LTgzLjAxLTQzLjAyLTkxLjc5LTQzWm0tMTUuNDcgMzg0LjhhNC41MSA0LjUxIDAgMCAxLTQuNDYtMy45MmwtMTMuODItMTA3LjI5YTQuNSA0LjUgMCAwIDEgOC45My0xLjE1bDEzLjgyIDEwNy4yOWE0LjUgNC41IDAgMCAxLTMuODkgNSAzLjg2IDMuODYgMCAwIDEtLjU4LjA3Wk01NzcuMDggNTQuNThjLTQ2Ljc5IDE1Ljg1LTExNS40NSA0MC41Ni0xNTguNzMgNjIuNzlhMzUuNSAzNS41IDAgMCAwLTE4LjU3IDI0LjUzYy0zLjk1IDE5LjQ5LTExIDU2LjA5LTE5IDEwNy4yNi0uNyA0LjQ4LTcuMzYgMy43OC03LjExLS43NWwxMC42Ni0xOTQuNzNhMy43OCAzLjc4IDAgMCAxIDcuNDYtLjY2bDMuNDkgMTQuODVhMi41NyAyLjU3IDAgMCAwIDQuNjkuNzdjNi4xOC0xMCAyMi4zNy0zMi43OSA1Ny4zMi02NWE0LjEzIDQuMTMgMCAwIDEgNi41NiA0LjcybC0zMi41NCA3Mi44OXM3OC43OC0xOS4zNyAxNDQtMzMuMDljNC4xMS0uODcgNS42OSA1LjA4IDEuNzcgNi40MloiIGZpbGw9IiNmZmYiIHN0cm9rZT0iYmxhY2siLz4KICA8ZyBmaWxsPSIjZjQ0Ij4KICAgIDxwYXRoIGZpbHRlcj0iYnJpZ2h0bmVzcyg2MCUpIHNhdHVyYXRlKDEyMCUpIiBkPSJtOTQ3LjA3IDQxMC4zNS01Ny43NSAzNDcuNzlhMzUuMTggMzUuMTggMCAwIDEtMjIuMDYgMjcuMTVsLTE2Mi40MyA2MS42NWgtLjA2YTM1LjUyIDM1LjUyIDAgMCAxLTEyLjA2IDIuMTEgMzQuODMgMzQuODMgMCAwIDEtMjIuMjktOGwtMjczLjE3LTIyMy41YTExNS40MyAxMTUuNDMgMCAwIDEtNDAuNzYtMTA4LjIybDU3Ljc1LTM0Ny44QTM1LjI1IDM1LjI1IDAgMCAxIDQzNiAxMzQuNDdsMTYyLjgzLTYxLjc5YTM1LjUxIDM1LjUxIDAgMCAxIDEyLTIuMDggMzQuODMgMzQuODMgMCAwIDEgMjIuMjkgOGwyNzMuMTkgMjIzLjUyYTExNS4zOCAxMTUuMzggMCAwIDEgNDAuNzYgMTA4LjIzWiIvPgogICAgPHBhdGggZD0iTTkzNC4yNSA0MDguMjIgODc2LjUgNzU2YTIyLjM0IDIyLjM0IDAgMCAxLTM2LjE4IDEzLjYzbC0yNzMuMTctMjIzLjVhMTAyLjQyIDEwMi40MiAwIDAgMS0zNi4xNy05Nmw1Ny43NS0zNDcuODNhMjIuMzQgMjIuMzQgMCAwIDEgMzYuMTgtMTMuNjNsMjczLjE3IDIyMy41MWExMDIuNDIgMTAyLjQyIDAgMCAxIDM2LjE3IDk2LjA0WiIvPgogIDwvZz4KICA8ZWxsaXBzZSBmaWxsPSIjZmZmIiBzdHJva2U9ImJsYWNrIiBjeD0iNzMyLjYxIiBjeT0iNDI5LjE2IiByeD0iNjIuODMiIHJ5PSIxMTAuNzMiIHRyYW5zZm9ybT0icm90YXRlKC0xNS40NSA3MzIuNzAzIDQyOS4xOTkpIi8+Cjwvc3ZnPg==" alt="Website" /></a>
<a href="https://www.patreon.com/bsmanager"><img
src="https://img.shields.io/badge/-🤍%20Support%20BSM-EC4546?style=for-the-badge" alt="Donation" /></a>
</div>
<!--
@@ -224,6 +226,10 @@
-->
<div>
<h2><b>How to install?</b></h2>
</div>
<div>
<h3><b>Windows Installation</b></h3>
<ul>
<li>Download the <a href="https://github.com/Zagrios/bs-manager/releases/latest">latest release</a> from <a
href="https://github.com/Zagrios/bs-manager/releases">Releases</a>.</li>
@@ -237,6 +243,10 @@
<video src="https://github.com/Zagrios/bs-manager/assets/40648115/4215384e-eb68-40da-884c-f21df491ef75" />
</div>
<div>
<h3><b>Linux installation</b></h3>
<p>Refer to <a href="https://github.com/Zagrios/bs-manager/wiki/Linux">Linux wiki</a></p>
</div>
<!--
----------------------------------------
@@ -287,13 +297,11 @@
<div>
<ul>
<li><strong>via Oculus</strong>: For Oculus users, <a href="https://github.com/Zagrios/bs-manager">BSManager</a>
uses authentication directly via the <a href="https://about.meta.com/fr/">META</a> website
to retrieve the connection token, ensuring reliable and secure access to your account data.</li>
requires you to retrieve a connection token by following the instructions in this guide: <a href="https://github.com/Zagrios/bs-manager/wiki/How-to-obtain-your-Oculus-Token">How to obtain your Oculus Token</a>. Once obtained, please insert it into the form.</li>
</ul>
</div>
<div align="center">
<img height=450 src="https://github.com/Zagrios/bs-manager/assets/40648115/1e4a2f98-af16-45aa-821d-0c4e90e1e54b" />
<img height=450 src="https://github.com/Zagrios/bs-manager/assets/40648115/3674e629-542d-4de3-b8db-b248f25126d7" />
</div>
@@ -546,10 +554,12 @@
<div>
<h2>Credits</h2>
<ul>
<li><a href="https://github.com/Zagrios">Zagrios</a> - Lead Developer & Founder.</li>
<li><a href="https://github.com/Zagrios">Zagrios - Mathieu Gries</a> - Lead Developer & Founder.</li>
<li><a href="https://github.com/Iluhadesu">Iluhadesu</a> - Co-Developer & Co-Founder, Discord Bot Developer.</li>
<li><a href="https://github.com/GaetanGrd">GaetanGrd</a> - Co-Developer & Co-Founder, Documentation Lead.</li>
<li><a href="https://github.com/cheddZy">cheddZy</a> - Icon Creator.</li>
<li><a href="https://github.com/Insprill">Insprill</a> - Co-Developer, Linux Developer, AUR Maintainer.</li>
<li><a href="https://github.com/silentrald">silentrald</a> - Co-Developer, Linux Developer, deb and flatpak Maintainer.</li>
</ul>
</div>
Binary file not shown.

After

Width:  |  Height:  |  Size: 401 KiB

+2 -2
View File
@@ -803,6 +803,6 @@
"ReleaseURL": "https://steamcommunity.com/games/620980/announcements/detail/4451340304252928024",
"ReleaseDate": "1732107748",
"year": "2024",
"recommended": true
"recommended": true
}
]
]
+52 -23
View File
@@ -18,9 +18,6 @@
{
"username": "Falmil"
},
{
"username": "K1Lc4m"
},
{
"username": "Anonymously42",
"type": "diamond",
@@ -30,9 +27,6 @@
"username": "Burt",
"type": "gold"
},
{
"username": "Ilnahro"
},
{
"username": "Phil",
"type": "gold"
@@ -41,18 +35,10 @@
"username": "Protocrush",
"type": "gold"
},
{
"username": "ServerMensch",
"type": "gold"
},
{
"username": "Karlito",
"type": "gold"
},
{
"username": "Cathery",
"type": "gold"
},
{
"username": ".sharkey"
},
@@ -68,26 +54,69 @@
"type": "diamond",
"link": "https://www.youtube.com/@lumberjack462"
},
{
{
"username": "Xero"
},
{
{
"username": "Minescence"
},
{
"username": "Finlay"
},
{
{
"username": "mereknom"
},
{
{
"username": "Jascha"
},
{
{
"username": "Celldweller",
"type": "gold"
},
{
{
"username": "rhythmshade"
},
{
"username": "liborsaf"
},
{
"username": "aatame3",
"type": "gold"
},
{
"username": "Joshua"
},
{
"username": "Stuijvi",
"type": "gold"
},
{
"username": "_ monaka"
},
{
"username": "Better_Axel"
},
{
"username": "Riley",
"type": "gold"
},
{
"username": "Austin"
},
{
"username": "Fatalution",
"type": "diamond",
"link": "https://x.com/fatalution"
},
{
"username": "Taurus Arcade",
"type": "gold"
},
{
"username": "Mozz_Zm"
},
{
"username": "clapxz"
},
{
"username": "Reflected Chop",
"type": "gold"
}
]
File diff suppressed because it is too large Load Diff
+323 -36
View File
@@ -50,14 +50,16 @@
"filters-btn": "Filters",
"dropdown": {
"export-maps": "Export maps",
"delete-maps": "Delete maps"
"delete-maps": "Delete maps",
"delete-duplicate-maps": "Delete duplicates"
}
},
"tabs": {
"maps": {
"actions": {
"add-maps": {
"text": "Add"
"drop-down": {
"browse-maps": "Browse maps",
"import-maps": "Import maps"
},
"link-maps": {
"tooltips": {
@@ -69,6 +71,21 @@
"empty-maps": {
"text": "No maps",
"button": "Download maps"
},
"drop-zone": {
"text": "Import your maps",
"subtext": "Drop your zip files here to import your maps"
}
},
"playlists": {
"drop-down": {
"browse-playlists": "Browse playlists",
"create-a-playlist": "Create a playlist",
"import-playlists": "Import playlists"
},
"drop-zone": {
"text": "Import your playlists",
"subtext": "Drop your \".bplist\" or \".json\" files here to import them"
}
}
}
@@ -79,7 +96,8 @@
"mods-not-available": "No mods are available yet for this version of Beat Saber",
"buttons": {
"more-infos": "More info",
"install-or-update": "Install or update"
"install-or-update": "Install or update",
"reinstall-all": "Reinstall all"
},
"mods-grid": {
"header-bar": {
@@ -92,6 +110,12 @@
"unselect-all": "Unselect all"
}
}
},
"notifications": {
"all-mods-already-installed": {
"title": "Mods already installed",
"description": "All selected mods are already installed"
}
}
},
"dropdown": {
@@ -119,6 +143,7 @@
"title": "Steam & Oculus",
"description": "Logging out will allow you to switch accounts on the next Beat Saber download.",
"logout": "Log out",
"logout-success": "Logout Successful",
"download-platform": {
"title": "Default Platform",
"desc": "Choose the default platform that will be used to download versions of Beat Saber.",
@@ -138,8 +163,15 @@
},
"installation-folder": {
"title": "Installation folder",
"description": "Change the default folder for Beat Saber versions and other upcoming features.",
"choose-folder": "Choose folder"
"description": "Change the folder that will contain all the content downloaded by BSManager."
},
"proton-folder": {
"title": "Proton folder",
"description": "Change the folder to the Proton path. (eg. Proton - Experimental)",
"errors": {
"title": "Setting the Proton folder failed",
"invalid-folder": "Invalid Proton folder path"
}
},
"additional-content": {
"title": "Additional content",
@@ -161,6 +193,7 @@
"zh-CN": "简体中文",
"zh-TW": "正體中文",
"ja-JP": "日本語",
"ko-KR": "한국어",
"translated": {
"en-EN": "English, United Kingdom",
"en-US": "English, USA",
@@ -170,7 +203,8 @@
"ru-RU": "Russian",
"zh-CN": "Chinese (Simplified)",
"zh-TW": "Chinese (Traditional)",
"ja-JP": "Japanese"
"ja-JP": "Japanese",
"ko-KR": "Korean"
}
}
},
@@ -197,6 +231,34 @@
"report-bug": "Report a bug",
"open-logs": "Open logs"
}
},
"advanced": {
"title": "Advanced",
"description": "Advanced settings for BSManager.",
"hardware-acceleration": {
"title": "Hardware Acceleration",
"description": "Enable Hardware Acceleration to use your GPU and improve BSManager's performance. Turn this off if you're experiencing frame drops.",
"modal": {
"title": "Restart Needed",
"body": "Changing hardware acceleration setting will quit and re-launch BSManager. Are you sure you want to do this?",
"confirm-btn": "Yes I'm sure"
},
"error-notification": {
"message": "An error occur, unable to disable hardware acceleration."
}
},
"use-symlinks": {
"title": "Use Symlinks",
"description": "Use Symlinks instead of Junctions to link folders. Turn this on only if you really need it.",
"modal": {
"title": "Symlink Permissions",
"body": "When creating symlinks, BSManager will require administrator privileges or developer mode enabled on your system. Are you sure you want to continue?",
"confirm-btn": "Yes I'm sure"
},
"error-notification": {
"message": "An error occur, unable to change symlinks settings."
}
}
}
}
},
@@ -215,11 +277,13 @@
"errors": {
"titles": {
"operation-running": "Operation running",
"no-internet": "No internet"
"no-internet": "No internet",
"file-not-supported": "File not supported"
},
"msg": {
"operation-running": "Wait for the current operation to finish, then try again.",
"no-internet": "Check your connection and try again."
"no-internet": "Check your connection and try again.",
"file-not-supported": "Only {types} files are supported."
}
}
},
@@ -241,9 +305,6 @@
}
},
"errors": {
"titles": {
"dotnet-required": ".NET 8 Required"
},
"msg": {
"401": "Steam doesn't seem to want to let us download Beat Saber 😢",
"404": "Unable to contact Steam servers.",
@@ -266,11 +327,7 @@
"LicenceError": "Unable to get the list of licenses.",
"RateLimitExceeded": "You've tried too many times, wait a while and try again later.",
"TokenRejected": "Your login token has been rejected 😕 Please try again.",
"AccessDenied": "Access to Steam has been denied.",
"dotnet-required": ".NET 8 Runtime must be installed in order to download a version of Beat Saber. Download it by clicking the button below."
},
"actions": {
"download-dotnet": "Download .NET 8"
"AccessDenied": "Access to Steam has been denied."
}
}
},
@@ -386,6 +443,8 @@
"OCULUS_NOT_RUNNING": "Oculus is not running",
"BS_ALREADY_RUNNING": "Beat Saber already running",
"EXE_NOT_FINDED": "Missing files",
"PROTON_NOT_SET": "Proton folder not set",
"PROTON_NOT_FOUND": "Proton binary not found",
"EXIT": "Abrupt stop",
"OCULUS_LIB_NOT_FOUND": "Oculus library not found",
"ORIGINAL_OCULUS_NOT_INSTALLED": "Original Oculus version not found"
@@ -419,7 +478,8 @@
"CantEditSteam": "Unable to edit",
"CantRename": "Renaming impossible",
"VersionAlreadExist": "This version already exists",
"CantClone": "Cloning impossible"
"CantClone": "Cloning impossible",
"UnknownError": "An unknown error occurred"
},
"msg": {
"CantEditSteam": "You can't edit the Steam version. You can clone it though."
@@ -472,6 +532,27 @@
"one-click-install": {
"success": "Map installation complete",
"error": "An error occurred while installing the map"
},
"no-duplicates-maps": {
"title": "No Duplicates",
"msg": "No maps were deleted"
},
"duplicates-maps-deleted": {
"title": "Duplicates Deleted",
"msg": "Duplicates were deleted"
},
"import-map": {
"titles": {
"success": "Maps import completed",
"error": "An error occurred during the maps import"
},
"msgs": {
"success": "Maps successfully imported.",
"some-success": "Some maps were successfully imported.",
"only-accept-zip": "Only zip files are supported.",
"invalid-zip": "The zip file(s) do not contain any maps.",
"unknown": "An unknown error occurred."
}
}
},
"playlists": {
@@ -499,7 +580,7 @@
"EPERM": "BSManager does not have the necessary permissions to link the folder.",
"EACCES": "BSManager does not have the necessary permissions to link the folder.",
"ENOSPC": "The disk is full, make some space and try again.",
"UNKNOWN_ERROR":"An unknown error has occurred while linking the folder."
"UNKNOWN_ERROR": "An unknown error has occurred while linking the folder."
}
}
},
@@ -578,8 +659,8 @@
},
"steam-credentials": {
"title": "Steam Credentials",
"p-1": "The credentials are only used to download the game because steam need to verify that you paid the game in order to be allowed to download it. They aren't saved and directly passed to DepotDownloader. If you don't want to enter your credentials you can follow this tutorial :",
"p-2": "and then click on the gear icon in the top right corner and select \"Import a version\", select the folder where beat saber has been downloaded (If you follow the tutorial above you should have the correct location)"
"p-1": "Your Steam credentials are only required to download versions of Beat Saber, we use DepotDownloader to achieve this which requires your Steam credentials to verify that you own the game within your library before allowing you to retrieve the game files, your credentials are not stored or saved and are passed directly to DepotDownloader. However, if you don't want to do that, you can follow this tutorial instead: ",
"p-2": "Afterwards you can click on the gear icon in the top right corner and select \"Import a version\", then you can select the folder where Beat Saber was downloaded to. (If you followed the tutorial, you will have the right location)"
},
"bs-import-version": {
"title": "Import a version",
@@ -674,6 +755,11 @@
"title": "Keeping maps will copy all maps from the shared folder to the current version after unlinking. Maps will not be lost if this is disabled."
},
"valid-btn": "Unlink maps"
},
"delete-duplicate-maps": {
"title": "Delete maps?",
"desc": "Only the map \"{map}\" is a duplicate. Are you sure you want to delete it?",
"desc-plural": "{nb} duplicate maps have been found. Are you sure you want to delete them?"
}
},
"download-maps": {
@@ -718,12 +804,13 @@
"stay": "Remember me",
"connect-to-meta": "Connect to Meta"
},
"enable-oculus-sideloaded-apps": {
"title": "Enable Sideloading",
"info-1": "In order to launch Beat Saber, the ability to run sideloaded apps must be enabled. BSManager will request administrator rights to enable this feature automatically.",
"info-2": "The sideloaded apps feature allows launching games located outside your Oculus library folder.",
"info-3": "After sideloading is activated, the feature will remain active, and you will no longer be prompted to enable it.",
"i-want-to-do-it-myself": "I want to do it myself",
"original-version-backup-oculus": {
"title": "Warning",
"body": {
"must-be-installed-once": "You must have Beat Saber installed from the Oculus Store on this device, otherwise Beat Saber might automatically close after launching.",
"will-backup": "To launch this version, the original installation folder of Beat Saber located in your Oculus library will be renamed and will be automatically restored when Beat Saber is closed."
},
"not-remind-me": "Do not remind me",
"understood": "Understood"
},
"enter-meta-token": {
@@ -754,6 +841,18 @@
"launch-as-admin": "Launch as Administrator",
"not-remind-me": "Do not remind me"
},
"ask-install-path": {
"title": "Installation folder",
"choose-folder-description": "Choose the folder that will contain all the content downloaded by BSManager. (versions, mods, maps, playlists, etc.)",
"default": "Default",
"default-tooltip": "Defaults to your home folder"
},
"choose-proton-folder": {
"title": "Proton Folder",
"proton-folder-description": "On Linux, BSManager requires Proton to work. Choose the Proton installation folder to continue.",
"proton-folder-placeholder": "Proton installation folder",
"where-is-proton-installed": "Where is Proton installed?"
},
"bs-version-outdated": {
"body": "The version {outdatedVersion} is outdated, and some mods or features may no longer work as expected. Please download the latest recommended version ({recommendedVersion}) of Beat Saber to enjoy the latest features and bugfixes."
}
@@ -761,7 +860,8 @@
"maps": {
"map-filter-panel": {
"duration": "Duration",
"nps" : "Notes Per Second",
"nps": "Notes Per Second",
"njs": "Note Jump Speed",
"tags": "tags",
"specificities": "general",
"requirements": "requirements",
@@ -835,11 +935,12 @@
"by": "By {songAutor}",
"mapped-by": "mapped by",
"delete": "Delete",
"preview" : "Preview map",
"bsr-code" : "BSR code",
"download" : "Download map",
"downloading" :"Downloading map",
"cancel-download" : "Cancel download"
"preview": "Preview map",
"bsr-code": "BSR code",
"download": "Download map",
"downloading": "Downloading map",
"cancel-download": "Cancel download",
"hightlight-difficulty": "Highlight difficulty"
}
},
"models": {
@@ -1027,9 +1128,195 @@
}
}
},
"drop-zone": {
"or-browse-files": "Or browse files"
},
"playlist": {
"error-playlist-creation-title": "Error creating playlist",
"error-playlist-creation-desc": "An error occurred while creating the playlist.",
"playlist-created-title": "Playlist created",
"playlist-created-desc": "The playlist has been successfully created. You can now sync its maps!",
"download-playlist": "Download playlist",
"synchronize-playlist": "Synchronize playlist",
"synchronize-maps": "Synchronize maps",
"error-playlists-synchronization-title": "Error synchronizing playlists",
"error-playlists-synchronization-desc": "An error occurred while synchronizing playlists.",
"playlists-synchronized-title": "Playlists synchronized!",
"playlists-synchronized-desc": "Playlists and their maps have been downloaded.",
"playlists-export-error-title": "Error exporting playlists",
"playlists-export-error-desc": "An error occurred while exporting playlists.",
"playlists-exported-title": "Playlists exported!",
"playlists-exported-desc": "Playlists have been successfully exported.",
"playlists-with-maps-exported-desc": "Playlists and their maps have been successfully exported.",
"playlist-delete-error-title": "Error deleting playlist",
"playlist-delete-error-desc": "An error occurred while deleting the playlist.",
"playlists-deleted-title": "Playlists deleted!",
"playlists-deleted-desc": "Playlists have been successfully deleted.",
"edit-playlist": "Edit playlist",
"playlist-edit-error-title": "Error editing playlist",
"playlist-edit-error-desc": "An error occurred while editing the playlist.",
"playlist-edited-title": "Playlist edited!",
"playlist-edited-desc": "The playlist has been successfully modified. You can now sync its maps!",
"playlists-loading": "Loading playlists...",
"no-playlists": "No playlists",
"download-playlists": "Download playlists",
"created-by": "Created by",
"stop-download": "Stop download",
"cancel-download": "Cancel download",
"open-file": "Open file",
"link-playlists": "Link playlists",
"link-playlist-desc": "Linking playlists allows sharing playlists between all versions. Once linked, this version will benefit from shared playlists",
"link-playlist-info": "Adding and deleting playlists will also be shared",
"keep-playlists": "Keep playlists",
"keep-playlists-tip": "Keeping playlists will move the playlists from the current version to the shared playlists folder. Otherwise, they will be lost",
"unlink-playlists": "Unlink playlists",
"unlink-playlist-desc": "Warning, unlinking playlists will no longer allow the use of shared playlists for this version.",
"unlink-keep-playlists-tip": "Keeping playlists will create a copy of shared playlists for the current version. Otherwise, no playlists will be kept for this version.",
"delete-playlist-ask": "Delete playlist?",
"delete-playlists-ask": "Delete playlists?",
"delete-playlist-desc": "Are you sure you want to delete the playlist \"{playlistTitle}\"?",
"delete-playlists-desc": "Are you sure you want to delete {nb} playlists?",
"delete-maps": "Delete maps",
"delete-playlist-maps-tip": "If enabled, all maps in the playlist will be deleted",
"delete-playlists-maps-tip": "If enabled, all maps in the playlists will be deleted",
"export-playlist-ask": "Export playlist?",
"export-playlists-ask": "Export playlists?",
"export-playlist-desc": "Are you sure you want to export the playlist \"{playlistTitle}\"?",
"export-playlists-desc": "Are you sure you want to export {nb} playlists?",
"export-maps": "Export maps",
"export-playlist-maps-tip": "If enabled, all maps in the playlist will also be exported",
"export-playlists-maps-tip": "If enabled, all maps in the playlists will also be exported",
"export": "Export",
"need-clone-title": "Warning",
"need-clone-desc-1": "This playlist has been downloaded from an external site and contains a synchronization link.",
"need-clone-desc-2": "To avoid losing your changes during synchronization, the playlist will be duplicated and its synchronization link removed.",
"need-clone-desc-3": "You can then, if you wish, delete the original playlist.",
"understood": "I understand",
"synchronize-playlist-ask": "Synchronize playlist?",
"synchronize-playlists-ask": "Synchronize playlists?",
"synchronize-playlist-desc": "Are you sure you want to synchronize the playlist \"{playlistTitle}\"?",
"synchronize-playlists-desc": "Are you sure you want to synchronize {nb} playlists?",
"synchronize-playlist-tip": "This action updates playlists and downloads missing maps; it may take several minutes.",
"synchronize": "Synchronize",
"curated": "Recommended",
"verified-mapper": "Verified mapper",
"empty-playlists": "Empty playlists",
"search-playlist": "Search for a playlist",
"no-playlists-found": "No playlists found",
"error-occur-while-loading-playlists": "An error occurred while loading playlists",
"error-occur-while-loading-playlist": "An error occurred while loading the playlist",
"loading-maps": "Loading maps...",
"no-maps-found-for-playlist": "No maps found for this playlist",
"playlist-contain-no-maps": "The playlist contains no maps",
"no-map-installed-for-playlist": "No maps installed for this playlist",
"playlist-is-waiting-to-download": "The playlist is waiting to download",
"download-maps": "Download maps",
"download-missing-maps": "Download missing maps",
"playlist-is-downloading": "The playlist is downloading",
"some-playlist-maps-are-missing": "Some maps in this playlist are missing",
"create-a-playlist": "Create a playlist",
"synchronize-playlists": "Synchronize playlists",
"export-playlists": "Export playlists",
"delete-playlists": "Delete playlists",
"choose-image": "Choose an image",
"title": "Title",
"playlist-title": "Playlist title",
"description": "Description",
"playlist-description": "Playlist description",
"author": "Author",
"playlist-author": "Playlist author",
"save": "Save",
"loading": "Loading...",
"installed": "Installed",
"no-map-found": "No map found",
"edit-playlist-shortcuts": "Hold Shift or Ctrl to select multiple maps",
"add-to-playlist": "Add to playlist",
"remove-from-playlist": "Remove from playlist",
"playlist-is-empty": "The playlist is empty",
"continue": "Continue",
"nb-maps": "Number of maps",
"nb-mappers": "Number of mappers",
"duration": "Duration",
"nps": "Notes per second",
"date-picker": {
"start-date-end-date": "Start date — End date",
"all": "All",
"last-24h": "Last 24h",
"last-week": "Last week",
"last-month": "Last month",
"3-last-month": "Last 3 months"
},
"playlists-imported": "Playlists imported",
"all-playlists-have-been-successfully-imported": "All playlists have been successfully imported",
"no-playlist-found": "No playlist found",
"no-playlist-found-in-selected-files": "No playlist found in the selected files",
"some-playlists-not-imported": "Some playlists not imported",
"some-playlists-have-been-imported": {
"INVALID_SOURCE": "Some playlists could not be found",
"INVALID_PLAYLIST_FILE": "Some playlists are invalid",
"CANNOT_PARSE_PLAYLIST": "Some playlists are unreadable",
"unknown": "Some playlists could not be imported"
},
"no-playlists-imported": "No playlists imported",
"no-playlists-imported-errors": {
"INVALID_SOURCE": "Playlists could not be found",
"INVALID_PLAYLIST_FILE": "Playlists are invalid",
"CANNOT_PARSE_PLAYLIST": "Playlists are unreadable",
"unknown": "No playlist could be imported"
}
},
"dateformat": {
"dayNames": ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
"monthNames": ["Jan", "Feb", "Mar", "Apr", "May", "June", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
"timeNames": ["a", "p", "am", "pm", "A", "P", "AM", "PM"]
"dayNames": [
"Sun",
"Mon",
"Tue",
"Wed",
"Thu",
"Fri",
"Sat",
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
],
"monthNames": [
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"June",
"Jul",
"Aug",
"Sept",
"Oct",
"Nov",
"Dec",
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
],
"timeNames": [
"a",
"p",
"am",
"pm",
"A",
"P",
"AM",
"PM"
]
}
}
+320 -33
View File
@@ -50,14 +50,16 @@
"filters-btn": "Filtros",
"dropdown": {
"export-maps": "Exportar mapas",
"delete-maps": "Borrar mapas"
"delete-maps": "Borrar mapas",
"delete-duplicate-maps": "Borrar duplicados"
}
},
"tabs": {
"maps": {
"actions": {
"add-maps": {
"text": "Añadir"
"drop-down": {
"browse-maps": "Explorar mapas",
"import-maps": "Importar mapas"
},
"link-maps": {
"tooltips": {
@@ -69,6 +71,21 @@
"empty-maps": {
"text": "No hay mapas",
"button": "Descargar mapas"
},
"drop-zone": {
"text": "Importar tus mapas",
"subtext": "Suelta tus archivos zip aquí para importar tus mapas"
}
},
"playlists": {
"drop-down": {
"browse-playlists": "Explorar listas de reproducción",
"create-a-playlist": "Crear una lista de reproducción",
"import-playlists": "Importar listas de reproducción"
},
"drop-zone": {
"text": "Importa tus listas de reproducción",
"subtext": "Suelta tus archivos \".bplist\" o \".json\" aquí para importarlos"
}
}
}
@@ -79,7 +96,8 @@
"mods-not-available": "Aún no hay mods disponibles para esta versión de Beat Saber",
"buttons": {
"more-infos": "Más información",
"install-or-update": "Instalar o actualizar"
"install-or-update": "Instalar o actualizar",
"reinstall-all": "Reinstalar todo"
},
"mods-grid": {
"header-bar": {
@@ -92,6 +110,12 @@
"unselect-all": "Deseleccionar todo"
}
}
},
"notifications": {
"all-mods-already-installed": {
"title": "Mods ya instalados",
"description": "Todos los mods seleccionados ya están instalados"
}
}
},
"dropdown": {
@@ -119,6 +143,7 @@
"title": "Steam & Oculus",
"description": "Desconectarte te permitirá cambiar de cuenta en la próxima descarga de Beat Saber.",
"logout": "Cerrar sesión",
"logout-success": "Cierre de sesión exitoso",
"download-platform": {
"title": "Plataforma predeterminada",
"desc": "Elige la plataforma predeterminada que se utilizará para descargar las versiones de Beat Saber.",
@@ -138,8 +163,15 @@
},
"installation-folder": {
"title": "Carpeta de instalación",
"description": "Cambia la carpeta por defecto para las versiones de Beat Saber y próximas funciones.",
"choose-folder": "Elige la carpeta"
"description": "Cambiar la carpeta que contendrá todo el contenido descargado por BSManager."
},
"proton-folder": {
"title": "Carpeta de Proton",
"description": "Cambia la carpeta a la ruta de Proton. (por ejemplo, Proton - Experimental)",
"errors": {
"title": "Falló al configurar la carpeta de Proton",
"invalid-folder": "Ruta de carpeta de Proton no válida"
}
},
"additional-content": {
"title": "Contenido adicional",
@@ -161,6 +193,7 @@
"zh-CN": "简体中文",
"zh-TW": "正體中文",
"ja-JP": "日本語",
"ko-KR": "한국어",
"translated": {
"en-EN": "Inglés, Reino Unido",
"en-US": "Inglés, Estados Unidos",
@@ -170,7 +203,8 @@
"ru-RU": "Ruso",
"zh-CN": "Chino simplificado",
"zh-TW": "Chino tradicional",
"ja-JP": "Japonés"
"ja-JP": "Japonés",
"ko-KR": "Coreano"
}
}
},
@@ -197,6 +231,34 @@
"report-bug": "Informar de un error",
"open-logs": "Abrir los registros"
}
},
"advanced": {
"title": "Avanzados",
"description": "Configuraciones avanzadas para BSManager.",
"hardware-acceleration": {
"title": "Aceleración de hardware",
"description": "Habilite la aceleración de hardware para usar su GPU y mejorar el rendimiento de BSManager. Desactive esta opción si experimenta caídas de fotogramas.",
"modal": {
"title": "Reinicio necesario",
"body": "Cambiar la configuración de aceleración de hardware cerrará y reiniciará BSManager. ¿Estás seguro de que quieres hacer esto?",
"confirm-btn": "Sí, estoy seguro"
},
"error-notification": {
"message": "Ocurrió un error, no se puede desactivar la aceleración de hardware."
}
},
"use-symlinks": {
"title": "Usar enlaces simbólicos",
"description": "Utilice enlaces simbólicos en lugar de uniones para enlazar carpetas. Actívelo solo si realmente lo necesita.",
"modal": {
"title": "Permisos de enlace simbólico",
"body": "Al crear enlaces simbólicos, BSManager requerirá privilegios de administrador o el modo desarrollador activado en su sistema. ¿Estás seguro de que quieres continuar?",
"confirm-btn": "Sí, estoy seguro"
},
"error-notification": {
"message": "Ocurrió un error, no se pueden cambiar los ajustes de los enlaces simbólicos."
}
}
}
}
},
@@ -215,11 +277,13 @@
"errors": {
"titles": {
"operation-running": "Operación en curso",
"no-internet": "Sin internet"
"no-internet": "Sin internet",
"file-not-supported": "Archivo no compatible"
},
"msg": {
"operation-running": "Espera a que termine la operación actual y vuelve a empezar.",
"no-internet": "Comprueba tu conexión a Internet e inténtalo de nuevo."
"no-internet": "Comprueba tu conexión a Internet e inténtalo de nuevo.",
"file-not-supported": "Solo se admiten archivos {types}."
}
}
},
@@ -241,9 +305,6 @@
}
},
"errors": {
"titles": {
"dotnet-required": ".NET 8 Requerido"
},
"msg": {
"401": "Parece que Steam no quiere dejarnos descargar Beat Saber 😢",
"404": "No se puede contactar con los servidores de Steam",
@@ -266,11 +327,7 @@
"LicenceError": "No se puede obtener la lista de licencias.",
"RateLimitExceeded": "Lo has intentado demasiadas veces, espera un poco y vuelve a intentarlo más tarde.",
"TokenRejected": "Tu token de inicio de sesión ha sido rechazada 😕 Por favor, inténtalo de nuevo.",
"AccessDenied": "El acceso a Steam ha sido denegado.",
"dotnet-required": "Se debe instalar el tiempo de ejecución de .NET 8 para descargar una versión de Beat Saber. Descárgalo haciendo clic en el botón de abajo."
},
"actions": {
"download-dotnet": "Descargar .NET 8"
"AccessDenied": "El acceso a Steam ha sido denegado."
}
}
},
@@ -386,6 +443,8 @@
"OCULUS_NOT_RUNNING": "Oculus no funciona",
"BS_ALREADY_RUNNING": "Beat Saber ya está en marcha",
"EXE_NOT_FINDED": "Archivos no encontrados",
"PROTON_NOT_SET": "Carpeta de Proton no establecida",
"PROTON_NOT_FOUND": "Binario de Proton no encontrado",
"EXIT": "Parada abrupta",
"OCULUS_LIB_NOT_FOUND": "Librería Oculus no encontrada",
"ORIGINAL_OCULUS_NOT_INSTALLED": "No se encontró la versión original de Oculus"
@@ -419,7 +478,8 @@
"CantEditSteam": "Imposible editar",
"CantRename": "Cambio de nombre imposible",
"VersionAlreadExist": "Esta versión ya existe",
"CantClone": "Clonación imposible"
"CantClone": "Clonación imposible",
"UnknownError": "Ocurrió un error desconocido"
},
"msg": {
"CantEditSteam": "No puedes editar la versión de Steam. Sin embargo, puedes clonarla."
@@ -472,6 +532,27 @@
"one-click-install": {
"success": "Instalación del mapa completada",
"error": "Se produjo un error durante la instalación del mapa"
},
"no-duplicates-maps": {
"title": "Sin duplicados",
"msg": "No se eliminó ninguna carta"
},
"duplicates-maps-deleted": {
"title": "Duplicados eliminados",
"msg": "Se eliminaron los duplicados"
},
"import-map": {
"titles": {
"success": "Importación de mapas completada",
"error": "Ocurrió un error durante la importación de mapas"
},
"msgs": {
"success": "Los mapas se han importado con éxito.",
"some-success": "Algunos mapas se han importado con éxito.",
"only-accept-zip": "Solo se admiten archivos zip.",
"invalid-zip": "El o los archivos zip no contienen mapas.",
"unknown": "Se produjo un error desconocido."
}
}
},
"playlists": {
@@ -674,6 +755,11 @@
"title": "Mantener los mapas creará una copia de los mapas compartidos para la versión actual. De lo contrario, no se mantendrá ningún mapa para esta versión."
},
"valid-btn": "Desvincular mapas"
},
"delete-duplicate-maps": {
"title": "¿Borrar mapas?",
"desc": "Solo el mapa \"{map}\" está duplicado. ¿Estás seguro de que quieres eliminarlo?",
"desc-plural": "Se han encontrado {nb} mapas duplicados. ¿Estás seguro de que quieres eliminarlos?"
}
},
"download-maps": {
@@ -718,12 +804,13 @@
"stay": "Recuérdame",
"connect-to-meta": "Conectarse a Meta"
},
"enable-oculus-sideloaded-apps": {
"title": "Habilitar Sideloading",
"info-1": "Para poder iniciar Beat Saber, se debe habilitar la capacidad de ejecutar aplicaciones en sideloading. BSManager solicitará permisos de administrador para habilitar esta función automáticamente.",
"info-2": "La función de sideloading permite iniciar juegos ubicados fuera de la carpeta de la biblioteca de Oculus.",
"info-3": "Una vez que se active el sideloading, la función permanecerá activa y ya no se le pedirá que la habilite.",
"i-want-to-do-it-myself": "Quiero hacerlo yo mismo",
"original-version-backup-oculus": {
"title": "Atención",
"body": {
"must-be-installed-once": "Debes tener Beat Saber instalado desde la tienda de Oculus en este dispositivo, de lo contrario, Beat Saber se cerrará automáticamente después de iniciarse.",
"will-backup": "Para lanzar esta versión, la carpeta de instalación original de Beat Saber ubicada en tu biblioteca de Oculus será renombrada y se restaurará automáticamente al cerrar Beat Saber."
},
"not-remind-me": "No volver a recordármelo",
"understood": "Entendido"
},
"enter-meta-token": {
@@ -754,6 +841,18 @@
"launch-as-admin": "Iniciar como Administrador",
"not-remind-me": "No volver a recordármelo"
},
"ask-install-path": {
"title": "Carpeta de instalación",
"choose-folder-description": "Elija la carpeta que contendrá todo el contenido descargado por BSManager. (versiones, mods, mapas, listas de reproducción, etc.)",
"default": "Predeterminado",
"default-tooltip": "Por defecto, en su carpeta personal"
},
"choose-proton-folder": {
"title": "Carpeta de Proton",
"proton-folder-description": "En Linux, BSManager necesita Proton para funcionar. Elija la carpeta de instalación de Proton para continuar.",
"proton-folder-placeholder": "Carpeta de instalación de Proton",
"where-is-proton-installed": "¿Dónde está instalado Proton?"
},
"bs-version-outdated": {
"body": "La versión {outdatedVersion} está obsoleta, y algunos mods o funciones pueden no funcionar como se espera. Por favor, descarga la última versión recomendada ({recommendedVersion}) de Beat Saber para disfrutar de las últimas funciones y correcciones de errores."
}
@@ -761,7 +860,8 @@
"maps": {
"map-filter-panel": {
"duration": "Duración",
"nps" : "Notas Por Segundo",
"nps": "Notas Por Segundo",
"njs": "Velocidad de salto de nota",
"tags": "tags",
"specificities": "general",
"requirements": "requisitos",
@@ -835,11 +935,12 @@
"by": "Por {songAutor}",
"mapped-by": "mapeado por",
"delete": "Borrar",
"preview" : "Vista previa del mapa",
"bsr-code" : "Código BSR",
"download" : "Descargar mapa",
"downloading" :"Descargando mapa",
"cancel-download" : "Cancelar descarga"
"preview": "Vista previa del mapa",
"bsr-code": "Código BSR",
"download": "Descargar mapa",
"downloading": "Descargando mapa",
"cancel-download": "Cancelar descarga",
"hightlight-difficulty": "Resaltar la dificultad"
}
},
"models": {
@@ -1027,9 +1128,195 @@
}
}
},
"drop-zone": {
"or-browse-files": "O navegar por los archivos"
},
"playlist": {
"error-playlist-creation-title": "Error al crear la lista de reproducción",
"error-playlist-creation-desc": "Ocurrió un error al crear la lista de reproducción.",
"playlist-created-title": "Lista de reproducción creada",
"playlist-created-desc": "La lista de reproducción se ha creado con éxito. ¡Ahora puedes sincronizar sus mapas!",
"download-playlist": "Descargar lista de reproducción",
"synchronize-playlist": "Sincronizar lista de reproducción",
"synchronize-maps": "Sincronizar mapas",
"error-playlists-synchronization-title": "Error al sincronizar listas de reproducción",
"error-playlists-synchronization-desc": "Ocurrió un error al sincronizar las listas de reproducción.",
"playlists-synchronized-title": "¡Listas de reproducción sincronizadas!",
"playlists-synchronized-desc": "Las listas de reproducción y sus mapas han sido descargados.",
"playlists-export-error-title": "Error al exportar listas de reproducción",
"playlists-export-error-desc": "Ocurrió un error al exportar las listas de reproducción.",
"playlists-exported-title": "¡Listas de reproducción exportadas!",
"playlists-exported-desc": "Las listas de reproducción se han exportado con éxito.",
"playlists-with-maps-exported-desc": "Las listas de reproducción y sus mapas se han exportado con éxito.",
"playlist-delete-error-title": "Error al eliminar la lista de reproducción",
"playlist-delete-error-desc": "Ocurrió un error al eliminar la lista de reproducción.",
"playlists-deleted-title": "¡Listas de reproducción eliminadas!",
"playlists-deleted-desc": "Las listas de reproducción se han eliminado con éxito.",
"edit-playlist": "Editar lista de reproducción",
"playlist-edit-error-title": "Error al editar la lista de reproducción",
"playlist-edit-error-desc": "Ocurrió un error al editar la lista de reproducción.",
"playlist-edited-title": "¡Lista de reproducción editada!",
"playlist-edited-desc": "La lista de reproducción se ha modificado con éxito. ¡Ahora puedes sincronizar sus mapas!",
"playlists-loading": "Cargando listas de reproducción...",
"no-playlists": "No hay listas de reproducción",
"download-playlists": "Descargar listas de reproducción",
"created-by": "Creado por",
"stop-download": "Detener descarga",
"cancel-download": "Cancelar descarga",
"open-file": "Abrir archivo",
"link-playlists": "Vincular listas de reproducción",
"link-playlist-desc": "Vincular listas de reproducción permite compartirlas entre todas las versiones. Una vez vinculada, esta versión se beneficiará de las listas de reproducción compartidas",
"link-playlist-info": "Añadir y eliminar listas de reproducción también se compartirá",
"keep-playlists": "Mantener listas de reproducción",
"keep-playlists-tip": "Mantener las listas de reproducción moverá las listas de la versión actual a la carpeta de listas compartidas. De lo contrario, se perderán",
"unlink-playlists": "Desvincular listas de reproducción",
"unlink-playlist-desc": "Advertencia, desvincular las listas de reproducción ya no permitirá el uso de listas compartidas para esta versión.",
"unlink-keep-playlists-tip": "Mantener las listas de reproducción creará una copia de las listas compartidas para la versión actual. De lo contrario, no se mantendrán listas para esta versión.",
"delete-playlist-ask": "¿Eliminar lista de reproducción?",
"delete-playlists-ask": "¿Eliminar listas de reproducción?",
"delete-playlist-desc": "¿Estás seguro de que quieres eliminar la lista de reproducción \"{playlistTitle}\"?",
"delete-playlists-desc": "¿Estás seguro de que quieres eliminar {nb} listas de reproducción?",
"delete-maps": "Eliminar mapas",
"delete-playlist-maps-tip": "Si está activado, se eliminarán todos los mapas de la lista de reproducción",
"delete-playlists-maps-tip": "Si está activado, se eliminarán todos los mapas de las listas de reproducción",
"export-playlist-ask": "¿Exportar lista de reproducción?",
"export-playlists-ask": "¿Exportar listas de reproducción?",
"export-playlist-desc": "¿Estás seguro de que quieres exportar la lista de reproducción \"{playlistTitle}\"?",
"export-playlists-desc": "¿Estás seguro de que quieres exportar {nb} listas de reproducción?",
"export-maps": "Exportar mapas",
"export-playlist-maps-tip": "Si está activado, también se exportarán todos los mapas de la lista de reproducción",
"export-playlists-maps-tip": "Si está activado, también se exportarán todos los mapas de las listas de reproducción",
"export": "Exportar",
"need-clone-title": "Advertencia",
"need-clone-desc-1": "Esta lista de reproducción se ha descargado de un sitio externo y contiene un enlace de sincronización.",
"need-clone-desc-2": "Para evitar perder tus cambios durante la sincronización, la lista de reproducción se duplicará y se eliminará su enlace de sincronización.",
"need-clone-desc-3": "Luego puedes, si lo deseas, eliminar la lista de reproducción original.",
"understood": "Entendido",
"synchronize-playlist-ask": "¿Sincronizar lista de reproducción?",
"synchronize-playlists-ask": "¿Sincronizar listas de reproducción?",
"synchronize-playlist-desc": "¿Estás seguro de que quieres sincronizar la lista de reproducción \"{playlistTitle}\"?",
"synchronize-playlists-desc": "¿Estás seguro de que quieres sincronizar {nb} listas de reproducción?",
"synchronize-playlist-tip": "Esta acción actualiza las listas de reproducción y descarga los mapas faltantes; puede tardar varios minutos.",
"synchronize": "Sincronizar",
"curated": "Recomendado",
"verified-mapper": "Mapeador verificado",
"empty-playlists": "Listas de reproducción vacías",
"search-playlist": "Buscar una lista de reproducción",
"no-playlists-found": "No se encontraron listas de reproducción",
"error-occur-while-loading-playlists": "Ocurrió un error al cargar las listas de reproducción",
"error-occur-while-loading-playlist": "Ocurrió un error al cargar la lista de reproducción",
"loading-maps": "Cargando mapas...",
"no-maps-found-for-playlist": "No se encontraron mapas para esta lista de reproducción",
"playlist-contain-no-maps": "La lista de reproducción no contiene mapas",
"no-map-installed-for-playlist": "No hay mapas instalados para esta lista de reproducción",
"playlist-is-waiting-to-download": "La lista de reproducción está esperando para descargar",
"download-maps": "Descargar mapas",
"download-missing-maps": "Descargar mapas faltantes",
"playlist-is-downloading": "La lista de reproducción se está descargando",
"some-playlist-maps-are-missing": "Faltan algunos mapas en esta lista de reproducción",
"create-a-playlist": "Crear una lista de reproducción",
"synchronize-playlists": "Sincronizar listas de reproducción",
"export-playlists": "Exportar listas de reproducción",
"delete-playlists": "Eliminar listas de reproducción",
"choose-image": "Elegir una imagen",
"title": "Título",
"playlist-title": "Título de la lista de reproducción",
"description": "Descripción",
"playlist-description": "Descripción de la lista de reproducción",
"author": "Autor",
"playlist-author": "Autor de la lista de reproducción",
"save": "Guardar",
"loading": "Cargando...",
"installed": "Instalado",
"no-map-found": "No se encontró ningún mapa",
"edit-playlist-shortcuts": "Mantén presionado Shift o Ctrl para seleccionar múltiples mapas",
"add-to-playlist": "Añadir a la lista de reproducción",
"remove-from-playlist": "Quitar de la lista de reproducción",
"playlist-is-empty": "La lista de reproducción está vacía",
"continue": "Continuar",
"nb-maps": "Número de mapas",
"nb-mappers": "Número de mapeadores",
"duration": "Duración",
"nps": "Notas por segundo",
"date-picker": {
"start-date-end-date": "Fecha de inicio — Fecha de fin",
"all": "Todo",
"last-24h": "Últimas 24h",
"last-week": "Última semana",
"last-month": "Último mes",
"3-last-month": "Últimos 3 meses"
},
"playlists-imported": "Listas de reproducción importadas",
"all-playlists-have-been-successfully-imported": "Todas las listas de reproducción se han importado con éxito",
"no-playlist-found": "No se encontró ninguna lista de reproducción",
"no-playlist-found-in-selected-files": "No se encontró ninguna lista de reproducción en los archivos seleccionados",
"some-playlists-not-imported": "Algunas listas de reproducción no se importaron",
"some-playlists-have-been-imported": {
"INVALID_SOURCE": "No se pudieron encontrar algunas listas de reproducción",
"INVALID_PLAYLIST_FILE": "Algunas listas de reproducción no son válidas",
"CANNOT_PARSE_PLAYLIST": "Algunas listas de reproducción no se pueden leer",
"unknown": "No se pudieron importar algunas listas de reproducción"
},
"no-playlists-imported": "No se importaron listas de reproducción",
"no-playlists-imported-errors": {
"INVALID_SOURCE": "No se pudieron encontrar las listas de reproducción",
"INVALID_PLAYLIST_FILE": "Las listas de reproducción no son válidas",
"CANNOT_PARSE_PLAYLIST": "Las listas de reproducción no se pueden leer",
"unknown": "No se pudo importar ninguna lista de reproducción"
}
},
"dateformat": {
"dayNames": ["Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sáb", "Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado"],
"monthNames": ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic", "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"],
"timeNames": ["a", "p", "am", "pm", "A", "P", "AM", "PM"]
"dayNames": [
"Dom",
"Lun",
"Mar",
"Mié",
"Jue",
"Vie",
"Sáb",
"Domingo",
"Lunes",
"Martes",
"Miércoles",
"Jueves",
"Viernes",
"Sábado"
],
"monthNames": [
"Ene",
"Feb",
"Mar",
"Abr",
"May",
"Jun",
"Jul",
"Ago",
"Sep",
"Oct",
"Nov",
"Dic",
"Enero",
"Febrero",
"Marzo",
"Abril",
"Mayo",
"Junio",
"Julio",
"Agosto",
"Septiembre",
"Octubre",
"Noviembre",
"Diciembre"
],
"timeNames": [
"a",
"p",
"am",
"pm",
"A",
"P",
"AM",
"PM"
]
}
}
+264 -25
View File
@@ -50,14 +50,16 @@
"filters-btn": "Filtres",
"dropdown": {
"export-maps": "Exporter les maps",
"delete-maps": "Supprimer les maps"
"delete-maps": "Supprimer les maps",
"delete-duplicate-maps": "Supprimer les doublons"
}
},
"tabs": {
"maps": {
"actions": {
"add-maps": {
"text": "Ajouter"
"drop-down": {
"browse-maps": "Explorer les maps",
"import-maps": "Importer des maps"
},
"link-maps": {
"tooltips": {
@@ -69,6 +71,21 @@
"empty-maps": {
"text": "Aucune map",
"button": "Télécharger des maps"
},
"drop-zone": {
"text": "Importer vos maps",
"subtext": "Déposez vos fichiers zip ici pour importer vos maps"
}
},
"playlists": {
"drop-down": {
"browse-playlists": "Explorer les playlists",
"create-a-playlist": "Créer une playlist",
"import-playlists": "Importer des playlists"
},
"drop-zone": {
"text": "Importer vos playlists",
"subtext": "Déposez vos fichiers \".bplist\" ou \".json\" ici pour les importer"
}
}
}
@@ -79,7 +96,8 @@
"mods-not-available": "Aucun mod n'est encore disponible pour cette version de Beat Saber",
"buttons": {
"more-infos": "Plus d'infos",
"install-or-update": "Installer ou mettre à jour"
"install-or-update": "Installer ou mettre à jour",
"reinstall-all": "Tout réinstaller"
},
"mods-grid": {
"header-bar": {
@@ -92,6 +110,12 @@
"unselect-all": "Tout désélectionner"
}
}
},
"notifications": {
"all-mods-already-installed": {
"title": "Mods déjà installées",
"description": "Tous les mods séléctionnées sont déjà installées"
}
}
},
"dropdown": {
@@ -119,6 +143,7 @@
"title": "Steam & Oculus",
"description": "Te déconnecter te permettra de changer de compte au prochain téléchargement de Beat Saber.",
"logout": "Déconnexion",
"logout-success": "Déconnexion réussie",
"download-platform": {
"title": "Plateforme par défaut",
"desc": "Choisi la plateforme par défaut qui sera utilisée pour télécharger les versions de Beat Saber.",
@@ -138,8 +163,15 @@
},
"installation-folder": {
"title": "Dossier d'installation",
"description": "Change le dossier par défaut pour les versions de Beat Saber et d'autres fonctionnalités à venir.",
"choose-folder": "Choisir un dossier"
"description": "Changer le dossier qui contiendra tout le contenu téléchargé par BSManager."
},
"proton-folder": {
"title": "Dossier Proton",
"description": "Changez le dossier vers le chemin de Proton. (par exemple, Proton - Experimental)",
"errors": {
"title": "Le paramétrage du dossier Proton a échoué",
"invalid-folder": "Chemin du dossier Proton invalide"
}
},
"additional-content": {
"title": "Contenus additionnels",
@@ -161,6 +193,7 @@
"zh-CN": "简体中文",
"zh-TW": "正體中文",
"ja-JP": "日本語",
"ko-KR": "한국어",
"translated": {
"en-EN": "Anglais, Royaume-Uni",
"en-US": "Anglais, États-Unis",
@@ -170,7 +203,8 @@
"ru-RU": "Russe",
"zh-CN": "Chinois simplifié",
"zh-TW": "Chinois traditionnel",
"ja-JP": "Japonais"
"ja-JP": "Japonais",
"ko-KR": "Coréen"
}
}
},
@@ -197,6 +231,34 @@
"report-bug": "Signaler un bug",
"open-logs": "Ouvrir les logs"
}
},
"advanced": {
"title": "Avancés",
"description": "Paramètres avancés pour BSManager.",
"hardware-acceleration": {
"title": "Accélération matérielle",
"description": "Activez l'accélération matérielle pour utiliser votre GPU et améliorer les performances de BSManager. Désactivez cette option si vous rencontrez des chutes d'IPS.",
"modal": {
"title": "Redémarrage nécessaire",
"body": "Changer le paramètre d'accélération matérielle va quitter et relancer BSManager. Êtes-vous sûr de vouloir continuer ?",
"confirm-btn": "Oui, je suis sûr"
},
"error-notification": {
"message": "Une erreur s'est produite, impossible de désactiver l'accélération matérielle."
}
},
"use-symlinks": {
"title": "Utiliser des liens symboliques",
"description": "Utilisez des liens symboliques au lieu de jonctions pour lier des dossiers. Activez cette option uniquement si vous en avez besoin.",
"modal": {
"title": "Permissions des liens symboliques",
"body": "Lors de la création de liens symboliques, BSManager nécessitera des privilèges administrateur ou le mode développeur activé sur votre système. Êtes-vous sûr de vouloir continuer ?",
"confirm-btn": "Oui, je suis sûr"
},
"error-notification": {
"message": "Une erreur s'est produite, impossible de changer les paramètres des liens symboliques."
}
}
}
}
},
@@ -215,11 +277,13 @@
"errors": {
"titles": {
"operation-running": "Opération en cours",
"no-internet": "Pas d'accès Internet"
"no-internet": "Pas d'accès Internet",
"file-not-supported": "Fichier non supporté"
},
"msg": {
"operation-running": "Attends la fin de l'opération en cours puis recommence.",
"no-internet": "Vérifie ta connexion internet et ressaye."
"no-internet": "Vérifie ta connexion internet et ressaye.",
"file-not-supported": "Seuls les fichiers {types} sont pris en charge."
}
}
},
@@ -241,9 +305,6 @@
}
},
"errors": {
"titles": {
"dotnet-required": ".NET 8 Requis"
},
"msg": {
"401": "Steam ne semble pas vouloir nous laisser télécharger Beat Saber 😢",
"404": "Impossible de contacter les serveurs de Steam.",
@@ -266,11 +327,7 @@
"LicenceError": "Impossible d'obtenir la liste des licences.",
"RateLimitExceeded": "Tu as essayé trop de fois attends un peu et recommence plus tard.",
"TokenRejected": "Votre token de connexion a été rejeté 😕 Veuillez réessayer.",
"AccessDenied": "L'accès à Steam a été refusé.",
"dotnet-required": ".NET 8 Runtime doit être installé pour pouvoir télécharger une version de Beat Saber. Télécharge-le en cliquant sur le bouton ci-dessous."
},
"actions": {
"download-dotnet": "Télécharger .NET 8"
"AccessDenied": "L'accès à Steam a été refusé."
}
}
},
@@ -386,6 +443,8 @@
"OCULUS_NOT_RUNNING": "Oculus n'est pas lancé",
"BS_ALREADY_RUNNING": "Beat Saber est déjà lancé",
"EXE_NOT_FINDED": "Fichiers manquants",
"PROTON_NOT_SET": "Dossier Proton non défini",
"PROTON_NOT_FOUND": "Binaire Proton non trouvé",
"EXIT": "Arrêt brutal",
"OCULUS_LIB_NOT_FOUND": "Librairie Oculus introuvable",
"ORIGINAL_OCULUS_NOT_INSTALLED": "Version originale Oculus non trouvée"
@@ -419,7 +478,8 @@
"CantEditSteam": "Modification impossible",
"CantRename": "Renommage impossible",
"VersionAlreadExist": "Cette version existe déjà",
"CantClone": "Clonage impossible"
"CantClone": "Clonage impossible",
"UnknownError": "Une erreur inconnue s'est produite"
},
"msg": {
"CantEditSteam": "Tu ne peux pas modifier la version Steam, cependant tu peux la cloner."
@@ -472,6 +532,27 @@
"one-click-install": {
"success": "Installation de la map terminée",
"error": "Une erreur s'est produite lors de l'installation de la map"
},
"no-duplicates-maps": {
"title": "Pas de doublons",
"msg": "Aucune carte n'a été supprimée"
},
"duplicates-maps-deleted": {
"title": "Doublons supprimés",
"msg": "Les doublons ont été supprimés"
},
"import-map": {
"titles": {
"success": "Importation des maps terminée",
"error": "Une erreur est survenue lors de l'importation des maps"
},
"msgs": {
"success": "Les maps ont été importées avec succès.",
"some-success": "Certaines maps ont été importées avec succès.",
"only-accept-zip": "Seules les fichiers zip sont pris en charge.",
"invalid-zip": "Le ou les fichiers zip ne contiennent aucune maps.",
"unknown": "Une erreur inconnue s'est produite."
}
}
},
"playlists": {
@@ -675,6 +756,11 @@
"title": "Conserver les maps créera une copie des maps partagées pour la version actuelle. Dans le cas contraire, aucune map ne sera conservée pour cette version."
},
"valid-btn": "Délier les maps"
},
"delete-duplicate-maps": {
"title": "Supprimer les maps ?",
"desc": "Seule la map \"{map}\" est en double. Es-tu sûr de vouloir la supprimer ?",
"desc-plural": "{nb} maps en double ont été trouvées. Es-tu sûr de vouloir les supprimer ?"
}
},
"download-maps": {
@@ -719,12 +805,13 @@
"stay": "Se souvenir de moi",
"connect-to-meta": "Se connecter à Meta"
},
"enable-oculus-sideloaded-apps": {
"title": "Activer le sideloading",
"info-1": "Pour lancer Beat Saber, la possibilité d'exécuter des applications en sideloading doit être activée. BSManager demandera les droits administrateur pour activer cette fonctionnalité automatiquement.",
"info-2": "La fonctionnalité de sideloading permet de lancer des jeux situés en dehors de votre dossier de bibliothèque Oculus.",
"info-3": "Une fois le sideloading activé, la fonctionnalité restera active et vous ne serez plus invité à lactiver.",
"i-want-to-do-it-myself": "Je veux le faire moi-même",
"original-version-backup-oculus": {
"title": "Attention",
"body": {
"must-be-installed-once": "Vous devez avoir Beat Saber installé depuis le Oculus Store sur cet appareil, sinon Beat Saber se fermera automatiquement après le lancement.",
"will-backup": "Afin de lancer cette version, le dossier d'installation original de Beat Saber se trouvant dans votre bibliothèque Oculus va être renommé et sera automatiquement restauré à l'arrêt de Beat Saber."
},
"not-remind-me": "Ne plus me rappeler",
"understood": "J'ai compris"
},
"enter-meta-token": {
@@ -755,6 +842,18 @@
"launch-as-admin": "Lancer en administateur",
"not-remind-me": "Ne plus me rappeler"
},
"ask-install-path": {
"title": "Dossier d'installation",
"choose-folder-description": "Choisissez le dossier qui contiendra tout le contenu téléchargé par BSManager. (versions, mods, cartes, playlists, etc.)",
"default": "Par défaut",
"default-tooltip": "Par défaut, dans votre dossier personnel"
},
"choose-proton-folder": {
"title": "Dossier Proton",
"proton-folder-description": "Sous Linux, BSManager a besoin de Proton pour fonctionner. Choisissez le dossier d'installation de Proton pour continuer.",
"proton-folder-placeholder": "Dossier d'installation de Proton",
"where-is-proton-installed": "Où est installé Proton ?"
},
"bs-version-outdated": {
"body": "La version {outdatedVersion} est obsolète, et certains mods ou fonctionnalités peuvent ne plus fonctionner comme prévu. Veuillez télécharger la dernière version recommandée ({recommendedVersion}) de Beat Saber pour profiter des dernières fonctionnalités et corrections de bugs."
}
@@ -763,6 +862,7 @@
"map-filter-panel": {
"duration": "Durée",
"nps" : "Notes Par Seconde",
"njs": "Vitesse de saut des notes",
"tags": "tags",
"specificities": "général",
"requirements": "requis",
@@ -840,7 +940,8 @@
"bsr-code" : "Code BSR",
"download" : "Télécharger la carte",
"downloading" :"Téléchargement de la carte",
"cancel-download" : "Annuler le téléchargement"
"cancel-download" : "Annuler le téléchargement",
"hightlight-difficulty" : "Surligner la difficulté"
}
},
"models": {
@@ -1028,6 +1129,144 @@
}
}
},
"drop-zone": {
"or-browse-files": "Ou parcourir les fichiers"
},
"playlist": {
"error-playlist-creation-title": "Erreur lors de la création de la playlist",
"error-playlist-creation-desc": "Une erreur est survenue lors de la création de la playlist.",
"playlist-created-title": "Playlist créée",
"playlist-created-desc": "La playlist a été créée avec succès. Tu peut maintenant synchroniser ses maps !",
"download-playlist": "Télécharger la playlist",
"synchronize-playlist": "Synchroniser la playlist",
"synchronize-maps": "Synchroniser les maps",
"error-playlists-synchronization-title": "Erreur lors de la synchronisation des playlists",
"error-playlists-synchronization-desc": "Une erreur est survenue lors de la synchronisation des playlists.",
"playlists-synchronized-title": "Playlists synchronisées !",
"playlists-synchronized-desc": "Les playlists et leurs maps ont été téléchargées.",
"playlists-export-error-title": "Erreur lors de l'exportation des playlists",
"playlists-export-error-desc": "Une erreur est survenue lors de l'exportation des playlists.",
"playlists-exported-title": "Playlists exportées !",
"playlists-exported-desc": "Les playlists ont été exportées avec succès.",
"playlists-with-maps-exported-desc": "Les playlists et leurs maps ont été exportées avec succès.",
"playlist-delete-error-title": "Erreur lors de la suppression de la playlist",
"playlist-delete-error-desc": "Une erreur est survenue lors de la suppression de la playlist.",
"playlists-deleted-title": "Playlists supprimées !",
"playlists-deleted-desc": "Les playlists ont été supprimées avec succès.",
"edit-playlist": "Éditer la playlist",
"playlist-edit-error-title": "Erreur lors de l'édition de la playlist",
"playlist-edit-error-desc": "Une erreur est survenue lors de l'édition de la playlist.",
"playlist-edited-title": "Playlist éditée !",
"playlist-edited-desc": "La playlist a été modifiée avec succès. Tu peut maintenant synchroniser ses maps !",
"playlists-loading": "Chargement des playlist...",
"no-playlists": "Aucune playlist",
"download-playlists": "Télécharger des playlists",
"created-by": "Créée par",
"stop-download": "Arrêter le téléchargement",
"cancel-download": "Annuler le téléchargement",
"open-file": "Ouvrir le fichier",
"link-playlists": "Lier les playlists",
"link-playlist-desc": "La liaison des playlists permet de partager les playlists entre toute les version. Une fois liée, cette version profitera des playlists partagées",
"link-playlist-info": "L'ajout et la suppression de playlists sera également partagé",
"keep-playlists": "Conserver les playlists",
"keep-playlists-tip": "Conserver les playlists déplacera les playlists de la version actuelle dans le dossier des playlists partagées. Dans le cas contraire elles seront perdues",
"unlink-playlists": "Délier les playlists",
"unlink-playlist-desc": "Attention, délier les playlists ne permettra plus l'utilisation des playlists paratagées pour cette version.",
"unlink-keep-playlists-tip": "Conserver les playlists créera une copie des playlists partagées pour la version actuelle. Dans le cas contraire, aucune playlist ne sera conservée pour cette version.",
"delete-playlist-ask": "Supprimer la playlist ?",
"delete-playlists-ask": "Supprimer les playlists ?",
"delete-playlist-desc": "Es-tu sur de vouloir supprimer la playlist \"{playlistTitle}\" ?",
"delete-playlists-desc": "Es-tu sur de vouloir supprimer {nb} playlists ?",
"delete-maps": "Supprimer les maps",
"delete-playlist-maps-tip": "Si activé, toutes les maps de la playlist seront supprimées",
"delete-playlists-maps-tip": "Si activé, toutes les maps des playlists seront supprimées",
"export-playlist-ask": "Exporter la playlist ?",
"export-playlists-ask": "Exporter les playlists ?",
"export-playlist-desc": "Es-tu sur de vouloir exporter la playlist \"{playlistTitle}\" ?",
"export-playlists-desc": "Es-tu sur de vouloir exporter les {nb} playlists ?",
"export-maps": "Exporter les maps",
"export-playlist-maps-tip": "Si activé, toutes les maps de la playlist seront également exportées",
"export-playlists-maps-tip": "Si activé, toutes les maps des playlists seront également exportées",
"export": "Exporter",
"need-clone-title": "Attention",
"need-clone-desc-1": "Cette playlist a été téléchargée depuis un site externe et contient un lien de synchronisation.",
"need-clone-desc-2": "Pour éviter de perdre vos modifications lors d'une synchronisation, la playlist va être dupliquée et son lien de synchronisation supprimé.",
"need-clone-desc-3": "Vous pourrez ensuite, si vous le souhaitez, supprimer la playlist originale.",
"understood": "J'ai compris",
"synchronize-playlist-ask": "Synchroniser la playlist ?",
"synchronize-playlists-ask": "Synchroniser les playlists ?",
"synchronize-playlist-desc": "Es-tu sur de vouloir synchroniser la playlist \"{playlistTitle}\" ?",
"synchronize-playlists-desc": "Es-tu sur de vouloir synchroniser les {nb} playlists ?",
"synchronize-playlist-tip": "Cette action met à jour les playlists et télécharge les maps manquantes; cela peut durer plusieurs minutes.",
"synchronize": "Synchroniser",
"curated": "Recommandée",
"verified-mapper": "Mapper vérifié",
"empty-playlists": "Playlists vides",
"search-playlist": "Rechercher une playlist",
"no-playlists-found": "Aucune playlists trouvées",
"error-occur-while-loading-playlists": "Une erreur est survenue lors du chargement des playlists",
"error-occur-while-loading-playlist": "Une erreur est survenue lors du chargement de la playlist",
"loading-maps":"Chargement des maps...",
"no-maps-found-for-playlist":"Aucune map trouvée pour cette playlist",
"playlist-contain-no-maps":"La playlist ne contient aucune map",
"no-map-installed-for-playlist":"Aucune map installée pour cette playlist",
"playlist-is-waiting-to-download":"La playlist est en attente de téléchargment",
"download-maps": "Télécharger les maps",
"download-missing-maps": "Télécharger les maps manquantes",
"playlist-is-downloading":"La playlist est en cours de téléchargement",
"some-playlist-maps-are-missing":"Certaines maps de cette playlist sont manquantes",
"create-a-playlist": "Créer une playlist",
"synchronize-playlists": "Synchroniser les playlists",
"export-playlists": "Exporter les playlists",
"delete-playlists": "Supprimer les playlists",
"choose-image": "Choisir une image",
"title": "Titre",
"playlist-title": "Titre de la playlist",
"description": "Description",
"playlist-description": "Description de la playlist",
"author": "Auteur",
"playlist-author": "Auteur de la playlist",
"save": "Enregistrer",
"loading": "Chargement...",
"installed": "Installée",
"no-map-found": "Aucune map trouvée",
"edit-playlist-shortcuts": "Maintenez Maj ou Ctrl pour sélectionner plusieurs maps",
"add-to-playlist": "Ajouter à la playlist",
"remove-from-playlist": "Retirer de la playlist",
"playlist-is-empty": "La playlist est vide",
"continue": "Continuer",
"nb-maps": "Nombre de maps",
"nb-mappers": "Nombre de mappers",
"duration": "Durée",
"nps": "Notes par secondes",
"date-picker": {
"start-date-end-date": "Date début — Date fin",
"all": "Tout",
"last-24h": "Dernières 24h",
"last-week": "Dernière semaine",
"last-month": "Dernier mois",
"3-last-month": "3 derniers mois"
},
"playlists-imported": "Playlists importées",
"all-playlists-have-been-successfully-imported": "Toutes les playlists ont été importées avec succès",
"no-playlist-found": "Aucune playlist trouvée",
"no-playlist-found-in-selected-files": "Aucune playlist trouvée dans les fichiers sélectionnés",
"some-playlists-not-imported": "Certaines playlists non importées",
"some-playlists-have-been-imported": {
"INVALID_SOURCE": "Certaines playlists n'ont pas pu être trouvées",
"INVALID_PLAYLIST_FILE": "Certaines playlists ne sont pas valides",
"CANNOT_PARSE_PLAYLIST": "Certaines playlists ne sont pas lisibles",
"unknown": "Certaines playlists n'ont pas pu être importées"
},
"no-playlists-imported": "Aucune playlist importée",
"no-playlists-imported-errors": {
"INVALID_SOURCE": "Les playlists n'ont pas été trouvées",
"INVALID_PLAYLIST_FILE": "Les playlists ne sont pas valides",
"CANNOT_PARSE_PLAYLIST": "Les playlists ne sont pas lisibles",
"unknown": "Aucune playlist n'a pu être importée"
}
},
"dateformat": {
"dayNames": ["Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam", "Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"],
"monthNames": ["Jan", "Fév", "Mar", "Avr", "Mai", "Jun", "Juil", "Aou", "Sept", "Oct", "Nov", "Déc", "Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"],
+268 -30
View File
@@ -50,14 +50,16 @@
"filters-btn": "絞り込み",
"dropdown": {
"export-maps": "マップをエクスポート",
"delete-maps": "マップを削除"
"delete-maps": "マップを削除",
"delete-duplicate-maps": " 重複を削除"
}
},
"tabs": {
"maps": {
"actions": {
"add-maps": {
"text": "追加"
"drop-down": {
"browse-maps": "マップを閲覧",
"import-maps": "マップをインポート"
},
"link-maps": {
"tooltips": {
@@ -69,6 +71,21 @@
"empty-maps": {
"text": "マップがありません",
"button": "マップをダウンロードする"
},
"drop-zone": {
"text": "マップをインポート",
"subtext": "ZIPファイルをここにドロップしてマップをインポート"
}
},
"playlists": {
"drop-down": {
"browse-playlists": "プレイリストを閲覧",
"create-a-playlist": "プレイリストを作成",
"import-playlists": "プレイリストをインポート"
},
"drop-zone": {
"text": "プレイリストをインポート",
"subtext": "\".bplist\" または \".json\" ファイルをここにドロップしてインポート"
}
}
}
@@ -79,7 +96,8 @@
"mods-not-available": "このバージョンで使用できるMODはまだありません。",
"buttons": {
"more-infos": "詳細情報",
"install-or-update": "インストールとアップデート"
"install-or-update": "インストールとアップデート",
"reinstall-all": "すべて再インストール"
},
"mods-grid": {
"header-bar": {
@@ -92,6 +110,12 @@
"unselect-all": "すべて選択解除"
}
}
},
"notifications": {
"all-mods-already-installed": {
"title": "すでにインストール済みのMOD",
"description": "選択したすべてのMODはすでにインストールされています"
}
}
},
"dropdown": {
@@ -119,6 +143,7 @@
"title": "Steam & Oculus",
"description": "ログアウトすると、次のBeat Saberダウンロード時にアカウントを切り替えることができます。",
"logout": "ログアウト",
"logout-success": "ログアウト成功",
"download-platform": {
"title": "デフォルトプラットフォーム",
"desc": "Beat Saberのダウンロードに使用するデフォルトのプラットフォームを選択します。",
@@ -138,8 +163,15 @@
},
"installation-folder": {
"title": "インストールフォルダー",
"description": "BeatSaberのバージョンとその他の今後の機能を入れるフォルダを変更します。",
"choose-folder": "フォルダーを選択"
"description": "BSManager によってダウンロードされたすべてのコンテンツを含むフォルダを変更します。"
},
"proton-folder": {
"title": "Protonフォルダー",
"description": "フォルダーをProtonのパスに変更してください。(例:Proton - Experimental",
"errors": {
"title": "Protonフォルダーの設定に失敗しました",
"invalid-folder": "無効なProtonフォルダーのパスです"
}
},
"additional-content": {
"title": "追加コンテンツ",
@@ -161,6 +193,7 @@
"zh-CN": "简体中文",
"zh-TW": "正體中文",
"ja-JP": "日本語",
"ko-KR": "한국어",
"translated": {
"en-EN": "イギリス英語",
"en-US": "アメリカ英語",
@@ -170,7 +203,8 @@
"ru-RU": "ロシア語",
"zh-CN": "簡体字中国",
"zh-TW": "繁体字中国",
"ja-JP": "日本語"
"ja-JP": "日本語",
"ko-KR": "韓国語"
}
}
},
@@ -197,6 +231,34 @@
"report-bug": "バグを報告",
"open-logs": "ログを表示"
}
},
"advanced": {
"title": "高度な設定",
"description": "BSManagerの高度な設定。",
"hardware-acceleration": {
"title": "ハードウェアアクセラレーション",
"description": "ハードウェアアクセラレーションを有効にしてGPUを使用し、BSManagerのパフォーマンスを向上させます。フレームドロップが発生している場合は、これをオフにしてください。",
"modal": {
"title": "再起動が必要",
"body": "ハードウェアアクセラレーションの設定を変更すると、BSManagerが終了して再起動します。本当に続行しますか?",
"confirm-btn": "はい、確かです"
},
"error-notification": {
"message": "エラーが発生しました。ハードウェアアクセラレーションを無効にできません。"
}
},
"use-symlinks": {
"title": "シンボリックリンクを使用",
"description": "フォルダをリンクするためにジャンクションの代わりにシンボリックリンクを使用します。本当に必要な場合にのみこれをオンにしてください。",
"modal": {
"title": "シンボリックリンクの権限",
"body": "シンボリックリンクを作成する際、BSManagerは管理者権限またはシステムで有効になっている開発者モードを必要とします。本当に続行しますか?",
"confirm-btn": "はい、確かです"
},
"error-notification": {
"message": "エラーが発生しました。シンボリックリンク設定を変更できません。"
}
}
}
}
},
@@ -215,11 +277,13 @@
"errors": {
"titles": {
"operation-running": "稼働中",
"no-internet": "インターネット接続がありません"
"no-internet": "インターネット接続がありません",
"file-not-supported": "ファイルはサポートされていません"
},
"msg": {
"operation-running": "現在の処理が終了するのを待ってから、もう一度試してください。",
"no-internet": "インターネット接続を確認し、もう一度お試しください。"
"no-internet": "インターネット接続を確認し、もう一度お試しください。",
"file-not-supported": "{types}ファイルのみがサポートされています。"
}
}
},
@@ -241,9 +305,6 @@
}
},
"errors": {
"titles": {
"dotnet-required": ".NET 8が必要です!"
},
"msg": {
"401": "SteamがBeat Saberのダウンロードを許可してくれないようだ。😢",
"404": "Steamサーバーに接続できません。",
@@ -266,11 +327,7 @@
"LicenceError": "ライセンスリストを取得できません。",
"RateLimitExceeded": "何度も試しているのでしばらくたって、もう一度お試しください。",
"TokenRejected": "ログイントークンが拒否されました 😕 もう一度お試しください。",
"AccessDenied": "Steamへのアクセスが拒否されました。",
"dotnet-required": "Beat Saberをダウンロードするには、.NET 8 Runtimeがインストールされている必要があります。下のボタンをクリックしてダウンロードしてください。"
},
"actions": {
"download-dotnet": ".NET 8をダウンロード"
"AccessDenied": "Steamへのアクセスが拒否されました。"
}
}
},
@@ -386,6 +443,8 @@
"OCULUS_NOT_RUNNING": "Oculusが起動していません",
"BS_ALREADY_RUNNING": "Beat Saberはすでに起動しています",
"EXE_NOT_FINDED": "ファイルが見つかりません",
"PROTON_NOT_SET": "Protonフォルダーが設定されていません",
"PROTON_NOT_FOUND": "Protonのバイナリが見つかりません",
"EXIT": "緊急停止",
"OCULUS_LIB_NOT_FOUND": "Oculusライブラリが見つかりません",
"ORIGINAL_OCULUS_NOT_INSTALLED": "オリジナルのOculusバージョンが見つかりませんでした"
@@ -419,7 +478,8 @@
"CantEditSteam": "編集不可",
"CantRename": "改名不可能",
"VersionAlreadExist": "このバージョンは既に存在しています!",
"CantClone": "クローン作成不可"
"CantClone": "クローン作成不可",
"UnknownError": "不明なエラーが発生しました"
},
"msg": {
"CantEditSteam": "Steam版は編集できませんがクローンを作ることは可能です。"
@@ -472,6 +532,27 @@
"one-click-install": {
"success": "マップのインストール完了",
"error": "マップのインストール中にエラーが発生しました"
},
"no-duplicates-maps": {
"title": "重複なし",
"msg": "マップは削除されませんでした"
},
"duplicates-maps-deleted": {
"title": "重複削除",
"msg": "重複が削除されました"
},
"import-map": {
"titles": {
"success": "マップのインポートが完了しました",
"error": "マップのインポート中にエラーが発生しました"
},
"msgs": {
"success": "マップが正常にインポートされました。",
"some-success": "一部のマップが正常にインポートされました。",
"only-accept-zip": "zipファイルのみがサポートされています。",
"invalid-zip": "zipファイルにマップが含まれていません。",
"unknown": "不明なエラーが発生しました。"
}
}
},
"playlists": {
@@ -674,6 +755,11 @@
"title": "マップを保持は、リンクを解除した後、共有フォルダから現在のバージョンにすべてのマップをコピーします。これを無効をしても共有マップは失われません。"
},
"valid-btn": "マップのリンクを解除"
},
"delete-duplicate-maps": {
"title": "マップを削除しますか?",
"desc": "マップ「{map}」のみが重複しています。削除してもよろしいですか?",
"desc-plural": "{nb}個の重複したマップが見つかりました。削除してもよろしいですか?"
}
},
"download-maps": {
@@ -718,13 +804,14 @@
"stay": "記憶する",
"connect-to-meta": "Metaに接続する"
},
"enable-oculus-sideloaded-apps": {
"title": "サイドローディングを有効化",
"info-1": "Beat Saberを起動するには、サイドローディングアプリを実行する機能を有効にする必要があります。BSManagerは、この機能を自動的に有効にするために管理者権限を要求します。",
"info-2": "サイドローディング機能により、Oculusライブラリフォルダ外にあるゲームを起動できます。",
"info-3": "サイドローディングを有効化すると、この機能はアクティブなままとなり、再度有効化を求められることはありません。",
"i-want-to-do-it-myself": "自分でやりたい",
"understood": "了解しました"
"original-version-backup-oculus": {
"title": "注意",
"body": {
"must-be-installed-once": "このデバイスにOculusストアからBeat Saberをインストールしておく必要があります。そうしないと、Beat Saberは起動後に自動的に閉じます。",
"will-backup": "このバージョンを起動するために、OculusライブラリにあるBeat Saberの元のインストールフォルダは名前が変更され、Beat Saberの終了時に自動的に復元されます。"
},
"not-remind-me": "二度と表示しないでください",
"understood": "分かった"
},
"enter-meta-token": {
"title": "Oculusトークン",
@@ -754,6 +841,18 @@
"launch-as-admin": "管理者として起動",
"not-remind-me": "Больше не напоминать"
},
"ask-install-path": {
"title": "インストールフォルダー",
"choose-folder-description": "BSManager によってダウンロードされたすべてのコンテンツ (バージョン、MOD、マップ、プレイリストなど) を含むフォルダを選択してください。",
"default": "デフォルト",
"default-tooltip": "デフォルトでは、ホームフォルダに設定されます"
},
"choose-proton-folder": {
"title": "Protonフォルダ",
"proton-folder-description": "Linuxでは、BSManagerを動作させるためにProtonが必要です。続行するには、Protonのインストールフォルダを選択してください。",
"proton-folder-placeholder": "Protonのインストールフォルダ",
"where-is-proton-installed": "Protonはどこにインストールされていますか?"
},
"bs-version-outdated": {
"body": "バージョン {outdatedVersion} は古いため、一部のモッドや機能が期待通りに動作しない場合があります。最新の機能やバグ修正を楽しむために、推奨される最新バージョンの Beat Saber ({recommendedVersion}) をダウンロードしてください。"
}
@@ -762,6 +861,7 @@
"map-filter-panel": {
"duration": "尺",
"nps" : "秒間ノート数",
"njs": "ノートジャンプ速度",
"tags": "タグ",
"specificities": "一般",
"requirements": "要Mod",
@@ -771,7 +871,7 @@
"accuracy": "正確",
"balanced": "バランス",
"challenge": "挑戦",
"dancestyle": "ダンス",
"dance-style": "ダンス",
"fitness": "フットネス",
"speed": "スピード",
"tech": "技術的"
@@ -839,7 +939,8 @@
"bsr-code" : "BSRコード",
"download" : "マップをダウンロード",
"downloading" :"マップをダウンロード中",
"cancel-download" : "ダウンロードをキャンセル"
"cancel-download" : "ダウンロードをキャンセル",
"hightlight-difficulty": "難易度をハイライト"
}
},
"models": {
@@ -1027,9 +1128,146 @@
}
}
},
"drop-zone": {
"or-browse-files": "またはファイルを参照"
},
"playlist": {
"error-playlist-creation-title": "プレイリストの作成エラー",
"error-playlist-creation-desc": "プレイリストの作成中にエラーが発生しました。",
"playlist-created-title": "プレイリストが作成されました",
"playlist-created-desc": "プレイリストが正常に作成されました。今すぐマップを同期できます!",
"download-playlist": "プレイリストをダウンロード",
"synchronize-playlist": "プレイリストを同期",
"synchronize-maps": "マップを同期",
"error-playlists-synchronization-title": "プレイリストの同期エラー",
"error-playlists-synchronization-desc": "プレイリストの同期中にエラーが発生しました。",
"playlists-synchronized-title": "プレイリストが同期されました!",
"playlists-synchronized-desc": "プレイリストとそのマップがダウンロードされました。",
"playlists-export-error-title": "プレイリストのエクスポートエラー",
"playlists-export-error-desc": "プレイリストのエクスポート中にエラーが発生しました。",
"playlists-exported-title": "プレイリストがエクスポートされました!",
"playlists-exported-desc": "プレイリストが正常にエクスポートされました。",
"playlists-with-maps-exported-desc": "プレイリストとそのマップが正常にエクスポートされました。",
"playlist-delete-error-title": "プレイリストの削除エラー",
"playlist-delete-error-desc": "プレイリストの削除中にエラーが発生しました。",
"playlists-deleted-title": "プレイリストが削除されました!",
"playlists-deleted-desc": "プレイリストが正常に削除されました。",
"edit-playlist": "プレイリストを編集",
"playlist-edit-error-title": "プレイリストの編集エラー",
"playlist-edit-error-desc": "プレイリストの編集中にエラーが発生しました。",
"playlist-edited-title": "プレイリストが編集されました!",
"playlist-edited-desc": "プレイリストが正常に変更されました。今すぐマップを同期できます!",
"playlists-loading": "プレイリストを読み込み中...",
"no-playlists": "プレイリストがありません",
"download-playlists": "プレイリストをダウンロード",
"created-by": "作成者",
"stop-download": "ダウンロードを停止",
"cancel-download": "ダウンロードをキャンセル",
"open-file": "ファイルを開く",
"link-playlists": "プレイリストをリンク",
"link-playlist-desc": "プレイリストをリンクすると、すべてのバージョン間でプレイリストを共有できます。リンクすると、このバージョンは共有プレイリストの恩恵を受けます",
"link-playlist-info": "プレイリストの追加と削除も共有されます",
"keep-playlists": "プレイリストを保持",
"keep-playlists-tip": "プレイリストを保持すると、現在のバージョンのプレイリストが共有プレイリストフォルダに移動されます。そうしない場合、それらは失われます",
"unlink-playlists": "プレイリストのリンクを解除",
"unlink-playlist-desc": "警告:プレイリストのリンクを解除すると、このバージョンでは共有プレイリストを使用できなくなります。",
"unlink-keep-playlists-tip": "プレイリストを保持すると、現在のバージョン用に共有プレイリストのコピーが作成されます。そうしない場合、このバージョンのプレイリストは保持されません。",
"delete-playlist-ask": "プレイリストを削除しますか?",
"delete-playlists-ask": "プレイリストを削除しますか?",
"delete-playlist-desc": "プレイリスト「{playlistTitle}」を削除してもよろしいですか?",
"delete-playlists-desc": "{nb}個のプレイリストを削除してもよろしいですか?",
"delete-maps": "マップを削除",
"delete-playlist-maps-tip": "有効にすると、プレイリスト内のすべてのマップが削除されます",
"delete-playlists-maps-tip": "有効にすると、プレイリスト内のすべてのマップが削除されます",
"export-playlist-ask": "プレイリストをエクスポートしますか?",
"export-playlists-ask": "プレイリストをエクスポートしますか?",
"export-playlist-desc": "プレイリスト「{playlistTitle}」をエクスポートしてもよろしいですか?",
"export-playlists-desc": "{nb}個のプレイリストをエクスポートしてもよろしいですか?",
"export-maps": "マップをエクスポート",
"export-playlist-maps-tip": "有効にすると、プレイリスト内のすべてのマップもエクスポートされます",
"export-playlists-maps-tip": "有効にすると、プレイリスト内のすべてのマップもエクスポートされます",
"export": "エクスポート",
"need-clone-title": "警告",
"need-clone-desc-1": "このプレイリストは外部サイトからダウンロードされ、同期リンクが含まれています。",
"need-clone-desc-2": "同期中に変更を失わないようにするため、プレイリストが複製され、同期リンクが削除されます。",
"need-clone-desc-3": "その後、必要に応じて元のプレイリストを削除できます。",
"understood": "理解しました",
"synchronize-playlist-ask": "プレイリストを同期しますか?",
"synchronize-playlists-ask": "プレイリストを同期しますか?",
"synchronize-playlist-desc": "プレイリスト「{playlistTitle}」を同期してもよろしいですか?",
"synchronize-playlists-desc": "{nb}個のプレイリストを同期してもよろしいですか?",
"synchronize-playlist-tip": "この操作はプレイリストを更新し、不足しているマップをダウンロードします。数分かかる場合があります。",
"synchronize": "同期",
"curated": "おすすめ",
"verified-mapper": "認証済みマッパー",
"empty-playlists": "空のプレイリスト",
"search-playlist": "プレイリストを検索",
"no-playlists-found": "プレイリストが見つかりません",
"error-occur-while-loading-playlists": "プレイリストの読み込み中にエラーが発生しました",
"error-occur-while-loading-playlist": "プレイリストの読み込み中にエラーが発生しました",
"loading-maps": "マップを読み込み中...",
"no-maps-found-for-playlist": "このプレイリストにマップが見つかりません",
"playlist-contain-no-maps": "プレイリストにマップが含まれていません",
"no-map-installed-for-playlist": "このプレイリストにインストールされたマップがありません",
"playlist-is-waiting-to-download": "プレイリストはダウンロード待ちです",
"download-maps": "マップをダウンロード",
"download-missing-maps": "不足しているマップをダウンロード",
"playlist-is-downloading": "プレイリストをダウンロード中です",
"some-playlist-maps-are-missing": "このプレイリストの一部のマップが不足しています",
"create-a-playlist": "プレイリストを作成",
"synchronize-playlists": "プレイリストを同期",
"export-playlists": "プレイリストをエクスポート",
"delete-playlists": "プレイリストを削除",
"choose-image": "画像を選択",
"title": "タイトル",
"playlist-title": "プレイリストのタイトル",
"description": "説明",
"playlist-description": "プレイリストの説明",
"author": "作者",
"playlist-author": "プレイリストの作者",
"save": "保存",
"loading": "読み込み中...",
"installed": "インストール済み",
"no-map-found": "マップが見つかりません",
"edit-playlist-shortcuts": "ShiftキーまたはCtrlキーを押しながら複数のマップを選択",
"add-to-playlist": "プレイリストに追加",
"remove-from-playlist": "プレイリストから削除",
"playlist-is-empty": "プレイリストが空です",
"continue": "続ける",
"nb-maps": "マップ数",
"nb-mappers": "マッパー数",
"duration": "継続時間",
"nps": "1秒あたりの音符数",
"date-picker": {
"start-date-end-date": "開始日 — 終了日",
"all": "すべて",
"last-24h": "過去24時間",
"last-week": "先週",
"last-month": "先月",
"3-last-month": "過去3ヶ月"
},
"playlists-imported": "プレイリストがインポートされました",
"all-playlists-have-been-successfully-imported": "すべてのプレイリストが正常にインポートされました",
"no-playlist-found": "プレイリストが見つかりません",
"no-playlist-found-in-selected-files": "選択されたファイルにプレイリストが見つかりません",
"some-playlists-not-imported": "一部のプレイリストはインポートされませんでした",
"some-playlists-have-been-imported": {
"INVALID_SOURCE": "一部のプレイリストが見つかりませんでした",
"INVALID_PLAYLIST_FILE": "一部のプレイリストは無効です",
"CANNOT_PARSE_PLAYLIST": "一部のプレイリストは読み取れません",
"unknown": "一部のプレイリストをインポートできませんでした"
},
"no-playlists-imported": "プレイリストはインポートされませんでした",
"no-playlists-imported-errors": {
"INVALID_SOURCE": "プレイリストが見つかりませんでした",
"INVALID_PLAYLIST_FILE": "プレイリストは無効です",
"CANNOT_PARSE_PLAYLIST": "プレイリストは読み取れません",
"unknown": "プレイリストをインポートできませんでした"
}
},
"dateformat": {
"dayNames": ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
"monthNames": ["Jan", "Feb", "Mar", "Apr", "May", "June", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
"timeNames": ["a", "p", "am", "pm", "A", "P", "AM", "PM"]
"dayNames": ["", "", "", "", "", "", "", "日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"],
"monthNames": ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月", "1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"],
"timeNames": ["午前", "午後", "午前", "午後", "午前", "午後", "午前", "午後"]
}
}
File diff suppressed because it is too large Load Diff
+264 -26
View File
@@ -50,14 +50,16 @@
"filters-btn": "Фильтр",
"dropdown": {
"export-maps": "Экспорт карт",
"delete-maps": "Удалить карты"
"delete-maps": "Удалить карты",
"delete-duplicate-maps": "Удалить дубликаты"
}
},
"tabs": {
"maps": {
"actions": {
"add-maps": {
"text": "Добавить"
"drop-down": {
"browse-maps": "Просмотр карт",
"import-maps": "Импорт карт"
},
"link-maps": {
"tooltips": {
@@ -69,6 +71,21 @@
"empty-maps": {
"text": "Нет карт",
"button": "Скачать карты"
},
"drop-zone": {
"text": "Импортируйте свои карты",
"subtext": "Перетащите сюда файлы ZIP, чтобы импортировать свои карты"
}
},
"playlists": {
"drop-down": {
"browse-playlists": "Просмотр плейлистов",
"create-a-playlist": "Создать плейлист",
"import-playlists": "Импорт плейлистов"
},
"drop-zone": {
"text": "Импортируйте ваши плейлисты",
"subtext": "Перетащите сюда файлы \".bplist\" или \".json\" для их импорта"
}
}
}
@@ -79,7 +96,8 @@
"mods-not-available": "Не найдены моды для этой версии Beat Saber",
"buttons": {
"more-infos": "Подробнее",
"install-or-update": "Установить или обновить"
"install-or-update": "Установить или обновить",
"reinstall-all": "Переустановить все"
},
"mods-grid": {
"header-bar": {
@@ -92,6 +110,12 @@
"unselect-all": "Снять все выделения"
}
}
},
"notifications": {
"all-mods-already-installed": {
"title": "Моды уже установлены",
"description": "Все выбранные моды уже установлены"
}
}
},
"dropdown": {
@@ -119,6 +143,7 @@
"title": "Steam & Oculus",
"description": "Выход позволит вам сменить учетную запись при следующей загрузке Beat Saber.",
"logout": "Выйти",
"logout-success": "Выход выполнен успешно",
"download-platform": {
"title": "Основная платформа",
"desc": "Выберите основную платформу, которая будет использоваться для скачивания версий Beat Saber.",
@@ -138,8 +163,15 @@
},
"installation-folder": {
"title": "Папка установок",
"description": "Измените стандартную папку, где будут версии Beat Saber и прочее.",
"choose-folder": "Изменить папку"
"description": "Изменить папку, которая будет содержать весь контент, загруженный BSManager."
},
"proton-folder": {
"title": "Папка Proton",
"description": "Измените папку на путь к Proton. (например, Proton - Experimental)",
"errors": {
"title": "Не удалось установить папку Proton",
"invalid-folder": "Недействительный путь к папке Proton"
}
},
"additional-content": {
"title": "Дополнительный контент",
@@ -161,6 +193,7 @@
"zh-CN": "简体中文",
"zh-TW": "正體中文",
"ja-JP": "日本語",
"ko-KR": "한국어",
"translated": {
"en-EN": "Английский, Великобритания",
"en-US": "Английский, США",
@@ -170,7 +203,8 @@
"ru-RU": "Русский",
"zh-CN": "Китайский (упрощенный)",
"zh-TW": "Китайский (традиционный)",
"ja-JP": "Японский"
"ja-JP": "Японский",
"ko-KR": "Корейский"
}
}
},
@@ -197,6 +231,34 @@
"report-bug": "Сообщить о баге",
"open-logs": "Открыть логи"
}
},
"advanced": {
"title": "Дополнительные",
"description": "Дополнительные настройки для BSManager.",
"hardware-acceleration": {
"title": "Аппаратное ускорение",
"description": "Включите аппаратное ускорение, чтобы использовать ваш GPU и улучшить производительность BSManager. Отключите эту опцию, если у вас возникают пропуски кадров.",
"modal": {
"title": "Требуется перезагрузка",
"body": "Изменение настройки аппаратного ускорения приведет к завершению и перезапуску BSManager. Вы уверены, что хотите это сделать?",
"confirm-btn": "Да, я уверен"
},
"error-notification": {
"message": "Произошла ошибка, невозможно отключить аппаратное ускорение."
}
},
"use-symlinks": {
"title": "Использовать символические ссылки",
"description": "Используйте символические ссылки вместо соединений для связывания папок. Включайте эту опцию только если это действительно необходимо.",
"modal": {
"title": "Разрешения для символических ссылок",
"body": "При создании символических ссылок BSManager потребуется права администратора или включенный режим разработчика на вашем устройстве. Вы уверены, что хотите продолжить?",
"confirm-btn": "Да, я уверен"
},
"error-notification": {
"message": "Произошла ошибка, невозможно изменить настройки символических ссылок."
}
}
}
}
},
@@ -215,11 +277,13 @@
"errors": {
"titles": {
"operation-running": "Операция в процессе",
"no-internet": "Нет интернета"
"no-internet": "Нет интернета",
"file-not-supported": "Файл не поддерживается"
},
"msg": {
"operation-running": "Дождитесь завершения операции, потом попробуйте снова.",
"no-internet": "Проверьте своё соединение и попробуйте снова."
"no-internet": "Проверьте своё соединение и попробуйте снова.",
"file-not-supported": "Поддерживаются только файлы {types}."
}
}
},
@@ -241,9 +305,6 @@
}
},
"errors": {
"titles": {
"dotnet-required": "Требуется .NET 8"
},
"msg": {
"401": "Похоже Steam не хочет, чтобы мы скачали Beat Saber 😢",
"404": "Нет связи с серверами Steam.",
@@ -266,11 +327,7 @@
"LicenceError": "Не удалось проверить наличие лицензии.",
"RateLimitExceeded": "Слишком много попыток, вернитесь позже и попробуйте снова.",
"TokenRejected": "Ваш токен для входа был отклонен 😕 Пожалуйста, попробуйте снова.",
"AccessDenied": "Доступ к Steam был отклонен.",
"dotnet-required": "Среда запуска .NET 8 должна быть установлена, чтобы скачать Beat Saber. Скачайте её с помощью кнопки ниже."
},
"actions": {
"download-dotnet": "Скачать .NET 8"
"AccessDenied": "Доступ к Steam был отклонен."
}
}
},
@@ -386,6 +443,8 @@
"OCULUS_NOT_RUNNING": "Oculus не запущен",
"BS_ALREADY_RUNNING": "Beat Saber уде запущен",
"EXE_NOT_FINDED": "Отсутствуют файлы",
"PROTON_NOT_SET": "Папка Proton не установлена",
"PROTON_NOT_FOUND": "Бинарный файл Proton не найде",
"EXIT": "Вылет",
"OCULUS_LIB_NOT_FOUND": "Библиотека Oculus не найдена",
"ORIGINAL_OCULUS_NOT_INSTALLED": "Оригинальная версия Oculus не найдена"
@@ -419,7 +478,8 @@
"CantEditSteam": "Не удалось изменить",
"CantRename": "Переименование невозможно",
"VersionAlreadExist": "Эта версия уже добавлена",
"CantClone": "Клонирование невозможно"
"CantClone": "Клонирование невозможно",
"UnknownError": "Произошла неизвестная ошибка"
},
"msg": {
"CantEditSteam": "Вы не можете изменить версию из Steam, но вы можете её клонировать."
@@ -472,6 +532,27 @@
"one-click-install": {
"success": "Карта установлена",
"error": "Ошибка установки карты"
},
"no-duplicates-maps": {
"title": "Нет дубликатов",
"msg": "Ни одна карта не была удалена"
},
"duplicates-maps-deleted": {
"title": "Дубликаты удалены",
"msg": "Дубликаты были удалены"
},
"import-map": {
"titles": {
"success": "Импорт карт завершен",
"error": "Произошла ошибка при импорте карт"
},
"msgs": {
"success": "Карты были успешно импортированы.",
"some-success": "Некоторые карты успешно импортированы.",
"only-accept-zip": "Поддерживаются только zip-файлы.",
"invalid-zip": "В zip-файле(ах) нет карт.",
"unknown": "Произошла неизвестная ошибка."
}
}
},
"playlists": {
@@ -674,6 +755,11 @@
"title": "Общие карты будут скопированы в папку карт этой версии. Карты не будут потеряны, если это не выбрано."
},
"valid-btn": "Отвязать карты"
},
"delete-duplicate-maps": {
"title": "Удалить карту?",
"desc": "Только карта \"{map}\" является дубликатом. Вы уверены, что хотите ее удалить?",
"desc-plural": "Найдено {nb} дубликатов карт. Вы уверены, что хотите их удалить?"
}
},
"download-maps": {
@@ -718,13 +804,14 @@
"stay": "Запомнить меня",
"connect-to-meta": "Подключиться к Meta"
},
"enable-oculus-sideloaded-apps": {
"title": "Включить Sideloading",
"info-1": "Чтобы запустить Beat Saber, необходимо включить возможность запуска приложений через sideloading. BSManager запросит права администратора для автоматического включения этой функции.",
"info-2": "Функция sideloading позволяет запускать игры, расположенные за пределами папки библиотеки Oculus.",
"info-3": "После активации сайдлоадинга функция останется активной, и вам больше не будет предложено её включить.",
"i-want-to-do-it-myself": "Я хочу сделать это сам",
"understood": "Понято"
"original-version-backup-oculus": {
"title": "Внимание",
"body": {
"must-be-installed-once": "Вы должны установить Beat Saber из магазина Oculus на этом устройстве, в противном случае Beat Saber автоматически закроется после запуска.",
"will-backup": "Для запуска этой версии исходная папка установки Beat Saber, находящаяся в вашей библиотеке Oculus, будет переименована и автоматически восстановлена при выходе из Beat Saber."
},
"not-remind-me": "Больше не напоминать",
"understood": "Понял"
},
"enter-meta-token": {
"title": "Токен Oculus",
@@ -753,6 +840,18 @@
},
"launch-as-admin": "Запустить от имени администратора"
},
"ask-install-path": {
"title": "Папка установок",
"choose-folder-description": "Выберите папку, которая будет содержать весь контент, загруженный BSManager. (версии, моды, карты, плейлисты и т.д.)",
"default": "По умолчанию",
"default-tooltip": "По умолчанию в вашей домашней папке"
},
"choose-proton-folder": {
"title": "Папка Proton",
"proton-folder-description": "В Linux BSManager требует Proton для работы. Выберите папку установки Proton, чтобы продолжить.",
"proton-folder-placeholder": "Папка установки Proton",
"where-is-proton-installed": "Где установлен Proton?"
},
"bs-version-outdated": {
"body": "Версия {outdatedVersion} устарела, и некоторые моды или функции могут работать некорректно. Пожалуйста, скачайте последнюю рекомендуемую версию ({recommendedVersion}) Beat Saber, чтобы воспользоваться новейшими функциями и исправлениями ошибок."
}
@@ -761,6 +860,7 @@
"map-filter-panel": {
"duration": "Длительность",
"nps" : "Нот в Секунду",
"njs": "Скорость прыжка нот",
"tags": "тэги",
"specificities": "основное",
"requirements": "требуемые моды",
@@ -838,7 +938,8 @@
"bsr-code" : "Код BSR",
"download" : "Скачать карту",
"downloading" :"Загрузка карты",
"cancel-download" : "Отменить загрузку"
"cancel-download" : "Отменить загрузку",
"hightlight-difficulty": "Выделить сложность"
}
},
"models": {
@@ -1026,6 +1127,143 @@
}
}
},
"drop-zone": {
"or-browse-files": "Или просмотреть файлы"
},
"playlist": {
"error-playlist-creation-title": "Ошибка при создании плейлиста",
"error-playlist-creation-desc": "Произошла ошибка при создании плейлиста.",
"playlist-created-title": "Плейлист создан",
"playlist-created-desc": "Плейлист успешно создан. Теперь вы можете синхронизировать его карты!",
"download-playlist": "Скачать плейлист",
"synchronize-playlist": "Синхронизировать плейлист",
"synchronize-maps": "Синхронизировать карты",
"error-playlists-synchronization-title": "Ошибка синхронизации плейлистов",
"error-playlists-synchronization-desc": "Произошла ошибка при синхронизации плейлистов.",
"playlists-synchronized-title": "Плейлисты синхронизированы!",
"playlists-synchronized-desc": "Плейлисты и их карты были загружены.",
"playlists-export-error-title": "Ошибка экспорта плейлистов",
"playlists-export-error-desc": "Произошла ошибка при экспорте плейлистов.",
"playlists-exported-title": "Плейлисты экспортированы!",
"playlists-exported-desc": "Плейлисты успешно экспортированы.",
"playlists-with-maps-exported-desc": "Плейлисты и их карты успешно экспортированы.",
"playlist-delete-error-title": "Ошибка удаления плейлиста",
"playlist-delete-error-desc": "Произошла ошибка при удалении плейлиста.",
"playlists-deleted-title": "Плейлисты удалены!",
"playlists-deleted-desc": "Плейлисты успешно удалены.",
"edit-playlist": "Редактировать плейлист",
"playlist-edit-error-title": "Ошибка редактирования плейлиста",
"playlist-edit-error-desc": "Произошла ошибка при редактировании плейлиста.",
"playlist-edited-title": "Плейлист отредактирован!",
"playlist-edited-desc": "Плейлист успешно изменен. Теперь вы можете синхронизировать его карты!",
"playlists-loading": "Загрузка плейлистов...",
"no-playlists": "Нет плейлистов",
"download-playlists": "Скачать плейлисты",
"created-by": "Создано",
"stop-download": "Остановить загрузку",
"cancel-download": "Отменить загрузку",
"open-file": "Открыть файл",
"link-playlists": "Связать плейлисты",
"link-playlist-desc": "Связывание плейлистов позволяет делиться плейлистами между всеми версиями. После связывания эта версия будет иметь доступ к общим плейлистам",
"link-playlist-info": "Добавление и удаление плейлистов также будет общим",
"keep-playlists": "Сохранить плейлисты",
"keep-playlists-tip": "Сохранение плейлистов переместит плейлисты из текущей версии в папку общих плейлистов. В противном случае они будут потеряны",
"unlink-playlists": "Отвязать плейлисты",
"unlink-playlist-desc": "Внимание, отвязка плейлистов больше не позволит использовать общие плейлисты для этой версии.",
"unlink-keep-playlists-tip": "Сохранение плейлистов создаст копию общих плейлистов для текущей версии. В противном случае для этой версии не будут сохранены плейлисты.",
"delete-playlist-ask": "Удалить плейлист?",
"delete-playlists-ask": "Удалить плейлисты?",
"delete-playlist-desc": "Вы уверены, что хотите удалить плейлист \"{playlistTitle}\"?",
"delete-playlists-desc": "Вы уверены, что хотите удалить {nb} плейлистов?",
"delete-maps": "Удалить карты",
"delete-playlist-maps-tip": "Если включено, все карты в плейлисте будут удалены",
"delete-playlists-maps-tip": "Если включено, все карты в плейлистах будут удалены",
"export-playlist-ask": "Экспортировать плейлист?",
"export-playlists-ask": "Экспортировать плейлисты?",
"export-playlist-desc": "Вы уверены, что хотите экспортировать плейлист \"{playlistTitle}\"?",
"export-playlists-desc": "Вы уверены, что хотите экспортировать {nb} плейлистов?",
"export-maps": "Экспортировать карты",
"export-playlist-maps-tip": "Если включено, все карты в плейлисте также будут экспортированы",
"export-playlists-maps-tip": "Если включено, все карты в плейлистах также будут экспортированы",
"export": "Экспорт",
"need-clone-title": "Предупреждение",
"need-clone-desc-1": "Этот плейлист был загружен с внешнего сайта и содержит ссылку для синхронизации.",
"need-clone-desc-2": "Чтобы избежать потери ваших изменений во время синхронизации, плейлист будет дублирован, а его ссылка для синхронизации удалена.",
"need-clone-desc-3": "Затем вы можете, если хотите, удалить оригинальный плейлист.",
"understood": "Я понимаю",
"synchronize-playlist-ask": "Синхронизировать плейлист?",
"synchronize-playlists-ask": "Синхронизировать плейлисты?",
"synchronize-playlist-desc": "Вы уверены, что хотите синхронизировать плейлист \"{playlistTitle}\"?",
"synchronize-playlists-desc": "Вы уверены, что хотите синхронизировать {nb} плейлистов?",
"synchronize-playlist-tip": "Это действие обновляет плейлисты и загружает отсутствующие карты; это может занять несколько минут.",
"synchronize": "Синхронизировать",
"curated": "Рекомендованные",
"verified-mapper": "Проверенный маппер",
"empty-playlists": "Пустые плейлисты",
"search-playlist": "Поиск плейлиста",
"no-playlists-found": "Плейлисты не найдены",
"error-occur-while-loading-playlists": "Произошла ошибка при загрузке плейлистов",
"error-occur-while-loading-playlist": "Произошла ошибка при загрузке плейлиста",
"loading-maps": "Загрузка карт...",
"no-maps-found-for-playlist": "Для этого плейлиста не найдено карт",
"playlist-contain-no-maps": "Плейлист не содержит карт",
"no-map-installed-for-playlist": "Для этого плейлиста не установлено карт",
"playlist-is-waiting-to-download": "Плейлист ожидает загрузки",
"download-maps": "Скачать карты",
"download-missing-maps": "Скачать отсутствующие карты",
"playlist-is-downloading": "Плейлист загружается",
"some-playlist-maps-are-missing": "Некоторые карты в этом плейлисте отсутствуют",
"create-a-playlist": "Создать плейлист",
"synchronize-playlists": "Синхронизировать плейлисты",
"export-playlists": "Экспортировать плейлисты",
"delete-playlists": "Удалить плейлисты",
"choose-image": "Выбрать изображение",
"title": "Название",
"playlist-title": "Название плейлиста",
"description": "Описание",
"playlist-description": "Описание плейлиста",
"author": "Автор",
"playlist-author": "Автор плейлиста",
"save": "Сохранить",
"loading": "Загрузка...",
"installed": "Установлено",
"no-map-found": "Карта не найдена",
"edit-playlist-shortcuts": "Удерживайте Shift или Ctrl для выбора нескольких карт",
"add-to-playlist": "Добавить в плейлист",
"remove-from-playlist": "Удалить из плейлиста",
"playlist-is-empty": "Плейлист пуст",
"continue": "Продолжить",
"nb-maps": "Количество карт",
"nb-mappers": "Количество мапперов",
"duration": "Продолжительность",
"nps": "Нот в секунду",
"date-picker": {
"start-date-end-date": "Дата начала — Дата окончания",
"all": "Все",
"last-24h": "Последние 24 часа",
"last-week": "Последняя неделя",
"last-month": "Последний месяц",
"3-last-month": "Последние 3 месяца"
},
"playlists-imported": "Плейлисты импортированы",
"all-playlists-have-been-successfully-imported": "Все плейлисты успешно импортированы",
"no-playlist-found": "Плейлист не найден",
"no-playlist-found-in-selected-files": "Плейлист не найден в выбранных файлах",
"some-playlists-not-imported": "Некоторые плейлисты не импортированы",
"some-playlists-have-been-imported": {
"INVALID_SOURCE": "Некоторые плейлисты не найдены",
"INVALID_PLAYLIST_FILE": "Некоторые плейлисты недействительны",
"CANNOT_PARSE_PLAYLIST": "Некоторые плейлисты нечитаемы",
"unknown": "Некоторые плейлисты не удалось импортировать"
},
"no-playlists-imported": "Плейлисты не импортированы",
"no-playlists-imported-errors": {
"INVALID_SOURCE": "Плейлисты не найдены",
"INVALID_PLAYLIST_FILE": "Плейлисты недействительны",
"CANNOT_PARSE_PLAYLIST": "Плейлисты нечитаемы",
"unknown": "Не удалось импортировать плейлисты"
}
},
"dateformat": {
"dayNames": ["Вск", "Пнд", "Втр", "Срд", "Чтв", "Птн", "Суб", "Воскресение", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"],
"monthNames": ["Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авн", "Сен", "Окт", "Ноя", "Дек", "Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"],
+264 -26
View File
@@ -50,14 +50,16 @@
"filters-btn": "篩選",
"dropdown": {
"export-maps": "導出譜面",
"delete-maps": "刪除譜面"
"delete-maps": "刪除譜面",
"delete-duplicate-maps": "刪除重複項"
}
},
"tabs": {
"maps": {
"actions": {
"add-maps": {
"text": "新增"
"drop-down": {
"browse-maps": "瀏覽地圖",
"import-maps": "匯入地圖"
},
"link-maps": {
"tooltips": {
@@ -69,6 +71,21 @@
"empty-maps": {
"text": "無譜面",
"button": "下載譜面"
},
"drop-zone": {
"text": "導入您的地圖",
"subtext": "將ZIP文件拖放到此處以導入您的地圖"
}
},
"playlists": {
"drop-down": {
"browse-playlists": "瀏覽播放列表",
"create-a-playlist": "建立播放列表",
"import-playlists": "匯入播放列表"
},
"drop-zone": {
"text": "匯入您的播放列表",
"subtext": "將您的 \".bplist\" 或 \".json\" 檔案拖曳到這裡進行匯入"
}
}
}
@@ -79,7 +96,8 @@
"mods-not-available": "該版本 BeatSaber 暫無可用 Mod",
"buttons": {
"more-infos": "更多資訊",
"install-or-update": "安裝或更新"
"install-or-update": "安裝或更新",
"reinstall-all": "重新安裝全部"
},
"mods-grid": {
"header-bar": {
@@ -92,6 +110,12 @@
"unselect-all": "取消全選"
}
}
},
"notifications": {
"all-mods-already-installed": {
"title": "模組已安裝",
"description": "所有選中的模組已經安裝"
}
}
},
"dropdown": {
@@ -119,6 +143,7 @@
"title": "Steam & Oculus",
"description": "登出後,您可以在下一次下載 Beat Saber 時切換帳戶。",
"logout": "登出",
"logout-success": "登出成功",
"download-platform": {
"title": ",預設平台",
"desc": "選擇要下載 BeatSaber 的預設平台。",
@@ -138,8 +163,15 @@
},
"installation-folder": {
"title": "安裝文件夾",
"description": "為 BeatSaber 不同版本及未來其他特性修改預設文件夾",
"choose-folder": "選擇文件夾"
"description": "更改將包含 BSManager 下載的所有內容的文件夾"
},
"proton-folder": {
"title": "Proton資料夾",
"description": "將資料夾更改為Proton路徑。(例如:Proton - Experimental",
"errors": {
"title": "設置Proton資料夾失敗",
"invalid-folder": "無效的Proton資料夾路徑"
}
},
"additional-content": {
"title": "附加內容",
@@ -161,6 +193,7 @@
"zh-CN": "簡體中文",
"zh-TW": "正體中文",
"ja-JP": "日本語",
"ko-KR": "한국어",
"translated": {
"en-EN": "英式英語",
"en-US": "美式英語",
@@ -170,7 +203,8 @@
"ru-RU": "俄語",
"zh-CN": "簡體中文",
"zh-TW": "正體中文",
"ja-JP": "日語"
"ja-JP": "日語",
"ko-KR": "韓語"
}
}
},
@@ -197,6 +231,34 @@
"report-bug": "報告 bug",
"open-logs": "打開日誌"
}
},
"advanced": {
"title": "高级设置",
"description": "BSManager的高级设置。",
"hardware-acceleration": {
"title": "硬體加速",
"description": "啟用硬體加速以使用您的GPU並提高BSManager的性能。如果您遇到幀丟失,請關閉此功能。",
"modal": {
"title": "需要重啟",
"body": "更改硬體加速設置將退出並重新啟動BSManager。您確定要這樣做嗎?",
"confirm-btn": "是的,我確定"
},
"error-notification": {
"message": "發生錯誤,無法禁用硬體加速。"
}
},
"use-symlinks": {
"title": "使用符號鏈接",
"description": "使用符號鏈接而不是連接來鏈接文件夾。僅在確實需要時才啟用此功能。",
"modal": {
"title": "符號鏈接權限",
"body": "創建符號鏈接時,BSManager將需要管理員權限或啟用開發者模式。您確定要繼續嗎?",
"confirm-btn": "是的,我確定"
},
"error-notification": {
"message": "發生錯誤,無法更改符號鏈接設置。"
}
}
}
}
},
@@ -215,11 +277,13 @@
"errors": {
"titles": {
"operation-running": "操作進行中",
"no-internet": "無網路"
"no-internet": "無網路",
"file-not-supported": "文件不受支持"
},
"msg": {
"operation-running": "等待當前操作完成,然後重試。",
"no-internet": "檢查你的連接並重試。"
"no-internet": "檢查你的連接並重試。",
"file-not-supported": "僅支援{types}檔案。"
}
}
},
@@ -241,9 +305,6 @@
}
},
"errors": {
"titles": {
"dotnet-required": "需要 .NET 8"
},
"msg": {
"401": "Steam 似乎不想讓我們下載 Beat Saber😢",
"404": "無法聯繫 Steam 伺服器。",
@@ -266,11 +327,7 @@
"LicenceError": "無法獲取許可證列表。",
"RateLimitExceeded": "你已經嘗試了太多次,請稍等片刻,稍後再試。",
"TokenRejected": "你的登錄令牌已被拒絕 😕 請重試。",
"AccessDenied": "訪問 Steam 被拒絕。",
"dotnet-required": "必須安裝 .NET 8 Runtime 才能下載 Beat Saber 版本。單擊下面的按鈕下載它。"
},
"actions": {
"download-dotnet": "下載 .NET 8"
"AccessDenied": "訪問 Steam 被拒絕。"
}
}
},
@@ -386,6 +443,8 @@
"OCULUS_NOT_RUNNING": "Oculus 未運行",
"BS_ALREADY_RUNNING": "Beat Saber 已在運行",
"EXE_NOT_FINDED": "缺少文件",
"PROTON_NOT_SET": "Proton資料夾未設置",
"PROTON_NOT_FOUND": "找不到Proton二進位檔",
"EXIT": "突然停止",
"OCULUS_LIB_NOT_FOUND": "未找到 Oculus 庫",
"ORIGINAL_OCULUS_NOT_INSTALLED": "找不到原始Oculus版本"
@@ -419,7 +478,8 @@
"CantEditSteam": "無法編輯",
"CantRename": "無法重命名",
"VersionAlreadExist": "該版本已存在",
"CantClone": "無法複製"
"CantClone": "無法複製",
"UnknownError": "發生了未知錯誤"
},
"msg": {
"CantEditSteam": "你不能編輯 Steam 版本。不過你可以複製它。"
@@ -472,6 +532,27 @@
"one-click-install": {
"success": "譜面安裝完成",
"error": "安裝譜面時發生錯誤"
},
"no-duplicates-maps": {
"title": "沒有重複",
"msg": "沒有刪除地圖"
},
"duplicates-maps-deleted": {
"title": "重複已刪除",
"msg": "重複已刪除"
},
"import-map": {
"titles": {
"success": "地圖匯入完成",
"error": "地圖匯入時發生錯誤"
},
"msgs": {
"success": "地圖已成功匯入。",
"some-success": "部分地圖已成功匯入。",
"only-accept-zip": "僅支援zip檔案。",
"invalid-zip": "zip檔案中沒有地圖。",
"unknown": "發生了未知錯誤。"
}
}
},
"playlists": {
@@ -674,6 +755,11 @@
"title": "保留譜面將會在取消關聯後把共享文件夾的所有譜面複製到當前版本。如果此項被禁用,譜面也不會遺失。"
},
"valid-btn": "取消關聯譜面"
},
"delete-duplicate-maps": {
"title": "刪除地圖",
"desc": "只有地圖「{map}」是重複的。你確定要刪除它嗎?",
"desc-plural": "發現了 {nb} 個重複的地圖。你確定要刪除它們嗎?"
}
},
"download-maps": {
@@ -718,13 +804,14 @@
"stay": "記住我",
"connect-to-meta": "連接到 Meta"
},
"enable-oculus-sideloaded-apps": {
"title": "啟用旁載",
"info-1": "為了啟動 Beat Saber,必須啟用執行旁載應用程式的功能。BSManager 將請求管理員權限以自動啟用此功能。",
"info-2": "旁載功能允許啟動位於 Oculus 資料庫資料夾之外的遊戲。",
"info-3": "啟用 sideloading 後,此功能將保持啟用狀態,您將不再被提示啟用它。",
"i-want-to-do-it-myself": "我想自己完成",
"understood": "了解"
"original-version-backup-oculus": {
"title": "警告",
"body": {
"must-be-installed-once": "您必須在此設備上從Oculus商店安裝Beat Saber,否則Beat Saber將在啟動後自動關閉。",
"will-backup": "為了啟動這個版本,位於您的Oculus庫中的Beat Saber的原始安裝文件夾將被重新命名,並且在Beat Saber關閉時會自動恢復。"
},
"not-remind-me": "不再提醒我",
"understood": "明白了"
},
"enter-meta-token": {
"title": "Oculus令牌",
@@ -754,6 +841,18 @@
"launch-as-admin": "以管理員身份啟動",
"not-remind-me": "不再提醒我"
},
"ask-install-path": {
"title": "安裝文件夾",
"choose-folder-description": "選擇將包含 BSManager 下載的所有內容的文件夾。(版本、mod、地圖、播放列表等)",
"default": "預設",
"default-tooltip": "預設為您的主資料夾"
},
"choose-proton-folder": {
"title": "Proton資料夾",
"proton-folder-description": "在Linux上,BSManager需要Proton才能運行。請選擇Proton的安裝資料夾以繼續。",
"proton-folder-placeholder": "Proton安裝資料夾",
"where-is-proton-installed": "Proton安裝在哪裡?"
},
"bs-version-outdated": {
"body": "版本 {outdatedVersion} 已過時,某些模組或功能可能無法正常運作。請下載最新推薦的 Beat Saber 版本 ({recommendedVersion}),以享受最新功能和修正。"
}
@@ -762,6 +861,7 @@
"map-filter-panel": {
"duration": "時長",
"nps" : "每秒音符數",
"njs": "音符跳躍速度",
"tags": "標籤",
"specificities": "general",
"requirements": "要求",
@@ -839,7 +939,8 @@
"bsr-code" : "BSR代碼",
"download" : "下載地圖",
"downloading" :"正在下載地圖",
"cancel-download" : "取消下載"
"cancel-download" : "取消下載",
"hightlight-difficulty": "突出顯示難度"
}
},
"models": {
@@ -1027,6 +1128,143 @@
}
}
},
"drop-zone": {
"or-browse-files": "或瀏覽檔案"
},
"playlist": {
"error-playlist-creation-title": "建立播放清單時發生錯誤",
"error-playlist-creation-desc": "建立播放清單時發生錯誤。",
"playlist-created-title": "播放清單已建立",
"playlist-created-desc": "播放清單已成功建立。您現在可以同步其地圖了!",
"download-playlist": "下載播放清單",
"synchronize-playlist": "同步播放清單",
"synchronize-maps": "同步地圖",
"error-playlists-synchronization-title": "同步播放清單時發生錯誤",
"error-playlists-synchronization-desc": "同步播放清單時發生錯誤。",
"playlists-synchronized-title": "播放清單已同步!",
"playlists-synchronized-desc": "播放清單及其地圖已下載。",
"playlists-export-error-title": "匯出播放清單時發生錯誤",
"playlists-export-error-desc": "匯出播放清單時發生錯誤。",
"playlists-exported-title": "播放清單已匯出!",
"playlists-exported-desc": "播放清單已成功匯出。",
"playlists-with-maps-exported-desc": "播放清單及其地圖已成功匯出。",
"playlist-delete-error-title": "刪除播放清單時發生錯誤",
"playlist-delete-error-desc": "刪除播放清單時發生錯誤。",
"playlists-deleted-title": "播放清單已刪除!",
"playlists-deleted-desc": "播放清單已成功刪除。",
"edit-playlist": "編輯播放清單",
"playlist-edit-error-title": "編輯播放清單時發生錯誤",
"playlist-edit-error-desc": "編輯播放清單時發生錯誤。",
"playlist-edited-title": "播放清單已編輯!",
"playlist-edited-desc": "播放清單已成功修改。您現在可以同步其地圖了!",
"playlists-loading": "正在載入播放清單...",
"no-playlists": "沒有播放清單",
"download-playlists": "下載播放清單",
"created-by": "建立者",
"stop-download": "停止下載",
"cancel-download": "取消下載",
"open-file": "開啟檔案",
"link-playlists": "連結播放清單",
"link-playlist-desc": "連結播放清單允許在所有版本之間共享播放清單。一旦連結,此版本將受益於共享播放清單",
"link-playlist-info": "新增和刪除播放清單也將被共享",
"keep-playlists": "保留播放清單",
"keep-playlists-tip": "保留播放清單將把當前版本的播放清單移動到共享播放清單資料夾。否則,它們將遺失",
"unlink-playlists": "取消連結播放清單",
"unlink-playlist-desc": "警告,取消連結播放清單將不再允許此版本使用共享播放清單。",
"unlink-keep-playlists-tip": "保留播放清單將為當前版本建立共享播放清單的副本。否則,此版本將不保留任何播放清單。",
"delete-playlist-ask": "刪除播放清單?",
"delete-playlists-ask": "刪除播放清單?",
"delete-playlist-desc": "您確定要刪除播放清單 \"{playlistTitle}\" 嗎?",
"delete-playlists-desc": "您確定要刪除 {nb} 個播放清單嗎?",
"delete-maps": "刪除地圖",
"delete-playlist-maps-tip": "如果啟用,播放清單中的所有地圖都將被刪除",
"delete-playlists-maps-tip": "如果啟用,播放清單中的所有地圖都將被刪除",
"export-playlist-ask": "匯出播放清單?",
"export-playlists-ask": "匯出播放清單?",
"export-playlist-desc": "您確定要匯出播放清單 \"{playlistTitle}\" 嗎?",
"export-playlists-desc": "您確定要匯出 {nb} 個播放清單嗎?",
"export-maps": "匯出地圖",
"export-playlist-maps-tip": "如果啟用,播放清單中的所有地圖也將被匯出",
"export-playlists-maps-tip": "如果啟用,播放清單中的所有地圖也將被匯出",
"export": "匯出",
"need-clone-title": "警告",
"need-clone-desc-1": "此播放清單已從外部網站下載,並包含同步連結。",
"need-clone-desc-2": "為避免在同步過程中遺失更改,播放清單將被複製,並刪除其同步連結。",
"need-clone-desc-3": "然後,如果您願意,可以刪除原始播放清單。",
"understood": "我明白了",
"synchronize-playlist-ask": "同步播放清單?",
"synchronize-playlists-ask": "同步播放清單?",
"synchronize-playlist-desc": "您確定要同步播放清單 \"{playlistTitle}\" 嗎?",
"synchronize-playlists-desc": "您確定要同步 {nb} 個播放清單嗎?",
"synchronize-playlist-tip": "此操作更新播放清單並下載缺失的地圖;可能需要幾分鐘。",
"synchronize": "同步",
"curated": "精選",
"verified-mapper": "已驗證的製圖者",
"empty-playlists": "空播放清單",
"search-playlist": "搜尋播放清單",
"no-playlists-found": "未找到播放清單",
"error-occur-while-loading-playlists": "載入播放清單時發生錯誤",
"error-occur-while-loading-playlist": "載入播放清單時發生錯誤",
"loading-maps": "正在載入地圖...",
"no-maps-found-for-playlist": "未找到此播放清單的地圖",
"playlist-contain-no-maps": "播放清單不包含地圖",
"no-map-installed-for-playlist": "此播放清單沒有已安裝的地圖",
"playlist-is-waiting-to-download": "播放清單正在等待下載",
"download-maps": "下載地圖",
"download-missing-maps": "下載缺失的地圖",
"playlist-is-downloading": "播放清單正在下載",
"some-playlist-maps-are-missing": "此播放清單中的一些地圖缺失",
"create-a-playlist": "建立播放清單",
"synchronize-playlists": "同步播放清單",
"export-playlists": "匯出播放清單",
"delete-playlists": "刪除播放清單",
"choose-image": "選擇圖片",
"title": "標題",
"playlist-title": "播放清單標題",
"description": "描述",
"playlist-description": "播放清單描述",
"author": "作者",
"playlist-author": "播放清單作者",
"save": "儲存",
"loading": "載入中...",
"installed": "已安裝",
"no-map-found": "未找到地圖",
"edit-playlist-shortcuts": "按住 Shift 或 Ctrl 選擇多個地圖",
"add-to-playlist": "新增到播放清單",
"remove-from-playlist": "從播放清單中移除",
"playlist-is-empty": "播放清單為空",
"continue": "繼續",
"nb-maps": "地圖數量",
"nb-mappers": "製圖者數量",
"duration": "持續時間",
"nps": "每秒音符數",
"date-picker": {
"start-date-end-date": "開始日期 — 結束日期",
"all": "全部",
"last-24h": "最近24小時",
"last-week": "上週",
"last-month": "上個月",
"3-last-month": "最近3個月"
},
"playlists-imported": "播放清單已匯入",
"all-playlists-have-been-successfully-imported": "所有播放清單已成功匯入",
"no-playlist-found": "未找到播放清單",
"no-playlist-found-in-selected-files": "在選定檔案中未找到播放清單",
"some-playlists-not-imported": "部分播放清單未匯入",
"some-playlists-have-been-imported": {
"INVALID_SOURCE": "某些播放清單未找到",
"INVALID_PLAYLIST_FILE": "某些播放清單無效",
"CANNOT_PARSE_PLAYLIST": "某些播放清單無法解析",
"unknown": "某些播放清單無法匯入"
},
"no-playlists-imported": "未匯入任何播放清單",
"no-playlists-imported-errors": {
"INVALID_SOURCE": "播放清單未找到",
"INVALID_PLAYLIST_FILE": "播放清單無效",
"CANNOT_PARSE_PLAYLIST": "播放清單無法解析",
"unknown": "無法匯入任何播放清單"
}
},
"dateformat": {
"dayNames": ["週日", "週一", "週二", "週三", "週四", "週五", "週六", "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"],
"monthNames": ["1 月", "2 月", "3 月", "4 月", "5 月", "6 月", "7 月", "8 月", "9 月", "10 月", "11 月", "12 月", "一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"],
+263 -25
View File
@@ -50,14 +50,16 @@
"filters-btn": "筛选",
"dropdown": {
"export-maps": "导出谱面",
"delete-maps": "删除谱面"
"delete-maps": "删除谱面",
"delete-duplicate-maps": "删除重复项"
}
},
"tabs": {
"maps": {
"actions": {
"add-maps": {
"text": "添加"
"drop-down": {
"browse-maps": "浏览地图",
"import-maps": "导入地图"
},
"link-maps": {
"tooltips": {
@@ -69,6 +71,21 @@
"empty-maps": {
"text": "无谱面",
"button": "下载谱面"
},
"drop-zone": {
"text": "导入您的地图",
"subtext": "将ZIP文件拖放到此处以导入您的地图"
}
},
"playlists": {
"drop-down": {
"browse-playlists": "浏览播放列表",
"create-a-playlist": "创建播放列表",
"import-playlists": "导入播放列表"
},
"drop-zone": {
"text": "导入您的播放列表",
"subtext": "将您的 \".bplist\" 或 \".json\" 文件拖放到这里进行导入"
}
}
}
@@ -79,7 +96,8 @@
"mods-not-available": "该版本 BeatSaber 暂无可用 Mod",
"buttons": {
"more-infos": "更多信息",
"install-or-update": "安装或更新"
"install-or-update": "安装或更新",
"reinstall-all": "重新安装全部"
},
"mods-grid": {
"header-bar": {
@@ -92,6 +110,12 @@
"unselect-all": "取消全选"
}
}
},
"notifications": {
"all-mods-already-installed": {
"title": "模组已安装",
"description": "所有选中的模组已经安装"
}
}
},
"dropdown": {
@@ -119,6 +143,7 @@
"title": "Steam & Oculus",
"description": "登出后,您可以在下一次下载 Beat Saber 时切换帐户。",
"logout": "登出",
"logout-success": "注销成功",
"download-platform": {
"title": ",默认平台",
"desc": "选择要下载 BeatSaber 的默认平台。",
@@ -138,8 +163,15 @@
},
"installation-folder": {
"title": "安装文件夹",
"description": "为 BeatSaber 不同版本及未来其他特性修改默认文件夹",
"choose-folder": "选择文件夹"
"description": "更改将包含 BSManager 下载的所有内容的文件夹"
},
"proton-folder": {
"title": "Proton文件夹",
"description": "将文件夹更改为Proton路径。(例如:Proton - Experimental",
"errors": {
"title": "设置Proton文件夹失败",
"invalid-folder": "无效的Proton文件夹路径"
}
},
"additional-content": {
"title": "附加内容",
@@ -161,6 +193,7 @@
"zh-CN": "简体中文",
"zh-TW": "正體中文",
"ja-JP": "日本語",
"ko-KR": "한국어",
"translated": {
"en-EN": "英式英语",
"en-US": "美式英语",
@@ -170,7 +203,8 @@
"ru-RU": "俄语",
"zh-CN": "简体中文",
"zh-TW": "正体中文",
"ja-JP": "日语"
"ja-JP": "日语",
"ko-KR": "韩语"
}
}
},
@@ -197,6 +231,34 @@
"report-bug": "报告 bug",
"open-logs": "打开日志"
}
},
"advanced": {
"title": "高级设置",
"description": "BSManager的高级设置。",
"hardware-acceleration": {
"title": "硬件加速",
"description": "启用硬件加速以使用您的GPU并提高BSManager的性能。如果您遇到帧丢失,请关闭此功能。",
"modal": {
"title": "需要重启",
"body": "更改硬件加速设置将退出并重新启动BSManager。您确定要这样做吗?",
"confirm-btn": "是的,我确定"
},
"error-notification": {
"message": "发生错误,无法禁用硬件加速。"
}
},
"use-symlinks": {
"title": "使用符号链接",
"description": "使用符号链接而不是联接来链接文件夹。仅在确实需要时才启用此功能。",
"modal": {
"title": "符号链接权限",
"body": "创建符号链接时,BSManager将需要管理员权限或启用开发者模式。您确定要继续吗?",
"confirm-btn": "是的,我确定"
},
"error-notification": {
"message": "发生错误,无法更改符号链接设置。"
}
}
}
}
},
@@ -215,11 +277,13 @@
"errors": {
"titles": {
"operation-running": "操作进行中",
"no-internet": "无网络"
"no-internet": "无网络",
"file-not-supported": "文件不受支持"
},
"msg": {
"operation-running": "等待当前操作完成,然后重试。",
"no-internet": "检查你的连接并重试。"
"no-internet": "检查你的连接并重试。",
"file-not-supported": "仅支持{types}文件。"
}
}
},
@@ -241,9 +305,6 @@
}
},
"errors": {
"titles": {
"dotnet-required": "需要 .NET 8"
},
"msg": {
"401": "Steam 似乎不想让我们下载 Beat Saber😢",
"404": "无法联系 Steam 服务器。",
@@ -266,11 +327,7 @@
"LicenceError": "无法获取许可证列表。",
"RateLimitExceeded": "你已经尝试了太多次,请稍等片刻,稍后再试。",
"TokenRejected": "你的登录令牌已被拒绝 😕 请重试。",
"AccessDenied": "访问 Steam 被拒绝。",
"dotnet-required": "必须安装 .NET 8 Runtime 才能下载 Beat Saber 版本。单击下面的按钮下载它。"
},
"actions": {
"download-dotnet": "下载 .NET 8"
"AccessDenied": "访问 Steam 被拒绝。"
}
}
},
@@ -386,6 +443,8 @@
"OCULUS_NOT_RUNNING": "Oculus 未运行",
"BS_ALREADY_RUNNING": "Beat Saber 已在运行",
"EXE_NOT_FINDED": "缺少文件",
"PROTON_NOT_SET": "Proton文件夹未设置",
"PROTON_NOT_FOUND": "未找到Proton二进制文件",
"EXIT": "突然停止",
"OCULUS_LIB_NOT_FOUND": "未找到 Oculus 库",
"ORIGINAL_OCULUS_NOT_INSTALLED": "未找到原始Oculus版本"
@@ -419,7 +478,8 @@
"CantEditSteam": "无法编辑",
"CantRename": "无法重命名",
"VersionAlreadExist": "该版本已存在",
"CantClone": "无法克隆"
"CantClone": "无法克隆",
"UnknownError": "发生了未知错误"
},
"msg": {
"CantEditSteam": "你不能编辑 Steam 版本。不过你可以克隆它。"
@@ -472,6 +532,27 @@
"one-click-install": {
"success": "谱面安装完成",
"error": "安装谱面时发生错误"
},
"no-duplicates-maps": {
"title": "没有重复",
"msg": "没有删除地图"
},
"duplicates-maps-deleted": {
"title": "重复已删除",
"msg": "重复已删除"
},
"import-map": {
"titles": {
"success": "地图导入完成",
"error": "导入地图时发生错误"
},
"msgs": {
"success": "地图已成功导入。",
"some-success": "部分地图已成功导入。",
"only-accept-zip": "仅支持zip文件。",
"invalid-zip": "zip文件中没有地图。",
"unknown": "发生了未知错误。"
}
}
},
"playlists": {
@@ -674,6 +755,11 @@
"title": "保留谱面将会在取消关联后把共享文件夹的所有谱面复制到当前版本。如果此项被禁用,谱面也不会丢失。"
},
"valid-btn": "取消关联谱面"
},
"delete-duplicate-maps": {
"title": "删除地图",
"desc": "只有地图 \"{map}\" 是重复的。你确定要删除它吗?",
"desc-plural": "发现了 {nb} 个重复的地图。你确定要删除它们吗?"
}
},
"download-maps": {
@@ -718,12 +804,13 @@
"stay": "记住我",
"connect-to-meta": "连接到 Meta"
},
"enable-oculus-sideloaded-apps": {
"title": "启用旁加载",
"info-1": "为了启动 Beat Saber,必须启用运行旁加载应用程序的功能。BSManager 将请求管理员权限以自动启用此功能。",
"info-2": "旁加载功能允许启动位于 Oculus 库文件夹之外的游戏。",
"info-3": "激活 sideloading 后,该功能将保持激活状态,您将不再被提示启用它。",
"i-want-to-do-it-myself": "我想自己完成",
"original-version-backup-oculus": {
"title": "警告",
"body": {
"must-be-installed-once": "您必须在此设备上从Oculus商店安装Beat Saber,否则Beat Saber将在启动后自动关闭。",
"will-backup": "为了启动这个版本,位于您的Oculus库中的Beat Saber的原始安装文件夹将被重命名,并且在Beat Saber关闭时会自动恢复。"
},
"not-remind-me": "不再提醒我",
"understood": "明白了"
},
"enter-meta-token": {
@@ -754,6 +841,18 @@
"launch-as-admin": "以管理员身份启动",
"not-remind-me": "不再提醒我"
},
"ask-install-path": {
"title": "安装文件夹",
"choose-folder-description": "选择将包含 BSManager 下载的所有内容的文件夹。(版本、mod、地图、播放列表等)",
"default": "默认",
"default-tooltip": "默认为您的主文件夹"
},
"choose-proton-folder": {
"title": "Proton文件夹",
"proton-folder-description": "在Linux上,BSManager需要Proton才能运行。请选择Proton的安装文件夹以继续。",
"proton-folder-placeholder": "Proton安装文件夹",
"where-is-proton-installed": "Proton安装在哪里?"
},
"bs-version-outdated": {
"body": "版本 {outdatedVersion} 已过时,某些模组或功能可能无法正常工作。请下载最新推荐的 Beat Saber 版本 ({recommendedVersion}),以享受最新功能和修复。"
}
@@ -762,6 +861,7 @@
"map-filter-panel": {
"duration": "时长",
"nps" : "每秒音符数",
"njs": "音符跳跃速度",
"tags": "标签",
"specificities": "general",
"requirements": "要求",
@@ -839,7 +939,8 @@
"bsr-code" : "BSR代码",
"download" : "下载地图",
"downloading" :"正在下载地图",
"cancel-download" : "取消下载"
"cancel-download" : "取消下载",
"hightlight-difficulty": "突出显示难度"
}
},
"models": {
@@ -1027,6 +1128,143 @@
}
}
},
"drop-zone": {
"or-browse-files": "或浏览文件"
},
"playlist": {
"error-playlist-creation-title": "创建播放列表时出错",
"error-playlist-creation-desc": "创建播放列表时发生错误。",
"playlist-created-title": "播放列表已创建",
"playlist-created-desc": "播放列表已成功创建。您现在可以同步其地图了!",
"download-playlist": "下载播放列表",
"synchronize-playlist": "同步播放列表",
"synchronize-maps": "同步地图",
"error-playlists-synchronization-title": "同步播放列表时出错",
"error-playlists-synchronization-desc": "同步播放列表时发生错误。",
"playlists-synchronized-title": "播放列表已同步!",
"playlists-synchronized-desc": "播放列表及其地图已下载。",
"playlists-export-error-title": "导出播放列表时出错",
"playlists-export-error-desc": "导出播放列表时发生错误。",
"playlists-exported-title": "播放列表已导出!",
"playlists-exported-desc": "播放列表已成功导出。",
"playlists-with-maps-exported-desc": "播放列表及其地图已成功导出。",
"playlist-delete-error-title": "删除播放列表时出错",
"playlist-delete-error-desc": "删除播放列表时发生错误。",
"playlists-deleted-title": "播放列表已删除!",
"playlists-deleted-desc": "播放列表已成功删除。",
"edit-playlist": "编辑播放列表",
"playlist-edit-error-title": "编辑播放列表时出错",
"playlist-edit-error-desc": "编辑播放列表时发生错误。",
"playlist-edited-title": "播放列表已编辑!",
"playlist-edited-desc": "播放列表已成功修改。您现在可以同步其地图了!",
"playlists-loading": "正在加载播放列表...",
"no-playlists": "没有播放列表",
"download-playlists": "下载播放列表",
"created-by": "创建者",
"stop-download": "停止下载",
"cancel-download": "取消下载",
"open-file": "打开文件",
"link-playlists": "链接播放列表",
"link-playlist-desc": "链接播放列表允许在所有版本之间共享播放列表。一旦链接,此版本将受益于共享播放列表",
"link-playlist-info": "添加和删除播放列表也将被共享",
"keep-playlists": "保留播放列表",
"keep-playlists-tip": "保留播放列表将把当前版本的播放列表移动到共享播放列表文件夹。否则,它们将丢失",
"unlink-playlists": "取消链接播放列表",
"unlink-playlist-desc": "警告,取消链接播放列表将不再允许此版本使用共享播放列表。",
"unlink-keep-playlists-tip": "保留播放列表将为当前版本创建共享播放列表的副本。否则,此版本将不保留任何播放列表。",
"delete-playlist-ask": "删除播放列表?",
"delete-playlists-ask": "删除播放列表?",
"delete-playlist-desc": "您确定要删除播放列表 \"{playlistTitle}\" 吗?",
"delete-playlists-desc": "您确定要删除 {nb} 个播放列表吗?",
"delete-maps": "删除地图",
"delete-playlist-maps-tip": "如果启用,播放列表中的所有地图都将被删除",
"delete-playlists-maps-tip": "如果启用,播放列表中的所有地图都将被删除",
"export-playlist-ask": "导出播放列表?",
"export-playlists-ask": "导出播放列表?",
"export-playlist-desc": "您确定要导出播放列表 \"{playlistTitle}\" 吗?",
"export-playlists-desc": "您确定要导出 {nb} 个播放列表吗?",
"export-maps": "导出地图",
"export-playlist-maps-tip": "如果启用,播放列表中的所有地图也将被导出",
"export-playlists-maps-tip": "如果启用,播放列表中的所有地图也将被导出",
"export": "导出",
"need-clone-title": "警告",
"need-clone-desc-1": "此播放列表已从外部站点下载,并包含同步链接。",
"need-clone-desc-2": "为避免在同步过程中丢失更改,播放列表将被复制,并删除其同步链接。",
"need-clone-desc-3": "然后,如果您愿意,可以删除原始播放列表。",
"understood": "我明白了",
"synchronize-playlist-ask": "同步播放列表?",
"synchronize-playlists-ask": "同步播放列表?",
"synchronize-playlist-desc": "您确定要同步播放列表 \"{playlistTitle}\" 吗?",
"synchronize-playlists-desc": "您确定要同步 {nb} 个播放列表吗?",
"synchronize-playlist-tip": "此操作更新播放列表并下载缺失的地图;可能需要几分钟。",
"synchronize": "同步",
"curated": "推荐",
"verified-mapper": "已验证的制图者",
"empty-playlists": "空播放列表",
"search-playlist": "搜索播放列表",
"no-playlists-found": "未找到播放列表",
"error-occur-while-loading-playlists": "加载播放列表时发生错误",
"error-occur-while-loading-playlist": "加载播放列表时发生错误",
"loading-maps": "正在加载地图...",
"no-maps-found-for-playlist": "未找到此播放列表的地图",
"playlist-contain-no-maps": "播放列表不包含地图",
"no-map-installed-for-playlist": "此播放列表没有已安装的地图",
"playlist-is-waiting-to-download": "播放列表正在等待下载",
"download-maps": "下载地图",
"download-missing-maps": "下载缺失的地图",
"playlist-is-downloading": "播放列表正在下载",
"some-playlist-maps-are-missing": "此播放列表中的一些地图缺失",
"create-a-playlist": "创建播放列表",
"synchronize-playlists": "同步播放列表",
"export-playlists": "导出播放列表",
"delete-playlists": "删除播放列表",
"choose-image": "选择图片",
"title": "标题",
"playlist-title": "播放列表标题",
"description": "描述",
"playlist-description": "播放列表描述",
"author": "作者",
"playlist-author": "播放列表作者",
"save": "保存",
"loading": "加载中...",
"installed": "已安装",
"no-map-found": "未找到地图",
"edit-playlist-shortcuts": "按住 Shift 或 Ctrl 选择多个地图",
"add-to-playlist": "添加到播放列表",
"remove-from-playlist": "从播放列表中移除",
"playlist-is-empty": "播放列表为空",
"continue": "继续",
"nb-maps": "地图数量",
"nb-mappers": "制图者数量",
"duration": "持续时间",
"nps": "每秒音符数",
"date-picker": {
"start-date-end-date": "开始日期 — 结束日期",
"all": "全部",
"last-24h": "最近24小时",
"last-week": "上周",
"last-month": "上个月",
"3-last-month": "最近3个月"
},
"playlists-imported": "播放列表已导入",
"all-playlists-have-been-successfully-imported": "所有播放列表已成功导入",
"no-playlist-found": "未找到播放列表",
"no-playlist-found-in-selected-files": "在选定文件中未找到播放列表",
"some-playlists-not-imported": "部分播放列表未导入",
"some-playlists-have-been-imported": {
"INVALID_SOURCE": "某些播放列表未找到",
"INVALID_PLAYLIST_FILE": "某些播放列表无效",
"CANNOT_PARSE_PLAYLIST": "某些播放列表无法解析",
"unknown": "某些播放列表无法导入"
},
"no-playlists-imported": "未导入任何播放列表",
"no-playlists-imported-errors": {
"INVALID_SOURCE": "播放列表未找到",
"INVALID_PLAYLIST_FILE": "播放列表无效",
"CANNOT_PARSE_PLAYLIST": "播放列表无法解析",
"unknown": "无法导入任何播放列表"
}
},
"dateformat": {
"dayNames": ["周日", "周一", "周二", "周三", "周四", "周五", "周六", "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"],
"monthNames": ["1 月", "2 月", "3 月", "4 月", "5 月", "6 月", "7 月", "8 月", "9 月", "10 月", "11 月", "12 月", "一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"],
+127
View File
@@ -0,0 +1,127 @@
syntax = "proto3";
package song_details_cache_v1;
message SongDetailsCache {
repeated SongDetails songs = 1;
uint32 lastUpdated = 2;
uint32 total = 3;
UploadersList uploaders = 4;
repeated string difficultyLabels = 5;
}
message UploadersList {
repeated string names = 1;
repeated uint32 ids = 2;
}
message SongDetails {
uint32 idInt = 1;
repeated uint32 hashIndices = 2;
string name = 3;
uint32 duration = 4;
UploaderRef uploaderRef = 5;
uint32 uploadedAt = 6;
repeated MapTag tags = 7;
bool ranked = 8;
bool qualified = 9;
bool curated = 10;
bool blRanked = 11;
bool blQualified = 12;
uint32 upVotes = 13;
uint32 downVotes = 14;
uint32 downloads = 15;
bool automapper = 16;
repeated Difficulty difficulties = 17;
}
message Difficulty {
DifficultyLabel difficulty = 1;
DifficultyCharacteristic characteristic = 2;
uint32 labelIndex = 3;
uint32 starsT100 = 4;
uint32 starsBlT100 = 5;
uint32 njsT100 = 6;
uint32 npsT100 = 7;
int32 offsetT100 = 8;
bool chroma = 9;
bool cinema = 10;
bool me = 11;
bool ne = 12;
uint32 bombs = 13;
uint32 notes = 14;
uint32 obstacles = 15;
}
message UploaderRef {
uint32 uploader_ref_index = 1;
bool verified = 2;
}
enum DifficultyLabel {
UNKNOWN_LABEL = 0; // Default value for undefined/unknown labels
EASY = 1;
NORMAL = 2;
HARD = 3;
EXPERT = 4;
EXPERT_PLUS = 5;
}
enum DifficultyCharacteristic {
UNKNOWN_CHARACTERISTIC = 0; // Default value for undefined/unknown characteristics
STANDARD = 1;
ONE_SABER = 2;
NO_ARROWS = 3;
LAWLESS = 4;
LIGHTSHOW = 5;
LEGACY = 6;
NINETY_DEGREE = 7;
THREESIXTY_DEGREE = 8;
}
enum MapTag {
UNKNOWN_TAG = 0; // Default value for undefined/unknown tags
DANCE = 1;
SWING = 2;
NIGHTCORE = 3;
FOLK = 4;
FAMILY = 5;
AMBIENT = 6;
FUNK = 7;
JAZZ = 8;
SOUL = 9;
SPEEDCORE = 10;
PUNK = 11;
RB = 12;
HOLIDAY = 13;
VOCALOID = 14;
J_ROCK = 15;
TRANCE = 16;
DRUMBASS = 17;
COMEDY = 18;
INSTRUMENTAL = 19;
HARDCORE = 20;
K_POP = 21;
INDIE = 22;
TECHNO = 23;
HOUSE = 24;
GAME = 25;
FILM = 26;
ALT = 27;
DUBSTEP = 28;
METAL = 29;
ANIME = 30;
HIPHOP = 31;
J_POP = 32;
ROCK = 33;
POP = 34;
ELECTRONIC = 35;
CLASSICAL_ORCHESTRAL = 36;
ACCURACY = 37;
BALANCED = 38;
CHALLENGE = 39;
DANCESTYLE = 40;
FITNESS = 41;
SPEED = 42;
TECH = 43;
}
BIN
View File
Binary file not shown.
Binary file not shown.
@@ -1,192 +0,0 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v8.0/win-x64",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v8.0": {},
".NETCoreApp,Version=v8.0/win-x64": {
"DepotDownloader/2.7.3": {
"dependencies": {
"Microsoft.Windows.CsWin32": "0.3.106",
"SteamKit2": "3.0.0-Beta.4",
"protobuf-net": "3.2.30"
},
"runtime": {
"DepotDownloader.dll": {}
}
},
"Microsoft.NETCore.Platforms/5.0.0": {},
"Microsoft.Win32.Registry/5.0.0": {
"dependencies": {
"System.Security.AccessControl": "5.0.0",
"System.Security.Principal.Windows": "5.0.0"
}
},
"Microsoft.Windows.CsWin32/0.3.106": {
"dependencies": {
"Microsoft.Windows.SDK.Win32Docs": "0.1.42-alpha",
"Microsoft.Windows.SDK.Win32Metadata": "60.0.34-preview",
"Microsoft.Windows.WDK.Win32Metadata": "0.11.4-experimental"
}
},
"Microsoft.Windows.SDK.Win32Docs/0.1.42-alpha": {},
"Microsoft.Windows.SDK.Win32Metadata/60.0.34-preview": {},
"Microsoft.Windows.WDK.Win32Metadata/0.11.4-experimental": {
"dependencies": {
"Microsoft.Windows.SDK.Win32Metadata": "60.0.34-preview"
}
},
"protobuf-net/3.2.30": {
"dependencies": {
"protobuf-net.Core": "3.2.30"
},
"runtime": {
"lib/net6.0/protobuf-net.dll": {
"assemblyVersion": "3.0.0.0",
"fileVersion": "3.2.30.709"
}
}
},
"protobuf-net.Core/3.2.30": {
"dependencies": {
"System.Collections.Immutable": "7.0.0"
},
"runtime": {
"lib/net6.0/protobuf-net.Core.dll": {
"assemblyVersion": "3.0.0.0",
"fileVersion": "3.2.30.709"
}
}
},
"SteamKit2/3.0.0-Beta.4": {
"dependencies": {
"Microsoft.Win32.Registry": "5.0.0",
"System.IO.Hashing": "8.0.0",
"protobuf-net": "3.2.30"
},
"runtime": {
"lib/net8.0/SteamKit2.dll": {
"assemblyVersion": "3.0.0.0",
"fileVersion": "3.0.0.0"
}
}
},
"System.Collections.Immutable/7.0.0": {},
"System.IO.Hashing/8.0.0": {
"runtime": {
"lib/net8.0/System.IO.Hashing.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.23.53103"
}
}
},
"System.Security.AccessControl/5.0.0": {
"dependencies": {
"Microsoft.NETCore.Platforms": "5.0.0",
"System.Security.Principal.Windows": "5.0.0"
}
},
"System.Security.Principal.Windows/5.0.0": {}
}
},
"libraries": {
"DepotDownloader/2.7.3": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"Microsoft.NETCore.Platforms/5.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==",
"path": "microsoft.netcore.platforms/5.0.0",
"hashPath": "microsoft.netcore.platforms.5.0.0.nupkg.sha512"
},
"Microsoft.Win32.Registry/5.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==",
"path": "microsoft.win32.registry/5.0.0",
"hashPath": "microsoft.win32.registry.5.0.0.nupkg.sha512"
},
"Microsoft.Windows.CsWin32/0.3.106": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Mx5fK7uN6fwLR4wUghs6//HonAnwPBNmC2oonyJVhCUlHS/r6SUS3NkBc3+gaQiv+0/9bqdj1oSCKQFkNI+21Q==",
"path": "microsoft.windows.cswin32/0.3.106",
"hashPath": "microsoft.windows.cswin32.0.3.106.nupkg.sha512"
},
"Microsoft.Windows.SDK.Win32Docs/0.1.42-alpha": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Z/9po23gUA9aoukirh2ItMU2ZS9++Js9Gdds9fu5yuMojDrmArvY2y+tq9985tR3cxFxpZO1O35Wjfo0khj5HA==",
"path": "microsoft.windows.sdk.win32docs/0.1.42-alpha",
"hashPath": "microsoft.windows.sdk.win32docs.0.1.42-alpha.nupkg.sha512"
},
"Microsoft.Windows.SDK.Win32Metadata/60.0.34-preview": {
"type": "package",
"serviceable": true,
"sha512": "sha512-TA3DUNi4CTeo+ItTXBnGZFt2159XOGSl0UOlG5vjDj4WHqZjhwYyyUnzOtrbCERiSaP2Hzg7otJNWwOSZgutyA==",
"path": "microsoft.windows.sdk.win32metadata/60.0.34-preview",
"hashPath": "microsoft.windows.sdk.win32metadata.60.0.34-preview.nupkg.sha512"
},
"Microsoft.Windows.WDK.Win32Metadata/0.11.4-experimental": {
"type": "package",
"serviceable": true,
"sha512": "sha512-bf5MCmUyZf0gBlYQjx9UpRAZWBkRndyt9XicR+UNLvAUAFTZQbu6YaX/sNKZlR98Grn0gydfh/yT4I3vc0AIQA==",
"path": "microsoft.windows.wdk.win32metadata/0.11.4-experimental",
"hashPath": "microsoft.windows.wdk.win32metadata.0.11.4-experimental.nupkg.sha512"
},
"protobuf-net/3.2.30": {
"type": "package",
"serviceable": true,
"sha512": "sha512-C/UTlmxEJHAHpqm8xQK1UyJKaIynVCSNG4mVrbLgnZ7ccH28nN49O8iMJvKEodTgVbnimvy+3mIiAdW6mATwnw==",
"path": "protobuf-net/3.2.30",
"hashPath": "protobuf-net.3.2.30.nupkg.sha512"
},
"protobuf-net.Core/3.2.30": {
"type": "package",
"serviceable": true,
"sha512": "sha512-v2ZxxYrz+X212ukSx+uqkLuPu414bvmSAnTyf+PBUKR9ENJxO4P/csorA/27456MCp1JNoMssDj/f91RDiwBfQ==",
"path": "protobuf-net.core/3.2.30",
"hashPath": "protobuf-net.core.3.2.30.nupkg.sha512"
},
"SteamKit2/3.0.0-Beta.4": {
"type": "package",
"serviceable": true,
"sha512": "sha512-gDLccGTbvg5RzqQE75uqL3z2Z0F8MTOnier97DdbBGi9F6DDbZQvquHf0INOAEyN7S5Ku+CgaKnkm409UD7avA==",
"path": "steamkit2/3.0.0-beta.4",
"hashPath": "steamkit2.3.0.0-beta.4.nupkg.sha512"
},
"System.Collections.Immutable/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-dQPcs0U1IKnBdRDBkrCTi1FoajSTBzLcVTpjO4MBCMC7f4pDOIPzgBoX8JjG7X6uZRJ8EBxsi8+DR1JuwjnzOQ==",
"path": "system.collections.immutable/7.0.0",
"hashPath": "system.collections.immutable.7.0.0.nupkg.sha512"
},
"System.IO.Hashing/8.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ne1843evDugl0md7Fjzy6QjJrzsjh46ZKbhf8GwBXb5f/gw97J4bxMs0NQKifDuThh/f0bZ0e62NPl1jzTuRqA==",
"path": "system.io.hashing/8.0.0",
"hashPath": "system.io.hashing.8.0.0.nupkg.sha512"
},
"System.Security.AccessControl/5.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==",
"path": "system.security.accesscontrol/5.0.0",
"hashPath": "system.security.accesscontrol.5.0.0.nupkg.sha512"
},
"System.Security.Principal.Windows/5.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==",
"path": "system.security.principal.windows/5.0.0",
"hashPath": "system.security.principal.windows.5.0.0.nupkg.sha512"
}
}
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,14 +0,0 @@
{
"runtimeOptions": {
"tfm": "net8.0",
"rollForward": "LatestMajor",
"framework": {
"name": "Microsoft.NETCore.App",
"version": "8.0.0"
},
"configProperties": {
"System.Reflection.Metadata.MetadataUpdater.IsSupported": false,
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
}
}
}
-339
View File
@@ -1,339 +0,0 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+6
View File
@@ -0,0 +1,6 @@
# Add write permissions to anybody so that this can be sync with the
# github's bs-versions.json when starting bsmanager
/usr/bin/chmod +002 /opt/BSManager/resources/assets/jsons/bs-versions.json
# https://github.com/electron/electron/issues/42510
/usr/bin/chmod 4755 /opt/BSManager/chrome-sandbox
Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 945 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Before

Width:  |  Height:  |  Size: 442 KiB

After

Width:  |  Height:  |  Size: 442 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

@@ -0,0 +1,21 @@
If you encounter a keyboard shortcut conflict between AMD Software and Oculus Rift, you can either disable or modify the conflicting shortcut.
_Special thanks to_ `𝔽𝕪𝕟𝕟 (fynn07)` _for its contribution with information and screenshots_
### __Follow these steps to disable the shortcut in AMD Software:__
# Step 1 - Access Settings:
- Open AMD Software and click on the gear icon in the top right corner to go to settings.
![image](https://github.com/Zagrios/bs-manager/assets/40648115/2762f59c-f12a-46ba-80fa-9bf79beb64a9)
# Step 2 - Modify Keyboard Shortcuts:
- In the settings menu, select the "Hotkey" tab.
![image](https://github.com/Zagrios/bs-manager/assets/40648115/262d4fcc-529f-4c4c-9b87-e2da21df1b95)
# Step 3 -Disabling Shortcuts:
- Turn off the "Use Hotkeys" option to prevent any conflicts with Oculus Rift.
![image](https://github.com/Zagrios/bs-manager/assets/40648115/756018ad-7de3-469c-9f40-0082be007805)
# Step 3 alt - Modify the Shortcut:
- If you prefer to keep using keyboard shortcuts, consider changing the specific conflicting shortcut (e.g., "Ctrl + Shift + I") to another combination that is less likely to interfere.
_**Keep in mind you can't change the full keybind!**_
_**You can only Change the "i" to an different Button!**_
-11
View File
@@ -1,11 +0,0 @@
Enabling Oculus sideloading allows games located outside if your Oculus library to be played on your Oculus Quest.
- **Step 1:** Start the regedit application by pressing `Win + R` and typing `regedit` in the dialog box.
- **Step 2:** Navigate to `HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Oculus VR, LLC\Oculus`.
- **Step 3:** Right-click on the right panel and select `New > DWORD (32-bit) Value`.
- **Step 4:** Name the new value `AllowDevSideloaded` and set the value to `1`.
You should end up with something like this:
![image](https://raw.githubusercontent.com/Zagrios/bs-manager/refs/heads/master/docs/assets/enable-oculus-sideloading.png)
After completing these steps, you should be able to start Beat Saber from BSManager and play it on your Oculus Quest. If you are still having issues, please join our [Discord](https://discord.gg/uSqbHVpKdV) server for further assistance.
+14
View File
@@ -0,0 +1,14 @@
Welcome to the bs-manager wiki! (wip c:)
to get you oculus token check here : https://github.com/Zagrios/bs-manager/wiki/How-to-obtain-your-Oculus-Token
---
This Wiki accepts contributions!
To contribute to the wiki:
- Fork the project
- Add/Edit `.md` files in the `docs/wiki/` folder
- Create a Pull Request
- Once the PR is merged (after review), it will be present in the repository's wiki
@@ -0,0 +1,30 @@
### Important
Your token is a confidential piece of information. Possession of this token allows individuals to download applications, send messages, among other actions, under your identity.
However, you might wonder why it is necessary to provide this token to BSManager. The reason is that BSManager requires the token to continue the download with Oculus. Once you've input the token, it is used exclusively to communicate with Oculus servers to verify that you are the rightful owner of the game.
## Step 1 - Install and log into the Oculus Rift app
- Get the Oculus Rift app setup from the [Meta website](https://www.oculus.com/rift/setup/)
- Install the Oculus Rift app
**If you bought Beat Saber from the Quest store, it won't appear in your Rift library by default. To download it with BSManager, first claim it from its store page**
## Step 2 - Open developer tools
- Open Oculus app
- Open the developer tools by pressing <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>i</kbd>.
## Step 3 - Copy your Token
In the developer tools :
- Open the `Network` tab ***(1)***
- Filter for `graph` ***(2)***
- Click on the first request ***(3)***
- Open the `Headers` tab ***(4)***
- Scroll to the bottom to locate your token, it should start with `FRL` ***(5)***
- Select the token using your mouse and press <kbd>Ctrl</kbd> + <kbd>c</kbd> to copy it
![image](https://github.com/Zagrios/bs-manager/assets/40181755/b46be623-cefe-4349-bace-70a4109685a3)
# Known bugs
- [Nothing opens when I press `Ctrl`+`Shift`+`i`.](https://github.com/Zagrios/bs-manager/wiki/Nothing-opens-when-I-press-%60Ctrl%60%E2%80%90%60Shift%60%E2%80%90%60i%60.)
+86
View File
@@ -0,0 +1,86 @@
# Linux Guide
## Installation
Go to [Releases](https://github.com/Zagrios/bs-manager/releases) page and go to the latest release. Download the necessary build installer for your distro (see below).
### Ubuntu, Debian (deb)
Download the `.deb` file in the releases and run the following command:
```bash
dpkg -i ./bsmanager.deb
```
### Arch (AUR)
Refer to [bs-manager-git](https://aur.archlinux.org/packages/bs-manager-git).
To install AUR packages, you need to install [yay](https://github.com/Jguer/yay).
### Universal (flatpak)
This should work on any linux distribution. You are only required to have `flatpak` installed in your system. If it is not installed, then go to [flatpak](https://flatpak.org/setup/) to look for a guide on how to install it on your distro.
After installing, download the `.flatpak` file in the releases and run the following command:
```bash
flatpak install --user ./bsmanager.flatpak
```
If you are getting errors like packages not existing, run the command below so that it finds the correct packages.
```bash
sudo flatpak remote-add --if-not-exists --system flathub https://flathub.org/repo/flathub.flatpakrepo
# or
flatpak remote-add --if-not-exists --user flathub https://flathub.org/repo/flathub.flatpakrepo
```
Flatpak also supports sandboxing which gives the minimal access to your machine. To configure this, you can download [Flatseal](https://flathub.org/apps/com.github.tchx84.Flatseal) which has a GUI to edit your permissions. You can also this with the `flatpak` executable but it will not be discussed here.
## Proton Setup
[Proton](https://github.com/ValveSoftware/Proton) is needed to run the Beat Saber executable under Linux. You need to download this from either from Steam or building it from their GitHub repo.
Once Proton is installed, when you open your BSManager application for the first time, it will ask you to link the _Proton Folder_. The _Proton Folder_ also verifies if the `proton` and `files/bin/wine64` binaries exists. Once set, you should be able to launch the Beat Saber (using `proton`) and install mods (using `files/bin/wine64`). You can still change the _Proton Folder_ in the **settings page** if any new version of Steam Proton is downloaded.
# Troubleshooting
## Permission denied on "bs-versions.json"
<pre>
Unhandled Exception UnhandledRejection Error: EACCES: permission denied, open '/opt/BSManager/resources/assets/jsons/bs-versions.json'
</pre>
To fix this issue, the current user must have write permissions to the "bs-versions.json". To correct the permissions do command below:
```bash
chmod +002 /opt/BSManager/resources/assets/jsons/bs-versions.json
# or
chown $(whoami) /opt/BSManager/resources/assets/jsons/bs-versions.json
```
## [deb] The SUID sandbox helper binary was found.
This is encountered when running the app file or executing the app in the terminal. This is due to a change to Ubuntu 24.04. In order to fix the issue, take a look into the path of "chrome-sandbox" described in the error log and give the correct permissions within the terminal, for example:
```bash
chmod 4755 /opt/BSManager/chrome-sandbox
```
ref: https://github.com/electron/electron/issues/42510
## [Flatpak] Steam Beat Saber version not showing / Proton not detected
Flatpak should have permissions with the steam games folder. By default, the minimum permissions are `~/.steam/steam/steamapps/common:ro` and `~/.steam/steam/steamapps/common:ro`. If you changed the steam installation path, add that path instead into the permissions.
## [Flatpak] Changing installation folder
To change the installation path of the **BSManager** folder, you have to edit the flatpak permissions to destination folder.
- In flatpak or Flatseal, add the destination folder with `:create` permissions.
- In BSM, move the folder to the destination folder.
- [Optional] In flatpak or Flatseal, remove the original folder permissions.
@@ -0,0 +1,4 @@
If nothing opens when you press `Ctrl` + `Shift` + `I`, it's possible that the keyboard shortcut to open the development tools is being used by another application.

Here's a non-exhaustive list of applications that have caused a problem and their suggested solutions:
- [AMD software](https://github.com/Zagrios/bs-manager/wiki/AMD-Sofware-%E2%80%90-Nothing-opens-when-I-press-%60Ctrl%60%E2%80%90%60Shift%60%E2%80%90%60I%60)
+94
View File
@@ -0,0 +1,94 @@
const config = {
extraResources: [
"./assets/jsons/bs-versions.json",
"./assets/jsons/patreons.json",
"./assets/proto/song_details_cache_v1.proto"
],
productName: "BSManager",
appId: "io.bsmanager.bsmanager",
asarUnpack: "**\\*.{node,dll}",
files: [
"dist/**/*",
"node_modules",
"package.json"
],
afterSign: ".erb/scripts/notarize.js",
afterPack: ".erb/scripts/after-pack.js",
win: {
signingHashAlgorithms: ["sha256"],
target: [
"nsis",
"nsis-web"
],
icon: "./build/icons/win/favicon.ico",
extraResources: [
"./build/icons/win",
"./assets/scripts/*.exe"
],
},
linux: {
target: [
"deb",
],
icon: "./build/icons/png",
category: "Utility;Game;",
extraResources: [
"./build/icons/png",
"./assets/scripts/DepotDownloader"
],
protocols: {
name: "BSManager",
schemes: [
"bsmanager",
"beatsaver",
"bsplaylist",
"modelsaber",
"web+bsmap",
],
},
},
deb: {
fpm: ["--after-install=build/after-install.sh"],
},
flatpak: {
finishArgs: [
// Wayland/X11 Rendering
"--socket=wayland",
"--socket=x11",
"--share=ipc",
// Open GL
"--device=dri",
// Audio output
"--socket=pulseaudio",
// Read/write home directory access
"--filesystem=~/BSManager:create", // Default BSManager installation folder
"--filesystem=~/.steam/steam/steamapps:ro", // for the libraryfolders.vdf
"--filesystem=~/.steam/steam/steamapps/common:ro", // Steam game folder
"--filesystem=~/.steam/steam/steamapps/common/Beat Saber:create", // For installing mods/maps to original Beat Saber version
// Allow communication with network
"--share=network",
// System notifications with libnotify
"--talk-name=org.freedesktop.Notifications",
"--talk-name=org.freedesktop.Flatpak",
]
},
directories: {
app: "release/app",
buildResources: "assets",
output: "release/build",
},
publish: {
provider: "github",
owner: "Zagrios",
},
fileAssociations: [
{
ext: "bplist",
description: "Beat Saber Playlist (BSManager)",
icon: "./assets/bsm_file.ico",
role: "Viewer",
},
],
};
module.exports = config;
@@ -1,2 +0,0 @@
[target.x86_64-pc-windows-msvc]
rustflags = ["-C", "target-feature=+crt-static"]
-166
View File
@@ -1,166 +0,0 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "cfg-if"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "oculus-allow-dev-sideloaded"
version = "0.1.0"
dependencies = [
"winreg",
"winres",
]
[[package]]
name = "proc-macro2"
version = "1.0.92"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.38"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc"
dependencies = [
"proc-macro2",
]
[[package]]
name = "serde"
version = "1.0.217"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.217"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "syn"
version = "2.0.93"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c786062daee0d6db1132800e623df74274a0a87322d8e183338e01b3d98d058"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "toml"
version = "0.5.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234"
dependencies = [
"serde",
]
[[package]]
name = "unicode-ident"
version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
[[package]]
name = "windows-sys"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
dependencies = [
"windows-targets",
]
[[package]]
name = "windows-targets"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
dependencies = [
"windows_aarch64_gnullvm",
"windows_aarch64_msvc",
"windows_i686_gnu",
"windows_i686_msvc",
"windows_x86_64_gnu",
"windows_x86_64_gnullvm",
"windows_x86_64_msvc",
]
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
[[package]]
name = "windows_aarch64_msvc"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
[[package]]
name = "windows_i686_gnu"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
[[package]]
name = "windows_i686_msvc"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
[[package]]
name = "windows_x86_64_gnu"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
[[package]]
name = "windows_x86_64_msvc"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
[[package]]
name = "winreg"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5"
dependencies = [
"cfg-if",
"windows-sys",
]
[[package]]
name = "winres"
version = "0.1.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b68db261ef59e9e52806f688020631e987592bd83619edccda9c47d42cde4f6c"
dependencies = [
"toml",
]
-20
View File
@@ -1,20 +0,0 @@
extern crate winres;
fn main() {
if cfg!(target_os = "windows") {
let mut res = winres::WindowsResource::new();
res.set_manifest(r#"
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
"#);
res.set_icon("./icon.ico");
res.compile().unwrap();
}
}
-22
View File
@@ -1,22 +0,0 @@
use winreg::enums::HKEY_LOCAL_MACHINE;
use winreg::RegKey;
const PATH: &str = "SOFTWARE\\Wow6432Node\\Oculus VR, LLC\\Oculus";
fn main() {
let hklm = RegKey::predef(HKEY_LOCAL_MACHINE);
// Create (or open if it already exists) the subkey
let (key, _) = match hklm.create_subkey(PATH) {
Ok(res) => res,
Err(err) => return println!("{}", err.to_string()),
};
let res = key.set_value("AllowDevSideloaded", &1u32);
if let Err(err) = res {
return println!("{}", err.to_string());
}
println!("AllowDevSideloaded = 1 has been successfully set in {PATH}");
}
+2
View File
@@ -0,0 +1,2 @@
[target.x86_64-pc-windows-msvc]
rustflags = ["-C", "target-feature=+crt-static"]
+281
View File
@@ -0,0 +1,281 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "cfg-if"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "core-foundation-sys"
version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"
[[package]]
name = "crossbeam-deque"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d"
dependencies = [
"crossbeam-epoch",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-epoch"
version = "0.9.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
dependencies = [
"crossbeam-utils",
]
[[package]]
name = "crossbeam-utils"
version = "0.8.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345"
[[package]]
name = "either"
version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a"
[[package]]
name = "libc"
version = "0.2.153"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd"
[[package]]
name = "ntapi"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4"
dependencies = [
"winapi",
]
[[package]]
name = "oculus_symlink_cleaner"
version = "0.1.0"
dependencies = [
"sysinfo",
"winres",
]
[[package]]
name = "once_cell"
version = "1.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
[[package]]
name = "proc-macro2"
version = "1.0.78"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef"
dependencies = [
"proc-macro2",
]
[[package]]
name = "rayon"
version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e4963ed1bc86e4f3ee217022bd855b297cef07fb9eac5dfa1f788b220b49b3bd"
dependencies = [
"either",
"rayon-core",
]
[[package]]
name = "rayon-core"
version = "1.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2"
dependencies = [
"crossbeam-deque",
"crossbeam-utils",
]
[[package]]
name = "serde"
version = "1.0.197"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.197"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "syn"
version = "2.0.52"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "sysinfo"
version = "0.30.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6746919caf9f2a85bff759535664c060109f21975c5ac2e8652e60102bd4d196"
dependencies = [
"cfg-if",
"core-foundation-sys",
"libc",
"ntapi",
"once_cell",
"rayon",
"windows",
]
[[package]]
name = "toml"
version = "0.5.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234"
dependencies = [
"serde",
]
[[package]]
name = "unicode-ident"
version = "1.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
[[package]]
name = "winapi"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
dependencies = [
"winapi-i686-pc-windows-gnu",
"winapi-x86_64-pc-windows-gnu",
]
[[package]]
name = "winapi-i686-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
[[package]]
name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "windows"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be"
dependencies = [
"windows-core",
"windows-targets",
]
[[package]]
name = "windows-core"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
dependencies = [
"windows-targets",
]
[[package]]
name = "windows-targets"
version = "0.52.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b"
dependencies = [
"windows_aarch64_gnullvm",
"windows_aarch64_msvc",
"windows_i686_gnu",
"windows_i686_msvc",
"windows_x86_64_gnu",
"windows_x86_64_gnullvm",
"windows_x86_64_msvc",
]
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.52.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9"
[[package]]
name = "windows_aarch64_msvc"
version = "0.52.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675"
[[package]]
name = "windows_i686_gnu"
version = "0.52.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3"
[[package]]
name = "windows_i686_msvc"
version = "0.52.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02"
[[package]]
name = "windows_x86_64_gnu"
version = "0.52.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.52.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177"
[[package]]
name = "windows_x86_64_msvc"
version = "0.52.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8"
[[package]]
name = "winres"
version = "0.1.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b68db261ef59e9e52806f688020631e987592bd83619edccda9c47d42cde4f6c"
dependencies = [
"toml",
]
@@ -1,20 +1,22 @@
[package]
name = "oculus-allow-dev-sideloaded"
name = "oculus_symlink_cleaner"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[build-dependencies]
winres = "0.1.12"
[dependencies]
winreg = "0.52.0"
[package.metadata.winres]
FileDescription = "Enable Sideloaded Apps"
LegalCopyright = "Copyright © 2024 Zagrios"
CompanyName = "Zagrios"
sysinfo = "0.30.6"
[profile.release]
codegen-units = 1
lto = true
opt-level = "z"
[package.metadata.winres]
FileDescription = "Clean Oculus Symlink after Beat Saber ends"
LegalCopyright = "Copyright © 2024 Zagrios"
CompanyName = "Zagrios"
+9
View File
@@ -0,0 +1,9 @@
extern crate winres;
fn main() {
if cfg!(target_os = "windows") {
let mut res = winres::WindowsResource::new();
res.set_icon("./icon.ico");
res.compile().unwrap();
}
}

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 67 KiB

+78
View File
@@ -0,0 +1,78 @@
use sysinfo::{Pid, ProcessRefreshKind, System};
use std::{env, thread, time::Duration, fs};
use std::ffi::OsStr;
use std::path::Path;
use std::str::FromStr;
const BEAT_SABER_OCULUS_FOLDER_NAME: &str = "hyperbolic-magnetism-beat-saber";
fn main() {
let args: Vec<String> = env::args().collect();
if args.len() != 3 {
eprintln!("Usage: {} <pid> <path_to_directory>", args[0]);
std::process::exit(1);
}
let pid: Pid = Pid::from_str(&args[1]).expect("Invalid pid");
let directory_path = Path::new(&args[2]);
if directory_path.file_name() != Some(OsStr::new(BEAT_SABER_OCULUS_FOLDER_NAME)) {
eprintln!("Directory name is not {}", BEAT_SABER_OCULUS_FOLDER_NAME);
std::process::exit(1);
}
// we want to monitor only processes
let mut system = System::new_with_specifics(sysinfo::RefreshKind::new().with_processes(ProcessRefreshKind::everything()));
loop {
system.refresh_processes();
let process = system.process(pid);
match process {
Some(_) => {
println!("Process {} is still running.", pid);
thread::sleep(Duration::from_secs(2));
},
None => {
println!("Process {} has stopped, deleting directory {:?}", pid, directory_path);
match delete_dir_if_is_symlink(directory_path) {
Ok(_) => {
println!("Directory {:?} deleted successfully.", directory_path);
if let Err(e) = rename_specific_backup_directory(directory_path.parent().unwrap()) {
eprintln!("Failed to rename backup directory: {}", e);
}
},
Err(e) => eprintln!("Failed to delete directory {:?}: {}", directory_path, e),
}
break;
}
}
}
}
fn delete_dir_if_is_symlink(path: &Path) -> Result<(), Box<dyn std::error::Error>>{
match path.symlink_metadata()?.file_type().is_symlink() {
true => {
fs::remove_dir_all(path)?;
Ok(())
},
false => {
eprintln!("Path {:?} is not a symlink.", path);
Err("Path is not a symlink.".into())
}
}
}
fn rename_specific_backup_directory(parent_path: &Path) -> Result<(), Box<dyn std::error::Error>> {
let backup_dir_name = format!("{}.bsmbak", BEAT_SABER_OCULUS_FOLDER_NAME);
let backup_path = parent_path.join(&backup_dir_name);
if backup_path.exists() && backup_path.is_dir() {
let new_path = parent_path.join(BEAT_SABER_OCULUS_FOLDER_NAME);
fs::rename(&backup_path, &new_path)?;
println!("Renamed {:?} to {:?}", backup_path, new_path);
Ok(())
} else {
Err(format!("Backup directory {:?} does not exist or is not a directory.", backup_path).into())
}
}
+7907 -24910
View File
File diff suppressed because it is too large Load Diff
+92 -146
View File
@@ -1,21 +1,27 @@
{
"name": "bs-manager",
"description": "Manage maps, mods and more for Beat Saber",
"main": "./.erb/dll/main.bundle.dev.js",
"version": "1.5.0-alpha.5",
"scripts": {
"build-rust-scripts": "ts-node ./.erb/scripts/build-rust-scripts.js",
"build": "concurrently \"npm run build:main\" \"npm run build:renderer\"",
"build:main": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.main.prod.ts",
"build:renderer": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.renderer.prod.ts",
"build:dll": "cross-env NODE_ENV=development webpack --config ./.erb/configs/webpack.config.renderer.dev.dll.ts",
"build:main": "cross-env NODE_ENV=production webpack --config ./.erb/configs/webpack.config.main.prod.ts",
"build:renderer": "cross-env NODE_ENV=production webpack --config ./.erb/configs/webpack.config.renderer.prod.ts",
"postinstall": "ts-node .erb/scripts/check-native-dep.js && electron-builder install-app-deps && npm run build:dll",
"rebuild": "electron-rebuild --parallel --types prod,dev,optional --module-dir release/app",
"prestart": "cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.main.dev.ts",
"lint": "cross-env NODE_ENV=development eslint . --ext .js,.jsx,.ts,.tsx",
"package": "ts-node ./.erb/scripts/clean.js dist && npm run build && electron-builder build --publish never",
"postinstall": "ts-node .erb/scripts/check-native-dep.js && electron-builder install-app-deps && cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.renderer.dev.dll.ts && opencollective-postinstall",
"start": "ts-node ./.erb/scripts/check-port-in-use.js && npm run start:renderer",
"start:main": "cross-env NODE_ENV=development electronmon -r ts-node/register/transpile-only ./src/main/main.ts",
"package": "ts-node ./.erb/scripts/clean.js dist && npm run build && electron-builder build --publish never --config electron-builder.config.js && npm run build:dll",
"start": "ts-node ./.erb/scripts/check-port-in-use.js && npm run prestart && npm run start:renderer",
"start:main": "concurrently -k \"cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack --watch --config ./.erb/configs/webpack.config.main.dev.ts\" \"electronmon .\"",
"start:preload": "cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.preload.dev.ts",
"start:renderer": "cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack serve --config ./.erb/configs/webpack.config.renderer.dev.ts",
"test": "jest",
"test:unit": "jest ./src/__tests__/unit",
"publish": "npm run build && electron-builder -c.win.certificateSha1=206941d969c4fa8a0e04d9427def361e13b02fd0 --publish always --win --x64"
"publish": "npm run build && electron-builder -c.win.certificateSha1=206941d969c4fa8a0e04d9427def361e13b02fd0 --config electron-builder.config.js --publish always --win --x64",
"publish:linux": "npm run build && electron-builder --config electron-builder.config.js --publish never --linux --x64"
},
"lint-staged": {
"*.{js,jsx,ts,tsx}": [
@@ -32,74 +38,10 @@
]
},
"build": {
"extraResources": [
"./assets/favicon.ico",
"./assets/jsons/bs-versions.json",
"./assets/jsons/patreons.json",
"./assets/scripts/**"
],
"productName": "BSManager",
"appId": "org.erb.BSManager",
"asarUnpack": "**\\*.{node,dll}",
"files": [
"dist/**/*",
"node_modules",
"package.json"
],
"afterSign": ".erb/scripts/notarize.js",
"afterPack": ".erb/scripts/after-pack.js",
"mac": {
"target": {
"target": "default",
"arch": [
"arm64",
"x64"
]
},
"type": "distribution",
"hardenedRuntime": true,
"entitlements": "assets/entitlements.mac.plist",
"entitlementsInherit": "assets/entitlements.mac.plist",
"gatekeeperAssess": false
},
"dmg": {
"contents": [
{
"x": 130,
"y": 220
},
{
"x": 410,
"y": 220,
"type": "link",
"path": "/Applications"
}
]
},
"win": {
"signingHashAlgorithms": [
"sha256"
],
"target": [
"nsis",
"nsis-web"
],
"icon": "assets/favicon.ico"
},
"linux": {
"target": [
"AppImage"
],
"category": "Development"
},
"directories": {
"app": "release/app",
"buildResources": "assets",
"output": "release/build"
},
"publish": {
"provider": "github",
"owner": "Zagrios"
}
},
"repository": {
@@ -124,97 +66,98 @@
],
"homepage": "https://github.com/Zagrios/bs-manager#readme",
"devDependencies": {
"@electron/rebuild": "^3.2.13",
"@electron/fuses": "^1.7.0",
"@electron/notarize": "^2.3.0",
"@electron/rebuild": "^3.6.0",
"@pmmmwh/react-refresh-webpack-plugin": "0.5.5",
"@teamsupercell/typings-for-css-modules-loader": "^2.5.1",
"@teamsupercell/typings-for-css-modules-loader": "^2.5.2",
"@testing-library/jest-dom": "^6.4.1",
"@testing-library/react": "^13.3.0",
"@types/archiver": "^5.3.1",
"@testing-library/react": "^14.2.0",
"@types/archiver": "^6.0.2",
"@types/color": "^3.0.3",
"@types/crypto-js": "^4.2.1",
"@types/dateformat": "^5.0.0",
"@types/got": "^9.6.12",
"@types/jest": "^29.5.11",
"@types/node": "^20",
"@types/node": "22.8.6",
"@types/node-fetch": "^2.6.3",
"@types/pako": "^2.0.1",
"@types/react": "^18.0.33",
"@types/react-beautiful-dnd": "^13.1.8",
"@types/react-dom": "^18.0.11",
"@types/react-outside-click-handler": "^1.3.1",
"@types/react-test-renderer": "^17.0.2",
"@types/react-test-renderer": "^18.0.7",
"@types/react-virtualized-auto-sizer": "^1.0.1",
"@types/react-window": "^1.8.5",
"@types/recursive-readdir": "^2.2.1",
"@types/terser-webpack-plugin": "^5.0.4",
"@types/to-ico": "^1.1.1",
"@types/use-double-click": "^1.0.1",
"@types/use-double-click": "^1.0.4",
"@types/webpack-bundle-analyzer": "^4.4.2",
"@types/webpack-env": "^1.18.0",
"@typescript-eslint/eslint-plugin": "^5.34.0",
"@typescript-eslint/parser": "^5.34.0",
"autoprefixer": "^10.4.8",
"@typescript-eslint/eslint-plugin": "^6.20.0",
"@typescript-eslint/parser": "^6.20.0",
"autoprefixer": "^10.4.17",
"browserslist-config-erb": "^0.0.3",
"chalk": "^4.1.2",
"concurrently": "^7.2.2",
"core-js": "^3.24.1",
"concurrently": "^8.2.2",
"core-js": "^3.36.0",
"cross-env": "^7.0.3",
"css-loader": "^6.7.1",
"css-minimizer-webpack-plugin": "^4.1.0",
"detect-port": "^1.3.0",
"electron": "^27.1.3",
"electron-builder": "^24.9.1",
"css-loader": "^6.10.0",
"css-minimizer-webpack-plugin": "^6.0.0",
"detect-port": "^1.5.1",
"electron": "^32.1.2",
"electron-builder": "^24.13.3",
"electron-devtools-installer": "^3.2.0",
"electron-notarize": "^1.2.1",
"electronmon": "^2.0.2",
"eslint": "^8.22.0",
"eslint": "^8.56.0",
"eslint-config-airbnb-base": "^15.0.0",
"eslint-config-erb": "^4.0.3",
"eslint-import-resolver-typescript": "^2.7.1",
"eslint-import-resolver-webpack": "^0.13.2",
"eslint-plugin-compat": "^4.0.2",
"eslint-plugin-import": "^2.25.4",
"eslint-config-erb": "^4.1.0",
"eslint-import-resolver-typescript": "^3.6.1",
"eslint-import-resolver-webpack": "^0.13.8",
"eslint-plugin-compat": "^4.2.0",
"eslint-plugin-import": "^2.29.1",
"eslint-plugin-jest": "^27.6.3",
"eslint-plugin-jsx-a11y": "^6.6.1",
"eslint-plugin-promise": "^6.0.0",
"eslint-plugin-react": "^7.30.0",
"eslint-plugin-jsx-a11y": "^6.8.0",
"eslint-plugin-promise": "^6.1.1",
"eslint-plugin-react": "^7.33.2",
"eslint-plugin-react-hooks": "^4.6.0",
"file-loader": "^6.2.0",
"html-webpack-plugin": "^5.5.0",
"html-webpack-plugin": "^5.6.0",
"identity-obj-proxy": "^3.0.0",
"jest": "^29.7.0",
"lint-staged": "^12.5.0",
"mini-css-extract-plugin": "^2.6.1",
"lint-staged": "^15.2.1",
"mini-css-extract-plugin": "^2.7.7",
"opencollective-postinstall": "^2.0.3",
"postcss": "^8.4.16",
"postcss-loader": "^6.2.1",
"prettier": "^2.7.1",
"ps-scrollbar-tailwind": "0.0.1",
"react-refresh": "^0.12.0",
"react-refresh-typescript": "^2.0.7",
"postcss": "^8.4.33",
"postcss-loader": "^8.1.0",
"prettier": "^3.2.4",
"react-refresh": "^0.14.0",
"react-test-renderer": "^18.2.0",
"rimraf": "^3.0.2",
"sass": "^1.54.5",
"sass-loader": "^12.6.0",
"style-loader": "^3.3.1",
"tailwind-scrollbar": "^2.0.1",
"tailwindcss": "^3.4.15",
"terser-webpack-plugin": "^5.3.5",
"rimraf": "^5.0.5",
"sass": "^1.70.0",
"sass-loader": "^14.1.0",
"style-loader": "^3.3.4",
"tailwindcss": "^3.4.12",
"terser-webpack-plugin": "^5.3.10",
"ts-jest": "^29.1.2",
"ts-loader": "^9.3.0",
"ts-node": "^10.8.2",
"typescript": "^4.7.4",
"ts-loader": "^9.5.1",
"typescript": "^5.3.3",
"url-loader": "^4.1.1",
"webpack": "^5.74.0",
"webpack-bundle-analyzer": "^4.6.1",
"webpack-cli": "^4.10.0",
"webpack-dev-server": "^4.10.0",
"webpack-merge": "^5.8.0"
"webpack": "^5.90.3",
"webpack-bundle-analyzer": "^4.10.1",
"webpack-cli": "^5.1.4",
"webpack-dev-server": "^4.15.1",
"webpack-merge": "^5.10.0"
},
"dependencies": {
"@electron/fuses": "^1.6.2",
"@internationalized/date": "^3.5.4",
"@nextui-org/date-picker": "^2.0.7",
"@nextui-org/react": "^2.3.6",
"@node-steam/vdf": "^2.2.0",
"@tippyjs/react": "^4.2.6",
"@nextui-org/react": "^2.3.6",
"archiver": "^6.0.1",
"archiver": "^7.0.1",
"clsx": "^2.1.1",
"color": "^4.2.3",
"crypto-js": "^4.2.0",
"dateformat": "^5.0.3",
@@ -222,33 +165,37 @@
"electron-debug": "^3.2.0",
"electron-log": "^4.4.8",
"electron-store": "^8.1.0",
"electron-updater": "^6.1.7",
"electron-updater": "^6.3.4",
"fast-deep-equal": "^3.1.3",
"format-duration": "^3.0.2",
"framer-motion": "^11.2.6",
"fs-extra": "^11.2.0",
"got": "^14.4.4",
"history": "^5.3.0",
"is-elevated": "^3.0.0",
"is-elevated": "^4.0.0",
"md5-file": "^5.0.0",
"node-abi": "^3.65.0",
"node-fetch": "^2.6.7",
"node-fetch": "^3.3.2",
"pako": "^2.1.0",
"ps-list": "^7.2.0",
"qrcode.react": "^3.1.0",
"protobufjs": "^7.4.0",
"qrcode.react": "^4.0.1",
"query-process": "^0.0.3",
"react": "^18.2.0",
"react-beautiful-dnd": "^13.1.1",
"react-colorful": "^5.6.1",
"react-dom": "^18.2.0",
"react-range": "^1.8.14",
"react-router-dom": "^6.3.0",
"react-virtualized-auto-sizer": "^1.0.12",
"react-window": "^1.8.8",
"react-range": "^1.10.0",
"react-router-dom": "^6.24.1",
"react-virtualized-auto-sizer": "^1.0.24",
"react-window": "^1.8.10",
"recursive-readdir": "^2.2.3",
"rfdc": "^1.3.0",
"rxjs": "^7.8.0",
"rfdc": "^1.4.1",
"rxjs": "^7.8.1",
"sanitize-filename": "^1.6.3",
"semver": "^7.5.4",
"serialize-error": "^8.1.0",
"semver": "^7.6.3",
"serialize-error": "^11.0.3",
"striptags": "^4.0.0-alpha.4",
"tailwind-scrollbar-hide": "^1.1.7",
"tailwind-merge": "^2.5.2",
"tailwindcss-scoped-groups": "^2.0.0",
"tippy.js": "^6.3.7",
"to-ico": "^1.1.5",
@@ -256,9 +203,8 @@
"use-fit-text": "^2.4.0",
"yauzl": "^3.2.0"
},
"devEngines": {
"node": ">=14.x",
"npm": ">=7.x"
"engines": {
"node": ">=20.0.0"
},
"collective": {
"url": "https://www.patreon.com/bsmanager"
@@ -288,13 +234,13 @@
},
"electronmon": {
"patterns": [
"!src/__tests__/**",
"!release/**",
"!assets/**"
"!**/**",
"src/main/**",
".erb/dll/**"
],
"logLevel": "quiet"
},
"volta": {
"node": "20.18.0"
"node": "22.11.0"
}
}
+49 -1153
View File
File diff suppressed because it is too large Load Diff
+9 -6
View File
@@ -1,6 +1,6 @@
{
"name": "bs-manager",
"version": "1.4.16",
"version": "1.5.0-alpha.5",
"description": "BSManager",
"main": "./dist/main/main.js",
"author": {
@@ -9,15 +9,18 @@
"url": "https://github.com/Zagrios/bs-manager"
},
"scripts": {
"electron-rebuild": "node -r ts-node/register ../../.erb/scripts/electron-rebuild.js",
"rebuild": "node -r ts-node/register ../../.erb/scripts/electron-rebuild.js",
"link-modules": "node -r ts-node/register ../../.erb/scripts/link-modules.ts",
"postinstall": "npm run electron-rebuild && npm run link-modules"
"postinstall": "npm run rebuild && npm run link-modules"
},
"dependencies": {
"@resvg/resvg-js": "2.6.2",
"ps-list": "^7.2.0",
"query-process": "^0.0.3",
"regedit-rs": "^1.0.2",
"sharp": "^0.32.6"
"regedit-rs": "^1.0.2"
},
"license": "MIT"
"license": "MIT",
"volta": {
"node": "20.11.0"
}
}
+203
View File
@@ -0,0 +1,203 @@
import {
bsmSpawn,
// bsmExec,
isProcessRunning,
// getProcessId,
} from "main/helpers/os.helpers";
import cp from "child_process";
import crypto from "crypto";
import log from "electron-log";
import { ifDescribe, ifIt } from "__tests__/utils";
import { BS_APP_ID } from "main/constants";
Object.defineProperty(global, "crypto", {
value: {
randomUUID: () => crypto.webcrypto.randomUUID(),
}
});
jest.mock("electron", () => ({
app: { getPath: () => "" },
}));
jest.mock("electron-log", () => ({
info: jest.fn(),
error: jest.fn(),
}));
jest.mock("ps-list", () => () => []);
const IS_WINDOWS = process.platform === "win32";
const IS_LINUX = process.platform === "linux";
describe("Test os.helpers bsmSpawn", () => {
const spawnSpy: jest.SpyInstance = jest.spyOn(cp, "spawn")
.mockImplementation();
const logSpy: jest.SpyInstance = jest.spyOn(log, "info");
const originalContainer = process.env.container;
const BS_ENV = {
SteamAppId: BS_APP_ID,
SteamOverlayGameId: BS_APP_ID,
SteamGameId: BS_APP_ID,
};
beforeAll(() => {
if (IS_LINUX) {
Object.assign(BS_ENV, {
WINEDLLOVERRIDES: "winhttp=n,b",
STEAM_COMPAT_DATA_PATH: "/compatdata",
STEAM_COMPAT_INSTALL_PATH: "/BSInstance",
STEAM_COMPAT_CLIENT_INSTALL_PATH: "/steam",
STEAM_COMPAT_APP_ID: BS_APP_ID,
SteamEnv: "1",
});
}
});
afterAll(() => {
spawnSpy.mockRestore();
});
afterEach(() => {
spawnSpy.mockClear();
logSpy.mockClear();
process.env.container = originalContainer;
});
it("Simple spawn command", () => {
bsmSpawn("cd", {
args: ["folder1", "folder2"],
});
expect(spawnSpy).toHaveBeenCalledTimes(1);
expect(spawnSpy).toHaveBeenCalledWith("cd folder1 folder2", expect.anything());
expect(logSpy).toHaveBeenCalledTimes(0);
});
it("Simple spawn command with logging", () => {
bsmSpawn("mkdir", {
args: ["new_folder"],
log: true,
});
expect(spawnSpy).toHaveBeenCalledTimes(1);
expect(spawnSpy).toHaveBeenCalledWith("mkdir new_folder", expect.anything());
expect(logSpy).toHaveBeenCalledTimes(1);
});
it("Complex spawn command call (Mods install)", () => {
bsmSpawn(`"./BSIPA.exe" "./Beat Saber.exe" -n`, {
log: true,
linux: { prefix: `"./wine64"` },
});
expect(spawnSpy).toHaveBeenCalledTimes(1);
expect(spawnSpy).toHaveBeenCalledWith(
process.platform === "win32"
? `"./BSIPA.exe" "./Beat Saber.exe" -n`
: `"./wine64" "./BSIPA.exe" "./Beat Saber.exe" -n`,
expect.anything()
);
expect(logSpy).toHaveBeenCalledTimes(1);
});
it("Complex spawn command call (BS launch)", () => {
bsmSpawn(`"./Beat Saber.exe"`, {
args: ["--no-yeet", "fpfc"],
options: {
cwd: "/",
detached: true,
env: BS_ENV,
},
log: true,
linux: { prefix: `"./proton" run` },
});
expect(spawnSpy).toHaveBeenCalledTimes(1);
expect(spawnSpy).toHaveBeenCalledWith(
IS_WINDOWS
? `"./Beat Saber.exe" --no-yeet fpfc`
: `"./proton" run "./Beat Saber.exe" --no-yeet fpfc`,
expect.objectContaining({
cwd: "/",
detached: true,
env: BS_ENV,
})
);
expect(logSpy).toHaveBeenCalledTimes(1);
});
ifIt(IS_LINUX)("Complex spawn command call (BS launch flatpak)", () => {
const flatpakEnv = [
"SteamAppId",
"SteamOverlayGameId",
"SteamGameId",
"WINEDLLOVERRIDES",
"STEAM_COMPAT_DATA_PATH",
"STEAM_COMPAT_INSTALL_PATH",
"STEAM_COMPAT_CLIENT_INSTALL_PATH",
"STEAM_COMPAT_APP_ID",
"SteamEnv"
];
const newEnv = {
...BS_ENV,
something: "else",
more: "tests",
};
bsmSpawn(`"./Beat Saber.exe"`, {
args: ["--no-yeet", "fpfc"],
options: {
cwd: "/",
detached: true,
env: newEnv,
},
log: true,
linux: { prefix: `"./proton" run` },
flatpak: {
host: true,
env: flatpakEnv,
},
});
expect(spawnSpy).toHaveBeenCalledTimes(1);
const envArgs = flatpakEnv.map(argName =>
`--env=${argName}="${(BS_ENV as any)[argName]}"`
).join(" ");
expect(spawnSpy).toHaveBeenCalledWith(
`flatpak-spawn --host ${envArgs} "./proton" run "./Beat Saber.exe" --no-yeet fpfc`,
expect.objectContaining({
cwd: "/",
detached: true,
env: newEnv,
})
);
expect(logSpy).toHaveBeenCalledTimes(1);
});
});
ifDescribe(IS_LINUX)("Test os.helpers isProcessRunning", () => {
const logSpy: jest.SpyInstance = jest.spyOn(log, "error");
afterEach(() => {
logSpy.mockClear();
});
it("Process is running", async () => {
// There will always a node process running
const running = await isProcessRunning("node");
expect(running).toBe(true);
// No errors received
expect(logSpy).toHaveBeenCalledTimes(0);
});
it("Process is not running", async () => {
const running = await isProcessRunning(`bs-manager-${crypto.randomUUID()}`);
expect(running).toBe(false);
// No errors received
expect(logSpy).toHaveBeenCalledTimes(0);
});
});
+5
View File
@@ -0,0 +1,5 @@
export const ifDescribe = (condition: boolean) => condition ? describe : describe.skip;
export const ifIt = (condition: boolean) => condition ? it : it.skip;
+13 -2
View File
@@ -1,4 +1,5 @@
import { app } from "electron";
import { constants } from "http2";
import path from "path";
export const BS_EXECUTABLE = "Beat Saber.exe";
@@ -10,5 +11,15 @@ export const APP_NAME = "BSManager";
export const STEAMVR_APP_ID = "250820";
export const IMAGE_CACHE_FOLDER = "imagescache";
export const IMAGE_CACHE_PATH = path.join(app.getPath("userData"), IMAGE_CACHE_FOLDER);
export const CACHE_PATH = path.join(app.getPath("userData"), "CachedData");
export const IMAGE_CACHE_PATH = path.join(CACHE_PATH, "imagescache");
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";
+36 -5
View File
@@ -7,7 +7,8 @@ import { BsmException } from "shared/models/bsm-exception.model";
import crypto from "crypto";
import { execSync } from "child_process";
import { tryit } from "../../shared/helpers/error.helpers";
import { CustomError } from "../../shared/models/exceptions/custom-error.class"
import { CustomError } from "shared/models/exceptions/custom-error.class";
import { ErrorObject } from "serialize-error";
export async function pathExist(path: string): Promise<boolean> {
try {
@@ -78,6 +79,7 @@ export async function getFilesInFolder(folderPath: string): Promise<string[]> {
return dirEntries.filter(entry => entry.isFile()).map(file => path.join(folderPath, file.name));
}
export function moveFolderContent(src: string, dest: string, option?: MoveOptions): Observable<Progression> {
const progress: Progression = { current: 0, total: 0 };
return new Observable<Progression>(subscriber => {
@@ -152,7 +154,7 @@ export async function copyDirectoryWithJunctions(src: string, dest: string, opti
const symlinkTarget = await readlink(sourcePath);
const relativePath = path.relative(src, symlinkTarget);
const newTarget = path.join(dest, relativePath);
await symlink(newTarget, destinationPath, "junction");
await symlink(newTarget, destinationPath, "junction"); // Only junction to avoid right issues while copying content of BSManager folder
}
}
}
@@ -218,13 +220,27 @@ export function rxCopy(src: string, dest: string, option?: CopyOptions): Observa
export async function ensurePathNotAlreadyExist(path: string): Promise<string> {
let destPath = path;
let folderExist = await pathExist(destPath);
let folderExist = await pathExists(destPath);
let i = 0;
while (folderExist) {
i++;
destPath = `${path} (${i})`;
folderExist = await pathExist(destPath);
folderExist = await pathExists(destPath);
}
return destPath;
}
export function ensurePathNotAlreadyExistSync(path: string): string {
let destPath = path;
let folderExist = pathExistsSync(destPath);
let i = 0;
while (folderExist) {
i++;
destPath = `${path} (${i})`;
folderExist = pathExistsSync(destPath);
}
return destPath;
@@ -245,9 +261,24 @@ export function resolveGUIDPath(guidPath: string): string {
return path.join(driveLetter, path.relative(guidVolume, guidPath));
}
export interface Progression<T = unknown> {
export function getUniqueFileNamePath(filePath: string): string {
const { dir, name, ext } = path.parse(filePath);
let i = 0;
let newFileName = `${name}${ext}`;
while (pathExistsSync(path.join(dir, newFileName))) {
i++;
newFileName = `${name} (${i})${ext}`;
}
return path.join(dir, newFileName);
}
export interface Progression<T = unknown, D = unknown> {
total: number;
current: number;
diff?: number;
data?: T;
extra?: D;
lastError?: ErrorObject;
}
+151 -10
View File
@@ -1,25 +1,166 @@
import cp from "child_process";
import log from "electron-log";
import psList from "ps-list";
import { IS_FLATPAK } from "main/constants";
export async function taskRunning(task: string): Promise<boolean> {
// There are 2 erroneous lines ps | grep which is both the ps and grep calls themselves
const MIN_PROCESS_COUNT_LINUX = 2;
type LinuxOptions = {
// Add the prefix to the command
// eg. command - "./Beat Saber.exe" --no-yeet, prefix - "path/to/proton" run
// = "path/to/proton" run "./Beat Saber.exe" --no-yeet
prefix: string;
};
// Only applied if package as flatpak
type FlatpakOptions = {
// Force to use "flatpak-spawn --host" to run commands outside of the sandbox
host: boolean;
// Only copy the keys from options.env from bsmSpawn/bsmExec
env?: string[];
};
export type BsmSpawnOptions = {
args?: string[];
options?: cp.SpawnOptions;
log?: boolean;
linux?: LinuxOptions;
flatpak?: FlatpakOptions;
};
export type BsmExecOptions = {
args?: string[];
options?: cp.ExecOptions;
log?: boolean;
linux?: LinuxOptions;
flatpak?: FlatpakOptions;
};
function updateCommand(command: string, options: BsmSpawnOptions) {
if (options?.args) {
command += ` ${options.args.join(" ")}`;
}
if (process.platform === "linux") {
// "/bin/sh" does not see flatpak-spawn
// Most Debian and Arch should also support "/bin/bash"
options.options.shell = "/bin/bash";
if (options.linux?.prefix) {
command = `${options.linux.prefix} ${command}`;
}
if (options?.flatpak?.host) {
const envArgs = (options?.flatpak?.env && options?.options?.env)
&& options.flatpak.env
.filter(envName => options.options.env[envName])
.map(envName =>
`--env=${envName}="${options.options.env[envName]}"`
)
.join(" ");
command = `flatpak-spawn --host ${envArgs || ""} ${command}`;
}
}
return command;
}
export function bsmSpawn(command: string, options?: BsmSpawnOptions) {
options = options || {};
options.options = options.options || {};
command = updateCommand(command, options);
if (options?.log) {
log.info(process.platform === "win32" ? "Windows" : "Linux", "spawn command\n>", command);
}
return cp.spawn(command, options.options);
}
export function bsmExec(command: string, options?: BsmExecOptions): Promise<{
stdout: string;
stderr: string;
}> {
options = options || {};
options.options = options.options || {};
command = updateCommand(command, options);
if (options?.log) {
log.info(
process.platform === "win32" ? "Windows" : "Linux",
"exec command\n>", command
);
}
return new Promise((resolve, reject) => {
cp.exec(command, options?.options || {}, (error: Error, stdout: string, stderr: string) => {
if (error) { return reject(error); }
resolve({ stdout, stderr });
});
});
}
async function isProcessRunningLinux(name: string): Promise<boolean> {
try {
const { stdout: count } = await bsmExec(`ps awwxo args | grep -c "${name}"`, {
log: true,
flatpak: { host: IS_FLATPAK },
});
return +count.trim() > MIN_PROCESS_COUNT_LINUX;
} catch(error) {
log.error(error);
return false;
};
}
async function getProcessIdWindows(name: string): Promise<number | null> {
try {
const processes = await psList();
return processes.some(process => process.name?.includes(task) || process.cmd?.includes(task));
const process = processes.find(process => process.name?.includes(name) || process.cmd?.includes(name));
return process?.pid;
} catch (error) {
log.error(error);
return null;
}
catch(error){
}
export const isProcessRunning = process.platform === "win32"
? isProcessRunningWindows
: isProcessRunningLinux;
async function isProcessRunningWindows(name: string): Promise<boolean> {
try {
const processes = await psList();
return processes.some(process =>
process.name?.includes(name) || process.cmd?.includes(name)
);
} catch (error) {
log.error(error);
return false;
}
}
export async function getProcessPid(task: string): Promise<number> {
async function getProcessIdLinux(name: string): Promise<number | null> {
try {
const processes = await psList();
const process = processes.find(process => process.name?.includes(task) || process.cmd?.includes(task));
return process?.pid;
}
catch(error){
const { stdout } = await bsmExec(`ps awwxo pid,args | grep "${name}"`, {
log: true,
flatpak: { host: IS_FLATPAK },
});
const line = stdout.split("\n")
.slice(0, -MIN_PROCESS_COUNT_LINUX)
.map(line => line.trimStart())
.find(line => line.includes(name) && !line.includes("grep"));
return line ? +line.split(" ").at(0) : null;
} catch(error) {
log.error(error);
return null;
}
};
}
export const getProcessId = process.platform === "win32"
? getProcessIdWindows
: getProcessIdLinux;
+17 -50
View File
@@ -1,63 +1,30 @@
import { ipcMain } from "electron";
import { UtilsService } from "../services/utils.service";
import { IpcRequest } from "shared/models/ipc";
import { SearchParams } from "shared/models/maps/beat-saver.model";
import { BeatSaverService } from "../services/thrid-party/beat-saver/beat-saver.service";
import log from "electron-log";
import { IpcService } from "../services/ipc.service";
import { from } from "rxjs";
ipcMain.on("bsv-search-map", async (event, request: IpcRequest<SearchParams>) => {
const utlis = UtilsService.getInstance();
const ipc = IpcService.getInstance();
ipc.on("bsv-search-map", (args, reply) => {
const bsvService = BeatSaverService.getInstance();
bsvService
.searchMaps(request.args)
.then(maps => {
utlis.ipcSend(request.responceChannel, { success: true, data: maps });
})
.catch(e => {
utlis.ipcSend(request.responceChannel, { success: false, error: e });
});
reply(from(bsvService.searchMaps(args)));
});
ipcMain.on("bsv-get-map-details-from-hashs", async (event, request: IpcRequest<string[]>) => {
const utlis = UtilsService.getInstance();
ipc.on("bsv-get-map-details-from-hashs", (args, reply) => {
const bsvService = BeatSaverService.getInstance();
bsvService
.getMapDetailsFromHashs(request.args)
.then(maps => {
utlis.ipcSend(request.responceChannel, { success: true, data: maps });
})
.catch(e => {
log.error(e);
utlis.ipcSend(request.responceChannel, { success: false, error: e });
});
reply(from(bsvService.getMapDetailsFromHashs(args)));
});
ipcMain.on("bsv-get-map-details-by-id", async (event, request: IpcRequest<string>) => {
const utlis = UtilsService.getInstance();
ipc.on("bsv-get-map-details-by-id", (args, reply) => {
const bsvService = BeatSaverService.getInstance();
bsvService
.getMapDetailsById(request.args)
.then(maps => {
utlis.ipcSend(request.responceChannel, { success: true, data: maps });
})
.catch(e => {
utlis.ipcSend(request.responceChannel, { success: false, error: e });
});
reply(from(bsvService.getMapDetailsById(args)));
});
ipcMain.on("bsv-get-playlist-details-by-id", async (event, request: IpcRequest<string>) => {
const utlis = UtilsService.getInstance();
ipc.on("bsv-search-playlist", (args, reply) => {
const bsvService = BeatSaverService.getInstance();
bsvService
.getPlaylistPage(request.args)
.then(maps => {
utlis.ipcSend(request.responceChannel, { success: true, data: maps });
})
.catch(e => {
utlis.ipcSend(request.responceChannel, { success: false, error: e });
});
reply(from(bsvService.searchPlaylists(args)));
});
ipc.on("bsv-get-playlist-details-by-id", (args, reply) => {
const bsvService = BeatSaverService.getInstance();
reply(from(bsvService.getPlaylistDetailsById(args.id, args.page)));
});
+27
View File
@@ -0,0 +1,27 @@
import { pathExistsSync } from "fs-extra";
import { from, of } from "rxjs";
import { InstallationLocationService } from "main/services/installation-location.service";
import { IpcService } from "main/services/ipc.service";
const ipc = IpcService.getInstance();
ipc.on("bs-installer.folder-exists", (_, reply) => {
const service = InstallationLocationService.getInstance();
reply(of(pathExistsSync(service.installationDirectory())));
});
ipc.on("bs-installer.default-install-path", (_, reply) => {
const service = InstallationLocationService.getInstance();
reply(of(service.defaultInstallationDirectory()));
});
ipc.on("bs-installer.install-path", (_, reply) => {
const service = InstallationLocationService.getInstance();
reply(of(service.installationDirectory()));
});
ipc.on("bs-installer.set-install-path", (args, reply) => {
const service = InstallationLocationService.getInstance();
reply(from(service.setInstallationDirectory(args.path, args.move)));
});
+6 -9
View File
@@ -1,22 +1,20 @@
import { LaunchOption } from "shared/models/bs-launch";
import { BSLauncherService } from "../services/bs-launcher/bs-launcher.service"
import { IpcService } from '../services/ipc.service';
import { from } from "rxjs";
import { SteamLauncherService } from "../services/bs-launcher/steam-launcher.service";
import { OculusLauncherService } from "../services/bs-launcher/oculus-launcher.service";
import { SteamService } from "../services/steam.service";
import log from "electron-log";
import isElevated from "is-elevated";
const ipc = IpcService.getInstance();
ipc.on<LaunchOption>('bs-launch.launch', (req, reply) => {
ipc.on('bs-launch.launch', (args, reply) => {
const bsLauncher = BSLauncherService.getInstance();
reply(bsLauncher.launch(req.args));
reply(bsLauncher.launch(args));
});
ipc.on<boolean>("bs-launch.need-start-as-admin", (_, reply) => {
ipc.on("bs-launch.need-start-as-admin", (_, reply) => {
const steam = SteamService.getInstance();
reply(from(isElevated().then(elevated => {
if(elevated){ return false; }
@@ -27,13 +25,12 @@ ipc.on<boolean>("bs-launch.need-start-as-admin", (_, reply) => {
})));
});
ipc.on<LaunchOption>("create-launch-shortcut", (req, reply) => {
ipc.on("create-launch-shortcut", (args, reply) => {
const bsLauncher = BSLauncherService.getInstance();
reply(from(bsLauncher.createLaunchShortcut(req.args)));
reply(from(bsLauncher.createLaunchShortcut(args)));
});
ipc.on<void>("bs-launch.restore-steamvr", (_, reply) => {
ipc.on("bs-launch.restore-steamvr", (_, reply) => {
const steamLauncher = SteamLauncherService.getInstance();
reply(from(steamLauncher.restoreSteamVR()));
});
+58 -84
View File
@@ -1,119 +1,93 @@
import { LocalMapsManagerService } from "../services/additional-content/local-maps-manager.service";
import { UtilsService } from "../services/utils.service";
import { BSVersion } from "shared/bs-version.interface";
import { IpcRequest } from "shared/models/ipc";
import { BsmLocalMap } from "shared/models/maps/bsm-local-map.interface";
import { BsvMapDetail } from "shared/models/maps";
import { LocalMapsManagerService } from "../services/additional-content/maps/local-maps-manager.service";
import { IpcService } from "../services/ipc.service";
import { from } from "rxjs";
import log from "electron-log"
import { from, of, throwError } from "rxjs";
import { tryit } from "shared/helpers/error.helpers";
import { SongDetailsCacheService } from "main/services/additional-content/maps/song-details-cache.service";
import { SongDetails } from "shared/models/maps";
const ipc = IpcService.getInstance();
ipc.on("load-version-maps", async (request: IpcRequest<BSVersion>, reply) => {
ipc.on("load-version-maps", (args, reply) => {
const localMaps = LocalMapsManagerService.getInstance();
reply(localMaps.getMaps(request.args));
reply(localMaps.getMaps(args));
});
ipc.on("verion-have-maps-linked", async (request: IpcRequest<BSVersion>) => {
const utils = UtilsService.getInstance();
ipc.on("delete-maps", (args, reply) => {
const maps = LocalMapsManagerService.getInstance();
utils.ipcSend<boolean>(request.responceChannel, { success: true, data: await maps.versionIsLinked(request.args) });
reply(maps.deleteMaps(args));
});
ipc.on("link-version-maps", async (request: IpcRequest<{ version: BSVersion; keepMaps: boolean }>) => {
const utils = UtilsService.getInstance();
ipc.on("export-maps", async (args, reply) => {
const maps = LocalMapsManagerService.getInstance();
maps.linkVersionMaps(request.args.version, request.args.keepMaps)
.then(() => {
utils.ipcSend<void>(request.responceChannel, { success: true });
})
.catch(err => {
utils.ipcSend<void>(request.responceChannel, { success: true, error: err });
});
reply(await maps.exportMaps(args.version, args.maps, args.outPath));
});
ipc.on("unlink-version-maps", async (request: IpcRequest<{ version: BSVersion; keepMaps: boolean }>) => {
const utils = UtilsService.getInstance();
ipc.on("bs-maps.import-maps", async (args, reply) => {
const maps = LocalMapsManagerService.getInstance();
reply(maps.importMaps(args.paths, args.version));
})
maps.unlinkVersionMaps(request.args.version, request.args.keepMaps)
.then(() => {
utils.ipcSend<void>(request.responceChannel, { success: true });
})
.catch(err => {
utils.ipcSend<void>(request.responceChannel, { success: true, error: err });
});
ipc.on("bs-maps.download-map", async (args, reply) => {
const maps = LocalMapsManagerService.getInstance();
reply(from(maps.downloadMap(args.map, args.version)));
});
ipc.on("delete-maps", async (request: IpcRequest<BsmLocalMap[]>, reply) => {
ipc.on("last-downloaded-map", (_, reply) => {
const maps = LocalMapsManagerService.getInstance();
reply(maps.deleteMaps(request.args));
reply(maps.lastDownloadedMap$);
})
ipc.on("one-click-install-map", (args, reply) => {
const maps = LocalMapsManagerService.getInstance();
reply(from(maps.oneClickDownloadMap(args)))
});
ipc.on("export-maps", async (request: IpcRequest<{ version: BSVersion; maps: BsmLocalMap[]; outPath: string }>, reply) => {
ipc.on("register-maps-deep-link", (_, reply) => {
const maps = LocalMapsManagerService.getInstance();
reply(await maps.exportMaps(request.args.version, request.args.maps, request.args.outPath));
});
const { error, result } = tryit(() => maps.enableDeepLinks());
ipc.on("download-map", async (request: IpcRequest<{ map: BsvMapDetail; version: BSVersion }>, reply) => {
const maps = LocalMapsManagerService.getInstance();
reply(from(maps.downloadMap(request.args.map, request.args.version)));
});
ipc.on("one-click-install-map", async (request: IpcRequest<BsvMapDetail>) => {
const utils = UtilsService.getInstance();
const maps = LocalMapsManagerService.getInstance();
maps.oneClickDownloadMap(request.args)
.then(() => {
utils.ipcSend(request.responceChannel, { success: true });
})
.catch(err => {
log.error(err);
utils.ipcSend(request.responceChannel, { success: false, error: err });
});
});
ipc.on("register-maps-deep-link", async (request: IpcRequest<void>) => {
const maps = LocalMapsManagerService.getInstance();
const utils = UtilsService.getInstance();
try {
const res = maps.enableDeepLinks();
utils.ipcSend(request.responceChannel, { success: true, data: res });
} catch (e) {
utils.ipcSend(request.responceChannel, { success: false });
if(error) {
return reply(throwError(() => error));
}
reply(of(result));
});
ipc.on("unregister-maps-deep-link", async (request: IpcRequest<void>) => {
ipc.on("unregister-maps-deep-link", (_, reply) => {
const maps = LocalMapsManagerService.getInstance();
const utils = UtilsService.getInstance();
const { error, result } = tryit(() => maps.disableDeepLinks());
try {
const res = maps.disableDeepLinks();
utils.ipcSend(request.responceChannel, { success: true, data: res });
} catch (e) {
utils.ipcSend(request.responceChannel, { success: false });
if(error) {
return reply(throwError(() => error));
}
reply(of(result));
});
ipc.on("is-map-deep-links-enabled", async (request: IpcRequest<void>) => {
ipc.on("is-map-deep-links-enabled", (_, reply) => {
const maps = LocalMapsManagerService.getInstance();
const utils = UtilsService.getInstance();
const { error, result } = tryit(() => maps.isDeepLinksEnabled());
try {
const res = maps.isDeepLinksEnabled();
utils.ipcSend(request.responceChannel, { success: true, data: res });
} catch (e) {
utils.ipcSend(request.responceChannel, { success: false });
if(error) {
return reply(throwError(() => error));
}
reply(of(result));
});
ipc.on("get-version-maps-path", async (req: IpcRequest<BSVersion>, reply) => {
const maps = LocalMapsManagerService.getInstance();
reply(from(maps.getMapsFolderPath(req.args)));
});
ipc.on("get-maps-info-from-cache", (args, reply) => {
const songsCache = SongDetailsCacheService.getInstance();
const res = (args ?? []).reduce((acc, hash) => {
const songDetails = songsCache.getSongDetails(hash);
if(songDetails){
acc.push(songDetails);
}
return acc;
}, [] as SongDetails[]);
reply(of(res));
})
+23 -60
View File
@@ -1,82 +1,45 @@
import { ipcMain } from "electron";
import { UtilsService } from "../services/utils.service";
import { IpcRequest } from "shared/models/ipc";
import { MSModel, MSModelType } from "shared/models/models/model-saber.model";
import { LocalModelsManagerService } from "../services/additional-content/local-models-manager.service";
import { IpcService } from "../services/ipc.service";
import { BSVersion } from "shared/bs-version.interface";
import { BsmLocalModel } from "shared/models/models/bsm-local-model.interface";
import { ModelDownload } from "renderer/services/models-management/models-downloader.service";
import { from, of } from "rxjs";
const ipc = IpcService.getInstance();
ipcMain.on("one-click-install-model", async (event, request: IpcRequest<MSModel>) => {
const utils = UtilsService.getInstance();
ipc.on("one-click-install-model", (args, reply) => {
const models = LocalModelsManagerService.getInstance();
models
.oneClickDownloadModel(request.args)
.then(() => {
utils.ipcSend(request.responceChannel, { success: true });
})
.catch(e => {
utils.ipcSend(request.responceChannel, { success: false, error: e });
});
reply(from(models.oneClickDownloadModel(args)));
});
ipcMain.on("register-models-deep-link", async (event, request: IpcRequest<void>) => {
ipc.on("register-models-deep-link", (_, reply) => {
const models = LocalModelsManagerService.getInstance();
reply(of(models.enableDeepLinks()));
});
ipc.on("unregister-models-deep-link", (_, reply) => {
const models = LocalModelsManagerService.getInstance();
reply(of(models.disableDeepLinks()));
});
ipc.on("is-models-deep-links-enabled", (_, reply) => {
const maps = LocalModelsManagerService.getInstance();
const utils = UtilsService.getInstance();
try {
const res = maps.enableDeepLinks();
utils.ipcSend(request.responceChannel, { success: true, data: res });
} catch (e) {
utils.ipcSend(request.responceChannel, { success: false });
}
reply(of(maps.isDeepLinksEnabled()));
});
ipcMain.on("unregister-models-deep-link", async (event, request: IpcRequest<void>) => {
const maps = LocalModelsManagerService.getInstance();
const utils = UtilsService.getInstance();
try {
const res = maps.disableDeepLinks();
utils.ipcSend(request.responceChannel, { success: true, data: res });
} catch (e) {
utils.ipcSend(request.responceChannel, { success: false });
}
});
ipcMain.on("is-models-deep-links-enabled", async (event, request: IpcRequest<void>) => {
const maps = LocalModelsManagerService.getInstance();
const utils = UtilsService.getInstance();
try {
const res = maps.isDeepLinksEnabled();
utils.ipcSend(request.responceChannel, { success: true, data: res });
} catch (e) {
utils.ipcSend(request.responceChannel, { success: false });
}
});
ipc.on<ModelDownload>("download-model", async (req, reply) => {
ipc.on("download-model", (args, reply) => {
const models = LocalModelsManagerService.getInstance();
reply(models.downloadModel(req.args.model, req.args.version));
reply(models.downloadModel(args.model, args.version));
});
ipc.on<{ version: BSVersion; type: MSModelType }>("get-version-models", async (req, reply) => {
ipc.on("get-version-models", (args, reply) => {
const models = LocalModelsManagerService.getInstance();
const res = await models.getModels(req.args.type, req.args.version);
reply(res);
reply(from(models.getModels(args.type, args.version)));
});
ipc.on<{ version: BSVersion; models: BsmLocalModel[]; outPath: string }>("export-models", async (req, reply) => {
ipc.on("export-models", (args, reply) => {
const models = LocalModelsManagerService.getInstance();
reply(models.exportModels(req.args.outPath, req.args.version, req.args.models));
reply(models.exportModels(args.outPath, args.version, args.models));
});
ipc.on<BsmLocalModel[]>("delete-models", async (req, reply) => {
ipc.on("delete-models", (args, reply) => {
const models = LocalModelsManagerService.getInstance();
reply(models.deleteModels(req.args));
reply(models.deleteModels(args));
});
+10 -47
View File
@@ -1,67 +1,30 @@
import { ipcMain } from "electron";
import { BsModsManagerService } from "../services/mods/bs-mods-manager.service";
import { UtilsService } from "../services/utils.service";
import { BSVersion } from "shared/bs-version.interface";
import { IpcRequest } from "shared/models/ipc";
import { BbmFullMod } from "shared/models/mods/mod.interface";
import { InstallModsResult } from "shared/models/mods";
import log from "electron-log";
import { IpcService } from "../services/ipc.service";
import { from } from "rxjs";
const ipc = IpcService.getInstance();
ipc.on<BSVersion>("get-available-mods", (req, reply) => {
ipc.on("get-available-mods", (args, reply) => {
const modsManager = BsModsManagerService.getInstance();
reply(from(modsManager.getAvailableMods(req.args)));
reply(from(modsManager.getAvailableMods(args)));
});
ipc.on<BSVersion>("get-installed-mods", (req, reply) => {
ipc.on("get-installed-mods", (args, reply) => {
const modsManager = BsModsManagerService.getInstance();
reply(from(modsManager.getInstalledMods(req.args)));
reply(from(modsManager.getInstalledMods(args)));
});
ipcMain.on("install-mods", (event, request: IpcRequest<{ mods: BbmFullMod[]; version: BSVersion }>) => {
const utils = UtilsService.getInstance();
ipc.on("install-mods", (args, reply) => {
const modsManager = BsModsManagerService.getInstance();
modsManager
.installMods(request.args.mods, request.args.version)
.then(nbInstalled => {
utils.ipcSend<InstallModsResult>(request.responceChannel, { success: true, data: nbInstalled });
})
.catch(err => {
utils.ipcSend(request.responceChannel, { success: false, error: err });
log.error("ipc", "install-mods", err, request);
});
reply(modsManager.installMods(args.mods, args.version));
});
ipcMain.on("uninstall-mods", (event, request: IpcRequest<{ mods: BbmFullMod[]; version: BSVersion }>) => {
const utils = UtilsService.getInstance();
ipc.on("uninstall-mods", (args, reply) => {
const modsManager = BsModsManagerService.getInstance();
modsManager
.uninstallMods(request.args.mods, request.args.version)
.then(nbInstalled => {
utils.ipcSend(request.responceChannel, { success: true, data: nbInstalled });
})
.catch(err => {
utils.ipcSend(request.responceChannel, { success: false, error: err });
log.error("ipc", "uninstall-mods", err, request);
});
reply(modsManager.uninstallMods(args.mods, args.version));
});
ipcMain.on("uninstall-all-mods", (event, request: IpcRequest<BSVersion>) => {
const utils = UtilsService.getInstance();
ipc.on("uninstall-all-mods", (args, reply) => {
const modsManager = BsModsManagerService.getInstance();
modsManager
.uninstallAllMods(request.args)
.then(nbInstalled => {
utils.ipcSend(request.responceChannel, { success: true, data: nbInstalled });
})
.catch(err => {
utils.ipcSend(request.responceChannel, { success: false, error: err });
log.error("ipc", "uninstall-all-mods", err, request);
});
reply(modsManager.uninstallAllMods(args));
});
+60 -32
View File
@@ -1,48 +1,76 @@
import { ipcMain } from "electron";
import { IpcRequest } from "shared/models/ipc";
import { LocalPlaylistsManagerService } from "../services/additional-content/local-playlists-manager.service";
import { UtilsService } from "../services/utils.service";
import { IpcService } from "../services/ipc.service";
import { from, lastValueFrom, mergeMap, of } from "rxjs";
import { LocalMapsManagerService } from "../services/additional-content/maps/local-maps-manager.service";
import { Progression } from "main/helpers/fs.helpers";
const ipc = IpcService.getInstance();
ipc.on<string>("one-click-install-playlist", (req, reply) => {
ipc.on("one-click-install-playlist", (args, reply) => {
const mapsManager = LocalPlaylistsManagerService.getInstance();
reply(mapsManager.oneClickInstallPlaylist(req.args));
reply(mapsManager.oneClickInstallPlaylist(args));
});
ipcMain.on("register-playlists-deep-link", async (event, request: IpcRequest<void>) => {
ipc.on("register-playlists-deep-link", (args, reply) => {
const maps = LocalPlaylistsManagerService.getInstance();
const utils = UtilsService.getInstance();
try {
const res = maps.enableDeepLinks();
utils.ipcSend(request.responceChannel, { success: true, data: res });
} catch (e) {
utils.ipcSend(request.responceChannel, { success: false });
}
reply(of(maps.enableDeepLinks()));
});
ipcMain.on("unregister-playlists-deep-link", async (event, request: IpcRequest<void>) => {
ipc.on("unregister-playlists-deep-link", (args, reply) => {
const maps = LocalPlaylistsManagerService.getInstance();
const utils = UtilsService.getInstance();
try {
const res = maps.disableDeepLinks();
utils.ipcSend(request.responceChannel, { success: true, data: res });
} catch (e) {
utils.ipcSend(request.responceChannel, { success: false });
}
reply(of(maps.disableDeepLinks()));
});
ipcMain.on("is-playlists-deep-links-enabled", async (event, request: IpcRequest<void>) => {
ipc.on("is-playlists-deep-links-enabled", (args, reply) => {
const maps = LocalPlaylistsManagerService.getInstance();
const utils = UtilsService.getInstance();
try {
const res = maps.isDeepLinksEnabled();
utils.ipcSend(request.responceChannel, { success: true, data: res });
} catch (e) {
utils.ipcSend(request.responceChannel, { success: false });
}
reply(of(maps.isDeepLinksEnabled()));
});
ipc.on("download-playlist", (args, reply) => {
const playlists = LocalPlaylistsManagerService.getInstance();
return reply(playlists.downloadPlaylist({
bplistSource: args.downloadSource,
version: args.version,
ignoreSongsHashs: args.ignoreSongsHashs,
dest: args.dest
}));
});
ipc.on("get-version-playlists-details", (args, reply) => {
const playlists = LocalPlaylistsManagerService.getInstance();
reply(playlists.getVersionPlaylistsDetails(args));
});
ipc.on("delete-playlist", (args, reply) => {
const playlists = LocalPlaylistsManagerService.getInstance();
const maps = LocalMapsManagerService.getInstance();
reply(playlists.deletePlaylistFile(args.bpList).pipe(mergeMap(() => {
if(args.deleteMaps){
return maps.deleteMapsFromHashs(args.version, args.bpList.songs.map(s => s.hash));
}
return of({ current: 0, total: 0 } as Progression);
})));
});
ipc.on("export-playlists", (args, reply) => {
const playlists = LocalPlaylistsManagerService.getInstance();
reply(playlists.exportPlaylists(args));
});
ipc.on("import-playlists", (args, reply) => {
const playlists = LocalPlaylistsManagerService.getInstance();
reply(playlists.importPlaylists(args));
});
ipc.on("install-playlist-file", (args, reply) => {
const playlists = LocalPlaylistsManagerService.getInstance();
const promise = async () => {
const playlist = await lastValueFrom(playlists.writeBPListFile({ bpList: args.bplist, version: args.version, dest: args.dest}));
return playlists.getLocalBPListDetails(playlist);
}
reply(from(promise()));
})
+2 -4
View File
@@ -1,12 +1,10 @@
import { BSVersion } from "shared/bs-version.interface";
import { BSLocalVersionService } from "../services/bs-local-version.service";
import { IpcService } from "../services/ipc.service";
import { from } from "rxjs";
const ipc = IpcService.getInstance();
ipc.on<BSVersion>("bs.uninstall", (req, reply) => {
ipc.on("bs.uninstall", (args, reply) => {
const bsLocalVersionService = BSLocalVersionService.getInstance();
reply(from(bsLocalVersionService.deleteVersion(req.args)));
reply(from(bsLocalVersionService.deleteVersion(args)));
});
@@ -1,47 +1,31 @@
import { BsOculusDownloaderService } from "../../services/bs-version-download/bs-oculus-downloader.service";
import { BsSteamDownloaderService, DownloadInfo, DownloadSteamInfo } from "../../services/bs-version-download/bs-steam-downloader.service";
import { InstallationLocationService } from "../../services/installation-location.service";
import { BsSteamDownloaderService } from "../../services/bs-version-download/bs-steam-downloader.service";
import { IpcService } from "../../services/ipc.service";
import { from, of } from "rxjs";
import { BSLocalVersionService, ImportVersionOptions } from "../../services/bs-local-version.service";
import { of } from "rxjs";
import { BSLocalVersionService } from "../../services/bs-local-version.service";
const ipc = IpcService.getInstance();
ipc.on<ImportVersionOptions>("import-version", (req, reply) => {
ipc.on("import-version", (args, reply) => {
const versionManager = BSLocalVersionService.getInstance();
reply(versionManager.importVersion(req.args));
reply(versionManager.importVersion(args));
});
// #region Steam
ipc.on("is-dotnet-installed", (_, reply) => {
const installer = BsSteamDownloaderService.getInstance();
reply(from(installer.isDotNetInstalled()));
});
ipc.on("bs-download.installation-folder", (_, reply) => {
const installLocation = InstallationLocationService.getInstance();
reply(from(installLocation.installationDirectory()));
});
ipc.on<string>("bs-download.set-installation-folder", (req, reply) => {
const installerService = InstallationLocationService.getInstance();
reply(from(installerService.setInstallationDirectory(req.args)));
});
ipc.on<DownloadSteamInfo>("auto-download-bs-version", (req, reply) => {
ipc.on("auto-download-bs-version", (args, reply) => {
const bsInstaller = BsSteamDownloaderService.getInstance();
reply(bsInstaller.autoDownloadBsVersion(req.args));
reply(bsInstaller.autoDownloadBsVersion(args));
});
ipc.on<DownloadSteamInfo>("download-bs-version", (req, reply) => {
ipc.on("download-bs-version", (args, reply) => {
const bsInstaller = BsSteamDownloaderService.getInstance();
reply(bsInstaller.downloadBsVersion(req.args))
reply(bsInstaller.downloadBsVersion(args))
});
ipc.on<DownloadSteamInfo>("download-bs-version-qr", (req, reply) => {
ipc.on("download-bs-version-qr", (args, reply) => {
const bsInstaller = BsSteamDownloaderService.getInstance();
reply(bsInstaller.downloadBsVersionWithQRCode(req.args))
reply(bsInstaller.downloadBsVersionWithQRCode(args))
});
ipc.on("stop-download-bs-version", (_, reply) => {
@@ -49,23 +33,18 @@ ipc.on("stop-download-bs-version", (_, reply) => {
reply(of(bsInstaller.stopDownload()));
});
ipc.on<string>("send-input-bs-download", (req, reply) => {
ipc.on("send-input-bs-download", (args, reply) => {
const bsInstaller = BsSteamDownloaderService.getInstance();
reply(of(bsInstaller.sendInput(req.args)));
reply(of(bsInstaller.sendInput(args)));
});
// #endregion
// #region Oculus
ipc.on<DownloadInfo>("bs-oculus-download", async (req, reply) => {
ipc.on("bs-oculus-download", async (args, reply) => {
const oculusDownloader = BsOculusDownloaderService.getInstance();
reply(oculusDownloader.downloadVersion(req.args));
});
ipc.on<DownloadInfo>("bs-oculus-auto-download", async (req, reply) => {
const oculusDownloader = BsOculusDownloaderService.getInstance();
reply(oculusDownloader.autoDownloadVersion(req.args));
reply(oculusDownloader.downloadVersion(args));
});
ipc.on("bs-oculus-stop-download", async (_, reply) => {
@@ -73,14 +52,4 @@ ipc.on("bs-oculus-stop-download", async (_, reply) => {
reply(of(oculusDownloader.stopDownload()));
});
ipc.on("bs-oculus-has-auth-token", async (_, reply) => {
const oculusDownloader = BsOculusDownloaderService.getInstance();
reply(from(oculusDownloader.getAuthToken().then(token => !!token)));
});
ipc.on("bs-oculus-clear-auth-token", async (_, reply) => {
const oculusDownloader = BsOculusDownloaderService.getInstance();
reply(from(oculusDownloader.clearAuthToken()));
});
// #endregion
+38 -142
View File
@@ -1,173 +1,69 @@
import { ipcMain, shell } from "electron";
import { UtilsService } from "../services/utils.service";
import { shell } from "electron";
import { BSVersionLibService } from "../services/bs-version-lib.service";
import { BSVersion } from "shared/bs-version.interface";
import { IpcRequest } from "shared/models/ipc";
import { BSLocalVersionService } from "../services/bs-local-version.service";
import { BsmException } from "shared/models/bsm-exception.model";
import { IpcService } from "../services/ipc.service";
import { from } from "rxjs";
import path from "path";
import { pathExist } from "../helpers/fs.helpers";
import { FolderLinkerService, LinkOptions } from "../services/folder-linker.service";
import { LocalMapsManagerService } from "../services/additional-content/local-maps-manager.service";
import { readJSON, writeJSON } from "fs-extra";
import log from "electron-log";
import { VersionLinkerAction } from "renderer/services/version-folder-linker.service";
import { pathExists } from "fs-extra";
import { VersionFolderLinkerService } from "../services/version-folder-linker.service";
const ipc = IpcService.getInstance();
ipcMain.on("bs-version.get-version-dict", (_event, req: IpcRequest<void>) => {
BSVersionLibService.getInstance()
.getAvailableVersions()
.then(versions => {
UtilsService.getInstance().ipcSend(req.responceChannel, { success: true, data: versions });
})
.catch(() => {
UtilsService.getInstance().ipcSend(req.responceChannel, { success: false });
});
ipc.on("bs-version.get-version-dict", (_, reply) => {
const versionsLib = BSVersionLibService.getInstance();
reply(from(versionsLib.getAvailableVersions()));
});
ipcMain.on("bs-version.installed-versions", async (_event, req: IpcRequest<void>) => {
BSLocalVersionService.getInstance()
.getInstalledVersions()
.then(versions => {
UtilsService.getInstance().ipcSend(req.responceChannel, { success: true, data: versions });
})
.catch(() => {
UtilsService.getInstance().ipcSend(req.responceChannel, { success: false });
});
ipc.on("bs-version.installed-versions", (_, reply) => {
const versions = BSLocalVersionService.getInstance();
reply(from(versions.getInstalledVersions()));
});
ipcMain.on("bs-version.open-folder", async (_event, req: IpcRequest<BSVersion>) => {
const localVersionService = BSLocalVersionService.getInstance();
const versionFolder = await localVersionService.getVersionPath(req.args);
if (!(await pathExist(versionFolder))) return;
shell.openPath(versionFolder);
});
ipcMain.on("bs-version.edit", async (__event, req: IpcRequest<{ version: BSVersion; name: string; color: string }>) => {
BSLocalVersionService.getInstance()
.editVersion(req.args.version, req.args.name, req.args.color)
.then(res => {
UtilsService.getInstance().ipcSend(req.responceChannel, { success: !!res, data: res });
})
.catch((error: BsmException) => {
UtilsService.getInstance().ipcSend(req.responceChannel, { success: false, error });
});
});
ipcMain.on("bs-version.clone", async (_event, req: IpcRequest<{ version: BSVersion; name: string; color: string }>) => {
BSLocalVersionService.getInstance()
.cloneVersion(req.args.version, req.args.name, req.args.color)
.then(res => {
UtilsService.getInstance().ipcSend(req.responceChannel, { success: !!res, data: res });
})
.catch((error: BsmException) => {
UtilsService.getInstance().ipcSend(req.responceChannel, { success: false, error });
});
});
ipc.on("get-version-full-path", async (req: IpcRequest<BSVersion>, reply) => {
const localVersions = BSLocalVersionService.getInstance();
reply(from(localVersions.getVersionPath(req.args)));
});
ipc.on("relative-version-path-to-full", async (req: IpcRequest<{ version: BSVersion; relative: string }>, reply) => {
path.isAbsolute(req.args.relative) && reply(from(Promise.resolve(req.args.relative)));
const localVersions = BSLocalVersionService.getInstance();
const promise = localVersions
.getVersionPath(req.args.version)
.catch(() => null)
.then(versionPath => {
return path.join(versionPath, req.args.relative);
});
ipc.on("bs-version.open-folder", (args, reply) => {
const versions = BSLocalVersionService.getInstance();
const promise = versions.getVersionPath(args).then(versionFolder => {
if(!versionFolder || !pathExists(versionFolder)) return;
shell.openPath(versionFolder);
})
reply(from(promise));
});
ipc.on("full-version-path-to-relative", async (req: IpcRequest<{ version: BSVersion; fullPath: string }>, reply) => {
ipc.on("bs-version.edit", (args, reply) => {
const versions = BSLocalVersionService.getInstance();
reply(from(versions.editVersion(args.version, args.name, args.color)));
});
ipc.on("bs-version.clone", (args, reply) => {
const versions = BSLocalVersionService.getInstance();
reply(from(versions.cloneVersion(args.version, args.name, args.color)));
});
ipc.on("get-version-full-path", (args, reply) => {
const localVersions = BSLocalVersionService.getInstance();
const promise = localVersions
.getVersionPath(req.args.version)
.catch(() => null)
.then(versionPath => {
return path.relative(versionPath, req.args.fullPath);
});
reply(from(promise));
reply(from(localVersions.getVersionPath(args)));
});
ipc.on("get-linked-folders", async (req: IpcRequest<{ version: BSVersion; options?: { relative?: boolean } }>, reply) => {
ipc.on("full-version-path-to-relative", (args, reply) => {
const localVersions = BSLocalVersionService.getInstance();
reply(from(localVersions.getVersionPath(args.version).then(versionPath => path.relative(versionPath, args.fullPath))));
});
ipc.on("get-linked-folders", (args, reply) => {
const versionLinker = VersionFolderLinkerService.getInstance();
reply(from(versionLinker.getLinkedFolders(req.args.version, req.args.options)));
reply(from(versionLinker.getLinkedFolders(args.version, args.options)));
});
ipc.on("link-folder", async (req: IpcRequest<{ folder: string; options?: LinkOptions }>, reply) => {
req.args.options ??= {};
const linker = FolderLinkerService.getInstance();
const relativeMapsFolder = path.join(LocalMapsManagerService.LEVELS_ROOT_FOLDER, LocalMapsManagerService.CUSTOM_LEVELS_FOLDER);
if (req.args.folder.includes(relativeMapsFolder)) {
return reply(from(linker.linkFolder(req.args.folder, { keepContents: req.args.options?.keepContents, intermediateFolder: LocalMapsManagerService.SHARED_MAPS_FOLDER })));
}
if (req.args.folder.includes("UserData")) {
req.args.options = { ...req.args.options, backup: true };
}
const res = from(linker.linkFolder(req.args.folder, req.args.options));
const jsonIPAPath = path.join(req.args.folder, "Beat Saber IPA.json");
if (!(await pathExist(jsonIPAPath))) {
return reply(res);
}
await res.toPromise();
try {
const ipaData = (await readJSON(jsonIPAPath)) ?? ({} as any);
ipaData.YeetMods = false;
await writeJSON(jsonIPAPath, ipaData, { spaces: 4 });
} catch (e) {
log.error("Disable YeetMods", e);
}
reply(res);
});
ipc.on("link-version-folder-action", async (req: IpcRequest<VersionLinkerAction>, reply) => {
ipc.on("link-version-folder-action", (args, reply) => {
const versionLinker = VersionFolderLinkerService.getInstance();
reply(from(versionLinker.doAction(req.args)));
reply(from(versionLinker.doAction(args)));
});
ipc.on("is-version-folder-linked", async (req: IpcRequest<{ version: BSVersion; relativeFolder: string }>, reply) => {
ipc.on("is-version-folder-linked", (args, reply) => {
const versionLinker = VersionFolderLinkerService.getInstance();
reply(from(versionLinker.isFolderLinked(req.args.version, req.args.relativeFolder)));
reply(from(versionLinker.isFolderLinked(args.version, args.relativeFolder)));
});
ipc.on("unlink-folder", async (req: IpcRequest<{ folder: string; options?: LinkOptions }>, reply) => {
req.args.options ??= {};
const linker = FolderLinkerService.getInstance();
const relativeMapsFolder = path.join(LocalMapsManagerService.LEVELS_ROOT_FOLDER, LocalMapsManagerService.CUSTOM_LEVELS_FOLDER);
if (req.args.folder.includes(relativeMapsFolder)) {
return reply(from(linker.unlinkFolder(req.args.folder, { ...req.args.options, intermediateFolder: LocalMapsManagerService.SHARED_MAPS_FOLDER })));
}
if (req.args.folder.includes("UserData")) {
req.args.options = { ...req.args.options, backup: true };
}
reply(from(linker.unlinkFolder(req.args.folder, req.args.options)));
});
ipc.on("relink-all-versions-folders", async (req: IpcRequest<void>, reply) => {
ipc.on("relink-all-versions-folders", (_, reply) => {
const versionLinker = VersionFolderLinkerService.getInstance();
reply(from(versionLinker.relinkAllVersionsFolders()));
});
+3 -1
View File
@@ -1,4 +1,5 @@
import "./os-controls-ipcs";
import "./bs-installer-ipcs.ts";
import "./bs-launcher-ipcs";
import "./bs-version-ipcs";
import "./bs-uninstall-ipcs";
@@ -12,4 +13,5 @@ import "./bs-playlist-ipcs";
import "./model-saber.ipcs";
import "./bs-model-ipcs";
import "./bs-version-download/bs-download-ipcs";
import "./oculus.ipcs";
import "./static-configuration.ipcs";
import "./linux.ipcs.ts";

Some files were not shown because too many files have changed in this diff Show More