示例#1
0
        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);
            }
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
 public void add(SubtitleEntry e)
 {
     subEntries.Add(e);
 }
示例#5
0
        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);
        }
示例#6
0
 public void add(SubtitleEntry e)
 {
     subEntries.Add(e);
 }
示例#7
0
        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;
        }
示例#8
0
        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);
            }
        }