Source code for Tribler.Core.Modules.restapi.channels.channels_rss_endpoint

from twisted.web import http
from twisted.web.server import NOT_DONE_YET

from Tribler.Core.Modules.restapi.channels.base_channels_endpoint import BaseChannelsEndpoint
import Tribler.Core.Utilities.json_util as json


[docs]class BaseChannelsRssFeedsEndpoint(BaseChannelsEndpoint): def __init__(self, session, cid): BaseChannelsEndpoint.__init__(self, session) self.cid = cid
[docs] def get_my_channel_obj_or_error(self, request): """ Returns a tuple of (channel_obj, error). Callers of this method should check whether the channel_obj is None and if so, return the error. """ channel_info = self.get_channel_from_db(self.cid) if channel_info is None: return None, BaseChannelsRssFeedsEndpoint.return_404(request) if channel_info[0] != self.channel_db_handler.getMyChannelId(): return None, BaseChannelsRssFeedsEndpoint.return_401(request) channel_obj = self.get_my_channel_object() if channel_obj is None: return None, BaseChannelsRssFeedsEndpoint.return_404(request) return channel_obj, None
[docs]class ChannelsRssFeedsEndpoint(BaseChannelsRssFeedsEndpoint): """ This class is responsible for handling requests regarding rss feeds in a channel. """ def getChild(self, path, request): return ChannelModifyRssFeedEndpoint(self.session, self.cid, path)
[docs] def render_GET(self, request): """ .. http:get:: /channels/discovered/(string: channelid)/rssfeeds Returns the RSS feeds in your channel. .. sourcecode:: none curl -X GET http://localhost:8085/channels/discovered/abcd/rssfeeds **Example response**: .. sourcecode:: javascript { "rssfeeds": [{ "url": "http://rssprovider.com/feed.xml", }, ...] } """ channel_obj, error = self.get_my_channel_obj_or_error(request) if channel_obj is None: return error request.setHeader('Content-Type', 'text/json') feeds_list = [{'url': rss_item} for rss_item in channel_obj.get_rss_feed_url_list()] return json.dumps({"rssfeeds": feeds_list})
[docs]class ChannelsRecheckFeedsEndpoint(BaseChannelsRssFeedsEndpoint): """ This class is responsible for handling requests regarding refreshing rss feeds in your channel. """
[docs] def render_POST(self, request): """ .. http:post:: /channels/discovered/(string: channelid)/recheckfeeds Rechecks all rss feeds in your channel. Returns error 404 if you channel does not exist. **Example request**: .. sourcecode:: none curl -X POST http://localhost:8085/channels/discovered/recheckrssfeeds **Example response**: .. sourcecode:: javascript { "rechecked": True } :statuscode 404: if you have not created a channel. """ channel_obj, error = self.get_my_channel_obj_or_error(request) if channel_obj is None: return error def on_refreshed(_): request.write(json.dumps({"rechecked": True})) request.finish() def on_refresh_error(failure): self._logger.exception(failure.value) request.write(BaseChannelsEndpoint.return_500(self, request, failure.value)) request.finish() channel_obj.refresh_all_feeds().addCallbacks(on_refreshed, on_refresh_error) return NOT_DONE_YET
[docs]class ChannelModifyRssFeedEndpoint(BaseChannelsRssFeedsEndpoint): """ This class is responsible for methods that modify the list of RSS feed URLs (adding/removing feeds). """ def __init__(self, session, cid, feed_url): BaseChannelsRssFeedsEndpoint.__init__(self, session, cid) self.feed_url = feed_url
[docs] def render_PUT(self, request): """ .. http:put:: /channels/discovered/(string: channelid)/rssfeeds/http%3A%2F%2Ftest.com%2Frss.xml Add a RSS feed to your channel. Returns error 409 if the supplied RSS feed already exists. Note that the rss feed url should be URL-encoded. **Example request**: .. sourcecode:: none curl -X PUT http://localhost:8085/channels/discovered/abcd/rssfeeds/http%3A%2F%2Ftest.com%2Frss.xml **Example response**: .. sourcecode:: javascript { "added": True } :statuscode 409: (conflict) if the specified RSS URL is already present in your feeds. """ channel_obj, error = self.get_my_channel_obj_or_error(request) if channel_obj is None: return error if self.feed_url in channel_obj.get_rss_feed_url_list(): request.setResponseCode(http.CONFLICT) return json.dumps({"error": "this rss feed already exists"}) channel_obj.create_rss_feed(self.feed_url) return json.dumps({"added": True})
[docs] def render_DELETE(self, request): """ .. http:delete:: /channels/discovered/(string: channelid)/rssfeeds/http%3A%2F%2Ftest.com%2Frss.xml Delete a RSS feed from your channel. Returns error 404 if the RSS feed that is being removed does not exist. Note that the rss feed url should be URL-encoded. **Example request**: .. sourcecode:: none curl -X DELETE http://localhost:8085/channels/discovered/abcd/rssfeeds/http%3A%2F%2Ftest.com%2Frss.xml **Example response**: .. sourcecode:: javascript { "removed": True } :statuscode 404: if the specified RSS URL is not in your feed list. """ channel_obj, error = self.get_my_channel_obj_or_error(request) if channel_obj is None: return error if self.feed_url not in channel_obj.get_rss_feed_url_list(): return ChannelModifyRssFeedEndpoint.return_404(request, message="this url is not added to your RSS feeds") channel_obj.remove_rss_feed(self.feed_url) return json.dumps({"removed": True})