Example #1
0
 protected ListItem CreateItem(MediaItemSearchResult searchResult)
 {
     if (searchResult.AspectData?.ContainsKey(ExternalIdentifierAspect.ASPECT_ID) ?? false)
     {
         ListItem listItem = new ListItem();
         listItem.SetLabel(KEY_NAME, searchResult.Name);
         StringBuilder infoText = new StringBuilder();
         foreach (var externaId in searchResult.ExternalIds)
         {
             infoText.Append($"{externaId.Key}: {externaId.Value}\n");
         }
         if (!string.IsNullOrEmpty(searchResult.Description))
         {
             infoText.Append(searchResult.Description);
         }
         listItem.SetLabel(KEY_INFO, infoText.ToString());
         var reimportAspect = MediaItemAspect.GetOrCreateAspect(searchResult.AspectData, ReimportAspect.Metadata);
         if (IsManualSearch)
         {
             reimportAspect.SetAttribute(ReimportAspect.ATTR_SEARCH, ManualId);
         }
         else
         {
             reimportAspect.SetAttribute(ReimportAspect.ATTR_SEARCH, null);
         }
         listItem.AdditionalProperties[KEY_ASPECTS] = searchResult.AspectData;
         return(listItem);
     }
     return(null);
 }
 private MediaItemResultModel ToViewModel(MediaItemSearchResult searchResult)
 {
     return(new MediaItemResultModel
     {
         Url = searchResult.Url,
         Title = searchResult.Title,
         Summary = searchResult.Summary,
         Date = searchResult.Date,
         FileType = searchResult.FileType?.ToUpperInvariant() ?? string.Empty,
         Size = MediaItemResultHelper.CalculateFileSizeForDisplay(searchResult.SizeInByte),
         IconClass = MediaItemResultHelper.GetIconClass(searchResult.FileType)
     });
 }
 protected ListItem CreateItem(MediaItemSearchResult searchResult)
 {
     if (searchResult.AspectData?.Count() > 0)
     {
         ListItem listItem = new ListItem();
         listItem.SetLabel(KEY_NAME, searchResult.Name);
         listItem.SetLabel(KEY_PROVIDER, string.Join(", ", searchResult.Providers));
         listItem.SetLabel(KEY_MATCH, $"{searchResult.MatchPercentage}%");
         listItem.SetLabel(KEY_LANG, $"{(searchResult.Language == null ? "" : $" {new CultureInfo(searchResult.Language).DisplayName}")}");
         var reimportAspect = MediaItemAspect.GetOrCreateAspect(searchResult.AspectData, ReimportAspect.Metadata);
         if (IsManualSearch)
         {
             reimportAspect.SetAttribute(ReimportAspect.ATTR_SEARCH, ManualId);
         }
         else
         {
             reimportAspect.SetAttribute(ReimportAspect.ATTR_SEARCH, null);
         }
         listItem.AdditionalProperties[KEY_ASPECTS] = searchResult.AspectData;
         return(listItem);
     }
     return(null);
 }
        public async Task <IList <MediaItemSearchResult> > SearchForMatchesAsync(IDictionary <Guid, IList <MediaItemAspect> > searchAspectData, ICollection <string> searchCategories)
        {
            try
            {
                if (!searchAspectData.ContainsKey(MovieAspect.ASPECT_ID) && !searchAspectData.ContainsKey(EpisodeAspect.ASPECT_ID))
                {
                    return(null);
                }

                string searchData     = null;
                var    reimportAspect = MediaItemAspect.GetAspect(searchAspectData, ReimportAspect.Metadata);
                if (reimportAspect != null)
                {
                    searchData = reimportAspect.GetAttributeValue <string>(ReimportAspect.ATTR_SEARCH);
                }

                ServiceRegistration.Get <ILogger>().Debug("SubtitleMetadataExtractor: Search aspects to use: '{0}'", string.Join(",", searchAspectData.Keys));

                //Prepare search info
                SubtitleInfo subtitleSearchinfo = new SubtitleInfo();
                subtitleSearchinfo.FromMetadata(searchAspectData);
                if (!string.IsNullOrEmpty(searchData))
                {
                    subtitleSearchinfo.MediaTitle = searchData;
                    subtitleSearchinfo.Year       = null;
                }

                // Perform online search
                List <MediaItemSearchResult> searchResults = new List <MediaItemSearchResult>();
                List <SubtitleInfo>          matches       = new List <SubtitleInfo>();
                if (searchAspectData.ContainsKey(MovieAspect.ASPECT_ID))
                {
                    if (searchCategories?.Any() ?? false)
                    {
                        foreach (var category in searchCategories)
                        {
                            matches.AddRange(await OnlineMatcherService.Instance.FindMatchingMovieSubtitlesAsync(subtitleSearchinfo, subtitleSearchinfo.Language?.Split(',').ToList(), category).ConfigureAwait(false));
                        }
                    }
                    else
                    {
                        matches.AddRange(await OnlineMatcherService.Instance.FindMatchingMovieSubtitlesAsync(subtitleSearchinfo, subtitleSearchinfo.Language?.Split(',').ToList(), null).ConfigureAwait(false));
                    }
                }
                else if (searchAspectData.ContainsKey(EpisodeAspect.ASPECT_ID))
                {
                    if (searchCategories?.Any() ?? false)
                    {
                        foreach (var category in searchCategories)
                        {
                            matches.AddRange(await OnlineMatcherService.Instance.FindMatchingEpisodeSubtitlesAsync(subtitleSearchinfo, subtitleSearchinfo.Language?.Split(',').ToList(), category).ConfigureAwait(false));
                        }
                    }
                    else
                    {
                        matches.AddRange(await OnlineMatcherService.Instance.FindMatchingEpisodeSubtitlesAsync(subtitleSearchinfo, subtitleSearchinfo.Language?.Split(',').ToList(), null).ConfigureAwait(false));
                    }
                }
                ServiceRegistration.Get <ILogger>().Debug("SubtitleMetadataExtractor: Subtitle search returned {0} matches", matches.Count());
                foreach (var match in matches.OrderBy(m => m.LanguageMatchRank ?? int.MaxValue).ThenByDescending(m => m.MatchPercentage ?? 0))
                {
                    var result = new MediaItemSearchResult
                    {
                        Name            = $"{match.DisplayName}",
                        Providers       = new List <string>(match.DataProviders),
                        MatchPercentage = match.MatchPercentage ?? 0,
                        Language        = match.Language
                    };

                    //Add external Ids
                    if (!string.IsNullOrEmpty(match.ImdbId))
                    {
                        result.ExternalIds.Add("imdb.com", match.ImdbId);
                    }
                    if (match.MovieDbId > 0)
                    {
                        result.ExternalIds.Add("themoviedb.org", match.MovieDbId.ToString());
                    }
                    if (match.TvdbId > 0)
                    {
                        result.ExternalIds.Add("thetvdb.com", match.TvdbId.ToString());
                    }
                    foreach (var customId in match.CustomIds)
                    {
                        result.ExternalIds.Add(customId.Key, customId.Value);
                    }

                    //Assign aspects and remove unwanted aspects
                    match.SetMetadata(result.AspectData, true);

                    searchResults.Add(result);
                }
                return(searchResults);
            }
            catch (Exception e)
            {
                ServiceRegistration.Get <ILogger>().Info("SubtitleMetadataExtractor: Exception searching for matches (Text: '{0}')", e.Message);
            }
            return(null);
        }