Skip to content

Commit 9602023

Browse files
authored
feat(WOWTV): add Activity (#10459)
1 parent aefaf70 commit 9602023

File tree

2 files changed

+173
-0
lines changed

2 files changed

+173
-0
lines changed

websites/W/WOW TV/metadata.json

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
{
2+
"$schema": "https://schemas.premid.app/metadata/1.16",
3+
"apiVersion": 1,
4+
"author": {
5+
"id": "307473018597408768",
6+
"name": "roo7k1d"
7+
},
8+
"service": "WOW TV",
9+
"altnames": ["WOW", "WOWTV"],
10+
"description": {
11+
"de": "Mit WOW kannst Du jederzeit und überall unbegrenzt Serien, Filme und Live-Sport schauen.",
12+
"en": "With WOW you can watch unlimited amounts of TV Shows, Movies and Live Sports anywhere and anytime."
13+
},
14+
"url": "wowtv.de",
15+
"regExp": "^https?[:][/][/]([a-z0-9-]+[.])*wowtv[.]de[/]",
16+
"version": "1.0.0",
17+
"logo": "https://i.imgur.com/a1KWJiO.png",
18+
"thumbnail": "https://i.imgur.com/G2ZmDRx.png",
19+
"color": "#00818a",
20+
"category": "videos",
21+
"tags": [
22+
"wow",
23+
"tv",
24+
"sky",
25+
"streaming",
26+
"hbo",
27+
"movies",
28+
"shows",
29+
"sports"
30+
],
31+
"settings": [
32+
{
33+
"id": "privacy",
34+
"title": "Privacy Mode",
35+
"icon": "fad fa-user-secret",
36+
"value": false
37+
},
38+
{
39+
"id": "time",
40+
"title": "Show Timestamps",
41+
"icon": "fad fa-stopwatch",
42+
"value": true
43+
44+
}
45+
]
46+
}

websites/W/WOW TV/presence.ts

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
import { ActivityType, Assets, getTimestamps, StatusDisplayType } from 'premid'
2+
3+
const presence = new Presence({
4+
clientId: '1464284865972404512',
5+
})
6+
const browsingTimestamp = Math.floor(Date.now() / 1000)
7+
8+
enum ActivityAssets {
9+
Logo = 'https://i.imgur.com/a1KWJiO.png',
10+
}
11+
12+
async function getStrings() {
13+
return presence.getStrings(
14+
{
15+
play: 'general.playing',
16+
pause: 'general.paused',
17+
browsing: 'general.browsing',
18+
watchingMovie: 'general.watchingMovie',
19+
watchingSeries: 'general.watchingSeries',
20+
watchEpisode: 'general.buttonViewEpisode',
21+
watchVideo: 'general.buttonWatchVideo',
22+
searchFor: 'general.searchFor',
23+
searchSomething: 'general.searchSomething',
24+
},
25+
)
26+
}
27+
28+
presence.on('UpdateData', async () => {
29+
const [privacy, time] = await Promise.all([
30+
presence.getSetting<boolean>('privacy'),
31+
presence.getSetting<boolean>('time'),
32+
])
33+
34+
const presenceData: PresenceData = {
35+
largeImageKey: ActivityAssets.Logo,
36+
startTimestamp: browsingTimestamp,
37+
type: ActivityType.Watching,
38+
}
39+
40+
const strings = await getStrings()
41+
42+
const { pathname } = document.location
43+
44+
switch (true) {
45+
case pathname.includes('home'):
46+
presenceData.state = strings.browsing
47+
break
48+
49+
case pathname.includes('cinema'):
50+
presenceData.state = 'In Filmen stöbern...'
51+
break
52+
53+
case pathname.includes('tv'):
54+
presenceData.state = 'In Serien stöbern...'
55+
break
56+
57+
case pathname.includes('sports'):
58+
presenceData.state = 'In Sport stöbern...'
59+
break
60+
61+
case pathname.includes('my-stuff'):
62+
presenceData.state = 'Watchlist durchsuchen...'
63+
break
64+
65+
case pathname.includes('search'):
66+
presenceData.state = strings.searchSomething
67+
break
68+
69+
// Viewing A Movies / Shows Page
70+
case pathname.includes('asset'): {
71+
const titleLogo = document.querySelector('img.program-details__title')?.getAttribute('alt')
72+
const titleText = document.querySelector('h1.program-details__title')?.textContent
73+
74+
if ((titleLogo || titleText) && !privacy) {
75+
presenceData.state = `${titleLogo} ansehen...` ? titleLogo : `${titleText} + ansehen...`
76+
}
77+
else { presenceData.state = 'Etwas ansehen...' }
78+
}
79+
break
80+
81+
// Main Video Player Site
82+
case pathname.includes('playback'): {
83+
presenceData.statusDisplayType = StatusDisplayType.Details
84+
85+
const video = document.querySelector<HTMLVideoElement>('video')
86+
if (!video) {
87+
return
88+
}
89+
90+
const title = document.querySelector('[data-testid="metadata-title"]')?.textContent
91+
const episode = document.querySelector('p.contentPrimary')?.textContent
92+
93+
// If Video Is Part Of A Show
94+
if (document.querySelector('[data-testid="more-episodes-toggle"]')) {
95+
privacy ? presenceData.details = strings.watchingSeries : presenceData.details = title
96+
if (!privacy) {
97+
presenceData.state = episode
98+
}
99+
}
100+
else {
101+
privacy ? presenceData.details = strings.watchingMovie : presenceData.details = title
102+
}
103+
104+
if (!video.paused) {
105+
const sliderEl = document.querySelector('[data-testid="scrubber-bar"]')
106+
presenceData.smallImageKey = Assets.Play
107+
presenceData.smallImageText = strings.play
108+
109+
if (time) {
110+
const timestamps = getTimestamps(
111+
Number.parseInt(sliderEl?.getAttribute('aria-valuenow') ?? '0'),
112+
Number.parseInt(sliderEl?.getAttribute('aria-valuemax') ?? '0'),
113+
)
114+
presenceData.startTimestamp = timestamps[0]
115+
presenceData.endTimestamp = timestamps[1]
116+
}
117+
}
118+
else {
119+
presenceData.smallImageKey = Assets.Pause
120+
presenceData.smallImageText = strings.pause
121+
}
122+
}
123+
break
124+
}
125+
126+
presence.setActivity(presenceData)
127+
})

0 commit comments

Comments
 (0)