presence.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import { ActivityType, Assets } from 'premid'
  2. const presence = new Presence({
  3. clientId: '936985014560755753',
  4. })
  5. const browsingTimestamp = Math.floor(Date.now() / 1000)
  6. let video = {
  7. paused: true,
  8. timeLeft: '',
  9. }
  10. let title = ''
  11. enum ActivityAssets {
  12. Logo = 'https://cdn.rcd.gg/PreMiD/websites/W/Wcostream/assets/logo.png',
  13. }
  14. presence.on(
  15. 'iFrameData',
  16. (inc: unknown) => {
  17. const data = inc as { paused: boolean, timeLeft: string, titleV: string }
  18. if (data.paused || data.timeLeft)
  19. video = data
  20. else title = data.titleV
  21. },
  22. )
  23. presence.on('UpdateData', async () => {
  24. const presenceData: PresenceData = {
  25. largeImageKey: ActivityAssets.Logo,
  26. details: 'Browsing...',
  27. startTimestamp: browsingTimestamp,
  28. } as PresenceData
  29. const { pathname } = document.location
  30. const [timestamps, cover, buttons] = await Promise.all([
  31. presence.getSetting<boolean>('timestamps'),
  32. presence.getSetting<boolean>('cover'),
  33. presence.getSetting<boolean>('buttons'),
  34. ])
  35. const directVideo = document.querySelector<HTMLVideoElement>('video')
  36. if (video.timeLeft !== '') {
  37. if (!title) {
  38. title = document.querySelector('[itemprop="partOfSeries"]')?.textContent
  39. ?? document.querySelector('.video-title')?.textContent
  40. ?? document.querySelector('.entry-title')?.textContent
  41. ?? document.title.split('|')[0]!
  42. }
  43. presenceData.details = 'Watching:'
  44. presenceData.state = title?.split('Episode')?.[0]
  45. if (document.querySelector<HTMLImageElement>('[class*="s-post-image"]')) {
  46. // This is where they store their thumbnails/posters
  47. presenceData.largeImageKey = document.querySelector<HTMLImageElement>('[class*="s-post-image"]')
  48. ?.src ?? ActivityAssets.Logo
  49. }
  50. delete presenceData.startTimestamp
  51. const timeLeft = presence.timestampFromFormat(video.timeLeft)
  52. // This is necessary to only use endTimestamp when video has finished loading
  53. if (Date.now() / 1000 >= Date.now() / 1000 + timeLeft)
  54. video.paused = true
  55. if (!video.paused)
  56. presenceData.endTimestamp = Date.now() / 1000 + timeLeft
  57. presenceData.smallImageKey = video.paused ? Assets.Pause : Assets.Play
  58. presenceData.smallImageText = video.paused ? 'Paused' : 'Playing'
  59. presenceData.buttons = [{ label: 'Watch Episode', url: document.URL }]
  60. }
  61. else if (directVideo) {
  62. presenceData.smallImageKey = directVideo.paused
  63. ? Assets.Pause
  64. : Assets.Play
  65. presenceData.smallImageText = directVideo.paused
  66. ? 'Paused'
  67. : 'Playing back'
  68. presenceData.details = 'Watching:'
  69. presenceData.state = document.querySelector('.jw-title-primary.jw-reset')?.textContent
  70. ?? document.querySelector('[itemprop="partOfSeries"]')?.textContent
  71. ?? document.querySelector('.video-title')?.textContent
  72. ?? document.querySelector('.entry-title')?.textContent
  73. presenceData.buttons = [{ label: 'Watch Episode', url: document.URL }]
  74. if (!directVideo.paused) {
  75. [presenceData.startTimestamp, presenceData.endTimestamp] = presence.getTimestampsfromMedia(directVideo)
  76. }
  77. }
  78. else if (pathname === '/') {
  79. presenceData.details = 'Home page'
  80. }
  81. else if (pathname.startsWith('/search')) {
  82. presenceData.details = 'Searching...'
  83. presenceData.smallImageKey = Assets.Search
  84. }
  85. if (!cover && presenceData.largeImageKey !== ActivityAssets.Logo)
  86. presenceData.largeImageKey = ActivityAssets.Logo
  87. if (!buttons && presenceData.buttons)
  88. delete presenceData.buttons
  89. if (
  90. !timestamps
  91. && (presenceData.endTimestamp || presenceData.startTimestamp)
  92. ) {
  93. delete presenceData.startTimestamp
  94. delete presenceData.endTimestamp
  95. }
  96. if (presenceData.endTimestamp)
  97. presenceData.type = ActivityType.Watching
  98. presence.setActivity(presenceData)
  99. })