From 546f86e5584f4a360030bcce88a8e7660e708ceb Mon Sep 17 00:00:00 2001 From: Artem Shevchenko <81616507+Dyrdoom@users.noreply.github.com> Date: Sun, 4 Jan 2026 18:28:13 +0200 Subject: [PATCH 1/4] feat(HDrezka): add user settings Signed-off-by: Artem Shevchenko <81616507+Dyrdoom@users.noreply.github.com> --- websites/H/HDrezka/metadata.json | 42 ++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/websites/H/HDrezka/metadata.json b/websites/H/HDrezka/metadata.json index ea606cf9bbc8..5904d9f9f7e7 100644 --- a/websites/H/HDrezka/metadata.json +++ b/websites/H/HDrezka/metadata.json @@ -14,7 +14,7 @@ "service": "HDrezka", "description": { "en": "Website for watching movies, cartoons, anime and TV series.", - "ru": "Сайт для просмтра фильмов, аниме мультфильмов и сериалов." + "ru": "Сайт для просмотра фильмов, аниме, мультфильмов и сериалов." }, "url": [ "rezka.ag", @@ -24,7 +24,7 @@ "rezka-ua.co" ], "regExp": "^https?[:][/][/](rezka[.]ag|hdrezka[.]ag|rezka-ua[.]org|standby-rezka[.]tv|rezka-ua[.]co)[/]", - "version": "1.2.1", + "version": "1.3.0", "logo": "https://cdn.rcd.gg/PreMiD/websites/H/HDrezka/assets/logo.png", "thumbnail": "https://cdn.rcd.gg/PreMiD/websites/H/HDrezka/assets/thumbnail.jpeg", "color": "#DA3D36", @@ -33,5 +33,43 @@ "video", "media", "animation" + ], + "settings": [ + { + "id": "privacy", + "title": "Privacy Mode", + "icon": "fad fa-user-secret", + "value": false + }, + { + "id": "showBrowsingStatus", + "title": "Show Browsing Status", + "icon": "fad fa-book-reader", + "value": true + }, + { + "id": "showCover", + "title": "Show Cover", + "icon": "fas fa-images", + "value": true, + "if": { + "privacy": false + } + }, + { + "id": "timestamp", + "title": "Show Timestamps (Progress Bar)", + "icon": "fad fa-stopwatch", + "value": true, + "if": { + "privacy": false + } + }, + { + "id": "showSmallImages", + "title": "Show Play/Pause Icons", + "icon": "fad fa-pause", + "value": true + } ] } From eb558874cea462c2c4bd892aacd320cd6e11ed5e Mon Sep 17 00:00:00 2001 From: Artem Shevchenko <81616507+Dyrdoom@users.noreply.github.com> Date: Sun, 4 Jan 2026 18:29:08 +0200 Subject: [PATCH 2/4] feat(HDrezka): implement timestamps, series tracking, and settings logic Signed-off-by: Artem Shevchenko <81616507+Dyrdoom@users.noreply.github.com> --- websites/H/HDrezka/presence.ts | 121 +++++++++++++++++++++------------ 1 file changed, 77 insertions(+), 44 deletions(-) diff --git a/websites/H/HDrezka/presence.ts b/websites/H/HDrezka/presence.ts index 275658e4dbdd..6cde9fb6ba9d 100644 --- a/websites/H/HDrezka/presence.ts +++ b/websites/H/HDrezka/presence.ts @@ -1,56 +1,89 @@ +import { ActivityType, getTimestampsFromMedia } from 'premid' + const presence = new Presence({ clientId: '1191450515670843533', }) presence.on('UpdateData', async () => { - const presenceData: PresenceData = { - details: 'Где-то на сайте', + const [ + privacyMode, + showBrowsingStatus, + showCover, + showTimestamp, + showSmallImages + ] = await Promise.all([ + presence.getSetting('privacy'), + presence.getSetting('showBrowsingStatus'), + presence.getSetting('showCover'), + presence.getSetting('timestamp'), + presence.getSetting('showSmallImages') + ]) + + const presenceData: any = { largeImageKey: 'https://cdn.rcd.gg/PreMiD/websites/H/HDrezka/assets/logo.png', } - const contentType = document - .querySelector('meta[property=\'og:url\']') - ?.getAttribute('content') - ?.split('/')[3] - const currentType = contentType === 'films' - ? 'фильм' - : contentType === 'series' - ? 'сериал' - : contentType === 'cartoons' - ? 'мультфильм' - : contentType === 'animation' - ? 'аниме' - : 'чего-то' - - if (document.location.pathname === '/') - presenceData.details = 'На главной странице' - - if ( - document.location.pathname === '/films' - || document.location.pathname === '/series' - || document.location.pathname === '/cartoons' - || document.location.pathname === '/animation' - || document.location.pathname.match(/\/(films|series|cartoons|animation)\//) - ) { - if (document.location.pathname.match(/\/(?:films|series|cartoons|animation)\/.+/)) { - presenceData.details = `Смотрит ${currentType}` - presenceData.state = `${ - document.querySelector('.b-post__title h1')?.textContent - }` - presenceData.largeImageKey = document.querySelector('.b-sidecover a img')?.src - presenceData.smallImageKey = 'https://cdn.rcd.gg/PreMiD/websites/H/HDrezka/assets/logo.png' - presenceData.buttons = [ - { - label: 'Открыть страницу', - url: document - .querySelector('meta[property=\'og:url\']') - ?.getAttribute('content') ?? '', - }, - ] + + const urlPath = document.location.pathname + const contentType = document.querySelector('meta[property=\'og:url\']')?.getAttribute('content')?.split('/')[3] + const isMediaPage = urlPath.match(/\/(films|series|cartoons|animation)\/.+/) + + if (privacyMode && isMediaPage) { + return presence.setActivity({ + details: 'Watching something private', + largeImageKey: 'https://cdn.rcd.gg/PreMiD/websites/H/HDrezka/assets/logo.png' + }) + } + + if (document.location.pathname === '/') { + if (!showBrowsingStatus) return presence.clearActivity() + presenceData.details = 'Browsing the Home Page' + } else if (isMediaPage) { + const title = document.querySelector('.b-post__title h1')?.textContent?.trim() + const coverImage = document.querySelector('.b-sidecover a img')?.src + + presenceData.details = title + + presenceData.largeImageKey = (showCover && coverImage) ? coverImage : 'https://cdn.rcd.gg/PreMiD/websites/H/HDrezka/assets/logo.png' + + const video = document.querySelector('video') + + if (video && !video.paused) { + if (showTimestamp) { + const [startTimestamp, endTimestamp] = getTimestampsFromMedia(video) + presenceData.startTimestamp = startTimestamp + presenceData.endTimestamp = endTimestamp + } + presenceData.type = ActivityType.Watching + } else if (showSmallImages) { + presenceData.smallImageKey = 'https://cdn.rcd.gg/PreMiD/websites/H/HDrezka/assets/logo.png' + presenceData.smallImageText = 'Paused' } - else { - presenceData.details = `Ищет ${currentType}` - presenceData.smallImageKey = 'https://cdn.rcd.gg/PreMiD/websites/H/HDrezka/assets/0.png' + + const isSeries = ['series', 'animation', 'cartoons'].includes(contentType || '') + + if (isSeries) { + const activeSeason = document.querySelector('.b-simple_season__item.active')?.textContent?.trim() + const activeEpisode = document.querySelector('.b-simple_episode__item.active')?.textContent?.trim() + + if (activeSeason && activeEpisode) { + presenceData.state = `Season ${activeSeason}, Episode ${activeEpisode}` + } else { + presenceData.state = 'Watching a series' + } + } else { + presenceData.state = 'Watching a movie' + } + + const translator = document.querySelector('.b-translator__item.active')?.textContent?.trim() + if (translator) { + presenceData.largeImageText = `Voiceover: ${translator}` } + + presenceData.buttons = [{ label: 'Watch on Rezka', url: document.location.href }] + } else { + if (!showBrowsingStatus) return presence.clearActivity() + presenceData.details = 'Exploring the website' } + presence.setActivity(presenceData) }) From 073394d22a1c65f4c6699f13e17fa2071ddbc2b4 Mon Sep 17 00:00:00 2001 From: Artem Shevchenko <81616507+Dyrdoom@users.noreply.github.com> Date: Sun, 4 Jan 2026 18:42:19 +0200 Subject: [PATCH 3/4] Update presence.ts Signed-off-by: Artem Shevchenko <81616507+Dyrdoom@users.noreply.github.com> --- websites/H/HDrezka/presence.ts | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/websites/H/HDrezka/presence.ts b/websites/H/HDrezka/presence.ts index 6cde9fb6ba9d..cd0f32360dae 100644 --- a/websites/H/HDrezka/presence.ts +++ b/websites/H/HDrezka/presence.ts @@ -10,13 +10,13 @@ presence.on('UpdateData', async () => { showBrowsingStatus, showCover, showTimestamp, - showSmallImages + showSmallImages, ] = await Promise.all([ presence.getSetting('privacy'), presence.getSetting('showBrowsingStatus'), presence.getSetting('showCover'), presence.getSetting('timestamp'), - presence.getSetting('showSmallImages') + presence.getSetting('showSmallImages'), ]) const presenceData: any = { @@ -30,23 +30,24 @@ presence.on('UpdateData', async () => { if (privacyMode && isMediaPage) { return presence.setActivity({ details: 'Watching something private', - largeImageKey: 'https://cdn.rcd.gg/PreMiD/websites/H/HDrezka/assets/logo.png' + largeImageKey: 'https://cdn.rcd.gg/PreMiD/websites/H/HDrezka/assets/logo.png', }) } if (document.location.pathname === '/') { - if (!showBrowsingStatus) return presence.clearActivity() + if (!showBrowsingStatus) { + return presence.clearActivity() + } presenceData.details = 'Browsing the Home Page' } else if (isMediaPage) { const title = document.querySelector('.b-post__title h1')?.textContent?.trim() const coverImage = document.querySelector('.b-sidecover a img')?.src - + presenceData.details = title - presenceData.largeImageKey = (showCover && coverImage) ? coverImage : 'https://cdn.rcd.gg/PreMiD/websites/H/HDrezka/assets/logo.png' - + const video = document.querySelector('video') - + if (video && !video.paused) { if (showTimestamp) { const [startTimestamp, endTimestamp] = getTimestampsFromMedia(video) @@ -55,16 +56,16 @@ presence.on('UpdateData', async () => { } presenceData.type = ActivityType.Watching } else if (showSmallImages) { - presenceData.smallImageKey = 'https://cdn.rcd.gg/PreMiD/websites/H/HDrezka/assets/logo.png' + presenceData.smallImageKey = 'https://cdn.rcd.gg/PreMiD/websites/H/HDrezka/assets/logo.png' presenceData.smallImageText = 'Paused' } const isSeries = ['series', 'animation', 'cartoons'].includes(contentType || '') - + if (isSeries) { const activeSeason = document.querySelector('.b-simple_season__item.active')?.textContent?.trim() const activeEpisode = document.querySelector('.b-simple_episode__item.active')?.textContent?.trim() - + if (activeSeason && activeEpisode) { presenceData.state = `Season ${activeSeason}, Episode ${activeEpisode}` } else { @@ -79,9 +80,16 @@ presence.on('UpdateData', async () => { presenceData.largeImageText = `Voiceover: ${translator}` } - presenceData.buttons = [{ label: 'Watch on Rezka', url: document.location.href }] + presenceData.buttons = [ + { + label: 'Watch on Rezka', + url: document.location.href, + }, + ] } else { - if (!showBrowsingStatus) return presence.clearActivity() + if (!showBrowsingStatus) { + return presence.clearActivity() + } presenceData.details = 'Exploring the website' } From 7b4055593048c1e76003c4d205222fe80ddf5ccd Mon Sep 17 00:00:00 2001 From: Artem Shevchenko <81616507+Dyrdoom@users.noreply.github.com> Date: Sun, 4 Jan 2026 18:47:57 +0200 Subject: [PATCH 4/4] Update presence.ts Signed-off-by: Artem Shevchenko <81616507+Dyrdoom@users.noreply.github.com> --- websites/H/HDrezka/presence.ts | 49 ++++++++++++++++------------------ 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/websites/H/HDrezka/presence.ts b/websites/H/HDrezka/presence.ts index cd0f32360dae..670302f6e9fe 100644 --- a/websites/H/HDrezka/presence.ts +++ b/websites/H/HDrezka/presence.ts @@ -10,13 +10,13 @@ presence.on('UpdateData', async () => { showBrowsingStatus, showCover, showTimestamp, - showSmallImages, + showSmallImages ] = await Promise.all([ presence.getSetting('privacy'), presence.getSetting('showBrowsingStatus'), presence.getSetting('showCover'), presence.getSetting('timestamp'), - presence.getSetting('showSmallImages'), + presence.getSetting('showSmallImages') ]) const presenceData: any = { @@ -30,24 +30,24 @@ presence.on('UpdateData', async () => { if (privacyMode && isMediaPage) { return presence.setActivity({ details: 'Watching something private', - largeImageKey: 'https://cdn.rcd.gg/PreMiD/websites/H/HDrezka/assets/logo.png', + largeImageKey: 'https://cdn.rcd.gg/PreMiD/websites/H/HDrezka/assets/logo.png' }) } if (document.location.pathname === '/') { - if (!showBrowsingStatus) { - return presence.clearActivity() - } + if (!showBrowsingStatus) return presence.clearActivity() presenceData.details = 'Browsing the Home Page' - } else if (isMediaPage) { + } + else if (isMediaPage) { const title = document.querySelector('.b-post__title h1')?.textContent?.trim() const coverImage = document.querySelector('.b-sidecover a img')?.src - + presenceData.details = title + presenceData.largeImageKey = (showCover && coverImage) ? coverImage : 'https://cdn.rcd.gg/PreMiD/websites/H/HDrezka/assets/logo.png' - + const video = document.querySelector('video') - + if (video && !video.paused) { if (showTimestamp) { const [startTimestamp, endTimestamp] = getTimestampsFromMedia(video) @@ -55,23 +55,26 @@ presence.on('UpdateData', async () => { presenceData.endTimestamp = endTimestamp } presenceData.type = ActivityType.Watching - } else if (showSmallImages) { - presenceData.smallImageKey = 'https://cdn.rcd.gg/PreMiD/websites/H/HDrezka/assets/logo.png' + } + else if (showSmallImages) { + presenceData.smallImageKey = 'https://cdn.rcd.gg/PreMiD/websites/H/HDrezka/assets/logo.png' presenceData.smallImageText = 'Paused' } const isSeries = ['series', 'animation', 'cartoons'].includes(contentType || '') - + if (isSeries) { const activeSeason = document.querySelector('.b-simple_season__item.active')?.textContent?.trim() const activeEpisode = document.querySelector('.b-simple_episode__item.active')?.textContent?.trim() - + if (activeSeason && activeEpisode) { presenceData.state = `Season ${activeSeason}, Episode ${activeEpisode}` - } else { + } + else { presenceData.state = 'Watching a series' } - } else { + } + else { presenceData.state = 'Watching a movie' } @@ -80,16 +83,10 @@ presence.on('UpdateData', async () => { presenceData.largeImageText = `Voiceover: ${translator}` } - presenceData.buttons = [ - { - label: 'Watch on Rezka', - url: document.location.href, - }, - ] - } else { - if (!showBrowsingStatus) { - return presence.clearActivity() - } + presenceData.buttons = [{ label: 'Watch on Rezka', url: document.location.href }] + } + else { + if (!showBrowsingStatus) return presence.clearActivity() presenceData.details = 'Exploring the website' }