Changeset 1016

Show
Ignore:
Timestamp:
06/25/06 04:07:37
Author:
woremacx
Message:
  • add folder feature
  • subscribe to feed by using ADD button
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/feature-server/plagger/assets/PlaggerLDR/hackldrapi.user.js

    r714 r1016  
    168168                                onload = function() {}; 
    169169                        } 
     170                        newap = this.ap.replace(/http:\/\/reader.livedoor.com\/api\//, "/api/");  
     171                        this.ap = newap; 
    170172                        GM_xmlhttpRequest({ 
    171173                                method: 'POST', 
  • branches/feature-server/plagger/assets/plugins/Store-DBIC/plagger.sqlite.sql

    r1013 r1016  
    11CREATE TABLE feed ( 
    22       id INTEGER NOT NULL PRIMARY KEY, 
     3       folder INTEGER, 
    34       link TEXT, 
    45       url TEXT, 
     
    5455); 
    5556CREATE INDEX feed_tag_name ON feed_tag (name); 
     57 
     58CREATE 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  
    99 
    1010__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/ 
    1212); 
    1313__PACKAGE__->set_primary_key('id'); 
     
    1717__PACKAGE__->has_many( tags  => 'Plagger::Schema::SQLite::FeedTag',  'feed' ); 
    1818__PACKAGE__->has_many( metas => 'Plagger::Schema::SQLite::FeedMeta', 'feed' ); 
     19 
     20__PACKAGE__->belongs_to( folder => 'Plagger::Schema::SQLite::Folder' ); 
    1921 
    2022__PACKAGE__->inflate_column( 
  • branches/feature-server/plagger/lib/PlaggerLDR/Controller/API.pm

    r1015 r1016  
    3030            subscribe_id => $feed->id, 
    3131            unread_count => eval { $feed->get_column('count(*)') } || 0, 
    32             folder => eval { ($feed->tags)[0]->name } || '', 
     32            folder => $feed->folder ? $feed->folder->title : '', 
    3333            tags => [], # TODO 
    3434            rate => $feed->rate, 
     
    106106} 
    107107 
     108sub 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} 
    108125 
    1091261; 
  • branches/feature-server/plagger/lib/PlaggerLDR/Controller/API/Feed.pm

    r1015 r1016  
    1 package PlaggerLDR::Controller::API
     1package PlaggerLDR::Controller::API::Feed
    22 
    33use strict; 
     
    55use base 'Catalyst::Controller'; 
    66 
    7 sub set_rate : Path('feed/set_rate') { 
     7use Feed::Find; 
     8use URI::Fetch; 
     9use Encode (); 
     10 
     11 
     12# from Plagger::Util::decode_content 
     13our $Detector; 
     14BEGIN { 
     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 
     26sub _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 
     66sub 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 
     94sub 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 
     115sub set_notify : Local { 
     116    my ( $self, $c ) = @_; 
     117
     118 
     119sub set_rate : Local { 
    8120    my ( $self, $c ) = @_; 
    9121 
     
    19131} 
    20132 
     133sub 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 
     153sub 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 
    211651;