From 4e630047a20b66b74d9aa5cfaffa8f029aec0056 Mon Sep 17 00:00:00 2001 From: okxlin Date: Sat, 29 Jul 2023 09:12:15 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=B7=BB=E5=8A=A0yesplaymusic=E5=88=B0?= =?UTF-8?q?=E5=88=97=E8=A1=A8(=E6=84=9F=E8=B0=A2=E7=BD=91=E5=8F=8B?= =?UTF-8?q?=E5=8C=85=E5=AD=90=E5=8F=94=E7=9A=84=E5=88=9D=E5=A7=8B=E6=8A=95?= =?UTF-8?q?=E7=A8=BF)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/yesplaymusic/0.4.7/.env.sample | 3 + apps/yesplaymusic/0.4.7/data.yml | 10 + apps/yesplaymusic/0.4.7/docker-compose.yml | 16 ++ apps/yesplaymusic/README.md | 260 ++++++++++++++++++++ apps/yesplaymusic/data.yml | 20 ++ apps/yesplaymusic/latest/.env.sample | 3 + apps/yesplaymusic/latest/data.yml | 10 + apps/yesplaymusic/latest/docker-compose.yml | 16 ++ apps/yesplaymusic/logo.png | Bin 0 -> 23731 bytes 9 files changed, 338 insertions(+) create mode 100644 apps/yesplaymusic/0.4.7/.env.sample create mode 100644 apps/yesplaymusic/0.4.7/data.yml create mode 100644 apps/yesplaymusic/0.4.7/docker-compose.yml create mode 100644 apps/yesplaymusic/README.md create mode 100644 apps/yesplaymusic/data.yml create mode 100644 apps/yesplaymusic/latest/.env.sample create mode 100644 apps/yesplaymusic/latest/data.yml create mode 100644 apps/yesplaymusic/latest/docker-compose.yml create mode 100644 apps/yesplaymusic/logo.png diff --git a/apps/yesplaymusic/0.4.7/.env.sample b/apps/yesplaymusic/0.4.7/.env.sample new file mode 100644 index 00000000..b6acecb4 --- /dev/null +++ b/apps/yesplaymusic/0.4.7/.env.sample @@ -0,0 +1,3 @@ +CONTAINER_NAME="yesplaymusic" +PANEL_APP_PORT_HTTP="40075" + diff --git a/apps/yesplaymusic/0.4.7/data.yml b/apps/yesplaymusic/0.4.7/data.yml new file mode 100644 index 00000000..cee5de47 --- /dev/null +++ b/apps/yesplaymusic/0.4.7/data.yml @@ -0,0 +1,10 @@ +additionalProperties: + formFields: + - default: 40075 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Port + labelZh: 端口 + required: true + rule: paramPort + type: number diff --git a/apps/yesplaymusic/0.4.7/docker-compose.yml b/apps/yesplaymusic/0.4.7/docker-compose.yml new file mode 100644 index 00000000..42b28462 --- /dev/null +++ b/apps/yesplaymusic/0.4.7/docker-compose.yml @@ -0,0 +1,16 @@ +version: '3' +services: + yesplaymusic: + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:80" + image: fogforest/yesplaymusic:0.4.7 + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/yesplaymusic/README.md b/apps/yesplaymusic/README.md new file mode 100644 index 00000000..7b7ee57b --- /dev/null +++ b/apps/yesplaymusic/README.md @@ -0,0 +1,260 @@ +
+

+ + Logo + +

YesPlayMusic

+ +

+ 高颜值的第三方网易云播放器 +
+ 🌎 访问DEMO  |   + 📦️ 下载安装包  |   + 💬 加入交流群 +
+
+

+

+ +[![Library][library-screenshot]](https://music.qier222.com) + + +## 全新版本 +全新2.0 Alpha测试版已发布,欢迎前往 [Releases](https://github.com/qier222/YesPlayMusic/releases) 页面下载。 +当前版本将会进入维护模式,除重大bug修复外,不会再更新新功能。 + +## ✨ 特性 + +- ✅ 使用 Vue.js 全家桶开发 +- 🔴 网易云账号登录(扫码/手机/邮箱登录) +- 📺 支持 MV 播放 +- 📃 支持歌词显示 +- 📻 支持私人 FM / 每日推荐歌曲 +- 🚫🤝 无任何社交功能 +- 🌎️ 海外用户可直接播放(需要登录网易云账号) +- 🔐 支持 [UnblockNeteaseMusic](https://github.com/UnblockNeteaseMusic/server#音源清单),自动使用[各类音源](https://github.com/UnblockNeteaseMusic/server#音源清单)替换变灰歌曲链接 (网页版不支持) + - 「各类音源」指默认启用的音源。 + - YouTube 音源需自行安装 `yt-dlp`。 +- ✔️ 每日自动签到(手机端和电脑端同时签到) +- 🌚 Light/Dark Mode 自动切换 +- 👆 支持 Touch Bar +- 🖥️ 支持 PWA,可在 Chrome/Edge 里点击地址栏右边的 ➕ 安装到电脑 +- 🟥 支持 Last.fm Scrobble +- ☁️ 支持音乐云盘 +- ⌨️ 自定义快捷键和全局快捷键 +- 🎧 支持 Mpris +- 🛠 更多特性开发中 + +## 📦️ 安装 + +Electron 版本由 [@hawtim](https://github.com/hawtim) 和 [@qier222](https://github.com/qier222) 适配并维护,支持 macOS、Windows、Linux。 + +访问本项目的 [Releases](https://github.com/qier222/YesPlayMusic/releases) +页面下载安装包。 + +- macOS 用户可以通过 Homebrew 来安装:`brew install --cask yesplaymusic` + +- Windows 用户可以通过 Scoop 来安装:`scoop install extras/yesplaymusic` + +## ⚙️ 部署至 Vercel + +除了下载安装包使用,你还可以将本项目部署到 Vercel 或你的服务器上。下面是部署到 Vercel 的方法。 + +本项目的 Demo (https://music.qier222.com) 就是部署在 Vercel 上的网站。 + +[![Powered by Vercel](https://www.datocms-assets.com/31049/1618983297-powered-by-vercel.svg)](https://vercel.com/?utm_source=ohmusic&utm_campaign=oss) + +1. 部署网易云 API,详情参见 [Binaryify/NeteaseCloudMusicApi](https://neteasecloudmusicapi.vercel.app/#/?id=%e5%ae%89%e8%a3%85) + 。你也可以将 API 部署到 Vercel。 + +2. 点击本仓库右上角的 Fork,复制本仓库到你的 GitHub 账号。 + +3. 点击仓库的 Add File,选择 Create new file,输入 `vercel.json`,将下面的内容复制粘贴到文件中,并将 `https://your-netease-api.example.com` 替换为你刚刚部署的网易云 API 地址: + +```json +{ + "rewrites": [ + { + "source": "/api/:match*", + "destination": "https://your-netease-api.example.com/:match*" + } + ] +} +``` + +4. 打开 [Vercel.com](https://vercel.com),使用 GitHub 登录。 + +5. 点击 Import Git Repository 并选择你刚刚复制的仓库并点击 Import。 + +6. 点击 PERSONAL ACCOUNT 旁边的 Select。 + +7. 点击 Environment Variables,填写 Name 为 `VUE_APP_NETEASE_API_URL`,Value 为 `/api`,点击 Add。最后点击底部的 Deploy 就可以部署到 + Vercel 了。 + +## ⚙️ 部署到自己的服务器 + +除了部署到 Vercel,你还可以部署到自己的服务器上 + +1. 部署网易云 API,详情参见 [Binaryify/NeteaseCloudMusicApi](https://github.com/Binaryify/NeteaseCloudMusicApi) +2. 克隆本仓库 + +```sh +git clone --recursive https://github.com/qier222/YesPlayMusic.git +``` + +3. 安装依赖 + +```sh +yarn install + +``` + +4. (可选)使用 Nginx 反向代理 API,将 API 路径映射为 `/api`,如果 API 和网页不在同一个域名下的话(跨域),会有一些 bug。 + +5. 复制 `/.env.example` 文件为 `/.env`,修改里面 `VUE_APP_NETEASE_API_URL` 的值为网易云 API 地址。本地开发的话可以填写 API 地址为 `http://localhost:3000`,YesPlayMusic 地址为 `http://localhost:8080`。如果你使用了反向代理 API,可以填写 API 地址为 `/api`。 + +``` +VUE_APP_NETEASE_API_URL=http://localhost:3000 +``` + +6. 编译打包 + +```sh +yarn run build +``` + +7. 将 `/dist` 目录下的文件上传到你的 Web 服务器 + +## ⚙️ Docker 部署 + +1. 构建 Docker Image + +```sh +docker build -t yesplaymusic . +``` + +2. 启动 Docker Container + +```sh +docker run -d --name YesPlayMusic -p 80:80 yesplaymusic +``` + +3. Docker Compose 启动 + +```sh +docker-compose up -d +``` + +YesPlayMusic 地址为 `http://localhost` + +## ⚙️ 部署至 Replit + +1. 新建 Repl,选择 Bash 模板 + +2. 在 Replit shell 中运行以下命令 + +```sh +bash <(curl -s -L https://raw.githubusercontent.com/qier222/YesPlayMusic/main/install-replit.sh) +``` + +3. 首次运行成功后,只需点击绿色按钮 `Run` 即可再次运行 + +4. 由于 replit 个人版限制内存为 1G(教育版为 3G),构建过程中可能会失败,请再次运行上述命令或运行以下命令: + +```sh +cd /home/runner/${REPL_SLUG}/music && yarn installl && yarn run build +``` + +## 👷‍♂️ 打包客户端 + +如果在 Release 页面没有找到适合你的设备的安装包的话,你可以根据下面的步骤来打包自己的客户端。 + +1. 打包 Electron 需要用到 Node.js 和 Yarn。可前往 [Node.js 官网](https://nodejs.org/zh-cn/) 下载安装包。安装 Node.js + 后可在终端里执行 `npm install -g yarn` 来安装 Yarn。 + +2. 使用 `git clone --recursive https://github.com/qier222/YesPlayMusic.git` 克隆本仓库到本地。 + +3. 使用 `yarn install` 安装项目依赖。 + +4. 复制 `/.env.example` 文件为 `/.env` 。 + +5. 选择下列表格的命令来打包适合的你的安装包,打包出来的文件在 `/dist_electron` 目录下。了解更多信息可访问 [electron-builder 文档](https://www.electron.build/cli) + +| 命令 | 说明 | +| ------------------------------------------ | ------------------------- | +| `yarn electron:build --windows nsis:ia32` | Windows 32 位 | +| `yarn electron:build --windows nsis:arm64` | Windows ARM | +| `yarn electron:build --linux deb:armv7l` | Debian armv7l(树莓派等) | +| `yarn electron:build --macos dir:arm64` | macOS ARM | + +## :computer: 配置开发环境 + +本项目由 [NeteaseCloudMusicApi](https://github.com/Binaryify/NeteaseCloudMusicApi) 提供 API。 + +运行本项目 + +```shell +# 安装依赖 +yarn install + +# 创建本地环境变量 +cp .env.example .env + +# 运行(网页端) +yarn serve + +# 运行(electron) +yarn electron:serve +``` + +本地运行 NeteaseCloudMusicApi,或者将 API [部署至 Vercel](#%EF%B8%8F-部署至-vercel) + +```shell +# 运行 API (默认 3000 端口) +yarn netease_api:run +``` + +## ☑️ Todo + +查看 Todo 请访问本项目的 [Projects](https://github.com/qier222/YesPlayMusic/projects/1) + +欢迎提 Issue 和 Pull request。 + +## 📜 开源许可 + +本项目仅供个人学习研究使用,禁止用于商业及非法用途。 + +基于 [MIT license](https://opensource.org/licenses/MIT) 许可进行开源。 + +## 灵感来源 + +API 源代码来自 [Binaryify/NeteaseCloudMusicApi](https://github.com/Binaryify/NeteaseCloudMusicApi) + +- [Apple Music](https://music.apple.com) +- [YouTube Music](https://music.youtube.com) +- [Spotify](https://www.spotify.com) +- [网易云音乐](https://music.163.com) + +## 🖼️ 截图 + +![lyrics][lyrics-screenshot] +![library-dark][library-dark-screenshot] +![album][album-screenshot] +![home-2][home-2-screenshot] +![artist][artist-screenshot] +![search][search-screenshot] +![home][home-screenshot] +![explore][explore-screenshot] + + + + +[album-screenshot]: https://github.com/qier222/YesPlayMusic/raw/master/images/album.png +[artist-screenshot]: https://github.com/qier222/YesPlayMusic/raw/master/images/artist.png +[explore-screenshot]: https://github.com/qier222/YesPlayMusic/raw/master/images/explore.png +[home-screenshot]: https://github.com/qier222/YesPlayMusic/raw/master/images/home.png +[home-2-screenshot]: https://github.com/qier222/YesPlayMusic/raw/master/images/home-2.png +[lyrics-screenshot]: https://github.com/qier222/YesPlayMusic/raw/master/images/lyrics.png +[library-screenshot]: https://github.com/qier222/YesPlayMusic/raw/master/images/library.png +[library-dark-screenshot]: https://github.com/qier222/YesPlayMusic/raw/master/images/library-dark.png +[search-screenshot]: https://github.com/qier222/YesPlayMusic/raw/master/images/search.png \ No newline at end of file diff --git a/apps/yesplaymusic/data.yml b/apps/yesplaymusic/data.yml new file mode 100644 index 00000000..0185ff28 --- /dev/null +++ b/apps/yesplaymusic/data.yml @@ -0,0 +1,20 @@ +name: YesPlayMusic +tags: + - 工具 +title: 一款高颜值的第三方网易云播放器 +type: 工具 +description: 一款高颜值的第三方网易云播放器 +additionalProperties: + key: yesplaymusic + name: YesPlayMusic + tags: + - Tool + shortDescZh: 一款高颜值的第三方网易云播放器 + shortDescEn: A high-end third-party NetEase cloud player + type: tool + crossVersionUpdate: true + limit: 0 + recommend: 0 + website: https://music.qier222.com/ + github: https://github.com/qier222/YesPlayMusic + document: https://github.com/qier222/YesPlayMusic diff --git a/apps/yesplaymusic/latest/.env.sample b/apps/yesplaymusic/latest/.env.sample new file mode 100644 index 00000000..b6acecb4 --- /dev/null +++ b/apps/yesplaymusic/latest/.env.sample @@ -0,0 +1,3 @@ +CONTAINER_NAME="yesplaymusic" +PANEL_APP_PORT_HTTP="40075" + diff --git a/apps/yesplaymusic/latest/data.yml b/apps/yesplaymusic/latest/data.yml new file mode 100644 index 00000000..cee5de47 --- /dev/null +++ b/apps/yesplaymusic/latest/data.yml @@ -0,0 +1,10 @@ +additionalProperties: + formFields: + - default: 40075 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Port + labelZh: 端口 + required: true + rule: paramPort + type: number diff --git a/apps/yesplaymusic/latest/docker-compose.yml b/apps/yesplaymusic/latest/docker-compose.yml new file mode 100644 index 00000000..87ddef63 --- /dev/null +++ b/apps/yesplaymusic/latest/docker-compose.yml @@ -0,0 +1,16 @@ +version: '3' +services: + yesplaymusic: + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:80" + image: fogforest/yesplaymusic:latest + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/yesplaymusic/logo.png b/apps/yesplaymusic/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3313cb37647e1fa2fea8d7d74d3b22c2d53f34ba GIT binary patch literal 23731 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 i$5oHTGa~NspZ^~fZ-&YufCzE`0000