
@@ -191,16 +192,6 @@ pnpm build:mac
- [BlurLyric](https://github.com/Project-And-Factory/BlurLyric)
- [Vue-mmPlayer](https://github.com/maomao1996/Vue-mmPlayer)
-## 📜 开源许可
-
-- **本项目仅供个人学习研究使用,禁止用于商业及非法用途**
-- 本项目基于 [GNU General Public License version 3](https://opensource.org/license/gpl-3-0/) 许可进行开源
- 1. **修改和分发:** 任何对本项目的修改和分发都必须基于 GPL Version 3 进行,源代码必须一并提供
- 2. **派生作品:** 任何派生作品必须同样采用 GPL Version 3,并在适当的地方注明原始项目的许可证
- 3. **免责声明:** 根据 GPL Version 3,本项目不提供任何明示或暗示的担保。请详细阅读 GPL Version 3以了解完整的免责声明内容
- 4. **社区参与:** 欢迎社区的参与和贡献,我们鼓励开发者一同改进和维护本项目
- 5. **许可证链接:** 请阅读 [GNU General Public License version 3](https://opensource.org/license/gpl-3-0/) 了解更多详情
-
## 📢 免责声明
本项目部分功能使用了网易云音乐的第三方 API 服务,**仅供个人学习研究使用,禁止用于商业及非法用途**
@@ -210,3 +201,15 @@ pnpm build:mac
请使用者在使用本项目时遵守相关法律法规,**不要将本项目用于任何商业及非法用途。如有违反,一切后果由使用者自负。** 同时,使用者应该自行承担因使用本项目而带来的风险和责任。本项目开发者不对本项目所提供的服务和内容做出任何保证
感谢您的理解
+
+## 📜 开源许可
+
+- **本项目仅供个人学习研究使用,禁止用于商业及非法用途**
+- 本项目基于 [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License](https://creativecommons.org/licenses/by-nc-sa/4.0/) 许可进行开源
+ 1. **修改和分发:** 任何对本项目的修改和分发都必须基于 CC BY-NC-SA 4.0 进行,源代码必须一并提供
+ 2. **派生作品:** 任何派生作品必须同样采用 CC BY-NC-SA 4.0,并在适当的地方注明原始项目的许可证
+ 3. **免责声明:** 根据 CC BY-NC-SA 4.0,本项目不提供任何明示或暗示的担保。请详细阅读 [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License](https://creativecommons.org/licenses/by-nc-sa/4.0/) 以了解完整的免责声明内容
+ 4. **社区参与:** 欢迎社区的参与和贡献,我们鼓励开发者一同改进和维护本项目
+ 5. **许可证链接:** 请阅读 [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License](https://creativecommons.org/licenses/by-nc-sa/4.0/) 了解更多详情
+
+
SPlayer by imsyy is licensed under CC BY-NC-SA 4.0



diff --git a/electron/main/index.js b/electron/main/index.js
index 08ad8b8..f6aacf6 100644
--- a/electron/main/index.js
+++ b/electron/main/index.js
@@ -76,10 +76,14 @@ class MainProcess {
log.info("主进程初始化");
// 启动网易云 API
- this.ncmServer = await startNcmServer({
- port: import.meta.env.MAIN_VITE_SERVER_PORT,
- host: import.meta.env.MAIN_VITE_SERVER_HOST,
- });
+ try {
+ this.ncmServer = await startNcmServer({
+ port: import.meta.env.MAIN_VITE_SERVER_PORT,
+ host: import.meta.env.MAIN_VITE_SERVER_HOST,
+ });
+ } catch (error) {
+ console.error("启动网易云 API 失败:", error);
+ }
// 非开发环境启动代理
if (!is.dev) {
diff --git a/src/api/artist.js b/src/api/artist.js
index 6203ef6..5c57eef 100644
--- a/src/api/artist.js
+++ b/src/api/artist.js
@@ -34,6 +34,7 @@ export const getArtistDetail = (id) => {
return axios({
method: "GET",
url: "/artist/detail",
+ noCookie: true,
params: {
id,
},
diff --git a/src/components/Cover/MainCover.vue b/src/components/Cover/MainCover.vue
index d45ceab..7257bc0 100644
--- a/src/components/Cover/MainCover.vue
+++ b/src/components/Cover/MainCover.vue
@@ -69,7 +69,12 @@
-
+
{{ ar.name || ar.userName }}
diff --git a/src/components/List/SongListDropdown.vue b/src/components/List/SongListDropdown.vue
index cdf52f9..aa7e334 100644
--- a/src/components/List/SongListDropdown.vue
+++ b/src/components/List/SongListDropdown.vue
@@ -188,16 +188,36 @@ const openDropdown = (e, data, song, index, sourceId) => {
icon: renderIcon("video"),
},
{
- key: "copy",
- label: "复制歌曲 ID",
- props: {
- onClick: () => {
- const songId = song?.id?.toString();
- copyData(songId);
+ label: "更多操作",
+ key: "others",
+ show: !isLocalSong,
+ icon: renderIcon("more"),
+ children: [
+ {
+ key: "copy",
+ label: "复制歌曲 ID",
+ props: {
+ onClick: () => {
+ const songId = song?.id?.toString();
+ copyData(songId);
+ },
+ },
+ icon: renderIcon("content-copy"),
},
- },
- icon: renderIcon("content-copy"),
+ {
+ key: "share",
+ label: "分享歌曲链接",
+ props: {
+ onClick: () => {
+ const shareUrl = `https://music.163.com/song?id=${song?.id?.toString()}`;
+ copyData(shareUrl, "复制歌曲链接");
+ },
+ },
+ icon: renderIcon("share"),
+ },
+ ],
},
+
{
key: "line-cloud",
type: "divider",
diff --git a/src/router/routes.js b/src/router/routes.js
index 00cbb25..bc7d93e 100644
--- a/src/router/routes.js
+++ b/src/router/routes.js
@@ -244,6 +244,11 @@ const routes = [
name: "like-videos",
component: () => import("@/views/Like/videos.vue"),
},
+ {
+ path: "playlists",
+ name: "like-playlists",
+ component: () => import("@/views/Like/playlists.vue"),
+ },
],
},
// 本地歌曲
diff --git a/src/utils/formatData.js b/src/utils/formatData.js
index e136d71..5b5a691 100644
--- a/src/utils/formatData.js
+++ b/src/utils/formatData.js
@@ -47,6 +47,7 @@ const formatData = (data, type = "playlist", noTracks = false) => {
updateTime: v.updateTime || v.trackNumberUpdateTime,
description: v.description,
tags: v.tags || v.algTags,
+ userId: v.userId,
};
// 歌曲
case "song":
diff --git a/src/utils/helper.js b/src/utils/helper.js
index 86eab28..b4df816 100644
--- a/src/utils/helper.js
+++ b/src/utils/helper.js
@@ -94,20 +94,20 @@ export const getLocalCoverData = async (path, isAlbum = false) => {
/**
* 内容复制
*/
-export const copyData = async (data) => {
+export const copyData = async (data, info) => {
try {
const isElectron = checkPlatform.electron();
// electron
if (isElectron) {
const result = await electron.ipcRenderer.invoke("copyData", data);
- result ? $message.success("复制成功") : $message.error("复制失败");
+ result ? $message.success(`${info || "复制"}成功`) : $message.error(`${info || "复制"}失败`);
}
// 浏览器端
else {
if (navigator.clipboard) {
try {
await navigator.clipboard.writeText(data);
- $message.success("复制成功");
+ $message.success(`${info || "复制"}成功`);
} catch (error) {
console.error("复制出错:", error);
$message.error("复制失败");
@@ -120,7 +120,9 @@ export const copyData = async (data) => {
textArea.select();
try {
const successful = document.execCommand("copy");
- successful ? $message.success("复制成功") : $message.error("复制失败");
+ successful
+ ? $message.success(`${info || "复制"}成功`)
+ : $message.error(`${info || "复制"}失败`);
} catch (err) {
console.error("复制出错:", err);
$message.error("复制失败");
diff --git a/src/utils/request.js b/src/utils/request.js
index 992570d..db5bb28 100644
--- a/src/utils/request.js
+++ b/src/utils/request.js
@@ -21,6 +21,10 @@ axios.interceptors.request.use(
if (!request.noCookie && (isLogin() || getCookie("MUSIC_U") !== null)) {
request.params.cookie = `MUSIC_U=${getCookie("MUSIC_U")};`;
}
+ // 去除 cookie
+ if (request.noCookie) {
+ request.params.noCookie = true;
+ }
// 附加 realIP
if (!checkPlatform.electron()) request.params.realIP = "116.25.146.177";
// 发送请求
diff --git a/src/views/Like/index.vue b/src/views/Like/index.vue
index b5fd3d6..671b85b 100644
--- a/src/views/Like/index.vue
+++ b/src/views/Like/index.vue
@@ -4,6 +4,7 @@
专辑
+ 歌单
歌手
视频
diff --git a/src/views/Like/playlists.vue b/src/views/Like/playlists.vue
new file mode 100644
index 0000000..130ee3c
--- /dev/null
+++ b/src/views/Like/playlists.vue
@@ -0,0 +1,106 @@
+
+
+
+
+
+
+
+ {{ item }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/List/album.vue b/src/views/List/album.vue
index 8e79553..453f237 100644
--- a/src/views/List/album.vue
+++ b/src/views/List/album.vue
@@ -107,6 +107,7 @@
:disabled="albumData === 'empty'"
type="primary"
class="play"
+ tag="div"
circle
strong
secondary
@@ -118,7 +119,7 @@
-
+
-
+
diff --git a/src/views/List/playlist.vue b/src/views/List/playlist.vue
index 6d03358..c3e2f72 100644
--- a/src/views/List/playlist.vue
+++ b/src/views/List/playlist.vue
@@ -114,6 +114,7 @@
:disabled="playListData === 'empty'"
type="primary"
class="play"
+ tag="div"
circle
strong
secondary
@@ -128,6 +129,7 @@
编辑歌单
-
+
-
+