added ability to update simkl episode count

This commit is contained in:
John O'Keefe 2024-08-11 12:20:26 -04:00
parent aaf0f421f2
commit 8a6b3bd2b7
8 changed files with 190 additions and 45 deletions

View File

@ -3,7 +3,6 @@ package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"log"
"net/http"
@ -455,8 +454,6 @@ func (a *App) AniListUpdateEntry(
returnedBody, _ := AniListQuery(body, true)
fmt.Println(string(returnedBody))
var post interface{}
err := json.Unmarshal(returnedBody, &post)
if err != nil {

View File

@ -1,6 +1,7 @@
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
@ -37,3 +38,78 @@ func (a *App) SimklGetUserWatchlist() SimklWatchList {
return watchlist
}
func SimklPostHelper(url string, body interface{}) json.RawMessage {
reader, _ := json.Marshal(body)
client := &http.Client{}
req, _ := http.NewRequest("POST", url, bytes.NewBuffer(reader))
req.Header.Add("Content-Type", "application/json")
req.Header.Add("Authorization", "Bearer "+simklJwt.AccessToken)
req.Header.Add("simkl-api-key", os.Getenv("SIMKL_CLIENT_ID"))
resp, err := client.Do(req)
if err != nil {
fmt.Println("Errored when sending request to the server")
message, _ := json.Marshal(struct {
Message string `json:"message" ts_type:"message"`
}{
Message: "Errored when sending request to the server" + err.Error(),
})
return message
}
defer resp.Body.Close()
respBody, _ := io.ReadAll(resp.Body)
return respBody
}
func (a *App) SimklSyncEpisodes(anime Anime, progress int) interface{} {
var episodes []Episode
var url string
var shows []SimklPostShow
if progress >= anime.WatchedEpisodesCount {
for i := 1; i <= progress; i++ {
episodes = append(episodes, Episode{Number: i})
}
url = "https://api.simkl.com/sync/history"
} else {
for i := anime.WatchedEpisodesCount; i > progress; i-- {
episodes = append(episodes, Episode{Number: i})
}
url = "https://api.simkl.com/sync/history/remove"
}
formattedShow := SimklPostShow{
Title: anime.Show.Title,
Ids: Ids{
Simkl: anime.Show.Ids.Simkl,
Mal: anime.Show.Ids.Mal,
Anilist: anime.Show.Ids.AniList,
},
Episodes: episodes,
}
shows = append(shows, formattedShow)
simklSync := SimklSyncHistoryType{shows}
respBody := SimklPostHelper(url, simklSync)
var success interface{}
err := json.Unmarshal(respBody, &success)
if err != nil {
log.Printf("Failed at unmarshal, %s\n", err)
}
return success
}

View File

@ -27,42 +27,64 @@ type SimklUser struct {
}
type SimklWatchList struct {
Anime []struct {
LastWatchedAt string `json:"last_watched_at" ts_type:"last_watched_at"`
Status string `json:"status" ts_type:"status"`
UserRating float64 `json:"user_rating" ts_type:"user_rating"`
LastWatched string `json:"last_watched" ts_type:"last_watched"`
NextToWatch string `json:"next_to_watch" ts_type:"next_to_watch"`
WatchedEpisodesCount int `json:"watched_episodes_count" ts_type:"watched_episodes_count"`
TotalEpisodesCount int `json:"total_episodes_count" ts_type:"total_episodes_count"`
NotAiredEpisodesCount int `json:"not_aired_episodes_count" ts_type:"not_aired_episodes_count"`
Show struct {
Title string `json:"title" ts_type:"title"`
Poster string `json:"poster" ts_type:"poster"`
Ids struct {
Simkl int `json:"simkl" ts_type:"simkl"`
Slug string `json:"slug" ts_type:"slug"`
OffJp string `json:"offjp" ts_type:"offjp"`
TW string `json:"tw" ts_type:"tw"`
ANN string `json:"ann" ts_type:"ann"`
Mal string `json:"mal" ts_type:"mal"`
Wikien string `json:"wikien" ts_type:"wikien"`
WikiJp string `json:"wikijp" ts_type:"wikijp"`
AllCin string `json:"allcin" ts_type:"allcin"`
IMDB string `json:"imdb" ts_type:"imdb"`
TMDB string `json:"tmdb" ts_type:"tmdb"`
Offen string `json:"offen" ts_type:"offen"`
Crunchyroll string `json:"crunchyroll" ts_type:"crunchyroll"`
TVDBSlug string `json:"tvdbslug" ts_type:"tvdbslug"`
AniList string `json:"anilist" ts_type:"anilist"`
AnimePlanet string `json:"animeplanet" ts_type:"animeplanet"`
AniSearch string `json:"anisearch" ts_type:"anisearch"`
Kitsu string `json:"kitsu" ts_type:"kitsu"`
LiveChart string `json:"livechart" ts_type:"livechart"`
TraktSlug string `json:"traktslug" ts_type:"traktslug"`
AniDB string `json:"anidb" ts_type:"anidb"`
} `json:"ids" ts_type:"ids"`
} `json:"show" ts_type:"show"`
AnimeType string `json:"anime_type" ts_type:"anime_type"`
} `json:"anime" ts_type:"anime"`
Anime []Anime `json:"anime" ts_type:"anime"`
}
type Anime struct {
LastWatchedAt string `json:"last_watched_at" ts_type:"last_watched_at"`
Status string `json:"status" ts_type:"status"`
UserRating float64 `json:"user_rating" ts_type:"user_rating"`
LastWatched string `json:"last_watched" ts_type:"last_watched"`
NextToWatch string `json:"next_to_watch" ts_type:"next_to_watch"`
WatchedEpisodesCount int `json:"watched_episodes_count" ts_type:"watched_episodes_count"`
TotalEpisodesCount int `json:"total_episodes_count" ts_type:"total_episodes_count"`
NotAiredEpisodesCount int `json:"not_aired_episodes_count" ts_type:"not_aired_episodes_count"`
Show struct {
Title string `json:"title" ts_type:"title"`
Poster string `json:"poster" ts_type:"poster"`
Ids struct {
Simkl int `json:"simkl" ts_type:"simkl"`
Slug string `json:"slug" ts_type:"slug"`
OffJp string `json:"offjp" ts_type:"offjp"`
TW string `json:"tw" ts_type:"tw"`
ANN string `json:"ann" ts_type:"ann"`
Mal string `json:"mal" ts_type:"mal"`
Wikien string `json:"wikien" ts_type:"wikien"`
WikiJp string `json:"wikijp" ts_type:"wikijp"`
AllCin string `json:"allcin" ts_type:"allcin"`
IMDB string `json:"imdb" ts_type:"imdb"`
TMDB string `json:"tmdb" ts_type:"tmdb"`
Offen string `json:"offen" ts_type:"offen"`
Crunchyroll string `json:"crunchyroll" ts_type:"crunchyroll"`
TVDBSlug string `json:"tvdbslug" ts_type:"tvdbslug"`
AniList string `json:"anilist" ts_type:"anilist"`
AnimePlanet string `json:"animeplanet" ts_type:"animeplanet"`
AniSearch string `json:"anisearch" ts_type:"anisearch"`
Kitsu string `json:"kitsu" ts_type:"kitsu"`
LiveChart string `json:"livechart" ts_type:"livechart"`
TraktSlug string `json:"traktslug" ts_type:"traktslug"`
AniDB string `json:"anidb" ts_type:"anidb"`
} `json:"ids" ts_type:"ids"`
} `json:"show" ts_type:"show"`
AnimeType string `json:"anime_type" ts_type:"anime_type"`
}
type SimklSyncHistoryType struct {
Shows []SimklPostShow `json:"shows" ts_type:"shows"`
}
type SimklPostShow struct {
Title string `json:"title" ts_type:"title"`
Ids `json:"ids" ts_type:"ids"`
Episodes []Episode `json:"episodes" ts_type:"episodes"`
}
type Episode struct {
Number int `json:"number" ts_type:"number"`
}
type Ids struct {
Simkl int `json:"simkl" ts_type:"simkl"`
Mal string `json:"mal" ts_type:"mal"`
Anilist string `json:"anilist" ts_type:"anilist"`
}

View File

@ -5,12 +5,12 @@ meta {
}
get {
url: https://api.simkl.com/search/id?client_id={{SIMKL_CLIENT_ID}}&mal=52991
url: https://api.simkl.com/search/id?client_id={{SIMKL_CLIENT_ID}}&simkl=2307708
body: none
auth: none
}
params:query {
client_id: {{SIMKL_CLIENT_ID}}
mal: 52991
simkl: 2307708
}

View File

@ -14,16 +14,23 @@
import { writable } from 'svelte/store';
import type {SimklAnime} from "./simkl/types/simklTypes";
import { get } from 'svelte/store';
import {AniListUpdateEntry} from "../wailsjs/go/main/App";
import {AniListUpdateEntry, SimklSyncEpisodes} from "../wailsjs/go/main/App";
const simklWatch = get(simklWatchList);
let isAniListLoggedIn: boolean
let isSimklLoggedIn: boolean
let simklAnimeIndex: number
let simklAnime: SimklAnime | undefined = undefined
aniListLoggedIn.subscribe((value) => isAniListLoggedIn = value)
simklLoggedIn.subscribe((value) => isSimklLoggedIn = value)
const simklAnime: SimklAnime | undefined = simklWatch.anime.filter((x) => Number(x.show.ids.mal) === aniListAnime.data.MediaList.media.idMal)[0]
for (let i = 0; i < simklWatch.anime.length; i++) {
if (Number(simklWatch.anime[i].show.ids.mal) === aniListAnime.data.MediaList.media.idMal) {
simklAnimeIndex = i
simklAnime = simklWatch.anime[i]
}
}
let items = [];
@ -204,6 +211,13 @@
console.log(value)
})
if (simklLoggedIn && simklAnime.watched_episodes_count !== values.progress) {
await SimklSyncEpisodes(simklAnime, values.progress).then(value => {
console.log(value)
simklAnime.watched_episodes_count = values.progress
simklWatch.anime[simklAnimeIndex].watched_episodes_count = values.progress
})
}
}
</script>

View File

@ -23,3 +23,5 @@ export function GetSimklLoggedInUser():Promise<main.SimklUser>;
export function SimklGetUserWatchlist():Promise<main.SimklWatchList>;
export function SimklLogin():Promise<void>;
export function SimklSyncEpisodes(arg1:main.Anime,arg2:number):Promise<any>;

View File

@ -45,3 +45,7 @@ export function SimklGetUserWatchlist() {
export function SimklLogin() {
return window['go']['main']['App']['SimklLogin']();
}
export function SimklSyncEpisodes(arg1, arg2) {
return window['go']['main']['App']['SimklSyncEpisodes'](arg1, arg2);
}

View File

@ -91,6 +91,36 @@ export namespace main {
return a;
}
}
export class Anime {
last_watched_at: last_watched_at;
status: status;
user_rating: user_rating;
last_watched: last_watched;
next_to_watch: next_to_watch;
watched_episodes_count: watched_episodes_count;
total_episodes_count: total_episodes_count;
not_aired_episodes_count: not_aired_episodes_count;
show: show;
anime_type: anime_type;
static createFrom(source: any = {}) {
return new Anime(source);
}
constructor(source: any = {}) {
if ('string' === typeof source) source = JSON.parse(source);
this.last_watched_at = source["last_watched_at"];
this.status = source["status"];
this.user_rating = source["user_rating"];
this.last_watched = source["last_watched"];
this.next_to_watch = source["next_to_watch"];
this.watched_episodes_count = source["watched_episodes_count"];
this.total_episodes_count = source["total_episodes_count"];
this.not_aired_episodes_count = source["not_aired_episodes_count"];
this.show = source["show"];
this.anime_type = source["anime_type"];
}
}
export class MediaList {
id: number;
mediaId: number;