Skip to content

Instantly share code, notes, and snippets.

@horus
Created September 7, 2010 08:52
Show Gist options
  • Select an option

  • Save horus/568054 to your computer and use it in GitHub Desktop.

Select an option

Save horus/568054 to your computer and use it in GitHub Desktop.
#!/usr/bin/perl
use strict;
use warnings;
my $page = WebBrowsing->new;
my $yutou = Tianyutou->new(@ARGV[0,1]);
while ("In Spring Brother We Trust") {
if (defined(my $p_info = $page->info)) {
$yutou->update($p_info);
}
sleep 5;
}
package App;
use Foundation;
BEGIN {
NSBundle->bundleWithPath_(
'/System/Library/Frameworks/ScriptingBridge.framework'
)->load;
@SBApplication::ISA = qw(PerlObjCBridge);
};
sub new {
my ($class, $appname) = @_;
bless {
app => SBApplication->applicationWithBundleIdentifier_($appname),
event_id => '',
event_content => '',
}, $class;
}
sub update_event { }
sub info { }
package Track;
use Encode;
use Digest::MD5 qw/md5_hex/;
use base qw/App/;
sub new {
my $class = shift;
my $self = $class->SUPER::new("com.apple.iTunes");
bless $self, $class;
}
sub update_event {
my $self = shift;
my $itunes = $self->{app};
return undef unless $itunes->playerState == 1800426320;
my $track = $itunes->currentTrack;
my $this_track = sprintf "%s - %s", encode('utf8', $track->artist->UTF8String),
encode('utf8', $track->name->UTF8String);
my $event_id = md5_hex($this_track);
return undef if $event_id eq $self->{event_id};
$self->{event_id} = $event_id;
$self->{event_content} = $this_track;
}
sub info {
my $self = shift;
return undef unless defined $self->update_event;
return [
verb => "listening_to",
noun => $self->{event_content},
shout => '',
event_id => $self->{event_id},
];
}
package WebBrowsing;
use Encode;
use Digest::MD5 qw/md5_hex/;
use base qw/App/;
sub new {
my $class = shift;
my $self = $class->SUPER::new("com.apple.Safari");
bless $self, $class;
}
sub update_event {
my $self = shift;
my $safari = $self->{app};
my $window = $safari->windows->objectAtIndex_(0);
my $current_tab = $window->currentTab;
my $page_info = $safari->doJavaScript_in_("document.title + ' - ' + document.location", $current_tab);
# TODO: return undef when no tabs available
$page_info = encode('utf8', $page_info->UTF8String);
my $event_id = md5_hex($page_info);
return undef if $event_id eq $self->{event_id};
$self->{event_id} = $event_id;
$self->{event_content} = $page_info;
}
sub info {
my $self = shift;
return undef unless defined $self->update_event;
return [
verb => "reading",
noun => $self->{event_content},
shout => q{},
event_id => $self->{event_id},
];
}
package Tianyutou;
use LWP::UserAgent;
use HTTP::Request::Common qw/GET POST/;
sub new {
my ($class, $email, $passwd) = @_;
my $self = bless {
email => $email,
password => $passwd,
site => 'http://tianyutou.com',
session_id => q{},
useragent => LWP::UserAgent->new,
}, $class;
$self->login;
return $self;
}
sub login {
my $self = shift;
($self->{session_id}) = split /;/, $self->{useragent}->request(
POST $self->{site} . '/api/login',
[ email => $self->{email}, password => $self->{password} ]
)->header("Set-Cookie");
}
sub update {
my ($self, $track_info) = @_;
$self->{useragent}->request(
POST $self->{site} . '/api/checkin',
Cookie => $self->{session_id},
Content => $track_info
);
}
sub DESTROY {
# TODO: reserved for logout later
shift->SUPER::DESTROY;
}
# vim:ft=perl
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment