Cocoa::NSDistributedNotificationCenter

soh335/Cocoa-NSDistributedNotificationCenter · GitHub

use strict;
use warnings;

use EV;
use AnyEvent;
use Cocoa::EventLoop;
use Cocoa::NSDistributedNotificationCenter; 
use AnyEvent::WebService::ImKayac;
use Config::Pit;

my $im_config = pit_get('im.kayac.com');
my $im = AnyEvent::WebService::ImKayac->new(
    %{$im_config},
);

my $cnc = Cocoa::NSDistributedNotificationCenter->new;
$cnc->listen('com.apple.iTunes.playerInfo', sub {
    my $info = shift;
    my $cv = AE::cv;
    $im->send( message => sprintf("%s(%s) by %s", $info->{Name}, $info->{Album}, $info->{Artist}), cb => sub{
        my ($hdr, $res, $error) = @_;
        warn encode_utf8 $res->{error} unless $res->{result} eq "posted";
        $cv->send;
    });
    $cv->recv;
}); 
    
Cocoa::EventLoop->run;

itunes の曲が変わったら im.kayac.com に通知されたかったので、Cocoa::NSDistributedNotificationCenter というのを書きました。

objective c - Change iTunes click to enqueue instead of play - Stack Overflow

xs ちょっと分からなすぎて destroy のタイミングで解放しそこねてるのがあるようなのですが、わからないのでひとまず放置してあります

あと AnyEvent + Cocoe::EventLoop で動くとおもったら

AnyEvent::Impl::Cocoa does not support blocking waits.

って出ちゃって、im.kayac.com にいつも自作の AnyEvent::WebService::ImKayac; で送ってたのでめんどくさい感じになって飽きてる感じになってます。

とりあえず曲変わった時に itunes にフォーカスを戻さなくてよいので便利っぽい。