xref: /MusicFree/src/core/backup.ts (revision adf41771e5c3ca7c27879b461cece7e444d1dc58)
134a18328S猫头猫/** 备份与恢复 */
234a18328S猫头猫/** 歌单、插件 */
334a18328S猫头猫import {compare} from 'compare-versions';
434a18328S猫头猫import PluginManager from './pluginManager';
5740e3947S猫头猫import MusicSheet from '@/core/musicSheet';
6*adf41771S猫头猫import {ResumeMode} from '@/constants/commonConst.ts';
734a18328S猫头猫
834a18328S猫头猫/**
934a18328S猫头猫 * 结果:一份大的json文件
1034a18328S猫头猫 * {
1134a18328S猫头猫 *     musicSheets: [],
1234a18328S猫头猫 *     plugins: [],
1334a18328S猫头猫 * }
1434a18328S猫头猫 */
1534a18328S猫头猫
1634a18328S猫头猫interface IBackJson {
17740e3947S猫头猫    musicSheets: IMusic.IMusicSheetItem[];
1834a18328S猫头猫    plugins: Array<{srcUrl: string; version: string}>;
1934a18328S猫头猫}
2034a18328S猫头猫
2134a18328S猫头猫function backup() {
22740e3947S猫头猫    const musicSheets = MusicSheet.backupSheets();
2334a18328S猫头猫    const plugins = PluginManager.getValidPlugins();
2434a18328S猫头猫    const normalizedPlugins = plugins.map(_ => ({
2534a18328S猫头猫        srcUrl: _.instance.srcUrl,
2634a18328S猫头猫        version: _.instance.version,
2734a18328S猫头猫    }));
2834a18328S猫头猫
2934a18328S猫头猫    return JSON.stringify({
30740e3947S猫头猫        musicSheets: musicSheets,
3134a18328S猫头猫        plugins: normalizedPlugins,
3234a18328S猫头猫    });
3334a18328S猫头猫}
3434a18328S猫头猫
35*adf41771S猫头猫async function resume(
36*adf41771S猫头猫    raw: string | Object,
37*adf41771S猫头猫    resumeMode: ResumeMode = ResumeMode.Append,
38*adf41771S猫头猫) {
3934a18328S猫头猫    let obj: IBackJson;
4034a18328S猫头猫    if (typeof raw === 'string') {
4134a18328S猫头猫        obj = JSON.parse(raw);
4234a18328S猫头猫    } else {
4334a18328S猫头猫        obj = raw as IBackJson;
4434a18328S猫头猫    }
45740e3947S猫头猫
4634a18328S猫头猫    const {plugins, musicSheets} = obj ?? {};
4734a18328S猫头猫    /** 恢复插件 */
4834a18328S猫头猫    const validPlugins = PluginManager.getValidPlugins();
4934a18328S猫头猫    const resumePlugins = plugins?.map(_ => {
5034a18328S猫头猫        // 校验是否安装过: 同源且本地版本更高就忽略掉
5134a18328S猫头猫        if (
5234a18328S猫头猫            validPlugins.find(
5334a18328S猫头猫                plugin =>
5434a18328S猫头猫                    plugin.instance.srcUrl === _.srcUrl &&
5534a18328S猫头猫                    compare(
5634a18328S猫头猫                        plugin.instance.version ?? '0.0.0',
5734a18328S猫头猫                        _.version ?? '0.0.1',
5834a18328S猫头猫                        '>=',
5934a18328S猫头猫                    ),
6034a18328S猫头猫            )
6134a18328S猫头猫        ) {
6234a18328S猫头猫            return;
6334a18328S猫头猫        }
6434a18328S猫头猫        return PluginManager.installPluginFromUrl(_.srcUrl);
6534a18328S猫头猫    });
66740e3947S猫头猫
6734a18328S猫头猫    /** 恢复歌单 */
68*adf41771S猫头猫    const resumeMusicSheets = MusicSheet.resumeSheets(musicSheets, resumeMode);
6934a18328S猫头猫
70d95a8544S猫头猫    return Promise.all([...(resumePlugins ?? []), resumeMusicSheets]);
7134a18328S猫头猫}
7234a18328S猫头猫
7334a18328S猫头猫const Backup = {
7434a18328S猫头猫    backup,
7534a18328S猫头猫    resume,
7634a18328S猫头猫};
7734a18328S猫头猫export default Backup;
78