diff --git a/.eslintrc.json b/.eslintrc.json
index deb72d6..bc41be2 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -90,15 +90,7 @@
"plugins": ["prettier"],
"extends": ["plugin:prettier/recommended"],
"rules": {
- "prettier/prettier": ["error", {
- "parser": "angular",
- "endOfLine": "auto",
- "printWidth": 150,
- "useTabs": true,
- "singleQuote": true,
- "htmlWhitespaceSensitivity": "css",
- "bracketSameLine": true
- }]
+ "prettier/prettier": ["error"]
}
},
{
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 0000000..3659c7d
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,9 @@
+{
+ "parser": "angular",
+ "endOfLine": "auto",
+ "printWidth": 150,
+ "useTabs": true,
+ "singleQuote": true,
+ "htmlWhitespaceSensitivity": "css",
+ "bracketSameLine": true
+}
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
index 2268a32..51015ce 100644
--- a/.vscode/extensions.json
+++ b/.vscode/extensions.json
@@ -1,11 +1,10 @@
{
- "recommendations": [
- "dbaeumer.vscode-eslint",
- "mike-co.import-sorter",
- "sibiraj-s.vscode-scss-formatter",
- "hbenl.vscode-mocha-test-adapter",
- "angular.ng-template",
- "bradlc.vscode-tailwindcss",
- "csstools.postcss"
- ]
+ "recommendations": [
+ "dbaeumer.vscode-eslint",
+ "mike-co.import-sorter",
+ "hbenl.vscode-mocha-test-adapter",
+ "angular.ng-template",
+ "bradlc.vscode-tailwindcss",
+ "csstools.postcss"
+ ]
}
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 218cd5e..9928278 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -22,7 +22,7 @@
"files.trimTrailingWhitespace": false
},
"[html]": {
- "editor.defaultFormatter": "vscode.html-language-features",
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit"
}
diff --git a/README.md b/README.md
index d80cd97..60d9f7b 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@
-**Bridge** is a desktop application that allows you to search for and download charts that can be played in games like Clone Hero, YARG, etc...
+**Bridge** is a desktop application that allows you to search for and download charts that can be played in games like Clone Hero, YARG, etc...
This is the desktop version of [Chorus Encore](https://www.enchor.us/).
@@ -23,6 +23,7 @@ Head over to the [Releases](https://github.com/Geomitron/Bridge/releases) page t
- ✅ A variety of themes.
- ✅ Advanced song search.
- ✅ Chart issue scanner (for people making charts).
+- ✅ Auto generate difficulties for songs. (Experimental)
### What's new in v3.4.0
diff --git a/package.json b/package.json
index e3effea..1eedf2b 100644
--- a/package.json
+++ b/package.json
@@ -18,11 +18,12 @@
"scripts": {
"start": "concurrently \"npm run start:angular\" \"npm run start:electron\" -n angular,electron -c red,yellow",
"start:angular": "ng serve",
- "start:electron": "nodemon --exec \"tsc -p src-electron/tsconfig.electron.json && node src-electron/rename-to-mjs.js && electron ./dist/electron/src-electron/main.js --dev\" --watch src-electron/ -e ts",
+ "start:electron": "nodemon --exec \"tsc -p src-electron/tsconfig.electron.json && node src-electron/rename-to-mjs.js && electron ./dist/electron/src-electron/main.js --no-sandbox --dev\" --watch src-electron/ -e ts",
"build:windows": "ng build -c production && tsc -p src-electron/tsconfig.electron.json && node src-electron/rename-to-mjs.js && electron-builder build --windows",
"build:mac": "ng build -c production && tsc -p src-electron/tsconfig.electron.json && node src-electron/rename-to-mjs.js && electron-builder build --mac",
"build:linux": "ng build -c production && tsc -p src-electron/tsconfig.electron.json && node src-electron/rename-to-mjs.js && electron-builder build --linux",
- "release": "ng build -c production && tsc -p src-electron/tsconfig.electron.json && node src-electron/rename-to-mjs.js && electron-builder build"
+ "release": "ng build -c production && tsc -p src-electron/tsconfig.electron.json && node src-electron/rename-to-mjs.js && electron-builder build",
+ "lint": "eslint . --ext .ts,.html"
},
"dependencies": {
"@angular/animations": "19.2.1",
@@ -45,6 +46,7 @@
"exceljs": "^4.4.0",
"fs-extra": "11.2.0",
"lodash": "4.17.21",
+ "midi-file": "^1.2.4",
"parse-sng": "4.0.3",
"rxjs": "7.8.1",
"sanitize-filename": "1.6.3",
@@ -92,6 +94,7 @@
},
"pnpm": {
"onlyBuiltDependencies": [
+ "@parcel/watcher",
"electron",
"esbuild",
"exifreader",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 8f2e677..d7cd02e 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -68,6 +68,9 @@ importers:
lodash:
specifier: 4.17.21
version: 4.17.21
+ midi-file:
+ specifier: ^1.2.4
+ version: 1.2.4
parse-sng:
specifier: 4.0.3
version: 4.0.3
diff --git a/src-angular/app/components/browse/search-bar/search-bar.component.html b/src-angular/app/components/browse/search-bar/search-bar.component.html
index 9f469f9..85b5078 100644
--- a/src-angular/app/components/browse/search-bar/search-bar.component.html
+++ b/src-angular/app/components/browse/search-bar/search-bar.component.html
@@ -13,7 +13,7 @@
}
-
+
+ @if (settingsService.generateMissingDifficulties) {
+
+
+ Missing Difficulties Generation is enabled
+
+ }
@if (instrument === 'drums') {
@@ -123,34 +129,70 @@
- |
- |
- |
+
+
+ |
+
+
+ |
+
+
+ |
- |
- |
- |
+
+
+ |
+
+
+ |
+
+
+ |
- |
- |
- |
+
+
+ |
+
+
+ |
+
+
+ |
- |
- |
- |
+
+
+ |
+
+
+ |
+
+
+ |
- |
- |
- |
+
+
+ |
+
+
+ |
+
+
+ |
- |
- |
- |
+
+
+ |
+
+
+ |
+
+
+ |
diff --git a/src-angular/app/components/browse/search-bar/search-bar.component.ts b/src-angular/app/components/browse/search-bar/search-bar.component.ts
index ab62531..18492c5 100644
--- a/src-angular/app/components/browse/search-bar/search-bar.component.ts
+++ b/src-angular/app/components/browse/search-bar/search-bar.component.ts
@@ -5,6 +5,7 @@ import dayjs from 'dayjs'
import { distinctUntilChanged, switchMap, throttleTime } from 'rxjs'
import { Difficulty, Instrument } from 'scan-chart'
import { SearchService } from 'src-angular/app/core/services/search.service'
+import { SettingsService } from 'src-angular/app/core/services/settings.service'
import { difficulties, difficultyDisplay, drumsReviewedDisplay, drumTypeDisplay, DrumTypeName, drumTypeNames, instrumentDisplay, instruments } from 'src-shared/UtilFunctions'
@Component({
@@ -38,6 +39,7 @@ export class SearchBarComponent implements OnInit, AfterViewInit {
constructor(
private searchService: SearchService,
private fb: FormBuilder,
+ public settingsService: SettingsService,
) { }
ngOnInit() {
diff --git a/src-angular/app/components/settings/settings.component.html b/src-angular/app/components/settings/settings.component.html
index c4408a0..40aecbd 100644
--- a/src-angular/app/components/settings/settings.component.html
+++ b/src-angular/app/components/settings/settings.component.html
@@ -1,4 +1,4 @@
-
+
+
+
-
-
-
-
-
-
-
+
diff --git a/src-angular/app/components/settings/settings.component.ts b/src-angular/app/components/settings/settings.component.ts
index 447b2c7..08f50bf 100644
--- a/src-angular/app/components/settings/settings.component.ts
+++ b/src-angular/app/components/settings/settings.component.ts
@@ -1,4 +1,4 @@
-import { ChangeDetectorRef, Component, ElementRef, OnInit, ViewChild } from '@angular/core'
+import { ChangeDetectorRef, Component, ElementRef, HostBinding, OnInit, ViewChild } from '@angular/core'
import { FormControl } from '@angular/forms'
import _ from 'lodash'
@@ -11,12 +11,15 @@ import { themes } from 'src-shared/Settings'
standalone: false,
})
export class SettingsComponent implements OnInit {
+ @HostBinding('class.contents') contents = true
+
@ViewChild('themeDropdown', { static: true }) themeDropdown: ElementRef
public chartFolderName: FormControl
public isSng: FormControl
public downloadVideos: FormControl
public isCompactTable: FormControl
+ public generateMissingDifficulties: FormControl
public artistColumn: FormControl
public albumColumn: FormControl
@@ -49,6 +52,8 @@ export class SettingsComponent implements OnInit {
this.isSng.valueChanges.subscribe(value => settingsService.isSng = value)
this.downloadVideos = new FormControl(ss.downloadVideos, { nonNullable: true })
this.downloadVideos.valueChanges.subscribe(value => settingsService.downloadVideos = value)
+ this.generateMissingDifficulties = new FormControl(ss.generateMissingDifficulties, { nonNullable: true })
+ this.generateMissingDifficulties.valueChanges.subscribe(value => settingsService.generateMissingDifficulties = value)
this.isCompactTable = new FormControl(settingsService.isCompactTable, { nonNullable: true })
this.isCompactTable.valueChanges.subscribe(value => ss.isCompactTable = value)
diff --git a/src-angular/app/components/tools/tools.component.html b/src-angular/app/components/tools/tools.component.html
index d3f3509..4aeaa46 100644
--- a/src-angular/app/components/tools/tools.component.html
+++ b/src-angular/app/components/tools/tools.component.html
@@ -1,62 +1,109 @@
-
-
Chart issue scanning
-
-
-
-
-