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