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