Netease cloud music controller

Chrome global media control support for netease cloud music

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name         Netease cloud music controller
// @namespace    https://github.com/superboy724/NeteaseCloudMusicController
// @version      1.0.5
// @description  Chrome global media control support for netease cloud music 
// @author       superboy724
// @match        music.163.com
// @grant        none
// ==/UserScript==

var NeteaseMusicController = {
    neteaseController : NEJ.P('nm.w').uX2x.fQ8I(),
    prev : function(){
        //网易云上一曲
        this.neteaseController.EB5G()
    },
    next : function(){
        //网易云下一曲
        this.neteaseController.pl1x()
    }
}



function getItemToJson(key){
    return JSON.parse(localStorage.getItem(key))
}

//重写localstorage的setItem方法,给localstorage的内容赋值时进行回调
function overrideLocalStorageSetItem(caller){
    let superMethod = localStorage.setItem
    localStorage.setItem = function(key,value){
        superMethod.apply(this,arguments)
        caller(key)
    }
}

//初始化media session
function registerMediaSession(){
    if ('mediaSession' in navigator){
            navigator.mediaSession.metadata = new MediaMetadata({
            title: '',
            artist: '',
            album: '',
            artwork: []
        })
    } else {
        return false
    }

    //注册“上一曲”按钮
    navigator.mediaSession.setActionHandler('previoustrack', function() {
        NeteaseMusicController.prev()
    });
    //注册“下一曲”按钮
    navigator.mediaSession.setActionHandler('nexttrack', function() {
        NeteaseMusicController.next()
    });

    return true
}

//更新media session元数据
function playlistUpdate(){
    let playersetting = getItemToJson('player-setting')
    let trackInfos = getItemToJson('track-queue')

    if((playersetting && trackInfos) == false){
        console.info("Chrome media control support for netease cloud music:storage is empty")
        return;
    }
    if(trackInfos.length == 0){
        console.info("Chrome media control support for netease cloud music:playlist is empty")
        return;
    }

    let playlistIndex = playersetting.index
    let trackInfo = trackInfos[playlistIndex]
    let artistNames = ''
    let artwork = []

    for(i = 0;i<=trackInfo.artists.length - 1;i++){
        artistNames += i == 0 ? trackInfo.artists[i].name : '/' + trackInfo.artists[i].name
    }
    artwork.push({sizes: "130x130",src:trackInfo.album.picUrl})

    navigator.mediaSession.metadata.title = trackInfo.name
    navigator.mediaSession.metadata.artist = artistNames
    navigator.mediaSession.metadata.album = trackInfo.album.name
    navigator.mediaSession.metadata.artwork = artwork
}

(function() {
    'use strict';

    if(!registerMediaSession()){
        console.error("Chrome media control support for netease cloud music:unsupport")
    }
    overrideLocalStorageSetItem((key)=>{
        //1.网易云换歌时会将当前播放到播放列表的第几曲写入player-setting中,则检测到该key中内容更新时进行mediasession的更新
        //2.当发生播放列表更改时也进行更新
        if(key === 'player-setting' || key === 'track-queue'){
            playlistUpdate()
        }
    })
    //所有内容初始化完毕后给mediasession赋初始值
    playlistUpdate()
})()