Advertisement
Guest User

Untitled

a guest
Oct 9th, 2021
120
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name         MediaSession API support for YMusic
  3. // @namespace    http://tampermonkey.net/
  4. // @version      0.1
  5. // @description  Add basic MediaSession support
  6. // @match        https://music.yandex.ru/home
  7. // @match        https://music.yandex.ru/non-music
  8. // @match        https://music.yandex.ru/kids
  9. // @match        https://music.yandex.ru/radio
  10. // @icon         https://www.google.com/s2/favicons?domain=yandex.ru
  11. // @grant        none
  12. // ==/UserScript==
  13.  
  14. (function() {
  15.     const UI_SELECTORS = {
  16.         play: '.player-controls__btn_play',
  17.         next: '.player-controls__btn_next',
  18.         prev: '.player-controls__btn_prev',
  19.         controls_container: '.player-controls__track-container',
  20.         cover_image: '.track .entity-cover__image',
  21.         track_title: '.track .track__title',
  22.         track_artist: '.track .track__artists'
  23.     }
  24.  
  25.     let curTrackName = null;
  26.  
  27.     setTimeout(setup, 3000);
  28.  
  29.     function setup() {
  30.         navigator.mediaSession.setActionHandler('play', () => {
  31.             console.log('[mediasession] handling play');
  32.             if (!isPlaying()) {
  33.                 clickOnUI(UI_SELECTORS.play)();
  34.             }
  35.         });
  36.         navigator.mediaSession.setActionHandler('pause', () => {
  37.             console.log('[mediasession] handling pause');
  38.             if (isPlaying()) {
  39.                 clickOnUI(UI_SELECTORS.play)();
  40.             }
  41.         });
  42.         navigator.mediaSession.setActionHandler('nexttrack', clickOnUI(UI_SELECTORS.next));
  43.         navigator.mediaSession.setActionHandler('previoustrack', clickOnUI(UI_SELECTORS.prev));
  44.  
  45.         const ctrlsContainer = document.querySelector(UI_SELECTORS.controls_container);
  46.         if (ctrlsContainer) {
  47.             const observer = new MutationObserver(onTrackChange);
  48.             observer.observe(ctrlsContainer, { subtree: true, childList: true });
  49.  
  50.             updateTrackMeta();
  51.         }
  52.     }
  53.  
  54.     function isPlaying() {
  55.         const PLAY_CLASS = 'player-controls__btn_pause';
  56.         const playBtn = document.querySelector(UI_SELECTORS.play);
  57.  
  58.         if (!playBtn) {
  59.             console.error('cannot find play button while checking plyaing status');
  60.             return;
  61.         }
  62.  
  63.         return playBtn.classList.contains(PLAY_CLASS);
  64.     }
  65.  
  66.     function clickOnUI(sel) {
  67.         return () => {
  68.             const elm = document.querySelector(sel);
  69.             if (!elm) {
  70.                 console.error('cannot click on element. it doesnt exist in DOM. CSS selector:', sel)
  71.                 return;
  72.             }
  73.             elm.click();
  74.         }
  75.     }
  76.  
  77.     function updateTrackMeta() {
  78.         try {
  79.             const trName = document.querySelector(UI_SELECTORS.track_title).textContent.trim();
  80.             const trArtists = document.querySelector(UI_SELECTORS.track_artist).textContent.trim();
  81.             const trCover = document.querySelector(UI_SELECTORS.cover_image).src;
  82.  
  83.             navigator.mediaSession.metadata = new MediaMetadata({
  84.                 title: trName,
  85.                 artist: trArtists,
  86.                 artwork: [
  87.                   { src: trCover },
  88.                 ]
  89.               });
  90.         } catch (_err) {}
  91.     }
  92.  
  93.     function onTrackChange(mutations) {
  94.         setTimeout(updateTrackMeta, 1000);
  95.     }
  96. })();
Advertisement
RAW Paste Data Copied
Advertisement