예제 #1
0
        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);
        }