base on Cross-platform copyright-free music platform(跨平台的无版权的音乐平台). 支持 windows / macos / linux / web ## Radishes 2.0.0 ![release](https://github.com/Linkontoask/radishes/workflows/release/badge.svg) 后续更新某些功能可能会使用 [gyron](https://github.com/gyronorg/core) 这个自研框架,它拥有极小的体积和灵活的组织能力。 <img src="./snapshots/home.jpg" /> `Radishes`是这个项目的名称,它是由`萝卜`翻译而来。可以在这里试听和下载“灰色”歌曲哟 界面表现和功能参考 windows 网易云音乐界面和 ios 的网易云音乐,会对一些功能进行移动端支持。希望能找到合适的基于 vue3 的移动端打包工具(非套壳)。 ### 🎡 项目运行 #### 克隆项目 ``` git clone https://github.com/radishes-music/radishes.git --recursive ``` #### 环境配置 ##### 本项目使用 `yarn > 3` 构建,新版yarn的具体使用可以移步[官网](https://v3.yarnpkg.com/getting-started/install) ##### packageJson 已经指定yarn的版本,无需手动设置,只需运行下面命令 ```shell # nodejs <16.10 # npm i -g corepack\ corepack enable ``` #### 安装依赖 ```shell yarn yarn bootstrap ``` #### 运行项目 ##### web 调试 ``` yarn dev ``` ##### electron 调试 ``` yarn dev:electron ``` #### 构建项目 ##### web 端 ``` yarn build ``` ##### win 端 ``` yarn pkg:win ``` ##### macos 端 ``` yarn pkg:macos ``` ##### linux 端 ``` yarn pkg:linux ``` ### 一键部署 ``` docker-compose up -d # 然后访问 http://localhost:1234 ``` ### 支持的功能 `browser`: 浏览器支持 `electron`: 桌面级支持 `mobile`: 移动端支持(在线链接: ~~[http://112.74.169.178/mobile/music/](http://112.74.169.178/mobile/music/)~~,分支:`next-mobile`) `√`: 已经支持 `×`: 不打算支持 | 功能 | browser | electron | mobile | | :----------------------------------------------------------- | :-----: | :------: | :----: | | 登录和注册(邮箱暂不支持注册) | √ | √ | | | 每日推荐歌单和歌曲 | √ | √ | √ | | 每日轮播图以及新歌播放、查看歌单详情 | √ | √ | √ | | 歌单搜索、查看、收藏、下载 | √ | √ | √ | | 歌曲排行榜以及排行榜的分类支持 | √ | √ | √ | | 支持查看歌手专辑、详情、相似歌手以及歌手按地区等方式过滤 | √ | √ | √ | | 歌曲播放、暂停、歌词(横向、纵向)、音量 MediaSession(Chrome) | √ | √ | √ | | 浮动歌词支持(在 PC 上为一个子窗口),歌词进度显示 | √ | √ | × | | 支持设置播放源(QQ、酷狗等)、下载品质和下载位置修改 | √ | √ | | | 支持搜索歌手、专辑、歌单和单曲 | √ | √ | √ | | 本地音乐支持(支持拖放播放歌曲、歌曲标签 ID3v2 显示) | √ | √ | × | | 缓存本地所有状态(比如当前播放歌曲、进度、主题颜色、大小等) | √ | √ | √ | | 朋友动态查看、点赞等 | | | | | 音乐云盘 | √ | √ | | | 视频播放、收藏 | | | | | 通知(已登录) | × | | × | | 音效(3D 环绕、淡入淡出、温柔、混合) | √ | √ | | ### Electron 目前已发布第一版,包含听歌等功能,前往 [https://github.com/Linkontoask/radishes/releases/tag/2.0.0-alpha.1](https://github.com/Linkontoask/radishes/releases/tag/2.0.0-alpha.1) 下载 windows 版本。 已发布`mac`版本。[v2.0.0-alpha.4](https://github.com/Linkontoask/radishes/releases/tag/v2.0.0-alpha.4) 在开发的同时会快速兼容 Electron 。所谓的快速就是调用很少的 API 实现 PC 端的功能,比如放大、缩小、通知、歌词、音乐拖放上传。 目前`Electron`已经支持对歌曲的标签写入与读取,专辑封面还未压缩处理。所有在`radishes`平台下载的歌曲都会自动生成歌曲的歌手、专辑、标题等内容。 到现在为止,`Electron`平台相对于`Web`平台已经完成了下载进度展示、本地音乐的同步和播放、浮动歌词的展示。 ### `vue3.x`已发布,音乐项目已完成基本架构 目前会利用闲暇时间进行重构,如果你也想参与进来,可以发邮件或在[这里](https://github.com/Linkontoask/radishes/issues/6)告诉我 ## Star History [![Star History Chart](https://api.star-history.com/svg?repos=radishes-music/radishes&type=Date)](https://star-history.com/#radishes-music/radishes&Date) 相关链接: - [NeteaseCloudMusicApi](https://github.com/Binaryify/NeteaseCloudMusicApi) - [UnblockNeteaseMusic](https://github.com/nondanee/UnblockNeteaseMusic) - [vuejs](https://v3.vuejs.org/) - [commitlint](https://commitlint.js.org/#/) - [vue-cli](https://cli.vuejs.org/zh/) - [prettier](https://prettier.io/) - [webpack-chain](https://github.com/neutrinojs/webpack-chain#getting-started) - [storybook](https://github.com/storybookjs/storybook/tree/next/app/vue) - [storybook vue3 support](https://github.com/storybookjs/storybook/issues/10654) - [vue-cli-plugin-electron-builder](https://github.com/nklayman/vue-cli-plugin-electron-builder) - [vue-cli jsx](https://github.com/vuejs/jsx-next/blob/dev/packages/babel-plugin-jsx/README-zh_CN.md) - [nativescript vue 3 issues](https://github.com/nativescript-vue/nativescript-vue/issues/583) - [nativescript-vue](https://github.com/nativescript-vue/nativescript-vue) - [browser module](https://philipwalton.com/articles/deploying-es2015-code-in-production-today/) - [dayjs](https://day.js.org/docs/zh-CN/installation/installation) - [lerna](https://github.com/lerna/lerna) - [id3-writer](https://github.com/egoroof/browser-id3-writer) ", Assign "at most 3 tags" to the expected json: {"id":"6226","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"