Merge feature/merge-upstream: 数据看板视频封面接口 + Cookie 编辑弹窗全屏化
部署到群晖 / deploy (push) Failing after 3h9m17s
部署到群晖 / deploy (push) Failing after 3h9m17s
This commit is contained in:
@@ -238,6 +238,75 @@ namespace dy.net.Controllers
|
|||||||
return new EmptyResult();
|
return new EmptyResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取视频封面图片
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id">视频ID</param>
|
||||||
|
[Authorize]
|
||||||
|
[HttpGet("cover/{id}")]
|
||||||
|
public async Task<IActionResult> GetVideoCover([FromRoute] string id)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var video = await douyinVideoService.GetById(id);
|
||||||
|
if (video == null)
|
||||||
|
{
|
||||||
|
return GetDefaultCoverImage();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 优先使用本地保存的封面
|
||||||
|
if (!string.IsNullOrWhiteSpace(video.VideoCoverSavePath) && System.IO.File.Exists(video.VideoCoverSavePath))
|
||||||
|
{
|
||||||
|
var contentType = GetImageContentType(video.VideoCoverSavePath);
|
||||||
|
var fileStream = System.IO.File.OpenRead(video.VideoCoverSavePath);
|
||||||
|
return File(fileStream, contentType);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 本地封面缺失时回落到默认占位图
|
||||||
|
return GetDefaultCoverImage();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Serilog.Log.Error(ex, $"获取视频封面失败: {id}");
|
||||||
|
return GetDefaultCoverImage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 默认封面占位图(SVG)
|
||||||
|
/// </summary>
|
||||||
|
private IActionResult GetDefaultCoverImage()
|
||||||
|
{
|
||||||
|
var svgContent = @"<svg width=""400"" height=""225"" xmlns=""http://www.w3.org/2000/svg"">
|
||||||
|
<rect width=""400"" height=""225"" fill=""#f0f0f0""/>
|
||||||
|
<text x=""50%"" y=""50%"" font-family=""Arial, sans-serif"" font-size=""16"" fill=""#999"" text-anchor=""middle"" dy="".3em"">暂无封面</text>
|
||||||
|
</svg>";
|
||||||
|
var svgBytes = System.Text.Encoding.UTF8.GetBytes(svgContent);
|
||||||
|
return File(svgBytes, "image/svg+xml");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 根据文件扩展名获取图片 Content-Type
|
||||||
|
/// </summary>
|
||||||
|
private string GetImageContentType(string fileName)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(fileName))
|
||||||
|
{
|
||||||
|
return "image/jpeg";
|
||||||
|
}
|
||||||
|
var extension = Path.GetExtension(fileName).ToLowerInvariant();
|
||||||
|
return extension switch
|
||||||
|
{
|
||||||
|
".jpg" or ".jpeg" => "image/jpeg",
|
||||||
|
".png" => "image/png",
|
||||||
|
".gif" => "image/gif",
|
||||||
|
".webp" => "image/webp",
|
||||||
|
".svg" => "image/svg+xml",
|
||||||
|
".bmp" => "image/bmp",
|
||||||
|
_ => "image/jpeg"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 播放视频
|
/// 播放视频
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
+18
-4
@@ -179,15 +179,29 @@ body {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 抖音授权 Cookie 编辑用 full-modal(顶部对齐的宽 modal)
|
// 抖音授权 Cookie 编辑用 full-modal(全屏抽屉式,高度 100vh、footer 常驻底部)
|
||||||
.full-modal .ant-modal {
|
.full-modal .ant-modal {
|
||||||
top: 0 !important;
|
top: 0 !important;
|
||||||
padding-bottom: 0 !important;
|
padding-bottom: 0 !important;
|
||||||
margin-bottom: 0;
|
margin: 0 !important;
|
||||||
|
max-width: 100%;
|
||||||
|
height: 100vh;
|
||||||
|
}
|
||||||
|
.full-modal .ant-modal-content {
|
||||||
|
height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
.full-modal .ant-modal-header,
|
||||||
|
.full-modal .ant-modal-footer {
|
||||||
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
// full-modal 没有 top 留白,body max-height 减去的常量更小
|
|
||||||
.full-modal .ant-modal-body {
|
.full-modal .ant-modal-body {
|
||||||
max-height: calc(100vh - 110px) !important;
|
flex: 1 1 auto;
|
||||||
|
min-height: 0;
|
||||||
|
max-height: none !important;
|
||||||
|
overflow-y: auto !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 登录页整个界面本身就是一个 Modal(LoginModal.vue),必须恢复 antd 默认布局,不能被上面的全局规则改
|
// 登录页整个界面本身就是一个 Modal(LoginModal.vue),必须恢复 antd 默认布局,不能被上面的全局规则改
|
||||||
|
|||||||
@@ -713,26 +713,8 @@ const switchdownCollect = (e: any) => {
|
|||||||
|
|
||||||
<style scoped lang="less">
|
<style scoped lang="less">
|
||||||
.modal-scroll-body {
|
.modal-scroll-body {
|
||||||
max-height: calc(100vh - 160px);
|
|
||||||
overflow-y: scroll;
|
|
||||||
overflow-x: hidden;
|
|
||||||
padding-right: 4px;
|
padding-right: 4px;
|
||||||
}
|
}
|
||||||
.modal-scroll-body::-webkit-scrollbar {
|
|
||||||
-webkit-appearance: none;
|
|
||||||
width: 8px;
|
|
||||||
}
|
|
||||||
.modal-scroll-body::-webkit-scrollbar-track {
|
|
||||||
background: #f0f0f0;
|
|
||||||
border-radius: 4px;
|
|
||||||
}
|
|
||||||
.modal-scroll-body::-webkit-scrollbar-thumb {
|
|
||||||
background: #bbb;
|
|
||||||
border-radius: 4px;
|
|
||||||
}
|
|
||||||
.modal-scroll-body::-webkit-scrollbar-thumb:hover {
|
|
||||||
background: #888;
|
|
||||||
}
|
|
||||||
.ant-form-item {
|
.ant-form-item {
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user