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); //歌詞を返す。 }
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); }
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)); }