public void TestAll() { var r = Lyrics.Parse <LineWithSpeaker>(TEST_DATA); var l = r.Lyrics; Assert.AreEqual(74, l.Lines.Count); Assert.AreEqual("", l.Lines[6].Content); Assert.AreEqual("全員: いっ]せーの!", l.Lines[7].Content); Assert.AreEqual(Timestamp.Create(2, 580), l.Lines[7].Timestamp); foreach (var item in l.Lines) { Assert.IsNotNull(item.Lyrics); Assert.IsNotNull(item.Speaker); CollectionAssert.Contains(new[] { "全員", "千和", "真涼", "姫香", "愛衣", "千和、真涼、姫香", "千和、姫香", "", }, item.Speaker); } }
public static async Task <List <ReturnLrc> > GetLrc(string songId) { var client = new HttpClient(); client.BaseAddress = new Uri($"http://music.163.com/"); var jpnLrcResponse = await client.GetAsync($"api/song/media?id={songId}"); var content = JObject.Parse(await jpnLrcResponse.Content.ReadAsStringAsync()); var jpnLrc = Lyrics.Parse(content["lyric"].ToString()); var chnLrcResponse = await client.GetAsync($"api/song/lyric?os=pc&id={songId}&tv=-1"); content = JObject.Parse(await chnLrcResponse.Content.ReadAsStringAsync()); if ((int?)content["code"] != 200) { throw new Exception("获取歌词出错"); } var chnLrc = Lyrics.Parse(content["tlyric"]["lyric"].ToString()); var lrcList = jpnLrc.Lyrics.Lines.Select(line => new ReturnLrc { Time = line.Timestamp.ToString("mm:ss.fff"), JLrc = line.Content }).ToList(); foreach (var line in chnLrc.Lyrics.Lines) { foreach (var lrc in lrcList.Where(lrc => lrc.Time == line.Timestamp.ToString("mm:ss.fff"))) { lrc.CLrc = line.Content; } } return(lrcList); }
public void Parse10000Times() { for (var i = 0; i < 10000; i++) { Lyrics.Parse <LineWithSpeaker>(TEST_DATA); } }
public void Stringify10000Times() { var l = Lyrics.Parse<Line>(TEST_DATA).Lyrics; for (var i = 0; i < 10000; i++) { l.ToString(); } }
public override IAsyncOperation <string> FetchLryics() { return(AsyncInfo.Run(async token => { var uri = new Uri("https://c.y.qq.com/lyric/fcgi-bin/fcg_query_lyric.fcg?format=json&callback=cb&musicid=" + this.id); var str = await httpClient.GetStringAsync(uri); str = str.Substring(3, str.Length - 4); using (var stream = Encoding.UTF8.GetBytes(str).AsBuffer().AsStream()) { var data = (LrcResult)lrcJsonSerializer.ReadObject(stream); if (data.code != 0 || string.IsNullOrEmpty(data.lyric) || //"[00:00:00]此歌曲为没有填词的纯音乐,请您欣赏" data.lyric == "WzAwOjAwOjAwXeatpOatjOabsuS4uuayoeacieWhq+ivjeeahOe6r+mfs+S5kO+8jOivt+aCqOaso+i1jw==") { return ""; } var lyric = Lyrics.Parse <Line>(Encoding.UTF8.GetString(Convert.FromBase64String(data.lyric))).Lyrics; if (lyric.Lines.Count == 0) { return null; } lyric.Lines.Sort(); if (string.IsNullOrEmpty(lyric.MetaData.Title)) { lyric.MetaData.Title = Title; } if (string.IsNullOrEmpty(lyric.MetaData.Artist)) { lyric.MetaData.Artist = Artist; } if (string.IsNullOrEmpty(lyric.MetaData.Album)) { lyric.MetaData.Album = Album; } if (lyric.Lines.Count != 0 && lyric.Lines[0].Timestamp != default) { lyric.Lines.Add(new Line()); } return lyric.ToString(); } })); }
public void TestAll() { var r = Lyrics.Parse<Line>(TEST_DATA); var l = r.Lyrics; Assert.AreEqual(53, l.Lines.Count); foreach (var item in l.Lines) { Assert.IsNotNull(item.Content); } Assert.AreEqual(6, l.MetaData.Count, $"Metadata keys: {string.Join(", ", l.MetaData.Keys)}"); Assert.AreEqual("eternal reality", l.MetaData.Title, "Wrong Title"); Assert.AreEqual("fripside", l.MetaData.Artist, "Wrong Artist"); Assert.AreEqual("eternal reality", l.MetaData.Album, "Wrong Album"); Assert.AreEqual("ShenzhiV战斗", l.MetaData.Creator, "Wrong Creator"); Assert.AreEqual(new TimeSpan(11000), l.MetaData.Offset, "Wrong Offset"); Assert.AreEqual(" 12estg:44", l.MetaData[MetaDataType.Length], "Wrong Length"); Assert.AreEqual("[a]", l.Lines[4].Content); Assert.AreEqual(Timestamp.Create(0, 0), l.Lines[4].Timestamp); }
public static string Convert(Dictionary <string, string> lrcs) { var lyrics = new Dictionary <string, IParseResult <Line> >(); foreach (var lrc in lrcs) { lyrics.Add(lrc.Key, Lyrics.Parse(lrc.Value)); } var xmlLyric = new Lyric(); foreach (var lyric in lyrics) { foreach (var line in lyric.Value.Lyrics.Lines) { LyricTimeline item; var existsItem = xmlLyric.Timelines.Where(e => e.Timestamp == line.Timestamp); if (existsItem.Any()) { item = existsItem.First(); } else { item = new LyricTimeline() { Timestamp = line.Timestamp }; } item.Elements.Add(lyric.Key, line.Content); if (!xmlLyric.Timelines.Exists(e => e == item)) { xmlLyric.Timelines.Add(item); } } } return(xmlLyric.ToXml()); }
public override IAsyncOperation <string> FetchLryics() { return(AsyncInfo.Run(async token => { var uri = new Uri($"http://music.163.com/api/song/lyric?os=pc&id={this.id.ToString()}&lv=-1"); var buf = await httpClient.GetBufferAsync(uri); using (var stream = buf.AsStream()) { var data = (LrcResult)lrcJsonSerializer.ReadObject(stream); if (data.code != 200 || data?.lrc?.lyric is null) { return ""; } var lyric = Lyrics.Parse <Line>(data.lrc.lyric).Lyrics; if (lyric.Lines.Count == 0) { return null; } lyric.Lines.Sort(); if (string.IsNullOrEmpty(lyric.MetaData.Title)) { lyric.MetaData.Title = Title; } if (string.IsNullOrEmpty(lyric.MetaData.Artist)) { lyric.MetaData.Artist = Artist; } if (string.IsNullOrEmpty(lyric.MetaData.Album)) { lyric.MetaData.Album = Album; } if (lyric.Lines.Count != 0 && lyric.Lines[0].Timestamp != default) { lyric.Lines.Add(new Line()); } return lyric.ToString(); } })); }
public static List <ReturnLrc> GetLrc(string mid) { var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36"); var result = httpClient.GetStringAsync(new Uri($"https://api.qq.jsososo.com/lyric?songmid={mid}")).Result; var jObject = JObject.Parse(result); var jpnLrc = Lyrics.Parse((string)jObject["data"]["lyric"]); var chnLrc = Lyrics.Parse((string)jObject["data"]["trans"]); var lrcList = jpnLrc.Lyrics.Lines.Select(line => new ReturnLrc { Time = line.Timestamp.ToString("mm:ss.fff"), JLrc = line.Content }).ToList(); foreach (var line in chnLrc.Lyrics.Lines) { foreach (var lrc in lrcList.Where(lrc => lrc.Time == line.Timestamp.ToString("mm:ss.fff"))) { lrc.CLrc = line.Content; } } return(lrcList); }