2014-02-04 03:08:20 +00:00
|
|
|
|
using System.Collections.Generic;
|
2013-10-25 00:59:34 +00:00
|
|
|
|
using System.Globalization;
|
|
|
|
|
using System.Linq;
|
2013-11-29 20:26:24 +00:00
|
|
|
|
using System.Text;
|
2013-10-25 00:59:34 +00:00
|
|
|
|
|
|
|
|
|
namespace BizHawk.Client.Common
|
|
|
|
|
{
|
2013-10-28 01:31:30 +00:00
|
|
|
|
public class SubtitleList : List<Subtitle>
|
2013-10-25 00:59:34 +00:00
|
|
|
|
{
|
2016-06-28 21:28:52 +00:00
|
|
|
|
public bool ConcatMultilines { get; set; }
|
|
|
|
|
public bool AddColorTag { get; set; }
|
|
|
|
|
|
|
|
|
|
public SubtitleList()
|
|
|
|
|
{
|
|
|
|
|
ConcatMultilines = false;
|
|
|
|
|
AddColorTag = false;
|
|
|
|
|
}
|
|
|
|
|
|
2013-10-27 22:13:08 +00:00
|
|
|
|
public IEnumerable<Subtitle> GetSubtitles(int frame)
|
2013-10-25 00:59:34 +00:00
|
|
|
|
{
|
2013-10-28 01:31:30 +00:00
|
|
|
|
return this.Where(t => frame >= t.Frame && frame <= t.Frame + t.Duration);
|
2013-10-25 00:59:34 +00:00
|
|
|
|
}
|
|
|
|
|
|
2013-11-29 20:26:24 +00:00
|
|
|
|
public override string ToString()
|
|
|
|
|
{
|
|
|
|
|
var sb = new StringBuilder();
|
2016-06-30 16:14:12 +00:00
|
|
|
|
this.Sort();
|
2013-11-29 20:26:24 +00:00
|
|
|
|
ForEach(subtitle => sb.AppendLine(subtitle.ToString()));
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
2013-10-28 01:31:30 +00:00
|
|
|
|
public bool AddFromString(string subtitleStr)
|
2013-10-25 00:59:34 +00:00
|
|
|
|
{
|
2014-02-04 03:08:20 +00:00
|
|
|
|
if (!string.IsNullOrWhiteSpace(subtitleStr))
|
2013-10-25 00:59:34 +00:00
|
|
|
|
{
|
2013-10-27 22:13:08 +00:00
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var subparts = subtitleStr.Split(' ');
|
2013-10-25 00:59:34 +00:00
|
|
|
|
|
2013-11-29 19:55:05 +00:00
|
|
|
|
// Unfortunately I made the file format space delminated so this hack is necessary to get the message
|
2014-02-04 03:08:20 +00:00
|
|
|
|
var message = string.Empty;
|
2013-11-29 19:55:05 +00:00
|
|
|
|
for (var i = 6; i < subparts.Length; i++)
|
2013-10-27 22:13:08 +00:00
|
|
|
|
{
|
|
|
|
|
message += subparts[i] + ' ';
|
|
|
|
|
}
|
2013-10-25 00:59:34 +00:00
|
|
|
|
|
2013-11-29 19:55:05 +00:00
|
|
|
|
Add(new Subtitle
|
2013-10-27 22:13:08 +00:00
|
|
|
|
{
|
|
|
|
|
Frame = int.Parse(subparts[1]),
|
|
|
|
|
X = int.Parse(subparts[2]),
|
|
|
|
|
Y = int.Parse(subparts[3]),
|
|
|
|
|
Duration = int.Parse(subparts[4]),
|
|
|
|
|
Color = uint.Parse(subparts[5], NumberStyles.HexNumber),
|
2016-06-28 21:28:52 +00:00
|
|
|
|
Message = message.Trim()
|
2013-10-27 22:13:08 +00:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2013-10-25 00:59:34 +00:00
|
|
|
|
}
|
2014-02-04 03:08:20 +00:00
|
|
|
|
|
|
|
|
|
return false;
|
2013-10-25 00:59:34 +00:00
|
|
|
|
}
|
2014-08-17 11:36:37 +00:00
|
|
|
|
|
2016-06-30 16:14:12 +00:00
|
|
|
|
public new void Sort()
|
2016-06-29 20:52:31 +00:00
|
|
|
|
{
|
2016-06-30 16:14:12 +00:00
|
|
|
|
this.Sort((x, y) =>
|
|
|
|
|
{
|
|
|
|
|
int result = x.Frame.CompareTo(y.Frame);
|
|
|
|
|
return result != 0 ? result : x.Y.CompareTo(y.Y);
|
|
|
|
|
});
|
2016-06-29 20:52:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
2014-08-17 11:36:37 +00:00
|
|
|
|
public string ToSubRip(double fps)
|
|
|
|
|
{
|
|
|
|
|
int index = 1;
|
2016-06-28 21:28:52 +00:00
|
|
|
|
var sb = new StringBuilder();
|
2016-06-29 20:52:31 +00:00
|
|
|
|
List<Subtitle> subs = new List<Subtitle>();
|
2016-06-28 21:28:52 +00:00
|
|
|
|
foreach (var subtitle in this)
|
|
|
|
|
subs.Add(subtitle);
|
|
|
|
|
|
|
|
|
|
// absense of line wrap forces miltiline subtitle macros
|
|
|
|
|
// so we sort them just in case and optionally concat back to a single unit
|
|
|
|
|
// todo: instead of making this pretty, add the line wrap feature to subtitles
|
|
|
|
|
if (ConcatMultilines)
|
|
|
|
|
{
|
|
|
|
|
int lastframe = 0;
|
2016-06-29 20:52:31 +00:00
|
|
|
|
subs = subs.OrderBy(s => s.Frame).ThenBy(s => s.Y).ToList();
|
2016-06-28 21:28:52 +00:00
|
|
|
|
|
|
|
|
|
for (int i = 0; ; i++)
|
|
|
|
|
{
|
|
|
|
|
if (i == subs.Count()) // we're modifying it
|
|
|
|
|
break;
|
2014-08-17 11:36:37 +00:00
|
|
|
|
|
2016-06-28 21:28:52 +00:00
|
|
|
|
subs[i].Message = subs[i].Message.Trim();
|
|
|
|
|
|
|
|
|
|
if (i > 0 && lastframe == subs[i].Frame)
|
|
|
|
|
{
|
|
|
|
|
subs[i].Message = subs[i - 1].Message + " " + subs[i].Message;
|
|
|
|
|
subs.Remove(subs[i - 1]);
|
|
|
|
|
i--;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
lastframe = subs[i].Frame;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// srt stacks musltilines upwards
|
2016-06-29 20:52:31 +00:00
|
|
|
|
subs = subs.OrderBy(s => s.Frame).ThenByDescending(s => s.Y).ToList();
|
2016-06-28 21:28:52 +00:00
|
|
|
|
}
|
2014-08-17 11:36:37 +00:00
|
|
|
|
|
2017-04-10 15:29:51 +00:00
|
|
|
|
foreach (var subtitle in subs)
|
|
|
|
|
sb.Append(subtitle.ToSubRip(index++, fps, AddColorTag));
|
2014-08-17 11:36:37 +00:00
|
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
2013-10-25 00:59:34 +00:00
|
|
|
|
}
|
|
|
|
|
}
|