Exemplo n.º 1
0
        private static void Main(string[] args)
        {
            Console.OutputEncoding = Encoding.UTF8;
            using (var context = new AppDbContext())
            {
//                DbInitializer dbInitializer = new DbInitializer(context);
//                dbInitializer.Seed().Wait();
                Mapper.Initialize(cfg =>
                {
                    cfg.AddProfile <DomainToViewModelMappingProfile>();
                    cfg.AddProfile <ViewModelToDomainMappingProfile>();
                });
                IRepository <Chapter, int> chapterRepository = new EFRepository <Chapter, int>(context);
                IUnitOfWork     unitOfWork       = new EFUnitOfWork(context);
                IChapterService chapterService   = new ChapterService(chapterRepository, unitOfWork);
                var             chapterViewModel = chapterService.GetAll();
                foreach (var item in chapterViewModel)
                {
                    Console.WriteLine(item.Name);
                }

                Console.WriteLine("------------------------------");
                var productViewModelPaging = chapterService.GetAllPaging("C", 3, 4);
                foreach (var item in productViewModelPaging.Results.OrderBy(x => x.Name))
                {
                    Console.WriteLine(item.Name);
                }

                Console.WriteLine("------------------------------");
//                ChapterViewModel chapterViewModelTest = new ChapterViewModel() {Name = "Test"};
//                var test = chapterService.Add(chapterViewModelTest);
//                chapterService.SaveChanges();
//                Console.WriteLine(test.Name + " " + test.Id);
                Console.WriteLine("------------------------------");
                ChapterViewModel chapterViewModelTestUpdate = new ChapterViewModel()
                {
                    Id   = 11,
                    Name = "TestUpdate"
                };
                chapterService.Update(chapterViewModelTestUpdate);
                chapterService.SaveChanges();
                foreach (var item in chapterService.GetAll())
                {
                    Console.WriteLine(item.Name);
                }
                Console.WriteLine("------------------------------");
                Console.WriteLine(chapterService.GetById(11).Name);
                Console.WriteLine("------------------------------");
//                ChapterViewModel chapterViewModelTest = new ChapterViewModel() {Name = "Test1"};
//                var test = chapterService.Add(chapterViewModelTest);
//                chapterService.SaveChanges();
                Console.WriteLine("------------------------------");
//                chapterService.Delete(12);
//                chapterService.SaveChanges();
                foreach (var item in chapterService.GetAll())
                {
                    Console.WriteLine(item.Name);
                }
            }
        }
Exemplo n.º 2
0
        private Course GetCourse()
        {
            RockContext rockContext = new RockContext();

            var courseId = PageParameter(PageParameterKeys.CourseId).AsIntegerOrNull();

            if (courseId != null)
            {
                CourseService courseService = new CourseService(rockContext);
                return(courseService.Get(courseId.Value));
            }

            var chapterId = PageParameter(PageParameterKeys.ChapterId).AsIntegerOrNull();

            if (chapterId != null)
            {
                ChapterService chapterService = new ChapterService(rockContext);
                var            chapter        = chapterService.Get(chapterId.Value);
                return(chapter.Course);
            }

            var coursePageId = PageParameter(PageParameterKeys.CoursePageId).AsIntegerOrNull();

            if (coursePageId != null)
            {
                CoursePageService coursePageService = new CoursePageService(rockContext);
                return(coursePageService.Get(coursePageId.Value).Chapter.Course);
            }

            return(null);
        }
Exemplo n.º 3
0
        private void PrintChapter(DocumentationChapter relation, Document document)
        {
            var chapter       = relation.Chapter;
            var parameters    = GetParameters(relation.Parameters);
            var chapterNumber = relation.ChapterNumber;
            var title         = parameters.ContainsKey("title") ? parameters["title"] : chapter.Name;

            if (chapter is Chapter)
            {
                GenerateChapterHeader(title, chapterNumber, relation.Title, relation.NewPage, document);

                if (!string.IsNullOrWhiteSpace((chapter as Chapter).Content))
                {
                    _parent.Add(_htmlToPdf.Parse(ChapterService.GetContent(chapter as Chapter), parameters));
                }

                Flush(document);
            }
            else if (chapter is GeneratedChapter)
            {
                GenerateChapterContent(chapter as GeneratedChapter, chapterNumber, relation.Title, relation.NewPage, parameters, document);
                Flush(document);
            }
            else if (chapter is PdfChapter)
            {
                GenerateChapterHeader(title, chapterNumber, relation.Title, relation.NewPage, document);
                var root = RootDirectory;
                var file = string.Format("{0}/{1}", root, relation.File.GetPath());
                _parent.Add(_docxToPdf.Parse(file));
                Flush(document);
            }
        }
Exemplo n.º 4
0
 public CreativeController(ApplicationDbContext DataBaseConnection)
 {
     this.dataBaseConnection = DataBaseConnection;
     CreativeService         = new CreativeService(dataBaseConnection);
     ChapterService          = new ChapterService(dataBaseConnection);
     CloudinaryService       = new CloudinaryService(dataBaseConnection);
 }
Exemplo n.º 5
0
        protected void btnSave_Click(object sender, EventArgs e)
        {
            RockContext    rockContext    = new RockContext();
            ChapterService chapterService = new ChapterService(rockContext);

            var chapter = GetChapter(chapterService);

            chapter.Name        = tbName.Text;
            chapter.Description = tbDescription.Text;


            if (chapter.Id == 0)
            {
                chapterService.Add(chapter);

                var courseId = PageParameter(PageParameterKey.CourseId).AsIntegerOrNull();
                var chapters = chapterService
                               .Queryable()
                               .Where(cc => cc.CourseId == courseId)
                               .OrderBy(cc => cc.Order).ToList();

                chapter.Order = 0;
                if (chapters.Any())
                {
                    chapter.Order = chapters.Last().Order + 1;
                }
            }

            rockContext.SaveChanges();
            NavigateToCurrentPage(new Dictionary <string, string> {
                { PageParameterKey.ChapterId, chapter.Id.ToString() }
            });
        }
Exemplo n.º 6
0
        private Chapter GetChapter(ChapterService chapterService)
        {
            var coursepageId = PageParameter(PageParameterKey.CoursePageId).AsIntegerOrNull();

            if (coursepageId.HasValue)
            {
                return(null);
            }

            var chapterId = PageParameter(PageParameterKey.ChapterId).AsIntegerOrNull();

            if (!chapterId.HasValue)
            {
                return(null);
            }

            var chapter = chapterService.Get(chapterId.Value);

            if (chapter == null)
            {
                chapter = new Chapter()
                {
                    CourseId = PageParameter(PageParameterKey.CourseId).AsInteger()
                };
            }

            return(chapter);
        }
Exemplo n.º 7
0
 public int AddChapter(ChapterForm chapterForm)
 {
     using (var uow = UnitOfWorkFactory.Create <NovelContext>())
     {
         var service = new ChapterService(uow);
         return(service.SaveChanges(chapterForm));
     }
 }
Exemplo n.º 8
0
 private void HandleRequest()
 {
     Tools.ParseRequestStr(RequestStr, ref requestCode, ref requestData);
     ChapterService.ReturnFromServiceSignal.AddListener(HandleResponse);
     if (requestCode == ChapterEvent.GetAllChapters)
     {
         ChapterService.GetAllChapters();
     }
 }
Exemplo n.º 9
0
        protected void btnDelete_Click(object sender, EventArgs e)
        {
            RockContext    rockContext    = new RockContext();
            ChapterService chapterService = new ChapterService(rockContext);
            var            chapter        = GetChapter(chapterService);

            chapterService.Delete(chapter);
            rockContext.SaveChanges();
            NavigateToParentPage();
        }
Exemplo n.º 10
0
        private void gList_GridReorder(object sender, GridReorderEventArgs e)
        {
            var            rockContext    = new RockContext();
            ChapterService chapterService = new ChapterService(rockContext);
            var            courseId       = PageParameter(PageParameterKey.CourseId).AsInteger();
            var            items          = chapterService.Queryable().Where(p => p.CourseId == courseId).OrderBy(i => i.Order).ToList();

            chapterService.Reorder(items, e.OldIndex, e.NewIndex);
            rockContext.SaveChanges();
            BindGrid();
        }
Exemplo n.º 11
0
        protected async Task DeleteChapter(Chapter OneChapter)
        {
            MessageBoxDialogResult result = await ModalDialog.ShowMessageBoxAsync("Confirm Delete", "Are you sure you want to delete the chapter ?", MessageBoxButtons.YesNo, MessageBoxDefaultButton.Button2);

            if (result == MessageBoxDialogResult.Yes)
            {
                await ChapterService.DeleteChapter(OneChapter.Id);

                OneQuiz.Chapters.Remove(OneChapter);
                StateHasChanged();
            }
        }
Exemplo n.º 12
0
        protected void btnDelete_Click(object sender, RowEventArgs e)
        {
            var            id             = ( int )e.RowKeyValue;
            RockContext    rockContext    = new RockContext();
            ChapterService chapterService = new ChapterService(rockContext);
            var            coursePage     = chapterService.Get(id);

            if (coursePage != null)
            {
                chapterService.Delete(coursePage);
                rockContext.SaveChanges();
            }

            BindGrid();
        }
Exemplo n.º 13
0
        public void Setup()
        {
            _random = new Random();

            _chapterRepositoryMock    = new Mock <IChapterRepository>();
            _periodRepositoryMock     = new Mock <IPeriodRepository>();
            _courseRepositoryMock     = new Mock <ICourseRepository>();
            _testResultRepositoryMock = new Mock <ITestResultRepository>();
            _testResultConverterMock  = new Mock <IAssignmentWitResultsConverter>();

            _service = new ChapterService(_chapterRepositoryMock.Object,
                                          _courseRepositoryMock.Object,
                                          _periodRepositoryMock.Object,
                                          _testResultRepositoryMock.Object,
                                          _testResultConverterMock.Object);
        }
Exemplo n.º 14
0
        /// <summary>
        /// Set tok entry
        /// </summary>
        /// <param name="plr">Player that initiated the command</param>
        /// <param name="values">List of command arguments (after command name)</param>
        /// <returns>True if command was correctly handled, false if operation was canceled</returns>
        public static bool ChapterTok(Player plr, ref List <string> values)
        {
            int entry    = GetInt(ref values);
            int tokEntry = GetInt(ref values);

            Chapter_Info chapter = ChapterService.GetChapter((ushort)entry);
            Tok_Info     tok     = TokService.GetTok((ushort)entry);

            if (tok == null || chapter == null)
            {
                return(false);
            }

            chapter.TokEntry = (ushort)tokEntry;
            chapter.Dirty    = true;
            WorldMgr.Database.SaveObject(chapter);

            return(true);
        }
Exemplo n.º 15
0
        public ChapterDetail GetChapter(ChapterCriteria criteria)
        {
            using (var uow = UnitOfWorkFactory.Create <NovelContext>())
            {
                var service = new ChapterService(uow);
                var detail  = service.Get(criteria);

                // novel
                detail.Novel = service.View <Novel>().Where(w => w.ID == detail.NovelID).Single();
                // chapter content
                var contents = service.View <Content>().Where(w => w.ChapterID == detail.ID).Select(s => new ContentGrid
                {
                    ID      = s.ID,
                    RawHash = s.RawHash,
                    Final   = s.Final,
                }).ToList();

                // summarize
                detail.Summarize = service.View <Summarize>().Where(w => w.SourceTable == R.SourceTable.CHAPTER && w.SourceID == detail.ID).SingleOrDefault() ?? new Summarize();
                // glossary
                detail.Glossaries = service.View <Glossary>().Where(w => w.SourceTable == R.SourceTable.NOVEL && w.SourceID == detail.NovelID).ToList();
                // checked
                var contentIDs = contents.Select(s => s.ID).ToList();
                detail.Checks = service.View <Check>().Where(w => w.IsDeleted == false && contentIDs.Contains(w.SourceID) && w.SourceTable == R.SourceTable.CONTENT).ToList();
                // segments (paragraphs)
                var paragraphs = detail.Content.ToParagraphs().Select((s, i) => new { Index = i, Raw = s, RawHash = s.GetIntHash() });

                detail.Contents = paragraphs.Join(contents, p => p.RawHash, c => c.RawHash, (p, c) => new ContentGrid
                {
                    ID           = c.ID,
                    Final        = c.Final,
                    Paragraph    = p.Index,
                    RawHash      = p.RawHash,
                    Raw          = p.Raw,
                    IsTranslated = detail.Checks.Any(w => w.Type == R.CheckType.TRANSLATING && w.SourceID == c.ID),
                    IsEdited     = detail.Checks.Any(w => w.Type == R.CheckType.EDITING && w.SourceID == c.ID),
                    IsProofread  = detail.Checks.Any(w => w.Type == R.CheckType.PROOFREADING && w.SourceID == c.ID),
                }).ToList();

                return(detail);
            }
        }
Exemplo n.º 16
0
        /// <summary>
        /// Save chapter position
        /// </summary>
        /// <param name="plr">Player that initiated the command</param>
        /// <param name="values">List of command arguments (after command name)</param>
        /// <returns>True if command was correctly handled, false if operation was canceled</returns>
        public static bool ChapterSave(Player plr, ref List <string> values)
        {
            int entry = GetInt(ref values);

            Chapter_Info info = ChapterService.GetChapter((ushort)entry);

            if (info == null)
            {
                return(false);
            }

            info.PinX = (ushort)plr.X;
            info.PinY = (ushort)plr.Y;

            plr.SendClientMessage("Saved [" + info.Name + "] to '" + plr.X + "','" + plr.Y + "'");

            info.Dirty = true;
            WorldMgr.Database.SaveObject(info);

            return(true);
        }
Exemplo n.º 17
0
        protected async Task AddChapter()
        {
            if (OneQuiz.Id == 0)
            {
                var response = await ModalDialog.ShowMessageBoxAsync("Question", "Do you want to save this new quiz ?", MessageBoxButtons.YesNo);

                if (response == MessageBoxDialogResult.No)
                {
                    return;
                }
                var result = await TrySavingChanges();

                if (result == false)
                {
                    return;
                }
            }

            ModalDataInputForm frm = new ModalDataInputForm("Add chapter", "Please give a title");

            var titleFld = frm.AddStringField("title", "Title", "", "The title of the chapter");

            if (await frm.ShowAsync(ModalDialog))
            {
                var chapter = new Chapter {
                    Title = titleFld.Value, QuizTopicId = OneQuiz.Id
                };
                var addedChapter = await ChapterService.AddChapter(chapter);

                if (OneQuiz.Chapters == null)
                {
                    OneQuiz.Chapters = new List <Chapter>();
                }

                OneQuiz.Chapters.Add(addedChapter);
                StateHasChanged();
            }
        }
Exemplo n.º 18
0
        public void RemoveUnnecessaryEnd()
        {
            List <string> toRemove = new List <string>();

            foreach (KeyValuePair <string, string> chapter in Chapters)
            {
                long timeInMiliSec = ChapterService.StrToMilisec(chapter.Key);
                if (timeInMiliSec >= LengthInMiliSec - 1001)
                {
                    Logger.Info(chapter.Value + ":" + chapter.Key + "的时间在文件结尾1秒内,删除。");
                    toRemove.Add(chapter.Key);
                }
            }

            if (toRemove.Count > 0)
            {
                foreach (string key in toRemove)
                {
                    Chapters.Remove(key);
                }
                WriteChapter();
            }
        }
Exemplo n.º 19
0
        /// <summary>
        /// Binds the grid.
        /// </summary>
        private void BindGrid()
        {
            var           courseId      = PageParameter(PageParameterKey.CourseId).AsInteger();
            RockContext   rockContext   = new RockContext();
            CourseService courseService = new CourseService(rockContext);
            var           course        = courseService.Get(courseId);

            if (course == null || course.ExternalCourseUrl.IsNotNullOrWhiteSpace())
            {
                this.Visible = false;
                return;
            }

            ChapterService chapterService = new ChapterService(rockContext);


            var qry = chapterService.Queryable()
                      .Where(cc => cc.CourseId == courseId)
                      .OrderBy(cc => cc.Order);

            gList.SetLinqDataSource(qry);
            gList.DataBind();
        }
Exemplo n.º 20
0
 public ChaptersController(ChapterService chapterService)
 {
     _chapterService = chapterService;
 }
Exemplo n.º 21
0
 public ChapterChecker(OKEFile chapterFile, long lengthInMiliSec)
 {
     ChapterFile     = chapterFile;
     LengthInMiliSec = lengthInMiliSec;
     Chapters        = ChapterService.ReadChapters(chapterFile);
 }
Exemplo n.º 22
0
 public ChapterController()
 {
     service = new ChapterService();
 }
Exemplo n.º 23
0
        private void WorkerDoWork(object sender, DoWorkEventArgs e)
        {
            WorkerArgs args = (WorkerArgs)e.Argument;

            while (IsRunning)
            {
                TaskDetail task = args.taskManager.GetNextTask();

                // 检查是否已经完成全部任务
                if (task == null)
                {
                    // 全部工作完成
                    lock (o)
                    {
                        bgworkerlist.TryRemove(args.Name, out BackgroundWorker v);

                        if (bgworkerlist.Count == 0)
                        {
                            IsRunning = false;
                            Debugger.Log(0, "", "Ready to call the after finish process\n");
                            AfterFinish?.Invoke();
                        }
                    }
                    return;
                }

                TaskProfile profile = task.Taskfile;
                try
                {
                    task.WorkerName   = args.Name;
                    task.IsEnabled    = false;
                    task.IsRunning    = true;
                    task.MediaOutFile = new MediaFile();
                    task.MkaOutFile   = new MediaFile();

                    // 抽取音轨
                    profile.ExtractVideo = VideoService.ForceExtractVideo(task.InputFile);
                    FileInfo  eacInfo   = new FileInfo(".\\tools\\eac3to\\eac3to.exe");
                    MediaFile srcTracks = new EACDemuxer(eacInfo.FullName, task.InputFile, profile).Extract(
                        (double progress, EACProgressType type) =>
                    {
                        switch (type)
                        {
                        case EACProgressType.Analyze:
                            task.CurrentStatus = "轨道分析中";
                            task.ProgressValue = progress;
                            break;

                        case EACProgressType.Process:
                            task.CurrentStatus = "抽取音轨中";
                            task.ProgressValue = progress;
                            break;

                        case EACProgressType.Completed:
                            task.CurrentStatus = "音轨抽取完毕";
                            task.ProgressValue = progress;
                            break;

                        default:
                            return;
                        }
                    });

                    // 新建音频处理工作
                    for (int id = 0; id < srcTracks.AudioTracks.Count; id++)
                    {
                        AudioTrack track  = srcTracks.AudioTracks[id];
                        OKEFile    file   = track.File;
                        AudioInfo  info   = track.Info as AudioInfo;
                        MuxOption  option = info.MuxOption;
                        switch (option)
                        {
                        case MuxOption.Default:
                        case MuxOption.Mka:
                        case MuxOption.External:
                            AudioJob audioJob = new AudioJob(info);
                            audioJob.SetUpdate(task);
                            audioJob.Input  = file.GetFullPath();
                            audioJob.Output = Path.ChangeExtension(audioJob.Input, "." + audioJob.CodecString.ToLower());

                            task.JobQueue.Enqueue(audioJob);
                            break;

                        default:
                            break;
                        }
                    }

                    // 如果必须抽取视频轨道,这里需要修改输入的vpy文件
                    if (profile.ExtractVideo)
                    {
                        VideoService.ReplaceVpyInputFile(profile.InputScript, task.InputFile, srcTracks.VideoTrack.File.GetFullPath());
                    }


                    // 新建视频处理工作
                    VideoJob videoJob = new VideoJob(profile.VideoFormat);
                    videoJob.SetUpdate(task);

                    videoJob.Input       = profile.InputScript;
                    videoJob.EncoderPath = profile.Encoder;
                    videoJob.EncodeParam = profile.EncoderParam;
                    videoJob.Fps         = profile.Fps;
                    videoJob.FpsNum      = profile.FpsNum;
                    videoJob.FpsDen      = profile.FpsDen;
                    videoJob.NumaNode    = args.numaNode;
                    if (profile.Config != null)
                    {
                        videoJob.VspipeArgs.AddRange(profile.Config.VspipeArgs);
                    }

                    if (profile.VideoFormat == "HEVC")
                    {
                        videoJob.Output = new FileInfo(task.InputFile).FullName + ".hevc";
                        if (!profile.EncoderParam.ToLower().Contains("--pools"))
                        {
                            videoJob.EncodeParam += " --pools " + NumaNode.X265PoolsParam(videoJob.NumaNode);
                        }
                    }
                    else
                    {
                        videoJob.Output  = new FileInfo(task.InputFile).FullName;
                        videoJob.Output += profile.ContainerFormat == "MKV" ? "_.mkv" : ".h264";
                        if (!profile.EncoderParam.ToLower().Contains("--threads") && NumaNode.UsableCoreCount > 10)
                        {
                            videoJob.EncodeParam += " --threads 16";
                        }
                    }

                    task.JobQueue.Enqueue(videoJob);

                    // 添加字幕文件
                    foreach (SubtitleTrack track in srcTracks.SubtitleTracks)
                    {
                        OKEFile outputFile = track.File;
                        Info    info       = track.Info;
                        switch (info.MuxOption)
                        {
                        case MuxOption.Default:
                            task.MediaOutFile.AddTrack(track);
                            break;

                        case MuxOption.Mka:
                            task.MkaOutFile.AddTrack(track);
                            break;

                        case MuxOption.External:
                            outputFile.AddCRC32();
                            break;

                        default:
                            break;
                        }
                    }

                    while (task.JobQueue.Count != 0)
                    {
                        Job job = task.JobQueue.Dequeue();

                        if (job is AudioJob)
                        {
                            AudioJob  audioJob = job as AudioJob;
                            AudioInfo info     = audioJob.Info as AudioInfo;
                            string    srcFmt   = Path.GetExtension(audioJob.Input).ToUpper().Remove(0, 1);
                            if (srcFmt == "FLAC" && audioJob.CodecString == "AAC")
                            {
                                task.CurrentStatus    = "音频转码中";
                                task.IsUnKnowProgress = true;

                                QAACEncoder qaac = new QAACEncoder(audioJob, info.Bitrate);

                                qaac.start();
                                qaac.waitForFinish();
                            }
                            else if (srcFmt != audioJob.CodecString)
                            {
                                OKETaskException ex = new OKETaskException(Constants.audioFormatMistachSmr);
                                ex.Data["SRC_FMT"] = srcFmt;
                                ex.Data["DST_FMT"] = audioJob.CodecString;
                                throw ex;
                            }

                            OKEFile outputFile = new OKEFile(job.Output);
                            switch (info.MuxOption)
                            {
                            case MuxOption.Default:
                                task.MediaOutFile.AddTrack(new AudioTrack(outputFile, info));
                                break;

                            case MuxOption.Mka:
                                task.MkaOutFile.AddTrack(new AudioTrack(outputFile, info));
                                break;

                            case MuxOption.External:
                                outputFile.AddCRC32();
                                break;

                            default:
                                break;
                            }
                        }
                        else if (job is VideoJob)
                        {
                            videoJob = job as VideoJob;
                            CommandlineVideoEncoder processor;
                            task.CurrentStatus    = "获取信息中";
                            task.IsUnKnowProgress = true;
                            if (job.CodecString == "HEVC")
                            {
                                processor = new X265Encoder(videoJob);
                            }
                            else
                            {
                                processor = new X264Encoder(videoJob);
                            }

                            task.lengthInMiliSec = (long)((processor.NumberOfFrames - 1) / videoJob.Fps * 1000 + 0.5);

                            // 添加章节文件
                            OKEFile chapterFile = ChapterService.AddChapter(task);
                            if (chapterFile != null)
                            {
                                // 用章节文件生成qpfile
                                string qpFileName = Path.ChangeExtension(task.InputFile, ".qpf");
                                string qpFile     = ChapterService.GenerateQpFile(chapterFile, videoJob.Fps);
                                File.WriteAllText(qpFileName, qpFile);
                                processor.AppendParameter($"--qpfile \"{qpFileName}\"");
                            }

                            // 开始压制
                            task.CurrentStatus = "压制中";
                            task.ProgressValue = 0.0;
                            processor.start();
                            processor.waitForFinish();

                            VideoInfo info = new VideoInfo(videoJob.FpsNum, videoJob.FpsDen);

                            task.MediaOutFile.AddTrack(new VideoTrack(new OKEFile(job.Output), info));
                        }
                        else
                        {
                            // 不支持的工作
                        }
                    }

                    // 封装
                    if (profile.ContainerFormat != "")
                    {
                        task.CurrentStatus = "封装中";
                        FileInfo mkvInfo = new FileInfo(".\\tools\\mkvtoolnix\\mkvmerge.exe");
                        if (!mkvInfo.Exists)
                        {
                            throw new Exception("mkvmerge不存在");
                        }

                        FileInfo lsmash = new FileInfo(".\\tools\\l-smash\\muxer.exe");
                        if (!lsmash.Exists)
                        {
                            throw new Exception("l-smash 封装工具不存在");
                        }

                        AutoMuxer muxer = new AutoMuxer(mkvInfo.FullName, lsmash.FullName);
                        muxer.ProgressChanged += progress => task.ProgressValue = progress;

                        muxer.StartMuxing(Path.GetDirectoryName(task.InputFile) + "\\" + task.OutputFile, task.MediaOutFile);
                    }
                    if (task.MkaOutFile.Tracks.Count > 0)
                    {
                        task.CurrentStatus = "封装MKA中";
                        FileInfo  mkvInfo = new FileInfo(".\\tools\\mkvtoolnix\\mkvmerge.exe");
                        FileInfo  lsmash  = new FileInfo(".\\tools\\l-smash\\muxer.exe");
                        AutoMuxer muxer   = new AutoMuxer(mkvInfo.FullName, lsmash.FullName);
                        muxer.ProgressChanged += progress => task.ProgressValue = progress;
                        string mkaOutputFile = task.InputFile + ".mka";

                        muxer.StartMuxing(mkaOutputFile, task.MkaOutFile);
                    }

                    task.CurrentStatus = "完成";
                    task.ProgressValue = 100;
                }
                catch (OKETaskException ex)
                {
                    ExceptionMsg msg = ExceptionParser.Parse(ex, task);
                    Logger.Error(msg);
                    new System.Threading.Tasks.Task(() =>
                                                    System.Windows.MessageBox.Show(msg.errorMsg, msg.fileName)).Start();
                    task.IsRunning     = false;
                    task.CurrentStatus = ex.summary;
                    task.ProgressValue = ex.progress.GetValueOrDefault(task.ProgressValue);
                    continue;
                }
                catch (Exception ex)
                {
                    FileInfo fileinfo = new FileInfo(task.InputFile);
                    Logger.Error(ex.Message + ex.StackTrace);
                    new System.Threading.Tasks.Task(() =>
                                                    System.Windows.MessageBox.Show(ex.Message, fileinfo.Name)).Start();
                    task.IsRunning     = false;
                    task.CurrentStatus = "未知错误";
                    continue;
                }
            }
        }
Exemplo n.º 24
0
 public ChaptersController(ChapterService chapterService, IMapper mapper, ILogger <ChaptersController> logger)
 {
     this._chapterService = chapterService;
     this.mapper          = mapper;
     this.logger          = logger;
 }
Exemplo n.º 25
0
        private void WorkerDoWork(object sender, DoWorkEventArgs e)
        {
            WorkerArgs args = (WorkerArgs)e.Argument;

            while (IsRunning)
            {
                TaskDetail task = args.taskManager.GetNextTask();

                // 检查是否已经完成全部任务
                if (task == null)
                {
                    Logger.Debug("所有任务已经完成");
                    Action <MainWindow> disableButtonsAction = new Action <MainWindow>(DisableButtonsAfterFinish);
                    MainWindow.Dispatcher.BeginInvoke(disableButtonsAction, MainWindow);
                    lock (o)
                    {
                        bgworkerlist.TryRemove(args.Name, out BackgroundWorker v);
                        if (bgworkerlist.Count == 0)
                        {
                            IsRunning = false;

                            if (args.taskManager.AllSuccess())
                            {
                                if (AfterFinish != null)
                                {
                                    Logger.Info("全部任务正常结束;准备执行完结命令。");
                                    MainWindow.Dispatcher.BeginInvoke(AfterFinish, MainWindow);
                                }
                                else
                                {
                                    Logger.Info("全部任务正常结束;没有完结命令。");
                                }
                            }
                            else
                            {
                                Logger.Info("有些任务未正常结束,不执行完结命令。");
                            }
                        }
                    }
                    return;
                }

                TaskProfile profile = task.Taskfile;
                try
                {
                    task.WorkerName   = args.Name;
                    task.Progress     = TaskStatus.TaskProgress.RUNNING;
                    task.MediaOutFile = new MediaFile();
                    task.MkaOutFile   = new MediaFile();

                    // 抽取音轨
                    profile.ExtractVideo = VideoService.ForceExtractVideo(task.InputFile);
                    FileInfo  eacInfo   = new FileInfo(Constants.eac3toWrapperPath);
                    MediaFile srcTracks = new EACDemuxer(eacInfo.FullName, task.InputFile, profile).Extract(
                        (double progress, EACProgressType type) =>
                    {
                        switch (type)
                        {
                        case EACProgressType.Analyze:
                            task.CurrentStatus = "轨道分析中";
                            task.ProgressValue = progress;
                            break;

                        case EACProgressType.Process:
                            task.CurrentStatus = "抽取音轨中";
                            task.ProgressValue = progress;
                            break;

                        case EACProgressType.Completed:
                            task.CurrentStatus = "音轨抽取完毕";
                            task.ProgressValue = progress;
                            break;

                        default:
                            return;
                        }
                    });

                    // 新建音频处理工作
                    for (int id = 0; id < srcTracks.AudioTracks.Count; id++)
                    {
                        AudioTrack track  = srcTracks.AudioTracks[id];
                        OKEFile    file   = track.File;
                        AudioInfo  info   = track.Info as AudioInfo;
                        MuxOption  option = info.MuxOption;
                        switch (option)
                        {
                        case MuxOption.Default:
                        case MuxOption.Mka:
                        case MuxOption.External:
                            AudioJob audioJob = new AudioJob(info);
                            audioJob.SetUpdate(task);
                            audioJob.Input  = file.GetFullPath();
                            audioJob.Output = Path.ChangeExtension(audioJob.Input, "." + audioJob.CodecString.ToLower());

                            task.JobQueue.Enqueue(audioJob);
                            break;

                        default:
                            break;
                        }
                    }

                    // 如果必须抽取视频轨道,这里需要修改输入的vpy文件
                    if (profile.ExtractVideo)
                    {
                        VideoService.ReplaceVpyInputFile(profile.InputScript, task.InputFile, srcTracks.VideoTrack.File.GetFullPath());
                    }


                    // 新建视频处理工作
                    VideoJob videoJob = new VideoJob(profile.VideoFormat);
                    videoJob.SetUpdate(task);

                    videoJob.Input       = profile.InputScript;
                    videoJob.EncoderPath = profile.Encoder;
                    videoJob.EncodeParam = profile.EncoderParam;
                    videoJob.Vfr         = profile.TimeCode;
                    videoJob.Fps         = profile.Fps;
                    videoJob.FpsNum      = profile.FpsNum;
                    videoJob.FpsDen      = profile.FpsDen;
                    videoJob.NumaNode    = args.numaNode;
                    if (profile.Config != null)
                    {
                        videoJob.VspipeArgs.AddRange(profile.Config.VspipeArgs);
                    }

                    if (profile.VideoFormat == "HEVC")
                    {
                        videoJob.Output = task.Taskfile.WorkingPathPrefix + ".hevc";
                        if (!profile.EncoderParam.ToLower().Contains("--pools"))
                        {
                            videoJob.EncodeParam += " --pools " + NumaNode.X265PoolsParam(videoJob.NumaNode);
                        }
                    }
                    else
                    {
                        videoJob.Output  = task.Taskfile.WorkingPathPrefix;
                        videoJob.Output += profile.ContainerFormat == "MKV" ? "_.mkv" : ".h264";
                        if (!profile.EncoderParam.ToLower().Contains("--threads") && NumaNode.UsableCoreCount > 10)
                        {
                            videoJob.EncodeParam += " --threads 16";
                        }
                    }

                    task.JobQueue.Enqueue(videoJob);

                    // 添加字幕文件
                    foreach (SubtitleTrack track in srcTracks.SubtitleTracks)
                    {
                        OKEFile outputFile = track.File;
                        Info    info       = track.Info;
                        switch (info.MuxOption)
                        {
                        case MuxOption.Default:
                            task.MediaOutFile.AddTrack(track);
                            break;

                        case MuxOption.Mka:
                            task.MkaOutFile.AddTrack(track);
                            break;

                        case MuxOption.External:
                            outputFile.AddCRC32();
                            break;

                        default:
                            break;
                        }
                    }

                    while (task.JobQueue.Count != 0)
                    {
                        Job job = task.JobQueue.Dequeue();

                        switch (job)
                        {
                        case AudioJob aJob:
                        {
                            AudioInfo info   = aJob.Info;
                            string    srcFmt = Path.GetExtension(aJob.Input).ToUpper().Remove(0, 1);
                            if (srcFmt == "FLAC" && aJob.CodecString == "AAC")
                            {
                                task.CurrentStatus = "音频转码中";

                                QAACEncoder qaac = new QAACEncoder(aJob, (double progress) =>
                                    {
                                        task.ProgressValue = progress;
                                    }, info.Bitrate);

                                qaac.start();
                                qaac.waitForFinish();
                            }
                            else if (srcFmt != aJob.CodecString)
                            {
                                OKETaskException ex = new OKETaskException(Constants.audioFormatMistachSmr);
                                ex.Data["SRC_FMT"] = srcFmt;
                                ex.Data["DST_FMT"] = aJob.CodecString;
                                throw ex;
                            }

                            OKEFile outputFile = new OKEFile(aJob.Output);
                            switch (info.MuxOption)
                            {
                            case MuxOption.Default:
                                task.MediaOutFile.AddTrack(new AudioTrack(outputFile, info));
                                break;

                            case MuxOption.Mka:
                                task.MkaOutFile.AddTrack(new AudioTrack(outputFile, info));
                                break;

                            case MuxOption.External:
                                outputFile.AddCRC32();
                                break;

                            default:
                                break;
                            }

                            break;
                        }

                        case VideoJob vJob:
                        {
                            CommandlineVideoEncoder processor;
                            task.CurrentStatus    = "获取信息中";
                            task.IsUnKnowProgress = true;
                            if (vJob.CodecString == "HEVC")
                            {
                                processor = new X265Encoder(vJob);
                            }
                            else
                            {
                                processor = new X264Encoder(vJob);
                            }

                            // 时间码文件
                            Timecode timecode     = null;
                            string   timeCodeFile = null;
                            if (vJob.Vfr)
                            {
                                timecode = new Timecode(Path.ChangeExtension(task.InputFile, ".tcfile"),
                                                        (int)processor.NumberOfFrames);
                                timeCodeFile = Path.ChangeExtension(task.InputFile, ".v2.tcfile");
                                try
                                {
                                    timecode.SaveTimecode(timeCodeFile);
                                }
                                catch (IOException ex)
                                {
                                    Logger.Info($"无法写入修正后timecode,将使用原文件\n{ex.Message}");
                                    timeCodeFile = Path.ChangeExtension(task.InputFile, ".tcfile");
                                }

                                task.LengthInMiliSec = (long)(timecode.TotalLength.Ticks / 1e4 + 0.5);
                            }
                            else
                            {
                                task.LengthInMiliSec =
                                    (long)((processor.NumberOfFrames - 1) / vJob.Fps * 1000 + 0.5);
                            }

                            // 添加章节文件
                            ChapterInfo chapterInfo = ChapterService.LoadChapter(task);
                            if (chapterInfo != null)
                            {
                                if (task.ChapterStatus == ChapterStatus.Maybe ||
                                    task.ChapterStatus == ChapterStatus.MKV)
                                {
                                    task.ChapterStatus = ChapterStatus.Added;
                                }

                                FileInfo inputChapterFile =
                                    new FileInfo(Path.ChangeExtension(task.InputFile, ".txt"));
                                FileInfo outputChapterFile =
                                    new FileInfo(Path.ChangeExtension(task.Taskfile.WorkingPathPrefix, ".txt"));
                                if (inputChapterFile.Exists && !File.Exists(outputChapterFile.FullName))
                                {
                                    File.Copy(inputChapterFile.FullName, outputChapterFile.FullName);
                                }

                                chapterInfo.Save(ChapterTypeEnum.OGM, outputChapterFile.FullName);
                                outputChapterFile.Refresh();
                                OKEFile chapterFile = new OKEFile(outputChapterFile);
                                task.MediaOutFile.AddTrack(new ChapterTrack(chapterFile));

                                // 用章节文件生成qpfile
                                string qpFileName = Path.ChangeExtension(task.Taskfile.WorkingPathPrefix, ".qpf");
                                string qpFile     = vJob.Vfr
                                        ? ChapterService.GenerateQpFile(chapterInfo, timecode)
                                        : ChapterService.GenerateQpFile(chapterInfo, vJob.Fps);
                                File.WriteAllText(qpFileName, qpFile);
                                processor.AppendParameter($"--qpfile \"{qpFileName}\"");
                            }
                            else
                            {
                                task.ChapterStatus = ChapterStatus.No;
                            }

                            // 开始压制
                            task.CurrentStatus = "压制中";
                            task.ProgressValue = 0.0;
                            processor.start();
                            processor.waitForFinish();

                            VideoInfo info = new VideoInfo(vJob.FpsNum, vJob.FpsDen, timeCodeFile);

                            task.MediaOutFile.AddTrack(new VideoTrack(new OKEFile(vJob.Output), info));
                            break;
                        }

                        default:
                            // 不支持的工作
                            break;
                        }
                    }

                    // 封装
                    if (profile.ContainerFormat != "")
                    {
                        task.CurrentStatus = "封装中";
                        FileInfo mkvInfo = new FileInfo(".\\tools\\mkvtoolnix\\mkvmerge.exe");
                        if (!mkvInfo.Exists)
                        {
                            throw new Exception("mkvmerge不存在");
                        }

                        FileInfo lsmash = new FileInfo(".\\tools\\l-smash\\muxer.exe");
                        if (!lsmash.Exists)
                        {
                            throw new Exception("l-smash 封装工具不存在");
                        }

                        AutoMuxer muxer = new AutoMuxer(mkvInfo.FullName, lsmash.FullName);
                        muxer.ProgressChanged += progress => task.ProgressValue = progress;

                        OKEFile outFile = muxer.StartMuxing(Path.GetDirectoryName(task.Taskfile.OutputPathPrefix) + "\\" + task.OutputFile, task.MediaOutFile);
                        task.OutputFile = outFile.GetFileName();
                        task.BitRate    = CommandlineVideoEncoder.HumanReadableFilesize(outFile.GetFileSize(), 2);
                    }
                    if (task.MkaOutFile.Tracks.Count > 0)
                    {
                        task.CurrentStatus = "封装MKA中";
                        FileInfo  mkvInfo = new FileInfo(".\\tools\\mkvtoolnix\\mkvmerge.exe");
                        FileInfo  lsmash  = new FileInfo(".\\tools\\l-smash\\muxer.exe");
                        AutoMuxer muxer   = new AutoMuxer(mkvInfo.FullName, lsmash.FullName);
                        muxer.ProgressChanged += progress => task.ProgressValue = progress;
                        string mkaOutputFile = task.Taskfile.OutputPathPrefix + ".mka";

                        muxer.StartMuxing(mkaOutputFile, task.MkaOutFile);
                    }

                    //RP check
                    if (profile.Rpc)
                    {
                        task.CurrentStatus = "RPC中";
                        RpcJob rpcJob = new RpcJob(profile.InputScript, videoJob);
                        rpcJob.SetUpdate(task);

                        RpChecker checker = new RpChecker(rpcJob);
                        checker.start();
                        checker.waitForFinish();
                        task.RpcOutput = rpcJob.Output;
                    }
                    else
                    {
                        task.RpcStatus = RpcStatus.跳过.ToString();
                    }

                    task.CurrentStatus = "完成";
                    task.Progress      = TaskStatus.TaskProgress.FINISHED;
                    task.ProgressValue = 100;
                }
                catch (OKETaskException ex)
                {
                    ExceptionMsg msg = ExceptionParser.Parse(ex, task);
                    Logger.Error(msg);
                    new System.Threading.Tasks.Task(() =>
                                                    System.Windows.MessageBox.Show(msg.errorMsg, msg.fileName)).Start();
                    task.Progress      = TaskStatus.TaskProgress.ERROR;
                    task.CurrentStatus = ex.summary;
                    task.ProgressValue = ex.progress.GetValueOrDefault(task.ProgressValue);
                    continue;
                }
                catch (Exception ex)
                {
                    FileInfo fileinfo = new FileInfo(task.InputFile);
                    Logger.Error(ex.Message + ex.StackTrace);
                    new System.Threading.Tasks.Task(() =>
                                                    System.Windows.MessageBox.Show(ex.Message, fileinfo.Name)).Start();
                    task.Progress      = TaskStatus.TaskProgress.ERROR;
                    task.CurrentStatus = "未知错误";
                    continue;
                }
            }
        }
Exemplo n.º 26
0
 public ChapterController(ApplicationDbContext DataBaseConnection)
 {
     this.DataBaseConnection = DataBaseConnection;
     ChapterService          = new ChapterService(DataBaseConnection);
 }