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