6 Commits
1.1.0 ... 1.1.2

Author SHA1 Message Date
MengYX
211b4e0206 #9 Add QQ Music tkm Format 2020-01-27 18:02:39 +08:00
MengYX
4cd5b45986 Fix QMC filename error 2020-01-27 16:43:40 +08:00
MengYX
60445b7ed9 #11 Add Moo Music Format 2020-01-27 14:06:45 +08:00
MengYX
4e499b2deb Merge branch 'master' of github.com:ix64/unlock-music 2020-01-21 20:00:20 +08:00
MengYX
51a5a8a44f Update README.md 2019-12-23 19:09:24 +08:00
MengYX
2fb5aecdb2 Update README.md 2019-12-16 19:01:56 +08:00
6 changed files with 283 additions and 279 deletions

View File

@@ -1,14 +1,16 @@
# Unlock Music 音乐解锁
- Unlock encrypted music file in browser.
- 在浏览器中解锁加密的音乐文件。
- [Online Demo](https://tool.ixarea.com/music)
- unlock-music项目是以学习和技术研究的初衷创建的。
- 由于存在可能的法律风险以及滥用风险不再提供Demo服务。
[![Build Status](https://ci.ixarea.com/api/badges/ix64/unlock-music/status.svg)](https://ci.ixarea.com/ix64/unlock-music)
# Features
- [x] Unlock in browser 在浏览器中解锁
- [x] QQMusic Format QQ音乐格式 (.qmc0/.qmc3/.qmcflac/.qmcogg)
- [x] QQMusic Tm Format QQ音乐 (.tm0/.tm2/.tm3/.tm6)
- [x] QQMusic Format QQ音乐格式 (.qmc0/.qmc3/.qmcflac/.qmcogg/.tkm)
- [x] MooMusic Format Moo音乐格式 ([.bkcmp3/.bkcflac](https://github.com/ix64/unlock-music/issues/11))
- [x] QQMusic Tm Format QQ音乐Tm格式 (.tm0/.tm2/.tm3/.tm6)
- [ ] QQMusic New Format QQ音乐新格式
- [x] .mflac (Partial 部分支持)
- [ ] .mgg
@@ -18,7 +20,6 @@
- [x] Batch unlocking 批量解锁
- [x] Progressive Web App 渐进式Web应用
- [x] Complete ID3 for ncm 补全ncm的ID3信息
- [ ] Multi-language 多语言
# 使用方法
## 下载已构建版本

502
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{
"name": "unlock-music",
"version": "1.1.0",
"version": "1.1.2",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",

View File

@@ -67,7 +67,8 @@
<el-footer id="app-footer">
<el-row>
音乐解锁移除已购音乐的加密保护
目前支持网易云音乐(ncm)QQ音乐(qmc0, qmc3, qmcflac, qmcogg, mflac)
目前支持网易云音乐(ncm)QQ音乐(qmc, mflac, tkm)以及
<a href="https://github.com/ix64/unlock-music/blob/master/README.md" target="_blank">其他格式</a>
<a href="https://github.com/ix64/unlock-music/wiki/使用提示" target="_blank">使用提示</a>
</el-row>
<el-row>
@@ -108,7 +109,7 @@
this.$notify.info({
title: '离线使用',
message: '我们使用PWA技术无网络也能使用<br/>' +
'最近更新:支持tm0/2/3/6<br/>' +
'最近更新:支持bkcmp3/bkcflac/tkm<br/>' +
'点击查看 <a target="_blank" href="https://github.com/ix64/unlock-music/wiki/使用提示">使用提示</a>',
dangerouslyUseHTMLString: true,
duration: 10000,
@@ -118,7 +119,7 @@
handleFile(file) {
(async () => {
let data =await dec.CommonDecrypt(file);
let data = await dec.CommonDecrypt(file);
if (data.status) {
this.tableData.push(data);
this.$notify.success({
@@ -193,8 +194,8 @@
}
#app-footer a {
padding-left: 0.5em;
padding-right: 0.5em;
padding-left: 0.2em;
padding-right: 0.2em;
}
#app-footer {

View File

@@ -16,7 +16,8 @@ async function CommonDecrypt(file) {
break;
case "mp3":// Raw Mp3
case "flac"://Raw Flac
case "m4a":// todo: Raw M4A
case "m4a":// Raw M4a
case "ogg":// Raw Ogg
rt_data = await RawDecrypt.Decrypt(file.raw, raw_filename, raw_ext);
break;
case "tm0":// QQ Music IOS Mp3
@@ -27,13 +28,16 @@ async function CommonDecrypt(file) {
case "qmc0"://QQ Music Android Mp3
case "qmcflac"://QQ Music Android Flac
case "qmcogg"://QQ Music Android Ogg
case "tkm"://QQ Music Accompaniment M4a
case "bkcmp3"://Moo Music Mp3
case "bkcflac"://Moo Music Flac
rt_data = await QmcDecrypt.Decrypt(file.raw, raw_filename, raw_ext);
break;
case "mflac"://QQ Music Desktop Flac
rt_data = await MFlacDecrypt.Decrypt(file.raw, raw_filename, raw_ext);
break;
case "tm2":// todo: QQ Music IOS M4A
case "tm6":// todo: QQ Music IOS M4A
case "tm2":// QQ Music IOS M4a
case "tm6":// QQ Music IOS M4a
rt_data = await TmDecrypt.Decrypt(file.raw, raw_filename);
break;
default:

View File

@@ -11,24 +11,22 @@ const SEED_MAP = [
[0x0e, 0x74, 0xbb, 0x90, 0xbc, 0x3f, 0x92],
[0x00, 0x09, 0x5b, 0x9f, 0x62, 0x66, 0xa1]];
const OriginalExtMap = {
"qmc0": "mp3",
"qmc3": "mp3",
"qmcogg": "ogg",
"qmcflac": "flac",
"bkcmp3": "mp3",
"bkcflac": "flac",
"tkm": "m4a"
};
async function Decrypt(file, raw_filename, raw_ext) {
// 获取扩展名
let new_ext;
switch (raw_ext) {
case "qmc0":
case "qmc3":
new_ext = "mp3";
break;
case "qmcogg":
new_ext = "ogg";
break;
case "qmcflac":
new_ext = "flac";
break;
default:
return {status: false, message: "File type is incorrect!"}
if (!(raw_ext in OriginalExtMap)) {
return {status: false, message: "File type is incorrect!"}
}
let new_ext = OriginalExtMap[raw_ext]
const mime = util.AudioMimeType[new_ext];
// 读取文件
const fileBuffer = await util.GetArrayBuffer(file);
@@ -43,7 +41,7 @@ async function Decrypt(file, raw_filename, raw_ext) {
const musicUrl = URL.createObjectURL(musicData);
// 读取Meta
let tag = await musicMetadata.parseBlob(musicData);
const info = util.GetFileInfo(tag.common.artist, tag.common.title, raw_filename, raw_ext);
const info = util.GetFileInfo(tag.common.artist, tag.common.title, raw_filename, new_ext);
let picUrl = util.GetCoverURL(tag);
// 返回