16 Commits

Author SHA1 Message Date
5c4caf68e6 added tooltip and version change 2025-06-22 21:08:56 -04:00
c10e853564 updated minor version for tag fix 2025-06-06 23:25:24 -04:00
cd043d093f fixed issue where tags would not reload after submit 2025-06-06 23:25:08 -04:00
6db01f7f9f added tags to frontend anime item 2025-05-14 14:31:43 -04:00
8460d56d55 created simple linux install script for AniTrack 2025-05-07 10:03:58 -04:00
8fedbe4607 created xdg icon set instead of one big icon 2025-05-07 10:03:37 -04:00
e069c47242 automated adding anime by moving progress from 0 to 1 2025-03-30 10:03:05 -04:00
aba0f2d1d5 removed console.log 2025-03-30 10:02:38 -04:00
af6cb7f08a removed unecessary button dependency and neovim reformatted 2025-03-30 09:52:46 -04:00
487e5ee5a8 upped version for automation 2025-03-26 19:36:20 -04:00
631bd8b885 made increment and decrement buttons automate status and datecompleted 2025-03-26 19:35:08 -04:00
b35be6926a rename code to ANILIST_CODE in environment 2025-03-16 13:51:00 -04:00
5a9f4391dc changed flowbite button to standard button 2025-03-03 19:53:18 -05:00
72004c98b4 fixed button colors 2025-03-03 17:27:39 -05:00
3db25bc33a restored status block 2025-03-03 16:13:01 -05:00
f3a1536953 updated version for visual corrections and library updtae 2025-03-03 15:44:05 -05:00
11 changed files with 214 additions and 105 deletions

View File

@@ -12,7 +12,7 @@ post {
headers {
Accept: application/json
Content-Type: application/json
Content-Type: application/x-www-form-urlencoded
}
body:form-urlencoded {
@@ -20,7 +20,7 @@ body:form-urlencoded {
client_id: {{ANILIST_APP_ID}}
client_secret: {{ANILIST_SECRET_TOKEN}}
redirect_uri: http://localhost:6734/callback
code: {{code}}
code: {{ANILIST_CODE}}
}
body:multipart-form {

View File

@@ -9,7 +9,7 @@ vars {
}
vars:secret [
ANILIST_ACCESS_TOKEN,
code,
ANILIST_CODE,
SIMKL_AUTH_TOKEN,
MAL_CODE,
MAL_VERIFIER,

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

BIN
build/icon/128/AniTrack.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

BIN
build/icon/32/AniTrack.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
build/icon/48/AniTrack.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

BIN
build/icon/64/AniTrack.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

26
build/install_linux.sh Executable file
View File

@@ -0,0 +1,26 @@
#!/bin/bash
# copy desktop file
if [ -e "~/.local/share/applications/AniTrack.desktop" ]; then
if [ -d "~/.local/share/applications/" ]; then
cp ./AniTrack.desktop ~/.local/share/applications/
else
mkdir -p ~/.local/share/applications/
cp ./AniTrack.desktop ~/.local/share/applications/
fi
fi
# copy icons to xdg folders
for size in 32 48 64 128; do
xdg-icon-resource install --novendor --context apps --size $size ./icon/$size/AniTrack.png AniTrack
done
# copy AniTrack Binary to $HOME/Applications/
if ! [ -d "~/Applications" ]; then
mkdir -p ~/Applications
cp ./bin/AniTrack ~/Applications/
elif ! [[ -e ~/Applications/AniTrack ]]; then
cp ./bin/AniTrack ~/Applications/
fi
echo "AniTrack has been successfully installed."

View File

@@ -1,80 +1,93 @@
export interface AniListCurrentUserWatchList {
data: {
Page: {
pageInfo: {
total: number
perPage: number
currentPage: number
lastPage: number
hasNextPage: boolean
},
mediaList: MediaList[]
}
}
data: {
Page: {
pageInfo: {
total: number;
perPage: number;
currentPage: number;
lastPage: number;
hasNextPage: boolean;
};
mediaList: MediaList[];
};
};
}
export interface AniListGetSingleAnime {
data: {
MediaList: MediaList
}
data: {
MediaList: MediaList;
};
}
export interface MediaList {
id: number
mediaId: number
userId: number
media: {
id: number
idMal: number
title: {
romaji: string
english?: string
native: string
}
description: string
coverImage: {
large: string
}
season: string
seasonYear: number
status: string
episodes?: number
nextAiringEpisode?: {
airingAt: number
timeUntilAiring: number
episode: number
}
}
status: string
startedAt: {
year: number
month: number
day: number
}
completedAt: {
year?: number
month?: number
day?: number
}
notes?: string
progress: number
score: number
repeat: number
user: {
id: number
name: string
avatar: {
large: string
medium: string
}
statistics: {
anime: {
count: number
statuses: [{
status: string
count: number
}]
}
}
}
}
id: number;
mediaId: number;
userId: number;
media: {
id: number;
idMal: number;
title: {
romaji: string;
english?: string;
native: string;
};
description: string;
coverImage: {
large: string;
};
season: string;
seasonYear: number;
status: string;
episodes?: number;
nextAiringEpisode?: {
airingAt: number;
timeUntilAiring: number;
episode: number;
};
tags: [
{
id: number;
name: string;
description: string;
rank: number;
isMediaSpoiler: boolean;
isAdult: boolean;
},
];
isAdult: boolean;
};
status: string;
startedAt: {
year: number;
month: number;
day: number;
};
completedAt: {
year?: number;
month?: number;
day?: number;
};
notes?: string;
progress: number;
score: number;
repeat: number;
user: {
id: number;
name: string;
avatar: {
large: string;
medium: string;
};
statistics: {
anime: {
count: number;
statuses: [
{
status: string;
count: number;
},
];
};
};
};
}

View File

@@ -8,7 +8,6 @@
simklLoggedIn,
} from "../helperModules/GlobalVariablesAndHelperFunctions.svelte";
import { push } from "svelte-spa-router";
import { Button } from "flowbite-svelte";
import type { AniListGetSingleAnime } from "../anilist/types/AniListCurrentUserWatchListType";
import Rating from "./Rating.svelte";
import {
@@ -28,10 +27,7 @@
StatusOptions,
} from "../helperTypes/StatusTypes";
import type { AniListUpdateVariables } from "../anilist/types/AniListTypes";
import {
convertDateStringToAniList,
convertDateToAniList,
} from "../helperFunctions/convertDateToAniList";
import { convertDateToAniList } from "../helperFunctions/convertDateToAniList";
import {
AniListDeleteEntry,
AniListUpdateEntry,
@@ -45,6 +41,7 @@
import { AddAnimeServiceToTable } from "../helperModules/AddAnimeServiceToTable.svelte";
import { CheckIfAniListLoggedInAndLoadWatchList } from "../helperModules/CheckIfAniListLoggedInAndLoadWatchList.svelte";
import Datepicker from "./Datepicker.svelte";
import {Badge, Tooltip} from "flowbite-svelte";
const re = /^([0-9]{4})-([0-9]{2})-([0-9]{2})/;
let isAniListLoggedIn: boolean;
@@ -216,9 +213,8 @@
};
await AniListUpdateEntry(body).then(
(value: AniListGetSingleAnime) => {
/* TODO in future when you inevitably add tags to typescript, until Anilist fixes the api bug
where tags break the SaveMediaListEntry return, you'll want to use this delete line
delete value.data.MediaList.media.tags */
value.data.MediaList.media.tags =
currentAniListAnime.data.MediaList.media.tags;
aniListAnime.update((newValue) => {
newValue = value;
return newValue;
@@ -479,8 +475,23 @@
type="button"
id="decrement-button"
data-input-counter-decrement="quantity-input"
on:click={() =>
(currentAniListAnime.data.MediaList.progress -= 1)}
on:click={() => {
currentAniListAnime.data.MediaList.progress -= 1;
if (
currentAniListAnime.data.MediaList
.progress <
currentAniListAnime.data.MediaList.media
.episodes
) {
startingAnilistStatusOption =
statusOptions[0];
if (
currentAniListAnime.data.MediaList
.repeat === 0
)
completedAtDate = null;
}
}}
class="bg-gray-700 hover:bg-gray-600 border-gray-600 border rounded-s-lg p-3 h-11 focus:ring-gray-700 focus:ring-2 focus:outline-none"
>
<svg
@@ -529,8 +540,29 @@
type="button"
id="increment-button"
data-input-counter-increment="quantity-input"
on:click={() =>
(currentAniListAnime.data.MediaList.progress += 1)}
on:click={() => {
currentAniListAnime.data.MediaList.progress += 1;
if (
currentAniListAnime.data.MediaList.media
.episodes ===
currentAniListAnime.data.MediaList.progress
) {
startingAnilistStatusOption =
statusOptions[2];
completedAtDate = new Date();
}
if (
currentAniListAnime.data.MediaList
.progress -
1 ===
0
) {
startingAnilistStatusOption =
statusOptions[0];
if (startedAtDate === null)
startedAtDate = new Date();
}
}}
class="bg-gray-700 hover:bg-gray-600 border-gray-600 border rounded-e-lg p-3 h-11 focus:ring-gray-700 focus:ring-2 focus:outline-none"
>
<svg
@@ -564,8 +596,25 @@
</div>
{/if}
</div>
<div>
<label
for="status"
class="text-left block mb-2 text-sm font-medium text-white"
>Status</label
>
<select
id="status"
name="status"
class="border text-sm rounded-lg
block p-2.5 bg-gray-700 border-gray-600 placeholder-gray-400
text-white focus:ring-blue-500 focus:border-blue-500"
bind:value={startingAnilistStatusOption}
>
{#each statusOptions as option}
<option value={option}>{option.aniList}</option>
{/each}
</select>
</div>
</div>
<div
class="flex flex-col md:flex-row md:pl-10 md:pr-10 pt-5 pb-5 justify-center md:gap-x-16 lg:gap-x-36"
@@ -649,7 +698,7 @@
<div
class="w-full mx-auto max-w-screen-xl p-4 md:flex md:items-center md:justify-end"
>
<Button
<button
disabled={isSubmitting}
id="sync-button"
class="text-white {$submitSuccess
@@ -678,8 +727,8 @@
/>
</svg>
Sync Changes
</Button>
<Button
</button>
<button
class="text-white bg-gray-800 border border-gray-600 focus:outline-none hover:bg-gray-700 focus:ring-4
focus:ring-gray-700 font-medium rounded-lg text-sm px-5 py-2.5 me-2 mb-2
hover:border-gray-600"
@@ -689,7 +738,7 @@
}}
>
Go Home
</Button>
</button>
</div>
</div>
<AnimeTable />
@@ -698,10 +747,10 @@
<div
class="w-full mx-auto max-w-screen-xl p-4 md:flex md:items-center md:justify-start"
>
<Button
<button
disabled={isSubmitting}
id="delete-button"
class="text-white bg-red-700 {$submitSuccess
class="text-white {$submitSuccess
? 'bg-green-600 hover:bg-green-700 focus:ring-4 focus:ring-green-800'
: 'bg-red-600 hover:bg-red-700 focus:ring-4 focus:ring-red-800'} font-medium rounded-lg text-sm px-5 py-2.5 me-2 mb-2 focus:outline-none"
on:click={deleteEntries}
@@ -727,12 +776,12 @@
/>
</svg>
Delete Entries
</Button>
</button>
</div>
<div
class="w-full mx-auto max-w-screen-xl p-4 md:flex md:items-center md:justify-end"
>
<Button
<button
disabled={isSubmitting}
id="sync-button"
class="text-white {$submitSuccess
@@ -761,8 +810,8 @@
/>
</svg>
Sync Changes
</Button>
<Button
</button>
<button
class="text-white bg-gray-800 border border-gray-600 focus:outline-none hover:bg-gray-700 focus:ring-4
focus:ring-gray-700 font-medium rounded-lg text-sm px-5 py-2.5 me-2 mb-2
hover:border-gray-600"
@@ -772,12 +821,33 @@
}}
>
Go Home
</Button>
</button>
</div>
</div>
<div>
<h3 class="text-2xl">Summary</h3>
<p>{@html currentAniListAnime.data.MediaList.media.description}</p>
<div class="flex m-5">
<div>
<h3 class="text-2xl">Tags</h3>
<div class="mt-2">
{#each currentAniListAnime.data.MediaList.media.tags as tag}
<div>
<Badge large border color="blue" class="m-1 w-52">
<div>
{tag.name} -
<span class="text-xs">{tag.rank}%</span>
</div>
</Badge>
<Tooltip>{tag.description}</Tooltip>
</div>
{/each}
</div>
</div>
<div class="ml-5">
<h3 class="text-2xl">Summary</h3>
<p class="rounded border border-gray-700 p-2 mt-2">
{@html currentAniListAnime.data.MediaList.media.description}
</p>
</div>
</div>
</form>

View File

@@ -12,6 +12,6 @@
},
"info": {
"productName": "AniTrack",
"productVersion": "0.1.6"
"productVersion": "0.2.1"
}
}