presence.ts 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. let elapsed = Math.floor(Date.now() / 1000),
  2. prevUrl = document.location.href;
  3. const assets = {
  4. zdf: "https://cdn.rcd.gg/PreMiD/websites/Z/ZDFmediathek/assets/0.png",
  5. "3sat": "https://cdn.rcd.gg/PreMiD/websites/Z/ZDFmediathek/assets/1.png",
  6. phoenix: "https://cdn.rcd.gg/PreMiD/websites/Z/ZDFmediathek/assets/2.png",
  7. arte: "https://cdn.rcd.gg/PreMiD/websites/Z/ZDFmediathek/assets/3.png",
  8. zdfinfo: "https://cdn.rcd.gg/PreMiD/websites/Z/ZDFmediathek/assets/4.png",
  9. zdfneo: "https://cdn.rcd.gg/PreMiD/websites/Z/ZDFmediathek/assets/5.png",
  10. kika: "https://cdn.rcd.gg/PreMiD/websites/Z/ZDFmediathek/assets/6.png",
  11. },
  12. presence = new Presence({
  13. clientId: "854999470357217290",
  14. }),
  15. // TODO: Add multiLang
  16. strings = presence.getStrings({
  17. play: "general.playing",
  18. pause: "general.paused",
  19. browsing: "general.browsing",
  20. browsingThrough: "discord.browseThrough",
  21. buttonWatchVideo: "general.buttonWatchVideo",
  22. buttonWatchStream: "general.buttonWatchStream",
  23. });
  24. presence.on("UpdateData", async () => {
  25. const presenceData: PresenceData = {
  26. largeImageKey:
  27. "https://cdn.rcd.gg/PreMiD/websites/Z/ZDFmediathek/assets/logo.png",
  28. },
  29. video = document.querySelector<HTMLVideoElement>(
  30. "div.zdfplayer-video-container video"
  31. );
  32. if (document.location.href !== prevUrl) {
  33. prevUrl = document.location.href;
  34. elapsed = Math.floor(Date.now() / 1000);
  35. }
  36. if (video) {
  37. presenceData.type = ActivityType.Watching;
  38. if (location.pathname.startsWith("/live-tv")) {
  39. // Livestream
  40. const mediathekLivechannel = document
  41. .querySelector<HTMLHeadingElement>(
  42. "div.m-active h2[class='visuallyhidden']"
  43. )
  44. .textContent.replace(/ {2}/g, " ")
  45. .replaceAll(" im Livestream", "")
  46. .replaceAll(" Livestream", "");
  47. let livename = mediathekLivechannel;
  48. switch (livename) {
  49. case "phoenix":
  50. livename = "PHOENIX";
  51. break;
  52. case "KiKA":
  53. livename = "KI\\.KA";
  54. break;
  55. default:
  56. }
  57. const channel = document.querySelector<HTMLHeadingElement>(
  58. `section.timeline-${livename} ul li.m-live h4 a span`
  59. ),
  60. videoInfoTag = document
  61. .querySelector<HTMLHeadingElement>(
  62. `section.timeline-${livename} ul li.m-live h4 a`
  63. )
  64. .getAttribute("aria-label")
  65. .replace(mediathekLivechannel, "");
  66. let channelname = "";
  67. if (channel.textContent && channel.textContent !== ":")
  68. channelname = channel.textContent.replace(":", " -");
  69. presenceData.largeImageKey =
  70. assets[mediathekLivechannel.toLowerCase() as keyof typeof assets];
  71. presenceData.smallImageKey = Assets.Live;
  72. presenceData.smallImageText = "Live";
  73. presenceData.details = videoInfoTag;
  74. presenceData.state = `${channelname}${mediathekLivechannel} Live`;
  75. presenceData.startTimestamp = elapsed;
  76. presenceData.buttons = [
  77. { label: (await strings).buttonWatchStream, url: prevUrl },
  78. ];
  79. if (
  80. document.querySelector<HTMLVideoElement>(
  81. "div.m-active div figure div div video"
  82. ).paused
  83. ) {
  84. presenceData.smallImageKey = Assets.Pause;
  85. presenceData.smallImageText = (await strings).pause;
  86. delete presenceData.startTimestamp;
  87. delete presenceData.endTimestamp;
  88. }
  89. } else {
  90. // Video-on-demand
  91. presenceData.largeImageKey =
  92. "https://cdn.rcd.gg/PreMiD/websites/Z/ZDFmediathek/assets/logo.png";
  93. presenceData.smallImageKey = Assets.Play;
  94. presenceData.smallImageText = (await strings).play;
  95. presenceData.state = document.querySelector(
  96. "ol li:nth-last-child(2) a"
  97. ).textContent;
  98. presenceData.details = document.querySelector(
  99. "ol li:nth-last-child(1) span"
  100. ).textContent;
  101. [presenceData.startTimestamp, presenceData.endTimestamp] =
  102. presence.getTimestamps(
  103. Math.floor(video.currentTime),
  104. Math.floor(video.duration)
  105. );
  106. presenceData.buttons = [
  107. { label: (await strings).buttonWatchVideo, url: prevUrl },
  108. ];
  109. if (video.paused) {
  110. presenceData.smallImageKey = Assets.Pause;
  111. presenceData.smallImageText = (await strings).pause;
  112. delete presenceData.startTimestamp;
  113. delete presenceData.endTimestamp;
  114. }
  115. }
  116. } else {
  117. presenceData.smallImageKey = Assets.Reading;
  118. presenceData.smallImageText = (await strings).browsingThrough;
  119. presenceData.details = (await strings).browsing;
  120. presenceData.startTimestamp = elapsed;
  121. }
  122. if (presenceData.details) presence.setActivity(presenceData);
  123. else presence.setActivity();
  124. });