blib/lib/WWW/Google/Notebook.pm | |||
---|---|---|---|
Criterion | Covered | Total | % |
statement | 30 | 125 | 24.0 |
branch | 0 | 24 | 0.0 |
condition | 0 | 6 | 0.0 |
subroutine | 10 | 28 | 35.7 |
pod | 5 | 5 | 100.0 |
total | 45 | 188 | 23.9 |
line | stmt | bran | cond | sub | pod | time | code |
---|---|---|---|---|---|---|---|
1 | package WWW::Google::Notebook; | ||||||
2 | 2 | 2 | 165440 | use strict; | |||
2 | 5 | ||||||
2 | 1726 | ||||||
3 | 2 | 2 | 16 | use warnings; | |||
2 | 5 | ||||||
2 | 87 | ||||||
4 | 2 | 2 | 10 | use base qw(Class::Accessor::Fast); | |||
2 | 9 | ||||||
2 | 5353 | ||||||
5 | |||||||
6 | 2 | 2 | 8925 | use Carp; | |||
2 | 6 | ||||||
2 | 225 | ||||||
7 | 2 | 2 | 5273 | use URI; | |||
2 | 32016 | ||||||
2 | 77 | ||||||
8 | 2 | 2 | 22 | use URI::Escape (); | |||
2 | 4 | ||||||
2 | 42 | ||||||
9 | 2 | 2 | 41438 | use LWP::UserAgent; | |||
2 | 185212 | ||||||
2 | 97 | ||||||
10 | 2 | 2 | 1977 | use WWW::Google::Notebook::Note; | |||
2 | 6 | ||||||
2 | 18 | ||||||
11 | 2 | 2 | 1473 | use WWW::Google::Notebook::Notebook; | |||
2 | 5 | ||||||
2 | 15 | ||||||
12 | |||||||
13 | our $VERSION = '0.01'; | ||||||
14 | |||||||
15 | __PACKAGE__->mk_accessors(qw/username password/); | ||||||
16 | |||||||
17 | my $BaseURI = 'http://www.google.com/notebook/'; | ||||||
18 | |||||||
19 | sub new { | ||||||
20 | 0 | 0 | 1 | my ($class, %param) = @_; | |||
21 | 0 | 0 | bless { | ||||
0 | |||||||
22 | username => $param{username} || '', | ||||||
23 | password => $param{password} || '', | ||||||
24 | }, $class; | ||||||
25 | } | ||||||
26 | |||||||
27 | sub ua { | ||||||
28 | 0 | 0 | 1 | my $self = shift; | |||
29 | 0 | 0 | if (@_) { | ||||
30 | 0 | $self->{ua} = shift; | |||||
31 | } else { | ||||||
32 | 0 | 0 | $self->{ua} and return $self->{ua}; | ||||
33 | 0 | $self->{ua} = LWP::UserAgent->new; | |||||
34 | 0 | $self->{ua}->agent(__PACKAGE__."/$VERSION"); | |||||
35 | } | ||||||
36 | 0 | $self->{ua}; | |||||
37 | } | ||||||
38 | |||||||
39 | sub login { | ||||||
40 | 0 | 0 | 1 | my ($self, %param) = @_; | |||
41 | 0 | my $uri = URI->new('https://www.google.com/accounts/ServiceLoginAuth'); | |||||
42 | 0 | $uri->query_form( | |||||
43 | Email => $self->username, | ||||||
44 | Passwd => $self->password, | ||||||
45 | service => 'notebook', | ||||||
46 | continue => $BaseURI, | ||||||
47 | source => __PACKAGE__."/$VERSION", | ||||||
48 | ); | ||||||
49 | 0 | my $res = $self->ua->post($uri); | |||||
50 | 0 | 0 | croak($res->status_line) if $res->is_error; | ||||
51 | 0 | my $cookie = $res->header('Set-Cookie'); | |||||
52 | 0 | $self->ua->default_header(Cookie => $cookie); | |||||
53 | 0 | $res = $self->ua->post($BaseURI.'token?&pv=2'); | |||||
54 | 0 | 0 | croak($res->status_line) if $res->is_error; | ||||
55 | 0 | my ($token) = $res->content =~ m!/\*(.*)\*/!; | |||||
56 | 0 | $self->{_token} = $token; | |||||
57 | 0 | return 1; | |||||
58 | } | ||||||
59 | |||||||
60 | sub notebooks { | ||||||
61 | 0 | 0 | 1 | my $self = shift; | |||
62 | 0 | my $uri = sprintf( | |||||
63 | $BaseURI.'read?pv=2&ident=fp&tok=%s&cmd=u&zx=%d', | ||||||
64 | $self->{_token}, | ||||||
65 | time, | ||||||
66 | ); | ||||||
67 | 0 | my $res = $self->ua->get($uri); | |||||
68 | 0 | 0 | croak($res->status_line) if $res->is_error; | ||||
69 | 0 | my $notebooks = $self->_parse($res->content); | |||||
70 | 0 | $notebooks; | |||||
71 | } | ||||||
72 | |||||||
73 | sub add_notebook { | ||||||
74 | 0 | 0 | 1 | my ($self, $title) = @_; | |||
75 | 0 | my $uri = sprintf( | |||||
76 | $BaseURI.'write?pv=2&ident=fp&tok=%s&cmd=b&contents=%s', | ||||||
77 | $self->{_token}, | ||||||
78 | _uri_escape($title), | ||||||
79 | ); | ||||||
80 | 0 | my $res = $self->ua->post($uri); | |||||
81 | 0 | 0 | croak($res->status_line) if $res->is_error; | ||||
82 | 0 | my $notebook = $self->_parse($res->content); | |||||
83 | 0 | $notebook; | |||||
84 | } | ||||||
85 | |||||||
86 | sub _delete_notebook { | ||||||
87 | 0 | 0 | my ($self, $notebook) = @_; | ||||
88 | 0 | my $uri = sprintf( | |||||
89 | $BaseURI.'write?pv=2&ident=fp&tok=%s&cmd=trshn&nbid=%s', | ||||||
90 | $self->{_token}, | ||||||
91 | $notebook->id, | ||||||
92 | ); | ||||||
93 | 0 | my $res = $self->ua->post($uri); | |||||
94 | 0 | 0 | croak($res->status_line) if $res->is_error; | ||||
95 | 0 | undef %$notebook; | |||||
96 | 0 | bless $notebook, 'WWW::Google::Notebook::Object::Has::Been::Deleted'; | |||||
97 | 0 | 1; | |||||
98 | } | ||||||
99 | |||||||
100 | sub _update_notebook { | ||||||
101 | 0 | 0 | my ($self, $notebook) = @_; | ||||
102 | 0 | my $uri = sprintf( | |||||
103 | $BaseURI.'write?pv=2&ident=fp&tok=%s&cmd=b&nbid=%s&contents=%s', | ||||||
104 | $self->{_token}, | ||||||
105 | $notebook->id, | ||||||
106 | _uri_escape($notebook->title), | ||||||
107 | ); | ||||||
108 | 0 | my $res = $self->ua->post($uri); | |||||
109 | 0 | 0 | croak($res->status_line) if $res->is_error; | ||||
110 | 0 | $notebook = $self->_parse($res->content); | |||||
111 | 0 | 1; | |||||
112 | } | ||||||
113 | |||||||
114 | sub _notes { | ||||||
115 | 0 | 0 | my ($self, $notebook) = @_; | ||||
116 | 0 | my $uri = sprintf( | |||||
117 | $BaseURI.'read?pv=2&ident=fp&tok=%s&cmd=b&nbid=%s&zx=%d', | ||||||
118 | $self->{_token}, | ||||||
119 | $notebook->id, | ||||||
120 | time, | ||||||
121 | ); | ||||||
122 | 0 | my $res = $self->ua->get($uri); | |||||
123 | 0 | 0 | croak($res->status_line) if $res->is_error; | ||||
124 | 0 | print $res->content; | |||||
125 | 0 | $notebook = $self->_parse($res->content); | |||||
126 | 0 | my @notes; | |||||
127 | 0 | for my $note (@{$notebook->{_notes}}) { | |||||
0 | |||||||
128 | 0 | $note->notebook($notebook); | |||||
129 | 0 | push @notes, $note; | |||||
130 | } | ||||||
131 | 0 | undef $notebook->{_notes}; | |||||
132 | 0 | \@notes; | |||||
133 | } | ||||||
134 | |||||||
135 | sub _add_note { | ||||||
136 | 0 | 0 | my ($self, $notebook, $content) = @_; | ||||
137 | 0 | $content =~ s/\r?\n/ /g; |
|||||
138 | 0 | my $uri = sprintf( | |||||
139 | $BaseURI.'write?pv=2&ident=fp&tok=%s&cmd=n&nbid=%s&contents=%s&qurl=null&nmeth=fp', | ||||||
140 | $self->{_token}, | ||||||
141 | $notebook->id, | ||||||
142 | _uri_escape($content), | ||||||
143 | ); | ||||||
144 | 0 | my $res = $self->ua->post($uri); | |||||
145 | 0 | 0 | croak($res->status_line) if $res->is_error; | ||||
146 | 0 | my $note = $self->_parse($res->content); | |||||
147 | 0 | $note->notebook($notebook); | |||||
148 | 0 | $note; | |||||
149 | } | ||||||
150 | |||||||
151 | sub _delete_note { | ||||||
152 | 0 | 0 | my ($self, $note) = @_; | ||||
153 | 0 | my $uri = sprintf( | |||||
154 | $BaseURI.'write?pv=2&ident=fp&tok=%s&cmd=trsh&nid=%s&nbid=%s', | ||||||
155 | $self->{_token}, | ||||||
156 | $note->id, | ||||||
157 | $note->notebook->id, | ||||||
158 | ); | ||||||
159 | 0 | my $res = $self->ua->post($uri); | |||||
160 | 0 | 0 | croak($res->status_line) if $res->is_error; | ||||
161 | 0 | undef %$note; | |||||
162 | 0 | bless $note, 'WWW::Google::Notebook::Object::Has::Been::Deleted'; | |||||
163 | 0 | 1; | |||||
164 | } | ||||||
165 | |||||||
166 | sub _update_note { | ||||||
167 | 0 | 0 | my ($self, $note) = @_; | ||||
168 | 0 | my $uri = sprintf( | |||||
169 | $BaseURI.'write?pv=2&ident=fp&tok=%s&cmd=n&nbid=%s&nid=%s&contents=%s&qurl=null', | ||||||
170 | $self->{_token}, | ||||||
171 | $note->notebook->id, | ||||||
172 | $note->id, | ||||||
173 | _uri_escape($note->content), | ||||||
174 | ); | ||||||
175 | 0 | my $res = $self->ua->post($uri); | |||||
176 | 0 | 0 | croak($res->status_line) if $res->is_error; | ||||
177 | 0 | $note = $self->_parse($res->content); | |||||
178 | 0 | 1; | |||||
179 | } | ||||||
180 | |||||||
181 | sub _parse { | ||||||
182 | 0 | 0 | my ($self, $json) = @_; | ||||
183 | 2 | 2 | 4216 | no warnings 'once'; | |||
2 | 5 | ||||||
2 | 976 | ||||||
184 | 0 | 0 | local *F = sub {}; | ||||
0 | |||||||
185 | 0 | 0 | local *U = sub { $_[0] }; | ||||
0 | |||||||
186 | local *B = sub { | ||||||
187 | 0 | 0 | 0 | WWW::Google::Notebook::Notebook->new({ | |||
188 | id => $_[0], | ||||||
189 | title => $_[1], | ||||||
190 | api => $self, | ||||||
191 | _notes => $_[11]->[0] || [], | ||||||
192 | }); | ||||||
193 | 0 | }; | |||||
194 | local *N = sub { | ||||||
195 | 0 | 0 | WWW::Google::Notebook::Note->new({ | ||||
196 | id => $_[0], | ||||||
197 | content => $_[1], | ||||||
198 | created_on => $_[5], | ||||||
199 | }); | ||||||
200 | 0 | }; | |||||
201 | 0 | 0 | local *S = sub { $_[3] }; | ||||
0 | |||||||
202 | 0 | eval $json; | |||||
203 | } | ||||||
204 | |||||||
205 | sub _uri_escape { | ||||||
206 | 0 | 0 | my $val = shift; | ||||
207 | 0 | $val =~ s/\r?\n/ /g; |
|||||
208 | 0 | URI::Escape::uri_escape($val); | |||||
209 | } | ||||||
210 | |||||||
211 | 1; | ||||||
212 | __END__ |