You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
downkyi/DownKyi.Core/Storage/StorageCover.cs

252 lines
7.8 KiB

using DownKyi.Core.Logging;
using DownKyi.Core.Storage.Database;
using DownKyi.Core.Utils.Encryptor;
using Imazen.WebP;
using System;
using System.Drawing;
using System.IO;
using System.Windows.Media.Imaging;
namespace DownKyi.Core.Storage
{
public class StorageCover
{
// 先判断本地有没有
// 如果有
// 则返回本地的图片路径
// 如果没有
// 则下载图片并返回本地的图片路径
/// <summary>
/// 获取封面缩略图
/// </summary>
/// <param name="avid"></param>
/// <param name="bvid"></param>
/// <param name="cid"></param>
/// <param name="url"></param>
/// <param name="width"></param>
/// <param name="height"></param>
/// <returns></returns>
public BitmapImage GetCoverThumbnail(long avid, string bvid, long cid, string url, int width, int height)
{
string header = GetCover(avid, bvid, cid, url);
return GetCoverThumbnail(header, width, height);
}
/// <summary>
/// 获取封面缩略图
/// </summary>
/// <param name="cover"></param>
/// <param name="width"></param>
/// <param name="height"></param>
/// <returns></returns>
public BitmapImage GetCoverThumbnail(string cover, int width, int height)
{
if (cover == null) { return null; }
try
{
Bitmap bitmap = new Bitmap(cover);
Image thumbnail = bitmap.GetThumbnailImage(width, height, null, IntPtr.Zero);
return StorageUtils.BitmapToBitmapImage(new Bitmap(thumbnail));
}
catch (ArgumentException)
{
try
{
byte[] bytes = File.ReadAllBytes(cover);
Imazen.WebP.Extern.LoadLibrary.LoadWebPOrFail();
SimpleDecoder simpleDecoder = new SimpleDecoder();
Bitmap bitmap = simpleDecoder.DecodeFromBytes(bytes, bytes.Length);
Image thumbnail = bitmap.GetThumbnailImage(width, height, null, IntPtr.Zero);
return StorageUtils.BitmapToBitmapImage(new Bitmap(thumbnail));
}
catch (Exception ex)
{
Utils.Debugging.Console.PrintLine("GetCoverThumbnail()发生异常: {0}", ex);
LogManager.Error("StorageCover.GetCoverThumbnail()", ex);
return null;
}
}
catch (Exception e)
{
Utils.Debugging.Console.PrintLine("GetCoverThumbnail()发生异常: {0}", e);
LogManager.Error("StorageCover.GetCoverThumbnail()", e);
return null;
}
}
/// <summary>
/// 获取封面
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public string GetCover(string url)
{
return GetCover(0, "", 0, url);
}
/// <summary>
/// 获取封面
/// </summary>
/// <param name="aid"></param>
/// <param name="bvid"></param>
/// <param name="cid"></param>
/// <param name="url"></param>
/// <returns></returns>
public string GetCover(long avid, string bvid, long cid, string url)
{
CoverDb coverDb = new CoverDb();
Cover cover = coverDb.QueryByUrl(url);
// 如果存在,直接返回
// 如果不存在,则先下载
if (cover != null)
{
string coverPath = $"{StorageManager.GetCover()}/{cover.Md5}";
if (File.Exists(coverPath))
{
Cover newCover = new Cover
{
Avid = avid,
Bvid = bvid,
Cid = cid,
Url = url,
Md5 = cover.Md5
};
coverDb.Update(newCover);
//coverDb.Close();
return $"{StorageManager.GetCover()}/{cover.Md5}";
}
else
{
string md5 = DownloadImage(url);
if (md5 != null)
{
Cover newCover = new Cover
{
Avid = avid,
Bvid = bvid,
Cid = cid,
Url = url,
Md5 = md5
};
coverDb.Update(newCover);
//coverDb.Close();
return $"{StorageManager.GetCover()}/{md5}";
}
else
{
//coverDb.Close();
return null;
}
}
}
else
{
string md5 = DownloadImage(url);
if (md5 != null)
{
Cover newCover = new Cover
{
Avid = avid,
Bvid = bvid,
Cid = cid,
Url = url,
Md5 = md5
};
coverDb.Insert(newCover);
//coverDb.Close();
return $"{StorageManager.GetCover()}/{md5}";
}
else
{
//coverDb.Close();
return null;
}
}
}
/// <summary>
/// 下载图片
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
private string DownloadImage(string url)
{
string localFile = Path.GetTempPath() + Guid.NewGuid().ToString("N");
// 下载
bool isSuccessed = StorageUtils.DownloadImage(url, localFile);
if (isSuccessed)
{
try
{
string md5 = Hash.GetMD5HashFromFile(localFile);
if (File.Exists(localFile))
{
string destFile = $"{StorageManager.GetCover()}/{md5}";
try
{
File.Delete(destFile);
}
catch { }
// 移动到指定位置
File.Move(localFile, destFile);
return md5;
}
else
{
return null;
}
}
catch (Exception e)
{
Utils.Debugging.Console.PrintLine("DownloadImage()发生异常: {0}", e);
LogManager.Error("StorageCover", e);
return null;
}
}
return null;
}
/// <summary>
/// 本地是否存在
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public bool IsLocal(CoverDb coverDb, string url)
{
Cover cover = coverDb.QueryByUrl(url);
return cover != null;
}
/// <summary>
/// 返回图片md5值
/// </summary>
/// <param name="coverDb"></param>
/// <param name="url"></param>
/// <returns></returns>
public string LocalCover(CoverDb coverDb, string url)
{
Cover cover = coverDb.QueryByUrl(url);
return cover.Md5;
}
}
}