blob: 0278de1c8488df858ba8413259b92a58ef67d152 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
<script lang="ts">
import type { Media } from '$lib/Data/AniList/media';
import settings from '$stores/settings';
import type { MediaPrequel } from '$lib/Data/AniList/prequels';
import tooltip from '$lib/Tooltip/tooltip';
import locale from '$stores/locale';
import airingNow from '$stores/airingNow';
export let originalAnime: Media;
export let upcoming = false;
const anime = originalAnime;
let opacity = 100;
let timeFrame = '';
let time = '';
let nextEpisode = anime.nextAiringEpisode?.episode || 0;
let few = true;
let dateString = '';
const setAiringTime = () => {
time = '';
timeFrame = '';
dateString = '';
const airingAt = anime.nextAiringEpisode?.airingAt;
const untilAiring = airingAt ? Math.round((airingAt - $airingNow / 1000) * 100) / 100 : undefined;
let hours = null;
const shortenCountdown = $settings.displayShortCountdown;
time = new Date(airingAt ? airingAt * 1000 : 0).toLocaleTimeString([], {
hour12: !$settings.display24HourTime,
hour: 'numeric',
minute: '2-digit'
});
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 class="opaque">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 = Math.round(untilAiring / 60);
few = true;
if (minutes > 60) {
hours = minutes / 60;
if (hours > 24) {
const days = Math.floor(hours / 24);
const weeks = Math.floor(days / 7);
few = false;
if (weeks >= 1.5) {
timeFrame = `${weeks}${shortenCountdown ? 'w' : ' week'}${
weeks === 1 || shortenCountdown ? '' : 's'
}`;
const residualDays = days % 7;
if (residualDays > 0)
timeFrame += `${shortenCountdown ? '' : ' '}${residualDays}${
shortenCountdown ? 'd' : ' day'
}${residualDays === 1 || shortenCountdown ? '' : 's'}`;
} else {
timeFrame += `${days}${shortenCountdown ? 'd' : ' day'}${
days === 1 || shortenCountdown ? '' : 's'
}`;
}
const residualHours = Math.floor(hours - days * 24);
if (residualHours > 0)
timeFrame += `${shortenCountdown ? '' : ' '}${residualHours}${
shortenCountdown ? 'h' : ' hour'
}${residualHours === 1 || shortenCountdown ? '' : 's'}`;
} else {
const residualMinutes = Math.round(minutes - Math.floor(hours) * 60);
timeFrame += `${Math.floor(hours).toFixed(0)}${shortenCountdown ? 'h' : ' hour'}${
Math.floor(hours) === 1 || shortenCountdown ? '' : 's'
}`;
if (residualMinutes > 0)
timeFrame += `${shortenCountdown ? '' : ' '}${residualMinutes}${
shortenCountdown ? 'm' : ' minute'
}${residualMinutes === 1 || shortenCountdown ? '' : 's'}`;
}
} else {
minutes = Math.round(minutes);
timeFrame += `${minutes}${shortenCountdown ? 'm' : ' minute'}${
minutes === 1 || shortenCountdown ? '' : 's'
}`;
}
opacity = Math.max(50, 100 - (untilAiring / 60 / 60 / 24 / 7) * 50);
dateString = $locale().dateFormatter(new Date(airingAt ? airingAt * 1000 : 0));
}
};
$: {
$airingNow;
setAiringTime();
}
</script>
{#if upcoming}
<span title={dateString} use:tooltip style={`opacity: ${opacity}%;`}>
{nextEpisode}{#if anime.episodes !== null}<span class="opaque">/{anime.episodes}</span>
{/if} in {timeFrame}
<span class="opaque">
{#if few && $settings.displayCoverModeAnime}<br />{/if}{few ? `(${time})` : ''}
</span>
</span>
{:else}
<span title={dateString} use:tooltip style={`opacity: ${opacity}%;`}>
{nextEpisode} in {#if few && $settings.displayCoverModeAnime}<br />{/if}{#if few}<b>
{timeFrame}
</b>{:else}{timeFrame}{/if}
{few ? `(${time})` : ''}
</span>
{/if}
|