使用 uniapp 打造了一款带魔法的音乐播放器

624 阅读3分钟

缘起

23 年上半年待业找工作发现很多都需要有 uniapp 开发经验,平时的时候喜欢听歌。结合 nondanee 大佬的 nondanee/UnblockNeteaseMusic 和后来的 UnblockNeteaseMusic/server 玩了几年,在这里感谢大佬们的付出。由于在移动端配置复杂,时不时就短路了,一不小心升级软件后,哦豁,还得降回来......

于是就打算用 uniapp 来练手搞事,结合大佬们的 Binaryify/NeteaseCloudMusicApiUnblockNeteaseMusic/server 开始搞事,在 23 年 7 月开始,到 12 月差不多上了一个版本,期间因个人和工作原因耽搁了很久

前几天把 Mac 上的网易云音乐卸载了,从此过上了性福生活

介绍

魔杰音乐是一个支持多端(H5、小程序、Android、iOS)音乐播放器。使用了最新的 uni-app、Vue3、Vite、TypeScript、UnoCSS 等主流技术。

  • 项目地址:mojiefong/uniapp-mojie-music 欢迎大家 Star!!!
  • H5 预览:魔杰音乐(暂时没有域名,想要的域名被占用了,今年 6 月到期后看看会不会弃坑,等着接盘,嘿嘿)

目前已支持 H5 和微信小程序,Android 和 iOS 还没进行测试

目前已实现功能:

  • 手机号登录、验证码登录
  • 每日推荐歌曲、推荐歌单
  • 歌单详情
  • 所有排行榜
  • 获取个人歌单、收藏歌单
  • 独立播放器、mini 播放器
  • 歌词滚动
  • 收藏/取消搜藏歌曲
  • 搜索音乐/热门搜索/历史搜索
  • 切换音源

现在虽然已经上线,但是还有很多细节需要优化以及一些功能还没开发完,比如:

  • 收藏/取消搜藏歌单
  • 新建/删除歌单
  • 搜索歌手、歌单
  • 虚拟滚动列表
  • 暗色主题
  • mini 播放器唱片旋转和独立播放器唱片旋转优化等
  • 音源切换优化等
  • ...

有兴趣的朋友欢迎一起完善和交流,欢迎 PR,我的微信:18132526

核心魔法功能

修改 NeteaseCloudMusicApi 项目下的 song_url_v1.js 文件,不要直接粘贴,注意版本,如果升级了需要对比一下,谨慎操作

用 npm 或者 yarn 安装 @unblockneteasemusic/server 模块

// 歌曲链接 - v1
// 此版本不再采用 br 作为音质区分的标准
// 而是采用 standard, exhigh, lossless, hires, jyeffect(高清环绕声), sky(沉浸环绕声), jymaster(超清母带) 进行音质判断

const crypto = require('crypto')
const match = require('@unblockneteasemusic/server')

module.exports = async (query, request) => {
  query.cookie.os = 'android'
  query.cookie.appver = '8.10.05'

  const data = {
    ids: '[' + query.id + ']',
    level: query.level,
    encodeType: 'flac',
  }

  if (data.level == 'sky') {
    data.immerseType = 'c51'
  }

  const res = await request(
    'POST',
    `https://interface.music.163.com/eapi/song/enhance/player/url/v1`,
    data,
    {
      crypto: 'eapi',
      cookie: query.cookie,
      proxy: query.proxy,
      realIP: query.realIP,
      url: '/api/song/enhance/player/url/v1',
    },
  )

  const result = res.body.data
  const song = result[0]

  // 把url地址为空的、VIP可听/所在专辑需单独付费,就添加魔法
  // https://github.com/Binaryify/NeteaseCloudMusicApi/issues/899#issuecomment-680002883
  if (!song.url || [1, 4].includes(song.fee)) {
    const source = query.source || 'kuwo'
    const { url } = await match(query.id, [source]) // 这里只设置一个源,避免多个产生随机选择问题
    song.url = url
  }

  return res
}

Docker 部署

使用 docker-compose 进行编排

version: "3"

services:
  # 部署H5
  uniapp-mojie-music:
    image: mojiee/uniapp-mojie-music:latest
    container_name: uniapp-mojie-music
    restart: always
    environment:
      # 后台API地址、注意不要加协议,只要ip+端口号或者域名
      - API_BASE_URL=127.0.0.1:3000
    ports:
      - 9527:80
    depends_on:
      - netease-cloud-music-api

  # 部署后台服务
  netease-cloud-music-api:
    image: mojiee/netease-cloud-music-api:latest
    container_name: netease-cloud-music-api
    restart: always
    ports:
      - 3000:3000