using FileShare_EFCore.Database;
using FileShare_Services.Core;
using Microsoft.EntityFrameworkCore;
namespace FileShare_Services.Services.FileLibrary
{
///
/// 缩略图流服务接口,根据缩略图 ID 返回文件流响应。
///
public interface IThumbnailStreamService
{
///
/// 根据缩略图记录 ID 获取缩略图文件流响应。
///
/// 缩略图记录 ID。
/// 取消令牌。
/// 文件流响应,不存在或文件丢失时返回 null。
Task GetThumbnailAsync(int id, CancellationToken cancellationToken = default);
}
///
/// 缩略图流服务实现,从数据库查找缩略图映射并返回对应的物理文件流。
///
public sealed class ThumbnailStreamService(AppDataContext db, IVideoThumbnailService thumbnails) : IThumbnailStreamService
{
///
public async Task GetThumbnailAsync(int id, CancellationToken cancellationToken = default)
{
var thumbnail = await db.ManagedThumbnailMaps
.AsNoTracking()
.FirstOrDefaultAsync(item => item.Id == id, cancellationToken);
if (thumbnail is null)
{
return null;
}
var absolutePath = thumbnails.GetAbsolutePath(thumbnail.RelativePath);
if (!File.Exists(absolutePath))
{
return null;
}
return new FileStreamResponse(
absolutePath,
Path.GetFileName(absolutePath),
thumbnail.ContentType,
File.GetLastWriteTimeUtc(absolutePath));
}
}
}