Skip to content

Commit 48a6057

Browse files
authored
feat(dアニメストア): add seekbar and some page support (#10394)
1 parent 1923852 commit 48a6057

File tree

2 files changed

+103
-16
lines changed

2 files changed

+103
-16
lines changed

websites/D/dアニメストア/metadata.json

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@
55
"name": "Eai",
66
"id": "132779412771962880"
77
},
8+
"contributors": [
9+
{
10+
"name": "sino",
11+
"id": "258380809172418570"
12+
}
13+
],
814
"service": "dアニメストア",
915
"description": {
1016
"de": "No.1 anime streaming website in Japan! Free for the first month! Unlimited viewing of over 2,900 anime works for 400 yen per month (excluding taxes)! You can use other than DoCoMo mobile devices. Even better quality on tablets, PCs, Chromecasts, and Fire TV!",
@@ -15,13 +21,21 @@
1521
},
1622
"url": "animestore.docomo.ne.jp",
1723
"regExp": "^https?[:][/][/]animestore[.]docomo[.]ne[.]jp[/]",
18-
"version": "2.1.0",
24+
"version": "3.0.0",
1925
"logo": "https://cdn.rcd.gg/PreMiD/websites/D/d%E3%82%A2%E3%83%8B%E3%83%A1%E3%82%B9%E3%83%88%E3%82%A2/assets/logo.png",
2026
"thumbnail": "https://cdn.rcd.gg/PreMiD/websites/D/d%E3%82%A2%E3%83%8B%E3%83%A1%E3%82%B9%E3%83%88%E3%82%A2/assets/thumbnail.jpg",
2127
"color": "#ea552a",
2228
"category": "anime",
2329
"tags": [
2430
"video",
2531
"anime"
32+
],
33+
"settings": [
34+
{
35+
"id": "thumbnail",
36+
"title": "Show Thumbnail",
37+
"icon": "fad fa-images",
38+
"value": true
39+
}
2640
]
2741
}
Lines changed: 88 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Assets } from 'premid'
1+
import { ActivityType, Assets, getTimestampsFromMedia, StatusDisplayType } from 'premid'
22

33
const presence = new Presence({
44
clientId: '611012705306017792',
@@ -9,28 +9,101 @@ const strings = presence.getStrings({
99
})
1010

1111
presence.on('UpdateData', async () => {
12+
const { pathname } = location
13+
const presenceData: PresenceData = {
14+
largeImageKey: 'https://cdn.rcd.gg/PreMiD/websites/D/d%E3%82%A2%E3%83%8B%E3%83%A1%E3%82%B9%E3%83%88%E3%82%A2/assets/logo.png',
15+
}
16+
1217
if (
13-
location.pathname.startsWith('/animestore/sc_d_pc')
18+
pathname.startsWith('/animestore/sc_d_pc')
1419
&& document.querySelector('#video')
1520
) {
1621
const video = document.querySelector<HTMLVideoElement>('#video')
1722
const isPlaying = video && !video.paused
18-
const presenceData: PresenceData = {
19-
details: `${document.querySelector('.backInfoTxt1')?.textContent} - ${
20-
document.querySelector('.backInfoTxt2')?.textContent
21-
}`,
22-
state: document.querySelector('.backInfoTxt3')?.textContent,
23-
largeImageKey: 'https://cdn.rcd.gg/PreMiD/websites/D/d%E3%82%A2%E3%83%8B%E3%83%A1%E3%82%B9%E3%83%88%E3%82%A2/assets/logo.png',
24-
smallImageKey: isPlaying ? Assets.Play : Assets.Pause,
25-
smallImageText: isPlaying
26-
? (await strings).play
27-
: (await strings).pause,
28-
startTimestamp: Math.floor(Date.now() / 1000) - Math.floor(video?.currentTime ?? 0),
23+
const title = document.querySelector('.pauseInfoTxt1')?.textContent
24+
const epNum = document.querySelector('.pauseInfoTxt2')?.textContent
25+
const epTitle = document.querySelector('.pauseInfoTxt3')?.textContent
26+
27+
presenceData.details = title
28+
presenceData.state = `${epNum} / ${epTitle}`
29+
presenceData.largeImageText = `${title} / ${epNum} - ${epTitle}` as any
30+
31+
const isThumbnailEnabled = await presence.getSetting<boolean>('thumbnail')
32+
33+
const thumbElement = document.querySelector<HTMLElement>('#backThumb')
34+
const bgImage = thumbElement?.style.backgroundImage
35+
if (bgImage && isThumbnailEnabled) {
36+
const match = bgImage.match(/url\(["']?([^"']*)["']?\)/)
37+
if (match && match[1])
38+
presenceData.largeImageKey = match[1]
39+
}
40+
41+
const partId = new URLSearchParams(location.search).get('partId')
42+
if (partId) {
43+
const workId = partId.slice(0, 5)
44+
presenceData.detailsUrl = `https://animestore.docomo.ne.jp/animestore/ci_pc?workId=${workId}`
45+
presenceData.stateUrl = `https://animestore.docomo.ne.jp/animestore/ci_pc?workId=${workId}&partId=${partId}`
46+
presenceData.largeImageUrl = presenceData.stateUrl
2947
}
3048

31-
if (!isPlaying)
32-
delete presenceData.startTimestamp
49+
presenceData.smallImageKey = isPlaying ? Assets.Play : Assets.Pause
50+
51+
presenceData.smallImageText = isPlaying
52+
? (await strings).play
53+
: (await strings).pause
54+
55+
presenceData.type = ActivityType.Watching as any
56+
presenceData.statusDisplayType = StatusDisplayType.Details
57+
58+
if (isPlaying) {
59+
const [startTimestamp, endTimestamp] = getTimestampsFromMedia(video)
60+
presenceData.startTimestamp = startTimestamp
61+
presenceData.endTimestamp = endTimestamp
62+
}
63+
64+
presence.setActivity(presenceData)
65+
}
66+
else if (pathname === '/animestore/tp_pc') {
67+
presenceData.details = 'ホーム'
68+
presence.setActivity(presenceData)
69+
}
70+
else if (pathname === '/animestore/ci_pc') {
71+
const params = new URLSearchParams(location.search)
3372

73+
if (params.has('workId') && params.has('partId')) {
74+
presenceData.details = document.querySelector('.headerText')?.textContent?.trim()
75+
const number = document.querySelector('.episodeTitle > .number')?.textContent?.trim()
76+
const title = document.querySelector('.episodeTitle > .title')?.textContent?.trim()
77+
presenceData.state = [number, title].filter(Boolean).join(' / ')
78+
presenceData.detailsUrl = `https://animestore.docomo.ne.jp/animestore/ci_pc?workId=${params.get('workId')}`
79+
presenceData.stateUrl = location.href
80+
presence.setActivity(presenceData)
81+
}
82+
else if (params.has('workId')) {
83+
presenceData.details = document.querySelector('.titleWrap > h1')?.textContent?.trim()
84+
presenceData.detailsUrl = location.href
85+
presence.setActivity(presenceData)
86+
}
87+
else {
88+
presence.clearActivity()
89+
}
90+
}
91+
else if (/^\/animestore\/CF\/.*/.test(pathname)) {
92+
presenceData.details = document.querySelector('#breadCrumb_b > a > span')?.textContent?.trim()
93+
presenceData.detailsUrl = location.href
94+
presence.setActivity(presenceData)
95+
}
96+
else if (/^\/animestore\/CP\/.*/.test(pathname)) {
97+
presenceData.details = document.querySelector('#breadCrumb_c > a > span')?.textContent?.trim()
98+
presenceData.detailsUrl = location.href
99+
presence.setActivity(presenceData)
100+
}
101+
else if (/^\/animestore\/mpa?_/.test(pathname)) {
102+
presenceData.details = 'マイページ'
103+
presence.setActivity(presenceData)
104+
}
105+
else {
106+
presenceData.details = 'ページを閲覧中'
34107
presence.setActivity(presenceData)
35108
}
36109
})

0 commit comments

Comments
 (0)