xref: /MusicFree/src/core/backup.ts (revision e5a0c4d718dd8de014c792b182a6f4128092b88f)
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) {
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);
69
70    return Promise.all([...(resumePlugins ?? []), resumeMusicSheets]);
71}
72
73const Backup = {
74    backup,
75    resume,
76};
77export default Backup;
78