Compare commits

...

13 Commits

Author SHA1 Message Date
1846e5c959 1.10.8
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2024-10-21 04:35:11 +09:00
c866d4909f chore: update browserlist db
All checks were successful
continuous-integration/drone/push Build is passing
2024-10-14 10:26:59 +09:00
bded04e40f fix #90: update to manifest v3
All checks were successful
continuous-integration/drone/push Build is passing
2024-10-14 02:01:25 +01:00
b7cb485be2 docs: format with prettier
All checks were successful
continuous-integration/drone/push Build is passing
2024-10-13 05:38:27 +09:00
3dcf064b48 docs: add do not fork notice 2024-10-13 05:35:35 +09:00
437765f79f chore: bump version to v1.10.7
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2024-09-29 18:22:11 +01:00
584fb24fdd fix: joox skip metadata fetch if api fails 2024-09-29 18:20:44 +01:00
2835ac08ec chore: import joox from local npm repo 2024-09-29 18:20:24 +01:00
201e44fb38 Merge pull request 'remerge #30' (#67) from kylebing/web:master into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #67
Reviewed-by: jixunmoe <jixunmoe@noreply.unlock-music.dev>
2023-09-25 20:36:30 +00:00
bdb8d6da34 Merge remote-tracking branch 'upstream/master'
# Conflicts:
#	src/App.vue
#	src/view/Home.vue
2023-09-25 12:15:18 +08:00
1429c5786e update to vh 2023-09-25 12:13:36 +08:00
820b98afed 编辑歌曲信息界面优化 2023-02-03 14:28:37 +08:00
d567e9f136 优化显示:组件上下间隔,footer 位置置于页面底部 2023-02-03 12:08:59 +08:00
18 changed files with 573 additions and 432 deletions

1
.npmrc Normal file
View File

@ -0,0 +1 @@
@unlock-music:registry=https://git.unlock-music.dev/api/packages/um/npm/

View File

@ -6,12 +6,15 @@
- Unlock Music 项目是以学习和技术研究的初衷创建的,修改、再分发时请遵循[授权协议]。 - Unlock Music 项目是以学习和技术研究的初衷创建的,修改、再分发时请遵循[授权协议]。
- Unlock Music 的 CLI 版本可以在 [unlock-music/cli] 找到,大批量转换建议使用 CLI 版本。 - Unlock Music 的 CLI 版本可以在 [unlock-music/cli] 找到,大批量转换建议使用 CLI 版本。
- 我们新建了 Telegram 群组 [`@unlock_music_chat`] ,欢迎加入! - 我们新建了 Telegram 群组 [`@unlock_music_chat`] ,欢迎加入!
- CI 自动构建已经部署,可以在 [UM-Packages] 下载 - CI 自动构建已经部署,可以在 [um-packages] 下载
> **WARNING**
> 在本站 fork 不会起到备份的作用,只会浪费服务器储存空间。如无必要请勿 fork 该仓库。
[授权协议]: https://git.unlock-music.dev/um/web/src/branch/master/LICENSE [授权协议]: https://git.unlock-music.dev/um/web/src/branch/master/LICENSE
[unlock-music/cli]: https://git.unlock-music.dev/um/cli [unlock-music/cli]: https://git.unlock-music.dev/um/cli
[`@unlock_music_chat`]: https://t.me/unlock_music_chat [`@unlock_music_chat`]: https://t.me/unlock_music_chat
[UM-Packages]: https://git.unlock-music.dev/um/-/packages/generic/web-build/ [um-packages]: https://git.unlock-music.dev/um/-/packages/generic/web-build/
## 特性 ## 特性
@ -42,7 +45,7 @@
### 使用预构建版本 ### 使用预构建版本
- 从 [Release] 或 [CI 构建][UM-Packages] 下载预构建的版本 - 从 [Release] 或 [CI 构建][um-packages] 下载预构建的版本
- :warning: 本地使用请下载`legacy版本``modern版本`只能通过 **http(s)协议** 访问) - :warning: 本地使用请下载`legacy版本``modern版本`只能通过 **http(s)协议** 访问)
- 解压缩后即可部署或本地使用(**请勿直接运行源代码** - 解压缩后即可部署或本地使用(**请勿直接运行源代码**

View File

@ -1,18 +1,23 @@
{ {
"manifest_version": 2, "manifest_version": 3,
"content_security_policy": {
"extension_pages": "script-src 'self' 'wasm-unsafe-eval'; object-src 'self';"
},
"name": "音乐解锁", "name": "音乐解锁",
"short_name": "音乐解锁", "short_name": "音乐解锁",
"icons": { "icons": {
"128": "./img/icons/msapplication-icon-144x144.png" "16": "img/icons/favicon-16x16.png",
"32": "img/icons/favicon-32x32.png",
"192": "img/icons/android-chrome-192x192.png",
"512": "img/icons/android-chrome-512x512.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://git.unlock-music.dev/um/web",
"browser_action": { "action": {
"default_icon": "img/icons/favicon-32x32.png",
"default_popup": "./popup.html" "default_popup": "./popup.html"
} }
} }

61
package-lock.json generated
View File

@ -1,17 +1,17 @@
{ {
"name": "unlock-music", "name": "unlock-music",
"version": "1.10.6", "version": "1.10.8",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "unlock-music", "name": "unlock-music",
"version": "1.10.6", "version": "1.10.8",
"hasInstallScript": true, "hasInstallScript": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/preset-typescript": "^7.16.5", "@babel/preset-typescript": "^7.16.5",
"@unlock-music/joox-crypto": "^0.0.1-R5", "@unlock-music/joox-crypto": "^0.0.1",
"@xhacker/kgmwasm": "^1.0.0", "@xhacker/kgmwasm": "^1.0.0",
"@xhacker/qmcwasm": "^1.0.0", "@xhacker/qmcwasm": "^1.0.0",
"base64-js": "^1.5.1", "base64-js": "^1.5.1",
@ -3484,11 +3484,12 @@
"dev": true "dev": true
}, },
"node_modules/@unlock-music/joox-crypto": { "node_modules/@unlock-music/joox-crypto": {
"version": "0.0.1-R5", "version": "0.0.1",
"resolved": "https://registry.npmjs.org/@unlock-music/joox-crypto/-/joox-crypto-0.0.1-R5.tgz", "resolved": "https://git.unlock-music.dev/api/packages/um/npm/%40unlock-music%2Fjoox-crypto/-/0.0.1/joox-crypto-0.0.1.tgz",
"integrity": "sha512-+FhGT4bjzfb1Q7dAwHps/XqbqXrRA6Qg7pkDPzyXfeRmQocAySQ/dekojxkaFBf7ZX5ToIAopwxkKZ5NFt5bFw==", "integrity": "sha512-bj7UcA4/KSqK07PPmoRYJ+3s4h3P45RGUVAMspptMYXobhVkDlB1ArTYNlyIlrF/P0EMy7JkfEdOgUz0nD7EAg==",
"license": "MIT",
"dependencies": { "dependencies": {
"crypto-js": "^4.1.1" "crypto-js": "^4.2.0"
}, },
"bin": { "bin": {
"joox-decrypt": "joox-decrypt" "joox-decrypt": "joox-decrypt"
@ -5711,9 +5712,23 @@
} }
}, },
"node_modules/caniuse-lite": { "node_modules/caniuse-lite": {
"version": "1.0.30001434", "version": "1.0.30001668",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001668.tgz",
"integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==" "integrity": "sha512-nWLrdxqCdblixUO+27JtGJJE/txpJlyUy5YN1u53wLZkP0emYCo5zgS6QYft7VUYR42LGgi/S5hdLZTrnyIddw==",
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/browserslist"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/caniuse-lite"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
]
}, },
"node_modules/case-sensitive-paths-webpack-plugin": { "node_modules/case-sensitive-paths-webpack-plugin": {
"version": "2.4.0", "version": "2.4.0",
@ -6729,9 +6744,9 @@
} }
}, },
"node_modules/crypto-js": { "node_modules/crypto-js": {
"version": "4.1.1", "version": "4.2.0",
"resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz",
"integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="
}, },
"node_modules/css-color-names": { "node_modules/css-color-names": {
"version": "0.0.4", "version": "0.0.4",
@ -23653,11 +23668,11 @@
"dev": true "dev": true
}, },
"@unlock-music/joox-crypto": { "@unlock-music/joox-crypto": {
"version": "0.0.1-R5", "version": "0.0.1",
"resolved": "https://registry.npmjs.org/@unlock-music/joox-crypto/-/joox-crypto-0.0.1-R5.tgz", "resolved": "https://git.unlock-music.dev/api/packages/um/npm/%40unlock-music%2Fjoox-crypto/-/0.0.1/joox-crypto-0.0.1.tgz",
"integrity": "sha512-+FhGT4bjzfb1Q7dAwHps/XqbqXrRA6Qg7pkDPzyXfeRmQocAySQ/dekojxkaFBf7ZX5ToIAopwxkKZ5NFt5bFw==", "integrity": "sha512-bj7UcA4/KSqK07PPmoRYJ+3s4h3P45RGUVAMspptMYXobhVkDlB1ArTYNlyIlrF/P0EMy7JkfEdOgUz0nD7EAg==",
"requires": { "requires": {
"crypto-js": "^4.1.1" "crypto-js": "^4.2.0"
} }
}, },
"@vue/babel-helper-vue-jsx-merge-props": { "@vue/babel-helper-vue-jsx-merge-props": {
@ -25476,9 +25491,9 @@
} }
}, },
"caniuse-lite": { "caniuse-lite": {
"version": "1.0.30001434", "version": "1.0.30001668",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001668.tgz",
"integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==" "integrity": "sha512-nWLrdxqCdblixUO+27JtGJJE/txpJlyUy5YN1u53wLZkP0emYCo5zgS6QYft7VUYR42LGgi/S5hdLZTrnyIddw=="
}, },
"case-sensitive-paths-webpack-plugin": { "case-sensitive-paths-webpack-plugin": {
"version": "2.4.0", "version": "2.4.0",
@ -26297,9 +26312,9 @@
} }
}, },
"crypto-js": { "crypto-js": {
"version": "4.1.1", "version": "4.2.0",
"resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz",
"integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="
}, },
"css-color-names": { "css-color-names": {
"version": "0.0.4", "version": "0.0.4",

View File

@ -1,8 +1,8 @@
{ {
"name": "unlock-music", "name": "unlock-music",
"version": "1.10.6", "version": "1.10.8",
"ext_build": 0, "ext_build": 0,
"updateInfo": "修正文件过小的情况下酷狗 / QQ解密错误问题", "updateInfo": "修正 joox 在远程获取 API 信息出错时不能正确回退到本地元信息获取的错误。",
"license": "MIT", "license": "MIT",
"description": "Unlock encrypted music file in browser.", "description": "Unlock encrypted music file in browser.",
"repository": { "repository": {
@ -21,7 +21,7 @@
}, },
"dependencies": { "dependencies": {
"@babel/preset-typescript": "^7.16.5", "@babel/preset-typescript": "^7.16.5",
"@unlock-music/joox-crypto": "^0.0.1-R5", "@unlock-music/joox-crypto": "^0.0.1",
"@xhacker/kgmwasm": "^1.0.0", "@xhacker/kgmwasm": "^1.0.0",
"@xhacker/qmcwasm": "^1.0.0", "@xhacker/qmcwasm": "^1.0.0",
"base64-js": "^1.5.1", "base64-js": "^1.5.1",

View File

@ -4,22 +4,22 @@
<Home /> <Home />
</el-main> </el-main>
<el-footer id="app-footer"> <el-footer id="app-footer">
<el-row> <div>
<a href="https://git.unlock-music.dev/um/web" target="_blank">音乐解锁</a>({{ version }}) <a href="https://git.unlock-music.dev/um/web" target="_blank">音乐解锁</a>({{ version }})
移除已购音乐的加密保护 移除已购音乐的加密保护
<a href="https://git.unlock-music.dev/um/web/wiki/使用提示" target="_blank">使用提示</a> <a href="https://git.unlock-music.dev/um/web/wiki/使用提示" target="_blank">使用提示</a>
</el-row> </div>
<el-row> <div>
目前支持 网易云音乐(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://git.unlock-music.dev/um/web/src/branch/master/README.md" target="_blank">更多</a>
</el-row> </div>
<el-row> <div>
<!--如果进行二次开发此行版权信息不得移除且应明显地标注于页面上--> <!--如果进行二次开发此行版权信息不得移除且应明显地标注于页面上-->
<span>Copyright &copy; 2019 - {{ new Date().getFullYear() }} MengYX</span> <span>Copyright &copy; 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://git.unlock-music.dev/um/web/src/branch/master/LICENSE" target="_blank">MIT许可协议</a>
开放源代码 开放源代码
</el-row> </div>
</el-footer> </el-footer>
</el-container> </el-container>
</template> </template>

View File

@ -4,16 +4,6 @@ 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;
@ -39,7 +29,7 @@ form >>> input {
</el-form-item> </el-form-item>
</label> </label>
<p class="item-desc"> <p class="tip">
下载该加密文件的 JOOX 应用所记录的设备唯一识别码 下载该加密文件的 JOOX 应用所记录的设备唯一识别码
<br /> <br />
参见 参见

View File

@ -1,24 +1,4 @@
<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;
@ -29,7 +9,8 @@ form >>> input {
<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>
<el-image v-show="!editPicture" :src="imgFile.url || picture" style="width: 100px; height: 100px"> <div class="music-cover">
<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>
@ -39,47 +20,51 @@ form >>> input {
新拖到此处的图片将覆盖原始图片 新拖到此处的图片将覆盖原始图片
</div> </div>
</el-upload> </el-upload>
<i <i :class="{'el-icon-edit': !editPicture, 'el-icon-check': editPicture}"
:class="{'el-icon-edit': !editPicture, 'el-icon-check': editPicture}" @click="changeCover"></i>
@click="changeCover" </div>
></i><br />
标题:
<span v-show="!editTitle">{{title}}</span>
<el-input v-show="editTitle" v-model="title"></el-input>
<i
:class="{'el-icon-edit': !editTitle, 'el-icon-check': editTitle}"
@click="editTitle = !editTitle"
></i><br />
艺术家:
<span v-show="!editArtist">{{artist}}</span>
<el-input v-show="editArtist" v-model="artist"></el-input>
<i
:class="{'el-icon-edit': !editArtist, 'el-icon-check': editArtist}"
@click="editArtist = !editArtist"
></i><br />
专辑:
<span v-show="!editAlbum">{{album}}</span>
<el-input v-show="editAlbum" v-model="album"></el-input>
<i
:class="{'el-icon-edit': !editAlbum, 'el-icon-check': editAlbum}"
@click="editAlbum = !editAlbum"
></i><br />
专辑艺术家:
<span v-show="!editAlbumartist">{{albumartist}}</span>
<el-input v-show="editAlbumartist" v-model="albumartist"></el-input>
<i
:class="{'el-icon-edit': !editAlbumartist, 'el-icon-check': editAlbumartist}"
@click="editAlbumartist = !editAlbumartist"
></i><br />
风格:
<span v-show="!editGenre">{{genre}}</span>
<el-input v-show="editGenre" v-model="genre"></el-input>
<i
:class="{'el-icon-edit': !editGenre, 'el-icon-check': editGenre}"
@click="editGenre = !editGenre"
></i><br />
<p class="item-desc"> <div class="edit-item">
<div class="label">标题</div>
<div class="value" v-show="!editTitle">{{title}}</div>
<el-input class="input" size="small" v-show="editTitle" v-model="title"/>
<i :class="{'el-icon-edit': !editTitle, 'el-icon-check': editTitle}"
@click="editTitle = !editTitle"/>
</div>
<div class="edit-item">
<div class="label">艺术家</div>
<div class="value" v-show="!editArtist">{{artist}}</div>
<el-input class="input" size="small" v-show="editArtist" v-model="artist"/>
<i :class="{'el-icon-edit': !editArtist, 'el-icon-check': editArtist}"
@click="editArtist = !editArtist"
/>
</div>
<div class="edit-item">
<div class="label">专辑</div>
<div class="value" v-show="!editAlbum">{{album}}</div>
<el-input class="input" size="small" v-show="editAlbum" v-model="album"/>
<i :class="{'el-icon-edit': !editAlbum, 'el-icon-check': editAlbum}"
@click="editAlbum = !editAlbum"
/>
</div>
<div class="edit-item">
<div class="label">专辑艺术家</div>
<div class="value" v-show="!editAlbumartist">{{albumartist}}</div>
<el-input class="input" size="small" v-show="editAlbumartist" v-model="albumartist"/>
<i :class="{'el-icon-edit': !editAlbumartist, 'el-icon-check': editAlbumartist}"
@click="editAlbumartist = !editAlbumartist"
/>
</div>
<div class="edit-item">
<div class="label">风格</div>
<div class="value" v-show="!editGenre">{{genre}}</div>
<el-input class="input" size="small" v-show="editGenre" v-model="genre"/>
<i :class="{'el-icon-edit': !editGenre, 'el-icon-check': editGenre}"
@click="editGenre = !editGenre"
/>
</div>
<p class="tip">
为了节省您设备的资源请在确定前充分检查避免反复修改<br /> 为了节省您设备的资源请在确定前充分检查避免反复修改<br />
直接关闭此对话框不会保留所作的更改 直接关闭此对话框不会保留所作的更改
</p> </p>

View File

@ -9,7 +9,7 @@
</el-table-column> </el-table-column>
<el-table-column label="歌曲"> <el-table-column label="歌曲">
<template #default="scope"> <template #default="scope">
<span>{{ scope.row.title }}</span> <p>{{ scope.row.title }}</p>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="歌手"> <el-table-column label="歌手">

View File

@ -10,235 +10,45 @@
background-color: $dark-bg; background-color: $dark-bg;
} }
// FORM // 编辑歌曲信息
.el-radio{ .music-cover{
&__label{ i{
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{
border-color: $dark-border-highlight; color: $color-checkbox;
.el-checkbox__inner{
background-color: $dark-btn-bg-highlight;
border-color: $dark-border-highlight;
}
.el-checkbox__label{
color: $dark-text-info;
} }
} }
&.is-checked{ .el-image{
background-color: $blue; border: 1px solid $dark-border;
.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{
border-color: $blue; color: $color-checkbox;
.el-checkbox__inner{
background-color: white;
}
} }
} }
} }
// footer
// BUTTON #app-footer {
.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;
}
}
}
}
// LINKS
a { a {
text-decoration: none; color: lighten($text-comment, 5%);
color: darken($dark-color-link, 15%);
&:hover{ &:hover{
color: $dark-color-link; color: $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;
}
}
// 自定义样式 // 自定义样式
// 首页弹窗提示信息的 更新信息 面板 // 首页弹窗提示信息的 更新信息 面板

View File

@ -1,39 +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) ;
}

View File

@ -0,0 +1,291 @@
$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;
}
}
}

View File

@ -1,38 +0,0 @@
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;
}
}

View File

@ -66,6 +66,7 @@
} }
.btn-like{ .btn-like{
cursor: pointer;
&:active{ &:active{
@include transform(translateY(2px)) @include transform(translateY(2px))
} }

View File

@ -3,18 +3,17 @@ $blue : #409EFF;
$red : #F56C6C; $red : #F56C6C;
$green : #85ce61; $green : #85ce61;
// TEXT // TEXT COLOR
$text-main : #2C3E50; $text-main : #2C3E50;
$text-copyright : #777;
$text-comment : #999;
$color-link : $blue; $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%);

View File

@ -1,11 +1,127 @@
@import "variables"; @import "variables";
@import "utility"; @import "utility";
@import "gaps"; @import "gaps";
@import "element-ui-overrite"; @import "element-ui-overwrite";
@import "normal"; // MAIN CONTENT
@import "dark-mode"; // dark-mode 放在 normal 后面以获得更高优先级 body{
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{
@ -15,12 +131,14 @@
margin: 10px 0; margin: 10px 0;
.update-title{ .update-title{
font-size: $fz-mini-title; font-size: $fz-mini-title;
padding: 5px 10px; padding: 3px 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: 10px; padding: 5px 8px;
} }
} }
@import "dark-mode"; // dark-mode 放在 normal 后面以获得更高优先级

View File

@ -55,7 +55,7 @@ export async function extractQQMusicMeta(
if (id && id !== '0') { if (id && id !== '0') {
try { try {
return fetchMetadataFromSongId(id, ext, musicMeta, musicBlob); return await fetchMetadataFromSongId(id, ext, musicMeta, musicBlob);
} catch (e) { } catch (e) {
console.warn('在线获取曲目信息失败,回退到本地 meta 提取', e); console.warn('在线获取曲目信息失败,回退到本地 meta 提取', e);
} }

View File

@ -47,12 +47,12 @@
<audio :autoplay="playing_auto" :src="playing_url" controls /> <audio :autoplay="playing_auto" :src="playing_url" controls />
<PreviewTable <PreviewTable
class="table-content"
:policy="filename_policy" :policy="filename_policy"
:table-data="tableData" :table-data="tableData"
@download="saveFile" @download="saveFile"
@edit="editFile" @edit="editFile"
@play="changePlaying" @play="changePlaying" />
/>
</div> </div>
</template> </template>