// 포맷 파싱 private void LyricsParsing(string[] lines) { double time = 0; foreach (string data in lines) { LRCFormat type = this.FindMatcingType(data.ToLower()); switch (type) { case LRCFormat.Title: lyrics.Title = data; break; case LRCFormat.Artist: lyrics.Artist = data; break; case LRCFormat.Album: lyrics.Album = data; break; case LRCFormat.Author: lyrics.Author = data; break; case LRCFormat.LRCMaker: lyrics.By = data; break; case LRCFormat.PlayeTime: /*lyrics.Length = data; */ break; case LRCFormat.Lyrics: int parseIdx = data.IndexOf("]"); string timeData = data.Substring(1, parseIdx - 1); string lyricsData = data.Substring(parseIdx + 1); //시간영역 m,s,f string[] timeFormat = { timeData.Split(':')[0], timeData.Split(':')[1].Split('.')[0], timeData.Split(':')[1].Split('.')[1] }; time = int.Parse(timeFormat[0]) * 1000 * 60 + int.Parse(timeFormat[1]) * 1000 + int.Parse(timeFormat[2]); lyrics.Lines.Add(new KeyValuePair <double, string>(time, lyricsData)); break; //텍스트만 존재할경우 이전가사와 합침 case LRCFormat.None: if (lyrics.Lines.Count <= 0 || data == "") { break; } string newData = lyrics.Lines.Last().Value + data; time = lyrics.Lines.Last().Key; lyrics.Lines.RemoveAt(lyrics.Lines.Count - 1); lyrics.Lines.Add(new KeyValuePair <double, string>(time, newData)); break; } } //lyrics.Lines.Sort((x, y) => x.Key.CompareTo(y.Key)); lyrics.Lines.OrderBy(x => x.Key); //안정정렬 //중복된 시간을 가진 가사가 여러개 있을경우 하나로 합침 for (int i = 1; i < lyrics.Lines.Count; i++) { KeyValuePair <double, string> cur = lyrics.Lines[i]; KeyValuePair <double, string> prev = lyrics.Lines[i - 1]; if (cur.Key == prev.Key) { lyrics.Lines[i - 1] = new KeyValuePair <double, string>(cur.Key, prev.Value + "\r\n" + cur.Value); lyrics.Lines.RemoveAt(i); i--; } } }
// 포맷 파싱 private void LyricsParsing(string[] lines) { double time = 0; foreach (string data in lines) { LRCFormat type = this.FindMatcingType(data.ToLower()); switch (type) { case LRCFormat.Title: lyrics.Title = titlePattern.Match(data).Groups[1].ToString().Trim(); break; case LRCFormat.Artist: lyrics.Artist = artistPattern.Match(data).Groups[1].ToString().Trim(); break; case LRCFormat.Album: lyrics.Album = albumPattern.Match(data).Groups[1].ToString().Trim(); break; case LRCFormat.Author: lyrics.Author = authorPattern.Match(data).Groups[1].ToString().Trim(); break; case LRCFormat.LRCMaker: lyrics.By = byPattern.Match(data).Groups[1].ToString().Trim(); break; case LRCFormat.PlayeTime: lyrics.Length = int.Parse(lengthPattern.Match(data).Groups[1].ToString().Trim()); break; case LRCFormat.Lyrics: GroupCollection matchingData = syncPattern.Match(data).Groups; string lyricsData = matchingData[4].ToString().Trim(); //시간영역 m,s,f string[] timeFormat = { matchingData[1].ToString().Trim(), matchingData[2].ToString().Trim(), matchingData[3].ToString().Trim() }; time = int.Parse(timeFormat[0]) * 1000 * 60 + int.Parse(timeFormat[1]) * 1000 + int.Parse(timeFormat[2]); if (lyrics.Lines.ContainsKey(time) == true) { lyricsData = lyrics.Lines[time] + "\n" + lyricsData; lyrics.Lines.Remove(time); } if (lyricsData == string.Empty) { break; } lyrics.Lines.Add(time, lyricsData); break; //텍스트만 존재할경우 이전가사와 합침 case LRCFormat.None: if (lyrics.Lines.Count <= 0 || data.Trim() == string.Empty) { break; } if (lyrics.Lines.ContainsKey(time) != true) { break; } string newData = lyrics.Lines[time] + "\n" + data; lyrics.Lines.Remove(time); lyrics.Lines.Add(time, newData); break; } } //LRC 가사 포맷정보 담기 string infoData = "곡명: " + lyrics.Title + "(" + lyrics.Album + ")\n" + "작사가: " + lyrics.Author + "\n" + "가사 만든이: " + lyrics.By; if (lyrics.Lines.ContainsKey(0) == true) { infoData += "\n" + lyrics.Lines[0]; lyrics.Lines.Remove(0); } lyrics.Lines.Add(0, infoData); }