コード例 #1
0
        public static string FetchLyrics(string trackTitle, string artist, string album)
        {
            var client = new WebClientEx()
            {
                Encoding = Encoding
            };
            string lyricId;

            lyricId = GetId(client, HttpUtility.UrlEncode(trackTitle, Encoding), HttpUtility.UrlEncode(artist, Encoding) ?? "", "");
            //歌詞ナビではinfoにいろいろな情報が入る。アルバム情報やアニメ主題歌、ドラマ主題歌などの情報等
            //歌詞ナビ側のアルバム情報がまちまちなのでアルバムでの検索は""にして無効化中。設定から切り替え出来るように検討ちゅ ↑
            var id = lyricId;

            if (id == "")     //IDが余白の場合は歌詞が見つからない状態
            {
                return(null); //MusicBeeのプラグイン仕様通りにnullを返す。
            }
            var lyricPage = client.DownloadString($"https://kashinavi.com/song_view.html?{id}");

            lyricPage = lyricPage.Replace("<br>", "\n");                                                                                                                            //HTMLの改行コードをC#の改行コードに置き換え。
            var lyric_ms = Regex.Match(lyricPage, @"\<div class=""kashi"" oncopy=""return false;"" unselectable=""on;""\>(?<lyric>.*)\</div\>\n\</div\>", RegexOptions.Singleline); //指定範囲から歌詞を摘出
            var lines    = lyric_ms.Groups["lyric"].Value.Trim();                                                                                                                   //歌詞をトリム。

            return(lines);                                                                                                                                                          //歌詞を返す。
        }
コード例 #2
0
        private static string GetId(WebClientEx client, string titele, string artist, string album)
        {
            var mode       = album != "" ? "info" : "kyoku"; //アルバム情報があれば優先的にアルバム情報での検索にする。
            var search     = album != "" ? album : titele;   //アルバム情報での検索時に検索ワードをMusicBee側のアルバム情報にする。
            var lyricId    = "";
            var searchPage = client.DownloadString($"https://kashinavi.com/search.php?r={mode}&search={search}&m=bubun&start=1");

            //曲名から歌詞ナビにある情報をすべて取得。 m=bubunで部分一致になる。
            if (!searchPage.Contains("該当データがありませんでした。"))
            {
                var startTex   = "<td bgcolor=\"#EE9900\"><font color=\"#ffffff\">- - - ◆ ミニ情報</font></td>";
                var startIndex = searchPage.IndexOf(startTex) + startTex.Length + 1;                                                                                                                                             //正規表現ですべてから探すのはアレなので範囲指定
                var length     = searchPage.Substring(startIndex).IndexOf("<tr><td colspan=5 bgcolor=\"#FFDD55\" align=center>") - 2;                                                                                            //同上
                                                                                                                                                                                                                                 //正規表現 歌詞ページのIDと曲名とアーティストの情報を正規表現から取得。
                var ms = Regex.Matches(searchPage.Substring(startIndex, length), @"<a href=""/song_view\.html\?(?<lyricId>\d+)""><img style=.+<a href=""/song_view.html\?\d+"">(?<title>.+)</a>.+&start=1"">(?<artist>.+)</a>"); //指定範囲から検索結果を摘出
                foreach (Match m in ms)                                                                                                                                                                                          //すべての検索結果
                {
                    var art   = m.Groups["artist"].Value.Trim();
                    var title = m.Groups["title"].Value.Trim();

                    if ((art == HttpUtility.UrlDecode(artist, Encoding)) && (title == HttpUtility.UrlDecode(titele, Encoding)))//すべての検索結果からアーティストと曲名両方が一致したIDを入れる
                    {
                        lyricId = m.Groups["lyricId"].Value.Trim();
                        break;                                                   //曲名とアーティストが両方一致したら終了
                    }
                    else if (title == (HttpUtility.UrlDecode(titele, Encoding))) //一致したのがなければ曲名に一致した最後のIDを入れる。
                    {
                        lyricId = m.Groups["lyricId"].Value.Trim();
                    }
                }
            }
            return(lyricId);
        }
コード例 #3
0
        public static string FetchLyrics(string trackTitle, string artist, string album)
        {
            var client = new WebClientEx()
            {
                Encoding = Encoding
            };

            trackTitle = HttpUtility.UrlEncode(trackTitle);
            artist     = HttpUtility.UrlEncode(artist);
            album      = HttpUtility.UrlEncode(album ?? "");

            // 検索結果ページ
            string lyricId;
            {
                string searchPage = client.DownloadString($"https://petitlyrics.com/search_lyrics?title={trackTitle}&artist={artist}&album={album}");

                int startIndex = searchPage.IndexOf("id=\"lyrics_list\"");
                int length     = searchPage.Substring(startIndex).IndexOf("id=\"lyrics_list_pager\"");

                var ms = Regex.Matches(searchPage.Substring(startIndex, length), @"href=""/lyrics/(?<lyricId>\d+)");
                if (ms.Count == 0)
                {
                    return(null);
                }

                lyricId = ms.Cast <Match>().First().Groups["lyricId"].Value.Trim();
            }

            // 歌詞ページ(別に歌詞取得には必要ないが、向こうのサーバーを欺く為)
            string lyricPage = $"https://petitlyrics.com/lyrics/{lyricId}";

            client.DownloadData(lyricPage);

            // X-CSRF-Token
            string token;

            {
                string tokenScript = client.DownloadString("https://petitlyrics.com/lib/pl-lib.js");

                var m = Regex.Match(tokenScript, @"'X-CSRF-Token', '(?<token>[^']+)");
                if (m.Success)
                {
                    token = m.Groups["token"].Value;
                }
                else
                {
                    return(null);
                }
            }

            client.Headers.Clear();
            client.Headers[HttpRequestHeader.Accept]         = "*/*";
            client.Headers[HttpRequestHeader.AcceptLanguage] = "ja";
            client.Headers[HttpRequestHeader.Referer]        = lyricPage;
            client.Headers[HttpRequestHeader.UserAgent]      = "Mozilla/5.0 (Windows NT 6.3; Win64; x64; Trident/7.0; rv:11.0) like Gecko";
            client.Headers[HttpRequestHeader.Pragma]         = "no-cache";
            client.Headers[HttpRequestHeader.ContentType]    = "application/x-www-form-urlencoded; charset=UTF-8";
            client.Headers.Add("X-Requested-With", "XMLHttpRequest");
            client.Headers.Add("X-CSRF-Token", token);

            // 歌詞取得API
            string json = client.UploadString("https://petitlyrics.com/com/get_lyrics.ajax", $"lyrics_id={lyricId}");

            // パース
            string[] lines = Regex.Matches(json, @"{""lyrics"":""(?<base64>[^""]*)""}")
                             .Cast <Match>()
                             .Select(x => x.Groups["base64"].Value.Replace(@"\/", "/"))
                             .Select(Convert.FromBase64String)
                             .Select(line => Encoding.GetString(line).TrimEnd(new[] { '\r', '\n' }))
                             .ToArray();
            return(string.Join("\r\n", lines));
        }