xref: /MusicFree/src/entry/bootstrap.ts (revision 0305125013b5f7ac80f60f45d08a9ae9943b25da)
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';
86780f402S猫头猫import pathConst from '@/constants/pathConst';
9be0a3650S猫头猫import {checkAndCreateDir} from '@/utils/fileUtils';
101e263108S猫头猫import {errorLog, trace} from '@/utils/log';
1128bde18bS猫头猫import MediaMeta from '@/core/mediaMeta';
123d6d339aS猫头猫import Cache from '@/core/cache';
13927dbe93S猫头猫import PluginManager from '@/core/pluginManager';
14ef714860S猫头猫import Network from '@/core/network';
15c30d30e1S猫头猫import {ImgAsset} from '@/constants/assetsConst';
160e4173cdS猫头猫import LocalMusicSheet from '@/core/localMusicSheet';
1795f955b7S猫头猫import {StatusBar} from 'react-native';
18bf6e62f2S猫头猫
198b88e961S猫头猫/** app加载前执行
208b88e961S猫头猫 * 1. 检查权限
218b88e961S猫头猫 * 2. 数据初始化
228b88e961S猫头猫 * 3.
238b88e961S猫头猫 */
2494a1b1fcS猫头猫async function _bootstrap() {
25927dbe93S猫头猫    // 1. 检查权限
26bf6e62f2S猫头猫    const [readStoragePermission, writeStoragePermission] = await Promise.all([
27bf6e62f2S猫头猫        check(PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE),
28bf6e62f2S猫头猫        check(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE),
29bf6e62f2S猫头猫    ]);
30bf6e62f2S猫头猫    if (
31bf6e62f2S猫头猫        !(
32bf6e62f2S猫头猫            readStoragePermission === 'granted' &&
33bf6e62f2S猫头猫            writeStoragePermission === 'granted'
34bf6e62f2S猫头猫        )
35bf6e62f2S猫头猫    ) {
36bf6e62f2S猫头猫        await request(PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE);
37bf6e62f2S猫头猫        await request(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE);
38bf6e62f2S猫头猫    }
39bf6e62f2S猫头猫
40927dbe93S猫头猫    // 2. 数据初始化
416780f402S猫头猫    /** 初始化路径 */
426780f402S猫头猫    await setupFolder();
431e263108S猫头猫    trace('文件夹初始化完成');
44bf6e62f2S猫头猫    // 加载配置
45ef714860S猫头猫    await Promise.all([
46ef714860S猫头猫        Config.setup(),
47ef714860S猫头猫        MediaMeta.setup(),
48ef714860S猫头猫        MusicSheet.setup(),
49ef714860S猫头猫        Network.setup(),
50ef714860S猫头猫    ]);
511e263108S猫头猫    trace('配置初始化完成');
52bf6e62f2S猫头猫    // 加载插件
5394a1b1fcS猫头猫    try {
54cfa0fc07S猫头猫        await TrackPlayer.setupPlayer({
55b882a19dS猫头猫            maxCacheSize:
56b882a19dS猫头猫                Config.get('setting.basic.maxCacheSize') ?? 1024 * 1024 * 512,
57cfa0fc07S猫头猫        });
5894a1b1fcS猫头猫    } catch (e: any) {
5994a1b1fcS猫头猫        if (
604060c00aS猫头猫            e?.message !==
614060c00aS猫头猫            'The player has already been initialized via setupPlayer.'
6294a1b1fcS猫头猫        ) {
6394a1b1fcS猫头猫            throw e;
6494a1b1fcS猫头猫        }
6594a1b1fcS猫头猫    }
66bf6e62f2S猫头猫    await TrackPlayer.updateOptions({
672aa88193S猫头猫        icon: ImgAsset.logoTransparent,
68*03051250S猫头猫        alwaysPauseOnInterruption: true,
69e2257bd6S猫头猫        progressUpdateEventInterval: 1,
70bf6e62f2S猫头猫        capabilities: [
71bf6e62f2S猫头猫            Capability.Play,
72bf6e62f2S猫头猫            Capability.Pause,
73bf6e62f2S猫头猫            Capability.SkipToNext,
74bf6e62f2S猫头猫            Capability.SkipToPrevious,
75bf6e62f2S猫头猫        ],
76bf6e62f2S猫头猫        compactCapabilities: [
77bf6e62f2S猫头猫            Capability.Play,
78bf6e62f2S猫头猫            Capability.Pause,
79bf6e62f2S猫头猫            Capability.SkipToNext,
80bf6e62f2S猫头猫            Capability.SkipToPrevious,
81bf6e62f2S猫头猫        ],
82bf6e62f2S猫头猫        notificationCapabilities: [
83bf6e62f2S猫头猫            Capability.Play,
84bf6e62f2S猫头猫            Capability.Pause,
85bf6e62f2S猫头猫            Capability.SkipToNext,
86bf6e62f2S猫头猫            Capability.SkipToPrevious,
870d39db21S猫头猫        ],
880d39db21S猫头猫    });
891e263108S猫头猫    trace('播放器初始化完成');
904060c00aS猫头猫    await Cache.setup();
911e263108S猫头猫    trace('缓存初始化完成');
928b88e961S猫头猫    await PluginManager.setup();
931e263108S猫头猫    trace('插件初始化完成');
94927dbe93S猫头猫    await MusicQueue.setup();
951e263108S猫头猫    trace('播放列表初始化完成');
960e4173cdS猫头猫    await LocalMusicSheet.setup();
970e4173cdS猫头猫    trace('本地音乐初始化完成');
988b88e961S猫头猫
9995f955b7S猫头猫    StatusBar.setBackgroundColor('transparent');
10095f955b7S猫头猫    StatusBar.setTranslucent(true);
10134a18328S猫头猫    // Linking.addEventListener('url', (data) => {
10234a18328S猫头猫    //     console.log(data);
10334a18328S猫头猫    // })
10495f955b7S猫头猫
105c79c8a57S猫头猫    ErrorUtils.setGlobalHandler(error => {
106c79c8a57S猫头猫        errorLog('未捕获的错误', error);
107c79c8a57S猫头猫    });
108bf6e62f2S猫头猫}
1096c6f45bdS猫头猫
1106c6f45bdS猫头猫/** 初始化 */
1116c6f45bdS猫头猫async function setupFolder() {
1126780f402S猫头猫    await Promise.all([
113be0a3650S猫头猫        checkAndCreateDir(pathConst.dataPath),
1147f771613S猫头猫        checkAndCreateDir(pathConst.logPath),
1157f771613S猫头猫        checkAndCreateDir(pathConst.cachePath),
116c79c8a57S猫头猫        checkAndCreateDir(pathConst.pluginPath),
11794a1b1fcS猫头猫        checkAndCreateDir(pathConst.lrcCachePath),
1180e4173cdS猫头猫        checkAndCreateDir(pathConst.downloadPath).then(() => {
1190e4173cdS猫头猫            checkAndCreateDir(pathConst.downloadMusicPath);
1200e4173cdS猫头猫        }),
1216780f402S猫头猫    ]);
1226c6f45bdS猫头猫}
12394a1b1fcS猫头猫
12494a1b1fcS猫头猫export default async function () {
12594a1b1fcS猫头猫    try {
12694a1b1fcS猫头猫        await _bootstrap();
12794a1b1fcS猫头猫    } catch (e) {
12894a1b1fcS猫头猫        errorLog('初始化出错', e);
12994a1b1fcS猫头猫        console.log(e);
13094a1b1fcS猫头猫    }
13194a1b1fcS猫头猫    // 隐藏开屏动画
13294a1b1fcS猫头猫    console.log('HIDE');
13394a1b1fcS猫头猫    RNBootSplash.hide({fade: true});
13494a1b1fcS猫头猫}
135