场景

从今日推荐页面点击某首歌曲会将这首歌曲的songid通过路由传递到播放界面,

播放界面调用百度音乐接口实现数据的获取以及音乐的播放。

效果

实现

配置路由

首先在pages目录下新建musicplay.vue作为音乐播放的页面,

然后在router下的index.js中中配置路由。

  routes: [{path:"/musicplay",name:"MusicPlay",component:MusicPlay},

来到今日推荐页面,配置页面跳转

跳转到音乐播放组件并将当前音乐的songid通过路由参数传递过去。

<div class="scroller"><router-link tag="div" :to="{name:'MusicPlay',params:{songid:item.song_id}}" class="card url" v-for="(item,index) in todayRecommend" :key="index"><div class="album"><img :src="item.pic_big" :alt="item.title"><div class="name">{{ item.title }}</div></div></router-link></div>

同理将其他页面,要实现播放的页面组件也配置跳转到音乐播放组件,并将要播放的音乐组件的songid传递过去。

实现音乐播放界面

百度音乐API播放说明:

例:method=baidu.ting.song.play&songid=877578

例:method=baidu.ting.song.playAAC&songid=877578

参数:songid = 877578 //歌曲id

注:关于使用file_link不能播放的问题,是因为百度使用Http中的Referer头字段来防止盗链,在HTML文件中

加上 <meta name=”referrer” content=”never”>这一句让发送出去的Http包都不含Referer字段

来到musicplay.vue

CSS样式

<style scoped>.header{padding:15px;
}.music-info{flex: 1;font-size: 20px;
}.title{display: flex;text-align: center;
}.left{font-size: 30px;
}.ca{color: red;
}.right{font-size: 30px;
}.song-info{padding: 15px;
}.song-info-img{text-align: center;
}.song-info-img img{width: 50%;border-radius: 5px;box-shadow: 0 0 10px 0 rgba(50,50,50,.31);
}.song-lrc{margin-top: 10px;min-height: 50px;
}.iconbox{display: flex;margin-top: 30px;
}.iconbox .box{flex: 1;
}.song{width: 100%;text-align: center;
}.song audio{width: 80%;
}.active{color: #222;
}.author{font-size: 12px;color: #999;
}</style>

页面布局

<template lang="html"><div class="play"><div class="header"><div class="title"><router-link to="/"><i class="iconfont icon-shouye left"></i></router-link><div class="music-info"><p>{{ currentUrl.songinfo.title }}</p><p class="author">{{ currentUrl.songinfo.author }}</p></div><router-link to="/search"><i class="iconfont icon-sousuo right"></i></router-link></div></div><div class="song-info"><div class="song-info-img"><img :src="currentUrl.songinfo.pic_big"><LRC :durationTime="durationTime" :currentTime="currentTime" :songid="this.$route.params.songid"/></div><div class="iconbox"><i class="iconfont icon-shoucang2 left"></i><i class="box"></i><i class="iconfont icon-xiazai right"></i></div></div><div class="song"><audio ref="player" :src="currentUrl.bitrate.show_link" controls autoplay></audio></div></div>
</template>

实现歌词滚动功能

在components目录下新建LRC.vue<template lang="html"><div class="lrcContainer"><div class="lrc" ref="lrc">{{ getAllKey }}<pclass="lrc-p":class="{active:parseInt(currentTime) >= keyArr[index] && parseInt(currentTime) < keyArr[index+1]}"v-for="(item,key,index) in lrcData":key="index">{{ item }}{{ srcollLrc(key,index) }}</p></div></div>
</template><script>
export default {name:"lrc",data(){return{lrc:{},lrcData:{},keyArr:[]}},props:{songid:{type:[String,Number],default:""},currentTime:{type:[String,Number],default:0},durationTime:{type:[String,Number],default:0}},mounted(){const LRCUrl = this.HOST+"/v1/restserver/ting?method=baidu.ting.song.lry&songid="+this.songid;this.$axios.get(LRCUrl).then(res => {this.lrc = res.data// 数据格式处理var lyrics = res.data.lrcContent.split("\n");var lrcObj = {};for(var i = 0 ;i<lyrics.length;i++){var lyric = decodeURIComponent(lyrics[i]);var timeReg = /\[\d*:\d*((\.|\:)\d*)*\]/g;var timeRegExpArr = lyric.match(timeReg);if(!timeRegExpArr)continue;var clause = lyric.replace(timeReg,'');for(var k = 0,h = timeRegExpArr.length;k < h;k++) {var t = timeRegExpArr[k];var min = Number(String(t.match(/\[\d*/i)).slice(1)),sec = Number(String(t.match(/\:\d*/i)).slice(1));var time = min * 60 + sec;lrcObj[time] = clause;}}this.lrcData = lrcObj;}).catch(error => {console.log(error);})},computed:{getAllKey(){for(var i in this.lrcData){this.keyArr.push(i);}}},methods:{srcollLrc(key,index){const lrcDiv = this.$refs.lrcif(key < this.currentTime && key > this.currentTime - (this.keyArr[index+1] - this.keyArr[index])){lrcDiv.style.top = -((index-2)*30)+"px"}}}
}
</script><style scoped>.lrcContainer{width: 100%;height: 150px;overflow: hidden;position: relative;
}.lrc{width: 100%;position: absolute;top: 0;
}
.active{color: red !important;
}
.lrc-p{height: 30px;line-height: 30px;
}.up30{margin-top: -30px;
}</style>

在musicplay.vue显示歌词滚动

<div class="song-info-img"><img :src="currentUrl.songinfo.pic_big"><LRC :durationTime="durationTime" :currentTime="currentTime" :songid="this.$route.params.songid"/></div>

在musicplay.vue异步操作

// 异步操作
const LRC = Vue.component("lrc",(resolve)=>require(["../components/LRC"],resolve))添加监听methods:{addEventListeners(){this.$refs.player.addEventListener('timeupdate', this._currentTime),this.$refs.player.addEventListener('canplay', this._durationTime)},removeEventListeners: function () {this.$refs.player.removeEventListener('timeupdate', this._currentTime)this.$refs.player.removeEventListener('canplay', this._durationTime)},_currentTime(){this.currentTime = this.$refs.player.currentTime// currentTime是audio标签提供的获取当前播放时间的方法},_durationTime(){this.durationTime = this.$refs.player.duration// duration是audio标签提供的获得歌曲播放整体时间的方法}}

实现下载功能

百度音乐API下载说明:

例:method=baidu.ting.song.downWeb&songid=877578&bit=24&_t=1393123213

参数: songid = 877578//歌曲id

bit = 24, 64, 128, 192, 256, 320 ,flac//码率

_t = 1430215999,, //时间戳

我们在请求百度音乐的API后输出返回的数据可以看到

歌曲的链接为:

返回数据下的bitrate下的show_link

所以我们几将audio的src属性设为

  <div class="song"><audio ref="player" :src="currentUrl.bitrate.show_link" controls autoplay></audio></div>

所以我们点击播放组件的右边的三个点,选择下载,就可以实现下载了。

完整musicplay.vue代码

<template lang="html"><div class="play"><div class="header"><div class="title"><router-link to="/"><i class="iconfont icon-shouye left"></i></router-link><div class="music-info"><p>{{ currentUrl.songinfo.title }}</p><p class="author">{{ currentUrl.songinfo.author }}</p></div><router-link to="/search"><i class="iconfont icon-sousuo right"></i></router-link></div></div><div class="song-info"><div class="song-info-img"><img :src="currentUrl.songinfo.pic_big"><LRC :durationTime="durationTime" :currentTime="currentTime" :songid="this.$route.params.songid"/></div><div class="iconbox"><i class="iconfont icon-shoucang2 left"></i><i class="box"></i><i class="iconfont icon-xiazai right"></i></div></div><div class="song"><audio ref="player" :src="currentUrl.bitrate.show_link" controls autoplay></audio></div></div>
</template><script>import Vue from "vue"
import "../assets/font/iconfont.css"
// import LRC from "../components/LRC"
// 异步操作
const LRC = Vue.component("lrc",(resolve)=>require(["../components/LRC"],resolve))export default {name:"musicplay",data(){return{currentUrl:{songinfo:{title:"",author:""},bitrate:{show_link:""}},currentTime:0,durationTime:0}},components:{LRC},mounted(){const playUrl = this.HOST+"/v1/restserver/ting?method=baidu.ting.song.play&songid=" + this.$route.params.songid;this.$axios.get(playUrl).then(res => {this.currentUrl = res.data;}).catch(error => {console.log(error);})this.addEventListeners();},beforeDestroyed(){this.removeEventListeners();},methods:{addEventListeners(){this.$refs.player.addEventListener('timeupdate', this._currentTime),this.$refs.player.addEventListener('canplay', this._durationTime)},removeEventListeners: function () {this.$refs.player.removeEventListener('timeupdate', this._currentTime)this.$refs.player.removeEventListener('canplay', this._durationTime)},_currentTime(){this.currentTime = this.$refs.player.currentTime// currentTime是audio标签提供的获取当前播放时间的方法},_durationTime(){this.durationTime = this.$refs.player.duration// duration是audio标签提供的获得歌曲播放整体时间的方法}}}
</script><style scoped>.header{padding:15px;
}.music-info{flex: 1;font-size: 20px;
}.title{display: flex;text-align: center;
}.left{font-size: 30px;
}.ca{color: red;
}.right{font-size: 30px;
}.song-info{padding: 15px;
}.song-info-img{text-align: center;
}.song-info-img img{width: 50%;border-radius: 5px;box-shadow: 0 0 10px 0 rgba(50,50,50,.31);
}.song-lrc{margin-top: 10px;min-height: 50px;
}.iconbox{display: flex;margin-top: 30px;
}.iconbox .box{flex: 1;
}.song{width: 100%;text-align: center;
}.song audio{width: 80%;
}.active{color: #222;
}.author{font-size: 12px;color: #999;
}</style>

解决Referrer Policy: no-referrer-when-downgrade

场景

原因

百度使用Http中的Referer头字段来防止盗链,在HTML文件中加上 <meta name=”referrer” content=”never”>这一句让发送出去的Http包都不含Referer字段就行了

解决

找到index.html

加入

<meta name="referrer" content="never">

注意双引号是英文状态

Vue实现访问百度音乐API实现播放音乐功能相关推荐

  1. Vue实现仿音乐播放器11-实现访问百度音乐API实现播放音乐功能

    场景 从今日推荐页面点击某首歌曲会将这首歌曲的songid通过路由传递到播放界面, 播放界面调用百度音乐接口实现数据的获取以及音乐的播放. 效果 实现 配置路由 首先在pages目录下新建musicp ...

  2. 计算机锁屏之后QQ音乐停止播放了,MAC电脑如何在息屏状态下让QQ音乐能继续播放音乐...

    MAC电脑如何在息屏状态下让QQ音乐能继续播放音乐 一般MAC电脑息屏之后,大部分的应用都是会停止运行的,比如QQ音乐,就不会再播放音乐.今天小编就跟大家分享下MAC电脑如何在息屏状态下让QQ音乐能继 ...

  3. Vue项目使用百度地图api

    目录 1.百度开发者认证 2.创建应用 3.引用百度地图API文件 4.展示地图 1.百度开发者认证 进入百度地图开放平台 官网,(认证需要身份证号码,人脸识别,手机百度APP,邮箱地址) 注册登录完 ...

  4. 在vue中使用百度地图API:区域显示3D棱柱、地点标注、信息提示

    文章目录 1.在vue中引入百度地图的script 2.生成想要的地图样式 3.生成地图 4.创建3d棱柱 5.设置标记点和提示框 6.代码总结 1.在vue中引入百度地图的script 在publi ...

  5. 【vue+百度地图】vue项目使用百度地图API(普通展示)

    方法来自大神[超华] 1.进入百度API 操作官网:https://lbsyun.baidu.com 根据官网流程: 登录自己的百度账号-> 申请然后点击邮箱内获取的新链接-> 填写自己需 ...

  6. vue 项目中百度地图 API 使用流程

    文章目录 一.在百度地图开放平台注册账号并登录.认证 二.创建 ak 三.项目使用 四.丰富的功能 一.在百度地图开放平台注册账号并登录.认证 1.网址:http://lbsyun.baidu.com ...

  7. python怎么放音乐_python怎么播放音乐

    Python播放音乐要使用pygame模块 首先安装pygame模块:pip install pygame 方法实现:def play_music(self): filepath = r"E ...

  8. 用python放音乐_python怎么播放音乐

    Python播放音乐要使用pygame模块 首先安装pygame模块:pip install pygame 方法实现:def play_music(self): filepath = r"E ...

  9. python怎样播放音乐_Python如何播放音乐?

    使用pip安装pygame. 简单代码如下:def play_music(filepath,vol): pygame.mixer.init() flag = False while 1: if fla ...

最新文章

  1. Tomcat6.0.13下配置Tomcat Administration Web Application
  2. hadoop nn 运维一例
  3. lucene修改索引——(六)
  4. git的常用功能(管理github仓库)
  5. 拆解飞机黑匣子,看看内部构造、PCB及芯片
  6. 人人影视字幕组因盗版视频被查 涉案金额1600余万元
  7. html 居中 center,html – 如何居中的元素 – 使用什么而不是align:center属性?
  8. 【零基础学Java】—Java 日期时间(三十二)
  9. Linux文件的软链接和硬链接
  10. 【Python】改变对象的字符串显示
  11. C++--第12课 - 操作符重载 - 上
  12. 现在动手,建立你的灾备系统
  13. php调用数据库字段代码,php读取数据库_php读取mysql所有数据库及表中字段的代码...
  14. 解决Firefox火狐打不开Axure原型图
  15. 新零售企业构建智慧营销体系
  16. HTML嵌入百度地图
  17. 2017计算机夏令营汇总
  18. 关于物联网卡流量统计的那些事儿
  19. 实现信息化企业供应链管理,上云是大势所趋
  20. 多可文档管理的数据备份

热门文章

  1. JQuery选择器 属性值 等于 以开头 以结尾 元素选择
  2. 网站刷关键词_中小企业网站排名如何做SEO优化 - 刷百度关键词排名
  3. python热身教程_我回来拉,Python热身篇:)
  4. hc05与单片机连接图_基于proteus的51单片机开发实例(13)-LED指示那个按键被按下
  5. VS2017报错头文件unistd.h
  6. 标题隐藏_头条官方课程没看就想起好标题?请收藏好这篇文章,不要再犯错了...
  7. 改工作空间_打拼六年换的新房,装修花了17万,飘窗改柜子很实用,谁见过?...
  8. L1正则化与数据分布的关系
  9. java三目运算符判断boonlean,java三元运算符
  10. 通过python实现卷积神经网络_Python 徒手实现 卷积神经网络 CNN