public async Task <IEnumerable <RemoteImageInfo> > GetImages(BaseItem item, LibraryOptions libraryOptions, CancellationToken cancellationToken) { _logger?.Info($"{Name}-{nameof(JavImageProvider)}-{nameof(GetImages)} name:{item.Name}"); var list = new List <RemoteImageInfo>(); JavVideoIndex index = null; if ((index = item.GetJavVideoIndex(_jsonSerializer)) == null) { _logger?.Info($"{Name}-{nameof(JavImageProvider)}-{nameof(GetImages)} name:{item.Name} JavVideoIndex not found."); return(list); } JavVideo m = null; try { var cachePath = Path.Combine(_appPaths.CachePath, Name, index.Provider, $"{index.Num}.json"); m = _jsonSerializer.DeserializeFromFile <JavVideo>(cachePath); } catch { _logger?.Info($"{Name}-{nameof(JavImageProvider)}-{nameof(GetImages)} name:{item.Name} JavVideo not found."); } if (m == null) { return(list); } if (string.IsNullOrWhiteSpace(m.Cover) && m.Samples?.Any() == true) { m.Cover = m.Samples.FirstOrDefault(); } if (string.IsNullOrWhiteSpace(m.Cover) == false) { async Task SaveImage(ImageType type) { //有的就跳过了 if (item.ImageInfos?.Any(o => o.Type == type) == true) { return; } try { var url = ImageProxyService.BuildUrl(m.Cover, type == ImageType.Primary ? 1 : 0); var resp = await ImageProxyService.GetImageResponse(url, cancellationToken); if (resp?.ContentLength > 0) { #if __JELLYFIN__ await providerManager.SaveImage(item, resp.Content, resp.ContentType, type, 0, cancellationToken); #else await providerManager.SaveImage(item, libraryOptions, resp.Content, resp.ContentType.ToArray(), type, 0, cancellationToken); #endif } } catch (Exception ex) { _logger?.Warn($"Save image error: {type} {m.Cover} {ex.Message}"); } } await SaveImage(ImageType.Primary); await SaveImage(ImageType.Backdrop); //await SaveImage(ImageType.Art); var b = new RemoteImageInfo() { ProviderName = Name, Type = ImageType.Backdrop, Url = Plugin.Instance.Configuration.BuildProxyUrl(m.Cover), }; list.Add(b); } if (m.Samples?.Any() == true) { list.AddRange(m.Samples.Select(o => new RemoteImageInfo() { ProviderName = Name, Type = ImageType.Art, Url = Plugin.Instance.Configuration.BuildProxyUrl(o), })); } return(list); }
/// <summary> /// 设置视频信息 /// </summary> /// <param name="result"></param> /// <param name="_jsonSerializer"></param> /// <param name="m"></param> /// <returns></returns> public static IHasProviderIds SetJavVideoIndex(this IHasProviderIds result, IJsonSerializer _jsonSerializer, JavVideoIndex m) { result.ProviderIds[Name] = m.Num; result.ProviderIds[$"{Name}-Json"] = _jsonSerializer.SerializeToString(m); result.ProviderIds[$"{Name}-Url"] = m.Url; return(result); }
public async Task <MetadataResult <Movie> > GetMetadata(MovieInfo info, CancellationToken cancellationToken) { var metadataResult = new MetadataResult <Movie>(); JavVideoIndex index = null; _logger?.Info($"{Name}-{nameof(GetMetadata)} info:{_jsonSerializer.SerializeToString(info)}"); if ((index = info.GetJavVideoIndex(_jsonSerializer)) == null) { var res = await GetSearchResults(info, cancellationToken).ConfigureAwait(false); if (res.Count() == 0 || (index = res.FirstOrDefault().GetJavVideoIndex(_jsonSerializer)) == null) { _logger?.Info($"{Name}-{nameof(GetMetadata)} name:{info.Name} not found 0."); return(metadataResult); } } if (index == null) { _logger?.Info($"{Name}-{nameof(GetMetadata)} name:{info.Name} not found 1."); return(metadataResult); } var sc = scrapers.FirstOrDefault(o => o.Name == index.Provider); if (sc == null) { return(metadataResult); } var m = await sc.Get(index); if (m == null) { _logger?.Info($"{Name}-{nameof(GetMetadata)} name:{info.Name} not found 2."); return(metadataResult); } _logger?.Info($"{Name}-{nameof(GetMetadata)} name:{info.Name} {_jsonSerializer.SerializeToString(m)}"); metadataResult.HasMetadata = true; metadataResult.QueriedById = true; //忽略部分类别 if (m.Genres?.Any() == true) { m.Genres.RemoveAll(o => Plugin.Instance?.Configuration?.IsIgnoreGenre(o) == true); if (Plugin.Instance?.Configuration?.GenreIgnoreActor == true && m.Actors?.Any() == true) { m.Genres.RemoveAll(o => m.Actors.Contains(o)); } } metadataResult.Item = new Movie { Name = $"{m.Num} {m.Title}", Overview = m.Plot, ProductionYear = m.GetYear(), OriginalTitle = m.Title, Genres = m.Genres?.ToArray() ?? new string[] { }, CollectionName = m.Set, SortName = m.Num, ExternalId = m.Num, }; metadataResult.Item.SetJavVideoIndex(_jsonSerializer, index); var dt = m.GetDate(); if (dt != null) { metadataResult.Item.PremiereDate = metadataResult.Item.DateCreated = dt.Value; } if (!string.IsNullOrWhiteSpace(m.Studio)) { metadataResult.Item.AddStudio(m.Studio); } if (!string.IsNullOrWhiteSpace(m.Director)) { var pi = new PersonInfo { Name = m.Director, Type = PersonType.Director, }; metadataResult.AddPerson(pi); } if (m.Actors?.Any() == true) { foreach (var cast in m.Actors) { var pi = new PersonInfo { Name = cast, Type = PersonType.Actor, }; metadataResult.AddPerson(pi); } } try { var cachePath = Path.Combine(_appPaths.CachePath, Name, m.Provider, $"{m.Num}.json"); Directory.CreateDirectory(Path.GetDirectoryName(cachePath)); _jsonSerializer.SerializeToFile(m, cachePath); } catch { } return(metadataResult); }
public async Task <MetadataResult <Movie> > GetMetadata(MovieInfo info, CancellationToken cancellationToken) { var metadataResult = new MetadataResult <Movie>(); JavVideoIndex index = null; _logger?.Info($"{Name}-{nameof(GetMetadata)} info:{_jsonSerializer.SerializeToString(info)}"); if ((index = info.GetJavVideoIndex(_jsonSerializer)) == null) { var res = await GetSearchResults(info, cancellationToken).ConfigureAwait(false); if (res.Count() == 0 || (index = res.FirstOrDefault().GetJavVideoIndex(_jsonSerializer)) == null) { _logger?.Info($"{Name}-{nameof(GetMetadata)} name:{info.Name} not found 0."); return(metadataResult); } } if (index == null) { _logger?.Info($"{Name}-{nameof(GetMetadata)} name:{info.Name} not found 1."); return(metadataResult); } var sc = scrapers.FirstOrDefault(o => o.Name == index.Provider); if (sc == null) { return(metadataResult); } var m = await sc.Get(index); if (m == null) { _logger?.Info($"{Name}-{nameof(GetMetadata)} name:{info.Name} not found 2."); return(metadataResult); } _logger?.Info($"{Name}-{nameof(GetMetadata)} name:{info.Name} {_jsonSerializer.SerializeToString(m)}"); metadataResult.HasMetadata = true; metadataResult.QueriedById = true; //忽略部分类别 if (m.Genres?.Any() == true) { m.Genres.RemoveAll(o => Plugin.Instance?.Configuration?.IsIgnoreGenre(o) == true); if (Plugin.Instance?.Configuration?.GenreIgnoreActor == true && m.Actors?.Any() == true) { m.Genres.RemoveAll(o => m.Actors.Contains(o)); } } //从标题结尾处移除女优的名字 if (Plugin.Instance?.Configuration?.GenreIgnoreActor == true && m.Actors?.Any() == true && string.IsNullOrWhiteSpace(m.Title) == false) { var title = m.Title?.Trim(); bool found = false; do { found = false; foreach (var actor in m.Actors) { if (title.EndsWith(actor)) { title = title.Substring(0, title.Length - actor.Length).TrimEnd().TrimEnd(",, ".ToArray()).TrimEnd(); found = true; } } } while (found); m.Title = title; } if (Plugin.Instance?.Configuration?.AddChineseSubtitleGenre == true && (info.Name.EndsWith("-C", StringComparison.OrdinalIgnoreCase) || info.Name.EndsWith("-C2", StringComparison.OrdinalIgnoreCase))) { const string CHINESE_SUBTITLE_GENRE = "中文字幕"; if (m.Genres == null) { m.Genres = new List <string>() { CHINESE_SUBTITLE_GENRE } } ; else if (m.Genres.Contains(CHINESE_SUBTITLE_GENRE) == false) { m.Genres.Add("中文字幕"); } } //格式化标题 string name = $"{m.Num} {m.Title}"; if (string.IsNullOrWhiteSpace(Plugin.Instance?.Configuration?.TitleFormat) == false) { var empty = Plugin.Instance?.Configuration?.TitleFormatEmptyValue ?? string.Empty; name = Plugin.Instance.Configuration.TitleFormat; void Replace(string key, string value) { var _index = name.IndexOf(key, StringComparison.OrdinalIgnoreCase); if (_index < 0) { return; } if (string.IsNullOrEmpty(value)) { value = empty; } do { name = name.Remove(_index, key.Length); name = name.Insert(_index, value); _index = name.IndexOf(key, _index + value.Length, StringComparison.OrdinalIgnoreCase); } while (_index >= 0); } Replace("%num%", m.Num); Replace("%title%", m.Title); Replace("%actor%", m.Actors?.Any() == true ? string.Join(", ", m.Actors) : null); Replace("%actor_first%", m.Actors?.FirstOrDefault()); Replace("%set%", m.Set); Replace("%director%", m.Director); Replace("%date%", m.Date); Replace("%year%", m.GetYear()?.ToString()); Replace("%month%", m.GetMonth()?.ToString("00")); Replace("%studio%", m.Studio); Replace("%maker%", m.Maker); } metadataResult.Item = new Movie { Name = name, Overview = m.Plot, ProductionYear = m.GetYear(), OriginalTitle = m.Title, Genres = m.Genres?.ToArray() ?? new string[] { }, CollectionName = m.Set, SortName = m.Num, ForcedSortName = m.Num, ExternalId = m.Num, }; metadataResult.Item.SetJavVideoIndex(_jsonSerializer, index); var dt = m.GetDate(); if (dt != null) { metadataResult.Item.PremiereDate = metadataResult.Item.DateCreated = dt.Value; } if (!string.IsNullOrWhiteSpace(m.Studio)) { metadataResult.Item.AddStudio(m.Studio); } if (!string.IsNullOrWhiteSpace(m.Director)) { var pi = new PersonInfo { Name = m.Director, Type = PersonType.Director, }; metadataResult.AddPerson(pi); } if (m.Actors?.Any() == true) { foreach (var cast in m.Actors) { var pi = new PersonInfo { Name = cast, Type = PersonType.Actor, }; metadataResult.AddPerson(pi); } } try { var cachePath = Path.Combine(_appPaths.CachePath, Name, m.Provider, $"{m.Num}.json"); Directory.CreateDirectory(Path.GetDirectoryName(cachePath)); _jsonSerializer.SerializeToFile(m, cachePath); } catch { } return(metadataResult); }