xref: /MusicFree/src/core/backup.ts (revision a7b42a4cb388793e58dcefce06a78fa094acf8de)
134a18328S猫头猫/** 备份与恢复 */
234a18328S猫头猫/** 歌单、插件 */
334a18328S猫头猫import {trimInternalData} from '@/utils/mediaItem';
434a18328S猫头猫import {compare} from 'compare-versions';
534a18328S猫头猫import MusicSheet from './musicSheet';
634a18328S猫头猫import PluginManager from './pluginManager';
734a18328S猫头猫
834a18328S猫头猫/**
934a18328S猫头猫 * 结果:一份大的json文件
1034a18328S猫头猫 * {
1134a18328S猫头猫 *     musicSheets: [],
1234a18328S猫头猫 *     plugins: [],
1334a18328S猫头猫 * }
1434a18328S猫头猫 */
1534a18328S猫头猫
1634a18328S猫头猫interface IBackJson {
1734a18328S猫头猫    musicSheets: ICommon.WithMusicList<IMusic.IMusicSheetItemBase>[];
1834a18328S猫头猫    plugins: Array<{srcUrl: string; version: string}>;
1934a18328S猫头猫}
2034a18328S猫头猫
2134a18328S猫头猫function backup() {
2234a18328S猫头猫    const {musicSheets, sheetMusicMap} = MusicSheet.getSheets();
2334a18328S猫头猫    const normalizedSheets = musicSheets.map(_ => ({
2434a18328S猫头猫        ..._,
2534a18328S猫头猫        musicList: (sheetMusicMap[_.id] ?? []).map(trimInternalData),
2634a18328S猫头猫        coverImg: undefined,
2734a18328S猫头猫    }));
2834a18328S猫头猫    const plugins = PluginManager.getValidPlugins();
2934a18328S猫头猫    const normalizedPlugins = plugins.map(_ => ({
3034a18328S猫头猫        srcUrl: _.instance.srcUrl,
3134a18328S猫头猫        version: _.instance.version,
3234a18328S猫头猫    }));
3334a18328S猫头猫
3434a18328S猫头猫    return JSON.stringify({
3534a18328S猫头猫        musicSheets: normalizedSheets,
3634a18328S猫头猫        plugins: normalizedPlugins,
3734a18328S猫头猫    });
3834a18328S猫头猫}
3934a18328S猫头猫
40*a7b42a4cS猫头猫async function resume(raw: string | Object, overwrite?: boolean) {
4134a18328S猫头猫    let obj: IBackJson;
4234a18328S猫头猫    if (typeof raw === 'string') {
4334a18328S猫头猫        obj = JSON.parse(raw);
4434a18328S猫头猫    } else {
4534a18328S猫头猫        obj = raw as IBackJson;
4634a18328S猫头猫    }
4734a18328S猫头猫    const {plugins, musicSheets} = obj ?? {};
4834a18328S猫头猫    /** 恢复插件 */
4934a18328S猫头猫    const validPlugins = PluginManager.getValidPlugins();
5034a18328S猫头猫    const resumePlugins = plugins?.map(_ => {
5134a18328S猫头猫        // 校验是否安装过: 同源且本地版本更高就忽略掉
5234a18328S猫头猫        if (
5334a18328S猫头猫            validPlugins.find(
5434a18328S猫头猫                plugin =>
5534a18328S猫头猫                    plugin.instance.srcUrl === _.srcUrl &&
5634a18328S猫头猫                    compare(
5734a18328S猫头猫                        plugin.instance.version ?? '0.0.0',
5834a18328S猫头猫                        _.version ?? '0.0.1',
5934a18328S猫头猫                        '>=',
6034a18328S猫头猫                    ),
6134a18328S猫头猫            )
6234a18328S猫头猫        ) {
6334a18328S猫头猫            return;
6434a18328S猫头猫        }
6534a18328S猫头猫        return PluginManager.installPluginFromUrl(_.srcUrl);
6634a18328S猫头猫    });
6734a18328S猫头猫    /** 恢复歌单 */
68*a7b42a4cS猫头猫    const resumeMusicSheets = MusicSheet.resumeSheets(musicSheets, overwrite);
6934a18328S猫头猫
70d95a8544S猫头猫    return Promise.all([...(resumePlugins ?? []), resumeMusicSheets]);
7134a18328S猫头猫}
7234a18328S猫头猫
7334a18328S猫头猫const Backup = {
7434a18328S猫头猫    backup,
7534a18328S猫头猫    resume,
7634a18328S猫头猫};
7734a18328S猫头猫export default Backup;
78