無料歌詞探査機 Encke Pathfinder 1.042号機

1.042号機 2019-07-08
文字コードの指定追加
匿名歌詞検索のバグ修正
J-Lyric、歌ネット、歌詞ナビの仕様変更に対応


https://onedrive.live.com/?id=A0E729BFAE3B4AE!107&cid=0A0E729BFAE3B4AE


文字コード。このご時世に歌詞ナビがShift-JIS使っていて、GET時のURLエンコードに対応していませんでした。その為、日本語を含む検索で正常に動作していませんでした。定義ファイル内にCharsetの設定を増やして対応しました。
匿名歌詞検索はまだバグが残っているみたいなんですが、再現できないため対応できませんでした。

歌詞埋め込みとかEncke Pathfinderの今後

1.041号機で、当初から想定してた機能は全部搭載したかなという感じです。
同梱の定義ファイルで洋楽が少ない感じがするので増やそうと思うんですが、洋楽はそれこそ邦楽検索で見つかる様なメジャーなのしか聞かないレベルなので、何処がいいとかさっぱりわからんです。あと、おま環なのか検索が上手く動かない所とか、Bot対策されてる所とかあるし。


付属のテキストにも書きましたが、再生ソフト連携やジャケット検索、タイムタグ編集といった機能は今後とも搭載する事はありません。専用の便利なソフトを使って下さい。
そして歌詞埋め込みについてです。cue+flacで管理して、foobar2000のLyrics panel表示用に歌詞を取得している自分にとっては、使ってなかった機能なんですよね。
歌詞埋め込みも専用のソフトを使えばいいんじゃないの?と思ってたらそういうの無いんですね。確かにまあCassiniみたいにまとめて歌詞をダウンロードするツールというのが無いからなんでしょうかね。


しかし、Encke Pathfinderで歌詞埋め込みをするのは、うーんという感じ。
内部的には、マルチスレッドなのでスレッドセーフな方法じゃ無ければ排他処理が必要でボトルネックになりかねないとか、ステータスが歌詞の有、無、内蔵と未検索、結果有、結果無の全部で6種類にもなって面倒とか、まあ色々。
外部的には、こんなソフト作っておいてなんだけど、歌詞検索エンジンに必要以上の負荷を掛けるのは本意ではないんですよ。mp3を持ち出し用に作って、なんか変更してmp3作り直してその度にダウンロードするのはあんまし良くないなーと。
そして、なにより内蔵歌詞の仕様がよく分かんね。ID3v2.3, ID3v2.4?、UTF-16ってBOM有り無しLE, BE?eng||って?


そんな訳でEncke Pathfinderに歌詞埋め込み機能を搭載するのは見送るつもりです。
一方でCassiniではそれなりの人が使っていた機能だとは思うので、何とかするとなると別ソフトかな。ただ内蔵歌詞の仕様がさっぱりなので、もしかしたらその内できるかも位に思っていて下さい。

無料歌詞探査機 Encke Pathfinder 1.041号機

1.041号機 2019-06-17
URI指定機能の追加
歌詞が見つからなかった時にマッチレベルがEにならないバグの修正


https://onedrive.live.com/?id=A0E729BFAE3B4AE!107&cid=0A0E729BFAE3B4AE


URI指定機能とは、タイトル検索の検索エンジンで、マイナーアーティストで一般単語なタイトルだと、googleからは見つかってもその検索エンジンの検索フォームからは見つけられないという事があります。(The Local Artの「tomorrow」という曲がそうだった…)
そんな時に対応している歌詞検索エンジンなら、直接URIを指定することで歌詞を取得できる機能です。
[URI指定]からURIを入力するか、ブラウザからURIを歌詞テキストボックスにD&Dすることで、歌詞ページから直接歌詞を読み込みます。
ただし、アーティストとタイトルは検索結果ではなく候補検索のテキストボックスから使われます。
なお、事前にクリップボードURIがテキストとして入っていれば初期値として入ります。
またブラウザからのD&Dは、ieだとアドレスバーのアイコンをD&DFirefoxならアドレスをシングルクリックした後アドレス文字をD&Dといった操作になります。

STEP_Kとライセンスの話

音楽ファイルは基本cue+flacで管理しています。
持ち出し用にmp3にすることはあって、それでちょこっとだけタグ編集する事があり、その際にはSTEPを使っていました。
そういう訳で利用頻度は低かったこともあり、STEPって今どうなっているのかなってググってみたら今はSTEP_Kなんて物が存在するんですね。SuperTagEditorを改造したSTEPを改造したSTEP_Mを改造したSTEP_K、ってすげーなーって思います。


STEP_MからはGPLライセンスになっているからというのは大きな点です。STEP_K以降もソースがGPLで公開されるので誰かが開発を受け継いで行く可能性があります。
自分もEncke PathfinderをOSSにしようと思ってます。開発を辞めちゃった後に、誰か奇特な人が引き継いでくれたらなーと。クソコードだけどマルチスレッドawait/asyncでスクレイピングしてるのは何かの役に立つかも?歌詞取得自体は、定義ファイル見れば今でも何やってるか分かるかとおもいます。
でライセンスですが、さらに引き継ぎを期待してGPLにするってーと、まあ色々言われてるし拒否反応を示す人も多いし。無難にMITとかにしておいた方がいいのかなと。

無料歌詞探査機 Encke Pathfinder 1.040号機

1.040号機 2019-06-08
JOYSOUNDとプチリリに対応
上記歌詞検索エンジン用設定の追加
細かいバグの修正


https://onedrive.live.com/?id=A0E729BFAE3B4AE!107&cid=0A0E729BFAE3B4AE


JOYSOUNDとプチリリはAJAXを使ってページ内のデータを取得しています。これに対応する形で設定を追加しました。思いっきり狙い撃ちです。JOYSOUNDなんて一度もHTMLを開かず、Web APIを叩いているだけになってるし…
でもまあ、HTTPは何処まで行っても平文通信だし、そのやりとりは丸裸なんですよね。開発に当たり特別なツールを使ったわけじゃ無くFire Foxに標準で付いてくるデバッガだけで事足りました。
付属のtxtに書き忘れていたんですが、無料歌詞探査機 Encke Pathfinderはフリーウェアです。今のところ。その内OSSにしようかとは思っているんですが、ライセンスについて決めかねているので悩み中。

歌詞検索エンジン定義ファイル作成方法:歌詞タイム Part 3

最終回はデバッグ方法についてです。これが多分一番意味のある資料かと。


歌詞検索エンジン定義ファイルができたらLyricsSearchEngineフォルダに保存します。拡張子は.txt。文字エンコードutf-8
ソフトを起動するか[ツール]-[設定]-[歌詞検索エンジン]の[再読込]を行います。その際に[ツール]の[ログ]を表示しておきます。
読み込み時にerrorなりwarning*1が出ればログ出力されます。正規表現については文法チェックが行われます。文法チェックだけで正常な動作をするかどうかとは別問題です。
間違っていたら修正して、デバッグ中の物を候補検索の[歌詞検索エンジン]で選択すると、その下の[↑]ボタンが有効になり読込できます。


この先も、デバッグ中の物を候補検索の[歌詞検索エンジン]で選択していると、動作ログが出力されます。
リクエスURI、レスポンス、正規表現の結果が表示されるので、間違っている所を修正して[↑]ボタンで読込を繰り返します。
歌詞取得に関しては一度行うとボタンがグレーアウトしてしまうのですが、Ctrlキーを押しながら候補ビューのアイテムをダブルクリックすると強制取得する事ができます。
今回はページ処理を見送りましたが、デバッグするときは一般単語をタイトルに入れてアーティストを空にして候補検索を行えば、ページ毎にログが出力される事で確認取れると思います。

*1:発音はウォーニングというのが浸透する日は果たして来るのか

歌詞検索エンジン定義ファイル作成方法:歌詞タイム Part 2

HTMLソースを表示する所からです。


まずResult正規表現を設定します。
結果一覧のブロックを抽出するんですが、ブラウザのデバッグ機能を使うと便利でしょう。Fire Foxなら開発ツールのインスペクターで要素を調べることができます。
Resultは本質的には必須ではありません。しかし、Song抽出時にHTML全体からだと変な物を拾ってくる可能性が高くなります。scriptタグ内に出力HTMLを書いているケースとかありますし。
Songできっちり抽出できるのならResultはいい加減でいいし、Songが変な物を拾うのならResultできっちり範囲を区切るという事です。
googleはその点、どちらもややこしそう。というかdiv使いすぎ。DOMやHTMLパーサーを利用してないので複雑な入れ子にはめっさ弱いのよ。
要素としては<div id="search">が結果っぽいです。しかし終わり側は</div>の連続しか無く他にも見られるパターンなので、近くを見て「ウェブ検索結果」と<div id="bottomads">を採用しました。

Result =ウェブ検索結果.+?<div id="bottomads">


次はSong正規表現です。
開始は<div class="g">でOKでしょう。終了は、</div>連続くらいしかない。仕様変更に弱そうだけど仕方ないです。

Song=<div class="g">.+?</div></div></div></div>


そしてTitleとArtistで問題が。
h3タグの所は歌詞タイムの曲ページのtitleタグから来ていて、本来はタイトルとアーティストの間を全角スペース2文字で区切っています。それをgoogleが勝手に半角スペースに置き換えているので、区切りがどこかわからなくなってしまってます。
解決策は無さそう。仕方ないので最後の半角スペースを区切りにする事にします。
アーティストに半角スペースがあると、完全マッチしなくなります。部分マッチにはなるので、検索後△表示から手動でお願いするしかないかな。

Title=<a href="(.+?)" onmousedown=".+?"><h3 class="LC20lb">(.+?) \S+ - 歌詞タイム
Artist=<h3 class="LC20lb">.+\s(\S+) - 歌詞タイム


FirstLineは歌い出しで、検索結果を見ると有ったり無かったりです。
どうも曲名が歌詞中に有るとそれに引っ張られて無くなってしまうようです。ある分は拾っておきましょう。

FirstLine=歌い出し:(.+?)</span>


NextPageは「次へ」の文字があるので場所の特定は楽なんですが、aタグから距離が長いです。
こいうときに.+?が上手く働かない事があります。仕方ないので[^]+?を使って一個一個やっていきましょう。

短い時間に高度な検索(siteオプションの事かな)を何度も行うと、googleBot判定を食らってしまい検索できなくなります。ページめくりで検索数を消耗するのは賢くないのでページ処理は行わない事にします。


検索結果の方はここまでで次は曲ページの方。こちらは比較的簡単です。
歌詞タイムの場合、本文の方の作詞作曲は、やたら空白が多くて面倒そうなんですが、metaタグの方は簡単な形で書いてあるので、そこから持ってきます。
歌詞本体はちょこっとまあなんかやってますが、普通にページの下の方からゲットできます。

Lyricist=作詞:(.+?) 作曲
Composer=作曲:(.+?) 歌い出し
Body=var lyrics = '(.+?)';


これで定義ファイルは完成です。次回最終回はデバッグ方法についてです。