74 lines
2.6 KiB
JavaScript
74 lines
2.6 KiB
JavaScript
// SonicForge Studio Project Storage & .sfs File Service
|
|
(function() {
|
|
const SFS_VERSION = "1.0.0";
|
|
|
|
function exportProjectToSFS(projectState) {
|
|
const sfsBundle = {
|
|
format: "SONICFORGE_STUDIO_PROJECT",
|
|
version: SFS_VERSION,
|
|
timestamp: Date.now(),
|
|
domain: window.location.origin,
|
|
project: {
|
|
id: projectState.id || `proj_${Date.now()}`,
|
|
name: projectState.name || "Dự án mới",
|
|
tracks: (projectState.tracks || []).map(t => ({
|
|
id: t.id,
|
|
name: t.name,
|
|
startTime: t.startTime,
|
|
height: t.height,
|
|
volumeDb: t.volumeDb,
|
|
pan: t.pan,
|
|
muted: t.muted,
|
|
solo: t.solo,
|
|
color: t.color,
|
|
markers: t.markers || [],
|
|
serverFileId: t.serverFileId || null
|
|
}))
|
|
}
|
|
};
|
|
|
|
const jsonStr = JSON.stringify(sfsBundle, null, 2);
|
|
const blob = new Blob([jsonStr], { type: 'application/json' });
|
|
const url = URL.createObjectURL(blob);
|
|
|
|
const a = document.createElement('a');
|
|
a.href = url;
|
|
a.download = `${(projectState.name || 'project').replace(/\s+/g, '_')}.sfs`;
|
|
a.click();
|
|
URL.revokeObjectURL(url);
|
|
}
|
|
|
|
async function importProjectFromSFSFile(file) {
|
|
const text = await file.text();
|
|
const sfsBundle = JSON.parse(text);
|
|
if (sfsBundle.format !== "SONICFORGE_STUDIO_PROJECT") {
|
|
throw new Error("Tệp tin không đúng định dạng .sfs của SonicForge Studio");
|
|
}
|
|
return sfsBundle.project;
|
|
}
|
|
|
|
let autoSaveTimer = null;
|
|
function scheduleTempAutoSave(getProjectStateCallback) {
|
|
if (autoSaveTimer) clearTimeout(autoSaveTimer);
|
|
autoSaveTimer = setTimeout(async () => {
|
|
try {
|
|
const state = getProjectStateCallback();
|
|
if (!state || !state.tracks || state.tracks.length === 0) return;
|
|
const dataJson = JSON.stringify(state);
|
|
localStorage.setItem('sonic_temp_project', dataJson);
|
|
if (window.SonicAPI && localStorage.getItem('sonic_token')) {
|
|
await window.SonicAPI.saveTempProject(dataJson).catch(() => {});
|
|
}
|
|
} catch (e) {
|
|
console.warn("Auto-save temp project warning:", e);
|
|
}
|
|
}, 2000);
|
|
}
|
|
|
|
window.SonicStorage = {
|
|
exportProjectToSFS,
|
|
importProjectFromSFSFile,
|
|
scheduleTempAutoSave
|
|
};
|
|
})();
|