diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
deleted file mode 100644
index 7ae50bf..0000000
--- a/.github/workflows/build.yml
+++ /dev/null
@@ -1,87 +0,0 @@
-# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json
-
-name: Test Build
-on:
- push:
- paths:
- - ".github/workflows/*"
- - "**/*.js"
- - "**/*.ts"
- - "**/*.vue"
- - "public/**/*"
- - "package-lock.json"
- - "package.json"
- pull_request:
- branches: [ master ]
- types: [ opened, synchronize, reopened ]
- paths:
- - "**/*.js"
- - "**/*.ts"
- - "**/*.vue"
- - "public/**/*"
- - "package-lock.json"
- - "package.json"
-
-
-jobs:
- test-coverage:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v2
- - run: npm ci
- # note: forks can not access to GITHUB_TOKEN for coverage update.
- # instead, we just ran the test in this case.
- - name: Test only
- if: github.event_name != 'push'
- run: npm test
- - name: Test + Publish Coverage
- uses: ArtiomTr/jest-coverage-report-action@v2.0-rc.6
- if: github.event_name == 'push'
- with:
- github-token: ${{ secrets.GITHUB_TOKEN }}
- annotations: none
- build:
- runs-on: ubuntu-latest
- strategy:
- matrix:
- build: [ legacy, modern ]
- include:
- - build: legacy
- BUILD_ARGS: ""
- BUILD_EXTENSION: true
- - build: modern
- BUILD_ARGS: "-- --modern"
- BUILD_EXTENSION: false
- steps:
- - uses: actions/checkout@v2
-
- - name: Use Node.js 16.x
- uses: actions/setup-node@v2
- with:
- node-version: "16"
-
- - name: Install Dependencies
- run: npm ci
-
- - name: Build Wasm
- run: bash build-wasm
-
- - name: Build
- run: npm run build ${{ matrix.BUILD_ARGS }}
-
- - name: Publish artifact
- uses: actions/upload-artifact@v2
- with:
- name: ${{ matrix.build }}
- path: ./dist
-
- - name: Build Extension
- if: ${{ matrix.BUILD_EXTENSION }}
- run: npm run make-extension
-
- - name: Publish artifact - Extension
- if: ${{ matrix.BUILD_EXTENSION }}
- uses: actions/upload-artifact@v2
- with:
- name: extension
- path: ./dist
diff --git a/.github/workflows/post-release.yml b/.github/workflows/post-release.yml
deleted file mode 100644
index deacf97..0000000
--- a/.github/workflows/post-release.yml
+++ /dev/null
@@ -1,65 +0,0 @@
-name: Post Release
-on:
- release:
- types: [ published ]
-jobs:
- release-docker:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v2
-
- - name: Setup vars
- id: vars
- env:
- RELEASE_REF: ${{ github.ref }}
- run: echo "::set-output name=tag::${RELEASE_REF#refs/tags/}"
-
- - name: Download release content
- run: |
- echo "https://github.com/${{ github.repository }}/releases/download/${{ steps.vars.outputs.tag }}/modern.tar.gz"
- wget -O modern.tar.gz "https://github.com/${{ github.repository }}/releases/download/${{ steps.vars.outputs.tag }}/modern.tar.gz"
- mkdir ./dist
- tar zxf modern.tar.gz -C ./dist
-
- - name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v1
-
- - name: Login to DockerHub
- uses: docker/login-action@v1
- with:
- username: ${{ secrets.DOCKERHUB_USERNAME }}
- password: ${{ secrets.DOCKERHUB_TOKEN }}
-
- - name: Build docker and push (on modern)
- uses: docker/build-push-action@v2
- with:
- context: .
- file: ./Dockerfile
- platforms: linux/amd64,linux/arm64,linux/386
- push: true
- tags: |
- ix64/unlock-music:latest
- ix64/unlock-music:${{ steps.vars.outputs.tag }}
-
- gh-pages:
- runs-on: ubuntu-latest
- steps:
- - name: Setup vars
- id: vars
- env:
- RELEASE_REF: ${{ github.ref }}
- run: echo "::set-output name=tag::${RELEASE_REF#refs/tags/}"
-
- - name: Download release content
- run: |
- echo "https://github.com/${{ github.repository }}/releases/download/${{ steps.vars.outputs.tag }}/modern.tar.gz"
- wget -O modern.tar.gz "https://github.com/${{ github.repository }}/releases/download/${{ steps.vars.outputs.tag }}/modern.tar.gz"
- mkdir ./dist
- tar zxf modern.tar.gz -C ./dist
-
- - name: Deploy
- uses: peaceiris/actions-gh-pages@v3
- with:
- github_token: ${{ secrets.GITHUB_TOKEN }}
- publish_dir: ./dist
-
diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml
deleted file mode 100644
index 95d6eb3..0000000
--- a/.github/workflows/release-build.yml
+++ /dev/null
@@ -1,129 +0,0 @@
-name: Build Release
-
-on:
- push:
- tags:
- - "v*"
-
-jobs:
- build:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v2
-
- - name: Use Node.js 16.x
- uses: actions/setup-node@v2
- with:
- node-version: "16"
-
- - name: Install Dependencies
- run: npm ci
-
- - name: Build Wasm
- run: bash build-wasm
-
- - name: Build Legacy
- env:
- GZIP: "--best"
- run: |
- npm run build
- tar -czf legacy.tar.gz -C ./dist .
- cd dist
- zip -rJ9 ../legacy.zip *
- cd ..
-
- - name: Build Extension (on legacy)
- env:
- GZIP: "--best"
- run: |
- npm run make-extension
- cd dist
- zip -rJ9 ../extension.zip *
- cd ..
-
- - name: Build Modern
- env:
- GZIP: "--best"
- run: |
- npm run build -- --modern
- tar -czf modern.tar.gz -C ./dist .
- cd dist
- zip -rJ9 ../modern.zip *
- cd ..
-
- - name: Checksum
- run: sha256sum *.tar.gz *.zip > sha256sum.txt
-
- - name: Get current time
- id: date
- run: echo "::set-output name=date::$(date +'%Y/%m/%d')"
-
- - name: Create a Release
- id: create_release
- uses: actions/create-release@v1
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- with:
- tag_name: ${{ github.ref }}
- release_name: "Build ${{ steps.date.outputs.date }}"
- draft: true
-
- - name: Upload Release Assets - legacy.tar.gz
- uses: actions/upload-release-asset@v1
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- with:
- upload_url: ${{ steps.create_release.outputs.upload_url }}
- asset_path: ./legacy.tar.gz
- asset_name: legacy.tar.gz
- asset_content_type: application/gzip
-
- - name: Upload Release Assets - legacy.zip
- uses: actions/upload-release-asset@v1
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- with:
- upload_url: ${{ steps.create_release.outputs.upload_url }}
- asset_path: ./legacy.zip
- asset_name: legacy.zip
- asset_content_type: application/zip
-
- - name: Upload Release Assets - modern.tar.gz
- uses: actions/upload-release-asset@v1
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- with:
- upload_url: ${{ steps.create_release.outputs.upload_url }}
- asset_path: ./modern.tar.gz
- asset_name: modern.tar.gz
- asset_content_type: application/gzip
-
- - name: Upload Release Assets - modern.zip
- uses: actions/upload-release-asset@v1
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- with:
- upload_url: ${{ steps.create_release.outputs.upload_url }}
- asset_path: ./modern.zip
- asset_name: modern.zip
- asset_content_type: application/zip
-
- - name: Upload Release Assets - extension.zip
- uses: actions/upload-release-asset@v1
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- with:
- upload_url: ${{ steps.create_release.outputs.upload_url }}
- asset_path: ./extension.zip
- asset_name: extension.zip
- asset_content_type: application/zip
-
- - name: Upload Release Assets - sha256sum.txt
- uses: actions/upload-release-asset@v1
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- with:
- upload_url: ${{ steps.create_release.outputs.upload_url }}
- asset_path: ./sha256sum.txt
- asset_name: sha256sum.txt
- asset_content_type: text/plain
diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.gitlab/ISSUE_TEMPLATE/bug-report.md
similarity index 95%
rename from .github/ISSUE_TEMPLATE/bug-report.md
rename to .gitlab/ISSUE_TEMPLATE/bug-report.md
index ccbb4b8..8181d6a 100644
--- a/.github/ISSUE_TEMPLATE/bug-report.md
+++ b/.gitlab/ISSUE_TEMPLATE/bug-report.md
@@ -1,39 +1,39 @@
----
-name: Bug报告
-about: 报告Bug以帮助改进程序
-title: ''
-labels: bug
-assignees: ''
-
----
-
-* 请按照此模板填写,否则可能立即被关闭
-
-- [x] 我确认已经搜索过Issue不存并确认相同的Issue
-- [x] 我有证据表明这是程序导致的问题(如不确认,可以在[Discussions](https://github.com/ix64/unlock-music/discussions)内提出)
-
-
-**Bug描述**
-
-简要地复述你遇到的Bug
-
-**复现方法**
-
-描述复现方法,必要时请提供样本文件
-
-**程序截图或者Console报错信息**
-
-如果可以请提供二者之一
-
-
-**环境信息:**
-
- - 操作系统和浏览器:
- - 程序版本:
- - 获取音乐文件所使用的客户端及其版本信息:
-
-
-**附加信息**
-
-其他能够帮助确认问题的信息
-
+---
+name: Bug报告
+about: 报告Bug以帮助改进程序
+title: ''
+labels: bug
+assignees: ''
+
+---
+
+* 请按照此模板填写,否则可能立即被关闭
+
+- [x] 我确认已经搜索过Issue不存并确认相同的Issue
+- [x] 我有证据表明这是程序导致的问题(如不确认,可以在[Discussions](https://github.com/ix64/unlock-music/discussions)内提出)
+
+
+**Bug描述**
+
+简要地复述你遇到的Bug
+
+**复现方法**
+
+描述复现方法,必要时请提供样本文件
+
+**程序截图或者Console报错信息**
+
+如果可以请提供二者之一
+
+
+**环境信息:**
+
+ - 操作系统和浏览器:
+ - 程序版本:
+ - 获取音乐文件所使用的客户端及其版本信息:
+
+
+**附加信息**
+
+其他能够帮助确认问题的信息
+
diff --git a/.github/ISSUE_TEMPLATE/new-feature.md b/.gitlab/ISSUE_TEMPLATE/new-feature.md
similarity index 95%
rename from .github/ISSUE_TEMPLATE/new-feature.md
rename to .gitlab/ISSUE_TEMPLATE/new-feature.md
index 5760442..8d05080 100644
--- a/.github/ISSUE_TEMPLATE/new-feature.md
+++ b/.gitlab/ISSUE_TEMPLATE/new-feature.md
@@ -1,26 +1,26 @@
----
-name: 新功能
-about: 对于程序新的想法或建议
-title: ''
-labels: enhancement
-assignees: ''
-
----
-
-- 请按照此模板填写,否则可能立即被关闭
-
-**背景和说明**
-
-简要说明产生此想法的背景和此想法的具体内容
-
-
-**实现途径**
-
-- 如果没有设计方案,请简要描述实现思路
-- 如果你没有任何的实现思路,请通过[Discussions](https://github.com/ix64/unlock-music/discussions)或者Telegram进行讨论
-
-
-**附加信息**
-
-更多你想要表达的内容
-
+---
+name: 新功能
+about: 对于程序新的想法或建议
+title: ''
+labels: enhancement
+assignees: ''
+
+---
+
+- 请按照此模板填写,否则可能立即被关闭
+
+**背景和说明**
+
+简要说明产生此想法的背景和此想法的具体内容
+
+
+**实现途径**
+
+- 如果没有设计方案,请简要描述实现思路
+- 如果你没有任何的实现思路,请通过[Discussions](https://github.com/ix64/unlock-music/discussions)或者Telegram进行讨论
+
+
+**附加信息**
+
+更多你想要表达的内容
+
diff --git a/README.md b/README.md
index 4549c6b..c38b616 100644
--- a/README.md
+++ b/README.md
@@ -1,97 +1,75 @@
-# Unlock Music 音乐解锁
-
-- 在浏览器中解锁加密的音乐文件。 Unlock encrypted music file in the browser.
-- Unlock Music 项目是以学习和技术研究的初衷创建的,修改、再分发时请遵循 [License][license]
-- Unlock Music 的 CLI 版本可以在 [unlock-music/cli][repo_cli] 找到,大批量转换建议使用 CLI 版本。
-- 我们新建了 Telegram 群组 [`@unlock_music_chat`][tg_group] ,欢迎加入!
-- [相关的其他项目][related_projects]
-
-![Test Build](https://github.com/unlock-music/unlock-music/workflows/Test%20Build/badge.svg)
-![GitHub releases](https://img.shields.io/github/downloads/unlock-music/unlock-music/total)
-![Docker Pulls](https://img.shields.io/docker/pulls/ix64/unlock-music)
-
-[license]: https://github.com/unlock-music/unlock-music/blob/master/LICENSE
-
-[repo_cli]: https://github.com/unlock-music/cli
-
-[tg_group]: https://t.me/unlock_music_chat
-
-[related_projects]: https://github.com/unlock-music/unlock-music/wiki/和UnlockMusic相关的项目
-
-## 特性
-
-### 支持的格式
-
-- [x] QQ 音乐 (.qmc0/.qmc2/.qmc3/.qmcflac/.qmcogg/.tkm)
-- [x] Moo 音乐格式 (.bkcmp3/.bkcflac/...)
-- [x] QQ 音乐 Tm 格式 (.tm0/.tm2/.tm3/.tm6)
-- [x] QQ 音乐新格式 (.mflac/.mgg/.mflac0/.mgg1/.mggl)
-- [x] QQ 音乐海外版 (.ofl_en)
-- [x] 网易云音乐格式 (.ncm)
-- [x] 虾米音乐格式 (.xm)
-- [x] 酷我音乐格式 (.kwm)
-- [x] 酷狗音乐格式 (.kgm/.vpr) ([CLI 版本][kgm_cli])
-
-[kgm_cli]: https://github.com/unlock-music/unlock-music/wiki/其他音乐格式工具#酷狗音乐-kgmvpr解锁工具
-
-[joox_wiki]: https://github.com/unlock-music/joox-crypto/wiki/加密格式
-
-### 其他特性
-
-- [x] 在浏览器中解锁
-- [x] 拖放文件
-- [x] 批量解锁
-- [x] 渐进式 Web 应用 (PWA)
-- [x] 多线程
-- [x] 写入Meta和封面图片
-
-## 使用方法
-
-### 安装浏览器扩展
-
-[![Chrome Web Store](https://storage.googleapis.com/chrome-gcs-uploader.appspot.com/image/WlD8wC6g8khYWPJUsQceQkhXSlv1/UV4C4ybeBTsZt43U4xis.png)](https://chrome.google.com/webstore/detail/gldlhhhmienbhlpkfanjpmffdjblmegd)
-[](https://microsoftedge.microsoft.com/addons/detail/ggafoipegcmodfhakdkalpdpcdkiljmd)
-[![Firefox Browser Addons](https://ffp4g1ylyit3jdyti1hqcvtb-wpengine.netdna-ssl.com/addons/files/2015/11/get-the-addon.png)](https://addons.mozilla.org/zh-CN/firefox/addon/unlock-music/)
-
-### 使用已构建版本
-
-- 从[GitHub Release](https://github.com/unlock-music/unlock-music/releases/latest)下载已构建的版本
- - 本地使用请下载`legacy版本`(`modern版本`只能通过 **http(s)协议** 访问)
-- 解压缩后即可部署或本地使用(**请勿直接运行源代码**)
-
-### 使用 Docker 镜像
-
-```shell
-docker run --name unlock-music -d -p 8080:80 ix64/unlock-music
-```
-
-### 自行构建
-
+# Unlock Music 音乐解锁
+
+- 在浏览器中解锁加密的音乐文件。 Unlock encrypted music file in the browser.
+- Unlock Music 项目是以学习和技术研究的初衷创建的,修改、再分发时请遵循[授权协议]。
+- Unlock Music 的 CLI 版本可以在 [unlock-music/cli] 找到,大批量转换建议使用 CLI 版本。
+- 我们新建了 Telegram 群组 [`@unlock_music_chat`] ,欢迎加入!
+
+[授权协议]: 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
+
+## 特性
+
+### 支持的格式
+
+- [x] QQ 音乐 (.qmc0/.qmc2/.qmc3/.qmcflac/.qmcogg/.tkm)
+- [x] Moo 音乐格式 (.bkcmp3/.bkcflac/...)
+- [x] QQ 音乐 Tm 格式 (.tm0/.tm2/.tm3/.tm6)
+- [x] QQ 音乐新格式 (.mflac/.mgg/.mflac0/.mgg1/.mggl)
+- [x] QQ 音乐海外版 (.ofl_en)
+- [x] 网易云音乐格式 (.ncm)
+- [x] 虾米音乐格式 (.xm)
+- [x] 酷我音乐格式 (.kwm)
+- [x] 酷狗音乐格式 (.kgm/.vpr)
+
+### 其他特性
+
+- [x] 在浏览器中解锁
+- [x] 拖放文件
+- [x] 批量解锁
+- [x] 渐进式 Web 应用 (PWA)
+- [x] 多线程
+- [x] 写入元信息与专辑封面
+
+## 使用方法
+
+### 使用预构建版本
+
+- 从 [Release] 下载预构建的版本
+ - :warning: 本地使用请下载`legacy版本`(`modern版本`只能通过 **http(s)协议** 访问)
+- 解压缩后即可部署或本地使用(**请勿直接运行源代码**)
+
+[release]: https://git.unlock-music.dev/um/web/releases/latest
+
+### 自行构建
+
#### JS部分
-- 环境要求
- - nodejs (v16.x)
- - npm
-
-1. 获取项目源代码后安装相关依赖:
-
- ```sh
- npm ci
- ```
-
-2. 然后进行构建。编译后的文件保存到 dist 目录下:
-
- ```sh
- npm run build
- ```
-
-- 如果是用于开发,可以执行 `npm run serve`。
-
-3. 如需构建浏览器扩展,build 完成后还需要执行:
-
- ```sh
- npm run make-extension
- ```
+- 环境要求
+ - nodejs (v16.x)
+ - npm
+
+1. 获取项目源代码后安装相关依赖:
+
+ ```sh
+ npm ci
+ ```
+
+2. 然后进行构建:
+
+ ```sh
+ npm run build
+ ```
+
+ - 构建后的产物可以在 `dist` 目录找到。
+ - 如果是用于开发,可以执行 `npm run serve`。
+
+3. 如需构建浏览器扩展,构建成功后还需要执行:
+
+ ```sh
+ npm run make-extension
+ ```
#### WASM部分