public async Task <MetadataResult <Episode> > GetMetadata(EpisodeInfo info, CancellationToken cancellationToken) { try { var result = new MetadataResult <Episode>(); var config = Plugin.Instance.Configuration; Ordering.GroupFilterType?filterByType = config.SeriesGrouping == Ordering.GroupType.ShokoGroup ? config.FilterOnLibraryTypes ? Ordering.GroupFilterType.Others : Ordering.GroupFilterType.Default : null; var(file, episode, series, group) = await ApiManager.GetFileInfoByPath(info.Path, filterByType); // if file is null then series and episode is also null. if (file == null) { Logger.LogWarning($"Unable to find file info for path {info.Path}"); return(result); } Logger.LogInformation($"Found file info for path {info.Path}"); string displayTitle, alternateTitle; if (series.AniDB.Type == API.Models.SeriesType.Movie) { (displayTitle, alternateTitle) = Text.GetMovieTitles(series.AniDB.Titles, episode.AniDB.Titles, series.Shoko.Name, episode.Shoko.Name, info.MetadataLanguage); } else { (displayTitle, alternateTitle) = Text.GetEpisodeTitles(series.AniDB.Titles, episode.AniDB.Titles, episode.Shoko.Name, info.MetadataLanguage); } if (group != null && episode.AniDB.Type != EpisodeType.Normal && config.MarkSpecialsWhenGrouped) { displayTitle = $"SP {episode.AniDB.EpisodeNumber} {displayTitle}"; alternateTitle = $"SP {episode.AniDB.EpisodeNumber} {alternateTitle}"; } result.Item = new Episode { IndexNumber = Ordering.GetIndexNumber(series, episode), ParentIndexNumber = Ordering.GetSeasonNumber(group, series, episode), Name = displayTitle, OriginalTitle = alternateTitle, PremiereDate = episode.AniDB.AirDate, Overview = Text.SanitizeTextSummary(episode.AniDB.Description), CommunityRating = (float)((episode.AniDB.Rating.Value * 10) / episode.AniDB.Rating.MaxValue) }; // NOTE: This next line will remain here till they fix the series merging for providers outside the MetadataProvider enum. result.Item.SetProviderId(MetadataProvider.Imdb, $"INVALID-BUT-DO-NOT-TOUCH:{episode.Id}"); result.Item.SetProviderId("Shoko Episode", episode.Id); result.Item.SetProviderId("Shoko File", file.Id); if (config.AddAniDBId) { result.Item.SetProviderId("AniDB", episode.AniDB.ID.ToString()); } result.HasMetadata = true; ApiManager.MarkEpisodeAsFound(episode.Id, series.Id); var episodeNumberEnd = episode.AniDB.EpisodeNumber + file.EpisodesCount; if (episode.AniDB.EpisodeNumber != episodeNumberEnd) { result.Item.IndexNumberEnd = episodeNumberEnd; } return(result); } catch (Exception e) { Logger.LogError(e, $"Threw unexpectedly; {e.Message}"); return(new MetadataResult <Episode>()); } }