Netease cloud music controller

Chrome media control support for netease cloud music

09.01.2020 itibariyledir. En son verisyonu görün.

Bu betiği kurabilmeniz için Tampermonkey, Greasemonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

You will need to install an extension such as Tampermonkey to install this script.

Bu betiği kurabilmeniz için Tampermonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği kurabilmeniz için Tampermonkey ya da Userscripts gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

You will need to install an extension such as Tampermonkey to install this script.

Bu komut dosyasını yüklemek için bir kullanıcı komut dosyası yöneticisi uzantısı yüklemeniz gerekecek.

(Zaten bir kullanıcı komut dosyası yöneticim var, kurmama izin verin!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Zateb bir user-style yöneticim var, yükleyeyim!)

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

var NeteaseMusicController = {
    neteaseController : NEJ.P('nm.w').tW7P.fO3x(),
    prev : function(){
        //网易云上一曲
        this.neteaseController.Dr0x()
    },
    next : function(){
        //网易云下一曲
        this.neteaseController.pr6l()
    }
}



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()
})()