From f53ed91eaf17cd045254b68710ccb11c28f3d50a Mon Sep 17 00:00:00 2001 From: okxlin Date: Fri, 26 Jan 2024 11:49:46 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=B7=BB=E5=8A=A0splayer=E5=88=B0?= =?UTF-8?q?=E5=88=97=E8=A1=A8#796?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/splayer/2.0.3/.env.sample | 2 + apps/splayer/2.0.3/data.yml | 10 +++ apps/splayer/2.0.3/docker-compose.yml | 19 ++++++ apps/splayer/README.md | 87 +++++++++++++++++++++++++ apps/splayer/data.yml | 20 ++++++ apps/splayer/latest/.env.sample | 2 + apps/splayer/latest/data.yml | 10 +++ apps/splayer/latest/docker-compose.yml | 19 ++++++ apps/splayer/logo.png | Bin 0 -> 10753 bytes 9 files changed, 169 insertions(+) create mode 100644 apps/splayer/2.0.3/.env.sample create mode 100644 apps/splayer/2.0.3/data.yml create mode 100644 apps/splayer/2.0.3/docker-compose.yml create mode 100644 apps/splayer/README.md create mode 100644 apps/splayer/data.yml create mode 100644 apps/splayer/latest/.env.sample create mode 100644 apps/splayer/latest/data.yml create mode 100644 apps/splayer/latest/docker-compose.yml create mode 100644 apps/splayer/logo.png diff --git a/apps/splayer/2.0.3/.env.sample b/apps/splayer/2.0.3/.env.sample new file mode 100644 index 00000000..592bf4ee --- /dev/null +++ b/apps/splayer/2.0.3/.env.sample @@ -0,0 +1,2 @@ +CONTAINER_NAME="splayer" +PANEL_APP_PORT_HTTP="40199" diff --git a/apps/splayer/2.0.3/data.yml b/apps/splayer/2.0.3/data.yml new file mode 100644 index 00000000..e2615dd9 --- /dev/null +++ b/apps/splayer/2.0.3/data.yml @@ -0,0 +1,10 @@ +additionalProperties: + formFields: + - default: 40199 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Port + labelZh: 端口 + required: true + rule: paramPort + type: number diff --git a/apps/splayer/2.0.3/docker-compose.yml b/apps/splayer/2.0.3/docker-compose.yml new file mode 100644 index 00000000..24166209 --- /dev/null +++ b/apps/splayer/2.0.3/docker-compose.yml @@ -0,0 +1,19 @@ +version: '3' +services: + splayer: + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:7899" + volumes: + - /etc/localtime:/etc/localtime:ro + - /etc/timezone:/etc/timezone:ro + image: imsyy/splayer:v2.0.3 + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/splayer/README.md b/apps/splayer/README.md new file mode 100644 index 00000000..c0e669a3 --- /dev/null +++ b/apps/splayer/README.md @@ -0,0 +1,87 @@ +# SPlayer + +> 一个简约的音乐播放器 + + +## 说明 + +> [!IMPORTANT] +> +> ### 严肃警告 +> +> - 请务必遵守 [GNU Affero General Public License (AGPL-3.0)](https://www.gnu.org/licenses/agpl-3.0.html) 许可协议 +> - 在您的修改、演绎、分发或派生项目中,必须同样采用 **AGPL-3.0** 许可协议,**并在适当的位置包含本项目的许可和版权信息** +> - **禁止用于售卖或其他商业用途**,如若发现,作者保留追究法律责任的权利 +> - 若发现未遵守 **AGPL-3.0** 许可协议的行为,**本项目将永久停更** +> - 感谢您的尊重与理解 + +- 本项目采用 [Vue 3](https://cn.vuejs.org/) 全家桶和 [Naïve UI](https://www.naiveui.com/) 组件库及 [Electron](https://www.electronjs.org/zh/docs/latest/) 开发 +- 支持网页端与客户端,由于设备有限,目前仅适配 `Win`,其他平台可自行解决兼容性后进行构建 +- 仅对移动端做了基础适配,**不保证功能全部可用** + + > 请注意,本程序不打算开发移动端,也不会对移动端进行完美适配,仅保证基础可用性 + +- 欢迎各位大佬 `Star` 😍 + +## 👀 Demo + +- [SPlayer](https://music.imsyy.top/) + +## 🎉 功能 + +- ✨ 支持扫码登录 +- 📱 支持手机号登录 +- 📅 自动进行每日签到及云贝签到 +- 🎨 封面主题色自适应 +- 📁 本地歌曲管理及分类(建议先使用 [音乐标签](https://www.cnblogs.com/vinlxc/p/11347744.html) 进行匹配后再使用) +- 🎵 **支持播放部分无版权歌曲(可能会与原曲不匹配,客户端独占功能)** +- ⬇️ 下载歌曲(最高支持 Hi-Res) +- ➕ 新建歌单及歌单编辑 +- ❤️ 收藏 / 取消收藏歌单或歌手 +- 🎶 每日推荐歌曲 +- 📻 私人 FM +- ☁️ 云盘音乐上传 +- 📂 云盘内歌曲播放 +- 🔄 云盘内歌曲纠正 +- 🗑️ 云盘歌曲删除 +- 📝 支持逐字歌词 +- 🔄 歌词滚动以及歌词翻译 +- 📹 MV 与视频播放 +- 🎶 音乐频谱显示 +- ⏭️ 音乐渐入渐出 +- 🔄 支持 PWA +- 💬 支持评论区及评论点赞 +- 🌓 明暗模式自动 / 手动切换 +- 📱 移动端基础适配 +- ~~🌐 `i18n` 支持~~ + + +## 😘 鸣谢 + +特此感谢为本项目提供支持与灵感的项目 + +- [NeteaseCloudMusicApi](https://github.com/Binaryify/NeteaseCloudMusicApi) +- [YesPlayMusic](https://github.com/qier222/YesPlayMusic) +- [UnblockNeteaseMusic](https://github.com/UnblockNeteaseMusic/server) +- [Vue-mmPlayer](https://github.com/maomao1996/Vue-mmPlayer) + +## 📢 免责声明 + +本项目部分功能使用了网易云音乐的第三方 API 服务,**仅供个人学习研究使用,禁止用于商业及非法用途** + +同时,本项目开发者承诺 **严格遵守相关法律法规和网易云音乐 API 使用协议,不会利用本项目进行任何违法活动。** 如因使用本项目而引起的任何纠纷或责任,均由使用者自行承担。**本项目开发者不承担任何因使用本项目而导致的任何直接或间接责任,并保留追究使用者违法行为的权利** + +请使用者在使用本项目时遵守相关法律法规,**不要将本项目用于任何商业及非法用途。如有违反,一切后果由使用者自负。** 同时,使用者应该自行承担因使用本项目而带来的风险和责任。本项目开发者不对本项目所提供的服务和内容做出任何保证 + +感谢您的理解 + +## 📜 开源许可 + +- **本项目仅供个人学习研究使用,禁止用于商业及非法用途** +- 本项目基于 [GNU Affero General Public License (AGPL-3.0)](https://www.gnu.org/licenses/agpl-3.0.html) 许可进行开源 + 1. **修改和分发:** 任何对本项目的修改和分发都必须基于 AGPL-3.0 进行,源代码必须一并提供 + 2. **派生作品:** 任何派生作品必须同样采用 AGPL-3.0,并在适当的地方注明原始项目的许可证 + 3. **注明原作者:** 在任何修改、派生作品或其他分发中,必须在适当的位置明确注明原作者及其贡献 + 4. **免责声明:** 根据 AGPL-3.0,本项目不提供任何明示或暗示的担保。请详细阅读 [GNU Affero General Public License (AGPL-3.0)](https://www.gnu.org/licenses/agpl-3.0.html) 以了解完整的免责声明内容 + 5. **社区参与:** 欢迎社区的参与和贡献,我们鼓励开发者一同改进和维护本项目 + 6. **许可证链接:** 请阅读 [GNU Affero General Public License (AGPL-3.0)](https://www.gnu.org/licenses/agpl-3.0.html) 了解更多详情 diff --git a/apps/splayer/data.yml b/apps/splayer/data.yml new file mode 100644 index 00000000..cefcc889 --- /dev/null +++ b/apps/splayer/data.yml @@ -0,0 +1,20 @@ +name: SPlayer +tags: + - 多媒体 +title: 一个简约的音乐播放器 +type: 多媒体 +description: 一个简约的音乐播放器 +additionalProperties: + key: splayer + name: SPlayer + tags: + - Media + shortDescZh: 一个简约的音乐播放器 + shortDescEn: A minimalist music player + type: tool + crossVersionUpdate: true + limit: 0 + recommend: 0 + website: https://github.com/imsyy/SPlayer + github: https://github.com/imsyy/SPlayer + document: https://github.com/imsyy/SPlayer diff --git a/apps/splayer/latest/.env.sample b/apps/splayer/latest/.env.sample new file mode 100644 index 00000000..592bf4ee --- /dev/null +++ b/apps/splayer/latest/.env.sample @@ -0,0 +1,2 @@ +CONTAINER_NAME="splayer" +PANEL_APP_PORT_HTTP="40199" diff --git a/apps/splayer/latest/data.yml b/apps/splayer/latest/data.yml new file mode 100644 index 00000000..e2615dd9 --- /dev/null +++ b/apps/splayer/latest/data.yml @@ -0,0 +1,10 @@ +additionalProperties: + formFields: + - default: 40199 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Port + labelZh: 端口 + required: true + rule: paramPort + type: number diff --git a/apps/splayer/latest/docker-compose.yml b/apps/splayer/latest/docker-compose.yml new file mode 100644 index 00000000..3d8e3a6d --- /dev/null +++ b/apps/splayer/latest/docker-compose.yml @@ -0,0 +1,19 @@ +version: '3' +services: + splayer: + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:7899" + volumes: + - /etc/localtime:/etc/localtime:ro + - /etc/timezone:/etc/timezone:ro + image: imsyy/splayer:latest + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/splayer/logo.png b/apps/splayer/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d87ae6bf5980d63faa91c129f73a3657c95250de GIT binary patch literal 10753 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