aboutsummaryrefslogtreecommitdiff
path: root/src/lib/Media/Anime/Airing/time.ts
diff options
context:
space:
mode:
authorFuwn <[email protected]>2023-12-20 04:46:23 -0800
committerFuwn <[email protected]>2023-12-20 04:46:23 -0800
commit5815ab8cbc367f8ba1d0362c9413c52986f0f708 (patch)
treef96acf68c677f3217f7735436ae7b083e6c911f5 /src/lib/Media/Anime/Airing/time.ts
parentfix(airing): smaller release check (diff)
downloaddue.moe-5815ab8cbc367f8ba1d0362c9413c52986f0f708.tar.xz
due.moe-5815ab8cbc367f8ba1d0362c9413c52986f0f708.zip
refactor(airing): move to module
Diffstat (limited to 'src/lib/Media/Anime/Airing/time.ts')
-rw-r--r--src/lib/Media/Anime/Airing/time.ts83
1 files changed, 83 insertions, 0 deletions
diff --git a/src/lib/Media/Anime/Airing/time.ts b/src/lib/Media/Anime/Airing/time.ts
new file mode 100644
index 00000000..59e9e073
--- /dev/null
+++ b/src/lib/Media/Anime/Airing/time.ts
@@ -0,0 +1,83 @@
+import type { Media } from '$lib/AniList/media';
+import type { MediaPrequel } from '$lib/AniList/prequels';
+import type { SubsPlease } from '$lib/subsPlease';
+import settings from '../../../../stores/settings';
+import { injectAiringTime } from './subtitled';
+import { totalEpisodes } from '../episodes';
+
+export const airingTime = (
+ originalAnime: Media,
+ subsPlease: SubsPlease | null,
+ upcoming = false
+) => {
+ const anime = injectAiringTime(originalAnime, subsPlease);
+ const airingAt = anime.nextAiringEpisode?.airingAt;
+ const untilAiring = airingAt ? Math.round((airingAt - Date.now() / 1000) * 100) / 100 : undefined;
+ const time = new Date(airingAt ? airingAt * 1000 : 0).toLocaleTimeString([], {
+ hour12: !settings.get().display24HourTime,
+ hour: 'numeric',
+ minute: '2-digit'
+ });
+ let timeFrame;
+ let hours = null;
+
+ if (
+ (anime as unknown as MediaPrequel).startDate &&
+ new Date(
+ anime.startDate.year,
+ (anime as unknown as MediaPrequel).startDate.month,
+ (anime as unknown as MediaPrequel).startDate.day
+ ) < new Date()
+ )
+ return `<span style="opacity: 50%">on ${new Date(
+ anime.startDate.year,
+ (anime as unknown as MediaPrequel).startDate.month,
+ (anime as unknown as MediaPrequel).startDate.day
+ ).toLocaleDateString()}</span>`;
+
+ if (untilAiring !== undefined) {
+ let minutes = untilAiring / 60;
+ let few = true;
+
+ if (minutes > 60) {
+ hours = minutes / 60;
+
+ if (hours >= 24) {
+ // let weeks = Math.floor(Math.floor(hours / 24) / 7);
+
+ few = false;
+
+ // if (weeks >= 1) {
+ // weeks = Math.round(weeks);
+
+ // timeFrame = `${weeks} week${weeks === 1 ? '' : 's'}`;
+ // } else {
+ const days = Math.round(Math.floor(hours / 24));
+
+ timeFrame = `${days.toFixed(0)} day${days === 1 ? '' : 's'}`;
+ // }
+ } else timeFrame = `${hours.toFixed(1)} hour${hours === 1 ? '' : 's'}`;
+ } else {
+ minutes = Math.round(minutes);
+
+ timeFrame = `${minutes} minute${minutes === 1 ? '' : 's'}`;
+ }
+
+ const opacity = Math.max(50, 100 - (untilAiring / 60 / 60 / 24 / 7) * 50);
+
+ if (upcoming)
+ return `<span title="${
+ hours ? `${hours.toFixed(3)} hours` : ''
+ }" style="opacity: ${opacity}%;">${anime.nextAiringEpisode?.episode}${totalEpisodes(
+ anime
+ )} in ${timeFrame} <span style="opacity: 50%">${few ? `(${time})` : ''}</span></span>`;
+ else
+ return `<span title="${
+ hours ? `${hours.toFixed(3)} hours` : ''
+ }" style="opacity: ${opacity}%;">${anime.nextAiringEpisode?.episode} in ${
+ few ? '<b>' : ''
+ }${timeFrame}${few ? '</b>' : ''} ${few ? `(${time})` : ''}</span>`;
+ }
+
+ return '';
+};