読者です 読者をやめる 読者になる 読者になる

perlでmp3情報を扱ってみよう2。歌詞を自動取得してみよう

perl mp3

perlで音楽を扱ってみたくて、前回 MP3::info をいじってみた。


せっかくなので、それで何か作業をしてみる。

perlを実行したら、歌詞を自動取得するようなものを作ってみる。

特に他に思いつかなかったので。


まずは下調べ。

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で音楽系のなんか作ってみたい。