Index: applications/mobileblur/controllers/default.py ================================================================== --- applications/mobileblur/controllers/default.py +++ applications/mobileblur/controllers/default.py @@ -1,19 +1,8 @@ -# -*- coding: utf-8 -*- -# this file is released under public domain and you can use without limitations - from pprint import pprint -newsblur = local_import("newsblur") - -username = "" -password = "" -threshold = 0 -thresholds = ["nt", "ps", "ng"] # indices -1, 0, 1 for negative, neutral, ane positive inhelligence filters - def index(): - newsblur.login(username, password) raw_feeds = newsblur.feeds(flat=True)["feeds"] feeds = {} for feed in raw_feeds.itervalues(): for i in range(threshold, 2): if feed[thresholds[i]] > 0: @@ -20,8 +9,5 @@ feeds[feed["feed_title"]] = feed break pprint(feeds) return dict(feeds=feeds, threshold=threshold) - -def login(): - pass Index: applications/mobileblur/controllers/feeds.py ================================================================== --- applications/mobileblur/controllers/feeds.py +++ applications/mobileblur/controllers/feeds.py @@ -1,15 +1,9 @@ # -*- coding: utf-8 -*- -# this file is released under public domain and you can use without limitations from pprint import pprint -newsblur = local_import("newsblur") - -username = "" -password = "" -threshold = 0 -thresholds = ["nt", "ps", "ng"] # indices -1, 0, 1 for negative, neutral, ane positive inhelligence filters - def view(): - newsblur.login(username, password) - return + stories = newsblur.feed(request.args[0])["stories"] + feeds = newsblur.feeds(flat=True)["feeds"] + feed = [feed for feed in feeds.itervalues() if feed["id"]==int(request.args[0])][0] + return dict(stories=stories, feed=feed) ADDED applications/mobileblur/controllers/stories.py Index: applications/mobileblur/controllers/stories.py ================================================================== --- applications/mobileblur/controllers/stories.py +++ applications/mobileblur/controllers/stories.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- + +from pprint import pprint + +def view(): + stories = newsblur.feed(request.vars["feed_id"])["stories"] + story = [story for story in stories if story["id"]==request.vars["story"]][0] + return dict(story=story) ADDED applications/mobileblur/models/0_helpers.py Index: applications/mobileblur/models/0_helpers.py ================================================================== --- applications/mobileblur/models/0_helpers.py +++ applications/mobileblur/models/0_helpers.py @@ -0,0 +1,9 @@ +newsblur = local_import("newsblur") + +threshold = 0 +thresholds = ["nt", "ps", "ng"] # indices -1, 0, 1 for negative, neutral, and positive intelligence filters + +def login(username="spiffytech"): + user = db(db.users.username==username).select().first() + if user["cookie"] is None: + results = newsblur.login(user["username"], user["password"]) Index: applications/mobileblur/models/db.py ================================================================== --- applications/mobileblur/models/db.py +++ applications/mobileblur/models/db.py @@ -1,7 +1,8 @@ # -*- coding: utf-8 -*- # this file is released under public domain and you can use without limitations +from gluon.custom_import import track_changes; track_changes(True) ######################################################################### ## This scaffolding model makes your app work on Google App Engine too ######################################################################### @@ -40,11 +41,11 @@ mail.settings.server = 'logging' or 'smtp.gmail.com:587' # your SMTP server mail.settings.sender = 'you@gmail.com' # your email mail.settings.login = 'username:password' # your credentials or None auth.settings.hmac_key = '' # before define_tables() -auth.define_tables() # creates all needed tables +auth.define_tables(username=True) # creates all needed tables auth.settings.mailer = mail # for user email verification auth.settings.registration_requires_verification = False auth.settings.registration_requires_approval = False auth.messages.verify_email = 'Click on the link http://'+request.env.http_host+URL('default','user',args=['verify_email'])+'/%(key)s to verify your email' auth.settings.reset_password_requires_verification = True @@ -77,5 +78,12 @@ ## ## >>> db.mytable.insert(myfield='value') ## >>> rows=db(db.mytable.myfield=='value').select(db.mytable.ALL) ## >>> for row in rows: print row.id, row.myfield ######################################################################### + +db.define_table("users", + Field("username"), + Field("password"), + Field("cookie") +) +login() Index: applications/mobileblur/modules/newsblur.py ================================================================== --- applications/mobileblur/modules/newsblur.py +++ applications/mobileblur/modules/newsblur.py @@ -1,378 +1,339 @@ #!/usr/bin/python """newsblur.py - An API wrapper library for newsblur.com""" -import cookielib import simplejson -import urllib -import urllib2 + +import requests __author__ = 'Dananjaya Ramanayake , spiffytech ' __version__ = "0.1" - -# Set up cookie handling so we can auth with the Newsblur API -cj = cookielib.LWPCookieJar() -opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) -urllib2.install_opener(opener) - -nb_url = "http://newsblur.com/" - +nb_url = "http://www.newsblur.com/" +cookies = None + +from gluon import current +print current.db def login(username,password): ''' - Login as an existing user. If a user has no password set, you cannot just send any old password. Required parameters, username and password, must be of string type. - ''' + url = nb_url + 'api/login' - params = urllib.urlencode({'username':username,'password':password}) - results = urllib2.urlopen(url,params).read() - return simplejson.loads(results) + results = requests.post(url, data={"username": username, "password": password}) + global cookies + cookies = results.cookies + return simplejson.loads(results.content) def logout(): ''' - Logout the currently logged in user. - ''' + url = nb_url + 'api/logout' - results = urllib2.urlopen(url).read() - return simplejson.loads(results) + results = requests.get(url, cookies=cookies) + return simplejson.loads(results.content) def signup(username,password,email): ''' - Create a new user. All three required parameters must be of type string. - ''' + url = nb_url + 'api/signup' - params = urllib.urlencode({'signup_username':username,'signup_password':password,'signup_email':email}) - results = urllib2.urlopen(url,params).read() - return simplejson.loads(results) + payload = {'signup_username':username,'signup_password':password,'signup_email':email} + results = requests.post(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def search_feed(address,offset=1): ''' Retrieve information about a feed from its website or RSS address. Parameter address must be of type string while parameter offset must be an integer. Will return a feed. ''' - url = nb_url + 'rss_feeds/search_feed?%s' - params = urllib.urlencode({'address':address,'offset':offset}) - results = urllib2.urlopen(url % params).read() - return simplejson.loads(results) + + url = nb_url + 'rss_feeds/search_feed' + payload = {'address':address,'offset':offset} + results = results.get(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def feeds(include_favicons=True,flat=False): ''' - Retrieve a list of feeds to which a user is actively subscribed. - Includes the 3 unread counts (positive, neutral, negative), as well as optional favicons. - - ''' + Includes the 3 unread counts (positive, neutral, negative), as well as optional favicons. + ''' url = nb_url + 'reader/feeds' - params = urllib.urlencode({'include_favicons':include_favicons,'flat':flat}) -# print url + " " + url % params - results = urllib2.urlopen(url).read() - return simplejson.loads(results) + payload = {'include_favicons':include_favicons,'flat':flat} + results = requests.get(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def favicons(feeds=[1,2,3]): ''' - Retrieve a list of favicons for a list of feeds. Used when combined with /reader/feeds and include_favicons=false, so the feeds request contains far less data. Useful for mobile devices, but requires a second request. + ''' - ''' - url = nb_url + 'reader/favicons?%s' - params = urllib.urlencode({'feeds':feeds}) - results = urllib2.urlopen(url % params).read() - return simplejson.loads(results) + url = nb_url + 'reader/favicons' + payload = {'feeds':feeds} + results = requests.get(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def id(id_no): ''' - Retrieve the original page from a single feed. + ''' - ''' - url = nb_url + 'reader/page/%d' % id_no - results = urllib2.urlopen(url).read() - return simplejson.loads(results) + url = nb_url + 'reader/page/' % id_no + payload = {} + results = requests.get(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def refresh_feeds(): ''' - Up-to-the-second unread counts for each active feed. - Poll for these counts no more than once a minute. - - ''' + Poll for these counts no more than once a minute. + ''' url = nb_url + 'reader/refresh_feeds' - results = urllib2.urlopen(url).read() - return simplejson.loads(results) + results = requests.get(url, cookies=cookies) + return simplejson.loads(results.content) def feeds_trainer(feed_id): ''' - - Retrieves all popular and known intelligence classifiers. - Also includes user's own classifiers. - - ''' - - url = nb_url + 'reader/feeds_trainer?%s' - params = urllib.urlencode({'feed_id':feed_id}) - results = urllib2.urlopen(url % params).read() - return simplejson.loads(results) + Retrieves all popular and known intelligence classifiers. + Also includes user's own classifiers. + ''' + + url = nb_url + 'reader/feeds_trainer' + payload = {'feed_id':feed_id} + results = requests.get(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def statistics(id_no): ''' - If you only want a user's classifiers, use /classifiers/:id. - Omit the feed_id to get all classifiers for all subscriptions. - - ''' + Omit the feed_id to get all classifiers for all subscriptions. + ''' url = nb_url + 'rss_feeds/statistics/%d' % id_no - results = urllib2.urlopen(url).read() - return simplejson.loads(results) + results = requests.get(url, cookies=cookies) + return simplejson.loads(results.content) def feed_autocomplete(term): ''' - Get a list of feeds that contain a search phrase. - Searches by feed address, feed url, and feed title, in that order. - Will only show sites with 2+ subscribers. - - ''' + Searches by feed address, feed url, and feed title, in that order. + Will only show sites with 2+ subscribers. + ''' + url = nb_url + 'rss_feeds/feed_autocomplete?%' - params = urllib.urlencode({'term':term}) - results = urllib2.urlopen(url % params).read() - return simplejson.loads(results) + payload = {'term':term} + results = requests.get(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) -def feed(id=1): +def feed(id): ''' - Retrieve stories from a single feed. - ''' - url = nb_url + 'reader/feed/%d' % id - results = urllib2.urlopen(url).read() - return simplejson.loads(results) + + url = nb_url + 'reader/feed/%s' % id + results = requests.get(url, cookies=cookies) + return simplejson.loads(results.content) def starred_stories(page=1): ''' - Retrieve a user's starred stories. + ''' - ''' - url = nb_url + 'reader/starred_stories?%s' - params = urllib.urlencode({'page':page}) - results = urllib2.urlopen(url % params).read() - return simplejson.loads(results) + url = nb_url + 'reader/starred_stories' + payload = {'page':page} + results = requests.get(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def river_stories(feeds,page=1,read_stories_count=0): ''' - Retrieve stories from a collection of feeds. This is known as the River of News. - Stories are ordered in reverse chronological order. - - ''' - - url = nb_url + 'reader/river_stories?%s' - params = urllib.urlencode({'feeds':feeds,'page':page,'read_stories_count':read_stories_count}) - results = urllib2.urlopen(url % params).read() - return simplejson.loads(results) + Stories are ordered in reverse chronological order. + ''' + + url = nb_url + 'reader/river_stories' + payload = {'feeds':feeds,'page':page,'read_stories_count':read_stories_count} + results = urllib2.urlopen(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def mark_story_as_read(story_id,feed_id): ''' - - Mark stories as read. - Multiple story ids can be sent at once. - Each story must be from the same feed. - - ''' + Mark stories as read. + Multiple story ids can be sent at once. + Each story must be from the same feed. + ''' url = nb_url + 'reader/mark_story_as_read' - params = urllib.urlencode({'story_id':story_id,'feed_id':feed_id}) - results = urllib2.urlopen(url,params).read() - return simplejson.loads(results) + payload = {'story_id':story_id,'feed_id':feed_id} + results = requests.post(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def mark_story_as_starred(story_id,feed_id): ''' - Mark a story as starred (saved). - ''' + url = nb_url + 'reader/mark_story_as_starred' - params = urllib.urlencode({'story_id':story_id,'feed_id':feed_id}) - results = urllib2.urlopen(url,params).read() - return simplejson.loads(results) + payload = {'story_id':story_id,'feed_id':feed_id} + results = requests.post(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def mark_all_as_read(days=0): ''' - Mark all stories in a feed or list of feeds as read. - ''' + url = nb_url + 'reader/mark_all_as_read' - params = urllib.urlencode({'days':days}) - results = urllib2.urlopen(url,params).read() - return simplejson.loads(results) + payload = {'days':days} + results = requests.post(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def add_url(url,folder='[Top Level]'): ''' - Add a feed by its URL. Can be either the RSS feed or the website itself. - ''' + url = nb_url + 'reader/add_url' - params = urllib.urlencode({'url':url,'folder':folder}) - results = urllib2.urlopen(url,params).read() - return simplejson.loads(results) + payload = {'url':url,'folder':folder} + results = requests.post(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def add_folder(folder,parent_folder='[Top Level]'): ''' - Add a new folder. - ''' url = nb_url + 'reader/add_folder' - params = urllib.urlencode({'folder':folder,'parent_folder':parent_folder}) - results = urllib2.urlopen(url,params).read() - return simplejson.loads(results) + payload = {'folder':folder,'parent_folder':parent_folder} + results = requests.post(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def rename_feed(feed_title,feed_id): ''' - Rename a feed title. Only the current user will see the new title. - ''' + url = nb_url + 'reader/rename_feed' - params = urllib.urlencode({'feed_title':feed_title,'feed_id':feed_id}) - results = urllib2.urlopen(url,params).read() - return simplejson.loads(results) + payload = {'feed_title':feed_title,'feed_id':feed_id} + results = requests.post(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def delete_feed(feed_id,in_folder): ''' - Unsubscribe from a feed. Removes it from the folder. - Set the in_folder parameter to remove a feed from the correct folder, in case the user is subscribed to the feed in multiple folders. + Set the in_folder parameter to remove a feed from the correct folder, in case the user is subscribed to the feed in multiple folders. + ''' - ''' url = nb_url + 'reader/delete_feed' - params = urllib.urlencode({'feed_id':feed_id,'in_folder':in_folder}) - results = urllib2.urlopen(url,params).read() - return simplejson.loads(results) + payload = {'feed_id':feed_id,'in_folder':in_folder} + results = requests.post(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def rename_folder(folder_to_rename,new_folder_name,in_folder): ''' - Rename a folder. - ''' + url = nb_url + 'reader/rename_folder' - params = urllib.urlencode({'folder_to_rename':folder_to_rename,'new_folder_name':new_folder_name,'in_folder':in_folder}) - results = urllib2.urlopen(url,params).read() - return simplejson.loads(results) + payload = {'folder_to_rename':folder_to_rename,'new_folder_name':new_folder_name,'in_folder':in_folder} + results = requests.post(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def delete_folder(folder_to_delete,in_folder,feed_id): ''' - Delete a folder and unsubscribe from all feeds inside. - ''' + url = nb_url + 'reader/delete_folder' - params = urllib.urlencode({'folder_to_delete':folder_to_delete,'in_folder':in_folder,'feed_id':feed_id}) - results = urllib2.urlopen(url,params).read() - return simplejson.loads(results) + payload = {'folder_to_delete':folder_to_delete,'in_folder':in_folder,'feed_id':feed_id} + results = requests.post(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def mark_feed_as_read(feed_id): ''' - Mark a list of feeds as read. - ''' + url = nb_url + 'reader/mark_feed_as_read' - params = urllib.urlencode({'feed_id':feed_id}) - results = urllib2.urlopen(url,params).read() - return simplejson.loads(results) + payload = {'feed_id':feed_id} + results = requests.post(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def save_feed_order(folders): ''' - Reorder feeds and move them around between folders. - The entire folder structure needs to be serialized. - - ''' + The entire folder structure needs to be serialized. + ''' url = nb_url + 'reader/save_feed_order' - params = urllib.urlencode({'folders':folders}) - results = urllib2.urlopen(url,params).read() - return simplejson.loads(results) + payload = {'folders':folders} + results = requests.post(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def classifier(id_no): ''' - - Get the intelligence classifiers for a user's site. - Only includes the user's own classifiers. - Use /reader/feeds_trainer for popular classifiers. - - ''' + Get the intelligence classifiers for a user's site. + Only includes the user's own classifiers. + Use /reader/feeds_trainer for popular classifiers. + ''' url = nb_url + 'classifier/%d' % id_no - results = urllib2.urlopen(url).read() - return simplejson.loads(results) + results = requests.get(url) + return simplejson.loads(results.content) def classifier_save(like_type,dislike_type,remove_like_type,remove_dislike_type): ''' - Save intelligence classifiers (tags, titles, authors, and the feed) for a feed. + ''' - ''' url = nb_url + 'classifier/save' - params = urllib.urlencode({'like_[TYPE]':like_type, + payload = {'like_[TYPE]':like_type, 'dislike_[TYPE]':dislike_type, 'remove_like_[TYPE]':remove_like_type, - 'remove_dislike_[TYPE]':remove_dislike_type}) - results = urllib2.urlopen(url,params).read() - return simplejson.loads(results) + 'remove_dislike_[TYPE]':remove_dislike_type} + results = requests.post(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def opml_export(): ''' - Download a backup of feeds and folders as an OPML file. - Contains folders and feeds in XML; useful for importing in another RSS reader. - - ''' + Contains folders and feeds in XML; useful for importing in another RSS reader. + ''' + url = nb_url + 'import/opml_export' - results = urllib2.urlopen(url).read() - return simplejson.loads(results) + results = requests.get(url) + return simplejson.loads(results.content) def opml_upload(opml_file): ''' - Upload an OPML file. - ''' + url = nb_url + 'import/opml_upload' f = open(opml_file) - params = urllib.urlencode({'file':f}) + payload = {'file':f} f.close() - results = urllib2.urlopen(url,params).read() - return simplejson.loads(results) + results = requests.post(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) Index: applications/mobileblur/modules/python-newsblur/newsblur.py ================================================================== --- applications/mobileblur/modules/python-newsblur/newsblur.py +++ applications/mobileblur/modules/python-newsblur/newsblur.py @@ -1,378 +1,339 @@ #!/usr/bin/python """newsblur.py - An API wrapper library for newsblur.com""" -import cookielib import simplejson -import urllib -import urllib2 + +import requests __author__ = 'Dananjaya Ramanayake , spiffytech ' __version__ = "0.1" - -# Set up cookie handling so we can auth with the Newsblur API -cj = cookielib.LWPCookieJar() -opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) -urllib2.install_opener(opener) - -nb_url = "http://newsblur.com/" - +nb_url = "http://www.newsblur.com/" +cookies = None + +from gluon import current +print current.db def login(username,password): ''' - Login as an existing user. If a user has no password set, you cannot just send any old password. Required parameters, username and password, must be of string type. - ''' + url = nb_url + 'api/login' - params = urllib.urlencode({'username':username,'password':password}) - results = urllib2.urlopen(url,params).read() - return simplejson.loads(results) + results = requests.post(url, data={"username": username, "password": password}) + global cookies + cookies = results.cookies + return simplejson.loads(results.content) def logout(): ''' - Logout the currently logged in user. - ''' + url = nb_url + 'api/logout' - results = urllib2.urlopen(url).read() - return simplejson.loads(results) + results = requests.get(url, cookies=cookies) + return simplejson.loads(results.content) def signup(username,password,email): ''' - Create a new user. All three required parameters must be of type string. - ''' + url = nb_url + 'api/signup' - params = urllib.urlencode({'signup_username':username,'signup_password':password,'signup_email':email}) - results = urllib2.urlopen(url,params).read() - return simplejson.loads(results) + payload = {'signup_username':username,'signup_password':password,'signup_email':email} + results = requests.post(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def search_feed(address,offset=1): ''' Retrieve information about a feed from its website or RSS address. Parameter address must be of type string while parameter offset must be an integer. Will return a feed. ''' - url = nb_url + 'rss_feeds/search_feed?%s' - params = urllib.urlencode({'address':address,'offset':offset}) - results = urllib2.urlopen(url % params).read() - return simplejson.loads(results) + + url = nb_url + 'rss_feeds/search_feed' + payload = {'address':address,'offset':offset} + results = results.get(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def feeds(include_favicons=True,flat=False): ''' - Retrieve a list of feeds to which a user is actively subscribed. - Includes the 3 unread counts (positive, neutral, negative), as well as optional favicons. - - ''' + Includes the 3 unread counts (positive, neutral, negative), as well as optional favicons. + ''' url = nb_url + 'reader/feeds' - params = urllib.urlencode({'include_favicons':include_favicons,'flat':flat}) -# print url + " " + url % params - results = urllib2.urlopen(url).read() - return simplejson.loads(results) + payload = {'include_favicons':include_favicons,'flat':flat} + results = requests.get(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def favicons(feeds=[1,2,3]): ''' - Retrieve a list of favicons for a list of feeds. Used when combined with /reader/feeds and include_favicons=false, so the feeds request contains far less data. Useful for mobile devices, but requires a second request. + ''' - ''' - url = nb_url + 'reader/favicons?%s' - params = urllib.urlencode({'feeds':feeds}) - results = urllib2.urlopen(url % params).read() - return simplejson.loads(results) + url = nb_url + 'reader/favicons' + payload = {'feeds':feeds} + results = requests.get(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def id(id_no): ''' - Retrieve the original page from a single feed. + ''' - ''' - url = nb_url + 'reader/page/%d' % id_no - results = urllib2.urlopen(url).read() - return simplejson.loads(results) + url = nb_url + 'reader/page/' % id_no + payload = {} + results = requests.get(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def refresh_feeds(): ''' - Up-to-the-second unread counts for each active feed. - Poll for these counts no more than once a minute. - - ''' + Poll for these counts no more than once a minute. + ''' url = nb_url + 'reader/refresh_feeds' - results = urllib2.urlopen(url).read() - return simplejson.loads(results) + results = requests.get(url, cookies=cookies) + return simplejson.loads(results.content) def feeds_trainer(feed_id): ''' - - Retrieves all popular and known intelligence classifiers. - Also includes user's own classifiers. - - ''' - - url = nb_url + 'reader/feeds_trainer?%s' - params = urllib.urlencode({'feed_id':feed_id}) - results = urllib2.urlopen(url % params).read() - return simplejson.loads(results) + Retrieves all popular and known intelligence classifiers. + Also includes user's own classifiers. + ''' + + url = nb_url + 'reader/feeds_trainer' + payload = {'feed_id':feed_id} + results = requests.get(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def statistics(id_no): ''' - If you only want a user's classifiers, use /classifiers/:id. - Omit the feed_id to get all classifiers for all subscriptions. - - ''' + Omit the feed_id to get all classifiers for all subscriptions. + ''' url = nb_url + 'rss_feeds/statistics/%d' % id_no - results = urllib2.urlopen(url).read() - return simplejson.loads(results) + results = requests.get(url, cookies=cookies) + return simplejson.loads(results.content) def feed_autocomplete(term): ''' - Get a list of feeds that contain a search phrase. - Searches by feed address, feed url, and feed title, in that order. - Will only show sites with 2+ subscribers. - - ''' + Searches by feed address, feed url, and feed title, in that order. + Will only show sites with 2+ subscribers. + ''' + url = nb_url + 'rss_feeds/feed_autocomplete?%' - params = urllib.urlencode({'term':term}) - results = urllib2.urlopen(url % params).read() - return simplejson.loads(results) + payload = {'term':term} + results = requests.get(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) -def feed(id=1): +def feed(id): ''' - Retrieve stories from a single feed. - ''' - url = nb_url + 'reader/feed/%d' % id - results = urllib2.urlopen(url).read() - return simplejson.loads(results) + + url = nb_url + 'reader/feed/%s' % id + results = requests.get(url, cookies=cookies) + return simplejson.loads(results.content) def starred_stories(page=1): ''' - Retrieve a user's starred stories. + ''' - ''' - url = nb_url + 'reader/starred_stories?%s' - params = urllib.urlencode({'page':page}) - results = urllib2.urlopen(url % params).read() - return simplejson.loads(results) + url = nb_url + 'reader/starred_stories' + payload = {'page':page} + results = requests.get(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def river_stories(feeds,page=1,read_stories_count=0): ''' - Retrieve stories from a collection of feeds. This is known as the River of News. - Stories are ordered in reverse chronological order. - - ''' - - url = nb_url + 'reader/river_stories?%s' - params = urllib.urlencode({'feeds':feeds,'page':page,'read_stories_count':read_stories_count}) - results = urllib2.urlopen(url % params).read() - return simplejson.loads(results) + Stories are ordered in reverse chronological order. + ''' + + url = nb_url + 'reader/river_stories' + payload = {'feeds':feeds,'page':page,'read_stories_count':read_stories_count} + results = urllib2.urlopen(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def mark_story_as_read(story_id,feed_id): ''' - - Mark stories as read. - Multiple story ids can be sent at once. - Each story must be from the same feed. - - ''' + Mark stories as read. + Multiple story ids can be sent at once. + Each story must be from the same feed. + ''' url = nb_url + 'reader/mark_story_as_read' - params = urllib.urlencode({'story_id':story_id,'feed_id':feed_id}) - results = urllib2.urlopen(url,params).read() - return simplejson.loads(results) + payload = {'story_id':story_id,'feed_id':feed_id} + results = requests.post(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def mark_story_as_starred(story_id,feed_id): ''' - Mark a story as starred (saved). - ''' + url = nb_url + 'reader/mark_story_as_starred' - params = urllib.urlencode({'story_id':story_id,'feed_id':feed_id}) - results = urllib2.urlopen(url,params).read() - return simplejson.loads(results) + payload = {'story_id':story_id,'feed_id':feed_id} + results = requests.post(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def mark_all_as_read(days=0): ''' - Mark all stories in a feed or list of feeds as read. - ''' + url = nb_url + 'reader/mark_all_as_read' - params = urllib.urlencode({'days':days}) - results = urllib2.urlopen(url,params).read() - return simplejson.loads(results) + payload = {'days':days} + results = requests.post(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def add_url(url,folder='[Top Level]'): ''' - Add a feed by its URL. Can be either the RSS feed or the website itself. - ''' + url = nb_url + 'reader/add_url' - params = urllib.urlencode({'url':url,'folder':folder}) - results = urllib2.urlopen(url,params).read() - return simplejson.loads(results) + payload = {'url':url,'folder':folder} + results = requests.post(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def add_folder(folder,parent_folder='[Top Level]'): ''' - Add a new folder. - ''' url = nb_url + 'reader/add_folder' - params = urllib.urlencode({'folder':folder,'parent_folder':parent_folder}) - results = urllib2.urlopen(url,params).read() - return simplejson.loads(results) + payload = {'folder':folder,'parent_folder':parent_folder} + results = requests.post(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def rename_feed(feed_title,feed_id): ''' - Rename a feed title. Only the current user will see the new title. - ''' + url = nb_url + 'reader/rename_feed' - params = urllib.urlencode({'feed_title':feed_title,'feed_id':feed_id}) - results = urllib2.urlopen(url,params).read() - return simplejson.loads(results) + payload = {'feed_title':feed_title,'feed_id':feed_id} + results = requests.post(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def delete_feed(feed_id,in_folder): ''' - Unsubscribe from a feed. Removes it from the folder. - Set the in_folder parameter to remove a feed from the correct folder, in case the user is subscribed to the feed in multiple folders. + Set the in_folder parameter to remove a feed from the correct folder, in case the user is subscribed to the feed in multiple folders. + ''' - ''' url = nb_url + 'reader/delete_feed' - params = urllib.urlencode({'feed_id':feed_id,'in_folder':in_folder}) - results = urllib2.urlopen(url,params).read() - return simplejson.loads(results) + payload = {'feed_id':feed_id,'in_folder':in_folder} + results = requests.post(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def rename_folder(folder_to_rename,new_folder_name,in_folder): ''' - Rename a folder. - ''' + url = nb_url + 'reader/rename_folder' - params = urllib.urlencode({'folder_to_rename':folder_to_rename,'new_folder_name':new_folder_name,'in_folder':in_folder}) - results = urllib2.urlopen(url,params).read() - return simplejson.loads(results) + payload = {'folder_to_rename':folder_to_rename,'new_folder_name':new_folder_name,'in_folder':in_folder} + results = requests.post(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def delete_folder(folder_to_delete,in_folder,feed_id): ''' - Delete a folder and unsubscribe from all feeds inside. - ''' + url = nb_url + 'reader/delete_folder' - params = urllib.urlencode({'folder_to_delete':folder_to_delete,'in_folder':in_folder,'feed_id':feed_id}) - results = urllib2.urlopen(url,params).read() - return simplejson.loads(results) + payload = {'folder_to_delete':folder_to_delete,'in_folder':in_folder,'feed_id':feed_id} + results = requests.post(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def mark_feed_as_read(feed_id): ''' - Mark a list of feeds as read. - ''' + url = nb_url + 'reader/mark_feed_as_read' - params = urllib.urlencode({'feed_id':feed_id}) - results = urllib2.urlopen(url,params).read() - return simplejson.loads(results) + payload = {'feed_id':feed_id} + results = requests.post(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def save_feed_order(folders): ''' - Reorder feeds and move them around between folders. - The entire folder structure needs to be serialized. - - ''' + The entire folder structure needs to be serialized. + ''' url = nb_url + 'reader/save_feed_order' - params = urllib.urlencode({'folders':folders}) - results = urllib2.urlopen(url,params).read() - return simplejson.loads(results) + payload = {'folders':folders} + results = requests.post(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def classifier(id_no): ''' - - Get the intelligence classifiers for a user's site. - Only includes the user's own classifiers. - Use /reader/feeds_trainer for popular classifiers. - - ''' + Get the intelligence classifiers for a user's site. + Only includes the user's own classifiers. + Use /reader/feeds_trainer for popular classifiers. + ''' url = nb_url + 'classifier/%d' % id_no - results = urllib2.urlopen(url).read() - return simplejson.loads(results) + results = requests.get(url) + return simplejson.loads(results.content) def classifier_save(like_type,dislike_type,remove_like_type,remove_dislike_type): ''' - Save intelligence classifiers (tags, titles, authors, and the feed) for a feed. + ''' - ''' url = nb_url + 'classifier/save' - params = urllib.urlencode({'like_[TYPE]':like_type, + payload = {'like_[TYPE]':like_type, 'dislike_[TYPE]':dislike_type, 'remove_like_[TYPE]':remove_like_type, - 'remove_dislike_[TYPE]':remove_dislike_type}) - results = urllib2.urlopen(url,params).read() - return simplejson.loads(results) + 'remove_dislike_[TYPE]':remove_dislike_type} + results = requests.post(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) def opml_export(): ''' - Download a backup of feeds and folders as an OPML file. - Contains folders and feeds in XML; useful for importing in another RSS reader. - - ''' + Contains folders and feeds in XML; useful for importing in another RSS reader. + ''' + url = nb_url + 'import/opml_export' - results = urllib2.urlopen(url).read() - return simplejson.loads(results) + results = requests.get(url) + return simplejson.loads(results.content) def opml_upload(opml_file): ''' - Upload an OPML file. - ''' + url = nb_url + 'import/opml_upload' f = open(opml_file) - params = urllib.urlencode({'file':f}) + payload = {'file':f} f.close() - results = urllib2.urlopen(url,params).read() - return simplejson.loads(results) + results = requests.post(url, data=payload, cookies=cookies) + return simplejson.loads(results.content) ADDED applications/mobileblur/views/feeds/view.html Index: applications/mobileblur/views/feeds/view.html ================================================================== --- applications/mobileblur/views/feeds/view.html +++ applications/mobileblur/views/feeds/view.html @@ -0,0 +1,11 @@ +{{left_sidebar_enabled=right_sidebar_enabled=False}} +{{extend 'layout.html'}} + +

Title: {{= feed["feed_title"] }}

+ +{{ for story in stories: }} +

{{= story["story_title"] }}

+{{ pass }} + +{{block left_sidebar}}New Left Sidebar Content{{end}} +{{block right_sidebar}}New Right Sidebar Content{{end}} ADDED applications/mobileblur/views/stories/view.html Index: applications/mobileblur/views/stories/view.html ================================================================== --- applications/mobileblur/views/stories/view.html +++ applications/mobileblur/views/stories/view.html @@ -0,0 +1,9 @@ +{{left_sidebar_enabled=right_sidebar_enabled=False}} +{{extend 'layout.html'}} + +

{{= story["story_title"] }}

+ +{{= XML(story["story_content"]) }} + +{{block left_sidebar}}New Left Sidebar Content{{end}} +{{block right_sidebar}}New Right Sidebar Content{{end}}