🔖v2.4 update
修复网易云音乐无法播放 增加标题栏滚动效果(感谢@lzcykevin) 增加歌曲循环播放控制(感谢@yuxizhe) 修复百度音乐无法播放 优化连续播放失败的歌曲过多时,自动终止播放。防止卡死 压缩图片素材,限制封面图片尺寸,优化页面加载速度pull/25/merge
|
@ -77,6 +77,14 @@ php 5.4+, curl_exec, file_get_contents, json_decode, openssl_encrypt
|
|||
|
||||
### 更新日志
|
||||
-----
|
||||
#### v2.4 `2018/3/11`
|
||||
- 修复网易云音乐无法播放
|
||||
- 增加标题栏滚动效果(感谢@lzcykevin)
|
||||
- 增加歌曲循环播放控制(感谢@yuxizhe)
|
||||
- 修复百度音乐无法播放
|
||||
- 优化连续播放失败的歌曲过多时,自动终止播放。防止卡死
|
||||
- 压缩图片素材,限制封面图片尺寸,优化页面加载速度
|
||||
|
||||
#### v2.32 `2017/9/15`
|
||||
- 修复播放历史记录歌曲时播放失败的 BUG
|
||||
- 新增播放歌曲时浏览器标题栏显示相关信息
|
||||
|
|
11
api.php
|
@ -1,9 +1,9 @@
|
|||
<?php
|
||||
/**************************************************
|
||||
* MKOnlinePlayer v2.3
|
||||
* MKOnlinePlayer v2.4
|
||||
* 后台音乐数据抓取模块
|
||||
* 编写:mengkun(https://mkblog.cn)
|
||||
* 时间:2018-2-11
|
||||
* 时间:2018-3-11
|
||||
* 特别感谢 @metowolf 提供的 Meting.php
|
||||
*************************************************/
|
||||
|
||||
|
@ -22,7 +22,7 @@ $netease_cookie = '';
|
|||
**/
|
||||
|
||||
|
||||
define('HTTPS', true); // 如果您的网站启用了https,请将此项置为“true”,如果你的网站未启用 https,建议将此项设置为“false”
|
||||
define('HTTPS', false); // 如果您的网站启用了https,请将此项置为“true”,如果你的网站未启用 https,建议将此项设置为“false”
|
||||
define('DEBUG', false); // 是否开启调试模式,正常使用时请将此项置为“false”
|
||||
|
||||
/*
|
||||
|
@ -59,6 +59,11 @@ switch(getParam('types')) // 根据请求的 Api,执行相应操作
|
|||
|
||||
$data = $API->url($id);
|
||||
|
||||
if($source == 'netease' && json_decode($data, true)['url'] == '') { // 修复网易云链接获取失效(双保险)
|
||||
echojson('{"url":"https://music.163.com/song/media/outer/url?id='.$id.'.mp3","br":320}');
|
||||
return;
|
||||
}
|
||||
|
||||
echojson($data);
|
||||
break;
|
||||
|
||||
|
|
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 9.9 KiB After Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 9.5 KiB After Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 4.8 KiB |
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 1.5 KiB |
|
@ -18,7 +18,7 @@
|
|||
<meta name="x5-fullscreen" content="true"><!--QQ强制全屏-->
|
||||
<meta name="x5-page-mode" content="app"><!--QQ应用模式-->
|
||||
|
||||
<title>MKOnlinePlayer v2.3</title>
|
||||
<title>MKOnlinePlayer v2.4</title>
|
||||
<meta name="description" content="一款开源的基于网易云音乐api的在线音乐播放器。具有音乐搜索、播放、下载、歌词同步显示、个人音乐播放列表同步等功能。"/>
|
||||
<meta name="keywords" content="孟坤播放器,在线音乐播放器,MKOnlinePlayer,网易云音乐,音乐api,音乐播放器源代码"/>
|
||||
|
||||
|
@ -51,7 +51,7 @@
|
|||
|
||||
<!-- 头部logo -->
|
||||
<div class="header">
|
||||
<div class="logo" title="Version 2.32; Based on Meting; Powered by Mengkun">
|
||||
<div class="logo" title="Version 2.4; Based on Meting; Powered by Mengkun">
|
||||
♫ MKOnlinePlayer
|
||||
</div>
|
||||
</div> <!--class="header"-->
|
||||
|
@ -148,7 +148,7 @@
|
|||
<!-- 站长统计代码 -->
|
||||
<span style="display: none">
|
||||
<!-- 各类统计代码都放在这里…… -->
|
||||
<script src="https://s95.cnzz.com/z_stat.php?id=1261525999&web_id=1261525999" language="JavaScript"></script>
|
||||
|
||||
</span>
|
||||
|
||||
</body>
|
||||
|
|
14
js/ajax.js
|
@ -1,8 +1,8 @@
|
|||
/**************************************************
|
||||
* MKOnlinePlayer v2.31
|
||||
* MKOnlinePlayer v2.4
|
||||
* Ajax 后台数据交互请求模块
|
||||
* 编写:mengkun(http://mkblog.cn)
|
||||
* 时间:2017-9-13
|
||||
* 编写:mengkun(https://mkblog.cn)
|
||||
* 时间:2018-3-11
|
||||
*************************************************/
|
||||
|
||||
// ajax加载搜索结果
|
||||
|
@ -188,7 +188,7 @@ function ajaxPic(music, callback)
|
|||
|
||||
// ajax加载用户歌单
|
||||
// 参数:歌单网易云 id, 歌单存储 id,回调函数
|
||||
function ajaxPlayList(lid, id, callback){
|
||||
function ajaxPlayList(lid, id, callback) {
|
||||
if(!lid) return false;
|
||||
|
||||
// 已经在加载了,跳过
|
||||
|
@ -218,7 +218,7 @@ function ajaxPlayList(lid, id, callback){
|
|||
};
|
||||
|
||||
if(jsonData.playlist.coverImgUrl !== '') {
|
||||
tempList.cover = jsonData.playlist.coverImgUrl;
|
||||
tempList.cover = jsonData.playlist.coverImgUrl + "?param=200y200";
|
||||
} else {
|
||||
tempList.cover = musicList[id].cover;
|
||||
}
|
||||
|
@ -235,7 +235,7 @@ function ajaxPlayList(lid, id, callback){
|
|||
url_id: jsonData.playlist.tracks[i].id, // 链接ID
|
||||
pic_id: null, // 封面ID
|
||||
lyric_id: jsonData.playlist.tracks[i].id, // 歌词ID
|
||||
pic: jsonData.playlist.tracks[i].al.picUrl, // 专辑图片
|
||||
pic: jsonData.playlist.tracks[i].al.picUrl + "?param=300y300", // 专辑图片
|
||||
url: null // mp3链接
|
||||
};
|
||||
}
|
||||
|
@ -354,7 +354,7 @@ function ajaxUserList(uid)
|
|||
tempList = {
|
||||
id: jsonData.playlist[i].id, // 列表的网易云 id
|
||||
name: jsonData.playlist[i].name, // 列表名字
|
||||
cover: jsonData.playlist[i].coverImgUrl, // 列表封面
|
||||
cover: jsonData.playlist[i].coverImgUrl + "?param=200y200", // 列表封面
|
||||
creatorID: uid, // 列表创建者id
|
||||
creatorName: jsonData.playlist[i].creator.nickname, // 列表创建者名字
|
||||
creatorAvatar: jsonData.playlist[i].creator.avatarUrl, // 列表创建者头像
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
/**************************************************
|
||||
* MKOnlinePlayer v2.32
|
||||
* MKOnlinePlayer v2.4
|
||||
* 封装函数及UI交互模块
|
||||
* 编写:mengkun(http://mkblog.cn)
|
||||
* 时间:2017-9-15
|
||||
* 编写:mengkun(https://mkblog.cn)
|
||||
* 时间:2018-3-11
|
||||
*************************************************/
|
||||
// 判断是否是移动设备
|
||||
var isMobile = {
|
||||
|
@ -28,8 +28,9 @@ $(function(){
|
|||
console.warn('播放器调试模式已开启,正常使用时请在 js/player.js 中按说明关闭调试模式');
|
||||
}
|
||||
|
||||
rem.isMobile = isMobile.any();
|
||||
rem.isMobile = isMobile.any(); // 判断是否是移动设备
|
||||
rem.webTitle = document.title; // 记录页面原本的标题
|
||||
rem.errCount = 0; // 连续播放失败的歌曲数归零
|
||||
|
||||
initProgress(); // 初始化音量条、进度条(进度条初始化要在 Audio 前,别问我为什么……)
|
||||
initAudio(); // 初始化 audio 标签,事件绑定
|
||||
|
@ -397,6 +398,7 @@ function openDownloadDialog(url, saveName)
|
|||
}
|
||||
var aLink = document.createElement('a');
|
||||
aLink.href = url;
|
||||
aLink.target = "_blank";
|
||||
aLink.download = saveName || ''; // HTML5新增的属性,指定保存文件名,可以不要后缀,注意,file:///模式下不会生效
|
||||
var event;
|
||||
if(window.MouseEvent) event = new MouseEvent('click');
|
||||
|
|
101
js/player.js
|
@ -1,8 +1,8 @@
|
|||
/**************************************************
|
||||
* MKOnlinePlayer v2.32
|
||||
* MKOnlinePlayer v2.4
|
||||
* 播放器主功能模块
|
||||
* 编写:mengkun(https://mkblog.cn)
|
||||
* 时间:2018-2-11
|
||||
* 时间:2018-3-11
|
||||
*************************************************/
|
||||
// 播放器功能配置
|
||||
var mkPlayer = {
|
||||
|
@ -16,7 +16,7 @@ var mkPlayer = {
|
|||
dotshine: true, // 是否开启播放进度条的小点闪动效果[不支持IE](true/false) *开启后会有些卡
|
||||
mdotshine: false, // 是否开启[移动端]播放进度条的小点闪动效果[不支持IE](true/false)
|
||||
volume: 0.6, // 默认音量值(0~1之间)
|
||||
version: "v2.32", // 播放器当前版本号(仅供调试)
|
||||
version: "v2.4", // 播放器当前版本号(仅供调试)
|
||||
debug: false // 是否开启调试模式(true/false)
|
||||
};
|
||||
|
||||
|
@ -36,8 +36,14 @@ function audioErr() {
|
|||
// 没播放过,直接跳过
|
||||
if(rem.playlist === undefined) return true;
|
||||
|
||||
layer.msg('当前歌曲播放失败,自动播放下一首');
|
||||
nextMusic(); // 切换下一首歌
|
||||
if(rem.errCount > 10) { // 连续播放失败的歌曲过多
|
||||
layer.msg('似乎出了点问题~播放已停止');
|
||||
rem.errCount = 0;
|
||||
} else {
|
||||
rem.errCount++; // 记录连续播放失败的歌曲数目
|
||||
layer.msg('当前歌曲播放失败,自动播放下一首');
|
||||
nextMusic(); // 切换下一首歌
|
||||
}
|
||||
}
|
||||
|
||||
// 点击暂停按钮的事件
|
||||
|
@ -62,29 +68,29 @@ function pause() {
|
|||
|
||||
// 循环顺序
|
||||
function orderChange() {
|
||||
if(!rem.order){
|
||||
rem.order = 2
|
||||
}
|
||||
rem.order++;
|
||||
if(rem.order > 3){
|
||||
rem.order = 1
|
||||
}
|
||||
var orderDiv = $(".btn-order")
|
||||
orderDiv.removeClass()
|
||||
|
||||
if ( 1 === rem.order ) {
|
||||
orderDiv.addClass("player-btn btn-order btn-order-single")
|
||||
orderDiv.attr("title","单曲循环")
|
||||
}
|
||||
else if ( 2 === rem.order ) {
|
||||
orderDiv.addClass("player-btn btn-order btn-order-list")
|
||||
orderDiv.attr("title","列表循环")
|
||||
}
|
||||
else if ( 3 === rem.order ) {
|
||||
orderDiv.addClass("player-btn btn-order btn-order-random")
|
||||
orderDiv.attr("title","随机播放")
|
||||
}
|
||||
if(!rem.order) rem.order = 2;
|
||||
rem.order++;
|
||||
if(rem.order > 3) rem.order = 1;
|
||||
|
||||
var orderDiv = $(".btn-order");
|
||||
orderDiv.removeClass();
|
||||
switch(rem.order) {
|
||||
case 1: // 单曲循环
|
||||
orderDiv.addClass("player-btn btn-order btn-order-single");
|
||||
orderDiv.attr("title","单曲循环");
|
||||
break;
|
||||
|
||||
case 3: // 随机播放
|
||||
orderDiv.addClass("player-btn btn-order btn-order-random");
|
||||
orderDiv.attr("title","随机播放");
|
||||
break;
|
||||
|
||||
default: // 顺序播放
|
||||
orderDiv.addClass("player-btn btn-order btn-order-list");
|
||||
orderDiv.attr("title","列表循环");
|
||||
}
|
||||
}
|
||||
|
||||
// 播放
|
||||
function audioPlay() {
|
||||
rem.paused = false; // 更新状态(未暂停)
|
||||
|
@ -142,28 +148,28 @@ function prevMusic() {
|
|||
|
||||
// 播放下一首歌
|
||||
function nextMusic() {
|
||||
switch (rem.order ? rem.order : 1) {
|
||||
case 1,2:
|
||||
playList(rem.playid + 1);
|
||||
break;
|
||||
case 3:
|
||||
if (musicList[1] && musicList[1].item.length) {
|
||||
var id = parseInt(Math.random() * musicList[1].item.length)
|
||||
playList(id);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
playList(rem.playid + 1);
|
||||
break;
|
||||
}
|
||||
switch (rem.order ? rem.order : 1) {
|
||||
case 1,2:
|
||||
playList(rem.playid + 1);
|
||||
break;
|
||||
case 3:
|
||||
if (musicList[1] && musicList[1].item.length) {
|
||||
var id = parseInt(Math.random() * musicList[1].item.length);
|
||||
playList(id);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
playList(rem.playid + 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
// 自动播放时的下一首歌
|
||||
function autoNextMusic() {
|
||||
if(rem.order && rem.order === 1) {
|
||||
playList(rem.playid);
|
||||
} else {
|
||||
nextMusic()
|
||||
}
|
||||
if(rem.order && rem.order === 1) {
|
||||
playList(rem.playid);
|
||||
} else {
|
||||
nextMusic();
|
||||
}
|
||||
}
|
||||
|
||||
// 歌曲时间变动回调函数
|
||||
|
@ -328,6 +334,7 @@ function play(music) {
|
|||
return;
|
||||
}
|
||||
|
||||
rem.errCount = 0; // 连续播放失败的歌曲数归零
|
||||
music_bar.goto(0); // 进度条强制归零
|
||||
changeCover(music); // 更新封面展示
|
||||
ajaxLyric(music, lyricCallback); // ajax加载歌词
|
||||
|
@ -337,7 +344,7 @@ function play(music) {
|
|||
|
||||
// 我的要求并不高,保留这一句版权信息可好?
|
||||
// 保留了,你不会损失什么;而保留版权,是对作者最大的尊重。
|
||||
console.info('欢迎使用 MKOnlinePlayer!\n当前版本:'+mkPlayer.version+' \n作者:mengkun(http://mkblog.cn)\n歌曲来源于各大音乐平台\nGithub:https://github.com/mengkunsoft/MKOnlineMusicPlayer');
|
||||
console.info('欢迎使用 MKOnlinePlayer!\n当前版本:'+mkPlayer.version+' \n作者:mengkun(https://mkblog.cn)\n歌曲来源于各大音乐平台\nGithub:https://github.com/mengkunsoft/MKOnlineMusicPlayer');
|
||||
|
||||
// 音乐进度条拖动回调函数
|
||||
function mBcallback(newVal) {
|
||||
|
|