xref: /MusicFree/src/core/backup.ts (revision 740e39476f71e0e17304d812ac0a4c4cdc183ed1)
134a18328S猫头猫/** 备份与恢复 */
234a18328S猫头猫/** 歌单、插件 */
334a18328S猫头猫import {compare} from 'compare-versions';
434a18328S猫头猫import PluginManager from './pluginManager';
5*740e3947S猫头猫import MusicSheet from '@/core/musicSheet';
634a18328S猫头猫
734a18328S猫头猫/**
834a18328S猫头猫 * 结果:一份大的json文件
934a18328S猫头猫 * {
1034a18328S猫头猫 *     musicSheets: [],
1134a18328S猫头猫 *     plugins: [],
1234a18328S猫头猫 * }
1334a18328S猫头猫 */
1434a18328S猫头猫
1534a18328S猫头猫interface IBackJson {
16*740e3947S猫头猫    musicSheets: IMusic.IMusicSheetItem[];
1734a18328S猫头猫    plugins: Array<{srcUrl: string; version: string}>;
1834a18328S猫头猫}
1934a18328S猫头猫
2034a18328S猫头猫function backup() {
21*740e3947S猫头猫    const musicSheets = MusicSheet.backupSheets();
2234a18328S猫头猫    const plugins = PluginManager.getValidPlugins();
2334a18328S猫头猫    const normalizedPlugins = plugins.map(_ => ({
2434a18328S猫头猫        srcUrl: _.instance.srcUrl,
2534a18328S猫头猫        version: _.instance.version,
2634a18328S猫头猫    }));
2734a18328S猫头猫
2834a18328S猫头猫    return JSON.stringify({
29*740e3947S猫头猫        musicSheets: musicSheets,
3034a18328S猫头猫        plugins: normalizedPlugins,
3134a18328S猫头猫    });
3234a18328S猫头猫}
3334a18328S猫头猫
34a7b42a4cS猫头猫async function resume(raw: string | Object, overwrite?: boolean) {
3534a18328S猫头猫    let obj: IBackJson;
3634a18328S猫头猫    if (typeof raw === 'string') {
3734a18328S猫头猫        obj = JSON.parse(raw);
3834a18328S猫头猫    } else {
3934a18328S猫头猫        obj = raw as IBackJson;
4034a18328S猫头猫    }
41*740e3947S猫头猫
4234a18328S猫头猫    const {plugins, musicSheets} = obj ?? {};
4334a18328S猫头猫    /** 恢复插件 */
4434a18328S猫头猫    const validPlugins = PluginManager.getValidPlugins();
4534a18328S猫头猫    const resumePlugins = plugins?.map(_ => {
4634a18328S猫头猫        // 校验是否安装过: 同源且本地版本更高就忽略掉
4734a18328S猫头猫        if (
4834a18328S猫头猫            validPlugins.find(
4934a18328S猫头猫                plugin =>
5034a18328S猫头猫                    plugin.instance.srcUrl === _.srcUrl &&
5134a18328S猫头猫                    compare(
5234a18328S猫头猫                        plugin.instance.version ?? '0.0.0',
5334a18328S猫头猫                        _.version ?? '0.0.1',
5434a18328S猫头猫                        '>=',
5534a18328S猫头猫                    ),
5634a18328S猫头猫            )
5734a18328S猫头猫        ) {
5834a18328S猫头猫            return;
5934a18328S猫头猫        }
6034a18328S猫头猫        return PluginManager.installPluginFromUrl(_.srcUrl);
6134a18328S猫头猫    });
62*740e3947S猫头猫
6334a18328S猫头猫    /** 恢复歌单 */
64a7b42a4cS猫头猫    const resumeMusicSheets = MusicSheet.resumeSheets(musicSheets, overwrite);
6534a18328S猫头猫
66d95a8544S猫头猫    return Promise.all([...(resumePlugins ?? []), resumeMusicSheets]);
6734a18328S猫头猫}
6834a18328S猫头猫
6934a18328S猫头猫const Backup = {
7034a18328S猫头猫    backup,
7134a18328S猫头猫    resume,
7234a18328S猫头猫};
7334a18328S猫头猫export default Backup;
74