diff --git a/.drone.yml b/.drone.yml
index dd9059e..ea4454c 100644
--- a/.drone.yml
+++ b/.drone.yml
@@ -4,34 +4,27 @@ type: docker
name: default
steps:
+ - name: build-wasm
+ image: emscripten/emsdk:3.0.0
+ commands:
+ - ./scripts/build-wasm.sh
+
- name: build
image: node:18.12-bullseye
commands:
- apt-get update
- - apt-get install -y cmake jq zip
- - ./scripts/build-wasm.sh
+ - apt-get install -y jq zip
- npm ci
- npm run test
- ./scripts/build-and-package.sh legacy
- ./scripts/build-and-package.sh extension
- ./scripts/build-and-package.sh modern
- - sha256sum *.zip > sha256sum.txt
- - mkdir -p upload
- - mv *.zip sha256sum.txt upload/
- - name: upload
- image: 'plugins/s3'
- settings:
- path_style: true
- endpoint:
- from_secret: S3_ENDPOINT
- access_key:
- from_secret: S3_ACCESS_KEY
- secret_key:
- from_secret: S3_SECRET_KEY
- bucket:
- from_secret: S3_BUCKET
- region: 'auto'
- source: 'upload/*'
- strip_prefix: 'upload/'
- target: '${DRONE_REPO}/${DRONE_BUILD_NUMBER}/'
+ - name: upload artifact
+ image: node:16.18-bullseye
+ environment:
+ DRONE_GITEA_SERVER: https://git.unlock-music.dev
+ GITEA_API_KEY:
+ from_secret: GITEA_API_KEY
+ commands:
+ - ./scripts/upload-packages.sh
diff --git a/README.md b/README.md
index 7e48fb3..79137b9 100644
--- a/README.md
+++ b/README.md
@@ -1,13 +1,17 @@
# Unlock Music 音乐解锁
+[![Build Status](https://ci.unlock-music.dev/api/badges/um/web/status.svg)](https://ci.unlock-music.dev/um/web)
+
- 在浏览器中解锁加密的音乐文件。 Unlock encrypted music file in the browser.
- Unlock Music 项目是以学习和技术研究的初衷创建的,修改、再分发时请遵循[授权协议]。
- Unlock Music 的 CLI 版本可以在 [unlock-music/cli] 找到,大批量转换建议使用 CLI 版本。
- 我们新建了 Telegram 群组 [`@unlock_music_chat`] ,欢迎加入!
+- CI 自动构建已经部署,可以在 [UM-Packages] 下载
[授权协议]: https://git.unlock-music.dev/um/web/src/branch/master/LICENSE
[unlock-music/cli]: https://git.unlock-music.dev/um/cli
[`@unlock_music_chat`]: https://t.me/unlock_music_chat
+[um-packages]: https://git.unlock-music.dev/um/-/packages/generic/web-build/
## 特性
@@ -36,7 +40,7 @@
### 使用预构建版本
-- 从 [Release] 下载预构建的版本
+- 从 [Release] 或 [CI 构建][um-packages] 下载预构建的版本
- :warning: 本地使用请下载`legacy版本`(`modern版本`只能通过 **http(s)协议** 访问)
- 解压缩后即可部署或本地使用(**请勿直接运行源代码**)
diff --git a/index.html b/index.html
index 468599e..7642d25 100644
--- a/index.html
+++ b/index.html
@@ -8,18 +8,12 @@
请勿直接运行源代码!
diff --git a/scripts/upload-packages.sh b/scripts/upload-packages.sh
new file mode 100755
index 0000000..06c3d43
--- /dev/null
+++ b/scripts/upload-packages.sh
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+set -ex
+
+cd "$(git rev-parse --show-toplevel)"
+
+if [ -z "$GITEA_API_KEY" ]; then
+ echo "GITEA_API_KEY is empty, skip upload."
+ exit 0
+fi
+
+URL_BASE="$DRONE_GITEA_SERVER/api/packages/${DRONE_REPO_NAMESPACE}/generic/${DRONE_REPO_NAME}-build"
+
+for ZIP_NAME in *.zip; do
+ UPLOAD_URL="${URL_BASE}/${DRONE_BUILD_NUMBER}/${ZIP_NAME}"
+ sha256sum "${ZIP_NAME}"
+ curl -sLifu "um-release-bot:$GITEA_API_KEY" -T "${ZIP_NAME}" "${UPLOAD_URL}"
+ echo "Uploaded to: ${UPLOAD_URL}"
+done
diff --git a/src/KgmWasm/build-wasm b/src/KgmWasm/build-wasm
index 85f5658..599b97c 100755
--- a/src/KgmWasm/build-wasm
+++ b/src/KgmWasm/build-wasm
@@ -8,29 +8,31 @@ CURR_DIR="${PWD}"
BUILD_TYPE="$1"
if [ -z "$BUILD_TYPE" ]; then
- BUILD_TYPE=Release
+ BUILD_TYPE=Release
+fi
+
+# CI: already had emsdk installed.
+if ! command -v emcc; then
+ if [ ! -d ../../build/emsdk ]; then
+ git clone https://github.com/emscripten-core/emsdk.git ../../build/emsdk
+ fi
+
+ pushd ../../build/emsdk
+ ./emsdk install 3.0.0
+ ./emsdk activate 3.0.0
+ source ./emsdk_env.sh
+ popd # ../../build/emsdk
fi
mkdir -p build/wasm
-if [ ! -d ../../build/emsdk ]; then
- git clone https://github.com/emscripten-core/emsdk.git ../../build/emsdk
-fi
-
-pushd ../../build/emsdk
-#git pull
-./emsdk install 3.0.0
-./emsdk activate 3.0.0
-source ./emsdk_env.sh
-popd # ../../build/emsdk
-
pushd build/wasm
emcmake cmake -DCMAKE_BUILD_TYPE="$BUILD_TYPE" ../..
make -j
TARGET_FILES="
- KgmLegacy.js
- KgmWasm.js
- KgmWasm.wasm
- KgmWasmBundle.js
+ KgmLegacy.js
+ KgmWasm.js
+ KgmWasm.wasm
+ KgmWasmBundle.js
"
cp $TARGET_FILES "${CURR_DIR}/"
diff --git a/src/QmcWasm/build-wasm b/src/QmcWasm/build-wasm
index c906fae..4cd1640 100755
--- a/src/QmcWasm/build-wasm
+++ b/src/QmcWasm/build-wasm
@@ -8,28 +8,31 @@ CURR_DIR="${PWD}"
BUILD_TYPE="$1"
if [ -z "$BUILD_TYPE" ]; then
- BUILD_TYPE=Release
+ BUILD_TYPE=Release
+fi
+
+# CI: already had emsdk installed.
+if ! command -v emcc; then
+ if [ ! -d ../../build/emsdk ]; then
+ git clone https://github.com/emscripten-core/emsdk.git ../../build/emsdk
+ fi
+
+ pushd ../../build/emsdk
+ ./emsdk install 3.0.0
+ ./emsdk activate 3.0.0
+ source ./emsdk_env.sh
+ popd # ../../build/emsdk
fi
mkdir -p build/wasm
-if [ ! -d ../../build/emsdk ]; then
- git clone https://github.com/emscripten-core/emsdk.git ../../build/emsdk
-fi
-
-pushd ../../build/emsdk
-./emsdk install 3.0.0
-./emsdk activate 3.0.0
-source ./emsdk_env.sh
-popd # ../../build/emsdk
-
pushd build/wasm
emcmake cmake -DCMAKE_BUILD_TYPE="$BUILD_TYPE" ../..
make -j
TARGET_FILES="
- QmcLegacy.js
- QmcWasm.js
- QmcWasm.wasm
- QmcWasmBundle.js
+ QmcLegacy.js
+ QmcWasm.js
+ QmcWasm.wasm
+ QmcWasmBundle.js
"
cp $TARGET_FILES "${CURR_DIR}/"
diff --git a/src/decrypt/index.ts b/src/decrypt/index.ts
index 3fae4a2..dbf8f6a 100644
--- a/src/decrypt/index.ts
+++ b/src/decrypt/index.ts
@@ -70,6 +70,7 @@ export async function Decrypt(file: FileInfo, config: Record): Prom
case 'mgg': //QQ Music New Ogg
case 'mgg1': //QQ Music New Ogg
case 'mgg0':
+ case 'mmp4': // QMC MP4 Container w/ E-AC-3 JOC
case '666c6163': //QQ Music Weiyun Flac
case '6d7033': //QQ Music Weiyun Mp3
case '6f6767': //QQ Music Weiyun Ogg
diff --git a/src/decrypt/kwm.ts b/src/decrypt/kwm.ts
index 59895ae..f2a08c7 100644
--- a/src/decrypt/kwm.ts
+++ b/src/decrypt/kwm.ts
@@ -13,14 +13,18 @@ import { DecryptResult } from '@/decrypt/entity';
//prettier-ignore
const MagicHeader = [
- 0x79, 0x65, 0x65, 0x6C, 0x69, 0x6F, 0x6E, 0x2D,
- 0x6B, 0x75, 0x77, 0x6F, 0x2D, 0x74, 0x6D, 0x65,
-]
+ 0x79, 0x65, 0x65, 0x6C, 0x69, 0x6F, 0x6E, 0x2D,
+ 0x6B, 0x75, 0x77, 0x6F, 0x2D, 0x74, 0x6D, 0x65,
+];
+const MagicHeader2 = [
+ 0x79, 0x65, 0x65, 0x6C, 0x69, 0x6F, 0x6E, 0x2D,
+ 0x6B, 0x75, 0x77, 0x6F, 0x00, 0x00, 0x00, 0x00,
+];
const PreDefinedKey = 'MoOtOiTvINGwd2E6n0E1i7L5t2IoOoNk';
export async function Decrypt(file: File, raw_filename: string, _: string): Promise {
const oriData = new Uint8Array(await GetArrayBuffer(file));
- if (!BytesHasPrefix(oriData, MagicHeader)) {
+ if (!BytesHasPrefix(oriData, MagicHeader) && !BytesHasPrefix(oriData, MagicHeader2)) {
if (SniffAudioExt(oriData) === 'aac') {
return await RawDecrypt(file, raw_filename, 'aac', false);
}
diff --git a/src/decrypt/qmc.ts b/src/decrypt/qmc.ts
index db3e2fe..ebeebfe 100644
--- a/src/decrypt/qmc.ts
+++ b/src/decrypt/qmc.ts
@@ -18,6 +18,7 @@ export const HandlerMap: { [key: string]: Handler } = {
mgg1: { ext: 'ogg', version: 2 },
mflac: { ext: 'flac', version: 2 },
mflac0: { ext: 'flac', version: 2 },
+ mmp4: { ext: 'mmp4', version: 2 },
// qmcflac / qmcogg:
// 有可能是 v2 加密但混用同一个后缀名。
diff --git a/src/extension/ixarea-stats.js b/src/extension/ixarea-stats.js
deleted file mode 100644
index e69de29..0000000
diff --git a/src/ixarea-stats.js b/src/ixarea-stats.js
deleted file mode 100644
index 355d75a..0000000
--- a/src/ixarea-stats.js
+++ /dev/null
@@ -1,15 +0,0 @@
-var _paq = window._paq || [];
-_paq.push(
- ['setRequestMethod', 'POST'],
- ['trackPageView'],
- ['enableLinkTracking'],
- ['setSiteId', '2'],
- ['setTrackerUrl', 'https://stats.ixarea.com/ixarea-stats/report'],
-);
-
-var tag = document.createElement('script');
-tag.type = 'text/javascript';
-tag.async = true;
-tag.src = 'https://stats.ixarea.com/ixarea-stats.js';
-var s = document.getElementsByTagName('script')[0];
-s.parentNode.insertBefore(tag, s);