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 にフォーカスを戻さなくてよいので便利っぽい。