1/** 备份与恢复 */ 2/** 歌单、插件 */ 3import {compare} from 'compare-versions'; 4import PluginManager from './pluginManager'; 5import MusicSheet from '@/core/musicSheet'; 6 7/** 8 * 结果:一份大的json文件 9 * { 10 * musicSheets: [], 11 * plugins: [], 12 * } 13 */ 14 15interface IBackJson { 16 musicSheets: IMusic.IMusicSheetItem[]; 17 plugins: Array<{srcUrl: string; version: string}>; 18} 19 20function backup() { 21 const musicSheets = MusicSheet.backupSheets(); 22 const plugins = PluginManager.getValidPlugins(); 23 const normalizedPlugins = plugins.map(_ => ({ 24 srcUrl: _.instance.srcUrl, 25 version: _.instance.version, 26 })); 27 28 return JSON.stringify({ 29 musicSheets: musicSheets, 30 plugins: normalizedPlugins, 31 }); 32} 33 34async function resume(raw: string | Object, overwrite?: boolean) { 35 let obj: IBackJson; 36 if (typeof raw === 'string') { 37 obj = JSON.parse(raw); 38 } else { 39 obj = raw as IBackJson; 40 } 41 42 const {plugins, musicSheets} = obj ?? {}; 43 /** 恢复插件 */ 44 const validPlugins = PluginManager.getValidPlugins(); 45 const resumePlugins = plugins?.map(_ => { 46 // 校验是否安装过: 同源且本地版本更高就忽略掉 47 if ( 48 validPlugins.find( 49 plugin => 50 plugin.instance.srcUrl === _.srcUrl && 51 compare( 52 plugin.instance.version ?? '0.0.0', 53 _.version ?? '0.0.1', 54 '>=', 55 ), 56 ) 57 ) { 58 return; 59 } 60 return PluginManager.installPluginFromUrl(_.srcUrl); 61 }); 62 63 /** 恢复歌单 */ 64 const resumeMusicSheets = MusicSheet.resumeSheets(musicSheets, overwrite); 65 66 return Promise.all([...(resumePlugins ?? []), resumeMusicSheets]); 67} 68 69const Backup = { 70 backup, 71 resume, 72}; 73export default Backup; 74