Compare commits

...

9 Commits

Author SHA1 Message Date
鲁树人
9f2a74e1d6 docs: update readme re. ci
Some checks failed
Build / build (push) Failing after 1m54s
2025-05-09 06:07:21 +09:00
鲁树人
abda8cc1bb ci: fix pipeline typo 2025-05-09 06:04:51 +09:00
鲁树人
25aec6b199 ci: simplify build command 2025-05-09 06:03:48 +09:00
鲁树人
1676f9f095 build: copy readme and license to dist 2025-05-09 05:57:53 +09:00
鲁树人
bf96544a51 ci: add build pipeline 2025-05-09 05:56:39 +09:00
鲁树人
80d79d0f65 build: fix extension maker 2025-05-09 05:56:29 +09:00
鲁树人
b0ee928199 build: support node v22 2025-05-09 05:46:18 +09:00
鲁树人
f22b05f40d chore: move extension build script to scripts; update browser db 2025-05-09 05:33:26 +09:00
鲁树人
6addbb5ecd chore: pipeline / issue template cleanup 2025-05-09 05:19:07 +09:00
16 changed files with 238 additions and 274 deletions

View File

@ -1,25 +0,0 @@
---
kind: pipeline
type: docker
name: default
steps:
- name: build
image: node:16.18-bullseye
commands:
- apt-get update
- 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
- 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

View File

@ -1,40 +1,45 @@
---
name: "错误报告"
about: "报告 Bug 以帮助改进程序,非填表。"
title: "[BUG] "
labels:
- bug
---
* 请按照此模板填写,否则可能立即被关闭
- [x] 我确认已经搜索过Issue不存并确认相同的Issue
- [x] 我有证据表明这是程序导致的问题(如不确认,可以通过 Telegram 讨论组 (https://t.me/unlock_music_chat) 进行讨论)
## Bug描述
简要地复述你遇到的Bug
## 复现方法
描述复现方法,必要时请提供样本文件
## 程序截图或浏览器开发者控制台Console的报错信息
如果可以请提供二者之一
## 环境信息
- 操作系统和浏览器:
- 程序版本:
- 网页版的地址(如果为非官方部署请注明):
注意:如果需要会员才能获取该资源,你可能也需要作为附件提交。
## 附加信息
如果有,请提供其他能够帮助确认问题的信息到下方:
---
name: "错误报告"
about: "报告 Bug 以帮助改进程序,非填表。"
title: "[BUG] "
labels:
- bug
---
* 请按照此模板填写,否则可能立即被关闭。请将符合条件的 `[ ]` 更改为 `[x]`
- [ ] 我确认已经搜索过 issue确认没有已报告的相同 issue
- [ ] 我有证据表明这是程序导致的问题(如不确认,可以通过 Telegram 讨论组 (https://t.me/unlock_music_chat) 进行讨论)
## Bug描述
简要地复述你遇到的 Bug
……
## 复现方法
描述复现方法,必要时请提供样本文件:
……
## 程序截图或浏览器开发者控制台Console的报错信息
……
## 环境信息
- 操作系统和浏览器:
- 程序版本:
- 网页版的地址(如果为非官方部署请注明):
注意:如果需要会员才能获取该资源,你可能也需要作为附件提交。
## 附加信息
如果有其他能够帮助确认问题的信息,请在下方填写:
……

View File

@ -1,29 +1,28 @@
---
name: "新功能"
about: "对于程序新的想法或建议"
title: "[新功能] "
labels:
- enhancement
---
<!-- ⚠ 请按照此模板填写,否则可能立即被关闭 -->
<!-- 提交前请使用【Preview】预览提交的更改 -->
## 背景和说明
<!-- 简要说明产生此想法的背景和此想法的具体内容 -->
## 实现途径
- 如果没有设计方案,请简要描述实现思路
- 如果你没有任何的实现思路,请通过 Telegram 讨论组 (https://t.me/unlock_music_chat) 进行讨论
## 附加信息
<!-- 更多你想要表达的内容 -->
---
name: "新功能"
about: "对于程序新的想法或建议"
title: "[新功能] "
labels:
- enhancement
---
<!-- ⚠ 请按照此模板填写,否则可能立即被关闭 -->
<!-- 提交前可使用【Preview】预览提交的更改 -->
## 背景和说明
<!-- 简要说明产生此想法的背景和此想法的具体内容 -->
## 附加信息
<!-- 更多你想要表达的内容 -->
## 额外选项
<!-- 请将符合条件的 `[ ]` 更改为 `[x]` -->
- [ ] 我可以自行实现并提交 PR。
- [ ] 我确认已经搜索过 issue确认没有已报告的相同 issue

View File

@ -0,0 +1,42 @@
name: Build
on:
workflow_dispatch:
push:
paths:
- "src/**/*"
- "package.json"
- "package-lock.json"
pull_request:
branches: [ main ]
types: [ opened, synchronize, reopened ]
paths:
- "src/**/*"
- "package.json"
- "package-lock.json"
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout codebase
uses: actions/checkout@v4
- name: Set up node
uses: actions/setup-node@v4
with:
node-version-file: .nvmrc
- name: Install dependencies
run: npm ci
- name: Test
run: npm test
- name: Build all variants
run: npm run build:all
- name: Publish artifact
uses: christopherhx/gitea-upload-artifact@v4
with:
name: um-web-all
path: "um-*.zip"

View File

@ -1,47 +0,0 @@
image: node:16
cache:
paths:
- node_modules/
stages:
- build
build-job:
stage: build
script: |
sed -i 's/deb.debian.org/mirrors.cloud.tencent.com/g' /etc/apt/sources.list
apt-get update
apt-get -y install zip
npm config set registry http://mirrors.cloud.tencent.com/npm/
npm ci
npm run build
tar -czf legacy.tar.gz -C ./dist .
cd dist
zip -rJ9 ../legacy.zip *
cd ..
npm run make-extension
cd dist
zip -rJ9 ../extension.zip *
cd ..
npm run build -- --modern
tar -czf modern.tar.gz -C ./dist .
cd dist
zip -rJ9 ../modern.zip *
cd ..
sha256sum *.tar.gz *.zip > sha256sum.txt
artifacts:
name: "$CI_JOB_NAME"
paths:
- legacy.zip
- legacy.tar.gz
- extension.zip
- modern.zip
- modern.tar.gz
- sha256sum.txt

View File

@ -1,76 +0,0 @@
name: 解码错误报告 (填表)
about: 遇到文件解码失败的问题请选择该项。
title: '[Bug/Crypto] '
labels:
- bug
- crypto
body:
- type: textarea
id: what-happened
attributes:
label: 错误描述
description: 请描述你所遇到的问题,以及你期待的行为。
placeholder: ''
value: ''
validations:
required: true
- type: dropdown
id: version
attributes:
label: Unlock Music 版本
description: |
能够重现错误的版本,版本号通常在页面底部。
如果不确定,请升级到最新版确认问题是否解决。
multiple: true
options:
- 1.10.5 (仓库最新)
- 1.10.3 (官方 DEMO)
- 其它(请在错误描述中指定)
validations:
required: true
- type: dropdown
id: browsers
attributes:
label: 产生错误的浏览器
multiple: true
options:
- 火狐 / Firefox
- Chrome
- Safari
- 其它基于 Chromium 的浏览器 (Edge、Brave、Opera 等)
- type: dropdown
id: music-platform
attributes:
label: 音乐平台
description: |
如果需要报告多个平台的问题,请每个平台提交一个新的 Issue。
请注意:播放器缓存文件不属于该项目支持的文件类型。
multiple: false
options:
- 其它 (请在错误描述指定)
- QQ 音乐
- Joox (QQ 音乐海外版)
- 虾米音乐
- 网易云音乐
- 酷我音乐
- 酷狗音乐
- 喜马拉雅
- 咪咕 3D
validations:
required: true
- type: textarea
id: logs
attributes:
label: 日志信息
description: 如果有请提供浏览器开发者控制台Console的错误日志
render: text
- type: checkboxes
id: terms
attributes:
label: 我已经阅读并确认下述内容
description: ''
options:
- label: 我已经检索过 Issue 列表,并确认这是一个为报告过的问题。
required: true
- label: 我有证据表明这是程序导致的问题(如不确认,可以通过 Telegram 讨论组 (https://t.me/unlock_music_chat) 进行讨论)
required: true

View File

@ -1,12 +1,12 @@
# Unlock Music 音乐解锁
[![Build Status](https://ci.unlock-music.dev/api/badges/um/web/status.svg)](https://ci.unlock-music.dev/um/web)
[![Build Status](https://git.unlock-music.dev/um/web/actions/workflows/build.yml/badge.svg)][ci]
- 在浏览器中解锁加密的音乐文件。 Unlock encrypted music file in the browser.
- Unlock Music 项目是以学习和技术研究的初衷创建的,修改、再分发时请遵循[授权协议]。
- Unlock Music 的 CLI 版本可以在 [unlock-music/cli] 找到,大批量转换建议使用 CLI 版本。
- 我们新建了 Telegram 群组 [`@unlock_music_chat`] ,欢迎加入!
- CI 自动构建已经部署,可以在 [um-packages] 下载
- CI 自动构建已经部署,可以在 [Actions][ci] 下载
> **WARNING**
> 在本站 fork 不会起到备份的作用,只会浪费服务器储存空间。如无必要请勿 fork 该仓库。
@ -14,7 +14,7 @@
[授权协议]: 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/
[ci]: https://git.unlock-music.dev/um/web/actions?workflow=build.yml
## 特性
@ -45,7 +45,7 @@
### 使用预构建版本
- 从 [Release] 或 [CI 构建][um-packages] 下载预构建的版本
- 从 [Release] 或 [CI 构建][ci] 下载预构建的版本
- :warning: 本地使用请下载`legacy版本``modern版本`只能通过 **http(s)协议** 访问)
- 解压缩后即可部署或本地使用(**请勿直接运行源代码**
@ -54,7 +54,7 @@
### 自行构建
- 环境要求
- nodejs (v16.x)
- nodejs (v22.x)
- npm
1. 获取项目源代码后安装相关依赖:

12
package-lock.json generated
View File

@ -5712,9 +5712,9 @@
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001668",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001668.tgz",
"integrity": "sha512-nWLrdxqCdblixUO+27JtGJJE/txpJlyUy5YN1u53wLZkP0emYCo5zgS6QYft7VUYR42LGgi/S5hdLZTrnyIddw==",
"version": "1.0.30001717",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001717.tgz",
"integrity": "sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw==",
"funding": [
{
"type": "opencollective",
@ -25491,9 +25491,9 @@
}
},
"caniuse-lite": {
"version": "1.0.30001668",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001668.tgz",
"integrity": "sha512-nWLrdxqCdblixUO+27JtGJJE/txpJlyUy5YN1u53wLZkP0emYCo5zgS6QYft7VUYR42LGgi/S5hdLZTrnyIddw=="
"version": "1.0.30001717",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001717.tgz",
"integrity": "sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw=="
},
"case-sensitive-paths-webpack-plugin": {
"version": "2.4.0",

View File

@ -14,10 +14,11 @@
"postinstall": "patch-package",
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"build:all": "./scripts/build-and-package.sh --all",
"test": "jest",
"pretty": "prettier --write src/{**/*,*}.{js,ts,jsx,tsx,vue}",
"pretty:check": "prettier --check src/{**/*,*}.{js,ts,jsx,tsx,vue}",
"make-extension": "node ./make-extension.js"
"make-extension": "node ./scripts/make-extension.js"
},
"dependencies": {
"@babel/preset-typescript": "^7.16.5",
@ -57,4 +58,4 @@
"vue-cli-plugin-element": "^1.0.1",
"vue-template-compiler": "^2.6.14"
}
}
}

View File

@ -0,0 +1,21 @@
diff --git a/node_modules/babel-loader/lib/cache.js b/node_modules/babel-loader/lib/cache.js
index fced210..6b0c137 100644
--- a/node_modules/babel-loader/lib/cache.js
+++ b/node_modules/babel-loader/lib/cache.js
@@ -91,15 +91,7 @@ const write = /*#__PURE__*/function () {
const filename = function (source, identifier, options) {
- // md4 hashing is not supported starting with node v17.0.0
- const majorNodeVersion = parseInt(process.versions.node.split(".")[0], 10);
- let hashType = "md4";
-
- if (majorNodeVersion >= 17) {
- hashType = "md5";
- }
-
- const hash = crypto.createHash(hashType);
+ const hash = crypto.createHash("sha256");
const contents = JSON.stringify({
source,
options,

View File

@ -0,0 +1,13 @@
diff --git a/node_modules/copy-webpack-plugin/dist/postProcessPattern.js b/node_modules/copy-webpack-plugin/dist/postProcessPattern.js
index 8354f00..9bdf6ed 100644
--- a/node_modules/copy-webpack-plugin/dist/postProcessPattern.js
+++ b/node_modules/copy-webpack-plugin/dist/postProcessPattern.js
@@ -69,7 +69,7 @@ function postProcessPattern(globalRef, pattern, file) {
name: _package.name,
version: _package.version,
pattern,
- hash: _crypto.default.createHash('md4').update(content).digest('hex')
+ hash: _crypto.default.createHash('sha256').update(content).digest('hex')
});
return _cacache.default.get(globalRef.cacheDir, cacheKey).then(result => {
logger.debug(`getting cached transformation for '${file.absoluteFrom}'`);

View File

@ -0,0 +1,13 @@
diff --git a/node_modules/terser-webpack-plugin/dist/index.js b/node_modules/terser-webpack-plugin/dist/index.js
index 6268f6b..1cb8f2c 100644
--- a/node_modules/terser-webpack-plugin/dist/index.js
+++ b/node_modules/terser-webpack-plugin/dist/index.js
@@ -214,7 +214,7 @@ class TerserPlugin {
// eslint-disable-next-line global-require
'terser-webpack-plugin': require('../package.json').version,
'terser-webpack-plugin-options': this.options,
- hash: _crypto.default.createHash('md4').update(input).digest('hex')
+ hash: _crypto.default.createHash('sha256').update(input).digest('hex')
};
task.cacheKeys = this.options.cacheKeys(defaultCacheKeys, file);
}

View File

@ -0,0 +1,26 @@
diff --git a/node_modules/webpack/lib/optimize/SplitChunksPlugin.js b/node_modules/webpack/lib/optimize/SplitChunksPlugin.js
index e7d560b..94a8401 100644
--- a/node_modules/webpack/lib/optimize/SplitChunksPlugin.js
+++ b/node_modules/webpack/lib/optimize/SplitChunksPlugin.js
@@ -22,7 +22,7 @@ const deterministicGroupingForModules = /** @type {function(DeterministicGroupin
const hashFilename = name => {
return crypto
- .createHash("md4")
+ .createHash("sha256")
.update(name)
.digest("hex")
.slice(0, 8);
diff --git a/node_modules/webpack/lib/util/createHash.js b/node_modules/webpack/lib/util/createHash.js
index 64de510..4cc3fc9 100644
--- a/node_modules/webpack/lib/util/createHash.js
+++ b/node_modules/webpack/lib/util/createHash.js
@@ -131,6 +131,8 @@ module.exports = algorithm => {
// TODO add non-cryptographic algorithm here
case "debug":
return new DebugHash();
+ case 'md4':
+ algorithm = "sha256";
default:
return new BulkUpdateDecorator(require("crypto").createHash(algorithm));
}

View File

@ -11,6 +11,12 @@ case "$1" in
"modern") npm run build -- --modern ;;
"legacy") npm run build ;;
"extension") npm run make-extension ;;
"--all")
"$0" legacy
"$0" extension
"$0" modern
exit 0
;;
*)
echo "Unknown command: $1"
@ -18,6 +24,7 @@ case "$1" in
;;
esac
cp README.md LICENSE dist/
mv dist "${DIST_NAME}"
zip -rJ9 "${DIST_NAME}.zip" "${DIST_NAME}"

54
make-extension.js → scripts/make-extension.js Normal file → Executable file
View File

@ -1,25 +1,29 @@
const fs = require('fs')
const path = require('path')
const src = __dirname + "/src/extension/"
const dst = __dirname + "/dist"
fs.readdirSync(src).forEach(file => {
let srcPath = path.join(src, file)
let dstPath = path.join(dst, file)
fs.copyFileSync(srcPath, dstPath)
console.log(`Copy: ${srcPath} => ${dstPath}`)
})
const manifestRaw = fs.readFileSync(__dirname + "/extension-manifest.json", "utf-8")
const manifest = JSON.parse(manifestRaw)
const pkgRaw = fs.readFileSync(__dirname + "/package.json", "utf-8")
const pkg = JSON.parse(pkgRaw)
verExt = pkg["version"]
if (verExt.startsWith("v")) verExt = verExt.slice(1)
if (verExt.includes("-")) verExt = verExt.split("-")[0]
manifest["version"] = `${verExt}.${pkg["ext_build"]}`
manifest["version_name"] = pkg["version"]
fs.writeFileSync(__dirname + "/dist/manifest.json", JSON.stringify(manifest), "utf-8")
console.log("Write: manifest.json")
#!/usr/bin/env node
const fs = require('fs')
const path = require('path')
const DIR_ROOT = path.resolve(__dirname, "..")
const src = DIR_ROOT + "/src/extension/"
const dst = DIR_ROOT + "/dist"
fs.readdirSync(src).forEach(file => {
let srcPath = path.join(src, file)
let dstPath = path.join(dst, file)
fs.copyFileSync(srcPath, dstPath)
console.log(`Copy: ${srcPath} => ${dstPath}`)
})
const manifestRaw = fs.readFileSync(DIR_ROOT + "/extension-manifest.json", "utf-8")
const manifest = JSON.parse(manifestRaw)
const pkgRaw = fs.readFileSync(DIR_ROOT + "/package.json", "utf-8")
const pkg = JSON.parse(pkgRaw)
verExt = pkg["version"]
if (verExt.startsWith("v")) verExt = verExt.slice(1)
if (verExt.includes("-")) verExt = verExt.split("-")[0]
manifest["version"] = `${verExt}.${pkg["ext_build"]}`
manifest["version_name"] = pkg["version"]
fs.writeFileSync(DIR_ROOT + "/dist/manifest.json", JSON.stringify(manifest), "utf-8")
console.log("Write: manifest.json")

View File

@ -1,19 +0,0 @@
#!/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