Changeset 1016
- Timestamp:
- 06/25/06 04:07:37
- Files:
-
- branches/feature-server/plagger/assets/PlaggerLDR/hackldrapi.user.js (modified) (1 diff)
- branches/feature-server/plagger/assets/plugins/Store-DBIC/plagger.sqlite.sql (modified) (2 diffs)
- branches/feature-server/plagger/lib/Plagger/Schema/SQLite/Feed.pm (modified) (2 diffs)
- branches/feature-server/plagger/lib/Plagger/Schema/SQLite/Folder.pm (added)
- branches/feature-server/plagger/lib/PlaggerLDR/Controller/API.pm (modified) (2 diffs)
- branches/feature-server/plagger/lib/PlaggerLDR/Controller/API/Feed.pm (modified) (3 diffs)
- branches/feature-server/plagger/lib/PlaggerLDR/Controller/API/Folder.pm (added)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/feature-server/plagger/assets/PlaggerLDR/hackldrapi.user.js
r714 r1016 168 168 onload = function() {}; 169 169 } 170 newap = this.ap.replace(/http:\/\/reader.livedoor.com\/api\//, "/api/"); 171 this.ap = newap; 170 172 GM_xmlhttpRequest({ 171 173 method: 'POST', branches/feature-server/plagger/assets/plugins/Store-DBIC/plagger.sqlite.sql
r1013 r1016 1 1 CREATE TABLE feed ( 2 2 id INTEGER NOT NULL PRIMARY KEY, 3 folder INTEGER, 3 4 link TEXT, 4 5 url TEXT, … … 54 55 ); 55 56 CREATE INDEX feed_tag_name ON feed_tag (name); 57 58 CREATE TABLE folder ( 59 id INTEGER NOT NULL PRIMARY KEY, 60 title TEXT 61 ); branches/feature-server/plagger/lib/Plagger/Schema/SQLite/Feed.pm
r743 r1016 9 9 10 10 __PACKAGE__->add_columns( 11 qw/id link url title image description language author updated type rate/11 qw/id folder link url title image description language author updated type rate/ 12 12 ); 13 13 __PACKAGE__->set_primary_key('id'); … … 17 17 __PACKAGE__->has_many( tags => 'Plagger::Schema::SQLite::FeedTag', 'feed' ); 18 18 __PACKAGE__->has_many( metas => 'Plagger::Schema::SQLite::FeedMeta', 'feed' ); 19 20 __PACKAGE__->belongs_to( folder => 'Plagger::Schema::SQLite::Folder' ); 19 21 20 22 __PACKAGE__->inflate_column( branches/feature-server/plagger/lib/PlaggerLDR/Controller/API.pm
r1015 r1016 30 30 subscribe_id => $feed->id, 31 31 unread_count => eval { $feed->get_column('count(*)') } || 0, 32 folder => eval { ($feed->tags)[0]->name } ||'',32 folder => $feed->folder ? $feed->folder->title : '', 33 33 tags => [], # TODO 34 34 rate => $feed->rate, … … 106 106 } 107 107 108 sub folders : Local { 109 my($self, $c) = @_; 110 my $folders = $c->model('DBIC')->resultset('Folder')->search; 111 112 my %name2id; 113 my @names; 114 for my $folder ( $folders->all ) { 115 my ($id, $title) = ($folder->id, $folder->title); 116 $name2id{$title} = "$id"; 117 push(@names, $title); 118 } 119 120 $c->stash->{json} = { 121 name2id => \%name2id, 122 names => \@names, 123 }; 124 } 108 125 109 126 1; branches/feature-server/plagger/lib/PlaggerLDR/Controller/API/Feed.pm
r1015 r1016 1 package PlaggerLDR::Controller::API ;1 package PlaggerLDR::Controller::API::Feed; 2 2 3 3 use strict; … … 5 5 use base 'Catalyst::Controller'; 6 6 7 sub set_rate : Path('feed/set_rate') { 7 use Feed::Find; 8 use URI::Fetch; 9 use Encode (); 10 11 12 # from Plagger::Util::decode_content 13 our $Detector; 14 BEGIN { 15 if ( eval { require Encode::Detect::Detector; 1 } ) { 16 $Detector = sub { Encode::Detect::Detector::detect($_[0]) }; 17 } else { 18 require Encode::Guess; 19 $Detector = sub { 20 my @guess = qw(utf-8 euc-jp shift_jis); # xxx japanese only? 21 eval { Encode::Guess::guess_encoding($_[0], @guess)->name }; 22 }; 23 } 24 } 25 26 sub _get_data_from_feed : Private { 27 my ( $self, $c, $feed ) = @_; 28 29 my $res = URI::Fetch->fetch( $feed ) or return; 30 my $content = $res->content; 31 $content =~ s/[\r\n]//g; 32 33 my $charset; 34 35 # 1) if it is HTTP response, get charset from HTTP Content-Type header 36 if ($res) { 37 $charset = ($res->content_type =~ /charset=([\w\-]+)/)[0]; 38 } 39 40 # 2) if there's not, try XML encoding 41 $charset ||= ( $content =~ /<\?xml version="1.0" encoding="([\w\-]+)"\?>/ )[0]; 42 43 # 3) if there's not, try META tag 44 $charset ||= ( $content =~ m!<meta http-equiv="Content-Type" content=".*charset=([\w\-]+)"!i )[0]; 45 46 # 4) if there's not still, try Detector/Guess 47 $charset ||= $Detector->($content); 48 49 # 5) falls back to UTF-8 50 $charset ||= 'utf-8'; 51 52 my $decoded = eval { Encode::decode($charset, $content) }; 53 if ($@ && $@ =~ /Unknown encoding/) { 54 $charset = $Detector->($content) || 'utf-8'; 55 $decoded = Encode::decode($charset, $content); 56 } 57 58 my ($title) = ($decoded =~ m!<title>(.*?)</title>!); 59 my ($link) = ($decoded =~ m!<link>(.*?)</link>!); 60 return { 61 title => $title || "(no-title)", 62 link => $link || $feed, 63 }; 64 } 65 66 sub discover : Local { 67 my ( $self, $c ) = @_; 68 my $url = $c->req->param('url'); 69 70 my @feeds = Feed::Find->find( $url ); 71 my @ret; 72 foreach my $feed ( @feeds ) { 73 my $data = $c->forward("_get_data_from_feed", [ $feed ]); 74 my $title = $data->{title}; 75 push @ret, { 76 link => $url, 77 title => $title, 78 feedlink => $feed, 79 subscribers_count => 0, 80 }; 81 } 82 unless ( scalar(@feeds) ) { 83 my $data = $c->forward("_get_data_from_feed", [ $url ]); 84 push @ret, { 85 link => $url, 86 title => "(customfeed) " . $data->{title}, 87 feedlink => $url, 88 subscribers_count => 0, 89 }; 90 } 91 $c->stash->{json} = \@ret; 92 } 93 94 sub move : Local { 95 my ( $self, $c ) = @_; 96 97 my $folderid = $c->model('DBIC')->resultset('Folder')->search({ 98 title => $c->req->param('to'), 99 }); 100 $folderid = $folderid ? $folderid->first : 0; 101 102 my @ids = split(/,/, $c->req->param('subscribe_id')); 103 foreach my $id (@ids) { 104 my $feed = $c->model('DBIC')->resultset('Feed')->find( $id ); 105 $feed->folder( $folderid ); 106 $feed->update; 107 } 108 109 $c->stash->{json} = { 110 ErrorCode => 0, 111 isSuccess => 1, 112 }; 113 } 114 115 sub set_notify : Local { 116 my ( $self, $c ) = @_; 117 } 118 119 sub set_rate : Local { 8 120 my ( $self, $c ) = @_; 9 121 … … 19 131 } 20 132 133 sub subscribe : Local { 134 my ( $self, $c ) = @_; 135 my $feed = $c->req->param('feedlink'); 136 137 my $data = $c->forward("_get_data_from_feed", [ $feed ]); 138 my $rel = $c->model('DBIC')->resultset('Feed')->find_or_create({ 139 link => $data->{link}, 140 url => $feed, 141 title => $data->{title}, 142 description => $data->{title}, 143 updated => 0, 144 }); 145 146 $c->stash->{json} = { 147 subscribe_id => $rel->id, 148 ErrorCode => 0, 149 isSuccess => 1, 150 }; 151 } 152 153 sub unsubscribe : Local { 154 my ( $self, $c ) = @_; 155 my $id = $c->req->param('subscribe_id'); 156 157 my $rel = $c->model('DBIC')->resultset('Feed')->find( $id )->delete; 158 159 $c->stash->{json} = { 160 ErrorCode => 0, 161 isSuccess => 1, 162 }; 163 } 164 21 165 1;
