コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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);
        }
コード例 #3
0
 public void Parse10000Times()
 {
     for (var i = 0; i < 10000; i++)
     {
         Lyrics.Parse <LineWithSpeaker>(TEST_DATA);
     }
 }
コード例 #4
0
 public void Stringify10000Times()
 {
     var l = Lyrics.Parse<Line>(TEST_DATA).Lyrics;
     for (var i = 0; i < 10000; i++)
     {
         l.ToString();
     }
 }
コード例 #5
0
 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();
         }
     }));
 }
コード例 #6
0
        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);
        }
コード例 #7
0
        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());
        }
コード例 #8
0
 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();
         }
     }));
 }
コード例 #9
0
        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);
        }