Last.fmとCDDBを苦しめます。

長い音楽生活の中で、すでに「古風な」オーディオCD形式のディスクを1000個以上蓄積していることがありました。 しかし、ソーシャルネットワークの時代、一般的に、そして特にLast.fmで非常に多くのディスクを使用する場合はどうすればよいでしょうか? そうです、コンピューターで聞くことなく、すべてをLast.fmに、できれば大量に送信する必要があります(ただし、この量は、隣接する耳の1か月半の連続ストーミングにすぎませんが)。また、コンピューターのオーディオCDも聞きません。 このような「困難な」問題を解決するために必要なものは、偉大で強力な言語PERL、Last.fm API、CDDB、および小さなプログラマーの4つだけです。

または、私はプログラマーではなく、私の職業がコンピューターに関連しているわけではないので(または残念ながら)、必要なものの3/4しかありません。 さて、目が痛く、手が痛い。 美しい統計とプロフィールを持ちたいという欲求は、必要なスキルの不足によって圧倒されます:)。



1. Last.fm API

ここでは複雑なことは何もありません。 説明ページで詳細を読むことができますが、要するにこのように機能します。



1.1

HTTP / 1.1 GETリクエストをアドレスに送信します
  http://post.audioscrobbler.com:80/。 
クエリ文字列は次のようになります。
  http://post.audioscrobbler.com/?hs=true&p=1.2.1&c=<client-id>&v=<client-ver>&u=<user>&t=<timestamp>&a= <auth> <pre>
 <client-id> =クライアントプログラムのID  	
 <client-ver> =クライアントプログラムのバージョン
 <user> =このユーザー名は論理的です 
 <timestamp> = Unix時間
 <auth> = md5(md5(パスワード)+タイムスタンプ)に等しい認証トークン 
Unix時間は、1970年1月1日から経過した秒数に等しくなります。



1.2

全員が送信すると、サーバーから次のような応答が返されます。

わかった
 17E61E13454CDD8B68E8D7DEEEDF6170
 http://post.audioscrobbler.com:80/np_1.2
 http://post2.audioscrobbler.com:80/protocol_1.2
すべてが順調で、喜び、「サーバーと握手する」ことがわかります。



1.3

サーバーに音楽データを転送するプロセスを開始します(Last.fmのスクロブリングの方言で)

最初のリクエストへの応答として受信したアドレスに、POSTリクエストを送信します。これには必ず以下を含める必要があります。

  <sessionID> =セッションID、以前に受信した
 <artist> =お気に入りのVIAの名前
 <track> =お気に入りのVIAの曲のタイトル
 <time> =繰り返しますが、再生開始時のUNIX時間。 


これらはすべて必須フィールドです。 好奇心の強い人は完全なリストを読むことができます。 最も興味深いのは、タイムスタンプは何でもよく、「未来の音楽」は普通だということです。







しかし、サードパーティ製のモジュールを使用できなければ、PERL言語はそれほど優れていません。 Net :: LastFM :: Submissionを使用しましたが、他のオプションもあります。



2. CDDB(コンパクトディスクデータベース)

実際、Gracenote(Sony)が所有するCDDBは使用せず、 freedbの無料の類似物を使用します。 Gracenoteのポリシーは、最愛のAOLのポリシーに少し似ています。ある時点で、すべての「ライセンスされていない」アプリケーションを単に禁止したため、CDDB2形式に切り替えました。



本質的にCDDBとは何ですか? 1つの島で、このすべてを始めたインド人の台湾人のTi Kanが生まれました。 Ti Kan氏のアイデアは非常にシンプルでした。各ディスクは、各トラックの開始時間のチェックサム、総再生時間、総トラック数で構成されるほぼ一意のIDによって決定されます。 かつて、私たちの台湾人は自分で基地を補充しました、そして、願い事は彼にディスクの説明と石鹸のidを彼に送りました。 当然、彼がそれに飽きると、最終的にはCDB、freedb、MusicBrainzなどに変わりました。



しかし、私はHis下PERLのテーマから逸脱しました。 freedbでトラックのリストを取得するには、最も単純なモジュール/スクリプトCDDB_get.pmを使用し、CDをCD-ROMに挿入することを忘れないでください。



3.それはすべて何が起こったのですか?

その結果、起動時にfreedbでディスクを検索し、オプションですべての適切なオプションのリストを表示し、このディスクの曲のリストをLast.fmに送信し、次のディスクを挿入するまで30秒待ってから再度ジョブを実行する簡単なスクリプトがあります。

#!/usr/bin/perl -w



use Net::LastFM::Submission;

use CDDB_get qw( get_cddb );



my %config;

#CONFIG_______________________________________________________________________________

$config{CDDB_HOST}="freedb.freedb.org"; # cddb host

$config{CDDB_PORT}=8880; # cddb port

$config{CDDB_MODE}="cddb"; # cddb mode: cddb or http

$config{CD_DEVICE}="/dev/cdrom"; # cd device

$config{input}=0; # 1: ask user if more than one possibility, 0: no user interaction

$lfmuser='user';

$lfmpass='password';

#____________________________________________________________________________________



open (DB,">>musiclist.txt"); #just for stats



my $submit = Net::LastFM::Submission->new(

'user' => $lfmuser,

'password' => $lfmpass)

$submit->handshake;



%cd=get_cddb(\%config);



while ($previd ne $cd{id}){

unless(defined $cd{title}) { die "no cddb entry found"; }

print "artist: $cd{artist}\n","title: $cd{title}\n","year: $cd{year}\n","id: $cd{id}\n";

print DB $cd{artist}," - ",$cd{title}," \[$cd{year}\]\n";



my $n=1;

foreach my $i ( @{$cd{track}} ) {

print "$n: $i\n";



$submit->submit(

'artist' => $cd{artist},

'title' => $i,

'album' =>$cd{title},

'id' =>$n,

'time' => time - (180-($n+5))*60 # 3 hours back

);

$n++;

}



$previd=$cd{id};

print "_" x 20,"\n30 seconds pause for the next CD ...\n";

sleep(30);

%cd=get_cddb(\%config);

}









その結果、3時間の遅延で完成したプロファイルが得られます。





これはすべて素人が書いているので、厳密に判断しないでください。 また、これもスクリプトの実装ではなく、スクリプトのアイデアである可能性が高いと思います。1週間以内に、ユーザーが追加し、曲の実際の長さを刻むコードがコードに追加されると思います。 さらに、「未来の音楽」を避けるために、何時に設定するかを考える必要があります。 理想的なオプションは、オーディオディスクをロードするときにデータベースにIDを書き込み、夜には、たとえば、実際のシーケンスと時間を保持しながらデータベースからすべてのトラックをスクラブし、必要に応じて多くのお気に入りの曲を何度もスクリブルするデーモンです。



All Articles