window.onload = function(){
createlist();
InitPlayMode();
}
// Title Controller
class TitleStat{
constructor( originTitle ){
this.originTitle = originTitle;
}
GlobalInterval = null;
OriginTitle = document.title;
TargetTitle = "";
SCROLL_SPEED = 1000;
ActivateStat = false;
getActivateStat() {
return this.ActivateStat;
}
activate(){
this.ActivateStat = true;
}
deactivate() {
this.ActivateStat = false;
}
setTargetTitle( title ){
this.TargetTitle = title;
}
setScrollSpeed( speed ){
this.SCROLL_SPEED = speed;
}
setOriginTitle( title ){
this.originTitle = title;
}
setTitleManual( title ){
document.title = title;
}
startLoop(){
this.activate();
clearInterval(this.GlobalInterval);
this.TempTitle = this.TargetTitle;
if ( this.TempTitle.length < 10 ){
this.noScrollTitle();
} else {
window.userdefines_title = {
"TempTitle": this.TargetTitle + " ",
}
this.GlobalInterval = setInterval(this.scorllTheTitle, this.SCROLL_SPEED);
}
}
stopLoop(){
clearInterval(this.GlobalInterval);
}
reset(){
this.stopLoop();
delete window.userdefines_title;
document.title = this.OriginTitle;
this.deactivate();
}
noScrollTitle() {
console.log("使用的是非滚动标题!");
if( document.getElementById("Player").paused == false ){
document.title = "[▶️] " + this.TempTitle;
}else{
document.title = "[⏸] " + this.TempTitle;
}
}
scorllTheTitle() {
// 此处的this指的是window对象
if( document.getElementById("Player").paused == false ){
document.title = "[▶️] " + this.userdefines_title.TempTitle.substring(0,20) + "...";
}else{
document.title = "[⏸] " + this.userdefines_title.TempTitle.substring(0,20) + "...";
}
this.userdefines_title.TempTitle = this.userdefines_title.TempTitle.substring(1) + this.userdefines_title.TempTitle.substring(0,1);
}
}
// Player Controller
class PlayerControl {
constructor() {
this.playerObject = document.getElementById('Player');
this.ListenerStatus = false;
}
setFunction() {
this.FuncObj = this.playStatCheck;
}
enableListener(func) {
this.playerObject.addEventListener('ended', func);
this.ListenerStatus = true;
console.log("启用播放器播放结束事件监听");
}
disableListener(func) {
this.playerObject.removeEventListener('ended', func);
this.ListenerStatus = false;
console.log("停用播放器播放结束事件监听");
}
getListenerStatus() {
return this.ListenerStatus;
}
startCheck() {
if (this.ListenerStatus) {
this.disableListener(this.FuncObj);
}
this.enableListener(this.FuncObj);
}
stopCheck() {
if (this.ListenerStatus) {
this.disableListener(this.FuncObj);
} else {
console.error("失败!");
}
}
/* 默认函数 */
playStatCheck() {
console.log(this);
// debug
console.warn("当前模式:" + CyclePlayMode);
// 是否单曲?
if (CyclePlayMode == 2) {
// 从头开始
this.playerObject.play();
console.log("洗脑的单曲循环!");
return;
}
// 播放到列表尾部,检查播放状态是否为0(单次播放列表)
if (nowPlay >= (list.size + 1)) {
if (CyclePlayMode === 0) {
if (this.ListenerStatus) {
// 播放列表完毕就清除事件监听器
this.disableListener(this.playStatCheck);
console.log("播放完毕,已清除事件监听。");
return;
} else {
// 事件监听器未打开
console.error("关闭失败,事件监听器未启用。");
return;
}
}
}
// Safe
if (this.playerObject.ended === false) {
console.log("安全模式| 歌曲未完播,安全执行函数");
return;
}
// 切歌
playnext();
}
}
// Title Control
let TitleControl = new TitleStat(document.title);
// Window OnBlur
window.onblur = () => {
console.log("您已离开播放器!");
TitleControl.setScrollSpeed(500);
TitleControl.setTargetTitle(document.getElementById("nowplay").innerHTML);
TitleControl.startLoop();
}
// Window OnFocus
window.onfocus = () => {
// document.title = originTitle;
console.log("您已回到播放器!");
TitleControl.reset();
}
// 搜索音乐
function getsongs(){
document.getElementById("reslist").innerHTML = "";
var search = document.getElementById("search-song");
var reslist = document.getElementById("reslist");
var urls = `http://150.158.7.169:3000/search?keywords=${search.value}`
var xhr = new XMLHttpRequest();
xhr.open("GET", urls);
xhr.send();
xhr.onreadystatechange = function(){
if(xhr.readyState == 4 && xhr.status == 200){
var obj = JSON.parse(xhr.responseText);
console.log(obj);
var list = obj.result.songs;
for(var i = 0; i < list.length; i++){
artiststr = getArtist(list[i]);
console.log({"songid":list[i].id, "songname":list[i].name, "artist":artiststr});
if(list[i].fee == 0 || list[i].fee == 8){
reslist.innerHTML += `
${list[i].name} - ${getArtist(list[i])}` +
`` +
`` +
``;
}else{
reslist.innerHTML += `${list[i].name} - ${getArtist(list[i])}`+
`` +
`` +
``;
}
}
}else{
console.warn("WARNNING:API服务器响应失败");
}
}
document.getElementById("keyword").innerHTML = search.value;
}
// 获取艺术家
function getArtist(obj){
var artiststr = "";
var artistd = obj.artists;
for(var i = 0; i < artistd.length; i++){
if(i != artistd.length - 1){
artiststr += artistd[i].name + "/";
}else{
artiststr += artistd[i].name;
}
}
return artiststr;
}
// 播放音乐
function playmusic(playid, songname, artist){
document.getElementById("nowplay").innerHTML = `${songname} - ${artist}`
url = `https://music.163.com/song/media/outer/url?id=${playid}.mp3`;
document.getElementById("Player").setAttribute('src',url);
// 选中后自动播放
document.getElementById("Player").play();
// 插入到历史记录
inserthistory(playid, songname, artist);
}
// 列表
function List(){
this.items = [];
List.prototype.insertRear = (element) => {
this.items.push(element);
}
List.prototype.deleteItem = (loc) => {
if(loc == undefined) {
return false;
}
this.items.splice(loc, 1);
return true;
}
List.prototype.isEmpty = () => {
return this.items.length == 0;
}
List.prototype.clear = () => {
this.items = [];
}
List.prototype.size = () => {
return this.items.length;
}
List.prototype.getElem = (loc) => {
if(loc < 0 || loc == undefined){
return undefined;
}
if(this.isEmpty()){
return false;
}
return this.items[loc];
}
// CodeGeeX Written
List.prototype.locate = (items) => {
for(var i = 0; i < this.items.length; i++){
if(items == this.items[i]){
return i;
} else {
return undefined;
}
}
}
List.prototype.getLength = () => {
return this.items.length;
}
}
// 创建播放列表
function createlist(){
// 构造队列
// list = new Queue();
list = new List();
nowPlay = 0;
}
// 添加到播放列表
function addlist(songid, songname, artist){
for (var i = 0; i < list.getLength(); i++) {
if(list.getElem(i).songid == songid){
console.log(`${songname} - ${artist} 已存在于播放列表`);
return;
}
}
list.insertRear({"songid":songid, "songname":songname, "artist":artist});
console.log(`${songname} - ${artist} 已被加入播放列表`);
}
// 播放下一首
function playnext(){
if(list.isEmpty()){
console.log("音乐列表已经播放完毕了哦,快加入新的音乐吧~");
alert("音乐列表已经播放完毕了哦,快加入新的音乐吧~");
return;
}
if(nowPlay >= (list.size() - 1)){
nowPlay = 0;
}else{
nowPlay += 1;
}
var next = list.getElem(nowPlay);
playmusic(next.songid, next.songname, next.artist);
// 标题控制
if ( TitleControl.getActivateStat() == true ) {
TitleControl.reset();
TitleControl.setTitleManual("Loading...");
TitleControl.setTargetTitle(next.songname + " - " + next.artist);
TitleControl.startLoop();
}
}
// 播放上一首
function playlast() {
if(list.isEmpty()){
console.log("音乐列表已经播放完毕了哦,快加入新的音乐吧~");
alert("音乐列表已经播放完毕了哦,快加入新的音乐吧~");
return;
}
if(nowPlay <= 0){
nowPlay = list.size() - 1;
}else{
nowPlay -= 1;
}
var prior = list.getElem(nowPlay);
playmusic(prior.songid, prior.songname, prior.artist);
if ( TitleControl.getActivateStat() == true ) {
TitleControl.reset();
TitleControl.setTitleManual("Loading...");
TitleControl.setTargetTitle(prior.songname + " - " + prior.artist);
TitleControl.startLoop();
}
}
function processCyclePlay(){
switch ( CyclePlayMode ){
case 0: // OFF
if ( nowPlay >= (list.size() - 1) ) {
}
break;
case 1: // single cycle
document.getElementById("Player").play();
break;
case 2: // list cycle
if ( false ) {
}
break;
default: break;
}
}
// 播放列表
function playthelist(){
if(list.isEmpty()){
console.log("音乐列表没有歌曲哦,快加入新的音乐吧~");
alert("音乐列表没有歌曲哦,快加入新的音乐吧~");
return;
}
// var next = list.dequeue();
var next = list.getElem(0);
playmusic(next.songid, next.songname, next.artist);
}
// 获取播放列表
function getplaylist(){
var reslist = document.getElementById("reslist");
reslist.innerHTML = "";
for(var i = 0; i < list.size(); i++){
reslist.innerHTML += `${list.items[i].songname} - ${list.items[i].artist}`;
}
document.getElementById('keyword').innerHTML = "当前播放列表";
}
// 删除指定序号的音乐 -- Writtrn By Copilot
function RemoveItemFromListByID(uid){
list.items.splice(uid, 1);
getplaylist();
}
// 插入音乐到历史记录 -- Writtrn By Copilot
function inserthistory(songid, songname, artist){
// 从本地获取历史记录
var historyList = JSON.parse(localStorage.getItem("historyList"));
// 判断是否有历史记录
if(historyList == null){
historyList = []; // 创建一个空数组
}
var flag = false; // 标记是否已经存在
// 判断是否已经存在
for(var i = 0; i < historyList.length; i++){
// 如果已经存在,则更新播放时间
if(historyList[i].songid == songid){
flag = true;
break;
}
}
// 如果不存在,则插入
if(!flag){
historyList.push({"songid":songid, "songname":songname, "artist":artist});
}
// 存储到本地
localStorage.setItem("historyList", JSON.stringify(historyList));
}
// 获取历史记录 -- Writtrn By Copilot
function gethistory(){
var historyList = JSON.parse(localStorage.getItem("historyList"));
if(historyList == null){
historyList = [];
}
var reslist = document.getElementById("reslist");
reslist.innerHTML = "";
for(var i = 0; i < historyList.length; i++){
reslist.innerHTML += `${historyList[i].songname} - ${historyList[i].artist}` +
`` +
`` +
`` +
``;
}
document.getElementById('keyword').innerHTML = "历史记录";
}
// 清空历史记录 -- Writtrn By Copilot
function removehistory(){
localStorage.removeItem("historyList");
gethistory();
}
// 当点击清空列表的时候进行一次确认,如果确认之后再进行删除操作。
function ClearList(){
var Choose = confirm("确定清空歌单吗?(此操作不可逆!)")
if(Choose == true){
removehistory();
console.log("The History List Has been cleared.");
return true;
}else{
console.log("List Clear Canceled!");
return false;
}
}
// 添加所有歌曲到播放列表
function addAllHistorytoPlayList(){
var historyList = JSON.parse(localStorage.getItem("historyList"));
if(historyList == null){
historyList = [];
}
var reslist = document.getElementById("reslist");
reslist.innerHTML = "";
for(var i = 0; i < historyList.length; i++){
addlist(historyList[i].songid, historyList[i].songname, historyList[i].artist);
console.log(`${historyList[i].songname} - ${historyList[i].artist} is add to list.`);
}
alert("已把历史记录插入到了播放列表");
// Planning to Code...
}
// 清空播放列表
function ClearthePlaylist(){
if(!list.isEmpty()){
list.clear();
console.log("List Cleared!");
}else{
console.log("List is empty, not need to clear.")
}
}
// 将历史记录转换为云列表可接受形式
function convertHist2CloudList(origin){
// var temp = JSON.parse(origin);
var result = []
for (var i = 0; i < origin.length; i++) {
result.push({
"name" : origin[i].songname,
"id" : origin[i].songid,
"author": origin[i].artist
});
}
return result;
}
// 删除历史记录
function deleteHistory( count ) {
// get HistoryList from LocalStorage
var historyList = JSON.parse( localStorage.getItem( "historyList" ) );
// is null?
if( historyList == null ){
// failed
}
// if count is smaller than List length, throw error
if ( count > historyList.length ){
console.log( "本次删除无效!\nThis deletion is invaild." );
return;
}
// console log output
console.log(`${historyList[count].songname} - ${historyList[count].artist} (位于 ${count}) 已从历史记录删除.`)
// find the item and delete it.
historyList.splice( count, 1 );
// Refresh the page
var reslist = document.getElementById( "reslist" );
reslist.innerHTML = "";
for( var i = 0; i < historyList.length; i++ ){
reslist.innerHTML += `${historyList[i].songname} - ${historyList[i].artist}` +
`` +
`` +
`` +
``;
}
document.getElementById( 'keyword' ).innerHTML = "历史记录";
// put the HistoryList back into the LocalStorage
localStorage.setItem( "historyList", JSON.stringify( historyList ) );
}
// 无版权音乐跳转到网易云
function jumpTo163CM( songid ) {
console.log("因为没钱,所以放不了,要不你自己去官网开会员听?");
if ( confirm( "因为没钱,所以放不了,要不你自己去官网开会员听?" ) ){
window.open( 'https://music.163.com/#/song?id=' + songid );
console.log("感谢你的理解!^_^");
} else {
console.log("好吧,那我也没有办法了,总之是放不了。\(sad")
}
}
// 初始化播放模式
function InitPlayMode() {
// About PlatMode
RandomMode = 0;
CyclePlayMode = 0;
PlayerController = new PlayerControl();
}
// 更改随机播放模式按钮
function changeRandButton() {
switch( RandomMode ) {
case 0 : document.getElementById('random-stat').innerHTML = "关"; break;
case 1 : document.getElementById('random-stat').innerHTML = "开"; break;
default : document.getElementById('random-stat').innerHTML = "null"; break;
}
}
// 更改随机播放模式
function changeRandomMode() {
RandomMode = (RandomMode + 1) % 2;
changeRandButton();
}
// 更改循环播放模式按钮
function changeCycleButton() {
switch( CyclePlayMode ) {
case 0 : document.getElementById('cycle-stat').innerHTML = "关"; break;
case 1 : document.getElementById('cycle-stat').innerHTML = "列表"; break;
case 2 : document.getElementById('cycle-stat').innerHTML = "单曲"; break;
default : document.getElementById('cycle-stat').innerHTML = "null"; break;
}
}
// 更改循环播放模式
function changeCyeleMode() {
CyclePlayMode = (CyclePlayMode + 1) % 3;
console.log(`当前的播放模式:${document.getElementById('cycle-stat').innerHTML}, ${CyclePlayMode}`)
changeCycleButton();
}