feat: allow kgone-server.json to override the kgone server base url and soundfont base url
This commit is contained in:
+11
-7
@@ -60,15 +60,19 @@ function App() {
|
||||
// Initialize ConfigManager first to load config.json and user settings
|
||||
await ConfigManager.instance().initialize();
|
||||
|
||||
// Check for kgone-server.txt (managed deployment override)
|
||||
// Check for kgone-server.json (managed deployment override)
|
||||
try {
|
||||
const kgoneServerResponse = await fetch(`${import.meta.env.BASE_URL}kgone-server.txt`);
|
||||
const kgoneServerResponse = await fetch(`${import.meta.env.BASE_URL}kgone-server.json?ts=${Date.now()}`);
|
||||
const contentType = kgoneServerResponse.headers.get('Content-Type') ?? '';
|
||||
if (kgoneServerResponse.ok && contentType.includes('text/plain')) {
|
||||
const url = (await kgoneServerResponse.text()).trim();
|
||||
if (url) {
|
||||
ConfigManager.instance().setKGOneManagedByServer(url);
|
||||
console.log('K.G.One: server-managed config loaded from kgone-server.txt, base URL:', url);
|
||||
if (kgoneServerResponse.ok && contentType.includes('application/json')) {
|
||||
const data = await kgoneServerResponse.json();
|
||||
if (data.base_url) {
|
||||
ConfigManager.instance().setKGOneManagedByServer(data.base_url);
|
||||
console.log('K.G.One: server-managed config loaded from kgone-server.json, base URL:', data.base_url);
|
||||
}
|
||||
if (data.soundfont) {
|
||||
ConfigManager.instance().setSoundfontManagedByServer(data.soundfont);
|
||||
console.log('Soundfont: server-managed config loaded from kgone-server.json, base URL:', data.soundfont);
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
|
||||
@@ -21,6 +21,7 @@ const GeneralSettings: React.FC = () => {
|
||||
const [kgoneEnabled, setKgoneEnabled] = useState<boolean>(false);
|
||||
const [kgoneBaseUrl, setKgoneBaseUrl] = useState<string>('');
|
||||
const [kgoneServerManaged, setKgoneServerManaged] = useState<boolean>(false);
|
||||
const [soundfontServerManaged, setSoundfontServerManaged] = useState<boolean>(false);
|
||||
|
||||
const configManager = ConfigManager.instance();
|
||||
|
||||
@@ -64,6 +65,7 @@ const GeneralSettings: React.FC = () => {
|
||||
setKgoneEnabled((configManager.get('general.kgone.enabled') as boolean) ?? false);
|
||||
setKgoneBaseUrl((configManager.get('general.kgone.base_url') as string) || '');
|
||||
setKgoneServerManaged(configManager.isKGOneServerManaged());
|
||||
setSoundfontServerManaged(configManager.isSoundfontServerManaged());
|
||||
};
|
||||
|
||||
loadConfig();
|
||||
@@ -472,6 +474,12 @@ const GeneralSettings: React.FC = () => {
|
||||
<div className="settings-group">
|
||||
<h4>Soundfont Settings</h4>
|
||||
|
||||
{soundfontServerManaged && (
|
||||
<div className="settings-help" style={{ fontSize: '12px', color: '#888', marginTop: '4px', marginBottom: '8px' }}>
|
||||
Soundfont configuration is managed by the server (kgone-server.json). Settings are read-only.
|
||||
</div>
|
||||
)}
|
||||
|
||||
<div className="settings-item">
|
||||
<label className="settings-label">
|
||||
Base URL
|
||||
@@ -482,9 +490,20 @@ const GeneralSettings: React.FC = () => {
|
||||
placeholder="e.g. https://cdn.jsdelivr.net/npm/soundfont-for-samplers/FluidR3_GM/"
|
||||
value={soundfontBaseUrl}
|
||||
onChange={(e) => handleSoundfontBaseUrlChange(e.target.value)}
|
||||
disabled={soundfontServerManaged}
|
||||
/>
|
||||
<div className="settings-help" style={{ fontSize: '12px', color: '#888', marginTop: '4px' }}>
|
||||
Changing this URL to an incompatible soundfont source may cause some instruments to sound wrong or not play.
|
||||
Changing this URL to an incompatible soundfont source may cause some instruments to sound wrong or not play.{' '}
|
||||
<a
|
||||
href="#"
|
||||
onClick={(e) => {
|
||||
e.preventDefault();
|
||||
handleSoundfontBaseUrlChange('https://cdn.jsdelivr.net/npm/soundfont-for-samplers/FluidR3_GM/');
|
||||
}}
|
||||
style={{ color: '#646cff', textDecoration: 'underline', cursor: 'pointer' }}
|
||||
>
|
||||
Restore default
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -494,7 +513,7 @@ const GeneralSettings: React.FC = () => {
|
||||
|
||||
{kgoneServerManaged && (
|
||||
<div className="settings-help" style={{ fontSize: '12px', color: '#888', marginTop: '4px', marginBottom: '8px' }}>
|
||||
K.G.One configuration is managed by the server (kgone-server.txt). Settings are read-only.
|
||||
K.G.One configuration is managed by the server (kgone-server.json). Settings are read-only.
|
||||
</div>
|
||||
)}
|
||||
|
||||
|
||||
@@ -105,6 +105,7 @@ export class ConfigManager {
|
||||
private storage: KGConfigStorage;
|
||||
private isInitialized: boolean = false;
|
||||
private kgoneServerManaged: boolean = false;
|
||||
private soundfontServerManaged: boolean = false;
|
||||
private defaultConfig: AppConfig | null = null;
|
||||
private changeListeners: Set<(changedKeys: string[]) => void> = new Set();
|
||||
|
||||
@@ -558,7 +559,7 @@ export class ConfigManager {
|
||||
}
|
||||
|
||||
/**
|
||||
* Called at startup when kgone-server.txt is found.
|
||||
* Called at startup when kgone-server.json contains a base_url field.
|
||||
* Forces enabled=true and overrides base_url in-memory only (not persisted).
|
||||
*/
|
||||
public setKGOneManagedByServer(url: string): void {
|
||||
@@ -572,6 +573,20 @@ export class ConfigManager {
|
||||
return this.kgoneServerManaged;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called at startup when kgone-server.json contains a soundfont field.
|
||||
* Overrides general.soundfont.base_url in-memory only (not persisted).
|
||||
*/
|
||||
public setSoundfontManagedByServer(url: string): void {
|
||||
this.soundfontServerManaged = true;
|
||||
this.setInObject(this.config as Record<string, unknown>, 'general.soundfont.base_url', url);
|
||||
this.notifyChangeListeners(['general.soundfont.base_url']);
|
||||
}
|
||||
|
||||
public isSoundfontServerManaged(): boolean {
|
||||
return this.soundfontServerManaged;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the default configuration
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user