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)); }
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; }
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(); }