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); }