Syleront / Yandex Music & Radio MediaApi Support

// ==UserScript==
// @name Yandex Music & Radio MediaApi Support
// @version 0.1.1
// @author Syleront
// @include /(music|radio)\.yandex\.ru/
// @run-at document-start
// @license MIT
// @copyright 2018, Syleront
// ==/UserScript==

(() => {
  const { navigator } = unsafeWindow;

  if ("mediaSession" in navigator) {
    document.addEventListener("DOMContentLoaded", () => {
      const { externalAPI } = unsafeWindow;
      const {
        EVENT_TRACK,
        getCurrentTrack,
        togglePause,
        prev,
        next
      } = externalAPI;

      externalAPI.on(EVENT_TRACK, () => {
        const current = getCurrentTrack();

        if (current !== null) {
          const { title, artists, cover } = current;
          const artist = artists.map((e) => e.title).join(", ");
          const album = current.album.title;
          const artwork = [{
            src: "https://" + cover.replace(/%%$/, "200x200"),
            sizes: "200x200",
            type: "image/jpeg"
          }];

          navigator.mediaSession.metadata = new MediaMetadata({ title, artist, album, artwork });
        }
      });

      navigator.mediaSession.setActionHandler("play", () => togglePause());
      navigator.mediaSession.setActionHandler("pause", () => togglePause());
      navigator.mediaSession.setActionHandler("nexttrack", () => next());
      if (location.hostname !== "radio.yandex.ru") { // radio changes tracks only to the next
        navigator.mediaSession.setActionHandler("previoustrack", () => prev());
      }
    });
  }
})();