コード例 #1
0
        public async Task <MetadataResult <Movie> > GetMetadata(MovieInfo info, CancellationToken cancellationToken)
        {
            try {
                var result = new MetadataResult <Movie>();

                var includeGroup = Plugin.Instance.Configuration.BoxSetGrouping == Ordering.GroupType.ShokoGroup;
                var config       = Plugin.Instance.Configuration;
                Ordering.GroupFilterType?filterByType = config.SeriesGrouping == Ordering.GroupType.ShokoGroup ? config.FilterOnLibraryTypes ? Ordering.GroupFilterType.Movies : 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);
                }

                bool isMultiEntry = series.Shoko.Sizes.Total.Episodes > 1;

                var tags = await ApiManager.GetTags(series.Id);

                var(displayTitle, alternateTitle) = Text.GetMovieTitles(series.AniDB.Titles, episode.AniDB.Titles, series.Shoko.Name, episode.Shoko.Name, info.MetadataLanguage);
                var rating = isMultiEntry ? episode.AniDB.Rating.ToFloat(10) : series.AniDB.Rating.ToFloat(10);

                result.Item = new Movie {
                    IndexNumber   = Ordering.GetMovieIndexNumber(group, series, episode),
                    Name          = displayTitle,
                    OriginalTitle = alternateTitle,
                    PremiereDate  = episode.AniDB.AirDate,
                    // Use the file description if collection contains more than one movie, otherwise use the collection description.
                    Overview        = Text.SanitizeTextSummary((isMultiEntry ? episode.AniDB.Description ?? series.AniDB.Description : series.AniDB.Description) ?? ""),
                    ProductionYear  = episode.AniDB.AirDate?.Year,
                    Tags            = tags,
                    CommunityRating = rating,
                };
                result.Item.SetProviderId("Shoko File", file.Id);
                result.Item.SetProviderId("Shoko Episode", episode.Id);
                if (config.AddAniDBId)
                {
                    result.Item.SetProviderId("AniDB", episode.AniDB.ID.ToString());
                }

                result.HasMetadata = true;
                ApiManager.MarkSeriesAsFound(series.Id, group.Id);

                result.ResetPeople();
                foreach (var person in await ApiManager.GetPeople(series.Id))
                {
                    result.AddPerson(person);
                }

                return(result);
            }
            catch (Exception e) {
                Logger.LogError(e, $"Threw unexpectedly; {e.Message}");
                return(new MetadataResult <Movie>());
            }
        }
コード例 #2
0
        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>());
            }
        }