perlでmp3情報を扱ってみよう2。歌詞を自動取得してみよう
perlで音楽を扱ってみたくて、前回 MP3::info をいじってみた。
せっかくなので、それで何か作業をしてみる。
goo歌詞を覗いてみよう
goo歌詞のサイトを見てみましょう。
あー。radioボタンにlabelが付いてないな・・・。
いや、そこじゃなくて、歌詞の表示部分です。
HTML表示だ!
いいのかな・・・?
gooさん・・。
コピペし放題だし・・。
右クリは禁止されてるけど・・。
一応
歌詞の保存、印刷、引用、コピー&ペーストは著作権保護の観点から禁止しています。
と書いているので、今回のスクリプトは保存もコピペもしない事が決定。
中身
#!/usr/bin/perl use strict; use warnings; use MP3::Info; use Data::Dumper; use Web::Scraper; use URI; use URI::Escape; use Encode; main(); sub main { my $tag = get_mp3_info(); my $artist = $tag->{'ARTIST'}; my $title = $tag->{'TITLE'}; my $kashi = get_kashi_list($title); print Dumper encode('shift-jis', decode('utf-8', $kashi)); } sub get_mp3_info { return get_mp3tag($ARGV[0]); } sub get_kashi_list { my $title = shift; #URL生成 my $url = "http://music.goo.ne.jp/lyric/search.php?n="; $url .= uri_escape(encode('euc-jp', decode('shift-jis', $title))); $url .= "&lyric=%B2%CE%BB%EC%B8%A1%BA%F7&t=2"; #scraperの設定 曲検索 my $scraper = scraper { process '.lst1 > ul > li > a', 'music' => '@href'; }; my $uri = new URI($url); my $music_list = $scraper->scrape($uri); #scraperの設定 歌詞取得 my $scraper2 = scraper { process '.fs16', 'kashi[]' => 'TEXT'; }; my $res = $scraper2->scrape($music_list->{'music'}); my $kashi = $res->{'kashi'}->[1]; #なぜかutf-8 flagが付いてしまったようなので、おまじない Encode::_utf8_off($kashi); $kashi =~ s/\s{1}/\n/gi; return $kashi; }
結果は、
こんな感じ。
終わってみて
ちょっと汎用性がひどすぎる。
・候補が複数あった場合
・候補が複数ページにまたがった場合
・曲名が少し違うだけ(全角半角とか)で検索引っかからない
でもまぁ、何かのサービス作るわけじゃないし、メモ的に投稿。
いつか、perlで音楽系のなんか作ってみたい。