static void parseSubsBlock(List <SubtitleEntry> entries, String s, int block) { var ss = s.Split('\r'); for (int i = 0; i < ss.Length; i += 2) { SubtitleEntry sub = new SubtitleEntry(); sub.blockNumber = block; sub.lang = (LocaleID)(int.Parse(ss[i])); sub.text = ss[i + 1]; entries.Add(sub); } }
private static void addCineFileNode(XPathNavigator current, List <CineFile> cfl, bool isBigEndian) { string basepath = current.GetAttribute("base", ""); string name = current.GetAttribute("name", ""); var entryNodes = current.Select("entry"); CineFile cf = new CineFile(basepath, name, isBigEndian); SubtitleEntry se; // Get first entry entryNodes.MoveNext(); se = new SubtitleEntry(); se.lang = Locale.getFromString(entryNodes.Current.GetAttribute("lang", "")); se.blockNumber = int.Parse(entryNodes.Current.GetAttribute("block", "")); se.text = entryNodes.Current.Value; while (entryNodes.MoveNext() == true) { // Check if same block if (se.blockNumber == int.Parse(entryNodes.Current.GetAttribute("block", ""))) { se.text += ("\n" + entryNodes.Current.Value); } else { // Save previous entry cf.add(se); // Save new current entry se = new SubtitleEntry(); se.lang = Locale.getFromString(entryNodes.Current.GetAttribute("lang", "")); se.blockNumber = int.Parse(entryNodes.Current.GetAttribute("block", "")); se.text = entryNodes.Current.Value; } } // Add last sub entry cf.add(se); // Add cinefile to list cfl.Add(cf); }
private static void addCineFileNode(XPathNavigator current, List<CineFile> cfl, bool isBigEndian) { string basepath = current.GetAttribute("base", ""); string name = current.GetAttribute("name", ""); var entryNodes = current.Select("entry"); CineFile cf = new CineFile(basepath, name, isBigEndian); SubtitleEntry se; // Get first entry entryNodes.MoveNext(); se = new SubtitleEntry(); se.lang = Locale.getFromString(entryNodes.Current.GetAttribute("lang", "")); se.blockNumber = int.Parse(entryNodes.Current.GetAttribute("block", "")); se.text = entryNodes.Current.Value; while (entryNodes.MoveNext() == true) { // Check if same block if (se.blockNumber == int.Parse(entryNodes.Current.GetAttribute("block", ""))) { se.text += ("\n" + entryNodes.Current.Value); } else { // Save previous entry cf.add(se); // Save new current entry se = new SubtitleEntry(); se.lang = Locale.getFromString(entryNodes.Current.GetAttribute("lang", "")); se.blockNumber = int.Parse(entryNodes.Current.GetAttribute("block", "")); se.text = entryNodes.Current.Value; } } // Add last sub entry cf.add(se); // Add cinefile to list cfl.Add(cf); }
public void add(SubtitleEntry e) { subEntries.Add(e); }
private byte[] blockChangeSub(byte[] array, SubtitleEntry entry, int blockno) { int index = array.Length - 1; byte[] output = null; // Remove end zeros while (index >= 0 && array[index] == 0x00) { index--; } int endidx = index; int startidx = findSubsStartIndex(array, endidx); if (startidx == 0) { throw new Exception("Error finding sub to replace"); } // Read original subs List <SubtitleEntry> origSubs = new List <SubtitleEntry>(); parseSubsBlock(origSubs, Encoding.UTF8.GetString(array, startidx + 4, endidx - startidx - 4), blockno); // Replace new subtitle text foreach (SubtitleEntry newEntry in subEntries) { if (newEntry.blockNumber != blockno) { continue; } foreach (SubtitleEntry origEntry in origSubs) { if (newEntry.lang == origEntry.lang) { origEntry.text = newEntry.text; break; } } } // Get the modified subs block var subs = rebuildSubsBlock(origSubs, blockno); //origSubs being the new subs // Compute total length int length = startidx + subs.Length; // Align to 16 bytes length = ((length + 15) >> 4) << 4; output = new byte[length]; // Copy data before subs Array.Copy(array, output, startidx); // Copy subs Array.Copy(subs, 0, output, startidx, subs.Length); // Adjust lengths MemoryStream ms = new MemoryStream(output); ms.Position = 4; ms.writeuint((uint)(length - 16), isBE); if (blockno != 0) { ms.Position = 16; ms.writeuint((uint)(length - 20), isBE); } return(output); }
private byte[] blockChangeSub(byte[] array, SubtitleEntry entry, int blockno) { int index = array.Length - 1; byte[] output = null; // Remove end zeros while (index >= 0 && array[index] == 0x00) { index--; } int endidx = index; int startidx = findSubsStartIndex(array, endidx); if (startidx == 0) throw new Exception("Error finding sub to replace"); // Read original subs List<SubtitleEntry> origSubs = new List<SubtitleEntry>(); parseSubsBlock(origSubs, Encoding.UTF8.GetString(array, startidx + 4, endidx - startidx - 4), blockno); // Replace new subtitle text foreach (SubtitleEntry newEntry in subEntries) { if (newEntry.blockNumber != blockno) continue; foreach (SubtitleEntry origEntry in origSubs) { if (newEntry.lang == origEntry.lang) { origEntry.text = newEntry.text; break; } } } // Get the modified subs block var subs = rebuildSubsBlock(origSubs, blockno); //origSubs being the new subs // Compute total length int length = startidx + subs.Length; // Align to 16 bytes length = ((length + 15) >> 4) << 4; output = new byte[length]; // Copy data before subs Array.Copy(array, output, startidx); // Copy subs Array.Copy(subs, 0, output, startidx, subs.Length); // Adjust lengths MemoryStream ms = new MemoryStream(output); ms.Position = 4; ms.writeuint((uint)(length - 16), isBE); if (blockno != 0) { ms.Position = 16; ms.writeuint((uint)(length - 20), isBE); } return output; }
static void parseSubsBlock(List<SubtitleEntry> entries, String s, int block) { var ss = s.Split('\r'); for (int i = 0; i < ss.Length; i += 2) { SubtitleEntry sub = new SubtitleEntry(); sub.blockNumber = block; sub.lang = (LocaleID)(int.Parse(ss[i])); sub.text = ss[i + 1]; entries.Add(sub); } }