public function confirm()
 {
     if ($this->isPOST()) {
         return $this->setAction('subscribe');
     }
     $feeds = array();
     $url = $this->params('feedlink');
     $feedlinks = FeedUtils::getFeedlinks($url);
     foreach ($feedlinks as $feedlink) {
         $feed = $this->Feed->findByFeedlink($feedlink);
         if ($feed) {
             $sub = $this->member->subscribed($feed['Feed']['id']);
             if ($sub) {
                 $feed['subscribe_id'] = $sub['Subscription']['id'];
             }
             $feeds[] = $feed;
             continue;
         }
         $feeddata = FeedUtils::getFeed($feedlink);
         if (!$feeddata) {
             continue;
         }
         $feeds[] = array('Feed' => array('id' => 0, 'subscribers_count' => 0, 'feedlink' => $feedlink, 'link' => $feeddata->get_permalink(), 'title' => $feeddata->get_title()));
     }
     if (empty($feeds)) {
         $this->Flash->notice('please check URL');
         $this->redirect('/subscribe/index');
     }
     $this->set('feeds', $feeds);
     $this->set('feedlink', $feedlink);
 }
 public function discover()
 {
     $url = $this->params('url');
     $feeds = array();
     $feedlinks = FeedUtils::getFeedlinks($url);
     if (!$feedlinks) {
         $this->renderJSON(json_encode($feeds));
         return;
     }
     foreach ($feedlinks as $feedlink) {
         $feed = $this->Feed->findByFeedlink($feedlink);
         if ($feed) {
             $result = array('subscribers_count' => $feed['Feed']['subscribers_count'], 'feedlink' => $feed['Feed']['feedlink'], 'link' => $feed['Feed']['link'], 'title' => $feed['Feed']['title']);
             $conditions = array();
             $conditions[] = es('Subscription.member_id = %s', $this->member->id);
             $conditions[] = es('Subscription.feed_id = %s', $feed['Feed']['id']);
             $sub = $this->Subscription->find($conditions);
             if ($sub) {
                 $result['subscribe_id'] = $sub['Subscription']['id'];
             }
             $feeds[] = $result;
         } else {
             $feeddata = FeedUtils::getFeed($feedlink);
             if (!$feeddata) {
                 continue;
             }
             $feeds[] = array('subscribers_count' => 0, 'feedlink' => $feedlink, 'link' => $feeddata->get_permalink(), 'title' => $feeddata->get_title());
         }
     }
     $this->renderJSON(json_encode($feeds));
 }
Exemple #3
0
 public function crawl($data)
 {
     $result = array('new_items' => 0, 'updated_items' => 0, 'error' => null);
     $feed = FeedUtils::getFeed($data['Feed']['feedlink']);
     if ($feed->error()) {
         $result['message'] = $feed->error();
         $result['error'] = 1;
         return $result;
     }
     $items = $feed->get_items();
     if (count($items) > self::ITEMS_LIMIT) {
         $this->log("too large feed: {$data['Feed']['feedlink']}" . '(' . count($items) . ')', LOG_INFO);
         array_splice($items, self::ITEMS_LIMIT);
     }
     // update items
     foreach ($items as $k => $item) {
         $r = array('Item' => array('feed_id' => $data['Feed']['id'], 'link' => $item->get_link(), 'title' => $item->get_title(), 'body' => $item->get_content(), 'author' => $item->get_author(), 'category' => $item->get_category(), 'enclosure' => null, 'enclosure_type' => null, 'digest' => $this->itemDigest($item->get_title(), $item->get_content()), 'stored_on' => date('Y-m-d H:i:s'), 'modified_on' => $item->get_date('Y-m-d H:i:s')));
         $items[$k] = $r;
     }
     foreach ($items as $k => $item) {
         $conditions = array();
         $conditions[] = es('Feed.id = %s', $data['Feed']['id']);
         $conditions[] = es('Item.title = %s', $item['Item']['title']);
         $conditions[] = es('Item.link = %s', $item['Item']['link']);
         $r = $this->Item->find($conditions);
         if ($r) {
             unset($items[$k]);
         }
     }
     foreach ($items as $k => $item) {
         $conditions = array();
         $conditions[] = es('Feed.id = %s', $data['Feed']['id']);
         $conditions[] = es('Item.link = %s', $item['Item']['link']);
         $old_item = $this->Item->find($conditions);
         if ($old_item) {
             $same_title = $this->almostSame($old_item['Item']['title'], $item['Item']['title']);
             $same_body = $this->almostSame($old_item['Item']['body'], $item['Item']['body']);
             if (!$same_title || !$same_body) {
                 $result['updated_items']++;
             }
             $item['Item'] = array_merge($old_item['Item'], $item['Item']);
             $this->Item->set($item);
             $this->Item->save();
         } else {
             $result['new_items']++;
             $this->Item->create($item);
             $this->Item->save();
         }
     }
     // update subscriptions
     if ($result['new_items'] + $result['updated_items'] > 0) {
         $data['Feed']['modified_on'] = date('Y-m-d H:i:s');
         $conditions = array();
         $conditions[] = es('Subscription.feed_id = %s', $data['Feed']['id']);
         $this->Subscription->updateAll(array('has_unread' => true), $conditions);
     }
     // update feed
     $new_feed = array('title' => $feed->get_title(), 'link' => $feed->get_link(), 'description' => $feed->get_description(), 'image' => null);
     $data['Feed'] = array_merge($data['Feed'], $new_feed);
     $this->Feed->set($data['Feed']);
     $this->Feed->save();
     $result['message'] = "{$result['new_items']} new items, {$result['updated_items']} updated items";
     return $result;
 }
Exemple #4
0
 public function subscribeFeed($feedlink, $options = array())
 {
     if ($this->countSubscriptions() >= SUBSCRUBE_LIMIT) {
         $msg = sprintf('SUBSCRIBE LIMIT: %s(%s) %s', $this->data['Member']['username'], $this->id, $feedlink);
         CakeLog::write(LOG_WARNING, $msg);
         return false;
     }
     $Feed = new Feed();
     $feed = $Feed->findByFeedlink($feedlink);
     if ($feed) {
         // subscribed..
         $Feed->set($feed);
     } elseif (isset($options['quick'])) {
         $data = array('feedlink' => $feedlink, 'link' => $feedlink, 'title' => $options['title'], 'description' => '');
         $Feed->set($data);
         $Feed->save();
         $Feed->createCrawlStatus();
     } else {
         $feeddata = FeedUtils::getFeed($feedlink);
         if (!$feeddata) {
             return false;
         }
         $data = array('subscribers_count' => 0, 'feedlink' => $feedlink, 'link' => $feeddata->get_permalink() ? $feeddata->get_permalink() : '', 'title' => $feeddata->get_title() ? $feeddata->get_title() : '');
         $Feed->set($data);
         $Feed->save();
         $Feed->createCrawlStatus();
     }
     unset($options['quick']);
     unset($options['title']);
     $conditions = array();
     $conditions[] = es('Subscription.member_id = %s', $this->id);
     $conditions[] = es('Subscription.feed_id = %s', $Feed->id);
     $sub = $this->Subscription->find($conditions);
     if ($sub) {
         return $sub;
     }
     $data = array('member_id' => $this->id, 'feed_id' => $Feed->id, 'has_unread' => true);
     $data = array_merge($data, $options);
     $this->Subscription->create($data);
     return $this->Subscription->save();
 }