Skip to content

Commit 18ec6f6

Browse files
committed
feat(OKISO): add activity
1 parent b00d259 commit 18ec6f6

2 files changed

Lines changed: 143 additions & 0 deletions

File tree

websites/O/OKISO/metadata.json

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
{
2+
"$schema": "https://schemas.premid.app/metadata/1.16",
3+
"apiVersion": 1,
4+
"author": {
5+
"name": "OKISO",
6+
"id": "274178934143451137"
7+
},
8+
"service": "OKISO",
9+
"description": {
10+
"en": "Shows what you're watching on okiso.net"
11+
},
12+
"url": [
13+
"okiso.net",
14+
"localhost"
15+
],
16+
"regExp": ".*(okiso\\.net|localhost).*",
17+
"version": "1.0.0",
18+
"logo": "https://i.imgur.com/0Qraju1.png",
19+
"thumbnail": "https://i.imgur.com/0Qraju1.png",
20+
"color": "#FF7EB3",
21+
"category": "music",
22+
"tags": [
23+
"music",
24+
"vtuber",
25+
"streaming"
26+
]
27+
}

websites/O/OKISO/presence.ts

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
import { Assets, getTimestampsFromMedia } from 'premid'
2+
3+
const presence = new Presence({ clientId: '1505219461152636949' })
4+
const browsingTimestamp = Math.floor(Date.now() / 1000)
5+
6+
enum ActivityAssets {
7+
Logo = 'logo',
8+
}
9+
10+
presence.on('UpdateData', async () => {
11+
const { pathname } = document.location
12+
13+
const presenceData: PresenceData = {
14+
type: 3, // ActivityType.Watching
15+
largeImageKey: ActivityAssets.Logo,
16+
largeImageText: 'okiso.net',
17+
startTimestamp: browsingTimestamp,
18+
buttons: [
19+
{ label: 'Visit okiso.net', url: `https://okiso.net${pathname === '/' ? '' : pathname}` },
20+
],
21+
}
22+
23+
// ─── Home Page ───
24+
if (pathname === '/') {
25+
// Check for Terms Modal
26+
const termsModal = document.querySelector('[data-premid-modal="terms"]')
27+
if (termsModal) {
28+
presenceData.details = 'Reading Content Terms'
29+
presenceData.state = 'Legal & Guidelines'
30+
}
31+
else {
32+
// Check for live broadcast
33+
const isLive = document.querySelector('[data-premid-live="true"]')
34+
if (isLive) {
35+
presenceData.details = 'Watching Live Broadcast'
36+
presenceData.state = '🔴 LIVE on Twitch'
37+
presenceData.smallImageKey = Assets.Live
38+
presenceData.smallImageText = 'Live'
39+
delete presenceData.startTimestamp
40+
}
41+
else {
42+
// Check for video playback
43+
const videoPlayer = document.querySelector('[data-premid-title]')
44+
if (videoPlayer) {
45+
const videoTitle = videoPlayer.getAttribute('data-premid-title')
46+
const paused = videoPlayer.getAttribute('data-premid-paused') === 'true'
47+
48+
presenceData.details = videoTitle || 'Watching a Video'
49+
presenceData.smallImageKey = paused ? Assets.Pause : Assets.Play
50+
presenceData.smallImageText = paused ? 'Paused' : 'Playing'
51+
52+
if (!paused) {
53+
const video = document.querySelector<HTMLVideoElement>('[data-premid-title] video')
54+
if (video) {
55+
const timestamps = getTimestampsFromMedia(video)
56+
presenceData.startTimestamp = timestamps[0]
57+
presenceData.endTimestamp = timestamps[1]
58+
}
59+
}
60+
61+
presenceData.state = paused ? '⏸ Paused' : '▶ Playing'
62+
}
63+
else {
64+
presenceData.details = 'Browsing'
65+
presenceData.state = 'Home Page'
66+
}
67+
}
68+
}
69+
}
70+
// ─── Discography (3D Gallery) ───
71+
else if (pathname === '/releases') {
72+
presenceData.details = 'Exploring the 3D Audio Archive'
73+
presenceData.state = 'Interactive Discography'
74+
}
75+
// ─── Individual Release Page ───
76+
else if (pathname.startsWith('/releases/')) {
77+
const releaseEl = document.querySelector('[data-premid-release-title]')
78+
const releaseTitle = releaseEl?.getAttribute('data-premid-release-title')
79+
presenceData.details = 'Viewing Release'
80+
presenceData.state = releaseTitle ? `🎵 ${releaseTitle}` : 'Release Page'
81+
}
82+
// ─── Upcoming Page ───
83+
else if (pathname === '/upcoming') {
84+
presenceData.details = 'Browsing'
85+
presenceData.state = 'Upcoming Releases'
86+
}
87+
// ─── Fallback ───
88+
else {
89+
presenceData.details = document.title || 'Browsing'
90+
presenceData.state = 'okiso.net'
91+
}
92+
93+
// ─── Global Music Player ───
94+
const musicContainer = document.getElementById('spotify-embed-container-data')
95+
const trackTitle = musicContainer?.getAttribute('data-premid-track-title')
96+
97+
if (trackTitle) {
98+
const artist = musicContainer?.getAttribute('data-premid-track-artist')
99+
const paused = musicContainer?.getAttribute('data-premid-paused') === 'true'
100+
101+
// Override the main details if they are listening to music
102+
presenceData.type = 2 // ActivityType.Listening
103+
presenceData.details = paused ? `Paused: ${trackTitle}` : `Listening to ${trackTitle}`
104+
presenceData.state = `by ${artist || 'OKISO'}`
105+
presenceData.smallImageKey = paused ? Assets.Pause : Assets.Play
106+
presenceData.smallImageText = paused ? 'Paused' : 'Playing'
107+
delete presenceData.startTimestamp // Remove browsing timestamp so it doesn't look like a long song
108+
}
109+
110+
if (presenceData.details) {
111+
presence.setActivity(presenceData)
112+
}
113+
else {
114+
presence.setActivity()
115+
}
116+
})

0 commit comments

Comments
 (0)