歌词如何获取

* 本页面总结凯冰音乐APP项目歌词如何获取的相关内容。

今天开发歌词部分,觉得相对其他的数据处理方式,这个还听特别的,可以总结记录一下,以后遇到相似的场景,可以直接拿来参考。

歌词内容怎么不一样?

歌词内容和其他数据的最大区别是,它是网络文本文件

所以,每次的歌词数据获取是通过歌词文件的URL,通过网络请求,拿到的数据。歌词文件在后台音乐管理系统录入歌曲时一并录入,常见的lrc歌词文件格式如下(以歌曲无价之姐的歌词为例,听歌点击:https://music.zkbhj.com/?goto=listen&hash=w4vMJw3MD55jsJxaYoFvBA):

  [00:00.00]李宇春 - 无价之姐
  [00:01.18]作词:李宇春
  [00:01.93]作曲:孙侨志KELZIE
  [00:02.79]制作人:陈伟伦
  [00:03.65]编曲:陈伟伦
  [00:04.42]录音:李杨@55TEC
  [00:05.18]混音:张博
  [00:06.18]凯冰音乐 · 听我想听的
  [00:09.44]music.zkbhj.com
  [00:16.31]Here we go
  [00:20.57]My eyes
  [00:21.17]My lips
  [00:22.33]Are priceless
  [00:28.02]My voice
  [00:28.62]My kiss
  [00:29.85]My
  [00:30.80]Haha
  [00:31.38]娱乐记者的采访
  [00:33.05]净重几斤几两
  [00:34.98]一顿刻板的开场
  [00:36.74]再议议男友和裙妆
  [00:38.97]千人一面 万人一腔
  [00:42.73]凝固的气场 喔 敬请原谅
  [00:46.65]少女感高仿
  [00:48.21]雕刻标准形象
  [00:50.09]保持独有的锋芒
  [00:51.91]尤其遍地已偶像
  [00:53.98]狂我的狂妄
  [00:55.65]荒我的荒唐
  [00:57.42]打翻青春的鸡汤
  [00:59.39]管你的脸方不方
  [01:01.26]Duh
  [01:05.60]My face
  [01:06.05]My fingers
  [01:07.37]Are priceless
  [01:12.78]My ideas
  [01:13.54]My talents
  [01:14.79]Are priceless
  [01:16.71]看我弄潮搏浪
  [01:18.28]多认真的亮相
  [01:20.16]努力跳
  [01:20.96]摇咿摇咿摇咿摇咿摇咿摇
  [01:23.99]看我乘风破浪
  [01:25.76]多诚实的欲望
  [01:27.63]努力唱
  [01:28.44]吆咿吆咿吆咿吆咿吆咿吆
  [01:31.47]看我弄潮搏浪
  [01:33.24]多认真的亮相
  [01:35.16]努力跳
  [01:35.92]摇咿摇咿摇咿摇咿摇咿摇
  [01:38.90]看我乘风破浪
  [01:40.72]多诚实的欲望
  [01:42.69]努力唱
  [01:43.43]吆咿吆咿吆咿吆咿吆咿吆
  [01:46.42]舆论不妙
  [01:47.69]单身 年龄 哪个罩
  [01:49.91]每一种审视
  [01:50.92]都像刽子手手里的刀
  [01:53.55]一个女性成长
  [01:55.22]要历经多少风暴
  [01:57.34]做自己
  [01:58.25]才不是一句简单的口号
  [02:01.60]什么口红 什么包包
  [02:03.63]我自己挑
  [02:05.46]什么人生 什么梦想
  [02:07.38]我自己造
  [02:08.73]保护好那一抹
  [02:10.15]最真实自在的笑
  [02:12.37]我是我自己的无价之宝
  [02:14.90]A到爆
  [02:16.48]看我弄潮搏浪
  [02:18.25]多认真的亮相
  [02:20.17]努力跳
  [02:20.93]摇咿摇咿摇咿摇咿摇咿摇
  [02:23.86]看我乘风破浪
  [02:25.78]多诚实的欲望
  [02:27.65]努力唱
  [02:28.41]吆咿吆咿吆咿吆咿吆咿吆
  [02:31.39]看我弄潮搏浪
  [02:33.21]多认真的亮相
  [02:35.13]努力跳
  [02:35.89]摇咿摇咿摇咿摇咿摇咿摇
  [02:38.88]看我乘风破浪
  [02:40.70]多诚实的欲望
  [02:42.67]努力唱
  [02:43.43]吆咿吆咿吆咿吆咿吆咿吆
  [02:50.59]My nose
  [02:51.04]My teeth
  [02:52.38]Are priceless
  [02:57.98]My poems
  [02:58.48]My dreams
  [02:59.75]Are priceless

所有的歌词的格式都是如上面这样:所有的标签都是由 [] 包裹起来。[mm:ss.ms] 是这一行歌词的时间,后面的文本就代表该时间对应的歌词内容。

后台如何获取并返回歌词

在歌曲详情控制器中,通过music逻辑模块下的Lyric服务提供,代码如下:

  //获取歌词数据
  if lrc, err := music.NewLyric(form.SongId).GetResponse(); err != nil {
    app.Response(ctx, http.StatusOK, e.DetailFailLyric, nil)
    return
  }else{
    songInfo.Lyric, _ = lrc.(string)
  }

Lyric服务的代码如下:

  package music

import (
  "bytes"
  "eagle/utils/config"
  ***
  "net/http"
  "strconv"
)


type Lyric struct {
  content string
}

type LyricRequest struct {
  httptrack.HttpService

}

func NewLyric(songId int) *LyricRequest {
  lr := new(LyricRequest)
  lr.ApiUri = config.GetString("public_service.host") + config.GetString("public_service.lrc_uri") + strconv.Itoa(songId) + ".lrc"
  return lr
}


func (lr *LyricRequest) GetResponse() (interface{}, error) {

  response := Lyric{}
  httpClient := httptrack.GetHttpClient()

  tReq, err := http.NewRequest("GET", lr.ApiUri, nil)
  if err != nil {
    log.Error("Request Err:", zap.Error(err), zap.String(",url:", lr.ApiUri))
    return nil, err
  }

  var resp, err2 = httpClient.Do(tReq)
  if err2 != nil {
    log.Error("Request Err:", zap.Error(err2))
    return nil, err2
  }

  if resp.Body != nil {
    defer resp.Body.Close()
  }

  //因为歌词是文本内容,非Json数据,所以直接获取数据即可
  buf := new(bytes.Buffer)
  buf.ReadFrom(resp.Body)
  response.content = buf.String()

  return response.content, nil
}

因为歌词是文本内容,非Json数据,所以直接获取数据即可,所以使用了bytes.Buffer,它是一个缓冲byte类型的缓冲器,这个缓冲器里存放着都是byte。buf.String()方法是把buf里的内容转成string,最终返回歌词内容字符串,入下图截图示例。

歌词接口返回结果示例
歌词接口返回结果示例(非加密)

这里只总结歌词获取方式,前端的处理逻辑,在前端章节中记录。


* 本页内容参考以下数据源:

  • https://www.cnblogs.com/ricklz/p/13188152.html