diff --git a/CloudBuilder.Topshelf/CloudBuilder.Topshelf.sln b/CloudBuilder.Topshelf/CloudBuilder.Topshelf.sln index 6059df4..649aae5 100644 --- a/CloudBuilder.Topshelf/CloudBuilder.Topshelf.sln +++ b/CloudBuilder.Topshelf/CloudBuilder.Topshelf.sln @@ -5,8 +5,6 @@ VisualStudioVersion = 17.8.34316.72 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CloudBuilder.Topshelf", "CloudBuilder.Topshelf.csproj", "{63EB47F6-A616-4C64-B850-85ED294E2524}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CloudBuilder.Request", "..\CloudBuilder\CloudBuilder.Request\CloudBuilder.Request.csproj", "{8A0A5461-7F04-B87A-CE03-309E1D186FEC}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -17,10 +15,6 @@ Global {63EB47F6-A616-4C64-B850-85ED294E2524}.Debug|Any CPU.Build.0 = Debug|Any CPU {63EB47F6-A616-4C64-B850-85ED294E2524}.Release|Any CPU.ActiveCfg = Release|Any CPU {63EB47F6-A616-4C64-B850-85ED294E2524}.Release|Any CPU.Build.0 = Release|Any CPU - {8A0A5461-7F04-B87A-CE03-309E1D186FEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8A0A5461-7F04-B87A-CE03-309E1D186FEC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8A0A5461-7F04-B87A-CE03-309E1D186FEC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8A0A5461-7F04-B87A-CE03-309E1D186FEC}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/CloudBuilder.Topshelf/Lib/CloudBuilder.Master.Service.dll b/CloudBuilder.Topshelf/Lib/CloudBuilder.Master.Service.dll index aaf06d5..438bd02 100644 Binary files a/CloudBuilder.Topshelf/Lib/CloudBuilder.Master.Service.dll and b/CloudBuilder.Topshelf/Lib/CloudBuilder.Master.Service.dll differ diff --git a/CloudBuilder.Topshelf/Lib/CloudBuilder.Security.dll b/CloudBuilder.Topshelf/Lib/CloudBuilder.Security.dll index 60b31ea..8d4565b 100644 Binary files a/CloudBuilder.Topshelf/Lib/CloudBuilder.Security.dll and b/CloudBuilder.Topshelf/Lib/CloudBuilder.Security.dll differ diff --git a/CloudBuilder.Topshelf/Properties/PublishProfiles/FolderProfile.pubxml.user b/CloudBuilder.Topshelf/Properties/PublishProfiles/FolderProfile.pubxml.user index 66d5cf0..4ebdf5b 100644 --- a/CloudBuilder.Topshelf/Properties/PublishProfiles/FolderProfile.pubxml.user +++ b/CloudBuilder.Topshelf/Properties/PublishProfiles/FolderProfile.pubxml.user @@ -2,7 +2,7 @@ - True|2026-09-21T03:59:35.1020536Z||;True|2026-09-21T11:50:47.8944224+08:00||;True|2026-09-21T11:30:52.9019631+08:00||;True|2026-09-21T10:47:01.8026331+08:00||; + True|2026-09-21T07:29:51.3588778Z||;True|2026-09-21T15:18:10.5399306+08:00||;True|2026-09-21T14:59:51.6908938+08:00||;True|2026-09-21T14:49:11.2390264+08:00||;True|2026-09-21T14:17:57.4013084+08:00||;True|2026-09-21T14:00:14.9207890+08:00||;True|2026-09-21T11:59:35.1020536+08:00||;True|2026-09-21T11:50:47.8944224+08:00||;True|2026-09-21T11:30:52.9019631+08:00||;True|2026-09-21T10:47:01.8026331+08:00||; \ No newline at end of file diff --git a/CloudBuilder.Topshelf/Task/RunTask.cs b/CloudBuilder.Topshelf/Task/RunTask.cs index 899aaa2..e6b21a5 100644 --- a/CloudBuilder.Topshelf/Task/RunTask.cs +++ b/CloudBuilder.Topshelf/Task/RunTask.cs @@ -1,6 +1,12 @@ -using CloudBuilder.Core.DatabaseAccessor.Entity; +using CliWrap; +using CloudBuilder.Core.DatabaseAccessor.Entity; using CloudBuilder.Core.DependencyInjection.Task; +using CloudBuilder.Core.Service; +using CloudBuilder.Master.Entity; +using CloudBuilder.Security.Entity; +using CloudBuilder.Security.Service; using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; namespace CloudBuilder.Topshelf.Task { @@ -8,27 +14,75 @@ namespace CloudBuilder.Topshelf.Task public class RunTask : IScheduleTask { private readonly IApplicationService service; - private readonly IConfiguration config; + private FileLog log; - public RunTask(IApplicationService service, IConfiguration config) + public RunTask(IApplicationService service) { this.service = service; - this.config = config; + log = new FileLog(service.Configuration); } public void Run(Dictionary bodyDict) { - File.AppendAllText("log.txt", "RunTask:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\r\n"); + log.WriteToFile("RunTask"); + try { - new FileLog(config).WriteToFile("RunTask"); + IRepository taskRepository = service.GetRepository>(); + + + SecurityScheduleTaskQueueEntity task = taskRepository.DetachedEntities.OrderBy(x => x.QueueId).FirstOrDefault(); + + if (task == null) return; + + + IRepository repositoryDmsFile = service.GetRepository>(); + DmsFileEntity dmsFile = repositoryDmsFile.DetachedEntities.Where(x => x.OrderKey == task.DocumentId).FirstOrDefault(); + + if (dmsFile == null) return; + + RunMyProcess(task.TaskId, task.TaskParam); + + dmsFile.TranscodeIndc = YesNoPolicy.YES; + repositoryDmsFile.UpdateNow(dmsFile); } catch (Exception ex) { - File.AppendAllText("log.txt", "RunTask:" + ex.Message); - throw; + log.WriteToFile(ex.Message); } - + } + + /// + /// 执行cmd指令(异步不等待,await要求等待返回,转码太耗时) + /// + /// + public void RunMyProcess(string exePath, string parameters) + { + try + { + parameters = parameters.Replace("/app/data", "/vol1/1000/Docker/NET8/DEV/data"); + + log.WriteToFile(exePath + parameters); + + if (string.IsNullOrEmpty(exePath)) return; + // 获取异步任务 + var commandTask = Cli.Wrap(exePath) + .WithArguments(parameters) + .WithValidation(CommandResultValidation.None) // 关键:允许非0退出码而不抛异常,以便我们能拿到错误输出 + .ExecuteAsync(); + + // 阻塞当前线程,等待任务完成(因为你的外层是同步的 void 方法) + var result = commandTask.Task.GetAwaiter().GetResult(); + + // 记录退出码和标准错误输出 + log.WriteToFile($"FFmpeg ExitCode: {result.ExitCode}"); + } + catch (Exception ex) + { + log.WriteToFile(ex.Message); + throw new ValidatedException(ex.Message); + } + } } } diff --git a/CloudBuilder/CloudBuilder.Master.Service/DmsFileService.auto.cs b/CloudBuilder/CloudBuilder.Master.Service/DmsFileService.auto.cs index 7165860..084c0f8 100644 --- a/CloudBuilder/CloudBuilder.Master.Service/DmsFileService.auto.cs +++ b/CloudBuilder/CloudBuilder.Master.Service/DmsFileService.auto.cs @@ -2,11 +2,13 @@ using CliWrap; using CloudBuilder.Core.DatabaseAccessor; using CloudBuilder.Core.DatabaseAccessor.Entity; +using CloudBuilder.Core.Extensions; using CloudBuilder.Core.Service; using CloudBuilder.Master.Data; using CloudBuilder.Master.Entity; using CloudBuilder.Master.Policy; using CloudBuilder.Master.SearchCriteria; +using CloudBuilder.Security.Entity; using CloudBuilder.Security.Policy; using CloudBuilder.Security.Service; using Microsoft.AspNetCore.Authorization; @@ -92,7 +94,7 @@ namespace CloudBuilder.Master.Service data.Datas = list.Select(x => new DmsFileUploadViewDisplayData(x) { - FormattedPic = FileTypePolicy.PackUrl(service, x.CreatedBy, x.OrderKey, YesNoPolicy.YES) + FormattedPic = FileTypePolicy.PackPicUrl(service, x.CreatedBy, x.OrderKey) }).ToArray(); } @@ -160,7 +162,7 @@ namespace CloudBuilder.Master.Service data.Datas = list.Select(x => new DmsFileUploadViewDisplayData(x) { - FormattedPic = FileTypePolicy.PackUrl(service, x.CreatedBy, x.OrderKey, YesNoPolicy.YES) + FormattedPic = FileTypePolicy.PackPicUrl(service, x.CreatedBy, x.OrderKey) }).ToArray(); } @@ -224,7 +226,7 @@ namespace CloudBuilder.Master.Service data.Logs = list.Select(x => new DmsFileUploadDeleteLogViewDisplayData(x) { - FormattedPic = FileTypePolicy.PackUrl(service, x.CreatedBy, x.OrderKey, YesNoPolicy.YES) + FormattedPic = FileTypePolicy.PackPicUrl(service, x.CreatedBy, x.OrderKey) }).ToArray(); } @@ -325,7 +327,7 @@ namespace CloudBuilder.Master.Service data.Families = list.Select(x => new FamilyDmsFileViewDisplayData(x) { FileType = FileTypePolicy.GetType(x.OrderKey), - FormattedPic = FileTypePolicy.PackUrl(service, x.CreatedBy, x.OrderKey, YesNoPolicy.YES) + FormattedPic = FileTypePolicy.PackPicUrl(service, x.CreatedBy, x.OrderKey) }).ToArray(); } @@ -1371,7 +1373,7 @@ namespace CloudBuilder.Master.Service { DmsFileEntity entity = repository.DetachedEntities.Where(x => x.FileId == fileId && x.CreatedBy == service.UserId).FirstOrDefault()!; - return FileTypePolicy.PackUrl(service, entity.CreatedBy, entity.OrderKey, entity.TranscodeIndc); + return FileTypePolicy.PackSourceVideoUrl(service, entity.CreatedBy, entity.OrderKey, entity.TranscodeIndc); } [PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Find)] @@ -1379,7 +1381,7 @@ namespace CloudBuilder.Master.Service { DmsFileEntity entity = repository.DetachedEntities.Where(x => x.FileId == fileId && x.CreatedBy == service.UserId).FirstOrDefault()!; - return FileTypePolicy.PackSourceVideoUrl(service, entity.CreatedBy, entity.OrderKey); + return FileTypePolicy.PackSourceVideoUrl(service, entity.CreatedBy, entity.OrderKey,entity.TranscodeIndc); } [PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Find)] @@ -1388,7 +1390,7 @@ namespace CloudBuilder.Master.Service IRepository repositoryDmsFileDeleteLog = repository.GetRepository>(); DmsFileDeleteLogEntity entity = repositoryDmsFileDeleteLog.DetachedEntities.Where(x => x.FileId == fileId && x.CreatedBy == service.UserId).FirstOrDefault()!; - return FileTypePolicy.PackSourceVideoUrl(service, entity.CreatedBy, entity.OrderKey); + return FileTypePolicy.PackSourceVideoUrl(service, entity.CreatedBy, entity.OrderKey,entity.TranscodeIndc); } private string PackParameters(DmsFileEntity dmsFile) @@ -1402,7 +1404,7 @@ namespace CloudBuilder.Master.Service return para.ToArray().ToDelimiteredList(' '); } - public void TsToM3u8(string orderKey, string mp4Url, string m3u8Url, int videoLength = 6) + public void TsToM3u8(string documentId, string mp4Url, string m3u8Url, int videoLength = 6) { string para = string.Format(service.Configuration[ServiceSettingsPolicy.FfmpegPictrue], mp4Url, m3u8Url); try @@ -1413,21 +1415,37 @@ namespace CloudBuilder.Master.Service { new FileLog(service.Configuration).WriteToFile(ex.Message); } - return; - para = string.Format(service.Configuration["Ffmpeg:Arguments"], mp4Url, videoLength, m3u8Url); + + var backupRootPath = ServiceSettingsPolicy.GetDmsFileBackupDirectory(service); + + var fileExtension = "m3u8"; + var filePath = Path.Combine(service.UserId, fileExtension.Replace(".", ""), ""); + var orgFileExtension = Path.GetExtension(documentId); + var fullName = Path.Combine(backupRootPath, filePath, documentId.Replace(orgFileExtension, ".m3u8")); + + string targetDir = Path.GetDirectoryName(fullName); + + if (!Directory.Exists(targetDir)) + { + Directory.CreateDirectory(targetDir); + } + + //return; + para = string.Format(service.Configuration["Ffmpeg:Arguments"], mp4Url, videoLength, fullName); //不直接转码视频文件,影响服务器性能,改为在闭时自动生成 //Task.Run(() => //{ // Thread.Sleep(200); // RunMyProcess(service.Configuration["Ffmpeg:Path"], para); //}); - //IRepository logRepository = repository.GetRepository>(); - //VideoToM3u8LogEntity log = new VideoToM3u8LogEntity(); - //log.VideoName = para; - //log.FilePath = Path.GetDirectoryName(m3u8Url)!; - //log.OrderKey = orderKey; - //log.Status = "S"; - //logRepository.InsertNow(log); + IRepository logRepository = repository.GetRepository>(); + SecurityScheduleTaskQueueEntity task = new SecurityScheduleTaskQueueEntity(); + + task.DocumentId = documentId; + task.TaskId = service.Configuration["Ffmpeg:Path"]; + task.TaskParam = para; + + logRepository.InsertNow(task); } public void ImageToScare(string fullName, DmsFileEntity dmsFile) diff --git a/CloudBuilder/CloudBuilder.Master.Service/PublishAudioService.auto.cs b/CloudBuilder/CloudBuilder.Master.Service/PublishAudioService.auto.cs index 2d4010a..019063f 100644 --- a/CloudBuilder/CloudBuilder.Master.Service/PublishAudioService.auto.cs +++ b/CloudBuilder/CloudBuilder.Master.Service/PublishAudioService.auto.cs @@ -80,7 +80,7 @@ namespace CloudBuilder.Master.Service { if (!string.IsNullOrEmpty(item.Pic) && FileTypePolicy.GetType(item.Pic!) == FileTypePolicy.PHOTO) { - item.FormattedPic = item.FormattedPic = FileTypePolicy.PackUrl(service, item.CreatedBy, item.Pic, YesNoPolicy.NO); + item.FormattedPic = item.FormattedPic = FileTypePolicy.PackPicUrl(service, item.CreatedBy, item.Pic); } if (!string.IsNullOrEmpty(item.Url) && FileTypePolicy.GetType(item.Url!) == FileTypePolicy.AUDIO) { diff --git a/CloudBuilder/CloudBuilder.Master.Service/PublishVideoService.auto.cs b/CloudBuilder/CloudBuilder.Master.Service/PublishVideoService.auto.cs index a78e321..80797b3 100644 --- a/CloudBuilder/CloudBuilder.Master.Service/PublishVideoService.auto.cs +++ b/CloudBuilder/CloudBuilder.Master.Service/PublishVideoService.auto.cs @@ -90,7 +90,7 @@ namespace CloudBuilder.Master.Service //暂时不支持转码 //DmsFileEntity dmsFileEntity = repositoryDmsFile.DetachedEntities.Where(x => x.OrderKey == item.Url).FirstOrDefault(); - item.FormattedPic = FileTypePolicy.PackUrl(service, item.CreatedBy, item.Url, YesNoPolicy.YES); + item.FormattedPic = FileTypePolicy.PackPicUrl(service, item.CreatedBy, item.Url); item.FormattedUrl = FileTypePolicy.PackUrl(service, item.CreatedBy, item.Url, YesNoPolicy.NO); } } diff --git a/CloudBuilder/CloudBuilder.Security/Entity/CloudBuilderSecurityRegistEntity.auto.cs b/CloudBuilder/CloudBuilder.Security/Entity/CloudBuilderSecurityRegistEntity.auto.cs index 6863aac..a03a0da 100644 --- a/CloudBuilder/CloudBuilder.Security/Entity/CloudBuilderSecurityRegistEntity.auto.cs +++ b/CloudBuilder/CloudBuilder.Security/Entity/CloudBuilderSecurityRegistEntity.auto.cs @@ -194,6 +194,8 @@ builder.Entity(eb => { eb.HasNoKey(); }); + + //***END*** } } diff --git a/CloudBuilder/CloudBuilder.Security/Entity/SecurityScheduleTaskQueueEntity.auto.cs b/CloudBuilder/CloudBuilder.Security/Entity/SecurityScheduleTaskQueueEntity.auto.cs new file mode 100644 index 0000000..c7d4a16 --- /dev/null +++ b/CloudBuilder/CloudBuilder.Security/Entity/SecurityScheduleTaskQueueEntity.auto.cs @@ -0,0 +1,184 @@ + +using CloudBuilder.Core.Authorization; +using CloudBuilder.Core.DatabaseAccessor.Entity; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +namespace CloudBuilder.Security.Entity + { + [TypeScript] + [Table("security_schedule_task_queue")] + public class SecurityScheduleTaskQueueEntity : ViewEntityBase + { + + public SecurityScheduleTaskQueueEntity() + { + } + + [Column("created_by")] + public string CreatedBy { get; set; } + [Column("created_datetime")] + public DateTime CreatedDatetime { get; set; } + [Column("document_id")] + public string DocumentId { get; set; } + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + [Column("queue_id")] + public int QueueId { get; set; } + [Column("task_id")] + public string TaskId { get; set; } + [Column("task_param")] + public string? TaskParam { get; set; } + [Column("updated_by")] + public string UpdatedBy { get; set; } + [Column("updated_datetime")] + public DateTime UpdatedDatetime { get; set; } + + public const string CREATED_BY = "CreatedBy"; + public const string CREATED_DATETIME = "CreatedDatetime"; + public const string DOCUMENT_ID = "DocumentId"; + public const string QUEUE_ID = "QueueId"; + public const string TASK_ID = "TaskId"; + public const string TASK_PARAM = "TaskParam"; + public const string UPDATED_BY = "UpdatedBy"; + public const string UPDATED_DATETIME = "UpdatedDatetime"; + + public const string DB_NAME_SECURITY_SCHEDULE_TASK_QUEUE = "security_schedule_task_queue"; + public const string DB_NAME_FIELDS="created_by,created_datetime,document_id,queue_id,task_id,task_param,updated_by,updated_datetime"; + + public const string DB_CREATED_BY = "created_by"; + public const string DB_CREATED_DATETIME = "created_datetime"; + public const string DB_DOCUMENT_ID = "document_id"; + public const string DB_QUEUE_ID = "queue_id"; + public const string DB_TASK_ID = "task_id"; + public const string DB_TASK_PARAM = "task_param"; + public const string DB_UPDATED_BY = "updated_by"; + public const string DB_UPDATED_DATETIME = "updated_datetime"; + + private string ProviderName { get; set; } + + public static SecurityScheduleTaskQueueEntity GetInstance(string providerName) + { + return new SecurityScheduleTaskQueueEntity() { ProviderName = providerName }; + } + + public virtual void CopyFrom(SecurityScheduleTaskQueueEntity source) + { + CopyFrom(source, true); + } + + public virtual void CopyFrom(SecurityScheduleTaskQueueEntity source, bool includeSystemFields) + { + if (source == null) + { + throw new NullReferenceException("Source entity is null."); + } + + this.CreatedBy = source.CreatedBy; + this.CreatedDatetime = source.CreatedDatetime; + this.DocumentId = source.DocumentId; + this.QueueId = source.QueueId; + this.TaskId = source.TaskId; + this.TaskParam = source.TaskParam; + this.UpdatedBy = source.UpdatedBy; + this.UpdatedDatetime = source.UpdatedDatetime; + + if (includeSystemFields) + { + this.CreatedBy = source.CreatedBy; + this.CreatedDatetime = source.CreatedDatetime; + this.UpdatedBy = source.UpdatedBy; + this.UpdatedDatetime = source.UpdatedDatetime; + } + } + + public override string GetSelectFrom() + { + if (ProviderName.Contains("MySql")) + { + return GetSelectFromByMySql(); + } + else if (ProviderName.Contains("SqlServer")) + { + return GetSelectFromByBySqlServer(); + } + else + { + throw new NotSupportedException($"不支持的数据库提供程序:{ProviderName}"); + } + } + public string GetSelectFromByMySql() + { + return $" select {DB_NAME_FIELDS} from { DB_NAME_SECURITY_SCHEDULE_TASK_QUEUE} with(nolock) "; + } + public string GetSelectFromByBySqlServer() + { + return $" select {DB_NAME_FIELDS} from { DB_NAME_SECURITY_SCHEDULE_TASK_QUEUE} "; + } + + public override string GetSelectCountFrom(string sqlWhere) + { + if (ProviderName.Contains("MySql")) + { + return GetSelectCountFromByMySql(sqlWhere); + } + else if (ProviderName.Contains("SqlServer")) + { + return GetSelectCountFromBySqlServer(sqlWhere); + } + else + { + throw new NotSupportedException($"不支持的数据库提供程序:{ProviderName}"); + } + } + + public string GetSelectCountFromByMySql(string sqlWhere) + { + return $" select count(*) from { DB_NAME_SECURITY_SCHEDULE_TASK_QUEUE} where 1=1 {sqlWhere}"; + } + public string GetSelectCountFromBySqlServer(string sqlWhere) + { + return $" select count(*) from { DB_NAME_SECURITY_SCHEDULE_TASK_QUEUE} with(nolock) where 1=1 {sqlWhere}"; + } + + public override string GetSelectTopFrom(int limit, int start, string orderby, string orderbytag, string sqlWhere) + { + if (ProviderName.Contains("MySql")) + { + return GetSelectTopFromByMySql(limit, start, orderby, orderbytag, sqlWhere); + } + else if (ProviderName.Contains("SqlServer")) + { + return GetSelectTopFromBySqlServer(limit, start, orderby, orderbytag, sqlWhere); + } + else + { + throw new NotSupportedException($"不支持的数据库提供程序:{ProviderName}"); + } + } + + public string GetSelectTopFromByMySql(int limit, int start,string orderby,string orderbytag, string sqlWhere) + { + if (string.IsNullOrEmpty(orderbytag) || orderbytag.Trim() != "desc") orderbytag = "asc"; + if (string.IsNullOrEmpty(orderby) || !DB_NAME_FIELDS.Contains(orderby)) orderby = DB_QUEUE_ID ; + int offset = limit * (start - 1); + return $" select {DB_NAME_FIELDS} from (select {DB_NAME_FIELDS} ,row_number() over(order by {orderby} {orderbytag}) as num from { DB_NAME_SECURITY_SCHEDULE_TASK_QUEUE} where 1=1 {sqlWhere} ) a where num> {offset} LIMIT {limit} "; + } + + public string GetSelectTopFromBySqlServer(int limit, int start,string orderby,string orderbytag, string sqlWhere) + { + if (string.IsNullOrEmpty(orderbytag) || orderbytag.Trim() != "desc") orderbytag = "asc"; + if (string.IsNullOrEmpty(orderby) || !DB_NAME_FIELDS.Contains(orderby)) orderby = DB_QUEUE_ID ; + string top = limit > 0 ? $"top {limit}" : ""; + return $" select {top} {DB_NAME_FIELDS} from (select {DB_NAME_FIELDS} ,row_number() over(order by {orderby} {orderbytag}) as num from { DB_NAME_SECURITY_SCHEDULE_TASK_QUEUE} with(nolock) where 1=1 {sqlWhere} ) a where num> {limit * (start - 1)}"; + } + + public SecurityScheduleTaskQueueEntity Clone() + { + SecurityScheduleTaskQueueEntity result = new SecurityScheduleTaskQueueEntity(); + result.CopyFrom(this); + + return result; + } + + } +} diff --git a/CloudBuilder/CloudBuilder.Security/Policy/FileTypePolicy.cs b/CloudBuilder/CloudBuilder.Security/Policy/FileTypePolicy.cs index f9fe9b5..7f01502 100644 --- a/CloudBuilder/CloudBuilder.Security/Policy/FileTypePolicy.cs +++ b/CloudBuilder/CloudBuilder.Security/Policy/FileTypePolicy.cs @@ -23,6 +23,7 @@ namespace CloudBuilder.Security.Policy public const string LYRIC = "L"; public const string JPG = ".jpg"; + public const string M3U8 = ".m3u8"; public static FileTypePolicy instance = null; @@ -78,7 +79,16 @@ namespace CloudBuilder.Security.Policy return GetType(value) == LYRIC; } + public static string PackPicUrl(IApplicationService service, string createdBy, string orderKey) + { + return PackUrl(service, createdBy, orderKey, YesNoPolicy.YES, true); + } public static string PackUrl(IApplicationService service, string createdBy, string orderKey, string transcodeIndc) + { + return PackUrl(service, createdBy, orderKey, transcodeIndc, false); + } + + public static string PackUrl(IApplicationService service, string createdBy, string orderKey, string transcodeIndc, bool isPic) { string url = string.Empty; var webRootPath = service.Configuration[ServiceSettingsPolicy.RequestPath] ?? ""; @@ -114,10 +124,20 @@ namespace CloudBuilder.Security.Policy { if (transcodeIndc == YesNoPolicy.YES) { - var upload = (ServiceSettingsPolicy.GetDmsFileBackupDirectory(service) ?? "").Replace(phy ?? "", ""); - var filePathRel = Path.Combine(upload, createdBy, fileExtension.Replace(".", ""), ""); - var filePath = filePathRel.Replace(Path.DirectorySeparatorChar, '/') + "/"; - url = service.Configuration[AppsettingsPolicy.ApplicationUrl] + webRootPath + filePath + Path.GetFileNameWithoutExtension(orderKey) + JPG + "?v=" + DateTime.Now.ToString("yyyyMMddhhmmss"); + if (isPic) + { + var upload = (ServiceSettingsPolicy.GetDmsFileBackupDirectory(service) ?? "").Replace(phy ?? "", ""); + var filePathRel = Path.Combine(upload, createdBy, fileExtension.Replace(".", ""), ""); + var filePath = filePathRel.Replace(Path.DirectorySeparatorChar, '/') + "/"; + url = service.Configuration[AppsettingsPolicy.ApplicationUrl] + webRootPath + filePath + Path.GetFileNameWithoutExtension(orderKey) + JPG + "?v=" + DateTime.Now.ToString("yyyyMMddhhmmss"); + } + else + { + var backup = (ServiceSettingsPolicy.GetDmsFileBackupDirectory(service) ?? "").Replace(phy ?? "", ""); + var filePathRel = Path.Combine(backup, createdBy, M3U8.Replace(".", ""), ""); + var filePath = filePathRel.Replace(Path.DirectorySeparatorChar, '/') + "/"; + url = service.Configuration[AppsettingsPolicy.ApplicationUrl] + webRootPath + filePath + Path.GetFileNameWithoutExtension(orderKey) + M3U8; + } } else { @@ -136,7 +156,7 @@ namespace CloudBuilder.Security.Policy } return url; } - public static string PackSourceVideoUrl(IApplicationService service, string createdBy, string orderKey) + public static string PackSourceVideoUrl(IApplicationService service, string createdBy, string orderKey, string transcodeIndc) { var webRootPath = service.Configuration[ServiceSettingsPolicy.RequestPath] ?? ""; var phy = service.Configuration[ServiceSettingsPolicy.PhysicalFileDirectory] ?? ""; @@ -145,8 +165,16 @@ namespace CloudBuilder.Security.Policy // 使用Path.Combine拼接路径,再将系统分隔符转为URL标准正斜杠 var filePathRel = Path.Combine(upload, createdBy, fileExtension.Replace(".", ""), ""); - var filePath = filePathRel.Replace(Path.DirectorySeparatorChar, '/') + "/"; + if (YesNoPolicy.IsYes(transcodeIndc)) + { + filePathRel = Path.Combine(upload, createdBy, M3U8.Replace(".", ""), ""); + } + var filePath = filePathRel.Replace(Path.DirectorySeparatorChar, '/') + "/"; + if (YesNoPolicy.IsYes(transcodeIndc)) + { + return (service.Configuration[AppsettingsPolicy.ApplicationUrl] ?? "") + webRootPath + filePath + Path.GetFileNameWithoutExtension(orderKey) + M3U8; + } return (service.Configuration[AppsettingsPolicy.ApplicationUrl] ?? "") + webRootPath + filePath + orderKey; } diff --git a/CloudBuilder/CloudBuilder.Web.Entry/CloudBuilder.Web.Entry.csproj.user b/CloudBuilder/CloudBuilder.Web.Entry/CloudBuilder.Web.Entry.csproj.user index d91626f..7b23cd1 100644 --- a/CloudBuilder/CloudBuilder.Web.Entry/CloudBuilder.Web.Entry.csproj.user +++ b/CloudBuilder/CloudBuilder.Web.Entry/CloudBuilder.Web.Entry.csproj.user @@ -1,7 +1,7 @@  - D:\Docker\CloudBuilder\CloudBuilder.Web.Entry\Properties\PublishProfiles\FolderProfile4.pubxml + D:\Docker\CloudBuilder\CloudBuilder.Web.Entry\Properties\PublishProfiles\FolderProfile3.pubxml http diff --git a/CloudBuilder/CloudBuilder.Web.Entry/Properties/PublishProfiles/FolderProfile3.pubxml.user b/CloudBuilder/CloudBuilder.Web.Entry/Properties/PublishProfiles/FolderProfile3.pubxml.user index 22559a9..8d98e46 100644 --- a/CloudBuilder/CloudBuilder.Web.Entry/Properties/PublishProfiles/FolderProfile3.pubxml.user +++ b/CloudBuilder/CloudBuilder.Web.Entry/Properties/PublishProfiles/FolderProfile3.pubxml.user @@ -3,7 +3,7 @@ <_PublishTargetUrl>C:\inetpub\wwwroot\dockwebapi2 - True|2026-09-19T01:48:52.0085130Z||;False|2026-09-19T09:47:56.1658214+08:00||;True|2026-09-17T18:50:15.9493380+08:00||;True|2026-09-17T18:11:11.5364547+08:00||;True|2026-09-17T18:07:27.7830758+08:00||;True|2026-09-17T17:58:16.5798560+08:00||;True|2026-09-17T15:37:30.9025614+08:00||;True|2026-09-17T15:25:46.9116292+08:00||;True|2026-09-17T15:05:18.6592403+08:00||;True|2026-09-17T14:57:28.7997437+08:00||;True|2026-09-17T14:36:00.6339386+08:00||;True|2026-09-17T13:56:43.2376873+08:00||;True|2026-09-16T13:56:51.8724546+08:00||;True|2026-09-15T20:44:46.6559899+08:00||;True|2026-09-13T19:02:59.5654245+08:00||;True|2026-09-10T09:14:56.2914193+08:00||;True|2026-09-09T16:40:16.6461154+08:00||;True|2026-09-08T13:55:23.1502435+08:00||;True|2026-09-08T08:04:53.4279263+08:00||;True|2026-09-07T08:48:17.4682304+08:00||;True|2026-09-04T14:39:08.7878670+08:00||;True|2026-09-04T14:35:48.2937877+08:00||;True|2026-09-04T11:45:16.1372876+08:00||;True|2026-09-04T11:42:59.9356436+08:00||;True|2026-09-03T16:05:52.5270232+08:00||;True|2026-09-03T14:52:56.8559144+08:00||;True|2026-09-02T11:08:23.8720038+08:00||;True|2026-09-02T10:58:16.8081797+08:00||;True|2026-08-26T13:34:12.3805892+08:00||;True|2026-08-25T08:31:30.7787234+08:00||;True|2026-08-20T13:10:46.4725468+08:00||;True|2026-08-20T13:10:28.3142576+08:00||;True|2026-08-19T16:10:27.3362887+08:00||;True|2026-08-19T16:01:12.6234971+08:00||;True|2026-08-19T15:42:46.6576265+08:00||;True|2026-08-19T13:39:59.9363522+08:00||;True|2026-08-19T13:36:53.0379313+08:00||;True|2026-08-19T13:31:36.0841398+08:00||;True|2026-08-19T11:44:37.5319626+08:00||;True|2026-08-19T09:36:45.6000047+08:00||;True|2026-08-19T09:34:36.8468631+08:00||;True|2026-08-19T08:35:41.2202300+08:00||;True|2026-08-18T16:20:59.0170916+08:00||; + True|2026-09-21T08:51:19.8137872Z||;True|2026-09-21T16:30:01.0950896+08:00||;True|2026-09-21T15:09:00.2326737+08:00||;True|2026-09-21T14:47:09.6120256+08:00||;True|2026-09-21T14:16:35.3194409+08:00||;True|2026-09-21T13:54:58.2829712+08:00||;True|2026-09-21T13:36:45.3134499+08:00||;True|2026-09-19T09:48:52.0085130+08:00||;False|2026-09-19T09:47:56.1658214+08:00||;True|2026-09-17T18:50:15.9493380+08:00||;True|2026-09-17T18:11:11.5364547+08:00||;True|2026-09-17T18:07:27.7830758+08:00||;True|2026-09-17T17:58:16.5798560+08:00||;True|2026-09-17T15:37:30.9025614+08:00||;True|2026-09-17T15:25:46.9116292+08:00||;True|2026-09-17T15:05:18.6592403+08:00||;True|2026-09-17T14:57:28.7997437+08:00||;True|2026-09-17T14:36:00.6339386+08:00||;True|2026-09-17T13:56:43.2376873+08:00||;True|2026-09-16T13:56:51.8724546+08:00||;True|2026-09-15T20:44:46.6559899+08:00||;True|2026-09-13T19:02:59.5654245+08:00||;True|2026-09-10T09:14:56.2914193+08:00||;True|2026-09-09T16:40:16.6461154+08:00||;True|2026-09-08T13:55:23.1502435+08:00||;True|2026-09-08T08:04:53.4279263+08:00||;True|2026-09-07T08:48:17.4682304+08:00||;True|2026-09-04T14:39:08.7878670+08:00||;True|2026-09-04T14:35:48.2937877+08:00||;True|2026-09-04T11:45:16.1372876+08:00||;True|2026-09-04T11:42:59.9356436+08:00||;True|2026-09-03T16:05:52.5270232+08:00||;True|2026-09-03T14:52:56.8559144+08:00||;True|2026-09-02T11:08:23.8720038+08:00||;True|2026-09-02T10:58:16.8081797+08:00||;True|2026-08-26T13:34:12.3805892+08:00||;True|2026-08-25T08:31:30.7787234+08:00||;True|2026-08-20T13:10:46.4725468+08:00||;True|2026-08-20T13:10:28.3142576+08:00||;True|2026-08-19T16:10:27.3362887+08:00||;True|2026-08-19T16:01:12.6234971+08:00||;True|2026-08-19T15:42:46.6576265+08:00||;True|2026-08-19T13:39:59.9363522+08:00||;True|2026-08-19T13:36:53.0379313+08:00||;True|2026-08-19T13:31:36.0841398+08:00||;True|2026-08-19T11:44:37.5319626+08:00||;True|2026-08-19T09:36:45.6000047+08:00||;True|2026-08-19T09:34:36.8468631+08:00||;True|2026-08-19T08:35:41.2202300+08:00||;True|2026-08-18T16:20:59.0170916+08:00||; \ No newline at end of file diff --git a/CloudBuilder/CloudBuilder.Web.Entry/appsettings.json b/CloudBuilder/CloudBuilder.Web.Entry/appsettings.json index 7b72bda..7ca6e07 100644 --- a/CloudBuilder/CloudBuilder.Web.Entry/appsettings.json +++ b/CloudBuilder/CloudBuilder.Web.Entry/appsettings.json @@ -10,7 +10,7 @@ "DbContexts": { "MasterDbContext": { "DbContextTypeName": "MasterDbContext", - "ConnectionString": "server=nas.youjiala.com;port=3307;database=builder;uid=root;pwd=Root@1237890;CharSet=utf8mb4;", + "ConnectionString": "server=nas.youjiala.com;port=3307;database=Furion;uid=root;pwd=Root@1237890;CharSet=utf8mb4;", "DatabaseType": "MySql", "LazyLoadingProxiesEnabled": true, "AuditEntityEnabled": true, @@ -58,11 +58,14 @@ "PhysicalFileDirectory": "D:\\Net8\\FileServer", "UploadFileDirectory": "D:\\Net8\\FileServer\\Upload", "BackupFileDirectory": "D:\\Net8\\FileServer\\Backup", - "ScaleFileDirectory": "D:\\Net8\\FileServer\\Backup", + "ScaleFileDirectory": "D:\\Net8\\FileServer\\Scale", "RequestPath": "/FileServer", //如果是IIS反向代理来的,那么要在本地给这个文件添加IUSR,IIS_IUSRS权限 "DmsFileDirectory": "DmsFile", "ExcelOutputDirectory": "D:\\Net8\\FileServer\\Output" }, + "ScheduleTask": { + "Ffmpeg": "RunTask" + }, "Ffmpeg": { "Path": "D:\\NET8\\Exe\\ffmpeg\\bin\\ffmpeg.exe", //视频转码 "Pictrue": " -i {0} -ss 00:00:2.000 -frames:v 1 -vf \"scale=1280:-1\" -q:v 4 {1}", //" -i {0} -ss 00:00:2.000 -frames:v 1 {1}",