Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
4 changes: 2 additions & 2 deletions websites/A/Anikura/metadata.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
},
"service": "Anikura",
"description": {
"en": "Watch anime free onlinesub and dub, continue watching, and a growing catalog.",
"ja": "アニメ無料オンライン視聴 — 字幕付きと吹替付き、続きから視聴、拡大し続けるカタログ。"
"en": "Watch and discover anime on Anikuraseasonal picks, curated catalogs, genres, and Watch Together for fans.",
"ja": "Anikuraでアニメを観て、新しい作品を見つけよう。シーズンごとの特集や厳選されたラインナップ、ジャンル別検索、ファン同士で楽しめる「Watch Together」機能も。"
},
"url": "anikura.club",
"regExp": "^https?[:][/][/](www[.])?anikura[.]club[/]",
Expand Down
73 changes: 34 additions & 39 deletions websites/A/Anikura/presence.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,12 @@ function formatAnimeSlug(slug: string | null): string | null {
.join(' ')
}
function getAnimeTitleFromDOM(): string | null {
const titleSpan = document.querySelector<HTMLElement>('span[class*="truncate"][class*="text-snow"]')
const titleLink = document.querySelector<HTMLElement>('a[href*="/anime/"][class*="truncate"]')
|| document.querySelector<HTMLElement>('a[href^="/anime/"]')
|| document.querySelector<HTMLElement>('span[class*="truncate"][class*="text-snow"]')
|| document.querySelector<HTMLElement>('span[style*="view-transition-name: title-"]')
if (titleSpan && titleSpan.textContent?.trim()) {
return titleSpan.textContent.trim()
if (titleLink && titleLink.textContent?.trim()) {
return titleLink.textContent.trim()
}
const titleElem = document.querySelector('.anime-title, .show-title, h1[class*="text-snow"], h1')
if (titleElem && titleElem.textContent?.trim()) {
Expand Down Expand Up @@ -128,21 +130,20 @@ function getCoverImageFromDOM(epNum?: string, lang?: string, isProfile?: boolean
return src && src.startsWith('http') && !src.includes('/avatars/') ? src : null
}

const getStrings = presence.getStrings({
browsing: 'general.browsing',
searching: 'general.searching',
viewHome: 'general.viewHome',
viewing: 'general.viewing',
})
let currentLanguage: string | boolean | undefined
let stringsPromise: Promise<Record<string, string>> | null = null

function fetchStrings() {
return presence.getStrings({
browsing: 'general.browsing',
searching: 'general.searching',
viewHome: 'general.viewHome',
viewing: 'general.viewing',
})
}

interface PageMetadata {
useMultiLanguage: string | boolean | undefined
showAnimeAsTitle: boolean | undefined
showButtons: boolean | undefined
showEpTitle: boolean | undefined
animeTitle: string | null
chapter: string | null
subtitleLang: string | null
epTitle: string | null
followersCount: string | null
followingCount: string | null
Expand All @@ -162,15 +163,7 @@ async function getPageData(urlStr: string): Promise<PageMetadata> {
const { pathname, search } = url
const searchParams = new URLSearchParams(search)

const [useMultiLanguage, showAnimeAsTitle, showButtons, showEpTitle] = await Promise.all([
presence.getSetting<string | boolean>('multiLanguage'),
presence.getSetting<boolean>('showAnimeAsTitle'),
presence.getSetting<boolean>('buttons'),
presence.getSetting<boolean>('showEpTitle'),
])

const animeTitle = getAnimeTitleFromDOM()
const { chapter, subtitleLang } = getChapterOrSubtitleFromDOM()
const epTitle = getEpisodeTitleFromDOM()
const followersCount = getFollowersCountFromDOM()
const followingCount = getFollowingCountFromDOM()
Expand All @@ -184,13 +177,7 @@ async function getPageData(urlStr: string): Promise<PageMetadata> {
const coverUrlDefault = getCoverImageFromDOM()

const data: PageMetadata = {
useMultiLanguage,
showAnimeAsTitle,
showButtons,
showEpTitle,
animeTitle,
chapter,
subtitleLang,
epTitle,
followersCount,
followingCount,
Expand All @@ -207,6 +194,18 @@ presence.on('UpdateData', async () => {
const { pathname, href, search } = document.location
const searchParams = new URLSearchParams(search)

const [useMultiLanguage, showAnimeAsTitle, showButtons, showEpTitle] = await Promise.all([
presence.getSetting<string | boolean>('multiLanguage'),
presence.getSetting<boolean>('showAnimeAsTitle'),
presence.getSetting<boolean>('buttons'),
presence.getSetting<boolean>('showEpTitle'),
])

if (useMultiLanguage !== currentLanguage || !stringsPromise) {
currentLanguage = useMultiLanguage
stringsPromise = fetchStrings()
}
Comment on lines +204 to +207

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

That was the old workaround.
Call await presence.getStrings() directly.
https://docs.premid.app/v1/guide/localization.html


let cached = dataCache.get(href)

const isWatch = /\/watch\/\d+\/[^?/#]+/i.test(pathname)
Expand All @@ -228,22 +227,18 @@ presence.on('UpdateData', async () => {
}

const {
useMultiLanguage,
showAnimeAsTitle,
showButtons,
showEpTitle,
animeTitle,
chapter,
subtitleLang,
epTitle,
followersCount,
followingCount,
coverUrlProfile,
coverUrlWatch,
coverUrlDefault,
} = cached!

const rawStrings = await getStrings
const animeTitle = getAnimeTitleFromDOM() || cached?.animeTitle || null
const epTitle = getEpisodeTitleFromDOM() || cached?.epTitle || null
const { chapter, subtitleLang } = getChapterOrSubtitleFromDOM()

const rawStrings = await stringsPromise
const getString = (key: keyof typeof rawStrings, fallback: string) => {
if (!useMultiLanguage)
return fallback
Expand Down Expand Up @@ -465,7 +460,7 @@ presence.on('UpdateData', async () => {
presenceData.smallImageKey = Assets.Play
presenceData.smallImageText = 'Paused'

presenceData.startTimestamp = siteStartTimestamp
delete presenceData.startTimestamp
delete presenceData.endTimestamp
}

Expand Down
Loading