xref: /MusicFree/src/entry/bootstrap.ts (revision c30d30e1bb554a5647daa535b019045e8ef1a703)
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';
111e263108S猫头猫import {errorLog, trace} from '@/utils/log';
1228bde18bS猫头猫import MediaMeta from '@/core/mediaMeta';
133d6d339aS猫头猫import Cache from '@/core/cache';
14927dbe93S猫头猫import PluginManager from '@/core/pluginManager';
15ef714860S猫头猫import Network from '@/core/network';
16*c30d30e1S猫头猫import {ImgAsset} from '@/constants/assetsConst';
17bf6e62f2S猫头猫
188b88e961S猫头猫/** app加载前执行
198b88e961S猫头猫 * 1. 检查权限
208b88e961S猫头猫 * 2. 数据初始化
218b88e961S猫头猫 * 3.
228b88e961S猫头猫 */
2394a1b1fcS猫头猫async function _bootstrap() {
24927dbe93S猫头猫    // 1. 检查权限
25bf6e62f2S猫头猫    const [readStoragePermission, writeStoragePermission] = await Promise.all([
26bf6e62f2S猫头猫        check(PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE),
27bf6e62f2S猫头猫        check(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE),
28bf6e62f2S猫头猫    ]);
29bf6e62f2S猫头猫    if (
30bf6e62f2S猫头猫        !(
31bf6e62f2S猫头猫            readStoragePermission === 'granted' &&
32bf6e62f2S猫头猫            writeStoragePermission === 'granted'
33bf6e62f2S猫头猫        )
34bf6e62f2S猫头猫    ) {
35bf6e62f2S猫头猫        await request(PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE);
36bf6e62f2S猫头猫        await request(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE);
37bf6e62f2S猫头猫    }
38bf6e62f2S猫头猫
39927dbe93S猫头猫    // 2. 数据初始化
406780f402S猫头猫    /** 初始化路径 */
416780f402S猫头猫    await setupFolder();
421e263108S猫头猫    trace('文件夹初始化完成');
43bf6e62f2S猫头猫    // 加载配置
44ef714860S猫头猫    await Promise.all([
45ef714860S猫头猫        Config.setup(),
46ef714860S猫头猫        MediaMeta.setup(),
47ef714860S猫头猫        MusicSheet.setup(),
48ef714860S猫头猫        Network.setup(),
49ef714860S猫头猫    ]);
501e263108S猫头猫    trace('配置初始化完成');
51bf6e62f2S猫头猫    // 加载插件
5294a1b1fcS猫头猫    try {
53cfa0fc07S猫头猫        await TrackPlayer.setupPlayer({
54b882a19dS猫头猫            maxCacheSize:
55b882a19dS猫头猫                Config.get('setting.basic.maxCacheSize') ?? 1024 * 1024 * 512,
56cfa0fc07S猫头猫        });
5794a1b1fcS猫头猫    } catch (e: any) {
5894a1b1fcS猫头猫        if (
594060c00aS猫头猫            e?.message !==
604060c00aS猫头猫            'The player has already been initialized via setupPlayer.'
6194a1b1fcS猫头猫        ) {
6294a1b1fcS猫头猫            throw e;
6394a1b1fcS猫头猫        }
6494a1b1fcS猫头猫    }
65bf6e62f2S猫头猫    await TrackPlayer.updateOptions({
66*c30d30e1S猫头猫        icon: ImgAsset.logo,
67e2257bd6S猫头猫        progressUpdateEventInterval: 1,
68bf6e62f2S猫头猫        alwaysPauseOnInterruption: true,
69bf6e62f2S猫头猫        capabilities: [
70bf6e62f2S猫头猫            Capability.Play,
71bf6e62f2S猫头猫            Capability.Pause,
72bf6e62f2S猫头猫            Capability.SkipToNext,
73bf6e62f2S猫头猫            Capability.SkipToPrevious,
74bf6e62f2S猫头猫        ],
75bf6e62f2S猫头猫        compactCapabilities: [
76bf6e62f2S猫头猫            Capability.Play,
77bf6e62f2S猫头猫            Capability.Pause,
78bf6e62f2S猫头猫            Capability.SkipToNext,
79bf6e62f2S猫头猫            Capability.SkipToPrevious,
80bf6e62f2S猫头猫        ],
81bf6e62f2S猫头猫        notificationCapabilities: [
82bf6e62f2S猫头猫            Capability.Play,
83bf6e62f2S猫头猫            Capability.Pause,
84bf6e62f2S猫头猫            Capability.SkipToNext,
85bf6e62f2S猫头猫            Capability.SkipToPrevious,
860d39db21S猫头猫        ],
870d39db21S猫头猫    });
881e263108S猫头猫    trace('播放器初始化完成');
894060c00aS猫头猫    await Cache.setup();
901e263108S猫头猫    trace('缓存初始化完成');
91e14deecfS猫头猫    await Download.setup();
921e263108S猫头猫    trace('下载初始化完成');
938b88e961S猫头猫    await PluginManager.setup();
941e263108S猫头猫    trace('插件初始化完成');
95927dbe93S猫头猫    await MusicQueue.setup();
961e263108S猫头猫    trace('播放列表初始化完成');
978b88e961S猫头猫
98c79c8a57S猫头猫    ErrorUtils.setGlobalHandler(error => {
99c79c8a57S猫头猫        errorLog('未捕获的错误', error);
100c79c8a57S猫头猫    });
101bf6e62f2S猫头猫}
1026c6f45bdS猫头猫
1036c6f45bdS猫头猫/** 初始化 */
1046c6f45bdS猫头猫async function setupFolder() {
1056780f402S猫头猫    await Promise.all([
106be0a3650S猫头猫        checkAndCreateDir(pathConst.dataPath),
1077f771613S猫头猫        checkAndCreateDir(pathConst.logPath),
1087f771613S猫头猫        checkAndCreateDir(pathConst.cachePath),
109be0a3650S猫头猫        checkAndCreateDir(pathConst.storagePath),
110c79c8a57S猫头猫        checkAndCreateDir(pathConst.pluginPath),
11194a1b1fcS猫头猫        checkAndCreateDir(pathConst.lrcCachePath),
1126780f402S猫头猫    ]);
1136c6f45bdS猫头猫}
11494a1b1fcS猫头猫
11594a1b1fcS猫头猫export default async function () {
11694a1b1fcS猫头猫    try {
11794a1b1fcS猫头猫        await _bootstrap();
11894a1b1fcS猫头猫    } catch (e) {
11994a1b1fcS猫头猫        errorLog('初始化出错', e);
12094a1b1fcS猫头猫        console.log(e);
12194a1b1fcS猫头猫    }
12294a1b1fcS猫头猫    // 隐藏开屏动画
12394a1b1fcS猫头猫    console.log('HIDE');
12494a1b1fcS猫头猫    RNBootSplash.hide({fade: true});
12594a1b1fcS猫头猫}
126