gitextract_ppffbibi/ ├── .agent/ │ ├── rules/ │ │ ├── changelog.md │ │ └── measure-layout.md │ └── skills/ │ ├── gesture-handler-3-migration/ │ │ └── SKILL.md │ └── upgrading-expo/ │ ├── SKILL.md │ └── references/ │ ├── new-architecture.md │ ├── react-19.md │ └── react-compiler.md ├── .agents/ │ └── skills/ │ ├── react-doctor/ │ │ └── SKILL.md │ └── react-native-ease-refactor/ │ └── SKILL.md ├── .easignore ├── .gitattributes ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.yml │ │ └── feature_request.yml │ ├── release.yml │ ├── wiki/ │ │ ├── Home.md │ │ └── _Sidebar.md │ └── workflows/ │ ├── build.yml │ ├── check-lyricon-updates.yml │ ├── nightly.yml │ ├── pr-checks.yml │ ├── update.yml │ └── wiki.yml ├── .gitignore ├── .gitleaks-baseline.json ├── .gitleaks.toml ├── .npmrc ├── .oxfmtrc.json ├── .oxlintrc.json ├── .sisyphus/ │ ├── boulder.json │ ├── evidence/ │ │ ├── task-1-complete.txt │ │ ├── task-2-complete.txt │ │ ├── task-3-lint-output.txt │ │ ├── task-4-page-created.txt │ │ ├── task-5-play-all.txt │ │ ├── task-6-structure.txt │ │ └── task-7-complete.txt │ ├── notepads/ │ │ └── task-5-play-all/ │ │ └── learnings.md │ └── plans/ │ └── homepage-ui-optimization.md ├── .syncpackrc ├── .vscode/ │ ├── extensions.json │ └── settings.json ├── AGENTS.md ├── LICENSE ├── PRIVACY.md ├── README.md ├── apps/ │ ├── README.md │ ├── backend/ │ │ ├── .dev.vars.example │ │ ├── .gitignore │ │ ├── drizzle.config.ts │ │ ├── mise.toml │ │ ├── package.json │ │ ├── src/ │ │ │ ├── db/ │ │ │ │ ├── index.ts │ │ │ │ └── schema.ts │ │ │ ├── index.ts │ │ │ ├── middleware/ │ │ │ │ └── auth.ts │ │ │ ├── routes/ │ │ │ │ ├── auth.ts │ │ │ │ ├── me.ts │ │ │ │ └── playlists.ts │ │ │ ├── types.ts │ │ │ └── validators/ │ │ │ ├── auth.ts │ │ │ └── playlists.ts │ │ ├── tsconfig.json │ │ ├── worker-configuration.d.ts │ │ └── wrangler.toml │ ├── docs/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── docs/ │ │ │ ├── .vitepress/ │ │ │ │ ├── components/ │ │ │ │ │ ├── AppNotExistPage.vue │ │ │ │ │ ├── SharePlaylistPage.vue │ │ │ │ │ ├── ShareTrackPage.vue │ │ │ │ │ └── shared-page.css │ │ │ │ └── config.mts │ │ │ ├── SPL.md │ │ │ ├── app-not-exist.md │ │ │ ├── guides/ │ │ │ │ ├── comments.md │ │ │ │ ├── download.md │ │ │ │ ├── external-playlist.md │ │ │ │ ├── index.md │ │ │ │ ├── install.md │ │ │ │ ├── leaderboard.md │ │ │ │ ├── lyrics.md │ │ │ │ ├── player.md │ │ │ │ ├── playlist.md │ │ │ │ ├── search.md │ │ │ │ ├── settings.md │ │ │ │ └── shared-playlist.md │ │ │ ├── index.md │ │ │ ├── public/ │ │ │ │ └── .well-known/ │ │ │ │ └── assetlinks.json │ │ │ └── share/ │ │ │ ├── playlist.md │ │ │ └── track.md │ │ ├── env.d.ts │ │ ├── package.json │ │ └── tsconfig.json │ ├── mobile/ │ │ ├── .gitignore │ │ ├── .maestro/ │ │ │ ├── comments_flow.yaml │ │ │ ├── common/ │ │ │ │ ├── open_player.yaml │ │ │ │ └── setup.yaml │ │ │ ├── playback_flow.yaml │ │ │ ├── playlist_flow.yaml │ │ │ ├── search_flow.yaml │ │ │ └── sync_flow.yaml │ │ ├── AGENTS.md │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── app.config.ts │ │ ├── assets/ │ │ │ └── config/ │ │ │ └── google-services/ │ │ │ ├── GoogleService-Info.plist │ │ │ └── google-services.json │ │ ├── babel.config.js │ │ ├── docs/ │ │ │ ├── ARCHITECTURE.md │ │ │ ├── BEST_PRACTICES.md │ │ │ ├── CONTRIBUTING.md │ │ │ ├── Home.md │ │ │ ├── RELEASE.md │ │ │ └── TECHNICAL_DEBT.md │ │ ├── drizzle/ │ │ │ ├── 0000_productive_joystick.sql │ │ │ ├── 0001_fast_trauma.sql │ │ │ ├── 0002_groovy_maximus.sql │ │ │ ├── 0003_glamorous_psylocke.sql │ │ │ ├── 0004_smiling_beast.sql │ │ │ ├── 0005_spotty_exiles.sql │ │ │ ├── 0006_breezy_jigsaw.sql │ │ │ ├── 0007_legal_thor.sql │ │ │ ├── 0008_overrated_jimmy_woo.sql │ │ │ ├── 0009_lethal_marten_broadcloak.sql │ │ │ ├── 0010_brainy_anita_blake.sql │ │ │ ├── 0011_grey_echo.sql │ │ │ ├── 0012_blushing_human_fly.sql │ │ │ ├── 0013_jittery_randall.sql │ │ │ ├── 0014_flippant_sebastian_shaw.sql │ │ │ ├── 0015_flippant_skaar.sql │ │ │ ├── 0016_cheerful_stark_industries.sql │ │ │ ├── 0017_rare_lifeguard.sql │ │ │ ├── 0018_green_dracula.sql │ │ │ ├── 0019_icy_mandarin.sql │ │ │ ├── 0020_ambitious_sheva_callister.sql │ │ │ ├── meta/ │ │ │ │ ├── 0000_snapshot.json │ │ │ │ ├── 0001_snapshot.json │ │ │ │ ├── 0002_snapshot.json │ │ │ │ ├── 0003_snapshot.json │ │ │ │ ├── 0004_snapshot.json │ │ │ │ ├── 0005_snapshot.json │ │ │ │ ├── 0006_snapshot.json │ │ │ │ ├── 0007_snapshot.json │ │ │ │ ├── 0008_snapshot.json │ │ │ │ ├── 0009_snapshot.json │ │ │ │ ├── 0010_snapshot.json │ │ │ │ ├── 0011_snapshot.json │ │ │ │ ├── 0012_snapshot.json │ │ │ │ ├── 0013_snapshot.json │ │ │ │ ├── 0014_snapshot.json │ │ │ │ ├── 0015_snapshot.json │ │ │ │ ├── 0016_snapshot.json │ │ │ │ ├── 0017_snapshot.json │ │ │ │ ├── 0018_snapshot.json │ │ │ │ ├── 0019_snapshot.json │ │ │ │ ├── 0020_snapshot.json │ │ │ │ └── _journal.json │ │ │ └── migrations.js │ │ ├── drizzle.config.ts │ │ ├── eas.json │ │ ├── expo-plugins/ │ │ │ ├── withAbiFilters.js │ │ │ ├── withAndroidGradleProperties.js │ │ │ ├── withAndroidPlugin.js │ │ │ └── withKotlinSerialization.js │ │ ├── index.js │ │ ├── metro.config.js │ │ ├── mise.toml │ │ ├── package.json │ │ ├── src/ │ │ │ ├── app/ │ │ │ │ ├── (tabs)/ │ │ │ │ │ ├── _layout.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── library/ │ │ │ │ │ │ └── [tab].tsx │ │ │ │ │ └── settings/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── +native-intent.ts │ │ │ │ ├── +not-found.tsx │ │ │ │ ├── _layout.tsx │ │ │ │ ├── comments/ │ │ │ │ │ ├── [bvid].tsx │ │ │ │ │ └── reply.tsx │ │ │ │ ├── download.tsx │ │ │ │ ├── downloaded.tsx │ │ │ │ ├── history/ │ │ │ │ │ ├── [date].tsx │ │ │ │ │ └── overall.tsx │ │ │ │ ├── modal.tsx │ │ │ │ ├── player.tsx │ │ │ │ ├── playlist/ │ │ │ │ │ ├── external-sync.tsx │ │ │ │ │ ├── local/ │ │ │ │ │ │ └── [id].tsx │ │ │ │ │ ├── recently/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── remote/ │ │ │ │ │ ├── collection/ │ │ │ │ │ │ └── [id].tsx │ │ │ │ │ ├── favorite/ │ │ │ │ │ │ └── [id].tsx │ │ │ │ │ ├── multipage/ │ │ │ │ │ │ └── [bvid].tsx │ │ │ │ │ ├── search-result/ │ │ │ │ │ │ ├── fav/ │ │ │ │ │ │ │ └── [query].tsx │ │ │ │ │ │ └── global/ │ │ │ │ │ │ └── [query].tsx │ │ │ │ │ ├── toview.tsx │ │ │ │ │ └── uploader/ │ │ │ │ │ └── [mid].tsx │ │ │ │ ├── settings/ │ │ │ │ │ ├── appearance.tsx │ │ │ │ │ ├── donate.tsx │ │ │ │ │ ├── download.tsx │ │ │ │ │ ├── general.tsx │ │ │ │ │ ├── lyrics.tsx │ │ │ │ │ └── playback.tsx │ │ │ │ ├── share/ │ │ │ │ │ └── playlist.tsx │ │ │ │ └── test.tsx │ │ │ ├── assets/ │ │ │ │ └── lottie/ │ │ │ │ ├── play-pause.json │ │ │ │ ├── skip-next.json │ │ │ │ └── skip-prev.json │ │ │ ├── components/ │ │ │ │ ├── ErrorBoundary.tsx │ │ │ │ ├── ModalRegistry.tsx │ │ │ │ ├── NowPlayingBar.tsx │ │ │ │ ├── common/ │ │ │ │ │ ├── AnimatedModalOverlay.tsx │ │ │ │ │ ├── Button.tsx │ │ │ │ │ ├── CoverWithPlaceHolder.tsx │ │ │ │ │ ├── FunctionalMenu.tsx │ │ │ │ │ └── IconButton.tsx │ │ │ │ ├── modals/ │ │ │ │ │ ├── AlertModal.tsx │ │ │ │ │ ├── PlayerQueueModal.tsx │ │ │ │ │ ├── app/ │ │ │ │ │ │ ├── DonationQRModal.tsx │ │ │ │ │ │ ├── UpdateAppModal.tsx │ │ │ │ │ │ └── WelcomeModal.tsx │ │ │ │ │ ├── bilibili/ │ │ │ │ │ │ └── AddVideoToBilibiliFavModal.tsx │ │ │ │ │ ├── edit-metadata/ │ │ │ │ │ │ ├── editPlaylistMetadataModal.tsx │ │ │ │ │ │ └── editTrackMetadataModal.tsx │ │ │ │ │ ├── login/ │ │ │ │ │ │ ├── CookieLoginModal.tsx │ │ │ │ │ │ ├── PhoneLoginModal.tsx │ │ │ │ │ │ ├── QRCodeLoginModal.tsx │ │ │ │ │ │ └── steps/ │ │ │ │ │ │ ├── GeetestVerifyStep.tsx │ │ │ │ │ │ ├── InputCodeStep.tsx │ │ │ │ │ │ ├── InputPhoneStep.tsx │ │ │ │ │ │ └── SuccessStep.tsx │ │ │ │ │ ├── lyrics/ │ │ │ │ │ │ ├── EditLyrics.tsx │ │ │ │ │ │ └── ManualSearchLyrics.tsx │ │ │ │ │ ├── player/ │ │ │ │ │ │ ├── DanmakuSettingsModal.tsx │ │ │ │ │ │ ├── LyricsSelectionModal.tsx │ │ │ │ │ │ ├── PlaybackSpeedModal.tsx │ │ │ │ │ │ ├── SleepTimerModal.tsx │ │ │ │ │ │ └── SongShareModal.tsx │ │ │ │ │ ├── playlist/ │ │ │ │ │ │ ├── BatchAddTracksToLocalPlaylist.tsx │ │ │ │ │ │ ├── CreatePlaylistModal.tsx │ │ │ │ │ │ ├── DuplicateLocalPlaylistModal.tsx │ │ │ │ │ │ ├── EnableSharingModal.tsx │ │ │ │ │ │ ├── FavoriteSyncProgressModal.tsx │ │ │ │ │ │ ├── InputExternalPlaylistInfo.tsx │ │ │ │ │ │ ├── ManualMatchExternalSync.tsx │ │ │ │ │ │ ├── MergePlaylistsModal.tsx │ │ │ │ │ │ ├── SaveQueueToPlaylistModal.tsx │ │ │ │ │ │ ├── SubscribeToSharedPlaylistModal.tsx │ │ │ │ │ │ ├── SyncLocalToBilibiliModal.tsx │ │ │ │ │ │ └── UpdateTrackLocalPlaylistsModal.tsx │ │ │ │ │ └── settings/ │ │ │ │ │ ├── CoverDownloadProgressModal.tsx │ │ │ │ │ └── ExportDownloadsProgressModal.tsx │ │ │ │ └── providers.tsx │ │ │ ├── features/ │ │ │ │ ├── comments/ │ │ │ │ │ └── components/ │ │ │ │ │ └── CommentItem.tsx │ │ │ │ ├── downloads/ │ │ │ │ │ ├── DownloadHeader.tsx │ │ │ │ │ └── DownloadTaskItem.tsx │ │ │ │ ├── history/ │ │ │ │ │ └── HistoryListItem.tsx │ │ │ │ ├── home/ │ │ │ │ │ └── SearchSuggestions.tsx │ │ │ │ ├── library/ │ │ │ │ │ ├── collection/ │ │ │ │ │ │ ├── CollectionList.tsx │ │ │ │ │ │ └── CollectionListItem.tsx │ │ │ │ │ ├── favorite/ │ │ │ │ │ │ ├── FavoriteFolderList.tsx │ │ │ │ │ │ └── FavoriteFolderListItem.tsx │ │ │ │ │ ├── local/ │ │ │ │ │ │ ├── LocalPlaylistItem.tsx │ │ │ │ │ │ └── LocalPlaylistList.tsx │ │ │ │ │ ├── multipage/ │ │ │ │ │ │ ├── MultiPageVideosItem.tsx │ │ │ │ │ │ └── MultiPageVideosList.tsx │ │ │ │ │ ├── shared/ │ │ │ │ │ │ ├── DataFetchingError.tsx │ │ │ │ │ │ └── TabDisabled.tsx │ │ │ │ │ └── skeletons/ │ │ │ │ │ └── LibraryTabSkeleton.tsx │ │ │ │ ├── player/ │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── BGStreamerShader.ts │ │ │ │ │ │ ├── LyricsControlOverlay.tsx │ │ │ │ │ │ ├── PlayerControls.tsx │ │ │ │ │ │ ├── PlayerFunctionalMenu.tsx │ │ │ │ │ │ ├── PlayerHeader.tsx │ │ │ │ │ │ ├── PlayerLyrics.tsx │ │ │ │ │ │ ├── PlayerMainTab.tsx │ │ │ │ │ │ ├── PlayerSlider.tsx │ │ │ │ │ │ ├── PlayerTrackInfo.tsx │ │ │ │ │ │ ├── SpectrumVisualizer.tsx │ │ │ │ │ │ ├── danmaku/ │ │ │ │ │ │ │ └── DanmakuView.tsx │ │ │ │ │ │ ├── lyrics/ │ │ │ │ │ │ │ ├── KaraokeWord.tsx │ │ │ │ │ │ │ ├── LyricActionSheet.tsx │ │ │ │ │ │ │ ├── LyricLineItem.tsx │ │ │ │ │ │ │ └── LyricsOffsetControl.tsx │ │ │ │ │ │ └── sharing/ │ │ │ │ │ │ ├── LyricsShareCard.tsx │ │ │ │ │ │ └── SongShareCard.tsx │ │ │ │ │ └── hooks/ │ │ │ │ │ ├── danmaku/ │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ ├── useDanmakuLoader.ts │ │ │ │ │ │ └── useDanmakuRender.ts │ │ │ │ │ ├── useLyricSync.ts │ │ │ │ │ └── usePlayerHeaderAnimation.ts │ │ │ │ └── playlist/ │ │ │ │ ├── local/ │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── LocalPlaylistHeader.tsx │ │ │ │ │ │ ├── LocalPlaylistItem.tsx │ │ │ │ │ │ ├── LocalTrackList.tsx │ │ │ │ │ │ ├── PlaylistError.tsx │ │ │ │ │ │ ├── SharedPlaylistMembersSheet.tsx │ │ │ │ │ │ └── SyncFailuresSheet.tsx │ │ │ │ │ └── hooks/ │ │ │ │ │ ├── useLocalPlaylistMenu.ts │ │ │ │ │ ├── useLocalPlaylistPlayer.ts │ │ │ │ │ └── useTrackSelection.ts │ │ │ │ ├── remote/ │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── FlashingTrackListItem.tsx │ │ │ │ │ │ ├── PlaylistError.tsx │ │ │ │ │ │ ├── PlaylistHeader.tsx │ │ │ │ │ │ ├── PlaylistItem.tsx │ │ │ │ │ │ └── RemoteTrackList.tsx │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ ├── useCheckLinkedToLocalPlaylist.ts │ │ │ │ │ │ ├── usePlaylistMenu.ts │ │ │ │ │ │ ├── useRemotePlaylist.ts │ │ │ │ │ │ └── useTrackSelection.ts │ │ │ │ │ ├── search-result/ │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ └── hooks/ │ │ │ │ │ │ └── useSearchInteractions.ts │ │ │ │ │ └── toview/ │ │ │ │ │ └── components/ │ │ │ │ │ ├── Item.tsx │ │ │ │ │ └── ProgressRing.tsx │ │ │ │ └── skeletons/ │ │ │ │ └── PlaylistSkeleton.tsx │ │ │ ├── hooks/ │ │ │ │ ├── analytics/ │ │ │ │ │ └── useFeatureTracking.ts │ │ │ │ ├── app/ │ │ │ │ │ ├── useCheckUpdate.tsx │ │ │ │ │ └── useFastMigrations.ts │ │ │ │ ├── auth/ │ │ │ │ │ ├── useGeetest.ts │ │ │ │ │ └── usePhoneLogin.ts │ │ │ │ ├── mutations/ │ │ │ │ │ ├── bilibili/ │ │ │ │ │ │ ├── comments.ts │ │ │ │ │ │ ├── favorite.ts │ │ │ │ │ │ └── video.ts │ │ │ │ │ ├── db/ │ │ │ │ │ │ ├── playlist.ts │ │ │ │ │ │ └── track.ts │ │ │ │ │ ├── lyrics/ │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── orpheus/ │ │ │ │ │ └── index.ts │ │ │ │ ├── player/ │ │ │ │ │ ├── useCurrentTrack.ts │ │ │ │ │ ├── useCurrentTrackId.ts │ │ │ │ │ ├── useIsCurrentTrack.ts │ │ │ │ │ ├── useLocalCover.ts │ │ │ │ │ ├── useSmoothProgress.ts │ │ │ │ │ └── useTrackProgress.ts │ │ │ │ ├── queries/ │ │ │ │ │ ├── bilibili/ │ │ │ │ │ │ ├── comments.ts │ │ │ │ │ │ ├── danmaku.ts │ │ │ │ │ │ ├── favorite.ts │ │ │ │ │ │ ├── search.ts │ │ │ │ │ │ ├── user.ts │ │ │ │ │ │ └── video.ts │ │ │ │ │ ├── db/ │ │ │ │ │ │ ├── playlist.ts │ │ │ │ │ │ └── track.ts │ │ │ │ │ ├── external-playlist/ │ │ │ │ │ │ └── useExternalPlaylist.ts │ │ │ │ │ ├── lyrics/ │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── orpheus/ │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── playHistory.ts │ │ │ │ │ ├── sharedPlaylistAllMembers.ts │ │ │ │ │ ├── sharedPlaylistMembers.ts │ │ │ │ │ ├── sharedPlaylistPreview.ts │ │ │ │ │ └── useRecentPlaylists.ts │ │ │ │ ├── router/ │ │ │ │ │ ├── useBottomTabBarHeight.ts │ │ │ │ │ └── usePreventRemove.ts │ │ │ │ ├── stores/ │ │ │ │ │ ├── useAppStore.ts │ │ │ │ │ ├── useDownloadManagerStore.ts │ │ │ │ │ ├── useExternalPlaylistSyncStore.tsx │ │ │ │ │ ├── useModalStore.ts │ │ │ │ │ ├── usePlayerStore.ts │ │ │ │ │ └── useSharedPlaylistMembersStore.ts │ │ │ │ ├── ui/ │ │ │ │ │ ├── useDoubleTapScrollToTop.ts │ │ │ │ │ ├── usePlaylistBackgroundColor.ts │ │ │ │ │ └── useScreenDimensions.ts │ │ │ │ └── utils/ │ │ │ │ ├── useDebouncedValue.ts │ │ │ │ ├── useIsActuallyOffline.ts │ │ │ │ ├── usePreviousState.ts │ │ │ │ └── useRefreshOnFocus.ts │ │ │ ├── lib/ │ │ │ │ ├── api/ │ │ │ │ │ ├── bbplayer/ │ │ │ │ │ │ └── client.ts │ │ │ │ │ ├── bilibili/ │ │ │ │ │ │ ├── api.ts │ │ │ │ │ │ ├── client.ts │ │ │ │ │ │ ├── proto/ │ │ │ │ │ │ │ ├── dm.d.ts │ │ │ │ │ │ │ ├── dm.js │ │ │ │ │ │ │ └── dm.proto │ │ │ │ │ │ ├── utils.ts │ │ │ │ │ │ └── wbi.ts │ │ │ │ │ ├── kugou/ │ │ │ │ │ │ └── api.ts │ │ │ │ │ ├── netease/ │ │ │ │ │ │ ├── api.ts │ │ │ │ │ │ ├── crypto.ts │ │ │ │ │ │ ├── request.ts │ │ │ │ │ │ └── utils.ts │ │ │ │ │ └── qqmusic/ │ │ │ │ │ └── api.ts │ │ │ │ ├── config/ │ │ │ │ │ ├── queryClient.ts │ │ │ │ │ └── sentry.ts │ │ │ │ ├── db/ │ │ │ │ │ ├── db.ts │ │ │ │ │ └── schema.ts │ │ │ │ ├── errors/ │ │ │ │ │ ├── facade.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── player.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── thirdparty/ │ │ │ │ │ ├── bilibili.ts │ │ │ │ │ └── netease.ts │ │ │ │ ├── facades/ │ │ │ │ │ ├── bilibili.ts │ │ │ │ │ ├── playlist.ts │ │ │ │ │ ├── sharedPlaylist.ts │ │ │ │ │ ├── syncBilibiliPlaylist.ts │ │ │ │ │ └── syncExternalPlaylist.ts │ │ │ │ ├── player/ │ │ │ │ │ ├── PlayerSideEffects.ts │ │ │ │ │ └── progressListener.ts │ │ │ │ ├── services/ │ │ │ │ │ ├── analyticsService.ts │ │ │ │ │ ├── artistService.ts │ │ │ │ │ ├── externalPlaylistService.ts │ │ │ │ │ ├── genKey.ts │ │ │ │ │ ├── lyricService.ts │ │ │ │ │ ├── playlistService.ts │ │ │ │ │ ├── syncLocalToBilibiliService.ts │ │ │ │ │ ├── trackService.ts │ │ │ │ │ └── updateService.ts │ │ │ │ ├── theme/ │ │ │ │ │ └── material3Colors.ts │ │ │ │ ├── utils/ │ │ │ │ │ └── playlistUrlParser.ts │ │ │ │ └── workers/ │ │ │ │ └── PlaylistSyncWorker.ts │ │ │ ├── theme/ │ │ │ │ └── dimensions.ts │ │ │ ├── types/ │ │ │ │ ├── apis/ │ │ │ │ │ ├── baidu.ts │ │ │ │ │ ├── bilibili.ts │ │ │ │ │ ├── kugou.ts │ │ │ │ │ ├── kuwo.ts │ │ │ │ │ ├── netease.ts │ │ │ │ │ └── qqmusic.ts │ │ │ │ ├── core/ │ │ │ │ │ ├── appStore.ts │ │ │ │ │ ├── downloadManagerStore.ts │ │ │ │ │ ├── media.ts │ │ │ │ │ └── scope.ts │ │ │ │ ├── external_playlist.ts │ │ │ │ ├── flashlist.ts │ │ │ │ ├── navigation.ts │ │ │ │ ├── player/ │ │ │ │ │ └── lyrics.ts │ │ │ │ ├── services/ │ │ │ │ │ ├── artist.ts │ │ │ │ │ ├── playlist.ts │ │ │ │ │ └── track.ts │ │ │ │ └── storage.ts │ │ │ └── utils/ │ │ │ ├── __mocks__/ │ │ │ │ └── log.ts │ │ │ ├── __tests__/ │ │ │ │ ├── set.test.ts │ │ │ │ ├── sticky-mitt.test.ts │ │ │ │ └── time.test.ts │ │ │ ├── color.ts │ │ │ ├── danmaku.ts │ │ │ ├── error-handling.ts │ │ │ ├── haptics.ts │ │ │ ├── log.ts │ │ │ ├── lottie.ts │ │ │ ├── matching.ts │ │ │ ├── mmkv.ts │ │ │ ├── network.ts │ │ │ ├── neverthrow-utils.ts │ │ │ ├── player.ts │ │ │ ├── search.ts │ │ │ ├── set.ts │ │ │ ├── sticky-mitt.ts │ │ │ ├── time.ts │ │ │ └── toast.ts │ │ └── tsconfig.json │ └── update-publisher/ │ ├── package.json │ ├── src/ │ │ └── index.ts │ └── tsconfig.json ├── commitlint.config.js ├── eslint.config.mjs ├── lefthook.yml ├── package.json ├── packages/ │ ├── eslint-plugin/ │ │ ├── index.js │ │ ├── package.json │ │ └── rules/ │ │ └── no-navigate-after-modal-close.js │ ├── heatmap/ │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── components/ │ │ │ │ ├── HeatMapCell.tsx │ │ │ │ ├── MonthlyHeatMap.tsx │ │ │ │ └── WeeklyHeatMap.tsx │ │ │ ├── constants/ │ │ │ │ └── theme.ts │ │ │ ├── index.ts │ │ │ ├── types.ts │ │ │ └── utils/ │ │ │ └── calendar.ts │ │ └── tsconfig.json │ ├── image-theme-colors/ │ │ ├── .gitignore │ │ ├── .npmignore │ │ ├── README.md │ │ ├── android/ │ │ │ ├── build.gradle │ │ │ └── src/ │ │ │ └── main/ │ │ │ ├── AndroidManifest.xml │ │ │ └── java/ │ │ │ └── expo/ │ │ │ └── modules/ │ │ │ └── imagethemecolors/ │ │ │ └── ExpoImageThemeColorsModule.kt │ │ ├── example/ │ │ │ ├── .gitignore │ │ │ ├── App.tsx │ │ │ ├── app.json │ │ │ ├── babel.config.js │ │ │ ├── index.ts │ │ │ ├── metro.config.js │ │ │ ├── package.json │ │ │ └── tsconfig.json │ │ ├── expo-module.config.json │ │ ├── ios/ │ │ │ ├── ExpoImageThemeColors.podspec │ │ │ └── ExpoImageThemeColorsModule.swift │ │ ├── package.json │ │ ├── src/ │ │ │ ├── ExpoImageThemeColors.types.ts │ │ │ ├── ExpoImageThemeColorsModule.ts │ │ │ ├── ImageRef.ts │ │ │ └── index.ts │ │ └── tsconfig.json │ ├── logs/ │ │ ├── .gitignore │ │ ├── .travis.yml │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── demo/ │ │ │ ├── ComponentReadLogsRN.tsx │ │ │ └── demo.ts │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.ts │ │ │ └── transports/ │ │ │ ├── consoleTransport.ts │ │ │ ├── crashlyticsTransport.ts │ │ │ ├── fileAsyncTransport.ts │ │ │ ├── mapConsoleTransport.ts │ │ │ └── sentryTransport.ts │ │ ├── test/ │ │ │ ├── consoleTransport.test.js │ │ │ └── index.test.js │ │ └── tsconfig.json │ ├── native/ │ │ ├── .gitignore │ │ ├── android/ │ │ │ ├── build.gradle │ │ │ └── src/ │ │ │ └── main/ │ │ │ ├── AndroidManifest.xml │ │ │ └── java/ │ │ │ └── expo/ │ │ │ └── modules/ │ │ │ └── bbplayernative/ │ │ │ └── BBPlayerNativeModule.kt │ │ ├── expo-module.config.json │ │ ├── package.json │ │ └── src/ │ │ ├── BBPlayerNative.types.ts │ │ ├── BBPlayerNativeModule.ts │ │ └── index.ts │ ├── orpheus/ │ │ ├── .gitignore │ │ ├── .lyricon_version │ │ ├── AGENTS.md │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── android/ │ │ │ ├── build.gradle │ │ │ └── src/ │ │ │ └── main/ │ │ │ ├── AndroidManifest.xml │ │ │ ├── aidl/ │ │ │ │ └── io/ │ │ │ │ └── github/ │ │ │ │ └── proify/ │ │ │ │ └── lyricon/ │ │ │ │ ├── lyric/ │ │ │ │ │ └── model/ │ │ │ │ │ └── Song.aidl │ │ │ │ └── provider/ │ │ │ │ ├── IProviderBinder.aidl │ │ │ │ ├── IProviderService.aidl │ │ │ │ ├── IRemotePlayer.aidl │ │ │ │ ├── IRemoteService.aidl │ │ │ │ └── ProviderInfo.aidl │ │ │ ├── java/ │ │ │ │ ├── expo/ │ │ │ │ │ └── modules/ │ │ │ │ │ └── orpheus/ │ │ │ │ │ ├── ExpoOrpheusModule.kt │ │ │ │ │ ├── OrpheusConfig.kt │ │ │ │ │ ├── bilibili/ │ │ │ │ │ │ ├── BilibiliApi.kt │ │ │ │ │ │ ├── BilibiliModels.kt │ │ │ │ │ │ ├── BilibiliRepository.kt │ │ │ │ │ │ ├── NetworkModule.kt │ │ │ │ │ │ └── WbiUtil.kt │ │ │ │ │ ├── exception/ │ │ │ │ │ │ └── exceptions.kt │ │ │ │ │ ├── manager/ │ │ │ │ │ │ ├── CachedUriManager.kt │ │ │ │ │ │ ├── CoverDownloadManager.kt │ │ │ │ │ │ ├── DownloadCache.kt │ │ │ │ │ │ ├── FloatingLyricsManager.kt │ │ │ │ │ │ ├── LyriconBackend.kt │ │ │ │ │ │ ├── SpectrumManager.kt │ │ │ │ │ │ ├── StatusBarLyricsBackend.kt │ │ │ │ │ │ ├── StatusBarLyricsManager.kt │ │ │ │ │ │ ├── SuperLyricBackend.kt │ │ │ │ │ │ └── UnifiedLyricsManager.kt │ │ │ │ │ ├── model/ │ │ │ │ │ │ ├── LyricsModels.kt │ │ │ │ │ │ └── TrackRecord.kt │ │ │ │ │ ├── network/ │ │ │ │ │ │ └── OkHttpClientManager.kt │ │ │ │ │ ├── service/ │ │ │ │ │ │ ├── OrpheusDownloadService.kt │ │ │ │ │ │ ├── OrpheusHeadlessTaskService.kt │ │ │ │ │ │ ├── OrpheusMusicService.kt │ │ │ │ │ │ └── ShuffleManager.kt │ │ │ │ │ ├── util/ │ │ │ │ │ │ ├── ConvertPlayerError.kt │ │ │ │ │ │ ├── CustomCommands.kt │ │ │ │ │ │ ├── DirectoryPickerContract.kt │ │ │ │ │ │ ├── DownloadUtil.kt │ │ │ │ │ │ ├── ExportDownloadsHelper.kt │ │ │ │ │ │ ├── GeneralStorage.kt │ │ │ │ │ │ ├── GlideBitmapLoader.kt │ │ │ │ │ │ ├── LoudnessStorage.kt │ │ │ │ │ │ ├── SleepTimeController.kt │ │ │ │ │ │ ├── SplConverter.kt │ │ │ │ │ │ ├── TrackRecordExtension.kt │ │ │ │ │ │ └── Volume.kt │ │ │ │ │ └── view/ │ │ │ │ │ └── LyricView.kt │ │ │ │ └── io/ │ │ │ │ └── github/ │ │ │ │ └── proify/ │ │ │ │ └── lyricon/ │ │ │ │ ├── lyric/ │ │ │ │ │ └── model/ │ │ │ │ │ ├── LyricLine.kt │ │ │ │ │ ├── LyricMetadata.kt │ │ │ │ │ ├── LyricTiming.kt │ │ │ │ │ ├── LyricWord.kt │ │ │ │ │ ├── RichLyricLine.kt │ │ │ │ │ ├── Song.kt │ │ │ │ │ ├── extensions/ │ │ │ │ │ │ ├── Extensions.kt │ │ │ │ │ │ ├── LyricWord.kt │ │ │ │ │ │ └── TimingNavigator.kt │ │ │ │ │ └── interfaces/ │ │ │ │ │ ├── DeepCopyable.kt │ │ │ │ │ ├── ILyricLine.kt │ │ │ │ │ ├── ILyricTiming.kt │ │ │ │ │ ├── ILyricWord.kt │ │ │ │ │ ├── IRichLyricLine.kt │ │ │ │ │ └── Normalize.kt │ │ │ │ └── provider/ │ │ │ │ ├── CachedRemotePlayer.kt │ │ │ │ ├── CentralServiceReceiver.kt │ │ │ │ ├── ConnectionListener.kt │ │ │ │ ├── ConnectionStatus.kt │ │ │ │ ├── Extensions.kt │ │ │ │ ├── LocalProviderService.kt │ │ │ │ ├── LyriconFactory.kt │ │ │ │ ├── LyriconProvider.kt │ │ │ │ ├── ProviderBinder.kt │ │ │ │ ├── ProviderConstants.kt │ │ │ │ ├── ProviderInfo.kt │ │ │ │ ├── ProviderLogo.kt │ │ │ │ ├── ProviderMetadata.kt │ │ │ │ ├── ProviderService.kt │ │ │ │ ├── RemotePlayer.kt │ │ │ │ ├── impl/ │ │ │ │ │ ├── EmptyProvider.kt │ │ │ │ │ ├── LyriconProviderImpl.kt │ │ │ │ │ ├── ProviderRemoteEndpoint.kt │ │ │ │ │ └── RemotePlayerProxy.kt │ │ │ │ └── service/ │ │ │ │ ├── RemoteService.kt │ │ │ │ └── RemoteServiceBinder.kt │ │ │ └── res/ │ │ │ ├── drawable/ │ │ │ │ ├── baseline_download_24.xml │ │ │ │ ├── outline_close_24.xml │ │ │ │ ├── outline_lock_24.xml │ │ │ │ ├── outline_lyrics_off_24.xml │ │ │ │ ├── outline_pause_24.xml │ │ │ │ ├── outline_play_arrow_24.xml │ │ │ │ ├── outline_repeat_24.xml │ │ │ │ ├── outline_repeat_off_24.xml │ │ │ │ ├── outline_repeat_one_24.xml │ │ │ │ ├── outline_skip_next_24.xml │ │ │ │ ├── outline_skip_previous_24.xml │ │ │ │ └── outline_translate_24.xml │ │ │ └── values/ │ │ │ └── strings.xml │ │ ├── docs/ │ │ │ ├── API-Events.md │ │ │ ├── API-Methods.md │ │ │ ├── API-Types.md │ │ │ └── Home.md │ │ ├── example/ │ │ │ ├── .gitignore │ │ │ ├── App.tsx │ │ │ ├── app.json │ │ │ ├── babel.config.js │ │ │ ├── index.ts │ │ │ ├── metro.config.js │ │ │ ├── package.json │ │ │ ├── src/ │ │ │ │ ├── components/ │ │ │ │ │ ├── Buttons.tsx │ │ │ │ │ ├── DebugSection.tsx │ │ │ │ │ ├── PlayerControls.tsx │ │ │ │ │ └── SpectrumVisualizer.tsx │ │ │ │ └── constants.ts │ │ │ ├── tsconfig.json │ │ │ └── webpack.config.js │ │ ├── expo-module.config.json │ │ ├── ios/ │ │ │ ├── AudioSpectrumAnalyzer.swift │ │ │ ├── BilibiliApi.swift │ │ │ ├── ExpoOrpheus.podspec │ │ │ ├── ExpoOrpheusModule.swift │ │ │ ├── GeneralStorage.swift │ │ │ ├── OrpheusDownloadManager.swift │ │ │ ├── OrpheusModels.swift │ │ │ ├── OrpheusPlayerManager.swift │ │ │ ├── OrpheusQueueManager.swift │ │ │ └── WbiUtil.swift │ │ ├── mise.toml │ │ ├── package.json │ │ ├── src/ │ │ │ ├── ExpoOrpheusModule.ts │ │ │ ├── headless.ts │ │ │ ├── hooks/ │ │ │ │ ├── index.ts │ │ │ │ ├── useCurrentTrack.ts │ │ │ │ ├── useIsPlaying.ts │ │ │ │ ├── useOrpheus.ts │ │ │ │ ├── usePlaybackState.ts │ │ │ │ └── useProgress.ts │ │ │ └── index.ts │ │ └── tsconfig.json │ └── splash/ │ ├── README.md │ ├── jest.config.js │ ├── package.json │ ├── src/ │ │ ├── __tests__/ │ │ │ └── fixtures/ │ │ │ ├── 687506.json │ │ │ └── bilibili--BV1Zu411x7mc.json │ │ ├── converter/ │ │ │ ├── netease.test.ts │ │ │ └── netease.ts │ │ ├── index.ts │ │ ├── parser/ │ │ │ ├── index.test.ts │ │ │ ├── index.ts │ │ │ ├── merge.ts │ │ │ ├── spans.test.ts │ │ │ └── spans.ts │ │ ├── types.ts │ │ └── utils/ │ │ ├── time.test.ts │ │ └── time.ts │ └── tsconfig.json ├── patches/ │ ├── react-native-mmkv.patch │ └── sonner-native@0.23.0.patch ├── pnpm-workspace.yaml ├── rnrepo.config.json ├── scripts/ │ └── update-lyricon.sh ├── skills-lock.json ├── tsconfig.json └── update.json