/// <summary> /// Creates an SuidLister object and returns it for the calling program. /// The SuidLister object that is created here can be reused. /// </summary> /// <param name="fileList">The FileObjectCollection processed by InfoDump.</param> /// <returns>The SuidLister with the list of all SUIDs present.</returns> public static SuidLister getSuid(FileObjectCollection fileList) { SuidLister suidLister = new SuidLister(); foreach (FileObject file in fileList.fileList) { //to change - actual suid; //string suids = "suid"; // done suidLister.addSuid(file); } //returns suidLister object return(suidLister); }
/// <summary> /// Creates an SuidLister object and returns it for the calling program. /// The SuidLister object that is created here can be reused. /// </summary> /// <param name="fileList">The FileObjectCollection processed by InfoDump.</param> /// <returns>The SuidLister with the list of all SUIDs present.</returns> public static SuidLister getSuid(FileObjectCollection fileList) { SuidLister suidLister = new SuidLister(); foreach (FileObject file in fileList.fileList) { //to change - actual suid; //string suids = "suid"; // done suidLister.addSuid(file); } //returns suidLister object return suidLister; }
/// <summary> /// Processes files to create File Objects for the main tasks of this program. /// Every tasks are denoted on each comment lines inside the method. /// </summary> /// <param name="list">The list that contains the fullpaths of the actual files.</param> /// <param name="listname">Name for the FileObjectCollection to be created.</param> public void AnalyzeList(List <string> list, string listname = "Various Files") { FileObjectCollection fileList = new FileObjectCollection(); TrackLister tracklist = new TrackLister(); MakeFile makeFile = new MakeFile(); ChapterGenerator chapterGet = new ChapterGenerator(); //ProgressState progressState = new ProgressState(); //fileList.folderPath = path; //Deprecated fileList.name = listname; //Deprecated progressState.listName = fileList.name; analyzeProgress = 1; analyzeProcessPercent = 0; foreach (string s in list) { FileObject file = new FileObject(s); analyzeProcessPercent = analyzeProgress.ToPercentage(list.Count); progressState.progressPercent = analyzeProcessPercent; progressState.fileName = file.filename; Analyze.backgroundWorker.ReportProgress(progressArg, progressState); //Routine after splitting //Checks if current backgroundWorker operation is cancelled //Stops this program if true if (Analyze.backgroundWorker.CancellationPending) { return; } try { file = InfoDumper.infoDump(file); if (Program.hasFFmpeg) { file = InfoDumper.ffInfoDump(file); } } catch (Exception ex) { MessageBox.Show("Error:\r\n\r\n" + ex.Message, "Error"); } progressState.progressDetail = "Dumping MKV info..."; Analyze.backgroundWorker.ReportProgress(progressArg, progressState); file = chapterGet.chapterDump(file); if (!String.IsNullOrEmpty(file.ffInfo)) { file = chapterGet.mediaDump(file); } if (!Config.Configure.includeMkvInfoOnFiles) { file.mkvInfo = null; } if (!Config.Configure.includeMediaInfoOnFiles) { file.ffInfo = null; } fileList.addFile(file); //For Diagnoses purposes only if (Config.Configure.diagnose >= 30) { Console.WriteLine("Chapter Atom count: {0}\n", file.chapterAtom.Count, file.mkvInfo); foreach (ChapterAtom chapter in file.chapterAtom) { { Console.WriteLine("File name: {0}\nChapter Number: {2}\nTime Start: {3}\nTime End: {4}\nSuid: {5}\n", file.filename, chapter.chapterInfo, chapter.chapterNum, chapter.timeStart, chapter.timeEnd, chapter.suid); } } } progressState.progressDetail = "Getting chapters' info..."; Analyze.backgroundWorker.ReportProgress(progressArg, progressState); analyzeProgress++; } SuidLister suidList = getSuid(fileList); progressState.progressDetail = "Creating SUID list..."; Analyze.backgroundWorker.ReportProgress(progressArg, progressState); fileList = tracklist.arrangeTrack(fileList, suidList, this); progressState.progressDetail = "Arranging new tracklist for every file..."; Analyze.backgroundWorker.ReportProgress(progressArg, progressState); //For Diagnostic purposes only if (Config.Configure.diagnose >= 30) { foreach (Suid suid in suidList.suidList) { { Console.WriteLine("SUID filename: " + suid.fileName); Console.WriteLine("SUID: " + suid.suid); Console.WriteLine("\n"); } } Console.WriteLine("fileList.fileList.Count: " + fileList.fileList.Count + "\n"); foreach (FileObject file in fileList.fileList) { //Console.WriteLine("Merge Argument count: {0}\n", file.mergeArgument.Count); foreach (MergeArgument merge in file.mergeArgument) { Console.WriteLine("Merge Argument:\nFile name: {0}\nTime Code: {1}\nFile Argument: {2}\nChapter Number: {3}\n", file.filename, merge.timeCode, merge.fileName, merge.chapterNum); } foreach (TimeCode time in file.timeCode) { Console.WriteLine("Time Code Argument: {0}\n", time.timeCode); } foreach (DelArgument del in file.delArgument) { Console.WriteLine("Del Argument: {0}\n", del.fileName); } } } fileLists.Add(fileList); if (Config.Configure.doMakeXml) { makeFile.makeFile(fileList, this); progressState.progressDetail = "Dumping XML file..."; Analyze.backgroundWorker.ReportProgress(progressArg, progressState); } if (Config.Configure.doMakeScript) { makeFile.makeXML(fileList, this); progressState.progressDetail = "Creating Merge Script..."; Analyze.backgroundWorker.ReportProgress(progressArg, progressState); } }
/// <summary> /// Processes files to create File Objects for the main tasks of this program. /// Every tasks are denoted on each comment lines inside the method. /// </summary> /// <param name="list">The list that contains the fullpaths of the actual files.</param> /// <param name="listname">Name for the FileObjectCollection to be created.</param> /// <param name="processor">The Analyze object for progression report.</param> /// <param name="path">The path used as a working directory merge commands.</param> /// <param name="totalArguments">Optional. For progress report. The total number of lists to process.</param> public void processList(List <string> list, string listname, Analyze processor, string path = "C:\\", int totalArguments = 0) { FileObjectCollection fileList = new FileObjectCollection(); TrackLister tracklist = new TrackLister(); MakeFile makeFile = new MakeFile(); ChapterGenerator chapterGet = new ChapterGenerator(); ProgressState progressState = new ProgressState(); fileList.folderPath = path; fileList.name = listname; progressState.listName = fileList.name; progress = 1; processPercent = 0; foreach (string s in list) { progressState.progressDetail = "Creating file entry..."; Analyze.backgroundWorker.ReportProgress(processor.progressArg, progressState); FileObject file = new FileObject(s); processPercent = progress.ToPercentage(list.Count); progressState.progressPercent = processPercent; progressState.fileName = file.filename; Analyze.backgroundWorker.ReportProgress(processor.progressArg, progressState); //Routine after splitting //Checks if current backgroundWorker operation is cancelled //Stops this program if true if (Analyze.backgroundWorker.CancellationPending) { return; } if (file.extension == ".mkv") { try { file = InfoDumper.infoDump(file); } catch (Exception ex) { Program.Message("Error:\r\n\r\n" + ex.Message, "Error"); } progressState.progressDetail = "Dumping MKV info..."; Analyze.backgroundWorker.ReportProgress(processor.progressArg, progressState); file = chapterGet.chapterDump(file); if (!Config.Configure.includeMkvInfoOnFiles) { file.mkvInfo = null; } if (!Config.Configure.includeMediaInfoOnFiles) { file.ffInfo = null; } progressState.progressDetail = "Getting chapters' info..."; Analyze.backgroundWorker.ReportProgress(processor.progressArg, progressState); fileList.hasMKV = true; } if (Program.hasFFmpeg) { progressState.progressDetail = "Dumping media info..."; Analyze.backgroundWorker.ReportProgress(processor.progressArg, progressState); try { file = InfoDumper.ffInfoDump(file); } catch (Exception ex) { Program.Message("Error:\r\n\r\n" + ex.Message, "Error"); } if (!String.IsNullOrEmpty(file.ffInfo)) { file = chapterGet.mediaDump(file); } } fileList.addFile(file); progress++; } if (fileList.hasMKV) { SuidLister suidList = CreateSuidLister(fileList); progressState.progressDetail = "Creating SUID list..."; Analyze.backgroundWorker.ReportProgress(processor.progressArg, progressState); fileList = tracklist.arrangeTrack(fileList, suidList, processor); progressState.progressDetail = "Arranging new tracklist for every file..."; Analyze.backgroundWorker.ReportProgress(processor.progressArg, progressState); //For Diagnostic purposes only if (Config.Configure.diagnose >= 30) { foreach (Suid suid in suidList.suidList) { { Console.WriteLine("SUID filename: " + suid.fileName); Console.WriteLine("SUID: " + suid.suid); Console.WriteLine("\n"); } } Console.WriteLine("fileList.fileList.Count: " + fileList.fileList.Count + "\n"); foreach (FileObject file in fileList.fileList) { //Console.WriteLine("Merge Argument count: {0}\n", file.mergeArgument.Count); foreach (MergeArgument merge in file.mergeArgument) { Console.WriteLine("Merge Argument:\nFile name: {0}\nTime Code: {1}\nFile Argument: {2}\nChapter Number: {3}\n", file.filename, merge.timeCode, merge.fileName, merge.chapterNum); } foreach (TimeCode time in file.timeCode) { Console.WriteLine("Time Code Argument: {0}\n", time.timeCode); } foreach (DelArgument del in file.delArgument) { Console.WriteLine("Del Argument: {0}\n", del.fileName); } } } if (Config.Configure.doMakeScript) { makeFile.makeFile(fileList, processor); progressState.progressDetail = "Creating Merge Script..."; Analyze.backgroundWorker.ReportProgress(processor.progressArg, progressState); } } if (Config.Configure.doMakeXml) { makeFile.makeXML(fileList, processor); progressState.progressDetail = "Dumping XML file..."; Analyze.backgroundWorker.ReportProgress(processor.progressArg, progressState); } processor.fileLists.Add(fileList); }
/// <summary> /// Rearranges chapter tracks to include the inserted external file determined by SUID. /// Also determines MergeArguments order. /// </summary> /// <param name="fileList">The FileObjectCollection processed by ChapterGenerator.</param> /// <param name="suid">The SuidLister that contains all SUIDs.</param> /// <param name="processor">The Analyze object for progression report.</param> /// <returns>The FileObjectCollection with FileObjects that has rearranged chapter tracks.</returns> public FileObjectCollection arrangeTrack(FileObjectCollection fileList, SuidLister suid, Analyze processor) { //string mergeargument = ""; foreach (FileObject file in fileList.fileList) { int count = 0; string tempFileName = ""; string tempFullPath = ""; //First loop to determine which chapters have external suid attached foreach (ChapterAtom chaptera in file.chapterAtom) { foreach (Suid suidi in suid.suidList) { if (suidi.suid == chaptera.suid) { chaptera.suidFileName = suidi.fileName; chaptera.suidFullPath = suidi.fullPath; //Console.WriteLine("SUID match."); } } //mergeargument = mergeargument + chaptera.timeStart + chaptera.timeEnd + chaptera.suidFileName; } //Second loop that uses index to properly determine which chapter needs to be added as a MergeArgument for (int i = 0; i < file.chapterAtom.Count; i++) { var current = file.chapterAtom[i]; var previous = current; var next = current; if (i > 0) { previous = file.chapterAtom.ElementAt(i - 1); } if (i < (file.chapterAtom.Count - 1)) { next = file.chapterAtom.ElementAt(i + 1); } /* * Diagnostic purposes only * * Console.WriteLine("Arrange Track"); * Console.WriteLine("Current: " + current.suidFileName); * Console.WriteLine("Previous: " + previous.suidFileName); * Console.WriteLine("Next: " + next.suidFileName); * Console.WriteLine("\n"); * */ //The following routine should correctly determine when to split the the chapters optimally to insert the external SUID file if (current.suidFileName != null) { file.addMergeArg(current.suidFullPath, current.chapterNum, true); if (!file.shouldJoin) file.shouldJoin = true; if (!fileList.hasOrdered) fileList.hasOrdered = true; if (!processor.hasOrdered) processor.hasOrdered = true; } else { string timeCode = ""; //TimeEnd Split Mode if (Config.Configure.splitModeTimeEnd && (next.suidFileName != null || i == file.chapterAtom.Count - 1)) { count++; file.splitCount = count; timeCode = current.timeEnd; //to change, should dynamically change digit format to "ddd" // done tempFileName = Config.Configure.tempfileprefix + file.filenameNoExtension + Config.Configure.tempfilesuffix + "-" + count.ToString("D3") + ".mkv"; tempFullPath = Path.Combine(fileList.folderPath, Config.Configure.tempfileprefix + file.filenameNoExtension + Config.Configure.tempfilesuffix) + "-" + count.ToString("D3") + ".mkv"; file.addMergeArg(tempFullPath, current.chapterNum, false, timeCode, tempFileName, file.fullpath); if (i != file.chapterAtom.Count - 1) file.addTimeCode(timeCode); file.addDelArg(tempFullPath, tempFileName); } //TimeStart Split Mode else if (Config.Configure.splitModeTimeStart && (previous.suidFileName != null || i == 0)) { count++; file.splitCount = count; timeCode = current.timeStart; tempFileName = Config.Configure.tempfileprefix + file.filenameNoExtension + Config.Configure.tempfilesuffix + "-" + count.ToString("D3") + ".mkv"; tempFullPath = Path.Combine(fileList.folderPath, Config.Configure.tempfileprefix + file.filenameNoExtension + Config.Configure.tempfilesuffix) + "-" + count.ToString("D3") + ".mkv"; file.addMergeArg(tempFullPath, current.chapterNum, false, timeCode, tempFileName, file.fullpath); if (i > 0) file.addTimeCode(timeCode); file.addDelArg(tempFullPath, tempFileName); } } } } return fileList; }
/// <summary> /// Rearranges chapter tracks to include the inserted external file determined by SUID. /// Also determines MergeArguments order. /// </summary> /// <param name="fileList">The FileObjectCollection processed by ChapterGenerator.</param> /// <param name="suid">The SuidLister that contains all SUIDs.</param> /// <param name="processor">The Analyze object for progression report.</param> /// <returns>The FileObjectCollection with FileObjects that has rearranged chapter tracks.</returns> public FileObjectCollection arrangeTrack(FileObjectCollection fileList, SuidLister suid, Analyze processor) { //string mergeargument = ""; foreach (FileObject file in fileList.fileList) { int count = 0; string tempFileName = ""; string tempFullPath = ""; //First loop to determine which chapters have external suid attached foreach (ChapterAtom chaptera in file.chapterAtom) { foreach (Suid suidi in suid.suidList) { if (suidi.suid == chaptera.suid) { chaptera.suidFileName = suidi.fileName; chaptera.suidFullPath = suidi.fullPath; //Console.WriteLine("SUID match."); } } //mergeargument = mergeargument + chaptera.timeStart + chaptera.timeEnd + chaptera.suidFileName; } //Second loop that uses index to properly determine which chapter needs to be added as a MergeArgument for (int i = 0; i < file.chapterAtom.Count; i++) { var current = file.chapterAtom[i]; var previous = current; var next = current; if (i > 0) { previous = file.chapterAtom.ElementAt(i - 1); } if (i < (file.chapterAtom.Count - 1)) { next = file.chapterAtom.ElementAt(i + 1); } /* * Diagnostic purposes only * * Console.WriteLine("Arrange Track"); * Console.WriteLine("Current: " + current.suidFileName); * Console.WriteLine("Previous: " + previous.suidFileName); * Console.WriteLine("Next: " + next.suidFileName); * Console.WriteLine("\n"); * */ //The following routine should correctly determine when to split the the chapters optimally to insert the external SUID file if (current.suidFileName != null) { file.addMergeArg(current.suidFullPath, current.chapterNum, true); if (!file.shouldJoin) { file.shouldJoin = true; } if (!fileList.hasOrdered) { fileList.hasOrdered = true; } if (!processor.hasOrdered) { processor.hasOrdered = true; } } else { string timeCode = ""; //TimeEnd Split Mode if (Config.Configure.splitModeTimeEnd && (next.suidFileName != null || i == file.chapterAtom.Count - 1)) { count++; file.splitCount = count; timeCode = current.timeEnd; //to change, should dynamically change digit format to "ddd" // done tempFileName = Config.Configure.tempfileprefix + file.filenameNoExtension + Config.Configure.tempfilesuffix + "-" + count.ToString("D3") + ".mkv"; tempFullPath = Path.Combine(fileList.folderPath, Config.Configure.tempfileprefix + file.filenameNoExtension + Config.Configure.tempfilesuffix) + "-" + count.ToString("D3") + ".mkv"; file.addMergeArg(tempFullPath, current.chapterNum, false, timeCode, tempFileName, file.fullpath); if (i != file.chapterAtom.Count - 1) { file.addTimeCode(timeCode); } file.addDelArg(tempFullPath, tempFileName); } //TimeStart Split Mode else if (Config.Configure.splitModeTimeStart && (previous.suidFileName != null || i == 0)) { count++; file.splitCount = count; timeCode = current.timeStart; tempFileName = Config.Configure.tempfileprefix + file.filenameNoExtension + Config.Configure.tempfilesuffix + "-" + count.ToString("D3") + ".mkv"; tempFullPath = Path.Combine(fileList.folderPath, Config.Configure.tempfileprefix + file.filenameNoExtension + Config.Configure.tempfilesuffix) + "-" + count.ToString("D3") + ".mkv"; file.addMergeArg(tempFullPath, current.chapterNum, false, timeCode, tempFileName, file.fullpath); if (i > 0) { file.addTimeCode(timeCode); } file.addDelArg(tempFullPath, tempFileName); } } } } return(fileList); }