Скробблер в DeaDBeeF есть, но при прослушивании радио онлайн(я столкнулся с Death.FM к примеру) не всегда корректно отображается имя исполнителя, длина песни и прочая атрибутика, которая нужна для скробблинга. Кроме того, в числе плагинов DeaDBeeF пока отсутствует "Psi publish tune". Я решил всё исправить маленьким скриптецом(ребята, он адекватно работает только на Death.FM, поэтому, если хотите, могу его оптимизировать под ваше любимое радио)
#!/usr/bin/perl -wuse File::HomeDir;use Proc::ProcessTable;local ($arn, $aln, $titn, $len, $min, $sec);sub getpid{$t = new Proc::ProcessTable; foreach $p ( @{$t->table} ) { if ($p->cmndline=~m/\/usr\/bin\/deadbeef/) { $pid=$p->pid; } }if (!$pid) {die "DeaDBeeF is not launched!";}}$home = File::HomeDir->my_home;sub lastfmsubmit{ `/usr/lib/lastfmsubmitd/lastfmsubmit -a "$arn" --title "$titn" -l $len --album "$aln" `;}sub psipublishtune{$psifile="$home/.psi/tune"; open FILE, ">$psifile" or die "unable to open file ~/.psi/tune!!!"; print FILE <<EOF; $titn $arn $aln $min:$secEOFclose FILE;}sub parse{ ($arn, $aln, $titn)=split(/ - /, `deadbeef --nowplaying '%a - %t' 2>/dev/null `, 3); $titn=~s/\([[:digit:]]{1,}\:[[:digit:]]{2}\)//p;$_=$&; s/^\(|\)$//g; ($min,$sec)=split(/\:/,$_); $len=$min*60+$sec;if ($arn=~/.*,\sThe/){ $arn=~s/,\sThe//; $arn="The $arn";}}sub change{ $aro=$arn; $alo=$aln; $tito=$titn; parse; return (($aro ne $arn)&&($alo ne $aln)&&($tito ne $titn));}{ getpid; parse; lastfmsubmit; psipublishtune; while(kill 0,$pid) { if (change) { lastfmsubmit; psipublishtune; } sleep($len); }}
Сегодня я снова счастливый пользователь самого ненапряжного(почти) дистрибутива — кубунту.
Не так давно мне пришлось задуматься о мультипользовательском скробблинге, плюс переписать код немного.
#!/usr/bin/perl -wuse Proc::ProcessTable;use Audio::Scrobbler;use threads;use warnings;use strict;use File::HomeDir;use POSIX qw(setsid);my ( %scrobs, $dpid, $arn, $aln, $titn, $len, $min, $sec );my $home = File::HomeDir->my_home;sub init { my $t = new Proc::ProcessTable; foreach my $p ( @{ $t->table } ) { if ( $p->cmndline =~ m/deadbeef/ ) { $dpid = $p->pid; } } die "DeaDBeeF is not launched, stopped" unless $dpid; die "Couldn't find config file! Aborting." unless open CONFIG, ".deathfm"; my $fileregx = qr|.*?=\W*(.*)$|; do { if ( <CONFIG> =~ m/account/ ) { <CONFIG> =~ m/$fileregx/; my $username = $1; <CONFIG> =~ m/$fileregx/; my $password = $1; $scrobs{$username} = new Audio::Scrobbler( cfg => { progname => "lsd", progver => "1.0.6", username => $username, password => $password, verbose => 1 } ); $scrobs{$username}->handshake() or print $scrobs{$username}->err() . "\n"; sleep 1; } } until ( eof CONFIG ); close CONFIG;}sub daemonize { die "Can't chdir to $home: $!" unless chdir "$home"; umask 0; die "Can't read /dev/null: $!" unless open STDIN, '/dev/null'; die "Can't write to /dev/null: $!" unless open STDOUT, '>/dev/null'; die "Can't write to /dev/null: $!" unless open STDERR, '>/dev/null'; die "Can't fork: $!" unless defined( my $pid = fork ); exit if $pid; setsid or die "Can't start a new session: $!";}sub lastfmsubmit { my ( $scrobbler, $artist, $album, $title, $length ) = @_; $scrobbler->submit( { 'artist' => $artist, 'album' => $album, 'title' => $title, 'length' => $length } ) or print $scrobbler->err; sleep 1;}sub parse { ( $arn, $aln, $titn ) = split( / - /, `deadbeef --nowplaying '%a - %t' 2>/dev/null `, 3 ); $titn =~ s/(\([[:digit:]]{1,}\:[[:digit:]]{2}\))//p; $_ = $1; s/^\(|\)$//g; ( $min, $sec ) = split( /\:/, $_ ); $len = $min * 60 + $sec; if ( $arn =~ /.*,\sThe/ ) { $arn =~ s/,\sThe//; $arn = "The $arn"; }}sub change { my $aro = $arn; my $alo = $aln; my $tito = $titn; parse; return ( ( $aro ne $arn ) && ( $alo ne $aln ) && ( $tito ne $titn ) );}sub submit { for my $usr ( keys %scrobs ) { threads->create( \&lastfmsubmit, $scrobs{$usr}, $arn, $aln, $titn, $len ); }}{ &daemonize; &init; &parse; &submit; while ( kill 0, $dpid ) { if (&change) { &submit; } sleep(60); }}
[account]username = vasiapassword = pupkin[account]username = lenapassword = golovach//и так далее
Подробнее о форматировании
Отправить комментарий