Skip to content

Srtparser.cs had some issue so I modified it a bit #3

Open
@whatohyou

Description

@whatohyou

//if you convert srt->srt then 2nd+ line of text will be ignored. so I made it this way...
//I regret doing it though. I could simply convert srt->smi then switch it back to srt to resync...

public bool ParseFormat(string path, out List<SubtitleItem> result)
        {
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

            var detect = CharsetDetector.DetectFromFile(path);
            var encoding = Encoding.GetEncoding(detect.Detected.EncodingName);

            var srtStream = new StreamReader(path, encoding).BaseStream;

            if (!srtStream.CanRead || !srtStream.CanSeek)
            {
                result = null;
                return false;
            }

            srtStream.Position = 0;

            var reader = new StreamReader(srtStream, encoding, true);
            var items = new List<SubtitleItem>();
            var srtSubParts = GetSrtSubTitleParts(reader).ToList();            

            if (srtSubParts.Any())
            {
                foreach (var srtSubPart in srtSubParts)
                {
                    var lines =
                        srtSubPart.Split(new[] { Environment.NewLine }, StringSplitOptions.None)
                            .Select(s => s.Trim())
                            .Where(l => !string.IsNullOrEmpty(l))
                            .ToList();

                    var item = new SubtitleItem();
                    item.StartTime = 0; item.EndTime = 0; item.Text = "";
                    int lcnt = lines.Count;
                    
                    bool txtadded = false;
                    for (int i = 0; i < lcnt; i++)
                    {
                        if (i == 0)
                        {
                            txtadded = false;
                            continue;
                        }

                        string line = lines[i];
                        
                        if (i == 1)
                        {                            
                            int startTc;
                            int endTc;
                            var success = TryParseTimecodeLine(line, out startTc, out endTc);
                            if (success)
                            {
                                item.StartTime = startTc;
                                item.EndTime = endTc;
                                continue;
                            }
                        }
                        
                        if (txtadded == true)
                        {
                            item.Text = item.Text + Environment.NewLine + ConvertString(line);
                        }
                        else
                        {
                            item.Text = item.Text + ConvertString(line);
                            txtadded = true;
                        }

                        if (i == lcnt - 1)
                        {                            
                            var eitem = (SubtitleItem)item.Clone();                            
                            items.Add(eitem);
                            item.StartTime = 0; item.EndTime = 0; item.Text = "";                         
                            continue;
                        }                
                    }
                }

                if (items.Any())
                {
                    result = Filters.RemoveDuplicateItems(items);
                    return true;
                }

                result = null;
                return false;
            }

            result = null;
            return false;
        }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions