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
|
// Initialize ConfigManager first to load config.json and user settings
|
||||||
await ConfigManager.instance().initialize();
|
await ConfigManager.instance().initialize();
|
||||||
|
|
||||||
// Check for kgone-server.txt (managed deployment override)
|
// Check for kgone-server.json (managed deployment override)
|
||||||
try {
|
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') ?? '';
|
const contentType = kgoneServerResponse.headers.get('Content-Type') ?? '';
|
||||||
if (kgoneServerResponse.ok && contentType.includes('text/plain')) {
|
if (kgoneServerResponse.ok && contentType.includes('application/json')) {
|
||||||
const url = (await kgoneServerResponse.text()).trim();
|
const data = await kgoneServerResponse.json();
|
||||||
if (url) {
|
if (data.base_url) {
|
||||||
ConfigManager.instance().setKGOneManagedByServer(url);
|
ConfigManager.instance().setKGOneManagedByServer(data.base_url);
|
||||||
console.log('K.G.One: server-managed config loaded from kgone-server.txt, base URL:', 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 {
|
} catch {
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ const GeneralSettings: React.FC = () => {
|
|||||||
const [kgoneEnabled, setKgoneEnabled] = useState<boolean>(false);
|
const [kgoneEnabled, setKgoneEnabled] = useState<boolean>(false);
|
||||||
const [kgoneBaseUrl, setKgoneBaseUrl] = useState<string>('');
|
const [kgoneBaseUrl, setKgoneBaseUrl] = useState<string>('');
|
||||||
const [kgoneServerManaged, setKgoneServerManaged] = useState<boolean>(false);
|
const [kgoneServerManaged, setKgoneServerManaged] = useState<boolean>(false);
|
||||||
|
const [soundfontServerManaged, setSoundfontServerManaged] = useState<boolean>(false);
|
||||||
|
|
||||||
const configManager = ConfigManager.instance();
|
const configManager = ConfigManager.instance();
|
||||||
|
|
||||||
@@ -64,6 +65,7 @@ const GeneralSettings: React.FC = () => {
|
|||||||
setKgoneEnabled((configManager.get('general.kgone.enabled') as boolean) ?? false);
|
setKgoneEnabled((configManager.get('general.kgone.enabled') as boolean) ?? false);
|
||||||
setKgoneBaseUrl((configManager.get('general.kgone.base_url') as string) || '');
|
setKgoneBaseUrl((configManager.get('general.kgone.base_url') as string) || '');
|
||||||
setKgoneServerManaged(configManager.isKGOneServerManaged());
|
setKgoneServerManaged(configManager.isKGOneServerManaged());
|
||||||
|
setSoundfontServerManaged(configManager.isSoundfontServerManaged());
|
||||||
};
|
};
|
||||||
|
|
||||||
loadConfig();
|
loadConfig();
|
||||||
@@ -472,6 +474,12 @@ const GeneralSettings: React.FC = () => {
|
|||||||
<div className="settings-group">
|
<div className="settings-group">
|
||||||
<h4>Soundfont Settings</h4>
|
<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">
|
<div className="settings-item">
|
||||||
<label className="settings-label">
|
<label className="settings-label">
|
||||||
Base URL
|
Base URL
|
||||||
@@ -482,9 +490,20 @@ const GeneralSettings: React.FC = () => {
|
|||||||
placeholder="e.g. https://cdn.jsdelivr.net/npm/soundfont-for-samplers/FluidR3_GM/"
|
placeholder="e.g. https://cdn.jsdelivr.net/npm/soundfont-for-samplers/FluidR3_GM/"
|
||||||
value={soundfontBaseUrl}
|
value={soundfontBaseUrl}
|
||||||
onChange={(e) => handleSoundfontBaseUrlChange(e.target.value)}
|
onChange={(e) => handleSoundfontBaseUrlChange(e.target.value)}
|
||||||
|
disabled={soundfontServerManaged}
|
||||||
/>
|
/>
|
||||||
<div className="settings-help" style={{ fontSize: '12px', color: '#888', marginTop: '4px' }}>
|
<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>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -494,7 +513,7 @@ const GeneralSettings: React.FC = () => {
|
|||||||
|
|
||||||
{kgoneServerManaged && (
|
{kgoneServerManaged && (
|
||||||
<div className="settings-help" style={{ fontSize: '12px', color: '#888', marginTop: '4px', marginBottom: '8px' }}>
|
<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>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
|||||||
@@ -105,6 +105,7 @@ export class ConfigManager {
|
|||||||
private storage: KGConfigStorage;
|
private storage: KGConfigStorage;
|
||||||
private isInitialized: boolean = false;
|
private isInitialized: boolean = false;
|
||||||
private kgoneServerManaged: boolean = false;
|
private kgoneServerManaged: boolean = false;
|
||||||
|
private soundfontServerManaged: boolean = false;
|
||||||
private defaultConfig: AppConfig | null = null;
|
private defaultConfig: AppConfig | null = null;
|
||||||
private changeListeners: Set<(changedKeys: string[]) => void> = new Set();
|
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).
|
* Forces enabled=true and overrides base_url in-memory only (not persisted).
|
||||||
*/
|
*/
|
||||||
public setKGOneManagedByServer(url: string): void {
|
public setKGOneManagedByServer(url: string): void {
|
||||||
@@ -572,6 +573,20 @@ export class ConfigManager {
|
|||||||
return this.kgoneServerManaged;
|
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
|
* Get the default configuration
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user