presence.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. const presence = new Presence({
  2. clientId: "1001112348192423946",
  3. }),
  4. strings = presence.getStrings({
  5. play: "general.playing",
  6. pause: "general.paused",
  7. });
  8. let lastPlaybackState,
  9. playback: boolean,
  10. browsingTimestamp = Math.floor(Date.now() / 1000);
  11. if (lastPlaybackState !== playback) {
  12. lastPlaybackState = playback;
  13. browsingTimestamp = Math.floor(Date.now() / 1000);
  14. }
  15. presence.on("UpdateData", async () => {
  16. const presenceData: PresenceData = {
  17. details: "Unknown page",
  18. largeImageKey:
  19. "https://cdn.rcd.gg/PreMiD/websites/F/FlixTor/assets/logo.png",
  20. },
  21. video: HTMLVideoElement = document.querySelector(
  22. "#player > div.jw-wrapper.jw-reset > div.jw-media.jw-reset > video"
  23. );
  24. playback = !!video;
  25. if (!playback) {
  26. presenceData.details = "Browsing...";
  27. presenceData.startTimestamp = browsingTimestamp;
  28. presence.setActivity(presenceData);
  29. }
  30. if (video && !isNaN(video.duration)) {
  31. const videoTitle: HTMLElement = document.querySelector(
  32. "div.watch-header.h4.mb-0.font-weight-normal.link.hidden-sm-down"
  33. ),
  34. season: HTMLElement = document.querySelector(
  35. "#playercontainer span.outPes"
  36. ),
  37. episode: HTMLElement = document.querySelector(
  38. "#playercontainer span.outPep"
  39. );
  40. presenceData.largeImageKey = document
  41. .querySelector<HTMLMetaElement>('meta[property="og:image"]')
  42. .getAttribute("content")
  43. .replace("https:https:", "https:");
  44. presenceData.smallImageKey = video.paused ? Assets.Pause : Assets.Play;
  45. presenceData.smallImageText = video.paused
  46. ? (await strings).pause
  47. : (await strings).play;
  48. [presenceData.startTimestamp, presenceData.endTimestamp] =
  49. presence.getTimestamps(
  50. Math.floor(video.currentTime),
  51. Math.floor(video.duration)
  52. );
  53. if (season && episode) {
  54. presenceData.details = videoTitle
  55. ? videoTitle.textContent
  56. : "Title not found...";
  57. presenceData.state = `Season ${season.textContent} Episode ${episode.textContent}`;
  58. presenceData.buttons = [
  59. {
  60. label:
  61. presenceData.details.length >= 30
  62. ? "View Now"
  63. : presenceData.details,
  64. url: document.location.href.split("/season/")[0],
  65. },
  66. {
  67. label: presenceData.state,
  68. url: document.location.href,
  69. },
  70. ];
  71. } else if (!season && episode) {
  72. presenceData.details = videoTitle
  73. ? videoTitle.textContent
  74. : "Title not found...";
  75. presenceData.state = `Episode ${episode.textContent}`;
  76. presenceData.buttons = [
  77. {
  78. label:
  79. presenceData.details.length >= 30
  80. ? "View Now"
  81. : presenceData.details,
  82. url: document.location.href.split("/episode/")[0],
  83. },
  84. {
  85. label: presenceData.state,
  86. url: document.location.href,
  87. },
  88. ];
  89. } else {
  90. presenceData.details = "Watching";
  91. presenceData.state = videoTitle
  92. ? videoTitle.textContent
  93. : "Title not found...";
  94. presenceData.buttons = [
  95. {
  96. label:
  97. presenceData.state.length >= 30 ? "Watch Now" : presenceData.state,
  98. url: document.location.href,
  99. },
  100. ];
  101. }
  102. if (video.paused) {
  103. delete presenceData.startTimestamp;
  104. delete presenceData.endTimestamp;
  105. }
  106. if (videoTitle) presence.setActivity(presenceData, !video.paused);
  107. }
  108. });