Netease cloud music controller

Chrome global media control support for netease cloud music

当前为 2020-02-24 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Netease cloud music controller
  3. // @namespace https://github.com/superboy724/NeteaseCloudMusicController
  4. // @version 1.0.5
  5. // @description Chrome global media control support for netease cloud music
  6. // @author superboy724
  7. // @match music.163.com
  8. // @grant none
  9. // ==/UserScript==
  10.  
  11. var NeteaseMusicController = {
  12. neteaseController : NEJ.P('nm.w').uX2x.fQ8I(),
  13. prev : function(){
  14. //网易云上一曲
  15. this.neteaseController.EB5G()
  16. },
  17. next : function(){
  18. //网易云下一曲
  19. this.neteaseController.pl1x()
  20. }
  21. }
  22.  
  23.  
  24.  
  25. function getItemToJson(key){
  26. return JSON.parse(localStorage.getItem(key))
  27. }
  28.  
  29. //重写localstorage的setItem方法,给localstorage的内容赋值时进行回调
  30. function overrideLocalStorageSetItem(caller){
  31. let superMethod = localStorage.setItem
  32. localStorage.setItem = function(key,value){
  33. superMethod.apply(this,arguments)
  34. caller(key)
  35. }
  36. }
  37.  
  38. //初始化media session
  39. function registerMediaSession(){
  40. if ('mediaSession' in navigator){
  41. navigator.mediaSession.metadata = new MediaMetadata({
  42. title: '',
  43. artist: '',
  44. album: '',
  45. artwork: []
  46. })
  47. } else {
  48. return false
  49. }
  50.  
  51. //注册“上一曲”按钮
  52. navigator.mediaSession.setActionHandler('previoustrack', function() {
  53. NeteaseMusicController.prev()
  54. });
  55. //注册“下一曲”按钮
  56. navigator.mediaSession.setActionHandler('nexttrack', function() {
  57. NeteaseMusicController.next()
  58. });
  59.  
  60. return true
  61. }
  62.  
  63. //更新media session元数据
  64. function playlistUpdate(){
  65. let playersetting = getItemToJson('player-setting')
  66. let trackInfos = getItemToJson('track-queue')
  67.  
  68. if((playersetting && trackInfos) == false){
  69. console.info("Chrome media control support for netease cloud music:storage is empty")
  70. return;
  71. }
  72. if(trackInfos.length == 0){
  73. console.info("Chrome media control support for netease cloud music:playlist is empty")
  74. return;
  75. }
  76.  
  77. let playlistIndex = playersetting.index
  78. let trackInfo = trackInfos[playlistIndex]
  79. let artistNames = ''
  80. let artwork = []
  81.  
  82. for(i = 0;i<=trackInfo.artists.length - 1;i++){
  83. artistNames += i == 0 ? trackInfo.artists[i].name : '/' + trackInfo.artists[i].name
  84. }
  85. artwork.push({sizes: "130x130",src:trackInfo.album.picUrl})
  86.  
  87. navigator.mediaSession.metadata.title = trackInfo.name
  88. navigator.mediaSession.metadata.artist = artistNames
  89. navigator.mediaSession.metadata.album = trackInfo.album.name
  90. navigator.mediaSession.metadata.artwork = artwork
  91. }
  92.  
  93. (function() {
  94. 'use strict';
  95.  
  96. if(!registerMediaSession()){
  97. console.error("Chrome media control support for netease cloud music:unsupport")
  98. }
  99. overrideLocalStorageSetItem((key)=>{
  100. //1.网易云换歌时会将当前播放到播放列表的第几曲写入player-setting中,则检测到该key中内容更新时进行mediasession的更新
  101. //2.当发生播放列表更改时也进行更新
  102. if(key === 'player-setting' || key === 'track-queue'){
  103. playlistUpdate()
  104. }
  105. })
  106. //所有内容初始化完毕后给mediasession赋初始值
  107. playlistUpdate()
  108. })()