private async Task SaveMediaList(PlexPayload payload, Media anime) { var mutation = @" mutation($mediaId: Int, $status: MediaListStatus, $progress: Int, $score: Float, $startedAt: FuzzyDateInput, $completedAt: FuzzyDateInput){ SaveMediaListEntry (mediaId: $mediaId, status: $status, progress: $progress, score: $score, startedAt: $startedAt, completedAt: $completedAt) { id status } } "; var variables = new QueryVariables(); variables.MediaId = anime.Id; if (!string.IsNullOrEmpty(payload.Rating)) { variables.Score = int.Parse(payload.Rating); } else { var isMovie = payload.Metadata.Type == "movie"; var isCompleted = isMovie ? true : payload.Metadata.Index == anime.Episodes; variables.Status = isCompleted ? MediaListStatus.COMPLETED : MediaListStatus.CURRENT; if (!isCompleted) { variables.Progress = payload.Metadata.Index; } } var queryBody = new QueryBody(mutation, variables); await QueryAnilist(queryBody); }
public async Task Sync(PlexPayload payload) { var anime = await SearchAnilist(payload); if (anime == null) { return; } await UpdateAniList(payload, anime); }
private async Task UpdateAniList(PlexPayload payload, Media anime) { var userId = await GetUser(); if (!userId.HasValue) { return; } var mediaListMatch = await SearchMediaList(userId.Value, anime); if (string.IsNullOrEmpty(payload.Rating) && mediaListMatch != null && mediaListMatch.Status == MediaListStatus.COMPLETED) { return; } await SaveMediaList(payload, anime); }
public async Task <IActionResult> Post(PlexPayload payload) { if (payload.Event != "media.scrobble" && payload.Event != "media.rate") { return(Ok()); } var animeLibraryTitle = _config.GetValue <string>("animeLibraryTitle"); var animeMovieLibraryTitle = _config.GetValue <string>("animeMovieLibraryTitle"); if (payload.Metadata.LibrarySectionTitle != animeLibraryTitle && payload.Metadata.LibrarySectionTitle != animeMovieLibraryTitle) { return(Ok()); } await _anilistService.Sync(payload); return(Ok()); }
private async Task <Media> SearchAnilist(PlexPayload payload) { var query = @" query($search:String, $seasonYear: Int, $format: MediaFormat){ Page (page: 1, perPage: 1) { pageInfo { total currentPage lastPage hasNextPage perPage } media(search:$search, seasonYear:$seasonYear, format: $format, type:ANIME){ id title { romaji } episodes } } } "; if (string.IsNullOrEmpty(payload.Metadata.GrandparentTitle)) { payload.Metadata.GrandparentTitle = null; } var variables = new QueryVariables { Search = payload.Metadata.GrandparentTitle ?? payload.Metadata.ParentTitle ?? payload.Metadata.Title, SeasonYear = payload.Metadata.Year, Format = payload.Metadata.Type == "movie" ? MediaFormat.MOVIE : MediaFormat.TV }; var queryBody = new QueryBody(query, variables); var responseData = await QueryAnilist(queryBody); var anilistReturnData = AnlistReturnData.FromJson(responseData); return(anilistReturnData.Data.Page?.Media?.FirstOrDefault()); }