xref: /MusicFree/src/core/backup.ts (revision 34a183286339f55cf670776aaa7d5304a9aa4220)
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