Ejemplo n.º 1
0
        // 포맷 파싱
        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--;
                }
            }
        }
Ejemplo n.º 2
0
        // 포맷 파싱
        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);
        }