Open
Description
//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
Labels
No labels