From 8a6b3bd2b718723ae708393f96314277a876b2bb Mon Sep 17 00:00:00 2001 From: John O'Keefe Date: Sun, 11 Aug 2024 12:20:26 -0400 Subject: [PATCH] added ability to update simkl episode count --- AniListFunctions.go | 3 - SimklFunctions.go | 76 ++++++++++++++ SimklTypes.go | 98 ++++++++++++------- .../Simkl/Get Items/Search By MalID.bru | 4 +- frontend/src/ChangeDataDialogue.svelte | 18 +++- frontend/wailsjs/go/main/App.d.ts | 2 + frontend/wailsjs/go/main/App.js | 4 + frontend/wailsjs/go/models.ts | 30 ++++++ 8 files changed, 190 insertions(+), 45 deletions(-) diff --git a/AniListFunctions.go b/AniListFunctions.go index 38fb18b..6a7e233 100644 --- a/AniListFunctions.go +++ b/AniListFunctions.go @@ -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 { diff --git a/SimklFunctions.go b/SimklFunctions.go index 4ad16f3..c2fa5d1 100644 --- a/SimklFunctions.go +++ b/SimklFunctions.go @@ -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 +} diff --git a/SimklTypes.go b/SimklTypes.go index 0df05a5..e9dcf3c 100644 --- a/SimklTypes.go +++ b/SimklTypes.go @@ -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"` } diff --git a/bruno/AniTrack/Simkl/Get Items/Search By MalID.bru b/bruno/AniTrack/Simkl/Get Items/Search By MalID.bru index 0358c3d..d10d297 100644 --- a/bruno/AniTrack/Simkl/Get Items/Search By MalID.bru +++ b/bruno/AniTrack/Simkl/Get Items/Search By MalID.bru @@ -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 } diff --git a/frontend/src/ChangeDataDialogue.svelte b/frontend/src/ChangeDataDialogue.svelte index 2c22879..f66dc97 100644 --- a/frontend/src/ChangeDataDialogue.svelte +++ b/frontend/src/ChangeDataDialogue.svelte @@ -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 + }) + } } diff --git a/frontend/wailsjs/go/main/App.d.ts b/frontend/wailsjs/go/main/App.d.ts index 8633d24..f1f3bf2 100755 --- a/frontend/wailsjs/go/main/App.d.ts +++ b/frontend/wailsjs/go/main/App.d.ts @@ -23,3 +23,5 @@ export function GetSimklLoggedInUser():Promise; export function SimklGetUserWatchlist():Promise; export function SimklLogin():Promise; + +export function SimklSyncEpisodes(arg1:main.Anime,arg2:number):Promise; diff --git a/frontend/wailsjs/go/main/App.js b/frontend/wailsjs/go/main/App.js index 06ac105..6a05b5e 100755 --- a/frontend/wailsjs/go/main/App.js +++ b/frontend/wailsjs/go/main/App.js @@ -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); +} diff --git a/frontend/wailsjs/go/models.ts b/frontend/wailsjs/go/models.ts index 6d559c6..f2554f0 100755 --- a/frontend/wailsjs/go/models.ts +++ b/frontend/wailsjs/go/models.ts @@ -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;