[C#] 纯文本查看 复制代码///
/// 歌词类
///
[Serializable()]
public class Lyric
{
///
/// 曲名
///
public string Ti { get; set; }
///
/// 艺术家
///
public string Ar { get; set; }
///
/// 专辑
///
public string Al { get; set; }
///
/// 制作人
///
public string By { get; set; }
///
/// 时间补偿值
///
public int Offset { get; set; }
///
/// 行数
///
public int Count { get { return Words.Count; } }
///
/// 文本集
///
public List Words { get; set; }
///
/// 导出格式
///
public string Export
{
get
{
StringBuilder str = new StringBuilder("");
str.Append(string.Format("[ti:{0}]\n[ar:{1}]\n[al:{2}]\n[by:{3}]\n[offset:{4}]\r\n", Ti, Ar, Al, By, Offset));
foreach (LrcWord i in Words)
{ str.Append(i.Export); }
return str.ToString().Trim();
}
}
///
/// 文本
///
public string Text
{
get
{
StringBuilder str = new StringBuilder("");
foreach (LrcWord i in Words)
{ str.Append(i.Word + "\n"); }
return str.ToString().Trim();
}
}
///
/// Lyrec默认构造
///
public Lyric()
{
Words = new List();
}
///
/// 创建Lrcc歌词
///
///
///
public static Lyric Create(string[] text)
{
Lyric l = new Lyric();
foreach (string i in text)
{
l.Words.Add(new LrcWord(i));
}
return l;
}
///
/// 从字符串加载
///
public static Lyric Parse(string str)
{
str =str.Replace(@"\n", "\n");
string[] words = str.Split('\n');
Lyric l = new Lyric();
l.Ti = GetMiddleText(str, "[ti:", "]");
l.Ar = GetMiddleText(str, "[ar:", "]");
l.Al = GetMiddleText(str, "[al:", "]");
l.By = GetMiddleText(str, "[by:", "]");
l.Offset = ToInt32(GetMiddleText(str, "[offset:", "]"), 0);
l.Words = new List();
foreach (string i in words)
{
LrcWord lw = LrcWord.Parse(i);
if (lw != null)
{ l.Words.Add(lw); }
}
if (l.Words.Count == 0)
{ return null; }
return l;
}
///
/// 从文件加载
///
/// 路径
/// 编码
public static Lyric FromFile(string path, Encoding en)
{
string str = File.ReadAllText(path, en);
return Parse(str);
}
///
/// 保存歌词
///
/// 路径
/// 编码
public void Save(string path, Encoding en)
{
File.Delete(path);
File.AppendAllText(path, Export, en);
}
///
/// 保存为文本
///
/// 路径
/// 编码
public void SaveText(string path, Encoding en)
{
File.Delete(path);
File.AppendAllText(path, Text, en);
}
///
/// 取出中间字符串
///
/// 源字符串
/// 左
/// 右
/// 成功返回结果,失败返回空
private static string GetMiddleText(string str, string left, string right)
{
if (str == null || left == null || right == null) { return ""; }
if (str == "" || left == "" || right == "") { return ""; }
int a = str.IndexOf(left, 0);
int b = str.IndexOf(right, a + 1);
if (a < 0 || b < 0)
{ return ""; }
else
{
a = a + left.Length;
b = b - a;
if (a < 0 || b < 0)
{ return ""; }
return str.Substring(a, b);
}
}
///
/// 字符串转整数
///
/// 字符串
/// 默认值
/// 成功返回结果,失败返回默认值
private static int ToInt32(string str, int defultValue = 0)
{
try { return int.Parse(str); }
catch (Exception)
{ return defultValue; }
}
}
///
/// 歌词文本类
///
[Serializable()]
public class LrcWord
{
///
/// 时间
///
public double Time { get; set; }
///
/// 文本
///
public string Word { get; set; }
///
/// 导出格式
///
public string Export
{ get { return string.Format("[{0}:{1:f3}]{2}\n", ((int)Math.Floor(Time / 60)).ToString("00"), Time % 60, Word); } }
///
/// LrcWord有参构造
///
/// 时间
/// 文本
private LrcWord(double time, string word)
{
Time = time;
Word = word;
}
///
/// LrcWord有参构造
///
/// 文本
public LrcWord(string text)
{ Word = text; }
///
/// 将字符串转换为歌词文本对象
///
///
///
public static LrcWord Parse(string s)
{
try
{
Regex regex = new Regex(@"\[([0-9.:]*)\]+(.*)", RegexOptions.Compiled);
MatchCollection mc = regex.Matches(s.Trim());
double time = TimeSpan.Parse("00:" + mc[0].Groups[1].Value).TotalSeconds;
string word = mc[0].Groups[2].Value;
return new LrcWord(time, word);
}
catch (Exception)
{ return null; }
}
public override string ToString()
{
return Word;
}
}