Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(Miruro): add Presence #8744

Merged
merged 12 commits into from
Sep 27, 2024
24 changes: 24 additions & 0 deletions websites/M/Miruro/metadata.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{
"$schema": "https://schemas.premid.app/metadata/1.11",
"apiVersion": 1,
"author": {
"id": "717394071773118474",
"name": "neovillette."
},
"service": "Miruro",
"description": {
"en": "Miruro · Watch Free Anime Online · Stream Subbed & Dubbed Anime in HD"
},
"url": [
"miruro.tv",
"miruro.online"
],
"version": "1.0.0",
"logo": "https://i.imgur.com/Wwd5S5f.png",
"thumbnail": "https://i.imgur.com/vXgG3y7.png",
"color": "#e0a10a",
"category": "anime",
"tags": [
"anime"
]
}
119 changes: 119 additions & 0 deletions websites/M/Miruro/presence.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
const presence = new Presence({
clientId: "1280494760418738247",
}),
browsingTimestamp = Math.floor(Date.now() / 1000);

const enum Assets {
Logo = "https://i.imgur.com/Wwd5S5f.png",
}

presence.on("UpdateData", async () => {
const { pathname, href } = document.location,
presenceData: PresenceData = {
name: "Miruro",
details: "Browsing",
largeImageKey: Assets.Logo,
startTimestamp: browsingTimestamp,
type: ActivityType.Watching,
};

if (pathname.startsWith("/info")) {
const infoTitle = document
.querySelector<HTMLTitleElement>("title")
?.textContent.trim(),
infoCover = document.querySelector<HTMLImageElement>(
"img[src*='/file/anilistcdn/media/anime/cover/large']"
)?.src;

if (infoTitle) presenceData.details = infoTitle;
presenceData.state = "Diving into Details";
if (infoCover) {
presenceData.largeImageKey = infoCover;
presenceData.smallImageKey = Assets.Reading;
presenceData.smallImageText = "Reading info";
}
} else if (pathname.startsWith("/watch")) {
const video = document.querySelector<HTMLVideoElement>("video"),
currentAnimeTitle =
document.querySelector<HTMLElement>(".anime-title a")?.textContent,
episodeNumber = document
.querySelector<HTMLElement>(".ep-number")
?.textContent?.match(/\d+/)?.[0],
currentAnimeCover = document.querySelector<HTMLImageElement>(
"img[src*='/file/anilistcdn/media/anime/cover/large']"
)?.src;

if (currentAnimeTitle) {
presenceData.details = currentAnimeTitle;
if (episodeNumber) presenceData.state = `Episode ${episodeNumber}`;
presenceData.buttons = [{ label: "Watch Along", url: href }];
}
if (currentAnimeCover) presenceData.largeImageKey = currentAnimeCover;

if (video) {
if (!video.paused) {
[presenceData.startTimestamp, presenceData.endTimestamp] =
presence.getTimestampsfromMedia(video);
presenceData.smallImageKey = Assets.Play;
presenceData.smallImageText = "Now Watching";
} else {
presenceData.smallImageKey = Assets.Pause;
presenceData.smallImageText = "Paused";
}
} else presenceData.smallImageKey = Assets.Logo;
} else if (pathname.startsWith("/search")) {
const { search } = document.location,
searchQuery = new URLSearchParams(search).get("query");

if (searchQuery) {
presenceData.details = `Searching for: ${decodeURIComponent(
searchQuery
)}`;
presenceData.state = "Exploring search results";
} else {
presenceData.details = "Browsing Search Results";
presenceData.state = "Exploring the catalog";
}
presenceData.smallImageKey = Assets.Search;
presenceData.smallImageText = "Searching";
} else {
switch (pathname) {
case "/":
presenceData.details = "Browsing the Homepage";
presenceData.state = "Finding a Gem";
break;

case "/trending":
presenceData.details = "Exploring Trending Anime";
presenceData.state = "Discovering Popular Hits";
break;

case "/airing-schedule":
presenceData.details = "Checking Airing Schedule";
presenceData.state = "Planning Next Watch";
break;

case "/history":
presenceData.details = "Reviewing Watch History";
presenceData.state = "Reliving Epic Scenes";
break;

case "/profile":
presenceData.details = "Viewing Profile";
presenceData.state = "Tracking the Journey";
break;

case "/profile/settings":
presenceData.details = "Customizing Settings";
presenceData.state = "Fine-Tuning Preferences";
break;

default:
presenceData.details = "Browsing Miruro";
presenceData.state = "Finding a Gem";
break;
}
}

presence.setActivity(presenceData);
});
Loading