Skip to content

Instantly share code, notes, and snippets.

@emasaka
Created April 30, 2014 06:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save emasaka/cc84d0a260917e728932 to your computer and use it in GitHub Desktop.
Save emasaka/cc84d0a260917e728932 to your computer and use it in GitHub Desktop.
#!/usr/bin/env perl
use strict;
use warnings;
use 5.014;
use File::Basename qw(basename);
package NoteMu2Feed {
use LWP::UserAgent;
use JSON qw(decode_json);
use XML::Feed;
use DateTime::Format::W3CDTF;
use Class::Accessor::Lite (new => 1);
sub get {
my $self = shift;
my $url = shift;
$self->{ua} ||= LWP::UserAgent->new;
my $res = $self->{ua}->get($url);
die unless ($res->is_success);
my $data = decode_json($res->content);
die if (exists $data->{error});
$data;
}
sub make_feed {
my $self = shift;
$self->{feed} = XML::Feed->new($self->{feedtype});
my $data = $self->get('https://note.mu/api/v1/users?urlname=' . $self->{username});
$self->{feed}->title($data->{data}->{nickname});
$self->{feed}->link('https://note.mu/' . $self->{username});
$self->{feed}->description($data->{data}->{profile});
$self;
}
sub get_notes {
my $self = shift;
my $data = $self->get('https://note.mu/api/v1/notes?urlname=' . $self->{username});
for my $note (@{$data->{data}->{notes}}) {
my $title; my $body;
if ($note->{type} eq 'TalkNote') {
if (length($note->{body}) > 20) {
$title = substr($note->{body}, 0, 20) . '...';
} else {
$title = $note->{body};
}
$body = '<p>' . $note->{body} . '</p>';
} elsif ($note->{type} eq 'TextNote') {
$title = $note->{name};
$body = $note->{body};
} elsif ($note->{type} eq 'ImageNote') {
$title = $note->{name};
$body = '<div>';
for my $pic (@{$note->{pictures}}) {
$body .= '<div><p>' . ($pic->{caption} // '') .
'</p><div><img src="' . $pic->{thumbnail_url} .
'"></div></div>';
}
$body .= '</div>';
} elsif ($note->{type} eq 'MovieNote') {
$title = $note->{name};
$note->{external_url} =~ m!\Ahttps://www\.youtube\.com/embed/(.*)\z!;
my $vid = $1;
$body = '<div><a href="' . $note->{external_url} .
'"><img src="http://img.youtube.com/vi/' .
$vid . '/0.jpg"></a></div>';
}
my $e = XML::Feed::Entry->new($self->{feedtype});
$e->title($title);
$e->link('https://note.mu/' . $self->{username} . '/n/' . $note->{key});
$e->content($body);
$e->issued(DateTime::Format::W3CDTF->parse_datetime($note->{publish_at}));
$self->{feed}->add_entry($e);
}
$self;
}
sub as_xml {
$_[0]->{feed}->as_xml;
}
}
if ($0 eq __FILE__) {
if ($#ARGV == 0) {
my $notemu = NoteMu2Feed->new(username => $ARGV[0], feedtype => 'Atom');
print $notemu->make_feed->get_notes->as_xml;
} else {
say "usage: " . basename($0) . " <username>";
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment