import { Box, Button, ButtonGroup, Code, Flex, HStack, Heading, Icon, IconButton, List, Menu, MenuButton, MenuDivider, MenuItem, MenuList, Tab, TabList, TabPanel, TabPanels, Text, useToast, } from '@chakra-ui/react'; import { useState } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { MdAdd, MdDeleteForever, MdExpandMore, MdFileUpload } from 'react-icons/md'; import { ImportSecretModal } from '~/components/ImportSecretModal'; import { MMKVParser } from '~/util/MMKVParser'; import { kwm2AddKey, kwm2ClearKeys, kwm2ImportKeys } from '../settingsSlice'; import { selectStagingKWMv2Keys } from '../settingsSelector'; import { KWMv2EKeyItem } from './KWMv2/KWMv2EKeyItem'; import type { StagingKWMv2Key } from '../keyFormats'; import { InstructionsPC } from './KWMv2/InstructionsPC'; import { AndroidADBPullInstruction } from '~/components/AndroidADBPullInstruction/AndroidADBPullInstruction'; export function PanelKWMv2Key() { const toast = useToast(); const dispatch = useDispatch(); const kwm2Keys = useSelector(selectStagingKWMv2Keys); const [showImportModal, setShowImportModal] = useState(false); const addKey = () => dispatch(kwm2AddKey()); const clearAll = () => dispatch(kwm2ClearKeys()); const handleSecretImport = async (file: File) => { let keys: Omit[] | null = null; if (/cn\.kuwo\.player\.mmkv/i.test(file.name)) { const fileBuffer = await file.arrayBuffer(); keys = MMKVParser.parseKuwoEKey(new DataView(fileBuffer)); } if (keys) { dispatch(kwm2ImportKeys(keys)); setShowImportModal(false); toast({ title: `导入完成,共导入了 ${keys.length} 个密钥。`, description: '记得按下「保存」来应用。', isClosable: true, status: 'success', }); } else { toast({ title: `不支持的文件:${file.name}`, isClosable: true, status: 'error', }); } }; return ( 酷我解密密钥(KwmV2) 酷我安卓版本的「臻品音质」已经换用 V2 版,后缀名为 mflac 或沿用旧的 kwm。{''} 该格式需要提取密钥后才能正常解密。 }> setShowImportModal(true)} icon={}> 从文件导入密钥 }> 清空密钥 {kwm2Keys.map(({ id, ekey, quality, rid }, i) => ( ))} {kwm2Keys.length === 0 && 还没有添加密钥。} setShowImportModal(false)} onImport={handleSecretImport} > 安卓 Windows ); }