public async Task <HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken)
        {
            logger?.Info($"{nameof(ImageProxyService)}-{nameof(GetImageResponse)}-{url}");
            int type = 0;
            var i    = url.IndexOf(image_type_param_name, StringComparison.OrdinalIgnoreCase);

            if (i > 0)
            {
                try
                {
                    var p = url.Substring(i + image_type_param_name.Length).Trim('=').Trim();
                    url = url.Substring(0, i - 1);//减去一个连接符
                    int.TryParse(p, out type);
                }
                catch (Exception ex)
                {
                    logger?.Error(ex.ToString());
                }
            }

            var key        = WebUtility.UrlEncode(url);
            var cache_file = Path.Combine(appPaths.GetImageCachePath().ToString(), key);

            byte[] bytes = null;

            //尝试从缓存中读取
            try
            {
                var fi = fileSystem.GetFileInfo(cache_file);

                //图片文件存在,且是24小时之内的
                if (fi.Exists && fileSystem.GetFileInfo(cache_file).LastWriteTimeUtc > DateTime.Now.AddDays(-1).ToUniversalTime())
                {
                    bytes = await fileSystem.ReadAllBytesAsync(cache_file);

                    logger?.Info($"{nameof(ImageProxyService)}: Hit image cache {url} {cache_file}");
                    if (type == 1)
                    {
                        var ci = await CutImage(bytes);

                        if (ci != null)
                        {
                            return(ci);
                        }
                    }

                    fileExtensionContentTypeProvider.TryGetContentType(url, out var contentType);

                    return(new HttpResponseInfo()
                    {
                        Content = new MemoryStream(bytes),
                        ContentLength = bytes.Length,
                        ContentType = contentType ?? "image/jpeg",
                        StatusCode = HttpStatusCode.OK,
                    });
                }
            }
            catch (Exception ex)
            {
                logger?.Warn($"{nameof(ImageProxyService)}: Read image cache error. {url} {cache_file} {ex.Message}");
            }

            try
            {
                var resp = await client.GetAsync(url, cancellationToken);

                if (resp.IsSuccessStatusCode == false)
                {
                    return(await Parse(resp));
                }

                try
                {
                    fileSystem.WriteAllBytes(cache_file, await resp.Content.ReadAsByteArrayAsync());
                    logger?.Info($"{nameof(ImageProxyService)}: Save image cache {url} {cache_file} ");
                }
                catch (Exception ex)
                {
                    logger?.Warn($"{nameof(ImageProxyService)}: Save image cache error. {url} {cache_file} {ex.Message}");
                }

                if (type == 1)
                {
                    var ci = await CutImage(await resp.Content.ReadAsByteArrayAsync());

                    if (ci != null)
                    {
                        return(ci);
                    }
                }

                return(await Parse(resp));
            }
            catch (Exception ex)
            {
                logger?.Error(ex.ToString());
            }
            return(new HttpResponseInfo());
        }
Ejemplo n.º 2
0
        public async Task <HttpResponseInfo> GetImageResponse(string url, ImageType type, CancellationToken cancellationToken)
        {
            logger?.Info($"{nameof(GetImageResponse)}-{url}");

            var key        = WebUtility.UrlEncode(url);
            var cache_file = Path.Combine(appPaths.GetImageCachePath().ToString(), key);

            byte[] bytes = null;

            //尝试从缓存中读取
            try
            {
                var fi = fileSystem.GetFileInfo(cache_file);

                //图片文件存在,且是24小时之内的
                if (fi.Exists && fileSystem.GetFileInfo(cache_file).LastWriteTimeUtc > DateTime.Now.AddDays(-1).ToUniversalTime())
                {
                    bytes = await fileSystem.ReadAllBytesAsync(cache_file);

                    logger?.Info($"Hit image cache {url} {cache_file}");

                    fileExtensionContentTypeProvider.TryGetContentType(url, out var contentType);

                    return(new HttpResponseInfo()
                    {
                        Content = new MemoryStream(bytes),
                        ContentLength = bytes.Length,
                        ContentType = contentType ?? "image/jpeg",
                        StatusCode = HttpStatusCode.OK,
                    });
                }
            }
            catch (Exception ex)
            {
                logger?.Warn($"Read image cache error. {url} {cache_file} {ex.Message}");
            }

            try
            {
                var resp = await client.GetAsync(url, cancellationToken);

                if (resp.IsSuccessStatusCode == false)
                {
                    return(await Parse(resp));
                }

                try
                {
                    fileSystem.WriteAllBytes(cache_file, await resp.Content.ReadAsByteArrayAsync());
                    logger?.Info($"Save image cache {url} {cache_file} ");
                }
                catch (Exception ex)
                {
                    logger?.Warn($"Save image cache error. {url} {cache_file} {ex.Message}");
                }
                return(await Parse(resp));
            }
            catch (Exception ex)
            {
                logger?.Error(ex.ToString());
            }
            return(new HttpResponseInfo());
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 获取图片
        /// </summary>
        /// <param name="url">地址</param>
        /// <param name="type">类型</param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public async Task <HttpResponseInfo> GetImageResponse(string url, ImageType type, CancellationToken cancellationToken)
        {
            //  /emby/Plugins/JavScraper/Image?url=&type=xx
            if (url.IndexOf("Plugins/JavScraper/Image", StringComparison.OrdinalIgnoreCase) >= 0) //本地的链接
            {
                var uri  = new Uri(url);
                var q    = HttpUtility.ParseQueryString(uri.Query);
                var url2 = q["url"];
                if (url2.IsWebUrl())
                {
                    url = url2;
                    var tt = q.Get("type");
                    if (!string.IsNullOrWhiteSpace(tt) && Enum.TryParse <ImageType>(tt.Trim(), out var t2))
                    {
                        type = t2;
                    }
                }
            }

            logger?.Info($"{nameof(GetImageResponse)}-{url}");

            var key        = WebUtility.UrlEncode(url);
            var cache_file = Path.Combine(appPaths.GetImageCachePath().ToString(), key);

            byte[] bytes = null;

            //尝试从缓存中读取
            try
            {
                var fi = fileSystem.GetFileInfo(cache_file);

                //图片文件存在,且是24小时之内的
                if (fi.Exists && fileSystem.GetFileInfo(cache_file).LastWriteTimeUtc > DateTime.Now.AddDays(-1).ToUniversalTime())
                {
                    bytes = await fileSystem.ReadAllBytesAsync(cache_file);

                    logger?.Info($"Hit image cache {url} {cache_file}");
                    if (type == ImageType.Primary)
                    {
                        var ci = await CutImage(bytes, url);

                        if (ci != null)
                        {
                            return(ci);
                        }
                    }

                    fileExtensionContentTypeProvider.TryGetContentType(url, out var contentType);

                    return(new HttpResponseInfo()
                    {
                        Content = new MemoryStream(bytes),
                        ContentLength = bytes.Length,
                        ContentType = contentType ?? "image/jpeg",
                        StatusCode = HttpStatusCode.OK,
                    });
                }
            }
            catch (Exception ex)
            {
                logger?.Warn($"Read image cache error. {url} {cache_file} {ex.Message}");
            }

            try
            {
                var resp = await client.GetAsync(url, cancellationToken);

                if (resp.IsSuccessStatusCode == false)
                {
                    return(await Parse(resp));
                }

                try
                {
                    fileSystem.WriteAllBytes(cache_file, await resp.Content.ReadAsByteArrayAsync());
                    logger?.Info($"Save image cache {url} {cache_file} ");
                }
                catch (Exception ex)
                {
                    logger?.Warn($"Save image cache error. {url} {cache_file} {ex.Message}");
                }

                if (type == ImageType.Primary)
                {
                    var ci = await CutImage(await resp.Content.ReadAsByteArrayAsync(), url);

                    if (ci != null)
                    {
                        return(ci);
                    }
                }

                return(await Parse(resp));
            }
            catch (Exception ex)
            {
                logger?.Error(ex.ToString());
            }
            return(new HttpResponseInfo());
        }