presence.ts 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import { ActivityType, Assets } from 'premid'
  2. const presence = new Presence({
  3. clientId: '842112189618978897',
  4. })
  5. const strings = presence.getStrings({
  6. play: 'general.playing',
  7. pause: 'general.paused',
  8. })
  9. presence.on('UpdateData', async () => {
  10. const presenceData: PresenceData = {
  11. largeImageKey: 'https://cdn.rcd.gg/PreMiD/websites/A/Apple%20Music/assets/logo.png',
  12. } as PresenceData
  13. const [timestamps, cover, listening] = await Promise.all([
  14. presence.getSetting<boolean>('timestamps'),
  15. presence.getSetting<boolean>('cover'),
  16. presence.getSetting<boolean>('listening'),
  17. ])
  18. const audio = document.querySelector<HTMLAudioElement>(
  19. 'audio#apple-music-player',
  20. )
  21. const video = document
  22. .querySelector('apple-music-video-player')
  23. ?.shadowRoot
  24. ?.querySelector(
  25. 'amp-window-takeover > .container > amp-video-player-internal',
  26. )
  27. ?.shadowRoot
  28. ?.querySelector('amp-video-player')
  29. ?.shadowRoot
  30. ?.querySelector('div#video-container')
  31. ?.querySelector<HTMLVideoElement>('video#apple-music-video-player')
  32. if (video?.title || audio?.title) {
  33. const media = video || audio
  34. const timestamp = document
  35. .querySelector('amp-lcd.lcd.lcd__music')
  36. ?.shadowRoot
  37. ?.querySelector<HTMLInputElement>(
  38. 'input#playback-progress[aria-valuenow][aria-valuemax]',
  39. )
  40. const paused = media && (media.paused || media.readyState <= 2)
  41. presenceData.details = navigator.mediaSession.metadata?.title
  42. presenceData.state = navigator.mediaSession.metadata?.artist
  43. presenceData.smallImageKey = paused ? Assets.Pause : Assets.Play
  44. presenceData.smallImageText = paused
  45. ? (await strings).pause
  46. : (await strings).play
  47. if (cover) {
  48. presenceData.largeImageKey = navigator.mediaSession.metadata?.artwork[0]?.src.replace(
  49. /\d{1,2}x\d{1,2}[a-z]{1,2}/,
  50. '1024x1024',
  51. )
  52. }
  53. [presenceData.startTimestamp, presenceData.endTimestamp] = presence.getTimestamps(
  54. Number(timestamp ? timestamp.ariaValueNow : media!.currentTime),
  55. Number(timestamp ? timestamp.ariaValueMax : media!.duration),
  56. )
  57. if (paused || !timestamps) {
  58. delete presenceData.startTimestamp
  59. delete presenceData.endTimestamp
  60. }
  61. if (listening)
  62. presenceData.type = ActivityType.Listening
  63. presence.setActivity(presenceData)
  64. }
  65. else if (+presence.getExtensionVersion() < 224) {
  66. presence.setActivity()
  67. }
  68. else {
  69. presence.clearActivity()
  70. }
  71. })