今天开发歌词部分,觉得相对其他的数据处理方式,这个还听特别的,可以总结记录一下,以后遇到相似的场景,可以直接拿来参考。
歌词内容怎么不一样?
歌词内容和其他数据的最大区别是,它是网络文本文件。
所以,每次的歌词数据获取是通过歌词文件的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