New Decryptor: Add js decoder for Ximalaya X2M and X3M #23
Labels
No Label
bug
crypto
duplicate
enhancement
help wanted
invalid
platform-android
platform-mac
platform-win
question
wontfix
No Milestone
No project
No Assignees
3 Participants
Notifications
Due Date
No due date set.
Blocks
#24 什么时候能加上喜马拉雅解锁
um/web
Reference: um/web#23
Loading…
Reference in New Issue
No description provided.
Delete Branch "Yuki1536/um-web1:master"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Add js(typescript) decoder for Ximalaya
X2M
andX3M
.Already run code on GitHub Codespace with no problems.
scramble table 可以优化下。go 实现这么搞是因为把表外置到文件了。实际上是
uint16_t
类型。可以提前写好。或者你如果想更进一步,抓出这两个参数动态生成这个表也可以 XimalayaScrambleTableGeneration.cpp#L8
web版本把表整成单独文件然后xhr,我觉得不太好,放在源码里方便各种环境加载都不会受影响。扔到网页上跑了试了试,加载貌似没有慢多少。app.js多了12kb左右。解密也能一下子解开。
可以详细一点么,js用Uint16Array装应该没问题了,uint16_t的名字是c系语言定义的吧。
还想问一下有什么好的方法压缩这两个码表么?
@ -0,0 +66,4 @@
if (x3mScrambleTableBytes.length != 2 * x3mHeaderSize)
throw "invalid x3m scramble table";
for (let i = 0; i < x3mHeaderSize; i++)
x3mScrambleTable[i] = x3mScrambleTableBytes[i * 2] | (x3mScrambleTableBytes[i * 2 + 1] << 8);
意思是:这源代码直接存储这里生成好的 x3mScrambleTable,而不需要运行时再生成
明白意思了,感谢。
已改,直接把数组放进去了。
有个小问题,请问为什么我添加的GPG Key在我fork的repo里面显示签名验证通过,而打开pr之后,以及合并到主项目中后,就变成签名验证失败
PR中的:
Fork版本的repo中的:
谢谢。
@ -26,6 +26,7 @@
- [x] 虾米音乐格式 (.xm)
- [x] 酷我音乐格式 (.kwm)
- [x] 酷狗音乐格式 (.kgm/.vpr)
- [x] 喜马拉雅文件格式 (.x2m/.x3m)
可以标注下是安卓。
PC 版后缀是 xm
好
刚才点错了…
修改建议
VS在写代码时感觉就是自动控制好版式了,甚至缩进或者排版不好看的代码,剪切粘贴一下也都正了。
我把两个table数组适当的换一换行,让它好看一些。
build之后的app.js里面也会变成10进制吧,也许16进制看着更好看?
主要是为了好看。
因为是 0~1024 的范围,最大是三位的十六进制表示。可以用 0x001 这样对齐。
build 的目标是最小化的文件,源代码的目标是为了更方便阅读理解的。
@ -0,0 +6,4 @@
handler: Function;
}
const HandlerMap: { [key: string]: Handler } = {
类型可以考虑更改为
Record<string, Handler>
不过看这个 handler 只有一个成员,可以考虑更改一下类型:
使用的时候可以直接:
或者使用真正的 Map 类型:
感谢。
抱歉,前两天发烧了,今天舒服点了在改了。
感谢你们的帮忙
不太明白这个数据类型的定义后的用法,为啥string后面是(data: Uint8Array),还通过=>指向一个void
目前用Map写的是
谢谢
(data: Uint8Array) => void
是一起的,这是一个函数签名,表示它读入一个 Uint8Array 的参数,并没有返回值(返回值为 undefined)感谢,那么我想调用相应key中的value的话,还是用
这种写法么?
试着这么写被VS画了红线
把 vscode 报告的 TypeScript 错误信息发出来看看
抱歉,仔细看了一下逻辑。
函数是要返回一个新的数据,因此返回类型是错的。
(data: Uint8Array) => void
应该改为
(data: Uint8Array) => Uint8Array
明白了,那么最后是写
Function
好还是改成(data: Uint8Array) => Uint8Array
比较好?两种写法都能跑起来。
我的建议是后者,因为提供了更详细的信息让 type script 来进行类型检查。
如果是前者然后改掉了函数参数类型,是不会报错的。
OK
@ -0,0 +40,4 @@
function ProcessX2M(data: Uint8Array) {
const x2mHeaderSize = 1024;
const x2mKey = [120, 109, 108, 121];
@ -0,0 +51,4 @@
function ProcessX3M(data: Uint8Array) {
const x3mHeaderSize = 1024;
const x3mKey = [51, 57, 56, 57, 100, 49, 49, 49, 97, 97, 100, 53, 54, 49, 51, 57, 52, 48, 102, 52, 102, 99, 52, 52, 98, 54, 51, 57, 98, 50, 57, 50];
@ -0,0 +97,4 @@
977, 154, 495, 840, 292, 633, 978, 155, 496, 841, 293, 634, 979, 156, 497, 842, 294, 635, 980, 157, 498, 843, 295, 636, 981, 158, 499, 844,
296, 637, 982, 159, 500, 845, 297, 638, 983, 160, 501, 846, 298, 639, 984, 161, 502, 847, 299, 640, 985, 162, 503, 848, 300, 641, 986, 163,
504, 849, 301, 642, 987, 164, 505, 850, 302, 643, 988, 165, 506, 851, 303, 644, 989, 166, 507, 852, 304, 645, 990, 167, 508, 853, 305, 646,
991, 168, 509, 854, 306
建议修改为 hex 格式,每行保持相同长度
抱歉,前两天发烧了没劲儿起来。。今天舒服点了在改了。
感谢你们的帮忙
嗯,都改好了
@ -0,0 +102,4 @@
const x3mScrambleTable = [
嗯,都改好了。
LGTM
@ -15,4 +16,3 @@
import InMemoryStorage from '@/utils/storage/InMemoryStorage';
export async function Decrypt(file: FileInfo, config: Record<string, any>): Promise<DecryptResult> {
// Worker thread will fallback to in-memory storage.
突然发现代码从 2 空格缩进变成了 4 空格缩进 - 请运行一次
npx prettier -w .
进行代码格式化。这么做修改了大量的文件,都需要包含到commit吗?
只包含你更改过的这两个文件吧。其它文件也需要格式化我是没想到的… 或者直接现在这样合并然后找个时间统一格式化? @um-dev 怎么看
OK,那我先commit这两个格式化过的index.ts和ximalaya.ts吧。
提个小建议,要是统一全部格式化,行缩进是不是4个Space比较好些? 无论是VS还是VSCode默认换行都是4格缩进。
EDIT: (格式化完了,两格感觉有些短?)
JavaScript/TypeScript 一般都是推荐使用 2 空格缩进(怀疑和 JS 语言容易产生 Callback Hell 有关),项目使用的 prettier 配置文件也是写的 2 空格。通常情况下遵守项目使用的代码风格即可。
https://git.unlock-music.dev/um/web/src/branch/master/.prettierrc.js
感觉可以合并了,没有什么需要额外处理的了。