Compare commits
No commits in common. "201e44fb3875aee507ddd5fc634b34383b372cb8" and "0e0cf234b57af4e20d0ad035f4573955d95130ab" have entirely different histories.
201e44fb38
...
0e0cf234b5
@ -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
|
|
@ -1,40 +1,39 @@
|
|||||||
---
|
---
|
||||||
|
name: Bug报告
|
||||||
name: "错误报告"
|
about: 报告Bug以帮助改进程序
|
||||||
about: "报告 Bug 以帮助改进程序,非填表。"
|
title: ''
|
||||||
title: "[BUG] "
|
labels: bug
|
||||||
labels:
|
assignees: ''
|
||||||
|
|
||||||
- bug
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
* 请按照此模板填写,否则可能立即被关闭
|
* 请按照此模板填写,否则可能立即被关闭
|
||||||
|
|
||||||
- [x] 我确认已经搜索过Issue不存并确认相同的Issue
|
- [x] 我确认已经搜索过Issue不存并确认相同的Issue
|
||||||
- [x] 我有证据表明这是程序导致的问题(如不确认,可以通过 Telegram 讨论组 (https://t.me/unlock_music_chat) 进行讨论)
|
- [x] 我有证据表明这是程序导致的问题(如不确认,可以在[Discussions](https://github.com/ix64/unlock-music/discussions)内提出)
|
||||||
|
|
||||||
## Bug描述
|
|
||||||
|
**Bug描述**
|
||||||
|
|
||||||
简要地复述你遇到的Bug
|
简要地复述你遇到的Bug
|
||||||
|
|
||||||
## 复现方法
|
**复现方法**
|
||||||
|
|
||||||
描述复现方法,必要时请提供样本文件
|
描述复现方法,必要时请提供样本文件
|
||||||
|
|
||||||
## 程序截图或浏览器开发者控制台(Console)的报错信息
|
**程序截图或者Console报错信息**
|
||||||
|
|
||||||
如果可以请提供二者之一
|
如果可以请提供二者之一
|
||||||
|
|
||||||
## 环境信息
|
|
||||||
|
**环境信息:**
|
||||||
|
|
||||||
- 操作系统和浏览器:
|
- 操作系统和浏览器:
|
||||||
- 程序版本:
|
- 程序版本:
|
||||||
- 网页版的地址(如果为非官方部署请注明):
|
- 获取音乐文件所使用的客户端及其版本信息:
|
||||||
|
|
||||||
注意:如果需要会员才能获取该资源,你可能也需要作为附件提交。
|
|
||||||
|
|
||||||
## 附加信息
|
**附加信息**
|
||||||
|
|
||||||
如果有,请提供其他能够帮助确认问题的信息到下方:
|
其他能够帮助确认问题的信息
|
||||||
|
|
||||||
|
@ -1,29 +1,26 @@
|
|||||||
---
|
---
|
||||||
|
name: 新功能
|
||||||
name: "新功能"
|
about: 对于程序新的想法或建议
|
||||||
about: "对于程序新的想法或建议"
|
title: ''
|
||||||
title: "[新功能] "
|
labels: enhancement
|
||||||
labels:
|
assignees: ''
|
||||||
|
|
||||||
- enhancement
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- ⚠ 请按照此模板填写,否则可能立即被关闭 -->
|
- 请按照此模板填写,否则可能立即被关闭
|
||||||
<!-- 提交前请使用【Preview】预览提交的更改 -->
|
|
||||||
|
|
||||||
## 背景和说明
|
**背景和说明**
|
||||||
|
|
||||||
<!-- 简要说明产生此想法的背景和此想法的具体内容 -->
|
简要说明产生此想法的背景和此想法的具体内容
|
||||||
|
|
||||||
|
|
||||||
## 实现途径
|
**实现途径**
|
||||||
|
|
||||||
- 如果没有设计方案,请简要描述实现思路
|
- 如果没有设计方案,请简要描述实现思路
|
||||||
- 如果你没有任何的实现思路,请通过 Telegram 讨论组 (https://t.me/unlock_music_chat) 进行讨论
|
- 如果你没有任何的实现思路,请通过[Discussions](https://github.com/ix64/unlock-music/discussions)或者Telegram进行讨论
|
||||||
|
|
||||||
|
|
||||||
## 附加信息
|
**附加信息**
|
||||||
|
|
||||||
<!-- 更多你想要表达的内容 -->
|
更多你想要表达的内容
|
||||||
|
|
||||||
|
@ -6,12 +6,10 @@
|
|||||||
"128": "./img/icons/msapplication-icon-144x144.png"
|
"128": "./img/icons/msapplication-icon-144x144.png"
|
||||||
},
|
},
|
||||||
"description": "在任何设备上解锁已购的加密音乐!",
|
"description": "在任何设备上解锁已购的加密音乐!",
|
||||||
"permissions": [
|
"permissions": ["storage"],
|
||||||
"storage"
|
|
||||||
],
|
|
||||||
"offline_enabled": true,
|
"offline_enabled": true,
|
||||||
"options_page": "./index.html",
|
"options_page": "./index.html",
|
||||||
"homepage_url": "https://git.unlock-music.dev/um/web",
|
"homepage_url": "https://github.com/ix64/unlock-music",
|
||||||
"browser_action": {
|
"browser_action": {
|
||||||
"default_popup": "./popup.html"
|
"default_popup": "./popup.html"
|
||||||
}
|
}
|
||||||
|
4
package-lock.json
generated
4
package-lock.json
generated
@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "unlock-music",
|
"name": "unlock-music",
|
||||||
"version": "1.10.6",
|
"version": "1.10.5",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "unlock-music",
|
"name": "unlock-music",
|
||||||
"version": "1.10.6",
|
"version": "1.10.5",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
{
|
{
|
||||||
"name": "unlock-music",
|
"name": "unlock-music",
|
||||||
"version": "1.10.6",
|
"version": "1.10.5",
|
||||||
"ext_build": 0,
|
"ext_build": 0,
|
||||||
"updateInfo": "修正文件过小的情况下酷狗 / QQ解密错误问题",
|
"updateInfo": "完善音乐标签编辑功能,支持编辑更多标签",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"description": "Unlock encrypted music file in browser.",
|
"description": "Unlock encrypted music file in browser.",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://git.unlock-music.dev/um/web"
|
"url": "https://github.com/ix64/unlock-music"
|
||||||
},
|
},
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
@ -1,78 +1,28 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="zh-CN">
|
<html lang="zh-CN">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8">
|
||||||
<meta content="webkit" name="renderer" />
|
<meta content="webkit" name="renderer">
|
||||||
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible" />
|
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
|
||||||
<meta content="width=device-width,initial-scale=1.0" name="viewport" />
|
<meta content="width=device-width,initial-scale=1.0" name="viewport">
|
||||||
<title>音乐解锁</title>
|
<title>音乐解锁</title>
|
||||||
<meta content="音乐,解锁,ncm,qmc,mgg,mflac,qq音乐,网易云音乐,加密" name="keywords" />
|
<meta content="音乐,解锁,ncm,qmc,mgg,mflac,qq音乐,网易云音乐,加密" name="keywords"/>
|
||||||
<meta content="音乐解锁 - 在任何设备上解锁已购的加密音乐!" name="description" />
|
<meta content="音乐解锁 - 在任何设备上解锁已购的加密音乐!" name="description"/>
|
||||||
<style>
|
<!--@formatter:off-->
|
||||||
#loader {
|
<style>#loader{position:absolute;left:50%;top:50%;z-index:1010;margin:-75px 0 0 -75px;border:16px solid #f3f3f3;border-radius:50%;border-top:16px solid #1db1ff;width:120px;height:120px;animation:spin 2s linear infinite}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}#loader-mask{text-align:center;position:absolute;width:100%;height:100%;bottom:0;left:0;right:0;top:0;z-index:1009;background-color:rgba(242,246,252,.88)}@media (prefers-color-scheme:dark){#loader-mask{color:#fff;background-color:rgba(0,0,0,.85)}#loader-mask a{color:#ddd}#loader-mask a:hover{color:#1db1ff}}#loader-source{font-size:1.5rem}#loader-tips-timeout{font-size:1.2rem}</style>
|
||||||
position: absolute;
|
<!--@formatter:on-->
|
||||||
left: 50%;
|
</head>
|
||||||
top: 50%;
|
<body>
|
||||||
z-index: 1010;
|
|
||||||
margin: -75px 0 0 -75px;
|
|
||||||
border: 16px solid #f3f3f3;
|
|
||||||
border-radius: 50%;
|
|
||||||
border-top: 16px solid #1db1ff;
|
|
||||||
width: 120px;
|
|
||||||
height: 120px;
|
|
||||||
animation: spin 2s linear infinite;
|
|
||||||
}
|
|
||||||
@keyframes spin {
|
|
||||||
0% {
|
|
||||||
transform: rotate(0);
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
transform: rotate(360deg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#loader-mask {
|
|
||||||
text-align: center;
|
|
||||||
position: absolute;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
top: 0;
|
|
||||||
z-index: 1009;
|
|
||||||
background-color: rgba(242, 246, 252, 0.88);
|
|
||||||
}
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
#loader-mask {
|
|
||||||
color: #fff;
|
|
||||||
background-color: rgba(0, 0, 0, 0.85);
|
|
||||||
}
|
|
||||||
#loader-mask a {
|
|
||||||
color: #ddd;
|
|
||||||
}
|
|
||||||
#loader-mask a:hover {
|
|
||||||
color: #1db1ff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#loader-source {
|
|
||||||
font-size: 1.5rem;
|
|
||||||
}
|
|
||||||
#loader-tips-timeout {
|
|
||||||
font-size: 1.2rem;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
<div id="loader-mask">
|
||||||
<div id="loader-mask">
|
|
||||||
<div id="loader"></div>
|
<div id="loader"></div>
|
||||||
<noscript>
|
<noscript>
|
||||||
<h3 id="loader-js">请启用JavaScript</h3>
|
<h3 id="loader-js">请启用JavaScript</h3>
|
||||||
</noscript>
|
</noscript>
|
||||||
<h3 id="loader-source">请勿直接运行源代码!</h3>
|
<h3 id="loader-source"> 请勿直接运行源代码! </h3>
|
||||||
<div id="loader-tips-outdated" hidden>
|
<div id="loader-tips-outdated" hidden>
|
||||||
<h2>您可能在使用不受支持的<span style="color: #f00">过时</span>浏览器,这可能导致此应用无法正常工作。</h2>
|
<h2>您可能在使用不受支持的<span style="color:#f00;">过时</span>浏览器,这可能导致此应用无法正常工作。</h2>
|
||||||
<h3>如果您使用双核浏览器,您可以尝试切换到 <span style="color: #f00">“极速模式”</span> 解决此问题。</h3>
|
<h3>如果您使用双核浏览器,您可以尝试切换到 <span style="color:#f00;">“极速模式”</span> 解决此问题。</h3>
|
||||||
<h3>或者,您可以尝试更换下方的几个浏览器之一。</h3>
|
<h3>或者,您可以尝试更换下方的几个浏览器之一。</h3>
|
||||||
</div>
|
</div>
|
||||||
<h3 id="loader-tips-timeout" hidden>
|
<h3 id="loader-tips-timeout" hidden>
|
||||||
@ -80,10 +30,10 @@
|
|||||||
<a href="https://www.microsoft.com/zh-cn/edge" target="_blank">Microsoft Edge Chromium</a>
|
<a href="https://www.microsoft.com/zh-cn/edge" target="_blank">Microsoft Edge Chromium</a>
|
||||||
<a href="https://www.google.cn/chrome/" target="_blank">Google Chrome</a>
|
<a href="https://www.google.cn/chrome/" target="_blank">Google Chrome</a>
|
||||||
<a href="https://www.firefox.com.cn/" target="_blank">Mozilla Firefox</a>
|
<a href="https://www.firefox.com.cn/" target="_blank">Mozilla Firefox</a>
|
||||||
| <a href="https://git.unlock-music.dev/um/web/wiki/使用提示" target="_blank">使用提示</a>
|
| <a href="https://github.com/ix64/unlock-music/wiki/使用提示" target="_blank">使用提示</a>
|
||||||
</h3>
|
</h3>
|
||||||
</div>
|
</div>
|
||||||
<div id="app"></div>
|
<div id="app"></div>
|
||||||
<script src="./loader.js"></script>
|
<script src="./loader.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
22
src/App.vue
22
src/App.vue
@ -4,22 +4,22 @@
|
|||||||
<Home />
|
<Home />
|
||||||
</el-main>
|
</el-main>
|
||||||
<el-footer id="app-footer">
|
<el-footer id="app-footer">
|
||||||
<div>
|
<el-row>
|
||||||
<a href="https://git.unlock-music.dev/um/web" target="_blank">音乐解锁</a>({{ version }})
|
<a href="https://github.com/ix64/unlock-music" target="_blank">音乐解锁</a>({{ version }})
|
||||||
:移除已购音乐的加密保护。
|
:移除已购音乐的加密保护。
|
||||||
<a href="https://git.unlock-music.dev/um/web/wiki/使用提示" target="_blank">使用提示</a>
|
<a href="https://github.com/ix64/unlock-music/wiki/使用提示" target="_blank">使用提示</a>
|
||||||
</div>
|
</el-row>
|
||||||
<div>
|
<el-row>
|
||||||
目前支持 网易云音乐(ncm), QQ音乐(qmc, mflac, mgg), 酷狗音乐(kgm), 虾米音乐(xm), 酷我音乐(.kwm)
|
目前支持 网易云音乐(ncm), QQ音乐(qmc, mflac, mgg), 酷狗音乐(kgm), 虾米音乐(xm), 酷我音乐(.kwm)
|
||||||
<a href="https://git.unlock-music.dev/um/web/src/branch/master/README.md" target="_blank">更多</a>。
|
<a href="https://github.com/ix64/unlock-music/blob/master/README.md" target="_blank">更多</a>。
|
||||||
</div>
|
</el-row>
|
||||||
<div>
|
<el-row>
|
||||||
<!--如果进行二次开发,此行版权信息不得移除且应明显地标注于页面上-->
|
<!--如果进行二次开发,此行版权信息不得移除且应明显地标注于页面上-->
|
||||||
<span>Copyright © 2019 - {{ new Date().getFullYear() }} MengYX</span>
|
<span>Copyright © 2019 - {{ new Date().getFullYear() }} MengYX</span>
|
||||||
音乐解锁使用
|
音乐解锁使用
|
||||||
<a href="https://git.unlock-music.dev/um/web/src/branch/master/LICENSE" target="_blank">MIT许可协议</a>
|
<a href="https://github.com/ix64/unlock-music/blob/master/LICENSE" target="_blank">MIT许可协议</a>
|
||||||
开放源代码
|
开放源代码
|
||||||
</div>
|
</el-row>
|
||||||
</el-footer>
|
</el-footer>
|
||||||
</el-container>
|
</el-container>
|
||||||
</template>
|
</template>
|
||||||
@ -77,7 +77,7 @@ export default {
|
|||||||
<div class="update-title">最近更新</div>
|
<div class="update-title">最近更新</div>
|
||||||
<div class="update-content"> ${config.updateInfo} </div>
|
<div class="update-content"> ${config.updateInfo} </div>
|
||||||
</div>
|
</div>
|
||||||
<a target="_blank" href="https://git.unlock-music.dev/um/web/wiki/使用提示">使用提示</a>
|
<a target="_blank" href="https://github.com/ix64/unlock-music/wiki/使用提示">使用提示</a>
|
||||||
</div>`,
|
</div>`,
|
||||||
dangerouslyUseHTMLString: true,
|
dangerouslyUseHTMLString: true,
|
||||||
duration: 10000,
|
duration: 10000,
|
||||||
|
@ -4,6 +4,16 @@ label {
|
|||||||
line-height: 1.2;
|
line-height: 1.2;
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
.item-desc {
|
||||||
|
color: #aaa;
|
||||||
|
font-size: small;
|
||||||
|
display: block;
|
||||||
|
line-height: 1.2;
|
||||||
|
margin-top: 0.2em;
|
||||||
|
}
|
||||||
|
.item-desc a {
|
||||||
|
color: #aaa;
|
||||||
|
}
|
||||||
|
|
||||||
form >>> input {
|
form >>> input {
|
||||||
font-family: 'Courier New', Courier, monospace;
|
font-family: 'Courier New', Courier, monospace;
|
||||||
@ -29,13 +39,11 @@ form >>> input {
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</label>
|
</label>
|
||||||
|
|
||||||
<p class="tip">
|
<p class="item-desc">
|
||||||
下载该加密文件的 JOOX 应用所记录的设备唯一识别码。
|
下载该加密文件的 JOOX 应用所记录的设备唯一识别码。
|
||||||
<br />
|
<br />
|
||||||
参见:
|
参见:
|
||||||
<a
|
<a href="https://github.com/unlock-music/joox-crypto/wiki/%E8%8E%B7%E5%8F%96%E8%AE%BE%E5%A4%87-UUID">
|
||||||
href="https://git.unlock-music.dev/um/joox-crypto/wiki/%E8%8E%B7%E5%8F%96%E8%AE%BE%E5%A4%87-UUID#%E5%89%8D%E8%A8%80"
|
|
||||||
>
|
|
||||||
获取设备 UUID · unlock-music/joox-crypto Wiki</a
|
获取设备 UUID · unlock-music/joox-crypto Wiki</a
|
||||||
>。
|
>。
|
||||||
</p>
|
</p>
|
||||||
|
@ -1,4 +1,24 @@
|
|||||||
<style scoped>
|
<style scoped>
|
||||||
|
label {
|
||||||
|
cursor: pointer;
|
||||||
|
line-height: 1.2;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
.item-desc {
|
||||||
|
color: #aaa;
|
||||||
|
font-size: small;
|
||||||
|
display: block;
|
||||||
|
line-height: 1.2;
|
||||||
|
margin-top: 0.2em;
|
||||||
|
}
|
||||||
|
.item-desc a {
|
||||||
|
color: #aaa;
|
||||||
|
}
|
||||||
|
|
||||||
|
form >>> input {
|
||||||
|
font-family: 'Courier New', Courier, monospace;
|
||||||
|
}
|
||||||
|
|
||||||
* >>> .um-edit-dialog {
|
* >>> .um-edit-dialog {
|
||||||
max-width: 90%;
|
max-width: 90%;
|
||||||
width: 30em;
|
width: 30em;
|
||||||
@ -9,8 +29,7 @@
|
|||||||
<el-dialog @close="cancel()" title="音乐标签编辑" :visible="show" custom-class="um-edit-dialog" center>
|
<el-dialog @close="cancel()" title="音乐标签编辑" :visible="show" custom-class="um-edit-dialog" center>
|
||||||
<el-form ref="form" status-icon :model="form" label-width="0">
|
<el-form ref="form" status-icon :model="form" label-width="0">
|
||||||
<section>
|
<section>
|
||||||
<div class="music-cover">
|
<el-image v-show="!editPicture" :src="imgFile.url || picture" style="width: 100px; height: 100px">
|
||||||
<el-image v-show="!editPicture" :src="imgFile.url || picture">
|
|
||||||
<div slot="error" class="image-slot el-image__error">暂无封面</div>
|
<div slot="error" class="image-slot el-image__error">暂无封面</div>
|
||||||
</el-image>
|
</el-image>
|
||||||
<el-upload v-show="editPicture" :auto-upload="false" :on-change="addFile" :on-remove="rmvFile" :show-file-list="true" :limit="1" list-type="picture" action="" drag>
|
<el-upload v-show="editPicture" :auto-upload="false" :on-change="addFile" :on-remove="rmvFile" :show-file-list="true" :limit="1" list-type="picture" action="" drag>
|
||||||
@ -20,51 +39,47 @@
|
|||||||
新拖到此处的图片将覆盖原始图片
|
新拖到此处的图片将覆盖原始图片
|
||||||
</div>
|
</div>
|
||||||
</el-upload>
|
</el-upload>
|
||||||
<i :class="{'el-icon-edit': !editPicture, 'el-icon-check': editPicture}"
|
<i
|
||||||
@click="changeCover"></i>
|
:class="{'el-icon-edit': !editPicture, 'el-icon-check': editPicture}"
|
||||||
</div>
|
@click="changeCover"
|
||||||
|
></i><br />
|
||||||
<div class="edit-item">
|
标题:
|
||||||
<div class="label">标题</div>
|
<span v-show="!editTitle">{{title}}</span>
|
||||||
<div class="value" v-show="!editTitle">{{title}}</div>
|
<el-input v-show="editTitle" v-model="title"></el-input>
|
||||||
<el-input class="input" size="small" v-show="editTitle" v-model="title"/>
|
<i
|
||||||
<i :class="{'el-icon-edit': !editTitle, 'el-icon-check': editTitle}"
|
:class="{'el-icon-edit': !editTitle, 'el-icon-check': editTitle}"
|
||||||
@click="editTitle = !editTitle"/>
|
@click="editTitle = !editTitle"
|
||||||
</div>
|
></i><br />
|
||||||
<div class="edit-item">
|
艺术家:
|
||||||
<div class="label">艺术家</div>
|
<span v-show="!editArtist">{{artist}}</span>
|
||||||
<div class="value" v-show="!editArtist">{{artist}}</div>
|
<el-input v-show="editArtist" v-model="artist"></el-input>
|
||||||
<el-input class="input" size="small" v-show="editArtist" v-model="artist"/>
|
<i
|
||||||
<i :class="{'el-icon-edit': !editArtist, 'el-icon-check': editArtist}"
|
:class="{'el-icon-edit': !editArtist, 'el-icon-check': editArtist}"
|
||||||
@click="editArtist = !editArtist"
|
@click="editArtist = !editArtist"
|
||||||
/>
|
></i><br />
|
||||||
</div>
|
专辑:
|
||||||
<div class="edit-item">
|
<span v-show="!editAlbum">{{album}}</span>
|
||||||
<div class="label">专辑</div>
|
<el-input v-show="editAlbum" v-model="album"></el-input>
|
||||||
<div class="value" v-show="!editAlbum">{{album}}</div>
|
<i
|
||||||
<el-input class="input" size="small" v-show="editAlbum" v-model="album"/>
|
:class="{'el-icon-edit': !editAlbum, 'el-icon-check': editAlbum}"
|
||||||
<i :class="{'el-icon-edit': !editAlbum, 'el-icon-check': editAlbum}"
|
|
||||||
@click="editAlbum = !editAlbum"
|
@click="editAlbum = !editAlbum"
|
||||||
/>
|
></i><br />
|
||||||
</div>
|
专辑艺术家:
|
||||||
<div class="edit-item">
|
<span v-show="!editAlbumartist">{{albumartist}}</span>
|
||||||
<div class="label">专辑艺术家</div>
|
<el-input v-show="editAlbumartist" v-model="albumartist"></el-input>
|
||||||
<div class="value" v-show="!editAlbumartist">{{albumartist}}</div>
|
<i
|
||||||
<el-input class="input" size="small" v-show="editAlbumartist" v-model="albumartist"/>
|
:class="{'el-icon-edit': !editAlbumartist, 'el-icon-check': editAlbumartist}"
|
||||||
<i :class="{'el-icon-edit': !editAlbumartist, 'el-icon-check': editAlbumartist}"
|
|
||||||
@click="editAlbumartist = !editAlbumartist"
|
@click="editAlbumartist = !editAlbumartist"
|
||||||
/>
|
></i><br />
|
||||||
</div>
|
风格:
|
||||||
<div class="edit-item">
|
<span v-show="!editGenre">{{genre}}</span>
|
||||||
<div class="label">风格</div>
|
<el-input v-show="editGenre" v-model="genre"></el-input>
|
||||||
<div class="value" v-show="!editGenre">{{genre}}</div>
|
<i
|
||||||
<el-input class="input" size="small" v-show="editGenre" v-model="genre"/>
|
:class="{'el-icon-edit': !editGenre, 'el-icon-check': editGenre}"
|
||||||
<i :class="{'el-icon-edit': !editGenre, 'el-icon-check': editGenre}"
|
|
||||||
@click="editGenre = !editGenre"
|
@click="editGenre = !editGenre"
|
||||||
/>
|
></i><br />
|
||||||
</div>
|
|
||||||
|
|
||||||
<p class="tip">
|
<p class="item-desc">
|
||||||
为了节省您设备的资源,请在确定前充分检查,避免反复修改。<br />
|
为了节省您设备的资源,请在确定前充分检查,避免反复修改。<br />
|
||||||
直接关闭此对话框不会保留所作的更改。
|
直接关闭此对话框不会保留所作的更改。
|
||||||
</p>
|
</p>
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="歌曲">
|
<el-table-column label="歌曲">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<p>{{ scope.row.title }}</p>
|
<span>{{ scope.row.title }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="歌手">
|
<el-table-column label="歌手">
|
||||||
|
@ -22,7 +22,7 @@ describe('decrypt/joox', () => {
|
|||||||
album: 'unused',
|
album: 'unused',
|
||||||
blob: blob,
|
blob: blob,
|
||||||
artist: 'unused',
|
artist: 'unused',
|
||||||
imgUrl: 'https://example.unlock-music.dev/',
|
imgUrl: 'https://github.com/unlock-music',
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ import { KgmCrypto } from '@xhacker/kgmwasm/KgmWasmBundle';
|
|||||||
import KgmCryptoModule from '@xhacker/kgmwasm/KgmWasmBundle';
|
import KgmCryptoModule from '@xhacker/kgmwasm/KgmWasmBundle';
|
||||||
import { MergeUint8Array } from '@/utils/MergeUint8Array';
|
import { MergeUint8Array } from '@/utils/MergeUint8Array';
|
||||||
|
|
||||||
// 每次可以处理 2M 的数据
|
// 每次处理 2M 的数据
|
||||||
const DECRYPTION_BUF_SIZE = 2 *1024 * 1024;
|
const DECRYPTION_BUF_SIZE = 2 *1024 * 1024;
|
||||||
|
|
||||||
export interface KGMDecryptionResult {
|
export interface KGMDecryptionResult {
|
||||||
@ -36,12 +36,12 @@ export async function DecryptKgmWasm(kgmBlob: ArrayBuffer, ext: string): Promise
|
|||||||
|
|
||||||
// 申请内存块,并文件末端数据到 WASM 的内存堆
|
// 申请内存块,并文件末端数据到 WASM 的内存堆
|
||||||
let kgmBuf = new Uint8Array(kgmBlob);
|
let kgmBuf = new Uint8Array(kgmBlob);
|
||||||
const pKgmBuf = KgmCryptoObj._malloc(DECRYPTION_BUF_SIZE);
|
const pQmcBuf = KgmCryptoObj._malloc(DECRYPTION_BUF_SIZE);
|
||||||
const preDecDataSize = Math.min(DECRYPTION_BUF_SIZE, kgmBlob.byteLength); // 初始化缓冲区大小
|
KgmCryptoObj.writeArrayToMemory(kgmBuf.slice(0, DECRYPTION_BUF_SIZE), pQmcBuf);
|
||||||
KgmCryptoObj.writeArrayToMemory(kgmBuf.slice(0, preDecDataSize), pKgmBuf);
|
|
||||||
|
|
||||||
// 进行解密初始化
|
// 进行解密初始化
|
||||||
const headerSize = KgmCryptoObj.preDec(pKgmBuf, preDecDataSize, ext);
|
const headerSize = KgmCryptoObj.preDec(pQmcBuf, DECRYPTION_BUF_SIZE, ext);
|
||||||
|
console.log(headerSize);
|
||||||
kgmBuf = kgmBuf.slice(headerSize);
|
kgmBuf = kgmBuf.slice(headerSize);
|
||||||
|
|
||||||
const decryptedParts = [];
|
const decryptedParts = [];
|
||||||
@ -52,14 +52,14 @@ export async function DecryptKgmWasm(kgmBlob: ArrayBuffer, ext: string): Promise
|
|||||||
|
|
||||||
// 解密一些片段
|
// 解密一些片段
|
||||||
const blockData = new Uint8Array(kgmBuf.slice(offset, offset + blockSize));
|
const blockData = new Uint8Array(kgmBuf.slice(offset, offset + blockSize));
|
||||||
KgmCryptoObj.writeArrayToMemory(blockData, pKgmBuf);
|
KgmCryptoObj.writeArrayToMemory(blockData, pQmcBuf);
|
||||||
KgmCryptoObj.decBlob(pKgmBuf, blockSize, offset);
|
KgmCryptoObj.decBlob(pQmcBuf, blockSize, offset);
|
||||||
decryptedParts.push(KgmCryptoObj.HEAPU8.slice(pKgmBuf, pKgmBuf + blockSize));
|
decryptedParts.push(KgmCryptoObj.HEAPU8.slice(pQmcBuf, pQmcBuf + blockSize));
|
||||||
|
|
||||||
offset += blockSize;
|
offset += blockSize;
|
||||||
bytesToDecrypt -= blockSize;
|
bytesToDecrypt -= blockSize;
|
||||||
}
|
}
|
||||||
KgmCryptoObj._free(pKgmBuf);
|
KgmCryptoObj._free(pQmcBuf);
|
||||||
|
|
||||||
result.data = MergeUint8Array(decryptedParts);
|
result.data = MergeUint8Array(decryptedParts);
|
||||||
result.success = true;
|
result.success = true;
|
||||||
|
@ -2,7 +2,7 @@ import { QmcCrypto } from '@xhacker/qmcwasm/QmcWasmBundle';
|
|||||||
import QmcCryptoModule from '@xhacker/qmcwasm/QmcWasmBundle';
|
import QmcCryptoModule from '@xhacker/qmcwasm/QmcWasmBundle';
|
||||||
import { MergeUint8Array } from '@/utils/MergeUint8Array';
|
import { MergeUint8Array } from '@/utils/MergeUint8Array';
|
||||||
|
|
||||||
// 每次可以处理 2M 的数据
|
// 每次处理 2M 的数据
|
||||||
const DECRYPTION_BUF_SIZE = 2 *1024 * 1024;
|
const DECRYPTION_BUF_SIZE = 2 *1024 * 1024;
|
||||||
|
|
||||||
export interface QMCDecryptionResult {
|
export interface QMCDecryptionResult {
|
||||||
@ -38,12 +38,11 @@ export async function DecryptQmcWasm(qmcBlob: ArrayBuffer, ext: string): Promise
|
|||||||
// 申请内存块,并文件末端数据到 WASM 的内存堆
|
// 申请内存块,并文件末端数据到 WASM 的内存堆
|
||||||
const qmcBuf = new Uint8Array(qmcBlob);
|
const qmcBuf = new Uint8Array(qmcBlob);
|
||||||
const pQmcBuf = QmcCryptoObj._malloc(DECRYPTION_BUF_SIZE);
|
const pQmcBuf = QmcCryptoObj._malloc(DECRYPTION_BUF_SIZE);
|
||||||
const preDecDataSize = Math.min(DECRYPTION_BUF_SIZE, qmcBlob.byteLength); // 初始化缓冲区大小
|
QmcCryptoObj.writeArrayToMemory(qmcBuf.slice(-DECRYPTION_BUF_SIZE), pQmcBuf);
|
||||||
QmcCryptoObj.writeArrayToMemory(qmcBuf.slice(-preDecDataSize), pQmcBuf);
|
|
||||||
|
|
||||||
// 进行解密初始化
|
// 进行解密初始化
|
||||||
ext = '.' + ext;
|
ext = '.' + ext;
|
||||||
const tailSize = QmcCryptoObj.preDec(pQmcBuf, preDecDataSize, ext);
|
const tailSize = QmcCryptoObj.preDec(pQmcBuf, DECRYPTION_BUF_SIZE, ext);
|
||||||
if (tailSize == -1) {
|
if (tailSize == -1) {
|
||||||
result.error = QmcCryptoObj.getErr();
|
result.error = QmcCryptoObj.getErr();
|
||||||
return result;
|
return result;
|
||||||
|
@ -10,45 +10,235 @@
|
|||||||
background-color: $dark-bg;
|
background-color: $dark-bg;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 编辑歌曲信息
|
// FORM
|
||||||
.music-cover{
|
.el-radio{
|
||||||
i{
|
&__label{
|
||||||
|
color: $dark-text-main;
|
||||||
|
}
|
||||||
|
&__input{
|
||||||
|
color: $dark-text-info;
|
||||||
|
.el-radio__inner{
|
||||||
|
border-color: $dark-border;
|
||||||
|
background-color: $dark-btn-bg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.is-checked{
|
||||||
|
.el-radio__inner{
|
||||||
|
background-color: $blue;
|
||||||
|
}
|
||||||
|
.el-radio__label{
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-checkbox.is-bordered{
|
||||||
|
border-color: $dark-border;
|
||||||
|
color: $dark-text-main;
|
||||||
|
background-color: $dark-btn-bg;
|
||||||
|
.el-checkbox__inner{
|
||||||
|
background-color: $dark-btn-bg-highlight;
|
||||||
|
border-color: $dark-border-highlight;
|
||||||
|
}
|
||||||
&:hover{
|
&:hover{
|
||||||
color: $color-checkbox;
|
border-color: $dark-border-highlight;
|
||||||
|
.el-checkbox__inner{
|
||||||
|
background-color: $dark-btn-bg-highlight;
|
||||||
|
border-color: $dark-border-highlight;
|
||||||
|
}
|
||||||
|
.el-checkbox__label{
|
||||||
|
color: $dark-text-info;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.el-image{
|
&.is-checked{
|
||||||
border: 1px solid $dark-border;
|
background-color: $blue;
|
||||||
|
.el-checkbox__inner{
|
||||||
|
border-color: white;
|
||||||
}
|
}
|
||||||
|
.el-checkbox__label{
|
||||||
|
color: white;
|
||||||
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
.edit-item{
|
|
||||||
.label{
|
|
||||||
}
|
|
||||||
.value{
|
|
||||||
}
|
|
||||||
.input{
|
|
||||||
input{
|
|
||||||
background-color: transparent !important;
|
|
||||||
border-bottom: 1px solid $dark-border;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
i{
|
|
||||||
&:hover{
|
&:hover{
|
||||||
color: $color-checkbox;
|
border-color: $blue;
|
||||||
|
.el-checkbox__inner{
|
||||||
|
background-color: white;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// footer
|
|
||||||
#app-footer {
|
// BUTTON
|
||||||
a {
|
.el-button{
|
||||||
color: lighten($text-comment, 5%);
|
background-color: $dark-btn-bg;
|
||||||
|
border-color: $dark-border;
|
||||||
|
color: $dark-text-main;
|
||||||
|
|
||||||
|
&:active{
|
||||||
|
transform: translateY(2px);
|
||||||
|
}
|
||||||
|
|
||||||
|
&--default{
|
||||||
|
&.is-plain {
|
||||||
|
background-color: $dark-btn-bg;
|
||||||
|
&:hover {
|
||||||
|
background-color: $blue;
|
||||||
|
border-color: $blue;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&.is-circle {
|
||||||
|
background-color: $dark-blue;
|
||||||
|
border-color: $dark-blue;
|
||||||
|
&:hover {
|
||||||
|
background-color: $blue;
|
||||||
|
border-color: $blue;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&--success{
|
||||||
|
&.is-plain {
|
||||||
|
background-color: $dark-btn-bg;
|
||||||
|
&:hover {
|
||||||
|
background-color: $green;
|
||||||
|
border-color: $green;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&.is-circle {
|
||||||
|
background-color: $dark-green;
|
||||||
|
border-color: $dark-green;
|
||||||
|
&:hover {
|
||||||
|
background-color: $green;
|
||||||
|
border-color: $green;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&--danger{
|
||||||
|
&.is-plain{
|
||||||
|
border-color: $dark-border;
|
||||||
|
background-color: $dark-btn-bg;
|
||||||
&:hover{
|
&:hover{
|
||||||
color: $color-link;
|
background-color: $red;
|
||||||
|
border-color: $red;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&.is-circle {
|
||||||
|
background-color: $dark-red;
|
||||||
|
border-color: $dark-red;
|
||||||
|
&:hover {
|
||||||
|
background-color: $red;
|
||||||
|
border-color: $red;
|
||||||
|
color: white;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 文件拖放区
|
||||||
|
.el-upload__tip{
|
||||||
|
color: $dark-text-info;
|
||||||
|
}
|
||||||
|
.el-upload-dragger{
|
||||||
|
background-color: $dark-uploader-bg;
|
||||||
|
border-color: $dark-border;
|
||||||
|
.el-upload__text{
|
||||||
|
color: $dark-text-info;
|
||||||
|
}
|
||||||
|
&:hover{
|
||||||
|
background: $dark-uploader-bg-highlight;
|
||||||
|
border-color: $dark-border-highlight;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TABLE
|
||||||
|
.el-table{
|
||||||
|
background-color: $dark-bg-td;
|
||||||
|
&:before{ // 去除表格末尾的横线
|
||||||
|
content: none;
|
||||||
|
}
|
||||||
|
&__header{
|
||||||
|
th{
|
||||||
|
border-bottom-color: $dark-border !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
th.el-table__cell{
|
||||||
|
background-color: $dark-bg-th;
|
||||||
|
color: $dark-text-info;
|
||||||
|
}
|
||||||
|
td{
|
||||||
|
border-bottom-color: $dark-border !important;
|
||||||
|
}
|
||||||
|
tr{
|
||||||
|
background-color: $dark-bg-td;
|
||||||
|
color: $dark-text-main;
|
||||||
|
&:hover{
|
||||||
|
td{
|
||||||
|
background-color: $dark-bg-th !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// LINKS
|
||||||
|
a{
|
||||||
|
text-decoration: none;
|
||||||
|
color: darken($dark-color-link, 15%);
|
||||||
|
&:hover{
|
||||||
|
color: $dark-color-link;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ALERT
|
||||||
|
.el-notification{
|
||||||
|
background-color: $dark-btn-bg-highlight;
|
||||||
|
border-color: $dark-border;
|
||||||
|
&__title{
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
&__content{
|
||||||
|
color: $dark-text-info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// DIALOG
|
||||||
|
.el-dialog{
|
||||||
|
background-color: $dark-dialog-bg;
|
||||||
|
.el-dialog__header{
|
||||||
|
.el-dialog__title{
|
||||||
|
color: $dark-text-main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.el-dialog__body{
|
||||||
|
color: $dark-text-main;
|
||||||
|
.el-input{
|
||||||
|
.el-input__inner{
|
||||||
|
color: $dark-text-main;
|
||||||
|
background-color: $dark-btn-bg;
|
||||||
|
}
|
||||||
|
.el-input__suffix{
|
||||||
|
.el-input__suffix-inner{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.el-input__count{
|
||||||
|
.el-input__count-inner{
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.item-desc{
|
||||||
|
color: $dark-text-info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// 自定义样式
|
// 自定义样式
|
||||||
// 首页弹窗提示信息的 更新信息 面板
|
// 首页弹窗提示信息的 更新信息 面板
|
||||||
|
39
src/scss/_element-ui-overrite.scss
Normal file
39
src/scss/_element-ui-overrite.scss
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
$color-checkbox: $blue;
|
||||||
|
$color-border-el: #DCDFE6;
|
||||||
|
|
||||||
|
$btn-radius: 6px;
|
||||||
|
|
||||||
|
/* FORM */
|
||||||
|
// checkbox
|
||||||
|
.el-checkbox.is-bordered{
|
||||||
|
@include border-radius($btn-radius) ;
|
||||||
|
&:hover{
|
||||||
|
border-color: $color-checkbox;
|
||||||
|
.el-checkbox__label{
|
||||||
|
color: $color-checkbox;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.el-checkbox__input.is-focus{
|
||||||
|
.el-checkbox__inner{
|
||||||
|
border-color: $color-border-el;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&.is-checked{
|
||||||
|
background-color: $color-checkbox;
|
||||||
|
.el-checkbox__label{
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
.el-checkbox__inner{
|
||||||
|
border-color: white;
|
||||||
|
background-color: white;
|
||||||
|
&:after{
|
||||||
|
border-color: $color-checkbox;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// el-button
|
||||||
|
.el-button{
|
||||||
|
@include border-radius($btn-radius) ;
|
||||||
|
}
|
@ -1,291 +0,0 @@
|
|||||||
$color-checkbox: $blue;
|
|
||||||
$color-border-el: #DCDFE6;
|
|
||||||
|
|
||||||
$btn-radius: 6px;
|
|
||||||
|
|
||||||
/* FORM */
|
|
||||||
// checkbox
|
|
||||||
.el-checkbox.is-bordered{
|
|
||||||
@include border-radius($btn-radius) ;
|
|
||||||
&:hover{
|
|
||||||
border-color: $color-checkbox;
|
|
||||||
.el-checkbox__label{
|
|
||||||
color: $color-checkbox;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.el-checkbox__input.is-focus{
|
|
||||||
.el-checkbox__inner{
|
|
||||||
border-color: $color-border-el;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.is-checked{
|
|
||||||
background-color: $color-checkbox;
|
|
||||||
.el-checkbox__label{
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
.el-checkbox__inner{
|
|
||||||
border-color: white;
|
|
||||||
background-color: white;
|
|
||||||
&:after{
|
|
||||||
border-color: $color-checkbox;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// el-button
|
|
||||||
.el-button{
|
|
||||||
@include border-radius($btn-radius) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
// upload
|
|
||||||
.el-upload-dragger{
|
|
||||||
&:hover{
|
|
||||||
background-color: transparentize($color-checkbox, 0.9);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.el-upload__tip{
|
|
||||||
text-align: center;
|
|
||||||
color: $text-comment;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// dialog
|
|
||||||
.el-dialog{
|
|
||||||
@include border-radius(5px);
|
|
||||||
&.el-dialog--center{
|
|
||||||
.el-dialog__body{
|
|
||||||
padding: 25px 25px 15px;
|
|
||||||
}
|
|
||||||
.el-dialog__footer{
|
|
||||||
padding: 10px 20px 30px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
|
|
||||||
// FORM
|
|
||||||
.el-radio{
|
|
||||||
&__label{
|
|
||||||
color: $dark-text-main;
|
|
||||||
}
|
|
||||||
&__input{
|
|
||||||
color: $dark-text-info;
|
|
||||||
.el-radio__inner{
|
|
||||||
border-color: $dark-border;
|
|
||||||
background-color: $dark-btn-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.is-checked{
|
|
||||||
.el-radio__inner{
|
|
||||||
background-color: $blue;
|
|
||||||
}
|
|
||||||
.el-radio__label{
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-checkbox.is-bordered{
|
|
||||||
border-color: $dark-border;
|
|
||||||
color: $dark-text-main;
|
|
||||||
background-color: $dark-btn-bg;
|
|
||||||
.el-checkbox__inner{
|
|
||||||
background-color: $dark-btn-bg-highlight;
|
|
||||||
border-color: $dark-border-highlight;
|
|
||||||
}
|
|
||||||
&:hover{
|
|
||||||
border-color: $dark-border-highlight;
|
|
||||||
.el-checkbox__inner{
|
|
||||||
background-color: $dark-btn-bg-highlight;
|
|
||||||
border-color: $dark-border-highlight;
|
|
||||||
}
|
|
||||||
.el-checkbox__label{
|
|
||||||
color: $dark-text-info;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.is-checked{
|
|
||||||
background-color: $blue;
|
|
||||||
.el-checkbox__inner{
|
|
||||||
border-color: white;
|
|
||||||
}
|
|
||||||
.el-checkbox__label{
|
|
||||||
color: white;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
&:hover{
|
|
||||||
border-color: $blue;
|
|
||||||
.el-checkbox__inner{
|
|
||||||
background-color: white;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// BUTTON
|
|
||||||
.el-button{
|
|
||||||
background-color: $dark-btn-bg;
|
|
||||||
border-color: $dark-border;
|
|
||||||
color: $dark-text-main;
|
|
||||||
|
|
||||||
&:active{
|
|
||||||
transform: translateY(2px);
|
|
||||||
}
|
|
||||||
|
|
||||||
&--default{
|
|
||||||
&.is-plain {
|
|
||||||
background-color: $dark-btn-bg;
|
|
||||||
&:hover {
|
|
||||||
background-color: $blue;
|
|
||||||
border-color: $blue;
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.is-circle {
|
|
||||||
background-color: $dark-blue;
|
|
||||||
border-color: $dark-blue;
|
|
||||||
&:hover {
|
|
||||||
background-color: $blue;
|
|
||||||
border-color: $blue;
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&--success{
|
|
||||||
&.is-plain {
|
|
||||||
background-color: $dark-btn-bg;
|
|
||||||
&:hover {
|
|
||||||
background-color: $green;
|
|
||||||
border-color: $green;
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.is-circle {
|
|
||||||
background-color: $dark-green;
|
|
||||||
border-color: $dark-green;
|
|
||||||
&:hover {
|
|
||||||
background-color: $green;
|
|
||||||
border-color: $green;
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&--danger{
|
|
||||||
&.is-plain{
|
|
||||||
border-color: $dark-border;
|
|
||||||
background-color: $dark-btn-bg;
|
|
||||||
&:hover{
|
|
||||||
background-color: $red;
|
|
||||||
border-color: $red;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.is-circle {
|
|
||||||
background-color: $dark-red;
|
|
||||||
border-color: $dark-red;
|
|
||||||
&:hover {
|
|
||||||
background-color: $red;
|
|
||||||
border-color: $red;
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 文件拖放区
|
|
||||||
.el-upload__tip{
|
|
||||||
color: $dark-text-info;
|
|
||||||
}
|
|
||||||
.el-upload-dragger{
|
|
||||||
background-color: $dark-uploader-bg;
|
|
||||||
border-color: $dark-border;
|
|
||||||
.el-upload__text{
|
|
||||||
color: $dark-text-info;
|
|
||||||
}
|
|
||||||
&:hover{
|
|
||||||
background: $dark-uploader-bg-highlight;
|
|
||||||
border-color: $dark-border-highlight;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TABLE
|
|
||||||
.el-table{
|
|
||||||
background-color: $dark-bg-td;
|
|
||||||
&:before{ // 去除表格末尾的横线
|
|
||||||
content: none;
|
|
||||||
}
|
|
||||||
&__header{
|
|
||||||
th{
|
|
||||||
border-bottom-color: $dark-border !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
th.el-table__cell{
|
|
||||||
background-color: $dark-bg-th;
|
|
||||||
color: $dark-text-info;
|
|
||||||
}
|
|
||||||
td{
|
|
||||||
border-bottom-color: $dark-border !important;
|
|
||||||
}
|
|
||||||
tr{
|
|
||||||
background-color: $dark-bg-td;
|
|
||||||
color: $dark-text-main;
|
|
||||||
&:hover{
|
|
||||||
td{
|
|
||||||
background-color: $dark-bg-th !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ALERT
|
|
||||||
.el-notification{
|
|
||||||
background-color: $dark-btn-bg-highlight;
|
|
||||||
border-color: $dark-border;
|
|
||||||
&__title{
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
&__content{
|
|
||||||
color: $dark-text-info;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// DIALOG
|
|
||||||
.el-dialog{
|
|
||||||
background-color: $dark-dialog-bg;
|
|
||||||
.el-dialog__header{
|
|
||||||
.el-dialog__title{
|
|
||||||
color: $dark-text-main;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.el-dialog__body{
|
|
||||||
color: $dark-text-main;
|
|
||||||
.el-input{
|
|
||||||
.el-input__inner{
|
|
||||||
border-color: $dark-border;
|
|
||||||
color: $dark-text-main;
|
|
||||||
background-color: $dark-btn-bg;
|
|
||||||
}
|
|
||||||
.el-input__suffix{
|
|
||||||
.el-input__suffix-inner{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.el-input__count{
|
|
||||||
.el-input__count-inner{
|
|
||||||
background-color: transparent;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.item-desc{
|
|
||||||
color: $dark-text-info;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
38
src/scss/_normal.scss
Normal file
38
src/scss/_normal.scss
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
body{
|
||||||
|
font-family: $font-family;
|
||||||
|
font-size: $fz-main;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
}
|
||||||
|
|
||||||
|
#app {
|
||||||
|
text-align: center;
|
||||||
|
color: $text-main;
|
||||||
|
padding-top: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#app-footer a {
|
||||||
|
padding-left: 0.2em;
|
||||||
|
padding-right: 0.2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#app-footer {
|
||||||
|
text-align: center;
|
||||||
|
font-size: small;
|
||||||
|
}
|
||||||
|
|
||||||
|
#app-control {
|
||||||
|
padding-top: 1em;
|
||||||
|
padding-bottom: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
audio{
|
||||||
|
margin-bottom: 15px; // 播放控件与表格间隔
|
||||||
|
}
|
||||||
|
|
||||||
|
a{
|
||||||
|
color: darken($color-link, 15%);
|
||||||
|
&:hover{
|
||||||
|
color: $color-link;
|
||||||
|
}
|
||||||
|
}
|
@ -66,7 +66,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.btn-like{
|
.btn-like{
|
||||||
cursor: pointer;
|
|
||||||
&:active{
|
&:active{
|
||||||
@include transform(translateY(2px))
|
@include transform(translateY(2px))
|
||||||
}
|
}
|
||||||
|
@ -3,17 +3,18 @@ $blue : #409EFF;
|
|||||||
$red : #F56C6C;
|
$red : #F56C6C;
|
||||||
$green : #85ce61;
|
$green : #85ce61;
|
||||||
|
|
||||||
// TEXT COLOR
|
// TEXT
|
||||||
$text-main : #2C3E50;
|
$text-main : #2C3E50;
|
||||||
$text-copyright : #777;
|
$color-link: $blue;
|
||||||
$text-comment : #999;
|
|
||||||
$color-link : $blue;
|
|
||||||
|
|
||||||
// FONT SIZE
|
|
||||||
$fz-main: 14px;
|
$fz-main: 14px;
|
||||||
$fz-mini-title: 13px;
|
$fz-mini-title: 13px;
|
||||||
$fz-mini-content: 12px;
|
$fz-mini-content: 12px;
|
||||||
|
|
||||||
|
$font-family: "Helvetica Neue", Helvetica, "PingFang SC",
|
||||||
|
"Hiragino Sans GB", "Microsoft YaHei", "微软雅黑", Arial, sans-serif;
|
||||||
|
|
||||||
|
|
||||||
// DARK MODE
|
// DARK MODE
|
||||||
$dark-border : lighten(black, 25%);
|
$dark-border : lighten(black, 25%);
|
||||||
$dark-border-highlight : lighten(black, 55%);
|
$dark-border-highlight : lighten(black, 55%);
|
||||||
|
@ -1,127 +1,11 @@
|
|||||||
@import "variables";
|
@import "variables";
|
||||||
@import "utility";
|
@import "utility";
|
||||||
@import "gaps";
|
@import "gaps";
|
||||||
@import "element-ui-overwrite";
|
@import "element-ui-overrite";
|
||||||
|
|
||||||
// MAIN CONTENT
|
@import "normal";
|
||||||
body{
|
@import "dark-mode"; // dark-mode 放在 normal 后面,以获得更高优先级
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
border: 0;
|
|
||||||
box-sizing: border-box;
|
|
||||||
font-family: "PingFang SC", "微软雅黑", "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", Arial, sans-serif;
|
|
||||||
font-size: $fz-main;
|
|
||||||
-webkit-font-smoothing: antialiased;
|
|
||||||
-moz-osx-font-smoothing: grayscale;
|
|
||||||
}
|
|
||||||
|
|
||||||
#app {
|
|
||||||
text-align: center;
|
|
||||||
color: $text-main;
|
|
||||||
padding: 30px;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 音频文件操作
|
|
||||||
#app-control {
|
|
||||||
margin-top: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 音频播放
|
|
||||||
audio{
|
|
||||||
margin-top: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.table-content{
|
|
||||||
margin-top: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 编辑歌曲信息
|
|
||||||
.music-cover{
|
|
||||||
margin-bottom: 20px;
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
flex-flow: column nowrap;
|
|
||||||
i{
|
|
||||||
margin-top: 10px;
|
|
||||||
@extend .btn-like;
|
|
||||||
&:hover{
|
|
||||||
color: $color-checkbox;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.el-image{
|
|
||||||
padding: 5px;
|
|
||||||
@include border-radius(5px);
|
|
||||||
border: 1px solid $color-border-el;
|
|
||||||
width: 150px;
|
|
||||||
height: 150px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.edit-item{
|
|
||||||
display: flex;
|
|
||||||
justify-content: flex-start;
|
|
||||||
align-items: center;
|
|
||||||
.label{
|
|
||||||
font-weight: bold;
|
|
||||||
width: 80px;
|
|
||||||
text-align: right;
|
|
||||||
flex-shrink: 0;
|
|
||||||
}
|
|
||||||
.value{
|
|
||||||
padding: 5px 0;
|
|
||||||
height: 20px;
|
|
||||||
line-height: 20px;
|
|
||||||
margin-left: 10px;
|
|
||||||
overflow: hidden;
|
|
||||||
white-space: nowrap;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
}
|
|
||||||
.input{
|
|
||||||
margin-left: 10px;
|
|
||||||
input{
|
|
||||||
font-family: inherit;
|
|
||||||
height: 30px;
|
|
||||||
line-height: 20px;
|
|
||||||
@include border-radius(0);
|
|
||||||
border: none;
|
|
||||||
border-bottom: 1px solid $color-border-el;
|
|
||||||
padding: 5px 5px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
i{
|
|
||||||
margin-left: 10px;
|
|
||||||
@extend .btn-like;
|
|
||||||
&:hover{
|
|
||||||
color: $color-checkbox;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.tip{
|
|
||||||
margin-top: 20px;
|
|
||||||
color: $text-comment;
|
|
||||||
font-size: $fz-mini-content;
|
|
||||||
a{
|
|
||||||
color: inherit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// footer
|
|
||||||
#app-footer {
|
|
||||||
margin-top: 40px;
|
|
||||||
text-align: center;
|
|
||||||
color: $text-copyright;
|
|
||||||
line-height: 1.3;
|
|
||||||
font-size: $fz-mini-content;
|
|
||||||
a {
|
|
||||||
padding-left: 0.2rem;
|
|
||||||
padding-right: 0.2rem;
|
|
||||||
color: darken($text-copyright, 10%);
|
|
||||||
&:hover{
|
|
||||||
color: $color-link;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 首页弹窗提示信息的 更新信息 面板
|
// 首页弹窗提示信息的 更新信息 面板
|
||||||
.update-info{
|
.update-info{
|
||||||
@ -131,14 +15,12 @@ audio{
|
|||||||
margin: 10px 0;
|
margin: 10px 0;
|
||||||
.update-title{
|
.update-title{
|
||||||
font-size: $fz-mini-title;
|
font-size: $fz-mini-title;
|
||||||
padding: 3px 10px;
|
padding: 5px 10px;
|
||||||
background-color: $color-border-el;
|
background-color: $color-border-el;
|
||||||
}
|
}
|
||||||
.update-content{
|
.update-content{
|
||||||
font-size: $fz-mini-content;
|
font-size: $fz-mini-content;
|
||||||
line-height: 1.5;
|
line-height: 1.5;
|
||||||
padding: 5px 8px;
|
padding: 10px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@import "dark-mode"; // dark-mode 放在 normal 后面,以获得更高优先级
|
|
||||||
|
@ -18,9 +18,7 @@
|
|||||||
:album="editing_data.album"
|
:album="editing_data.album"
|
||||||
:albumartist="editing_data.albumartist"
|
:albumartist="editing_data.albumartist"
|
||||||
:genre="editing_data.genre"
|
:genre="editing_data.genre"
|
||||||
@cancel="showEditDialog = false"
|
@cancel="showEditDialog = false" @ok="handleEdit"></edit-dialog>
|
||||||
@ok="handleEdit"
|
|
||||||
></edit-dialog>
|
|
||||||
<config-dialog :show="showConfigDialog" @done="showConfigDialog = false"></config-dialog>
|
<config-dialog :show="showConfigDialog" @done="showConfigDialog = false"></config-dialog>
|
||||||
<el-tooltip class="item" effect="dark" placement="top">
|
<el-tooltip class="item" effect="dark" placement="top">
|
||||||
<div slot="content">
|
<div slot="content">
|
||||||
@ -46,13 +44,7 @@
|
|||||||
|
|
||||||
<audio :autoplay="playing_auto" :src="playing_url" controls />
|
<audio :autoplay="playing_auto" :src="playing_url" controls />
|
||||||
|
|
||||||
<PreviewTable
|
<PreviewTable :policy="filename_policy" :table-data="tableData" @download="saveFile" @edit="editFile" @play="changePlaying" />
|
||||||
class="table-content"
|
|
||||||
:policy="filename_policy"
|
|
||||||
:table-data="tableData"
|
|
||||||
@download="saveFile"
|
|
||||||
@edit="editFile"
|
|
||||||
@play="changePlaying" />
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -78,7 +70,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
showConfigDialog: false,
|
showConfigDialog: false,
|
||||||
showEditDialog: false,
|
showEditDialog: false,
|
||||||
editing_data: { picture: '', title: '', artist: '', album: '', albumartist: '', genre: '' },
|
editing_data: { picture: '', title: '', artist: '', album: '', albumartist: '', genre: '', },
|
||||||
tableData: [],
|
tableData: [],
|
||||||
playing_url: '',
|
playing_url: '',
|
||||||
playing_auto: false,
|
playing_auto: false,
|
||||||
@ -119,7 +111,7 @@ export default {
|
|||||||
errInfo +
|
errInfo +
|
||||||
',' +
|
',' +
|
||||||
filename +
|
filename +
|
||||||
',参考<a target="_blank" href="https://git.unlock-music.dev/um/web/wiki/使用提示">使用提示</a>',
|
',参考<a target="_blank" href="https://github.com/ix64/unlock-music/wiki/使用提示">使用提示</a>',
|
||||||
dangerouslyUseHTMLString: true,
|
dangerouslyUseHTMLString: true,
|
||||||
duration: 6000,
|
duration: 6000,
|
||||||
});
|
});
|
||||||
@ -172,13 +164,12 @@ export default {
|
|||||||
console.warn('获取图像失败', this.editing_data.picture);
|
console.warn('获取图像失败', this.editing_data.picture);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const newMeta = {
|
const newMeta = { picture: imageInfo?.buffer,
|
||||||
picture: imageInfo?.buffer,
|
|
||||||
title: data.title,
|
title: data.title,
|
||||||
artists: data.artist.split(split_regex),
|
artists: data.artist.split(split_regex),
|
||||||
album: data.album,
|
album: data.album,
|
||||||
albumartist: data.albumartist,
|
albumartist: data.albumartist,
|
||||||
genre: data.genre.split(split_regex),
|
genre: data.genre.split(split_regex)
|
||||||
};
|
};
|
||||||
const buffer = Buffer.from(await this.editing_data.blob.arrayBuffer());
|
const buffer = Buffer.from(await this.editing_data.blob.arrayBuffer());
|
||||||
const mime = AudioMimeType[this.editing_data.ext] || AudioMimeType.mp3;
|
const mime = AudioMimeType[this.editing_data.ext] || AudioMimeType.mp3;
|
||||||
|
Loading…
Reference in New Issue
Block a user