aboutsummaryrefslogtreecommitdiff
path: root/src/lib/Tools/Wrapped
diff options
context:
space:
mode:
authorFuwn <[email protected]>2026-03-01 16:04:11 -0800
committerFuwn <[email protected]>2026-03-01 16:04:11 -0800
commit48f0c30d47d62e4f35706edb93a1bb2f97eba14c (patch)
tree44866d7a61adfdf01a780e0108c370294d3db78b /src/lib/Tools/Wrapped
parentchore(biome): re-enable useAltText rule (diff)
downloaddue.moe-48f0c30d47d62e4f35706edb93a1bb2f97eba14c.tar.xz
due.moe-48f0c30d47d62e4f35706edb93a1bb2f97eba14c.zip
chore(biome): enable svelte formatting
Diffstat (limited to 'src/lib/Tools/Wrapped')
-rw-r--r--src/lib/Tools/Wrapped/ActivityHistory.svelte14
-rw-r--r--src/lib/Tools/Wrapped/DataLoader.svelte6
-rw-r--r--src/lib/Tools/Wrapped/Media.svelte24
-rw-r--r--src/lib/Tools/Wrapped/MediaExtras.svelte12
-rw-r--r--src/lib/Tools/Wrapped/Tool.svelte1396
-rw-r--r--src/lib/Tools/Wrapped/Top/Activity.svelte20
-rw-r--r--src/lib/Tools/Wrapped/Top/Anime.svelte8
-rw-r--r--src/lib/Tools/Wrapped/Top/Manga.svelte8
8 files changed, 735 insertions, 753 deletions
diff --git a/src/lib/Tools/Wrapped/ActivityHistory.svelte b/src/lib/Tools/Wrapped/ActivityHistory.svelte
index 3da401d4..f1f1a28a 100644
--- a/src/lib/Tools/Wrapped/ActivityHistory.svelte
+++ b/src/lib/Tools/Wrapped/ActivityHistory.svelte
@@ -1,12 +1,12 @@
<script lang="ts">
- import type { ActivityHistoryEntry } from '$lib/Data/AniList/activity';
- import type { AniListAuthorisation } from '$lib/Data/AniList/identity';
- import ActivityHistoryGrid from '../ActivityHistory/Grid.svelte';
+import type { ActivityHistoryEntry } from '$lib/Data/AniList/activity';
+import type { AniListAuthorisation } from '$lib/Data/AniList/identity';
+import ActivityHistoryGrid from '../ActivityHistory/Grid.svelte';
- export let user: AniListAuthorisation;
- export let activities: ActivityHistoryEntry[];
- export let year: number;
- export let activityHistoryPosition: 'TOP' | 'BELOW_TOP' | 'ORIGINAL';
+export let user: AniListAuthorisation;
+export let activities: ActivityHistoryEntry[];
+export let year: number;
+export let activityHistoryPosition: 'TOP' | 'BELOW_TOP' | 'ORIGINAL';
</script>
<div
diff --git a/src/lib/Tools/Wrapped/DataLoader.svelte b/src/lib/Tools/Wrapped/DataLoader.svelte
index 9c99b4a4..6063f349 100644
--- a/src/lib/Tools/Wrapped/DataLoader.svelte
+++ b/src/lib/Tools/Wrapped/DataLoader.svelte
@@ -1,7 +1,7 @@
<script lang="ts">
- import { onMount } from 'svelte';
+import { onMount } from 'svelte';
- export let onLoad: () => void;
+export let onLoad: () => void;
- onMount(() => onLoad());
+onMount(() => onLoad());
</script>
diff --git a/src/lib/Tools/Wrapped/Media.svelte b/src/lib/Tools/Wrapped/Media.svelte
index 90e0cde3..bbd7ee5b 100644
--- a/src/lib/Tools/Wrapped/Media.svelte
+++ b/src/lib/Tools/Wrapped/Media.svelte
@@ -1,17 +1,17 @@
<script lang="ts">
- import type { Media } from '$lib/Data/AniList/media';
- import type { Wrapped } from '$lib/Data/AniList/wrapped';
- import MediaTitleDisplay from '$lib/List/MediaTitleDisplay.svelte';
- import proxy from '$lib/Utility/proxy';
+import type { Media } from '$lib/Data/AniList/media';
+import type { Wrapped } from '$lib/Data/AniList/wrapped';
+import MediaTitleDisplay from '$lib/List/MediaTitleDisplay.svelte';
+import proxy from '$lib/Utility/proxy';
- export let animeList: Media[] | undefined;
- export let mangaList: Media[] | undefined;
- export let wrapped: Wrapped;
- export let updateWidth: () => void;
- export let highestRatedMediaPercentage: boolean;
- export let highestRatedCount: number;
- export let animeMostTitle: string;
- export let mangaMostTitle: string;
+export let animeList: Media[] | undefined;
+export let mangaList: Media[] | undefined;
+export let wrapped: Wrapped;
+export let updateWidth: () => void;
+export let highestRatedMediaPercentage: boolean;
+export let highestRatedCount: number;
+export let animeMostTitle: string;
+export let mangaMostTitle: string;
</script>
{#if animeList !== undefined || mangaList !== undefined}
diff --git a/src/lib/Tools/Wrapped/MediaExtras.svelte b/src/lib/Tools/Wrapped/MediaExtras.svelte
index 78b89e36..d9dc8efb 100644
--- a/src/lib/Tools/Wrapped/MediaExtras.svelte
+++ b/src/lib/Tools/Wrapped/MediaExtras.svelte
@@ -1,11 +1,11 @@
<script lang="ts">
- import type { TopMedia } from '$lib/Data/AniList/wrapped';
- import proxy from '$lib/Utility/proxy';
+import type { TopMedia } from '$lib/Data/AniList/wrapped';
+import proxy from '$lib/Utility/proxy';
- export let topMedia: TopMedia;
- export let updateWidth: () => void;
- export let highestRatedGenreTagPercentage: boolean;
- export let genreTagTitle: string;
+export let topMedia: TopMedia;
+export let updateWidth: () => void;
+export let highestRatedGenreTagPercentage: boolean;
+export let genreTagTitle: string;
</script>
<div class="categories-grid" style="padding-top: 0;">
diff --git a/src/lib/Tools/Wrapped/Tool.svelte b/src/lib/Tools/Wrapped/Tool.svelte
index 3985b4c0..3f13b483 100644
--- a/src/lib/Tools/Wrapped/Tool.svelte
+++ b/src/lib/Tools/Wrapped/Tool.svelte
@@ -1,748 +1,730 @@
<script lang="ts">
- import Spacer from '$lib/Layout/Spacer.svelte';
- import './wrapped.css';
- import userIdentity from '$stores/identity';
- import type { AniListAuthorisation } from '$lib/Data/AniList/identity';
- import { onMount } from 'svelte';
- import {
- tops,
- wrapped,
- type TopMedia,
- SortOptions,
- type Wrapped
- } from '$lib/Data/AniList/wrapped';
- import {
- fullActivityHistory,
- activityHistory as getActivityHistory,
- type ActivityHistoryEntry
- } from '$lib/Data/AniList/activity';
- import { Type, mediaListCollection, type Media } from '$lib/Data/AniList/media';
- import anime from '$stores/anime';
- import lastPruneTimes from '$stores/lastPruneTimes';
- import manga from '$stores/manga';
- import Error from '$lib/Error/RateLimited.svelte';
- import { domToBlob } from 'modern-screenshot';
- import { browser } from '$app/environment';
- import { page } from '$app/stores';
- import { clearAllParameters } from '../../Utility/parameters';
- import SettingHint from '$lib/Settings/SettingHint.svelte';
- import { database } from '$lib/Database/IDB/activities';
- import Activity from './Top/Activity.svelte';
- import Anime from './Top/Anime.svelte';
- import Manga from './Top/Manga.svelte';
- import ActivityHistory from './ActivityHistory.svelte';
- import MediaExtras from './MediaExtras.svelte';
- import MediaPanel from './Media.svelte';
- import Watermark from './Watermark.svelte';
- import DataLoader from './DataLoader.svelte';
- import Skeleton from '$lib/Loading/Skeleton.svelte';
- import Message from '$lib/Loading/Message.svelte';
- import tooltip from '$lib/Tooltip/tooltip';
- import LogInRestricted from '$lib/Error/LogInRestricted.svelte';
-
- export let user: AniListAuthorisation;
-
- const currentYear = new Date(Date.now()).getFullYear();
- let selectedYear = new Date(Date.now()).getFullYear();
- let episodes = 0;
- let chapters = 0;
- let minutesWatched = 0;
- let animeList: Media[] | undefined = undefined;
- let mangaList: Media[] | undefined = undefined;
- let calculatedAnimeList: Media[] | undefined = undefined;
- let calculatedMangaList: Media[] | undefined = undefined;
- let originalAnimeList: Media[] | undefined = undefined;
- let originalMangaList: Media[] | undefined = undefined;
- let transparency = false;
- let lightTheme = true;
- let watermark = false;
- let includeMusic = false;
- let includeSpecials = true;
- let includeRepeats = false;
- let width = 1920;
- let lightMode = false;
- let highestRatedCount = 5;
- let genreTagCount = 5;
- let mounted = false;
- let generated = false;
- let disableActivityHistory = true;
- let excludedKeywordsInput = '';
- let excludedKeywords: string[] = [];
- let useFullActivityHistory = false;
- let disableLoopingActivityCounter = false;
- let topGenresTags = true;
- let topMedia: TopMedia;
- let highestRatedMediaPercentage = true;
- let highestRatedGenreTagPercentage = true;
- let genreTagsSort = SortOptions.SCORE;
- let mediaSort = SortOptions.SCORE;
- let includeMovies = true;
- let includeOVAs = true;
- let activityHistoryPosition: 'TOP' | 'BELOW_TOP' | 'ORIGINAL' = 'ORIGINAL';
- let includeOngoingMediaFromPreviousYears = false;
- let excludeUnratedUnwatched = true;
- let startDateFilter: Date | null = null;
- let endDateFilter: Date | null = null;
- let dateTicked = false;
- let shouldFetchData = false;
- let needsRefetch = false;
- let dataFetched = false;
- let fetchKey = 0;
- let lastSelectedYear = selectedYear;
- let lastUseFullActivityHistory = useFullActivityHistory;
- let lastDisableLoopingActivityCounter = disableLoopingActivityCounter;
- let lastStartDateFilter: Date | null = startDateFilter;
- let lastEndDateFilter: Date | null = endDateFilter;
-
- $: {
- if (browser && mounted) {
- $page.url.searchParams.set('transparency', transparency.toString());
- $page.url.searchParams.set('lightTheme', lightTheme.toString());
- $page.url.searchParams.set('watermark', watermark.toString());
- $page.url.searchParams.set('includeMusic', includeMusic.toString());
- $page.url.searchParams.set('includeSpecials', includeSpecials.toString());
- $page.url.searchParams.set('includeRepeats', includeRepeats.toString());
- $page.url.searchParams.set('lightMode', lightMode.toString());
- $page.url.searchParams.set('highestRatedCount', highestRatedCount.toString());
- $page.url.searchParams.set('genreTagCount', genreTagCount.toString());
- $page.url.searchParams.set('disableActivityHistory', disableActivityHistory.toString());
- $page.url.searchParams.set(
- 'highestRatedMediaPercentage',
- highestRatedMediaPercentage.toString()
- );
- $page.url.searchParams.set(
- 'highestRatedGenreTagPercentage',
- highestRatedGenreTagPercentage.toString()
- );
- $page.url.searchParams.set('genreTagsSort', genreTagsSort.toString());
- $page.url.searchParams.set('mediaSort', mediaSort.toString());
- $page.url.searchParams.set('includeMovies', includeMovies.toString());
- $page.url.searchParams.set('includeOVAs', includeOVAs.toString());
- $page.url.searchParams.set('excludeUnratedUnwatched', excludeUnratedUnwatched.toString());
- $page.url.searchParams.set(
- 'disableLoopingActivityCounter',
- disableLoopingActivityCounter.toString()
- );
-
- history.replaceState(null, '', `?${$page.url.searchParams.toString()}`);
- }
- }
+import Spacer from '$lib/Layout/Spacer.svelte';
+import './wrapped.css';
+import userIdentity from '$stores/identity';
+import type { AniListAuthorisation } from '$lib/Data/AniList/identity';
+import { onMount } from 'svelte';
+import { tops, wrapped, type TopMedia, SortOptions, type Wrapped } from '$lib/Data/AniList/wrapped';
+import {
+ fullActivityHistory,
+ activityHistory as getActivityHistory,
+ type ActivityHistoryEntry
+} from '$lib/Data/AniList/activity';
+import { Type, mediaListCollection, type Media } from '$lib/Data/AniList/media';
+import anime from '$stores/anime';
+import lastPruneTimes from '$stores/lastPruneTimes';
+import manga from '$stores/manga';
+import Error from '$lib/Error/RateLimited.svelte';
+import { domToBlob } from 'modern-screenshot';
+import { browser } from '$app/environment';
+import { page } from '$app/stores';
+import { clearAllParameters } from '../../Utility/parameters';
+import SettingHint from '$lib/Settings/SettingHint.svelte';
+import { database } from '$lib/Database/IDB/activities';
+import Activity from './Top/Activity.svelte';
+import Anime from './Top/Anime.svelte';
+import Manga from './Top/Manga.svelte';
+import ActivityHistory from './ActivityHistory.svelte';
+import MediaExtras from './MediaExtras.svelte';
+import MediaPanel from './Media.svelte';
+import Watermark from './Watermark.svelte';
+import DataLoader from './DataLoader.svelte';
+import Skeleton from '$lib/Loading/Skeleton.svelte';
+import Message from '$lib/Loading/Message.svelte';
+import tooltip from '$lib/Tooltip/tooltip';
+import LogInRestricted from '$lib/Error/LogInRestricted.svelte';
+
+export let user: AniListAuthorisation;
+
+const currentYear = new Date(Date.now()).getFullYear();
+let selectedYear = new Date(Date.now()).getFullYear();
+let episodes = 0;
+let chapters = 0;
+let minutesWatched = 0;
+let animeList: Media[] | undefined = undefined;
+let mangaList: Media[] | undefined = undefined;
+let calculatedAnimeList: Media[] | undefined = undefined;
+let calculatedMangaList: Media[] | undefined = undefined;
+let originalAnimeList: Media[] | undefined = undefined;
+let originalMangaList: Media[] | undefined = undefined;
+let transparency = false;
+let lightTheme = true;
+let watermark = false;
+let includeMusic = false;
+let includeSpecials = true;
+let includeRepeats = false;
+let width = 1920;
+let lightMode = false;
+let highestRatedCount = 5;
+let genreTagCount = 5;
+let mounted = false;
+let generated = false;
+let disableActivityHistory = true;
+let excludedKeywordsInput = '';
+let excludedKeywords: string[] = [];
+let useFullActivityHistory = false;
+let disableLoopingActivityCounter = false;
+let topGenresTags = true;
+let topMedia: TopMedia;
+let highestRatedMediaPercentage = true;
+let highestRatedGenreTagPercentage = true;
+let genreTagsSort = SortOptions.SCORE;
+let mediaSort = SortOptions.SCORE;
+let includeMovies = true;
+let includeOVAs = true;
+let activityHistoryPosition: 'TOP' | 'BELOW_TOP' | 'ORIGINAL' = 'ORIGINAL';
+let includeOngoingMediaFromPreviousYears = false;
+let excludeUnratedUnwatched = true;
+let startDateFilter: Date | null = null;
+let endDateFilter: Date | null = null;
+let dateTicked = false;
+let shouldFetchData = false;
+let needsRefetch = false;
+let dataFetched = false;
+let fetchKey = 0;
+let lastSelectedYear = selectedYear;
+let lastUseFullActivityHistory = useFullActivityHistory;
+let lastDisableLoopingActivityCounter = disableLoopingActivityCounter;
+let lastStartDateFilter: Date | null = startDateFilter;
+let lastEndDateFilter: Date | null = endDateFilter;
+
+$: {
+ if (browser && mounted) {
+ $page.url.searchParams.set('transparency', transparency.toString());
+ $page.url.searchParams.set('lightTheme', lightTheme.toString());
+ $page.url.searchParams.set('watermark', watermark.toString());
+ $page.url.searchParams.set('includeMusic', includeMusic.toString());
+ $page.url.searchParams.set('includeSpecials', includeSpecials.toString());
+ $page.url.searchParams.set('includeRepeats', includeRepeats.toString());
+ $page.url.searchParams.set('lightMode', lightMode.toString());
+ $page.url.searchParams.set('highestRatedCount', highestRatedCount.toString());
+ $page.url.searchParams.set('genreTagCount', genreTagCount.toString());
+ $page.url.searchParams.set('disableActivityHistory', disableActivityHistory.toString());
+ $page.url.searchParams.set(
+ 'highestRatedMediaPercentage',
+ highestRatedMediaPercentage.toString()
+ );
+ $page.url.searchParams.set(
+ 'highestRatedGenreTagPercentage',
+ highestRatedGenreTagPercentage.toString()
+ );
+ $page.url.searchParams.set('genreTagsSort', genreTagsSort.toString());
+ $page.url.searchParams.set('mediaSort', mediaSort.toString());
+ $page.url.searchParams.set('includeMovies', includeMovies.toString());
+ $page.url.searchParams.set('includeOVAs', includeOVAs.toString());
+ $page.url.searchParams.set('excludeUnratedUnwatched', excludeUnratedUnwatched.toString());
+ $page.url.searchParams.set(
+ 'disableLoopingActivityCounter',
+ disableLoopingActivityCounter.toString()
+ );
- $: {
- if (dataFetched) {
- const yearChanged = selectedYear !== lastSelectedYear;
- const fullActivityChanged = useFullActivityHistory !== lastUseFullActivityHistory;
- const loopingChanged = disableLoopingActivityCounter !== lastDisableLoopingActivityCounter;
- const startDateChanged = startDateFilter !== lastStartDateFilter;
- const endDateChanged = endDateFilter !== lastEndDateFilter;
-
- if (
- yearChanged ||
- fullActivityChanged ||
- loopingChanged ||
- startDateChanged ||
- endDateChanged
- )
- needsRefetch = true;
- }
+ history.replaceState(null, '', `?${$page.url.searchParams.toString()}`);
}
+}
+
+$: {
+ if (dataFetched) {
+ const yearChanged = selectedYear !== lastSelectedYear;
+ const fullActivityChanged = useFullActivityHistory !== lastUseFullActivityHistory;
+ const loopingChanged = disableLoopingActivityCounter !== lastDisableLoopingActivityCounter;
+ const startDateChanged = startDateFilter !== lastStartDateFilter;
+ const endDateChanged = endDateFilter !== lastEndDateFilter;
+
+ if (yearChanged || fullActivityChanged || loopingChanged || startDateChanged || endDateChanged)
+ needsRefetch = true;
+ }
+}
+
+$: {
+ includeMusic = includeMusic;
+ includeSpecials = includeSpecials;
+ includeRepeats = includeRepeats;
+ disableActivityHistory = disableActivityHistory;
+ highestRatedMediaPercentage = highestRatedMediaPercentage;
+ highestRatedGenreTagPercentage = highestRatedGenreTagPercentage;
+ topGenresTags = topGenresTags;
+ genreTagsSort = genreTagsSort;
+ mediaSort = mediaSort;
+ includeMovies = includeMovies;
+ includeOVAs = includeOVAs;
+ selectedYear = selectedYear;
+ includeOngoingMediaFromPreviousYears = includeOngoingMediaFromPreviousYears;
+ excludeUnratedUnwatched = excludeUnratedUnwatched;
+
+ if (shouldFetchData) update().then(updateWidth).catch(updateWidth);
+}
+$: {
+ animeList = animeList;
+ mangaList = mangaList;
+ highestRatedCount = highestRatedCount;
+
+ new Promise((resolve) => setTimeout(resolve, 1)).then(updateWidth);
+}
+$: {
+ genreTagCount = genreTagCount;
+
+ if (animeList && mangaList)
+ topMedia = tops(
+ [...(animeList || []), ...(mangaList || [])],
+ genreTagCount,
+ genreTagsSort,
+ excludedKeywords
+ );
- $: {
- includeMusic = includeMusic;
- includeSpecials = includeSpecials;
- includeRepeats = includeRepeats;
- disableActivityHistory = disableActivityHistory;
- highestRatedMediaPercentage = highestRatedMediaPercentage;
- highestRatedGenreTagPercentage = highestRatedGenreTagPercentage;
- topGenresTags = topGenresTags;
- genreTagsSort = genreTagsSort;
- mediaSort = mediaSort;
- includeMovies = includeMovies;
- includeOVAs = includeOVAs;
- selectedYear = selectedYear;
- includeOngoingMediaFromPreviousYears = includeOngoingMediaFromPreviousYears;
- excludeUnratedUnwatched = excludeUnratedUnwatched;
-
- if (shouldFetchData) update().then(updateWidth).catch(updateWidth);
+ new Promise((resolve) => setTimeout(resolve, 1)).then(updateWidth);
+}
+$: {
+ excludedKeywords = excludedKeywords;
+
+ if (excludedKeywords.length > 0 && animeList !== undefined && mangaList !== undefined) {
+ animeList = originalAnimeList;
+ mangaList = originalMangaList;
+ animeList = excludeKeywords(animeList as Media[]);
+ mangaList = excludeKeywords(mangaList as Media[]);
}
- $: {
- animeList = animeList;
- mangaList = mangaList;
- highestRatedCount = highestRatedCount;
- new Promise((resolve) => setTimeout(resolve, 1)).then(updateWidth);
+ updateWidth();
+}
+$: genreTagTitle = (() => {
+ switch (genreTagsSort) {
+ case SortOptions.SCORE:
+ return 'Highest Rated';
+ case SortOptions.MINUTES_WATCHED:
+ return 'Most Watched';
+ case SortOptions.COUNT:
+ return 'Most Common';
}
- $: {
- genreTagCount = genreTagCount;
-
- if (animeList && mangaList)
- topMedia = tops(
- [...(animeList || []), ...(mangaList || [])],
- genreTagCount,
- genreTagsSort,
- excludedKeywords
- );
-
- new Promise((resolve) => setTimeout(resolve, 1)).then(updateWidth);
+})();
+$: animeMostTitle = (() => {
+ switch (mediaSort) {
+ case SortOptions.SCORE:
+ return 'Highest Rated';
+ case SortOptions.MINUTES_WATCHED:
+ return 'Most Watched';
+ case SortOptions.COUNT:
+ return 'Most Common';
}
- $: {
- excludedKeywords = excludedKeywords;
-
- if (excludedKeywords.length > 0 && animeList !== undefined && mangaList !== undefined) {
- animeList = originalAnimeList;
- mangaList = originalMangaList;
- animeList = excludeKeywords(animeList as Media[]);
- mangaList = excludeKeywords(mangaList as Media[]);
- }
-
- updateWidth();
+})();
+$: mangaMostTitle = (() => {
+ switch (mediaSort) {
+ case SortOptions.SCORE:
+ return 'Highest Rated';
+ case SortOptions.MINUTES_WATCHED:
+ return 'Most Read';
+ case SortOptions.COUNT:
+ return 'Most Common';
}
- $: genreTagTitle = (() => {
- switch (genreTagsSort) {
- case SortOptions.SCORE:
- return 'Highest Rated';
- case SortOptions.MINUTES_WATCHED:
- return 'Most Watched';
- case SortOptions.COUNT:
- return 'Most Common';
- }
- })();
- $: animeMostTitle = (() => {
- switch (mediaSort) {
- case SortOptions.SCORE:
- return 'Highest Rated';
- case SortOptions.MINUTES_WATCHED:
- return 'Most Watched';
- case SortOptions.COUNT:
- return 'Most Common';
- }
- })();
- $: mangaMostTitle = (() => {
- switch (mediaSort) {
- case SortOptions.SCORE:
- return 'Highest Rated';
- case SortOptions.MINUTES_WATCHED:
- return 'Most Read';
- case SortOptions.COUNT:
- return 'Most Common';
- }
- })();
-
- const updateWidth = () => {
- if (!browser) return;
-
- const wrappedContainer = document.querySelector('#wrapped') as HTMLElement;
-
- if (!wrappedContainer) return;
-
- wrappedContainer.style.width = `1920px`;
-
- const reset = () => {
- let topWidths = 0;
- let middleWidths = 0;
- let bottomWidths = 0;
-
- wrappedContainer.querySelectorAll('.category').forEach((item) => {
- const category = item as HTMLElement;
- const style = window.getComputedStyle(category);
- const width =
- category.offsetWidth +
- parseFloat(style.marginLeft) +
- parseFloat(style.marginRight) +
- parseFloat(style.paddingLeft) +
- parseFloat(style.paddingRight) +
- parseFloat(style.borderLeftWidth) +
- parseFloat(style.borderRightWidth);
-
- if (category.classList.contains('top-category')) {
- topWidths += width;
- } else if (category.classList.contains('middle-category')) {
- middleWidths += width;
- } else if (category.classList.contains('bottom-category')) {
- bottomWidths += width;
- }
- });
-
- let requiredWidth = topWidths > middleWidths ? topWidths : middleWidths;
+})();
+
+const updateWidth = () => {
+ if (!browser) return;
+
+ const wrappedContainer = document.querySelector('#wrapped') as HTMLElement;
+
+ if (!wrappedContainer) return;
+
+ wrappedContainer.style.width = `1920px`;
+
+ const reset = () => {
+ let topWidths = 0;
+ let middleWidths = 0;
+ let bottomWidths = 0;
+
+ wrappedContainer.querySelectorAll('.category').forEach((item) => {
+ const category = item as HTMLElement;
+ const style = window.getComputedStyle(category);
+ const width =
+ category.offsetWidth +
+ parseFloat(style.marginLeft) +
+ parseFloat(style.marginRight) +
+ parseFloat(style.paddingLeft) +
+ parseFloat(style.paddingRight) +
+ parseFloat(style.borderLeftWidth) +
+ parseFloat(style.borderRightWidth);
+
+ if (category.classList.contains('top-category')) {
+ topWidths += width;
+ } else if (category.classList.contains('middle-category')) {
+ middleWidths += width;
+ } else if (category.classList.contains('bottom-category')) {
+ bottomWidths += width;
+ }
+ });
- if (!disableActivityHistory && bottomWidths > requiredWidth) requiredWidth = bottomWidths;
+ let requiredWidth = topWidths > middleWidths ? topWidths : middleWidths;
- requiredWidth += wrappedContainer.offsetWidth - wrappedContainer.clientWidth;
+ if (!disableActivityHistory && bottomWidths > requiredWidth) requiredWidth = bottomWidths;
- wrappedContainer.style.width = `${requiredWidth}px`;
- width = requiredWidth;
- };
+ requiredWidth += wrappedContainer.offsetWidth - wrappedContainer.clientWidth;
- reset();
- reset();
+ wrappedContainer.style.width = `${requiredWidth}px`;
+ width = requiredWidth;
};
- onMount(async () => {
- clearAllParameters([
- 'transparency',
- 'lightTheme',
- 'watermark',
- 'includeMusic',
- 'includeSpecials',
- 'includeRepeats',
- 'forceDark',
- 'highestRatedCount',
- 'genreTagCount',
- 'disableActivityHistory',
- 'highestRatedMediaPercentage',
- 'highestRatedGenreTagPercentage',
- 'genreTagsSort',
- 'mediaSort',
- 'includeMovies',
- 'includeOVAs',
- 'disableLoopingActivityCounter'
- ]);
-
- if (browser) {
- transparency = $page.url.searchParams.get('transparency') === 'true';
- lightTheme = $page.url.searchParams.get('lightTheme') === 'true';
- watermark = $page.url.searchParams.get('watermark') === 'true';
- includeMusic = $page.url.searchParams.get('includeMusic') === 'true';
- includeSpecials = $page.url.searchParams.get('includeSpecials') === 'true';
- includeRepeats = $page.url.searchParams.get('includeRepeats') === 'true';
- lightMode = $page.url.searchParams.get('lightMode') === 'true';
- highestRatedCount = parseInt($page.url.searchParams.get('highestRatedCount') || '5', 10);
- genreTagCount = parseInt($page.url.searchParams.get('genreTagCount') || '5', 10);
- disableActivityHistory = $page.url.searchParams.get('disableActivityHistory') === 'true';
- disableLoopingActivityCounter =
- $page.url.searchParams.get('disableLoopingActivityCounter') === 'true';
- highestRatedMediaPercentage =
- $page.url.searchParams.get('highestRatedMediaPercentage') === 'true';
- highestRatedGenreTagPercentage =
- $page.url.searchParams.get('highestRatedGenreTagPercentage') === 'true';
- // genreTagsSort = parseInt($page.url.searchParams.get('genreTagsSort') || '0', 10);
- // mediaSort = parseInt($page.url.searchParams.get('mediaSort') || '0', 10);
- includeMovies = $page.url.searchParams.get('includeMovies') === 'true';
- includeOVAs = $page.url.searchParams.get('includeOVAs') === 'true';
- }
-
- await update().then(() => (mounted = true));
- });
-
- const triggerFetch = () => {
- shouldFetchData = true;
- needsRefetch = false;
- dataFetched = true;
- fetchKey += 1;
- lastSelectedYear = selectedYear;
- lastUseFullActivityHistory = useFullActivityHistory;
- lastDisableLoopingActivityCounter = disableLoopingActivityCounter;
- lastStartDateFilter = startDateFilter;
- lastEndDateFilter = endDateFilter;
- };
+ reset();
+ reset();
+};
+
+onMount(async () => {
+ clearAllParameters([
+ 'transparency',
+ 'lightTheme',
+ 'watermark',
+ 'includeMusic',
+ 'includeSpecials',
+ 'includeRepeats',
+ 'forceDark',
+ 'highestRatedCount',
+ 'genreTagCount',
+ 'disableActivityHistory',
+ 'highestRatedMediaPercentage',
+ 'highestRatedGenreTagPercentage',
+ 'genreTagsSort',
+ 'mediaSort',
+ 'includeMovies',
+ 'includeOVAs',
+ 'disableLoopingActivityCounter'
+ ]);
+
+ if (browser) {
+ transparency = $page.url.searchParams.get('transparency') === 'true';
+ lightTheme = $page.url.searchParams.get('lightTheme') === 'true';
+ watermark = $page.url.searchParams.get('watermark') === 'true';
+ includeMusic = $page.url.searchParams.get('includeMusic') === 'true';
+ includeSpecials = $page.url.searchParams.get('includeSpecials') === 'true';
+ includeRepeats = $page.url.searchParams.get('includeRepeats') === 'true';
+ lightMode = $page.url.searchParams.get('lightMode') === 'true';
+ highestRatedCount = parseInt($page.url.searchParams.get('highestRatedCount') || '5', 10);
+ genreTagCount = parseInt($page.url.searchParams.get('genreTagCount') || '5', 10);
+ disableActivityHistory = $page.url.searchParams.get('disableActivityHistory') === 'true';
+ disableLoopingActivityCounter =
+ $page.url.searchParams.get('disableLoopingActivityCounter') === 'true';
+ highestRatedMediaPercentage =
+ $page.url.searchParams.get('highestRatedMediaPercentage') === 'true';
+ highestRatedGenreTagPercentage =
+ $page.url.searchParams.get('highestRatedGenreTagPercentage') === 'true';
+ // genreTagsSort = parseInt($page.url.searchParams.get('genreTagsSort') || '0', 10);
+ // mediaSort = parseInt($page.url.searchParams.get('mediaSort') || '0', 10);
+ includeMovies = $page.url.searchParams.get('includeMovies') === 'true';
+ includeOVAs = $page.url.searchParams.get('includeOVAs') === 'true';
+ }
- const createDummyMedia = (type: 'ANIME' | 'MANGA'): Media => ({
- id: 0,
- idMal: 0,
- status: 'FINISHED',
- type,
- episodes: type === 'ANIME' ? 0 : 0,
- chapters: type === 'MANGA' ? 0 : 0,
- volumes: 0,
- duration: 0,
- format: type === 'ANIME' ? 'TV' : 'MANGA',
- title: {
- romaji: '...',
- english: '...',
- native: '...'
- },
- synonyms: [],
- mediaListEntry: {
- progress: 0,
- progressVolumes: 0,
- status: 'COMPLETED',
- score: 0,
- repeat: 0,
- startedAt: {
- year: 0,
- month: 0,
- day: 0
- },
- completedAt: {
- year: 0,
- month: 0,
- day: 0
- },
- createdAt: 0,
- updatedAt: 0,
- customLists: {}
- },
- startDate: {
+ await update().then(() => (mounted = true));
+});
+
+const triggerFetch = () => {
+ shouldFetchData = true;
+ needsRefetch = false;
+ dataFetched = true;
+ fetchKey += 1;
+ lastSelectedYear = selectedYear;
+ lastUseFullActivityHistory = useFullActivityHistory;
+ lastDisableLoopingActivityCounter = disableLoopingActivityCounter;
+ lastStartDateFilter = startDateFilter;
+ lastEndDateFilter = endDateFilter;
+};
+
+const createDummyMedia = (type: 'ANIME' | 'MANGA'): Media => ({
+ id: 0,
+ idMal: 0,
+ status: 'FINISHED',
+ type,
+ episodes: type === 'ANIME' ? 0 : 0,
+ chapters: type === 'MANGA' ? 0 : 0,
+ volumes: 0,
+ duration: 0,
+ format: type === 'ANIME' ? 'TV' : 'MANGA',
+ title: {
+ romaji: '...',
+ english: '...',
+ native: '...'
+ },
+ synonyms: [],
+ mediaListEntry: {
+ progress: 0,
+ progressVolumes: 0,
+ status: 'COMPLETED',
+ score: 0,
+ repeat: 0,
+ startedAt: {
year: 0,
- month: 0
+ month: 0,
+ day: 0
},
- endDate: {
+ completedAt: {
year: 0,
- month: 0
+ month: 0,
+ day: 0
},
- coverImage: {
- extraLarge: 'https://s4.anilist.co/file/anilistcdn/staff/large/default.jpg',
- medium: 'https://s4.anilist.co/file/anilistcdn/staff/large/default.jpg'
+ createdAt: 0,
+ updatedAt: 0,
+ customLists: {}
+ },
+ startDate: {
+ year: 0,
+ month: 0
+ },
+ endDate: {
+ year: 0,
+ month: 0
+ },
+ coverImage: {
+ extraLarge: 'https://s4.anilist.co/file/anilistcdn/staff/large/default.jpg',
+ medium: 'https://s4.anilist.co/file/anilistcdn/staff/large/default.jpg'
+ },
+ tags: [],
+ genres: [],
+ season: 'WINTER',
+ isAdult: false,
+ relations: {
+ edges: []
+ }
+});
+
+const dummyWrapped: Wrapped = {
+ statistics: {
+ anime: {
+ startYears: [],
+ genres: [],
+ tags: []
},
- tags: [],
- genres: [],
- season: 'WINTER',
- isAdult: false,
- relations: {
- edges: []
+ manga: {
+ startYears: [],
+ genres: [],
+ tags: []
}
- });
-
- const dummyWrapped: Wrapped = {
- statistics: {
- anime: {
- startYears: [],
- genres: [],
- tags: []
- },
- manga: {
- startYears: [],
- genres: [],
- tags: []
- }
- },
- activities: {
- statusCount: 0,
- messageCount: 0
- },
- avatar: {
- large: 'https://s4.anilist.co/file/anilistcdn/user/avatar/large/3.jpg'
+ },
+ activities: {
+ statusCount: 0,
+ messageCount: 0
+ },
+ avatar: {
+ large: 'https://s4.anilist.co/file/anilistcdn/user/avatar/large/3.jpg'
+ }
+};
+
+const dummyActivities: ActivityHistoryEntry[] = [];
+const dummyAnimeList: Media[] = [createDummyMedia('ANIME')];
+const dummyMangaList: Media[] = [createDummyMedia('MANGA')];
+
+const update = async () => {
+ if ($userIdentity.id === -1) return;
+
+ let rawAnimeList = await mediaListCollection(
+ user,
+ $userIdentity,
+ Type.Anime,
+ $anime,
+ $lastPruneTimes.anime,
+ {
+ forcePrune: dateTicked ? false : true,
+ includeCompleted: true,
+ all: true
}
- };
-
- const dummyActivities: ActivityHistoryEntry[] = [];
- const dummyAnimeList: Media[] = [createDummyMedia('ANIME')];
- const dummyMangaList: Media[] = [createDummyMedia('MANGA')];
-
- const update = async () => {
- if ($userIdentity.id === -1) return;
-
- let rawAnimeList = await mediaListCollection(
- user,
- $userIdentity,
- Type.Anime,
- $anime,
- $lastPruneTimes.anime,
- {
- forcePrune: dateTicked ? false : true,
- includeCompleted: true,
- all: true
- }
- );
- calculatedAnimeList = rawAnimeList
- .filter(
- (item, index, self) =>
- self.findIndex((itemToCompare) => itemToCompare.id === item.id) === index &&
- (includeMusic ? true : item.format !== 'MUSIC') &&
- (includeRepeats
+ );
+ calculatedAnimeList = rawAnimeList
+ .filter(
+ (item, index, self) =>
+ self.findIndex((itemToCompare) => itemToCompare.id === item.id) === index &&
+ (includeMusic ? true : item.format !== 'MUSIC') &&
+ (includeRepeats
+ ? true
+ : item.startDate.year === selectedYear || item.endDate.year === selectedYear
? true
- : item.startDate.year === selectedYear || item.endDate.year === selectedYear
- ? true
- : item.mediaListEntry?.repeat === 0) &&
- (item.mediaListEntry?.startedAt.year === selectedYear ||
- item.mediaListEntry?.completedAt.year === selectedYear ||
- ((item.mediaListEntry?.createdAt
- ? new Date(item.mediaListEntry?.createdAt * 1000).getFullYear() === selectedYear
- : false) && item.mediaListEntry
- ? item.mediaListEntry?.progress >= 1
- : false)) &&
- (includeMovies ? true : item.format !== 'MOVIE') &&
- (includeSpecials ? true : item.format !== 'SPECIAL') &&
- (includeOVAs ? true : item.format !== 'OVA') &&
- (excludeUnratedUnwatched ? item.mediaListEntry?.score !== 0 : true) &&
- (excludeUnratedUnwatched ? item.mediaListEntry?.progress !== 0 : true) &&
- (startDateFilter && item.mediaListEntry?.startedAt
- ? new Date(
- item.mediaListEntry.startedAt.year,
- item.mediaListEntry?.startedAt.month - 1,
- item.mediaListEntry.startedAt.day
- ) >= new Date(startDateFilter)
- : true) &&
- (endDateFilter && item.mediaListEntry?.startedAt
- ? new Date(
- item.mediaListEntry.completedAt.year,
- item.mediaListEntry?.completedAt.month - 1,
- item.mediaListEntry.completedAt.day
- ) <= new Date(endDateFilter)
- : true)
- )
- .sort((a, b) => {
- switch (mediaSort) {
- case SortOptions.MINUTES_WATCHED:
- if (a.duration === undefined || a.mediaListEntry?.progress === undefined) return 1;
- else if (b.duration === undefined || b.mediaListEntry?.progress === undefined)
- return -1;
- else
- return (
- b.duration * b.mediaListEntry.progress - a.duration * a.mediaListEntry.progress
- );
- case SortOptions.SCORE:
- default:
- if (a.mediaListEntry?.score === undefined) return 1;
- else if (b.mediaListEntry?.score === undefined) return -1;
- else return b.mediaListEntry?.score - a.mediaListEntry?.score;
- }
- });
-
- animeList = rawAnimeList
- .filter(
- (item, index, self) =>
- self.findIndex((itemToCompare) => itemToCompare.id === item.id) === index &&
- (includeMusic ? true : item.format !== 'MUSIC') &&
- (includeRepeats
+ : item.mediaListEntry?.repeat === 0) &&
+ (item.mediaListEntry?.startedAt.year === selectedYear ||
+ item.mediaListEntry?.completedAt.year === selectedYear ||
+ ((item.mediaListEntry?.createdAt
+ ? new Date(item.mediaListEntry?.createdAt * 1000).getFullYear() === selectedYear
+ : false) && item.mediaListEntry
+ ? item.mediaListEntry?.progress >= 1
+ : false)) &&
+ (includeMovies ? true : item.format !== 'MOVIE') &&
+ (includeSpecials ? true : item.format !== 'SPECIAL') &&
+ (includeOVAs ? true : item.format !== 'OVA') &&
+ (excludeUnratedUnwatched ? item.mediaListEntry?.score !== 0 : true) &&
+ (excludeUnratedUnwatched ? item.mediaListEntry?.progress !== 0 : true) &&
+ (startDateFilter && item.mediaListEntry?.startedAt
+ ? new Date(
+ item.mediaListEntry.startedAt.year,
+ item.mediaListEntry?.startedAt.month - 1,
+ item.mediaListEntry.startedAt.day
+ ) >= new Date(startDateFilter)
+ : true) &&
+ (endDateFilter && item.mediaListEntry?.startedAt
+ ? new Date(
+ item.mediaListEntry.completedAt.year,
+ item.mediaListEntry?.completedAt.month - 1,
+ item.mediaListEntry.completedAt.day
+ ) <= new Date(endDateFilter)
+ : true)
+ )
+ .sort((a, b) => {
+ switch (mediaSort) {
+ case SortOptions.MINUTES_WATCHED:
+ if (a.duration === undefined || a.mediaListEntry?.progress === undefined) return 1;
+ else if (b.duration === undefined || b.mediaListEntry?.progress === undefined) return -1;
+ else
+ return b.duration * b.mediaListEntry.progress - a.duration * a.mediaListEntry.progress;
+ case SortOptions.SCORE:
+ default:
+ if (a.mediaListEntry?.score === undefined) return 1;
+ else if (b.mediaListEntry?.score === undefined) return -1;
+ else return b.mediaListEntry?.score - a.mediaListEntry?.score;
+ }
+ });
+
+ animeList = rawAnimeList
+ .filter(
+ (item, index, self) =>
+ self.findIndex((itemToCompare) => itemToCompare.id === item.id) === index &&
+ (includeMusic ? true : item.format !== 'MUSIC') &&
+ (includeRepeats
+ ? true
+ : item.startDate.year === selectedYear || item.endDate.year === selectedYear
? true
- : item.startDate.year === selectedYear || item.endDate.year === selectedYear
- ? true
- : item.mediaListEntry?.repeat === 0) &&
- (item.mediaListEntry?.startedAt.year === selectedYear ||
- item.mediaListEntry?.completedAt.year === selectedYear ||
- ((item.mediaListEntry?.createdAt
- ? new Date(item.mediaListEntry?.createdAt * 1000).getFullYear() === selectedYear
- : false) && item.mediaListEntry
- ? item.mediaListEntry?.progress >= 1
- : false) ||
- (includeOngoingMediaFromPreviousYears
- ? (item.mediaListEntry?.updatedAt
- ? new Date(item.mediaListEntry?.updatedAt * 1000).getFullYear() === selectedYear
- : false) && item.mediaListEntry
- ? item.mediaListEntry?.status === 'CURRENT'
- : false
- : false)) &&
- (includeMovies ? true : item.format !== 'MOVIE') &&
- (includeSpecials ? true : item.format !== 'SPECIAL') &&
- (includeOVAs ? true : item.format !== 'OVA')
- )
- .sort((a, b) => {
- switch (mediaSort) {
- case SortOptions.MINUTES_WATCHED:
- if (a.duration === undefined || a.mediaListEntry?.progress === undefined) return 1;
- else if (b.duration === undefined || b.mediaListEntry?.progress === undefined)
- return -1;
- else
- return (
- b.duration * b.mediaListEntry.progress - a.duration * a.mediaListEntry.progress
- );
- case SortOptions.SCORE:
- default:
- if (a.mediaListEntry?.score === undefined) return 1;
- else if (b.mediaListEntry?.score === undefined) return -1;
- else return b.mediaListEntry?.score - a.mediaListEntry?.score;
- }
- });
-
- let rawMangaList = await mediaListCollection(
- user,
- $userIdentity,
- Type.Manga,
- $manga,
- $lastPruneTimes.manga,
- {
- forcePrune: dateTicked ? false : true,
- includeCompleted: true,
- all: true
+ : item.mediaListEntry?.repeat === 0) &&
+ (item.mediaListEntry?.startedAt.year === selectedYear ||
+ item.mediaListEntry?.completedAt.year === selectedYear ||
+ ((item.mediaListEntry?.createdAt
+ ? new Date(item.mediaListEntry?.createdAt * 1000).getFullYear() === selectedYear
+ : false) && item.mediaListEntry
+ ? item.mediaListEntry?.progress >= 1
+ : false) ||
+ (includeOngoingMediaFromPreviousYears
+ ? (item.mediaListEntry?.updatedAt
+ ? new Date(item.mediaListEntry?.updatedAt * 1000).getFullYear() === selectedYear
+ : false) && item.mediaListEntry
+ ? item.mediaListEntry?.status === 'CURRENT'
+ : false
+ : false)) &&
+ (includeMovies ? true : item.format !== 'MOVIE') &&
+ (includeSpecials ? true : item.format !== 'SPECIAL') &&
+ (includeOVAs ? true : item.format !== 'OVA')
+ )
+ .sort((a, b) => {
+ switch (mediaSort) {
+ case SortOptions.MINUTES_WATCHED:
+ if (a.duration === undefined || a.mediaListEntry?.progress === undefined) return 1;
+ else if (b.duration === undefined || b.mediaListEntry?.progress === undefined) return -1;
+ else
+ return b.duration * b.mediaListEntry.progress - a.duration * a.mediaListEntry.progress;
+ case SortOptions.SCORE:
+ default:
+ if (a.mediaListEntry?.score === undefined) return 1;
+ else if (b.mediaListEntry?.score === undefined) return -1;
+ else return b.mediaListEntry?.score - a.mediaListEntry?.score;
}
- );
- calculatedMangaList = rawMangaList
- .filter(
- (item, index, self) =>
- self.findIndex((itemToCompare) => itemToCompare.id === item.id) === index &&
- (includeRepeats ? true : item.mediaListEntry?.repeat === 0) &&
- (item.mediaListEntry?.startedAt.year === selectedYear ||
- item.mediaListEntry?.completedAt.year === selectedYear ||
- ((item.mediaListEntry?.createdAt
- ? new Date(item.mediaListEntry?.createdAt * 1000).getFullYear() === selectedYear
- : false) && item.mediaListEntry
- ? item.mediaListEntry?.progress >= 1
- : false)) &&
- (excludeUnratedUnwatched ? item.mediaListEntry?.score !== 0 : true) &&
- (excludeUnratedUnwatched ? item.mediaListEntry?.progress !== 0 : true) &&
- (startDateFilter && item.mediaListEntry?.startedAt
- ? new Date(
- item.mediaListEntry.startedAt.year,
- item.mediaListEntry?.startedAt.month - 1,
- item.mediaListEntry.startedAt.day
- ) >= new Date(startDateFilter)
- : true) &&
- (endDateFilter && item.mediaListEntry?.startedAt
- ? new Date(
- item.mediaListEntry.completedAt.year,
- item.mediaListEntry?.completedAt.month - 1,
- item.mediaListEntry.completedAt.day
- ) <= new Date(endDateFilter)
- : true)
- )
- .sort((a, b) => {
- if (a.mediaListEntry?.score === undefined) return 1;
- else if (b.mediaListEntry?.score === undefined) return -1;
- else return b.mediaListEntry?.score - a.mediaListEntry?.score;
- });
-
- mangaList = rawMangaList
- .filter(
- (item, index, self) =>
- self.findIndex((itemToCompare) => itemToCompare.id === item.id) === index &&
- (includeRepeats ? true : item.mediaListEntry?.repeat === 0) &&
- (item.mediaListEntry?.startedAt.year === selectedYear ||
- item.mediaListEntry?.completedAt.year === selectedYear ||
- ((item.mediaListEntry?.createdAt
- ? new Date(item.mediaListEntry?.createdAt * 1000).getFullYear() === selectedYear
- : false) && item.mediaListEntry
- ? item.mediaListEntry?.progress >= 1
- : false) ||
- (includeOngoingMediaFromPreviousYears
- ? (item.mediaListEntry?.updatedAt
- ? new Date(item.mediaListEntry?.updatedAt * 1000).getFullYear() === selectedYear
- : false) && item.mediaListEntry
- ? item.mediaListEntry?.status === 'CURRENT'
- : false
- : false))
- )
- .sort((a, b) => {
- if (a.mediaListEntry?.score === undefined) return 1;
- else if (b.mediaListEntry?.score === undefined) return -1;
- else return b.mediaListEntry?.score - a.mediaListEntry?.score;
- });
-
- episodes = 0;
- minutesWatched = 0;
- chapters = 0;
- dateTicked = false;
-
- for (const media of calculatedAnimeList) {
- episodes += media.mediaListEntry?.progress || 0;
- minutesWatched += (media.mediaListEntry?.progress || 0) * media.duration || 0;
+ });
+
+ let rawMangaList = await mediaListCollection(
+ user,
+ $userIdentity,
+ Type.Manga,
+ $manga,
+ $lastPruneTimes.manga,
+ {
+ forcePrune: dateTicked ? false : true,
+ includeCompleted: true,
+ all: true
}
+ );
+ calculatedMangaList = rawMangaList
+ .filter(
+ (item, index, self) =>
+ self.findIndex((itemToCompare) => itemToCompare.id === item.id) === index &&
+ (includeRepeats ? true : item.mediaListEntry?.repeat === 0) &&
+ (item.mediaListEntry?.startedAt.year === selectedYear ||
+ item.mediaListEntry?.completedAt.year === selectedYear ||
+ ((item.mediaListEntry?.createdAt
+ ? new Date(item.mediaListEntry?.createdAt * 1000).getFullYear() === selectedYear
+ : false) && item.mediaListEntry
+ ? item.mediaListEntry?.progress >= 1
+ : false)) &&
+ (excludeUnratedUnwatched ? item.mediaListEntry?.score !== 0 : true) &&
+ (excludeUnratedUnwatched ? item.mediaListEntry?.progress !== 0 : true) &&
+ (startDateFilter && item.mediaListEntry?.startedAt
+ ? new Date(
+ item.mediaListEntry.startedAt.year,
+ item.mediaListEntry?.startedAt.month - 1,
+ item.mediaListEntry.startedAt.day
+ ) >= new Date(startDateFilter)
+ : true) &&
+ (endDateFilter && item.mediaListEntry?.startedAt
+ ? new Date(
+ item.mediaListEntry.completedAt.year,
+ item.mediaListEntry?.completedAt.month - 1,
+ item.mediaListEntry.completedAt.day
+ ) <= new Date(endDateFilter)
+ : true)
+ )
+ .sort((a, b) => {
+ if (a.mediaListEntry?.score === undefined) return 1;
+ else if (b.mediaListEntry?.score === undefined) return -1;
+ else return b.mediaListEntry?.score - a.mediaListEntry?.score;
+ });
- for (const media of calculatedMangaList) chapters += media.mediaListEntry?.progress || 0;
- };
+ mangaList = rawMangaList
+ .filter(
+ (item, index, self) =>
+ self.findIndex((itemToCompare) => itemToCompare.id === item.id) === index &&
+ (includeRepeats ? true : item.mediaListEntry?.repeat === 0) &&
+ (item.mediaListEntry?.startedAt.year === selectedYear ||
+ item.mediaListEntry?.completedAt.year === selectedYear ||
+ ((item.mediaListEntry?.createdAt
+ ? new Date(item.mediaListEntry?.createdAt * 1000).getFullYear() === selectedYear
+ : false) && item.mediaListEntry
+ ? item.mediaListEntry?.progress >= 1
+ : false) ||
+ (includeOngoingMediaFromPreviousYears
+ ? (item.mediaListEntry?.updatedAt
+ ? new Date(item.mediaListEntry?.updatedAt * 1000).getFullYear() === selectedYear
+ : false) && item.mediaListEntry
+ ? item.mediaListEntry?.status === 'CURRENT'
+ : false
+ : false))
+ )
+ .sort((a, b) => {
+ if (a.mediaListEntry?.score === undefined) return 1;
+ else if (b.mediaListEntry?.score === undefined) return -1;
+ else return b.mediaListEntry?.score - a.mediaListEntry?.score;
+ });
- /* eslint-disable @typescript-eslint/no-explicit-any */
- // const year = (statistic: { startYears: any }) =>
- // statistic.startYears.find((y: { startYear: number }) => y.startYear === 2023);
-
- const screenshot = async () => {
- let element = document.querySelector('#wrapped') as HTMLElement;
-
- if (element !== null) {
- domToBlob(element, {
- backgroundColor: transparency ? 'transparent' : lightTheme ? '#edf1f5' : '#0b1622',
- quality: 1,
- scale: 2,
- fetch: {
- requestInit: {
- mode: 'cors'
- },
- bypassingCache: true
- }
- }).then((blob) => {
- const downloadWrapper = document.createElement('a');
- // const wrappedImageButton = document.getElementById(
- // 'wrapped-image-download'
- // ) as HTMLAnchorElement;
- const image = document.createElement('img');
- const object = (window.URL || window.webkitURL || window || {}).createObjectURL(blob);
-
- // downloadWrapper.download = `due_dot_moe_wrapped_${dark ? 'dark' : 'light'}.png`;
- downloadWrapper.href = object;
- downloadWrapper.target = '_blank';
- image.src = object;
-
- downloadWrapper.appendChild(image);
-
- // if (wrappedImageButton !== null) {
- // wrappedImageButton.href = object;
- // }
-
- const wrappedFinal = document.getElementById('wrapped-final');
-
- if (wrappedFinal !== null) {
- wrappedFinal.innerHTML = '';
-
- wrappedFinal.appendChild(downloadWrapper);
-
- generated = true;
- }
-
- downloadWrapper.click();
- });
- }
- };
+ episodes = 0;
+ minutesWatched = 0;
+ chapters = 0;
+ dateTicked = false;
- // const abbreviate = (string: string, maxLength = 40, enabled = true) => {
- // if (!enabled) {
- // return string;
- // }
-
- // if (string.length <= maxLength) {
- // return string;
- // }
-
- // return string.slice(0, maxLength - 3) + ' …';
- // };
-
- const submitExcludedKeywords = () => {
- if (excludedKeywordsInput.length <= 0 && excludedKeywords.length > 0) {
- animeList = originalAnimeList;
- mangaList = originalMangaList;
- excludedKeywords = [];
- } else if (excludedKeywordsInput.length >= 0 && excludedKeywords.length <= 0) {
- originalAnimeList = animeList;
- originalMangaList = mangaList;
- }
+ for (const media of calculatedAnimeList) {
+ episodes += media.mediaListEntry?.progress || 0;
+ minutesWatched += (media.mediaListEntry?.progress || 0) * media.duration || 0;
+ }
- if (excludedKeywordsInput.length > 0)
- excludedKeywords = excludedKeywordsInput
- .split(',')
- .map((k) => k.trim())
- .filter((k) => k.length > 0);
- };
+ for (const media of calculatedMangaList) chapters += media.mediaListEntry?.progress || 0;
+};
+
+/* eslint-disable @typescript-eslint/no-explicit-any */
+// const year = (statistic: { startYears: any }) =>
+// statistic.startYears.find((y: { startYear: number }) => y.startYear === 2023);
+
+const screenshot = async () => {
+ let element = document.querySelector('#wrapped') as HTMLElement;
+
+ if (element !== null) {
+ domToBlob(element, {
+ backgroundColor: transparency ? 'transparent' : lightTheme ? '#edf1f5' : '#0b1622',
+ quality: 1,
+ scale: 2,
+ fetch: {
+ requestInit: {
+ mode: 'cors'
+ },
+ bypassingCache: true
+ }
+ }).then((blob) => {
+ const downloadWrapper = document.createElement('a');
+ // const wrappedImageButton = document.getElementById(
+ // 'wrapped-image-download'
+ // ) as HTMLAnchorElement;
+ const image = document.createElement('img');
+ const object = (window.URL || window.webkitURL || window || {}).createObjectURL(blob);
+
+ // downloadWrapper.download = `due_dot_moe_wrapped_${dark ? 'dark' : 'light'}.png`;
+ downloadWrapper.href = object;
+ downloadWrapper.target = '_blank';
+ image.src = object;
+
+ downloadWrapper.appendChild(image);
- const excludeKeywords = (media: Media[]) => {
- if (excludedKeywords.length <= 0) return media;
+ // if (wrappedImageButton !== null) {
+ // wrappedImageButton.href = object;
+ // }
- return media.filter((m) => {
- for (const keyword of excludedKeywords) {
- if (m.title.english?.toLowerCase().includes(keyword.toLowerCase())) return false;
- if (m.title.romaji?.toLowerCase().includes(keyword.toLowerCase())) return false;
- if (m.title.native?.toLowerCase().includes(keyword.toLowerCase())) return false;
+ const wrappedFinal = document.getElementById('wrapped-final');
+
+ if (wrappedFinal !== null) {
+ wrappedFinal.innerHTML = '';
+
+ wrappedFinal.appendChild(downloadWrapper);
+
+ generated = true;
}
- return true;
+ downloadWrapper.click();
});
- };
+ }
+};
+
+// const abbreviate = (string: string, maxLength = 40, enabled = true) => {
+// if (!enabled) {
+// return string;
+// }
+
+// if (string.length <= maxLength) {
+// return string;
+// }
+
+// return string.slice(0, maxLength - 3) + ' …';
+// };
+
+const submitExcludedKeywords = () => {
+ if (excludedKeywordsInput.length <= 0 && excludedKeywords.length > 0) {
+ animeList = originalAnimeList;
+ mangaList = originalMangaList;
+ excludedKeywords = [];
+ } else if (excludedKeywordsInput.length >= 0 && excludedKeywords.length <= 0) {
+ originalAnimeList = animeList;
+ originalMangaList = mangaList;
+ }
- const pruneFullYear = async () => {
- await database.activities.bulkDelete((await database.activities.toArray()).map((m) => m.page));
- };
+ if (excludedKeywordsInput.length > 0)
+ excludedKeywords = excludedKeywordsInput
+ .split(',')
+ .map((k) => k.trim())
+ .filter((k) => k.length > 0);
+};
+
+const excludeKeywords = (media: Media[]) => {
+ if (excludedKeywords.length <= 0) return media;
+
+ return media.filter((m) => {
+ for (const keyword of excludedKeywords) {
+ if (m.title.english?.toLowerCase().includes(keyword.toLowerCase())) return false;
+ if (m.title.romaji?.toLowerCase().includes(keyword.toLowerCase())) return false;
+ if (m.title.native?.toLowerCase().includes(keyword.toLowerCase())) return false;
+ }
- // const mergeArraySort = (a: any, b: any, mode: 'tags' | 'genres') => {
- // let merged = [...a, ...b].sort((a, b) => b.meanScore - a.meanScore);
-
- // merged = merged.filter(
- // (item, index, self) =>
- // self.findIndex((itemToCompare) =>
- // mode === 'genres'
- // ? itemToCompare.genre === item.genre
- // : itemToCompare.tag.name === item.tag.name
- // ) === index
- // );
-
- // return merged;
- // };
-
- // const randomCoverFromTop10 = (
- // statistics: { anime: any; manga: any },
- // mode: 'tags' | 'genres'
- // ) => {
- // const top = mergeArraySort(statistics.anime[mode], statistics.manga[mode], mode);
-
- // return mediaCover(top[Math.floor(Math.random() * top.length)].mediaIds[0]);
- // };
+ return true;
+ });
+};
+
+const pruneFullYear = async () => {
+ await database.activities.bulkDelete((await database.activities.toArray()).map((m) => m.page));
+};
+
+// const mergeArraySort = (a: any, b: any, mode: 'tags' | 'genres') => {
+// let merged = [...a, ...b].sort((a, b) => b.meanScore - a.meanScore);
+
+// merged = merged.filter(
+// (item, index, self) =>
+// self.findIndex((itemToCompare) =>
+// mode === 'genres'
+// ? itemToCompare.genre === item.genre
+// : itemToCompare.tag.name === item.tag.name
+// ) === index
+// );
+
+// return merged;
+// };
+
+// const randomCoverFromTop10 = (
+// statistics: { anime: any; manga: any },
+// mode: 'tags' | 'genres'
+// ) => {
+// const top = mergeArraySort(statistics.anime[mode], statistics.manga[mode], mode);
+
+// return mediaCover(top[Math.floor(Math.random() * top.length)].mediaIds[0]);
+// };
</script>
{#if $userIdentity.id === -2 || user === undefined}
diff --git a/src/lib/Tools/Wrapped/Top/Activity.svelte b/src/lib/Tools/Wrapped/Top/Activity.svelte
index ea6ba592..fdfd90e0 100644
--- a/src/lib/Tools/Wrapped/Top/Activity.svelte
+++ b/src/lib/Tools/Wrapped/Top/Activity.svelte
@@ -1,16 +1,16 @@
<script lang="ts">
- import type { ActivityHistoryEntry } from '$lib/Data/AniList/activity';
- import identity from '$stores/identity';
- import type { Wrapped } from '$lib/Data/AniList/wrapped';
- import proxy from '$lib/Utility/proxy';
+import type { ActivityHistoryEntry } from '$lib/Data/AniList/activity';
+import identity from '$stores/identity';
+import type { Wrapped } from '$lib/Data/AniList/wrapped';
+import proxy from '$lib/Utility/proxy';
- export let wrapped: Wrapped;
- export let year: number;
- export let activities: ActivityHistoryEntry[];
- export let useFullActivityHistory: boolean;
- export let updateWidth: () => void;
+export let wrapped: Wrapped;
+export let year: number;
+export let activities: ActivityHistoryEntry[];
+export let useFullActivityHistory: boolean;
+export let updateWidth: () => void;
- const currentYear = new Date(Date.now()).getFullYear();
+const currentYear = new Date(Date.now()).getFullYear();
</script>
<div class="grid-item image-grid avatar-grid category top-category">
diff --git a/src/lib/Tools/Wrapped/Top/Anime.svelte b/src/lib/Tools/Wrapped/Top/Anime.svelte
index 08df7fd3..6caf4b8a 100644
--- a/src/lib/Tools/Wrapped/Top/Anime.svelte
+++ b/src/lib/Tools/Wrapped/Top/Anime.svelte
@@ -1,9 +1,9 @@
<script lang="ts">
- import type { Media } from '$lib/Data/AniList/media';
+import type { Media } from '$lib/Data/AniList/media';
- export let minutesWatched: number;
- export let animeList: Media[] | undefined;
- export let episodes: number;
+export let minutesWatched: number;
+export let animeList: Media[] | undefined;
+export let episodes: number;
</script>
<div class="category-grid pure-category category top-category">
diff --git a/src/lib/Tools/Wrapped/Top/Manga.svelte b/src/lib/Tools/Wrapped/Top/Manga.svelte
index a36f7724..9fa4ab00 100644
--- a/src/lib/Tools/Wrapped/Top/Manga.svelte
+++ b/src/lib/Tools/Wrapped/Top/Manga.svelte
@@ -1,9 +1,9 @@
<script lang="ts">
- import type { Media } from '$lib/Data/AniList/media';
- import { estimatedDayReading } from '$lib/Media/Manga/time';
+import type { Media } from '$lib/Data/AniList/media';
+import { estimatedDayReading } from '$lib/Media/Manga/time';
- export let mangaList: Media[] | undefined;
- export let chapters: number;
+export let mangaList: Media[] | undefined;
+export let chapters: number;
</script>
<div class="category-grid pure-category category top-category">