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