Skip to content
Open
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
"@types/node": "^24.9.2",
"@vitest/coverage-v8": "^4.0.6",
"@vitest/ui": "^4.0.6",
"baseline-browser-mapping": "^2.9.14",
"eslint": "^9.38.0",
"eslint-plugin-format": "^1.0.2",
"eslint-plugin-json-schema-validator": "^5.4.1",
Expand Down
13 changes: 13 additions & 0 deletions websites/Y/YummyAnime/iframe.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
const iframe = new iFrame()

iframe.on('UpdateData', async () => {
const video = document.querySelector('video')

if (video && !Number.isNaN(video.duration)) {
iframe.send({
duration: video.duration,
currentTime: video.currentTime,
paused: video.paused,
})
}
})
22 changes: 22 additions & 0 deletions websites/Y/YummyAnime/metadata.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"$schema": "https://schemas.premid.app/metadata/1.16",
"apiVersion": 1,
"author": {
"id": "1045800378228281345",
"name": "harryys"
},
"service": "YummyAnime",
"description": {
"en": "Displays anime you are watching on YummyAnime."
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

try to get a better description? Any official one?

},
"url": "yummyani.me",
"regExp": "^https?://(www\\.)?(site\\.)?(en\\.)?yummyani\\.me/.*",
"version": "1.0.0",
"logo": "https://i.imgur.com/6XnAGga.jpeg",
"thumbnail": "https://i.imgur.com/Z7z6N5g.png",
"color": "#FF5722",
"category": "anime",
"tags": ["anime", "video"],
"iframe": true,
"iFrameRegExp": "kodik"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thats not really a regex, expand it a little.

}
133 changes: 133 additions & 0 deletions websites/Y/YummyAnime/presence.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
const presence = new Presence({
clientId: '1045800378228281345',
})

let videoData = {
duration: 0,
currentTime: 0,
paused: true,
hasData: false,
}

presence.on('iFrameData', (data: any) => {
videoData = { ...data, hasData: true }
})

presence.on('UpdateData', async () => {
const { pathname } = document.location

const presenceData: any = {
largeImageKey: 'https://i.imgur.com/6XnAGga.jpeg',
largeImageText: 'YummyAnime',
type: 3,
}

if (pathname === '/' || pathname === '/index.html') {
presenceData.details = 'На главной странице'
presenceData.state = 'Выбирает аниме'
presence.setActivity(presenceData)
return
}

const isAnimePage = document.querySelector('.poster-block')

if (!isAnimePage) {
presenceData.details = 'На сайте YummyAnime'

const pageTitle = document.querySelector('h1')?.textContent?.trim()

if (pageTitle) {
presenceData.state = pageTitle
}
else {
delete presenceData.state
}

delete presenceData.startTimestamp
delete presenceData.endTimestamp

presence.setActivity(presenceData)
return
}

const titleHeader = document.querySelector('h1')
if (titleHeader) {
presenceData.details = titleHeader.textContent?.trim()
}
else {
presenceData.details = 'Смотрит аниме'
}

const posterImg = document.querySelector(
'div.poster-block img',
) as HTMLImageElement
if (posterImg && posterImg.src) {
if (posterImg.src.startsWith('//')) {
presenceData.largeImageKey = `https:${posterImg.getAttribute('src')}`
}
else if (posterImg.src.startsWith('/')) {
presenceData.largeImageKey = `https://site.yummyani.me${posterImg.getAttribute('src')}`
}
else {
presenceData.largeImageKey = posterImg.src
}
}

const activeBtn = document.querySelector('div[class*="pQCG"]')
let currentEpisode = ''
if (activeBtn) {
const text = activeBtn.textContent?.trim()
if (text && !Number.isNaN(Number(text)))
currentEpisode = text
}

if (videoData.hasData) {
if (!videoData.paused) {
// === PLAY ===
presenceData.state = currentEpisode
? `Смотрит серию: ${currentEpisode}`
: 'Смотрит видео'

const now = Date.now()
const remainingMs = (videoData.duration - videoData.currentTime) * 1000

presenceData.endTimestamp = now + remainingMs

delete presenceData.startTimestamp
}
else {
presenceData.state = currentEpisode
? `Серия ${currentEpisode} (Пауза)`
: 'На паузе'

delete presenceData.startTimestamp
delete presenceData.endTimestamp
}
}
else {
const videoElement = document.querySelector('#video')
let isWatchingBlock = false

if (videoElement) {
const rect = videoElement.getBoundingClientRect()
const viewHeight = Math.max(
document.documentElement.clientHeight,
window.innerHeight,
)
if (!(rect.bottom < 0 || rect.top - viewHeight >= 0))
isWatchingBlock = true
}

if (currentEpisode && isWatchingBlock) {
presenceData.state = `Готовится к просмотру: ${currentEpisode}`
}
else {
presenceData.state = 'Читает описание'
}

delete presenceData.startTimestamp
delete presenceData.endTimestamp
}

presence.setActivity(presenceData)
})
Loading