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