xref: /MusicFree/src/entry/bootstrap.ts (revision cfa0fc0757dad620cd0b0533a949d86b17086d32)
1242960d3S猫头猫import MusicQueue from '@/core/musicQueue';
2e14deecfS猫头猫import MusicSheet from '@/core/musicSheet';
3bf6e62f2S猫头猫import {check, PERMISSIONS, request} from 'react-native-permissions';
4bf6e62f2S猫头猫import TrackPlayer, {Capability} from 'react-native-track-player';
5bf6e62f2S猫头猫import 'react-native-get-random-values';
6e22d5e4fS猫头猫import Config from '@/core/config';
70d39db21S猫头猫import RNBootSplash from 'react-native-bootsplash';
8e14deecfS猫头猫import Download from '@/core/download';
96780f402S猫头猫import pathConst from '@/constants/pathConst';
10be0a3650S猫头猫import {checkAndCreateDir} from '@/utils/fileUtils';
11242960d3S猫头猫import {errorLog} from '@/utils/log';
1228bde18bS猫头猫import MediaMeta from '@/core/mediaMeta';
133d6d339aS猫头猫import Cache from '@/core/cache';
14927dbe93S猫头猫import PluginManager from '@/core/pluginManager';
15bf6e62f2S猫头猫
168b88e961S猫头猫/** app加载前执行
178b88e961S猫头猫 * 1. 检查权限
188b88e961S猫头猫 * 2. 数据初始化
198b88e961S猫头猫 * 3.
208b88e961S猫头猫 */
2194a1b1fcS猫头猫async function _bootstrap() {
22927dbe93S猫头猫    // 1. 检查权限
23bf6e62f2S猫头猫    const [readStoragePermission, writeStoragePermission] = await Promise.all([
24bf6e62f2S猫头猫        check(PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE),
25bf6e62f2S猫头猫        check(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE),
26bf6e62f2S猫头猫    ]);
27bf6e62f2S猫头猫    if (
28bf6e62f2S猫头猫        !(
29bf6e62f2S猫头猫            readStoragePermission === 'granted' &&
30bf6e62f2S猫头猫            writeStoragePermission === 'granted'
31bf6e62f2S猫头猫        )
32bf6e62f2S猫头猫    ) {
33bf6e62f2S猫头猫        await request(PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE);
34bf6e62f2S猫头猫        await request(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE);
35bf6e62f2S猫头猫    }
36bf6e62f2S猫头猫
37927dbe93S猫头猫    // 2. 数据初始化
386780f402S猫头猫    /** 初始化路径 */
396780f402S猫头猫    await setupFolder();
40bf6e62f2S猫头猫    // 加载配置
414060c00aS猫头猫    await Promise.all([Config.setup(), MediaMeta.setup(), MusicSheet.setup()]);
42bf6e62f2S猫头猫    // 加载插件
4394a1b1fcS猫头猫    try {
44*cfa0fc07S猫头猫        await TrackPlayer.setupPlayer({
45*cfa0fc07S猫头猫            maxCacheSize: 1024 * 1024 * 512,
46*cfa0fc07S猫头猫        });
4794a1b1fcS猫头猫    } catch (e: any) {
4894a1b1fcS猫头猫        if (
494060c00aS猫头猫            e?.message !==
504060c00aS猫头猫            'The player has already been initialized via setupPlayer.'
5194a1b1fcS猫头猫        ) {
5294a1b1fcS猫头猫            throw e;
5394a1b1fcS猫头猫        }
5494a1b1fcS猫头猫    }
55bf6e62f2S猫头猫    await TrackPlayer.updateOptions({
5694a1b1fcS猫头猫        progressUpdateEventInterval: 0.4,
57bf6e62f2S猫头猫        stopWithApp: false,
58bf6e62f2S猫头猫        alwaysPauseOnInterruption: true,
59bf6e62f2S猫头猫        capabilities: [
60bf6e62f2S猫头猫            Capability.Play,
61bf6e62f2S猫头猫            Capability.Pause,
62bf6e62f2S猫头猫            Capability.SkipToNext,
63bf6e62f2S猫头猫            Capability.SkipToPrevious,
64bf6e62f2S猫头猫        ],
65bf6e62f2S猫头猫        compactCapabilities: [
66bf6e62f2S猫头猫            Capability.Play,
67bf6e62f2S猫头猫            Capability.Pause,
68bf6e62f2S猫头猫            Capability.SkipToNext,
69bf6e62f2S猫头猫            Capability.SkipToPrevious,
70bf6e62f2S猫头猫        ],
71bf6e62f2S猫头猫        notificationCapabilities: [
72bf6e62f2S猫头猫            Capability.Play,
73bf6e62f2S猫头猫            Capability.Pause,
74bf6e62f2S猫头猫            Capability.SkipToNext,
75bf6e62f2S猫头猫            Capability.SkipToPrevious,
760d39db21S猫头猫        ],
770d39db21S猫头猫    });
784060c00aS猫头猫    await Cache.setup();
79e14deecfS猫头猫    await Download.setup();
808b88e961S猫头猫    await PluginManager.setup();
81927dbe93S猫头猫    await MusicQueue.setup();
828b88e961S猫头猫
83c79c8a57S猫头猫    ErrorUtils.setGlobalHandler(error => {
84c79c8a57S猫头猫        errorLog('未捕获的错误', error);
85c79c8a57S猫头猫    });
86bf6e62f2S猫头猫}
876c6f45bdS猫头猫
886c6f45bdS猫头猫/** 初始化 */
896c6f45bdS猫头猫async function setupFolder() {
906780f402S猫头猫    await Promise.all([
91be0a3650S猫头猫        checkAndCreateDir(pathConst.dataPath),
927f771613S猫头猫        checkAndCreateDir(pathConst.logPath),
937f771613S猫头猫        checkAndCreateDir(pathConst.cachePath),
94be0a3650S猫头猫        checkAndCreateDir(pathConst.storagePath),
95c79c8a57S猫头猫        checkAndCreateDir(pathConst.pluginPath),
9694a1b1fcS猫头猫        checkAndCreateDir(pathConst.lrcCachePath),
976780f402S猫头猫    ]);
986c6f45bdS猫头猫}
9994a1b1fcS猫头猫
10094a1b1fcS猫头猫export default async function () {
10194a1b1fcS猫头猫    try {
10294a1b1fcS猫头猫        await _bootstrap();
10394a1b1fcS猫头猫    } catch (e) {
10494a1b1fcS猫头猫        errorLog('初始化出错', e);
10594a1b1fcS猫头猫        console.log(e);
10694a1b1fcS猫头猫    }
10794a1b1fcS猫头猫    // 隐藏开屏动画
10894a1b1fcS猫头猫    console.log('HIDE');
10994a1b1fcS猫头猫    RNBootSplash.hide({fade: true});
11094a1b1fcS猫头猫}
111