MobileBlur

Hex Artifact Content
Login

Artifact 9e60ae12cf0a46e31cd02a610578c41c046f4080:


0000: 23 21 2f 75 73 72 2f 62 69 6e 2f 70 79 74 68 6f  #!/usr/bin/pytho
0010: 6e 0a 0a 22 22 22 6e 65 77 73 62 6c 75 72 2e 70  n.."""newsblur.p
0020: 79 20 2d 20 41 6e 20 41 50 49 20 77 72 61 70 70  y - An API wrapp
0030: 65 72 20 6c 69 62 72 61 72 79 20 66 6f 72 20 6e  er library for n
0040: 65 77 73 62 6c 75 72 2e 63 6f 6d 22 22 22 0a 0a  ewsblur.com"""..
0050: 69 6d 70 6f 72 74 20 63 6f 6f 6b 69 65 6c 69 62  import cookielib
0060: 0a 69 6d 70 6f 72 74 20 73 69 6d 70 6c 65 6a 73  .import simplejs
0070: 6f 6e 0a 69 6d 70 6f 72 74 20 75 72 6c 6c 69 62  on.import urllib
0080: 0a 69 6d 70 6f 72 74 20 75 72 6c 6c 69 62 32 0a  .import urllib2.
0090: 0a 5f 5f 61 75 74 68 6f 72 5f 5f 20 3d 20 27 44  .__author__ = 'D
00a0: 61 6e 61 6e 6a 61 79 61 20 52 61 6d 61 6e 61 79  ananjaya Ramanay
00b0: 61 6b 65 20 3c 64 61 6e 61 6e 6a 61 79 61 38 36  ake <dananjaya86
00c0: 40 67 6d 61 69 6c 2e 63 6f 6d 3e 2c 20 73 70 69  @gmail.com>, spi
00d0: 66 66 79 74 65 63 68 20 3c 73 70 69 66 66 79 74  ffytech <spiffyt
00e0: 65 63 68 67 6d 61 69 6c 2e 63 6f 6d 3e 27 0a 5f  echgmail.com>'._
00f0: 5f 76 65 72 73 69 6f 6e 5f 5f 20 3d 20 22 30 2e  _version__ = "0.
0100: 31 22 0a 0a 0a 23 20 53 65 74 20 75 70 20 63 6f  1"...# Set up co
0110: 6f 6b 69 65 20 68 61 6e 64 6c 69 6e 67 20 73 6f  okie handling so
0120: 20 77 65 20 63 61 6e 20 61 75 74 68 20 77 69 74   we can auth wit
0130: 68 20 74 68 65 20 4e 65 77 73 62 6c 75 72 20 41  h the Newsblur A
0140: 50 49 0a 63 6a 20 3d 20 63 6f 6f 6b 69 65 6c 69  PI.cj = cookieli
0150: 62 2e 4c 57 50 43 6f 6f 6b 69 65 4a 61 72 28 29  b.LWPCookieJar()
0160: 0a 6f 70 65 6e 65 72 20 3d 20 75 72 6c 6c 69 62  .opener = urllib
0170: 32 2e 62 75 69 6c 64 5f 6f 70 65 6e 65 72 28 75  2.build_opener(u
0180: 72 6c 6c 69 62 32 2e 48 54 54 50 43 6f 6f 6b 69  rllib2.HTTPCooki
0190: 65 50 72 6f 63 65 73 73 6f 72 28 63 6a 29 29 0a  eProcessor(cj)).
01a0: 75 72 6c 6c 69 62 32 2e 69 6e 73 74 61 6c 6c 5f  urllib2.install_
01b0: 6f 70 65 6e 65 72 28 6f 70 65 6e 65 72 29 0a 0a  opener(opener)..
01c0: 6e 62 5f 75 72 6c 20 3d 20 22 68 74 74 70 3a 2f  nb_url = "http:/
01d0: 2f 6e 65 77 73 62 6c 75 72 2e 63 6f 6d 2f 22 0a  /newsblur.com/".
01e0: 0a 0a 64 65 66 20 6c 6f 67 69 6e 28 75 73 65 72  ..def login(user
01f0: 6e 61 6d 65 2c 70 61 73 73 77 6f 72 64 29 3a 0a  name,password):.
0200: 20 20 20 20 27 27 27 0a 20 20 20 20 0a 20 20 20      '''.    .   
0210: 20 4c 6f 67 69 6e 20 61 73 20 61 6e 20 65 78 69   Login as an exi
0220: 73 74 69 6e 67 20 75 73 65 72 2e 0a 20 20 20 20  sting user..    
0230: 49 66 20 61 20 75 73 65 72 20 68 61 73 20 6e 6f  If a user has no
0240: 20 70 61 73 73 77 6f 72 64 20 73 65 74 2c 20 79   password set, y
0250: 6f 75 20 63 61 6e 6e 6f 74 20 6a 75 73 74 20 73  ou cannot just s
0260: 65 6e 64 20 61 6e 79 20 6f 6c 64 20 70 61 73 73  end any old pass
0270: 77 6f 72 64 2e 20 0a 20 20 20 20 52 65 71 75 69  word. .    Requi
0280: 72 65 64 20 70 61 72 61 6d 65 74 65 72 73 2c 20  red parameters, 
0290: 75 73 65 72 6e 61 6d 65 20 61 6e 64 20 70 61 73  username and pas
02a0: 73 77 6f 72 64 2c 20 6d 75 73 74 20 62 65 20 6f  sword, must be o
02b0: 66 20 73 74 72 69 6e 67 20 74 79 70 65 2e 0a 20  f string type.. 
02c0: 20 20 20 0a 20 20 20 20 27 27 27 0a 20 20 20 20     .    '''.    
02d0: 75 72 6c 20 3d 20 6e 62 5f 75 72 6c 20 2b 20 27  url = nb_url + '
02e0: 61 70 69 2f 6c 6f 67 69 6e 27 0a 20 20 20 20 70  api/login'.    p
02f0: 61 72 61 6d 73 20 3d 20 75 72 6c 6c 69 62 2e 75  arams = urllib.u
0300: 72 6c 65 6e 63 6f 64 65 28 7b 27 75 73 65 72 6e  rlencode({'usern
0310: 61 6d 65 27 3a 75 73 65 72 6e 61 6d 65 2c 27 70  ame':username,'p
0320: 61 73 73 77 6f 72 64 27 3a 70 61 73 73 77 6f 72  assword':passwor
0330: 64 7d 29 0a 20 20 20 20 72 65 73 75 6c 74 73 20  d}).    results 
0340: 3d 20 75 72 6c 6c 69 62 32 2e 75 72 6c 6f 70 65  = urllib2.urlope
0350: 6e 28 75 72 6c 2c 70 61 72 61 6d 73 29 2e 72 65  n(url,params).re
0360: 61 64 28 29 0a 20 20 20 20 72 65 74 75 72 6e 20  ad().    return 
0370: 73 69 6d 70 6c 65 6a 73 6f 6e 2e 6c 6f 61 64 73  simplejson.loads
0380: 28 72 65 73 75 6c 74 73 29 0a 0a 64 65 66 20 6c  (results)..def l
0390: 6f 67 6f 75 74 28 29 3a 0a 20 20 20 20 27 27 27  ogout():.    '''
03a0: 0a 20 20 20 20 0a 20 20 20 20 4c 6f 67 6f 75 74  .    .    Logout
03b0: 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6c   the currently l
03c0: 6f 67 67 65 64 20 69 6e 20 75 73 65 72 2e 0a 20  ogged in user.. 
03d0: 20 20 20 0a 20 20 20 20 27 27 27 0a 20 20 20 20     .    '''.    
03e0: 75 72 6c 20 3d 20 6e 62 5f 75 72 6c 20 2b 20 27  url = nb_url + '
03f0: 61 70 69 2f 6c 6f 67 6f 75 74 27 0a 20 20 20 20  api/logout'.    
0400: 72 65 73 75 6c 74 73 20 3d 20 75 72 6c 6c 69 62  results = urllib
0410: 32 2e 75 72 6c 6f 70 65 6e 28 75 72 6c 29 2e 72  2.urlopen(url).r
0420: 65 61 64 28 29 0a 20 20 20 20 72 65 74 75 72 6e  ead().    return
0430: 20 73 69 6d 70 6c 65 6a 73 6f 6e 2e 6c 6f 61 64   simplejson.load
0440: 73 28 72 65 73 75 6c 74 73 29 0a 0a 64 65 66 20  s(results)..def 
0450: 73 69 67 6e 75 70 28 75 73 65 72 6e 61 6d 65 2c  signup(username,
0460: 70 61 73 73 77 6f 72 64 2c 65 6d 61 69 6c 29 3a  password,email):
0470: 0a 20 20 20 20 27 27 27 0a 20 20 20 20 0a 20 20  .    '''.    .  
0480: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 75    Create a new u
0490: 73 65 72 2e 0a 20 20 20 20 41 6c 6c 20 74 68 72  ser..    All thr
04a0: 65 65 20 72 65 71 75 69 72 65 64 20 70 61 72 61  ee required para
04b0: 6d 65 74 65 72 73 20 6d 75 73 74 20 62 65 20 6f  meters must be o
04c0: 66 20 74 79 70 65 20 73 74 72 69 6e 67 2e 0a 20  f type string.. 
04d0: 20 20 20 0a 20 20 20 20 27 27 27 0a 20 20 20 20     .    '''.    
04e0: 75 72 6c 20 3d 20 6e 62 5f 75 72 6c 20 2b 20 27  url = nb_url + '
04f0: 61 70 69 2f 73 69 67 6e 75 70 27 0a 20 20 20 20  api/signup'.    
0500: 70 61 72 61 6d 73 20 3d 20 75 72 6c 6c 69 62 2e  params = urllib.
0510: 75 72 6c 65 6e 63 6f 64 65 28 7b 27 73 69 67 6e  urlencode({'sign
0520: 75 70 5f 75 73 65 72 6e 61 6d 65 27 3a 75 73 65  up_username':use
0530: 72 6e 61 6d 65 2c 27 73 69 67 6e 75 70 5f 70 61  rname,'signup_pa
0540: 73 73 77 6f 72 64 27 3a 70 61 73 73 77 6f 72 64  ssword':password
0550: 2c 27 73 69 67 6e 75 70 5f 65 6d 61 69 6c 27 3a  ,'signup_email':
0560: 65 6d 61 69 6c 7d 29 0a 20 20 20 20 72 65 73 75  email}).    resu
0570: 6c 74 73 20 3d 20 75 72 6c 6c 69 62 32 2e 75 72  lts = urllib2.ur
0580: 6c 6f 70 65 6e 28 75 72 6c 2c 70 61 72 61 6d 73  lopen(url,params
0590: 29 2e 72 65 61 64 28 29 0a 20 20 20 20 72 65 74  ).read().    ret
05a0: 75 72 6e 20 73 69 6d 70 6c 65 6a 73 6f 6e 2e 6c  urn simplejson.l
05b0: 6f 61 64 73 28 72 65 73 75 6c 74 73 29 0a 0a 64  oads(results)..d
05c0: 65 66 20 73 65 61 72 63 68 5f 66 65 65 64 28 61  ef search_feed(a
05d0: 64 64 72 65 73 73 2c 6f 66 66 73 65 74 3d 31 29  ddress,offset=1)
05e0: 3a 0a 20 20 20 20 27 27 27 0a 20 20 20 20 0a 20  :.    '''.    . 
05f0: 20 20 20 52 65 74 72 69 65 76 65 20 69 6e 66 6f     Retrieve info
0600: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 20  rmation about a 
0610: 66 65 65 64 20 66 72 6f 6d 20 69 74 73 20 77 65  feed from its we
0620: 62 73 69 74 65 20 6f 72 20 52 53 53 20 61 64 64  bsite or RSS add
0630: 72 65 73 73 2e 0a 20 20 20 20 50 61 72 61 6d 65  ress..    Parame
0640: 74 65 72 20 61 64 64 72 65 73 73 20 6d 75 73 74  ter address must
0650: 20 62 65 20 6f 66 20 74 79 70 65 20 73 74 72 69   be of type stri
0660: 6e 67 20 77 68 69 6c 65 20 70 61 72 61 6d 65 74  ng while paramet
0670: 65 72 20 6f 66 66 73 65 74 20 6d 75 73 74 20 62  er offset must b
0680: 65 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 20 20  e an integer..  
0690: 20 20 57 69 6c 6c 20 72 65 74 75 72 6e 20 61 20    Will return a 
06a0: 66 65 65 64 2e 0a 20 20 20 20 0a 20 20 20 20 27  feed..    .    '
06b0: 27 27 0a 20 20 20 20 75 72 6c 20 3d 20 6e 62 5f  ''.    url = nb_
06c0: 75 72 6c 20 2b 20 27 72 73 73 5f 66 65 65 64 73  url + 'rss_feeds
06d0: 2f 73 65 61 72 63 68 5f 66 65 65 64 3f 25 73 27  /search_feed?%s'
06e0: 0a 20 20 20 20 70 61 72 61 6d 73 20 3d 20 75 72  .    params = ur
06f0: 6c 6c 69 62 2e 75 72 6c 65 6e 63 6f 64 65 28 7b  llib.urlencode({
0700: 27 61 64 64 72 65 73 73 27 3a 61 64 64 72 65 73  'address':addres
0710: 73 2c 27 6f 66 66 73 65 74 27 3a 6f 66 66 73 65  s,'offset':offse
0720: 74 7d 29 0a 20 20 20 20 72 65 73 75 6c 74 73 20  t}).    results 
0730: 3d 20 75 72 6c 6c 69 62 32 2e 75 72 6c 6f 70 65  = urllib2.urlope
0740: 6e 28 75 72 6c 20 25 20 70 61 72 61 6d 73 29 2e  n(url % params).
0750: 72 65 61 64 28 29 0a 20 20 20 20 72 65 74 75 72  read().    retur
0760: 6e 20 73 69 6d 70 6c 65 6a 73 6f 6e 2e 6c 6f 61  n simplejson.loa
0770: 64 73 28 72 65 73 75 6c 74 73 29 0a 0a 64 65 66  ds(results)..def
0780: 20 66 65 65 64 73 28 69 6e 63 6c 75 64 65 5f 66   feeds(include_f
0790: 61 76 69 63 6f 6e 73 3d 54 72 75 65 2c 66 6c 61  avicons=True,fla
07a0: 74 3d 46 61 6c 73 65 29 3a 0a 20 20 20 20 27 27  t=False):.    ''
07b0: 27 0a 20 20 20 20 0a 20 20 20 20 52 65 74 72 69  '.    .    Retri
07c0: 65 76 65 20 61 20 6c 69 73 74 20 6f 66 20 66 65  eve a list of fe
07d0: 65 64 73 20 74 6f 20 77 68 69 63 68 20 61 20 75  eds to which a u
07e0: 73 65 72 20 69 73 20 61 63 74 69 76 65 6c 79 20  ser is actively 
07f0: 73 75 62 73 63 72 69 62 65 64 2e 0a 20 20 20 20  subscribed..    
0800: 20 20 20 20 49 6e 63 6c 75 64 65 73 20 74 68 65      Includes the
0810: 20 33 20 75 6e 72 65 61 64 20 63 6f 75 6e 74 73   3 unread counts
0820: 20 28 70 6f 73 69 74 69 76 65 2c 20 6e 65 75 74   (positive, neut
0830: 72 61 6c 2c 20 6e 65 67 61 74 69 76 65 29 2c 20  ral, negative), 
0840: 61 73 20 77 65 6c 6c 20 61 73 20 6f 70 74 69 6f  as well as optio
0850: 6e 61 6c 20 66 61 76 69 63 6f 6e 73 2e 0a 0a 20  nal favicons... 
0860: 20 20 20 20 20 20 20 27 27 27 0a 20 20 20 20 0a         '''.    .
0870: 20 20 20 20 75 72 6c 20 3d 20 6e 62 5f 75 72 6c      url = nb_url
0880: 20 2b 20 27 72 65 61 64 65 72 2f 66 65 65 64 73   + 'reader/feeds
0890: 27 0a 20 20 20 20 70 61 72 61 6d 73 20 3d 20 75  '.    params = u
08a0: 72 6c 6c 69 62 2e 75 72 6c 65 6e 63 6f 64 65 28  rllib.urlencode(
08b0: 7b 27 69 6e 63 6c 75 64 65 5f 66 61 76 69 63 6f  {'include_favico
08c0: 6e 73 27 3a 69 6e 63 6c 75 64 65 5f 66 61 76 69  ns':include_favi
08d0: 63 6f 6e 73 2c 27 66 6c 61 74 27 3a 66 6c 61 74  cons,'flat':flat
08e0: 7d 29 0a 23 20 20 20 20 70 72 69 6e 74 20 75 72  }).#    print ur
08f0: 6c 20 2b 20 22 20 22 20 2b 20 75 72 6c 20 25 20  l + " " + url % 
0900: 70 61 72 61 6d 73 0a 20 20 20 20 72 65 73 75 6c  params.    resul
0910: 74 73 20 3d 20 75 72 6c 6c 69 62 32 2e 75 72 6c  ts = urllib2.url
0920: 6f 70 65 6e 28 75 72 6c 29 2e 72 65 61 64 28 29  open(url).read()
0930: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 69 6d 70  .    return simp
0940: 6c 65 6a 73 6f 6e 2e 6c 6f 61 64 73 28 72 65 73  lejson.loads(res
0950: 75 6c 74 73 29 0a 0a 0a 64 65 66 20 66 61 76 69  ults)...def favi
0960: 63 6f 6e 73 28 66 65 65 64 73 3d 5b 31 2c 32 2c  cons(feeds=[1,2,
0970: 33 5d 29 3a 0a 20 20 20 20 27 27 27 0a 20 20 20  3]):.    '''.   
0980: 20 0a 20 20 20 20 52 65 74 72 69 65 76 65 20 61   .    Retrieve a
0990: 20 6c 69 73 74 20 6f 66 20 66 61 76 69 63 6f 6e   list of favicon
09a0: 73 20 66 6f 72 20 61 20 6c 69 73 74 20 6f 66 20  s for a list of 
09b0: 66 65 65 64 73 2e 20 0a 20 20 20 20 55 73 65 64  feeds. .    Used
09c0: 20 77 68 65 6e 20 63 6f 6d 62 69 6e 65 64 20 77   when combined w
09d0: 69 74 68 20 2f 72 65 61 64 65 72 2f 66 65 65 64  ith /reader/feed
09e0: 73 20 61 6e 64 20 69 6e 63 6c 75 64 65 5f 66 61  s and include_fa
09f0: 76 69 63 6f 6e 73 3d 66 61 6c 73 65 2c 20 73 6f  vicons=false, so
0a00: 20 74 68 65 20 66 65 65 64 73 20 72 65 71 75 65   the feeds reque
0a10: 73 74 20 63 6f 6e 74 61 69 6e 73 20 66 61 72 20  st contains far 
0a20: 6c 65 73 73 20 64 61 74 61 2e 20 0a 20 20 20 20  less data. .    
0a30: 55 73 65 66 75 6c 20 66 6f 72 20 6d 6f 62 69 6c  Useful for mobil
0a40: 65 20 64 65 76 69 63 65 73 2c 20 62 75 74 20 72  e devices, but r
0a50: 65 71 75 69 72 65 73 20 61 20 73 65 63 6f 6e 64  equires a second
0a60: 20 72 65 71 75 65 73 74 2e 20 0a 20 20 20 20 0a   request. .    .
0a70: 20 20 20 20 27 27 27 0a 20 20 20 20 75 72 6c 20      '''.    url 
0a80: 3d 20 6e 62 5f 75 72 6c 20 2b 20 27 72 65 61 64  = nb_url + 'read
0a90: 65 72 2f 66 61 76 69 63 6f 6e 73 3f 25 73 27 0a  er/favicons?%s'.
0aa0: 20 20 20 20 70 61 72 61 6d 73 20 3d 20 75 72 6c      params = url
0ab0: 6c 69 62 2e 75 72 6c 65 6e 63 6f 64 65 28 7b 27  lib.urlencode({'
0ac0: 66 65 65 64 73 27 3a 66 65 65 64 73 7d 29 0a 20  feeds':feeds}). 
0ad0: 20 20 20 72 65 73 75 6c 74 73 20 3d 20 75 72 6c     results = url
0ae0: 6c 69 62 32 2e 75 72 6c 6f 70 65 6e 28 75 72 6c  lib2.urlopen(url
0af0: 20 25 20 70 61 72 61 6d 73 29 2e 72 65 61 64 28   % params).read(
0b00: 29 0a 20 20 20 20 72 65 74 75 72 6e 20 73 69 6d  ).    return sim
0b10: 70 6c 65 6a 73 6f 6e 2e 6c 6f 61 64 73 28 72 65  plejson.loads(re
0b20: 73 75 6c 74 73 29 0a 20 20 20 20 0a 64 65 66 20  sults).    .def 
0b30: 69 64 28 69 64 5f 6e 6f 29 3a 0a 20 20 20 20 27  id(id_no):.    '
0b40: 27 27 0a 20 20 20 20 0a 20 20 20 20 52 65 74 72  ''.    .    Retr
0b50: 69 65 76 65 20 74 68 65 20 6f 72 69 67 69 6e 61  ieve the origina
0b60: 6c 20 70 61 67 65 20 66 72 6f 6d 20 61 20 73 69  l page from a si
0b70: 6e 67 6c 65 20 66 65 65 64 2e 0a 20 20 20 20 0a  ngle feed..    .
0b80: 20 20 20 20 27 27 27 0a 20 20 20 20 75 72 6c 20      '''.    url 
0b90: 3d 20 6e 62 5f 75 72 6c 20 2b 20 27 72 65 61 64  = nb_url + 'read
0ba0: 65 72 2f 70 61 67 65 2f 25 64 27 20 25 20 69 64  er/page/%d' % id
0bb0: 5f 6e 6f 0a 20 20 20 20 72 65 73 75 6c 74 73 20  _no.    results 
0bc0: 3d 20 75 72 6c 6c 69 62 32 2e 75 72 6c 6f 70 65  = urllib2.urlope
0bd0: 6e 28 75 72 6c 29 2e 72 65 61 64 28 29 0a 20 20  n(url).read().  
0be0: 20 20 72 65 74 75 72 6e 20 73 69 6d 70 6c 65 6a    return simplej
0bf0: 73 6f 6e 2e 6c 6f 61 64 73 28 72 65 73 75 6c 74  son.loads(result
0c00: 73 29 0a 0a 64 65 66 20 72 65 66 72 65 73 68 5f  s)..def refresh_
0c10: 66 65 65 64 73 28 29 3a 0a 20 20 20 20 27 27 27  feeds():.    '''
0c20: 0a 20 20 20 20 0a 20 20 20 20 55 70 2d 74 6f 2d  .    .    Up-to-
0c30: 74 68 65 2d 73 65 63 6f 6e 64 20 75 6e 72 65 61  the-second unrea
0c40: 64 20 63 6f 75 6e 74 73 20 66 6f 72 20 65 61 63  d counts for eac
0c50: 68 20 61 63 74 69 76 65 20 66 65 65 64 2e 0a 20  h active feed.. 
0c60: 20 20 20 20 20 20 20 50 6f 6c 6c 20 66 6f 72 20         Poll for 
0c70: 74 68 65 73 65 20 63 6f 75 6e 74 73 20 6e 6f 20  these counts no 
0c80: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 61  more than once a
0c90: 20 6d 69 6e 75 74 65 2e 0a 20 20 20 20 20 20 20   minute..       
0ca0: 20 0a 20 20 20 20 20 20 20 20 27 27 27 0a 0a 20   .        '''.. 
0cb0: 20 20 20 75 72 6c 20 3d 20 6e 62 5f 75 72 6c 20     url = nb_url 
0cc0: 2b 20 27 72 65 61 64 65 72 2f 72 65 66 72 65 73  + 'reader/refres
0cd0: 68 5f 66 65 65 64 73 27 0a 20 20 20 20 72 65 73  h_feeds'.    res
0ce0: 75 6c 74 73 20 3d 20 75 72 6c 6c 69 62 32 2e 75  ults = urllib2.u
0cf0: 72 6c 6f 70 65 6e 28 75 72 6c 29 2e 72 65 61 64  rlopen(url).read
0d00: 28 29 0a 20 20 20 20 72 65 74 75 72 6e 20 73 69  ().    return si
0d10: 6d 70 6c 65 6a 73 6f 6e 2e 6c 6f 61 64 73 28 72  mplejson.loads(r
0d20: 65 73 75 6c 74 73 29 0a 0a 64 65 66 20 66 65 65  esults)..def fee
0d30: 64 73 5f 74 72 61 69 6e 65 72 28 66 65 65 64 5f  ds_trainer(feed_
0d40: 69 64 29 3a 0a 20 20 20 20 27 27 27 0a 20 20 20  id):.    '''.   
0d50: 20 0a 20 20 20 20 20 52 65 74 72 69 65 76 65 73   .     Retrieves
0d60: 20 61 6c 6c 20 70 6f 70 75 6c 61 72 20 61 6e 64   all popular and
0d70: 20 6b 6e 6f 77 6e 20 69 6e 74 65 6c 6c 69 67 65   known intellige
0d80: 6e 63 65 20 63 6c 61 73 73 69 66 69 65 72 73 2e  nce classifiers.
0d90: 0a 20 20 20 20 20 20 20 20 41 6c 73 6f 20 69 6e  .        Also in
0da0: 63 6c 75 64 65 73 20 75 73 65 72 27 73 20 6f 77  cludes user's ow
0db0: 6e 20 63 6c 61 73 73 69 66 69 65 72 73 2e 0a 20  n classifiers.. 
0dc0: 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
0dd0: 27 27 27 0a 0a 20 20 20 20 75 72 6c 20 3d 20 6e  '''..    url = n
0de0: 62 5f 75 72 6c 20 2b 20 27 72 65 61 64 65 72 2f  b_url + 'reader/
0df0: 66 65 65 64 73 5f 74 72 61 69 6e 65 72 3f 25 73  feeds_trainer?%s
0e00: 27 0a 20 20 20 20 70 61 72 61 6d 73 20 3d 20 75  '.    params = u
0e10: 72 6c 6c 69 62 2e 75 72 6c 65 6e 63 6f 64 65 28  rllib.urlencode(
0e20: 7b 27 66 65 65 64 5f 69 64 27 3a 66 65 65 64 5f  {'feed_id':feed_
0e30: 69 64 7d 29 0a 20 20 20 20 72 65 73 75 6c 74 73  id}).    results
0e40: 20 3d 20 75 72 6c 6c 69 62 32 2e 75 72 6c 6f 70   = urllib2.urlop
0e50: 65 6e 28 75 72 6c 20 25 20 70 61 72 61 6d 73 29  en(url % params)
0e60: 2e 72 65 61 64 28 29 0a 20 20 20 20 72 65 74 75  .read().    retu
0e70: 72 6e 20 73 69 6d 70 6c 65 6a 73 6f 6e 2e 6c 6f  rn simplejson.lo
0e80: 61 64 73 28 72 65 73 75 6c 74 73 29 0a 0a 64 65  ads(results)..de
0e90: 66 20 73 74 61 74 69 73 74 69 63 73 28 69 64 5f  f statistics(id_
0ea0: 6e 6f 29 3a 0a 20 20 20 20 27 27 27 0a 20 20 20  no):.    '''.   
0eb0: 20 0a 20 20 20 20 49 66 20 79 6f 75 20 6f 6e 6c   .    If you onl
0ec0: 79 20 77 61 6e 74 20 61 20 75 73 65 72 27 73 20  y want a user's 
0ed0: 63 6c 61 73 73 69 66 69 65 72 73 2c 20 75 73 65  classifiers, use
0ee0: 20 2f 63 6c 61 73 73 69 66 69 65 72 73 2f 3a 69   /classifiers/:i
0ef0: 64 2e 0a 20 20 20 20 20 20 20 20 4f 6d 69 74 20  d..        Omit 
0f00: 74 68 65 20 66 65 65 64 5f 69 64 20 74 6f 20 67  the feed_id to g
0f10: 65 74 20 61 6c 6c 20 63 6c 61 73 73 69 66 69 65  et all classifie
0f20: 72 73 20 66 6f 72 20 61 6c 6c 20 73 75 62 73 63  rs for all subsc
0f30: 72 69 70 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20  riptions..      
0f40: 20 20 0a 20 20 20 20 20 20 20 20 27 27 27 0a 0a    .        '''..
0f50: 20 20 20 20 75 72 6c 20 3d 20 6e 62 5f 75 72 6c      url = nb_url
0f60: 20 2b 20 27 72 73 73 5f 66 65 65 64 73 2f 73 74   + 'rss_feeds/st
0f70: 61 74 69 73 74 69 63 73 2f 25 64 27 20 25 20 69  atistics/%d' % i
0f80: 64 5f 6e 6f 0a 20 20 20 20 72 65 73 75 6c 74 73  d_no.    results
0f90: 20 3d 20 75 72 6c 6c 69 62 32 2e 75 72 6c 6f 70   = urllib2.urlop
0fa0: 65 6e 28 75 72 6c 29 2e 72 65 61 64 28 29 0a 20  en(url).read(). 
0fb0: 20 20 20 72 65 74 75 72 6e 20 73 69 6d 70 6c 65     return simple
0fc0: 6a 73 6f 6e 2e 6c 6f 61 64 73 28 72 65 73 75 6c  json.loads(resul
0fd0: 74 73 29 0a 0a 64 65 66 20 66 65 65 64 5f 61 75  ts)..def feed_au
0fe0: 74 6f 63 6f 6d 70 6c 65 74 65 28 74 65 72 6d 29  tocomplete(term)
0ff0: 3a 0a 20 20 20 20 27 27 27 0a 20 20 20 20 0a 20  :.    '''.    . 
1000: 20 20 20 47 65 74 20 61 20 6c 69 73 74 20 6f 66     Get a list of
1010: 20 66 65 65 64 73 20 74 68 61 74 20 63 6f 6e 74   feeds that cont
1020: 61 69 6e 20 61 20 73 65 61 72 63 68 20 70 68 72  ain a search phr
1030: 61 73 65 2e 0a 20 20 20 20 20 20 20 20 53 65 61  ase..        Sea
1040: 72 63 68 65 73 20 62 79 20 66 65 65 64 20 61 64  rches by feed ad
1050: 64 72 65 73 73 2c 20 66 65 65 64 20 75 72 6c 2c  dress, feed url,
1060: 20 61 6e 64 20 66 65 65 64 20 74 69 74 6c 65 2c   and feed title,
1070: 20 69 6e 20 74 68 61 74 20 6f 72 64 65 72 2e 0a   in that order..
1080: 20 20 20 20 20 20 20 20 57 69 6c 6c 20 6f 6e 6c          Will onl
1090: 79 20 73 68 6f 77 20 73 69 74 65 73 20 77 69 74  y show sites wit
10a0: 68 20 32 2b 20 73 75 62 73 63 72 69 62 65 72 73  h 2+ subscribers
10b0: 2e 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  ..        .     
10c0: 20 20 20 27 27 27 0a 20 20 20 20 75 72 6c 20 3d     '''.    url =
10d0: 20 6e 62 5f 75 72 6c 20 2b 20 27 72 73 73 5f 66   nb_url + 'rss_f
10e0: 65 65 64 73 2f 66 65 65 64 5f 61 75 74 6f 63 6f  eeds/feed_autoco
10f0: 6d 70 6c 65 74 65 3f 25 27 0a 20 20 20 20 70 61  mplete?%'.    pa
1100: 72 61 6d 73 20 3d 20 75 72 6c 6c 69 62 2e 75 72  rams = urllib.ur
1110: 6c 65 6e 63 6f 64 65 28 7b 27 74 65 72 6d 27 3a  lencode({'term':
1120: 74 65 72 6d 7d 29 0a 20 20 20 20 72 65 73 75 6c  term}).    resul
1130: 74 73 20 3d 20 75 72 6c 6c 69 62 32 2e 75 72 6c  ts = urllib2.url
1140: 6f 70 65 6e 28 75 72 6c 20 25 20 70 61 72 61 6d  open(url % param
1150: 73 29 2e 72 65 61 64 28 29 0a 20 20 20 20 72 65  s).read().    re
1160: 74 75 72 6e 20 73 69 6d 70 6c 65 6a 73 6f 6e 2e  turn simplejson.
1170: 6c 6f 61 64 73 28 72 65 73 75 6c 74 73 29 0a 0a  loads(results)..
1180: 64 65 66 20 66 65 65 64 28 69 64 3d 31 29 3a 0a  def feed(id=1):.
1190: 20 20 20 20 27 27 27 0a 20 20 20 20 0a 20 20 20      '''.    .   
11a0: 20 52 65 74 72 69 65 76 65 20 73 74 6f 72 69 65   Retrieve storie
11b0: 73 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20  s from a single 
11c0: 66 65 65 64 2e 0a 20 20 20 20 0a 20 20 20 20 27  feed..    .    '
11d0: 27 27 0a 20 20 20 20 75 72 6c 20 3d 20 6e 62 5f  ''.    url = nb_
11e0: 75 72 6c 20 2b 20 27 72 65 61 64 65 72 2f 66 65  url + 'reader/fe
11f0: 65 64 2f 25 64 27 20 25 20 69 64 0a 20 20 20 20  ed/%d' % id.    
1200: 72 65 73 75 6c 74 73 20 3d 20 75 72 6c 6c 69 62  results = urllib
1210: 32 2e 75 72 6c 6f 70 65 6e 28 75 72 6c 29 2e 72  2.urlopen(url).r
1220: 65 61 64 28 29 0a 20 20 20 20 72 65 74 75 72 6e  ead().    return
1230: 20 73 69 6d 70 6c 65 6a 73 6f 6e 2e 6c 6f 61 64   simplejson.load
1240: 73 28 72 65 73 75 6c 74 73 29 0a 0a 64 65 66 20  s(results)..def 
1250: 73 74 61 72 72 65 64 5f 73 74 6f 72 69 65 73 28  starred_stories(
1260: 70 61 67 65 3d 31 29 3a 0a 20 20 20 20 27 27 27  page=1):.    '''
1270: 0a 20 20 20 20 0a 20 20 20 20 52 65 74 72 69 65  .    .    Retrie
1280: 76 65 20 61 20 75 73 65 72 27 73 20 73 74 61 72  ve a user's star
1290: 72 65 64 20 73 74 6f 72 69 65 73 2e 0a 20 20 20  red stories..   
12a0: 20 0a 20 20 20 20 27 27 27 0a 20 20 20 20 75 72   .    '''.    ur
12b0: 6c 20 3d 20 6e 62 5f 75 72 6c 20 2b 20 27 72 65  l = nb_url + 're
12c0: 61 64 65 72 2f 73 74 61 72 72 65 64 5f 73 74 6f  ader/starred_sto
12d0: 72 69 65 73 3f 25 73 27 0a 20 20 20 20 70 61 72  ries?%s'.    par
12e0: 61 6d 73 20 3d 20 75 72 6c 6c 69 62 2e 75 72 6c  ams = urllib.url
12f0: 65 6e 63 6f 64 65 28 7b 27 70 61 67 65 27 3a 70  encode({'page':p
1300: 61 67 65 7d 29 0a 20 20 20 20 72 65 73 75 6c 74  age}).    result
1310: 73 20 3d 20 75 72 6c 6c 69 62 32 2e 75 72 6c 6f  s = urllib2.urlo
1320: 70 65 6e 28 75 72 6c 20 25 20 70 61 72 61 6d 73  pen(url % params
1330: 29 2e 72 65 61 64 28 29 0a 20 20 20 20 72 65 74  ).read().    ret
1340: 75 72 6e 20 73 69 6d 70 6c 65 6a 73 6f 6e 2e 6c  urn simplejson.l
1350: 6f 61 64 73 28 72 65 73 75 6c 74 73 29 0a 0a 64  oads(results)..d
1360: 65 66 20 72 69 76 65 72 5f 73 74 6f 72 69 65 73  ef river_stories
1370: 28 66 65 65 64 73 2c 70 61 67 65 3d 31 2c 72 65  (feeds,page=1,re
1380: 61 64 5f 73 74 6f 72 69 65 73 5f 63 6f 75 6e 74  ad_stories_count
1390: 3d 30 29 3a 0a 20 20 20 20 27 27 27 0a 20 20 20  =0):.    '''.   
13a0: 20 0a 20 20 20 20 52 65 74 72 69 65 76 65 20 73   .    Retrieve s
13b0: 74 6f 72 69 65 73 20 66 72 6f 6d 20 61 20 63 6f  tories from a co
13c0: 6c 6c 65 63 74 69 6f 6e 20 6f 66 20 66 65 65 64  llection of feed
13d0: 73 2e 20 54 68 69 73 20 69 73 20 6b 6e 6f 77 6e  s. This is known
13e0: 20 61 73 20 74 68 65 20 52 69 76 65 72 20 6f 66   as the River of
13f0: 20 4e 65 77 73 2e 0a 20 20 20 20 20 20 20 20 53   News..        S
1400: 74 6f 72 69 65 73 20 61 72 65 20 6f 72 64 65 72  tories are order
1410: 65 64 20 69 6e 20 72 65 76 65 72 73 65 20 63 68  ed in reverse ch
1420: 72 6f 6e 6f 6c 6f 67 69 63 61 6c 20 6f 72 64 65  ronological orde
1430: 72 2e 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  r..        .    
1440: 20 20 20 20 27 27 27 0a 0a 20 20 20 20 75 72 6c      '''..    url
1450: 20 3d 20 6e 62 5f 75 72 6c 20 2b 20 27 72 65 61   = nb_url + 'rea
1460: 64 65 72 2f 72 69 76 65 72 5f 73 74 6f 72 69 65  der/river_storie
1470: 73 3f 25 73 27 0a 20 20 20 20 70 61 72 61 6d 73  s?%s'.    params
1480: 20 3d 20 75 72 6c 6c 69 62 2e 75 72 6c 65 6e 63   = urllib.urlenc
1490: 6f 64 65 28 7b 27 66 65 65 64 73 27 3a 66 65 65  ode({'feeds':fee
14a0: 64 73 2c 27 70 61 67 65 27 3a 70 61 67 65 2c 27  ds,'page':page,'
14b0: 72 65 61 64 5f 73 74 6f 72 69 65 73 5f 63 6f 75  read_stories_cou
14c0: 6e 74 27 3a 72 65 61 64 5f 73 74 6f 72 69 65 73  nt':read_stories
14d0: 5f 63 6f 75 6e 74 7d 29 0a 20 20 20 20 72 65 73  _count}).    res
14e0: 75 6c 74 73 20 3d 20 75 72 6c 6c 69 62 32 2e 75  ults = urllib2.u
14f0: 72 6c 6f 70 65 6e 28 75 72 6c 20 25 20 70 61 72  rlopen(url % par
1500: 61 6d 73 29 2e 72 65 61 64 28 29 0a 20 20 20 20  ams).read().    
1510: 72 65 74 75 72 6e 20 73 69 6d 70 6c 65 6a 73 6f  return simplejso
1520: 6e 2e 6c 6f 61 64 73 28 72 65 73 75 6c 74 73 29  n.loads(results)
1530: 0a 0a 64 65 66 20 6d 61 72 6b 5f 73 74 6f 72 79  ..def mark_story
1540: 5f 61 73 5f 72 65 61 64 28 73 74 6f 72 79 5f 69  _as_read(story_i
1550: 64 2c 66 65 65 64 5f 69 64 29 3a 0a 20 20 20 20  d,feed_id):.    
1560: 27 27 27 0a 20 20 20 20 0a 20 20 20 20 20 4d 61  '''.    .     Ma
1570: 72 6b 20 73 74 6f 72 69 65 73 20 61 73 20 72 65  rk stories as re
1580: 61 64 2e 0a 20 20 20 20 20 20 20 20 4d 75 6c 74  ad..        Mult
1590: 69 70 6c 65 20 73 74 6f 72 79 20 69 64 73 20 63  iple story ids c
15a0: 61 6e 20 62 65 20 73 65 6e 74 20 61 74 20 6f 6e  an be sent at on
15b0: 63 65 2e 0a 20 20 20 20 20 20 20 20 45 61 63 68  ce..        Each
15c0: 20 73 74 6f 72 79 20 6d 75 73 74 20 62 65 20 66   story must be f
15d0: 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 66 65 65  rom the same fee
15e0: 64 2e 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  d..        .    
15f0: 20 20 20 20 27 27 27 0a 0a 20 20 20 20 75 72 6c      '''..    url
1600: 20 3d 20 6e 62 5f 75 72 6c 20 2b 20 27 72 65 61   = nb_url + 'rea
1610: 64 65 72 2f 6d 61 72 6b 5f 73 74 6f 72 79 5f 61  der/mark_story_a
1620: 73 5f 72 65 61 64 27 0a 20 20 20 20 70 61 72 61  s_read'.    para
1630: 6d 73 20 3d 20 75 72 6c 6c 69 62 2e 75 72 6c 65  ms = urllib.urle
1640: 6e 63 6f 64 65 28 7b 27 73 74 6f 72 79 5f 69 64  ncode({'story_id
1650: 27 3a 73 74 6f 72 79 5f 69 64 2c 27 66 65 65 64  ':story_id,'feed
1660: 5f 69 64 27 3a 66 65 65 64 5f 69 64 7d 29 0a 20  _id':feed_id}). 
1670: 20 20 20 72 65 73 75 6c 74 73 20 3d 20 75 72 6c     results = url
1680: 6c 69 62 32 2e 75 72 6c 6f 70 65 6e 28 75 72 6c  lib2.urlopen(url
1690: 2c 70 61 72 61 6d 73 29 2e 72 65 61 64 28 29 0a  ,params).read().
16a0: 20 20 20 20 72 65 74 75 72 6e 20 73 69 6d 70 6c      return simpl
16b0: 65 6a 73 6f 6e 2e 6c 6f 61 64 73 28 72 65 73 75  ejson.loads(resu
16c0: 6c 74 73 29 0a 0a 64 65 66 20 6d 61 72 6b 5f 73  lts)..def mark_s
16d0: 74 6f 72 79 5f 61 73 5f 73 74 61 72 72 65 64 28  tory_as_starred(
16e0: 73 74 6f 72 79 5f 69 64 2c 66 65 65 64 5f 69 64  story_id,feed_id
16f0: 29 3a 0a 20 20 20 20 27 27 27 0a 20 20 20 20 0a  ):.    '''.    .
1700: 20 20 20 20 4d 61 72 6b 20 61 20 73 74 6f 72 79      Mark a story
1710: 20 61 73 20 73 74 61 72 72 65 64 20 28 73 61 76   as starred (sav
1720: 65 64 29 2e 0a 20 20 20 20 0a 20 20 20 20 27 27  ed)..    .    ''
1730: 27 0a 20 20 20 20 75 72 6c 20 3d 20 6e 62 5f 75  '.    url = nb_u
1740: 72 6c 20 2b 20 27 72 65 61 64 65 72 2f 6d 61 72  rl + 'reader/mar
1750: 6b 5f 73 74 6f 72 79 5f 61 73 5f 73 74 61 72 72  k_story_as_starr
1760: 65 64 27 0a 20 20 20 20 70 61 72 61 6d 73 20 3d  ed'.    params =
1770: 20 75 72 6c 6c 69 62 2e 75 72 6c 65 6e 63 6f 64   urllib.urlencod
1780: 65 28 7b 27 73 74 6f 72 79 5f 69 64 27 3a 73 74  e({'story_id':st
1790: 6f 72 79 5f 69 64 2c 27 66 65 65 64 5f 69 64 27  ory_id,'feed_id'
17a0: 3a 66 65 65 64 5f 69 64 7d 29 0a 20 20 20 20 72  :feed_id}).    r
17b0: 65 73 75 6c 74 73 20 3d 20 75 72 6c 6c 69 62 32  esults = urllib2
17c0: 2e 75 72 6c 6f 70 65 6e 28 75 72 6c 2c 70 61 72  .urlopen(url,par
17d0: 61 6d 73 29 2e 72 65 61 64 28 29 0a 20 20 20 20  ams).read().    
17e0: 72 65 74 75 72 6e 20 73 69 6d 70 6c 65 6a 73 6f  return simplejso
17f0: 6e 2e 6c 6f 61 64 73 28 72 65 73 75 6c 74 73 29  n.loads(results)
1800: 0a 0a 64 65 66 20 6d 61 72 6b 5f 61 6c 6c 5f 61  ..def mark_all_a
1810: 73 5f 72 65 61 64 28 64 61 79 73 3d 30 29 3a 0a  s_read(days=0):.
1820: 20 20 20 20 27 27 27 0a 20 20 20 20 0a 20 20 20      '''.    .   
1830: 20 4d 61 72 6b 20 61 6c 6c 20 73 74 6f 72 69 65   Mark all storie
1840: 73 20 69 6e 20 61 20 66 65 65 64 20 6f 72 20 6c  s in a feed or l
1850: 69 73 74 20 6f 66 20 66 65 65 64 73 20 61 73 20  ist of feeds as 
1860: 72 65 61 64 2e 0a 20 20 20 20 0a 20 20 20 20 27  read..    .    '
1870: 27 27 0a 20 20 20 20 75 72 6c 20 3d 20 6e 62 5f  ''.    url = nb_
1880: 75 72 6c 20 2b 20 27 72 65 61 64 65 72 2f 6d 61  url + 'reader/ma
1890: 72 6b 5f 61 6c 6c 5f 61 73 5f 72 65 61 64 27 0a  rk_all_as_read'.
18a0: 20 20 20 20 70 61 72 61 6d 73 20 3d 20 75 72 6c      params = url
18b0: 6c 69 62 2e 75 72 6c 65 6e 63 6f 64 65 28 7b 27  lib.urlencode({'
18c0: 64 61 79 73 27 3a 64 61 79 73 7d 29 0a 20 20 20  days':days}).   
18d0: 20 72 65 73 75 6c 74 73 20 3d 20 75 72 6c 6c 69   results = urlli
18e0: 62 32 2e 75 72 6c 6f 70 65 6e 28 75 72 6c 2c 70  b2.urlopen(url,p
18f0: 61 72 61 6d 73 29 2e 72 65 61 64 28 29 0a 20 20  arams).read().  
1900: 20 20 72 65 74 75 72 6e 20 73 69 6d 70 6c 65 6a    return simplej
1910: 73 6f 6e 2e 6c 6f 61 64 73 28 72 65 73 75 6c 74  son.loads(result
1920: 73 29 0a 0a 64 65 66 20 61 64 64 5f 75 72 6c 28  s)..def add_url(
1930: 75 72 6c 2c 66 6f 6c 64 65 72 3d 27 5b 54 6f 70  url,folder='[Top
1940: 20 4c 65 76 65 6c 5d 27 29 3a 0a 20 20 20 20 27   Level]'):.    '
1950: 27 27 0a 20 20 20 20 0a 20 20 20 20 41 64 64 20  ''.    .    Add 
1960: 61 20 66 65 65 64 20 62 79 20 69 74 73 20 55 52  a feed by its UR
1970: 4c 2e 20 0a 20 20 20 20 43 61 6e 20 62 65 20 65  L. .    Can be e
1980: 69 74 68 65 72 20 74 68 65 20 52 53 53 20 66 65  ither the RSS fe
1990: 65 64 20 6f 72 20 74 68 65 20 77 65 62 73 69 74  ed or the websit
19a0: 65 20 69 74 73 65 6c 66 2e 0a 20 20 20 20 0a 20  e itself..    . 
19b0: 20 20 20 27 27 27 0a 20 20 20 20 75 72 6c 20 3d     '''.    url =
19c0: 20 6e 62 5f 75 72 6c 20 2b 20 27 72 65 61 64 65   nb_url + 'reade
19d0: 72 2f 61 64 64 5f 75 72 6c 27 0a 20 20 20 20 70  r/add_url'.    p
19e0: 61 72 61 6d 73 20 3d 20 75 72 6c 6c 69 62 2e 75  arams = urllib.u
19f0: 72 6c 65 6e 63 6f 64 65 28 7b 27 75 72 6c 27 3a  rlencode({'url':
1a00: 75 72 6c 2c 27 66 6f 6c 64 65 72 27 3a 66 6f 6c  url,'folder':fol
1a10: 64 65 72 7d 29 0a 20 20 20 20 72 65 73 75 6c 74  der}).    result
1a20: 73 20 3d 20 75 72 6c 6c 69 62 32 2e 75 72 6c 6f  s = urllib2.urlo
1a30: 70 65 6e 28 75 72 6c 2c 70 61 72 61 6d 73 29 2e  pen(url,params).
1a40: 72 65 61 64 28 29 0a 20 20 20 20 72 65 74 75 72  read().    retur
1a50: 6e 20 73 69 6d 70 6c 65 6a 73 6f 6e 2e 6c 6f 61  n simplejson.loa
1a60: 64 73 28 72 65 73 75 6c 74 73 29 0a 0a 0a 64 65  ds(results)...de
1a70: 66 20 61 64 64 5f 66 6f 6c 64 65 72 28 66 6f 6c  f add_folder(fol
1a80: 64 65 72 2c 70 61 72 65 6e 74 5f 66 6f 6c 64 65  der,parent_folde
1a90: 72 3d 27 5b 54 6f 70 20 4c 65 76 65 6c 5d 27 29  r='[Top Level]')
1aa0: 3a 0a 20 20 20 20 27 27 27 0a 20 20 20 20 0a 20  :.    '''.    . 
1ab0: 20 20 20 41 64 64 20 61 20 6e 65 77 20 66 6f 6c     Add a new fol
1ac0: 64 65 72 2e 0a 20 20 20 20 0a 20 20 20 20 27 27  der..    .    ''
1ad0: 27 0a 20 20 20 20 0a 20 20 20 20 75 72 6c 20 3d  '.    .    url =
1ae0: 20 6e 62 5f 75 72 6c 20 2b 20 27 72 65 61 64 65   nb_url + 'reade
1af0: 72 2f 61 64 64 5f 66 6f 6c 64 65 72 27 0a 20 20  r/add_folder'.  
1b00: 20 20 70 61 72 61 6d 73 20 3d 20 75 72 6c 6c 69    params = urlli
1b10: 62 2e 75 72 6c 65 6e 63 6f 64 65 28 7b 27 66 6f  b.urlencode({'fo
1b20: 6c 64 65 72 27 3a 66 6f 6c 64 65 72 2c 27 70 61  lder':folder,'pa
1b30: 72 65 6e 74 5f 66 6f 6c 64 65 72 27 3a 70 61 72  rent_folder':par
1b40: 65 6e 74 5f 66 6f 6c 64 65 72 7d 29 0a 20 20 20  ent_folder}).   
1b50: 20 72 65 73 75 6c 74 73 20 3d 20 75 72 6c 6c 69   results = urlli
1b60: 62 32 2e 75 72 6c 6f 70 65 6e 28 75 72 6c 2c 70  b2.urlopen(url,p
1b70: 61 72 61 6d 73 29 2e 72 65 61 64 28 29 0a 20 20  arams).read().  
1b80: 20 20 72 65 74 75 72 6e 20 73 69 6d 70 6c 65 6a    return simplej
1b90: 73 6f 6e 2e 6c 6f 61 64 73 28 72 65 73 75 6c 74  son.loads(result
1ba0: 73 29 0a 0a 64 65 66 20 72 65 6e 61 6d 65 5f 66  s)..def rename_f
1bb0: 65 65 64 28 66 65 65 64 5f 74 69 74 6c 65 2c 66  eed(feed_title,f
1bc0: 65 65 64 5f 69 64 29 3a 0a 20 20 20 20 27 27 27  eed_id):.    '''
1bd0: 0a 20 20 20 20 0a 20 20 20 20 52 65 6e 61 6d 65  .    .    Rename
1be0: 20 61 20 66 65 65 64 20 74 69 74 6c 65 2e 20 4f   a feed title. O
1bf0: 6e 6c 79 20 74 68 65 20 63 75 72 72 65 6e 74 20  nly the current 
1c00: 75 73 65 72 20 77 69 6c 6c 20 73 65 65 20 74 68  user will see th
1c10: 65 20 6e 65 77 20 74 69 74 6c 65 2e 0a 20 20 20  e new title..   
1c20: 20 0a 20 20 20 20 27 27 27 0a 20 20 20 20 75 72   .    '''.    ur
1c30: 6c 20 3d 20 6e 62 5f 75 72 6c 20 2b 20 27 72 65  l = nb_url + 're
1c40: 61 64 65 72 2f 72 65 6e 61 6d 65 5f 66 65 65 64  ader/rename_feed
1c50: 27 0a 20 20 20 20 70 61 72 61 6d 73 20 3d 20 75  '.    params = u
1c60: 72 6c 6c 69 62 2e 75 72 6c 65 6e 63 6f 64 65 28  rllib.urlencode(
1c70: 7b 27 66 65 65 64 5f 74 69 74 6c 65 27 3a 66 65  {'feed_title':fe
1c80: 65 64 5f 74 69 74 6c 65 2c 27 66 65 65 64 5f 69  ed_title,'feed_i
1c90: 64 27 3a 66 65 65 64 5f 69 64 7d 29 0a 20 20 20  d':feed_id}).   
1ca0: 20 72 65 73 75 6c 74 73 20 3d 20 75 72 6c 6c 69   results = urlli
1cb0: 62 32 2e 75 72 6c 6f 70 65 6e 28 75 72 6c 2c 70  b2.urlopen(url,p
1cc0: 61 72 61 6d 73 29 2e 72 65 61 64 28 29 0a 20 20  arams).read().  
1cd0: 20 20 72 65 74 75 72 6e 20 73 69 6d 70 6c 65 6a    return simplej
1ce0: 73 6f 6e 2e 6c 6f 61 64 73 28 72 65 73 75 6c 74  son.loads(result
1cf0: 73 29 0a 0a 64 65 66 20 64 65 6c 65 74 65 5f 66  s)..def delete_f
1d00: 65 65 64 28 66 65 65 64 5f 69 64 2c 69 6e 5f 66  eed(feed_id,in_f
1d10: 6f 6c 64 65 72 29 3a 0a 20 20 20 20 27 27 27 0a  older):.    '''.
1d20: 20 20 20 20 0a 20 20 20 20 55 6e 73 75 62 73 63      .    Unsubsc
1d30: 72 69 62 65 20 66 72 6f 6d 20 61 20 66 65 65 64  ribe from a feed
1d40: 2e 20 52 65 6d 6f 76 65 73 20 69 74 20 66 72 6f  . Removes it fro
1d50: 6d 20 74 68 65 20 66 6f 6c 64 65 72 2e 0a 20 20  m the folder..  
1d60: 20 20 20 20 20 20 53 65 74 20 74 68 65 20 69 6e        Set the in
1d70: 5f 66 6f 6c 64 65 72 20 70 61 72 61 6d 65 74 65  _folder paramete
1d80: 72 20 74 6f 20 72 65 6d 6f 76 65 20 61 20 66 65  r to remove a fe
1d90: 65 64 20 66 72 6f 6d 20 74 68 65 20 63 6f 72 72  ed from the corr
1da0: 65 63 74 20 66 6f 6c 64 65 72 2c 20 69 6e 20 63  ect folder, in c
1db0: 61 73 65 20 74 68 65 20 75 73 65 72 20 69 73 20  ase the user is 
1dc0: 73 75 62 73 63 72 69 62 65 64 20 74 6f 20 74 68  subscribed to th
1dd0: 65 20 66 65 65 64 20 69 6e 20 6d 75 6c 74 69 70  e feed in multip
1de0: 6c 65 20 66 6f 6c 64 65 72 73 2e 0a 0a 20 20 20  le folders...   
1df0: 20 20 20 20 20 27 27 27 20 20 20 20 0a 20 20 20       '''    .   
1e00: 20 75 72 6c 20 3d 20 6e 62 5f 75 72 6c 20 2b 20   url = nb_url + 
1e10: 27 72 65 61 64 65 72 2f 64 65 6c 65 74 65 5f 66  'reader/delete_f
1e20: 65 65 64 27 0a 20 20 20 20 70 61 72 61 6d 73 20  eed'.    params 
1e30: 3d 20 75 72 6c 6c 69 62 2e 75 72 6c 65 6e 63 6f  = urllib.urlenco
1e40: 64 65 28 7b 27 66 65 65 64 5f 69 64 27 3a 66 65  de({'feed_id':fe
1e50: 65 64 5f 69 64 2c 27 69 6e 5f 66 6f 6c 64 65 72  ed_id,'in_folder
1e60: 27 3a 69 6e 5f 66 6f 6c 64 65 72 7d 29 0a 20 20  ':in_folder}).  
1e70: 20 20 72 65 73 75 6c 74 73 20 3d 20 75 72 6c 6c    results = urll
1e80: 69 62 32 2e 75 72 6c 6f 70 65 6e 28 75 72 6c 2c  ib2.urlopen(url,
1e90: 70 61 72 61 6d 73 29 2e 72 65 61 64 28 29 0a 20  params).read(). 
1ea0: 20 20 20 72 65 74 75 72 6e 20 73 69 6d 70 6c 65     return simple
1eb0: 6a 73 6f 6e 2e 6c 6f 61 64 73 28 72 65 73 75 6c  json.loads(resul
1ec0: 74 73 29 0a 0a 64 65 66 20 72 65 6e 61 6d 65 5f  ts)..def rename_
1ed0: 66 6f 6c 64 65 72 28 66 6f 6c 64 65 72 5f 74 6f  folder(folder_to
1ee0: 5f 72 65 6e 61 6d 65 2c 6e 65 77 5f 66 6f 6c 64  _rename,new_fold
1ef0: 65 72 5f 6e 61 6d 65 2c 69 6e 5f 66 6f 6c 64 65  er_name,in_folde
1f00: 72 29 3a 0a 20 20 20 20 27 27 27 0a 20 20 20 20  r):.    '''.    
1f10: 0a 20 20 20 20 52 65 6e 61 6d 65 20 61 20 66 6f  .    Rename a fo
1f20: 6c 64 65 72 2e 0a 20 20 20 20 0a 20 20 20 20 27  lder..    .    '
1f30: 27 27 0a 20 20 20 20 75 72 6c 20 3d 20 6e 62 5f  ''.    url = nb_
1f40: 75 72 6c 20 2b 20 27 72 65 61 64 65 72 2f 72 65  url + 'reader/re
1f50: 6e 61 6d 65 5f 66 6f 6c 64 65 72 27 0a 20 20 20  name_folder'.   
1f60: 20 70 61 72 61 6d 73 20 3d 20 75 72 6c 6c 69 62   params = urllib
1f70: 2e 75 72 6c 65 6e 63 6f 64 65 28 7b 27 66 6f 6c  .urlencode({'fol
1f80: 64 65 72 5f 74 6f 5f 72 65 6e 61 6d 65 27 3a 66  der_to_rename':f
1f90: 6f 6c 64 65 72 5f 74 6f 5f 72 65 6e 61 6d 65 2c  older_to_rename,
1fa0: 27 6e 65 77 5f 66 6f 6c 64 65 72 5f 6e 61 6d 65  'new_folder_name
1fb0: 27 3a 6e 65 77 5f 66 6f 6c 64 65 72 5f 6e 61 6d  ':new_folder_nam
1fc0: 65 2c 27 69 6e 5f 66 6f 6c 64 65 72 27 3a 69 6e  e,'in_folder':in
1fd0: 5f 66 6f 6c 64 65 72 7d 29 0a 20 20 20 20 72 65  _folder}).    re
1fe0: 73 75 6c 74 73 20 3d 20 75 72 6c 6c 69 62 32 2e  sults = urllib2.
1ff0: 75 72 6c 6f 70 65 6e 28 75 72 6c 2c 70 61 72 61  urlopen(url,para
2000: 6d 73 29 2e 72 65 61 64 28 29 0a 20 20 20 20 72  ms).read().    r
2010: 65 74 75 72 6e 20 73 69 6d 70 6c 65 6a 73 6f 6e  eturn simplejson
2020: 2e 6c 6f 61 64 73 28 72 65 73 75 6c 74 73 29 0a  .loads(results).
2030: 0a 64 65 66 20 64 65 6c 65 74 65 5f 66 6f 6c 64  .def delete_fold
2040: 65 72 28 66 6f 6c 64 65 72 5f 74 6f 5f 64 65 6c  er(folder_to_del
2050: 65 74 65 2c 69 6e 5f 66 6f 6c 64 65 72 2c 66 65  ete,in_folder,fe
2060: 65 64 5f 69 64 29 3a 0a 20 20 20 20 27 27 27 0a  ed_id):.    '''.
2070: 20 20 20 20 0a 20 20 20 20 44 65 6c 65 74 65 20      .    Delete 
2080: 61 20 66 6f 6c 64 65 72 20 61 6e 64 20 75 6e 73  a folder and uns
2090: 75 62 73 63 72 69 62 65 20 66 72 6f 6d 20 61 6c  ubscribe from al
20a0: 6c 20 66 65 65 64 73 20 69 6e 73 69 64 65 2e 0a  l feeds inside..
20b0: 20 20 20 20 0a 20 20 20 20 27 27 27 0a 20 20 20      .    '''.   
20c0: 20 75 72 6c 20 3d 20 6e 62 5f 75 72 6c 20 2b 20   url = nb_url + 
20d0: 27 72 65 61 64 65 72 2f 64 65 6c 65 74 65 5f 66  'reader/delete_f
20e0: 6f 6c 64 65 72 27 0a 20 20 20 20 70 61 72 61 6d  older'.    param
20f0: 73 20 3d 20 75 72 6c 6c 69 62 2e 75 72 6c 65 6e  s = urllib.urlen
2100: 63 6f 64 65 28 7b 27 66 6f 6c 64 65 72 5f 74 6f  code({'folder_to
2110: 5f 64 65 6c 65 74 65 27 3a 66 6f 6c 64 65 72 5f  _delete':folder_
2120: 74 6f 5f 64 65 6c 65 74 65 2c 27 69 6e 5f 66 6f  to_delete,'in_fo
2130: 6c 64 65 72 27 3a 69 6e 5f 66 6f 6c 64 65 72 2c  lder':in_folder,
2140: 27 66 65 65 64 5f 69 64 27 3a 66 65 65 64 5f 69  'feed_id':feed_i
2150: 64 7d 29 0a 20 20 20 20 72 65 73 75 6c 74 73 20  d}).    results 
2160: 3d 20 75 72 6c 6c 69 62 32 2e 75 72 6c 6f 70 65  = urllib2.urlope
2170: 6e 28 75 72 6c 2c 70 61 72 61 6d 73 29 2e 72 65  n(url,params).re
2180: 61 64 28 29 0a 20 20 20 20 72 65 74 75 72 6e 20  ad().    return 
2190: 73 69 6d 70 6c 65 6a 73 6f 6e 2e 6c 6f 61 64 73  simplejson.loads
21a0: 28 72 65 73 75 6c 74 73 29 0a 0a 0a 64 65 66 20  (results)...def 
21b0: 6d 61 72 6b 5f 66 65 65 64 5f 61 73 5f 72 65 61  mark_feed_as_rea
21c0: 64 28 66 65 65 64 5f 69 64 29 3a 0a 20 20 20 20  d(feed_id):.    
21d0: 27 27 27 0a 20 20 20 20 0a 20 20 20 20 4d 61 72  '''.    .    Mar
21e0: 6b 20 61 20 6c 69 73 74 20 6f 66 20 66 65 65 64  k a list of feed
21f0: 73 20 61 73 20 72 65 61 64 2e 0a 20 20 20 20 0a  s as read..    .
2200: 20 20 20 20 27 27 27 0a 20 20 20 20 75 72 6c 20      '''.    url 
2210: 3d 20 6e 62 5f 75 72 6c 20 2b 20 27 72 65 61 64  = nb_url + 'read
2220: 65 72 2f 6d 61 72 6b 5f 66 65 65 64 5f 61 73 5f  er/mark_feed_as_
2230: 72 65 61 64 27 0a 20 20 20 20 70 61 72 61 6d 73  read'.    params
2240: 20 3d 20 75 72 6c 6c 69 62 2e 75 72 6c 65 6e 63   = urllib.urlenc
2250: 6f 64 65 28 7b 27 66 65 65 64 5f 69 64 27 3a 66  ode({'feed_id':f
2260: 65 65 64 5f 69 64 7d 29 0a 20 20 20 20 72 65 73  eed_id}).    res
2270: 75 6c 74 73 20 3d 20 75 72 6c 6c 69 62 32 2e 75  ults = urllib2.u
2280: 72 6c 6f 70 65 6e 28 75 72 6c 2c 70 61 72 61 6d  rlopen(url,param
2290: 73 29 2e 72 65 61 64 28 29 0a 20 20 20 20 72 65  s).read().    re
22a0: 74 75 72 6e 20 73 69 6d 70 6c 65 6a 73 6f 6e 2e  turn simplejson.
22b0: 6c 6f 61 64 73 28 72 65 73 75 6c 74 73 29 0a 0a  loads(results)..
22c0: 0a 64 65 66 20 73 61 76 65 5f 66 65 65 64 5f 6f  .def save_feed_o
22d0: 72 64 65 72 28 66 6f 6c 64 65 72 73 29 3a 0a 20  rder(folders):. 
22e0: 20 20 20 27 27 27 0a 20 20 20 20 0a 20 20 20 20     '''.    .    
22f0: 52 65 6f 72 64 65 72 20 66 65 65 64 73 20 61 6e  Reorder feeds an
2300: 64 20 6d 6f 76 65 20 74 68 65 6d 20 61 72 6f 75  d move them arou
2310: 6e 64 20 62 65 74 77 65 65 6e 20 66 6f 6c 64 65  nd between folde
2320: 72 73 2e 0a 20 20 20 20 20 20 20 20 54 68 65 20  rs..        The 
2330: 65 6e 74 69 72 65 20 66 6f 6c 64 65 72 20 73 74  entire folder st
2340: 72 75 63 74 75 72 65 20 6e 65 65 64 73 20 74 6f  ructure needs to
2350: 20 62 65 20 73 65 72 69 61 6c 69 7a 65 64 2e 0a   be serialized..
2360: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
2370: 20 27 27 27 0a 0a 20 20 20 20 75 72 6c 20 3d 20   '''..    url = 
2380: 6e 62 5f 75 72 6c 20 2b 20 27 72 65 61 64 65 72  nb_url + 'reader
2390: 2f 73 61 76 65 5f 66 65 65 64 5f 6f 72 64 65 72  /save_feed_order
23a0: 27 0a 20 20 20 20 70 61 72 61 6d 73 20 3d 20 75  '.    params = u
23b0: 72 6c 6c 69 62 2e 75 72 6c 65 6e 63 6f 64 65 28  rllib.urlencode(
23c0: 7b 27 66 6f 6c 64 65 72 73 27 3a 66 6f 6c 64 65  {'folders':folde
23d0: 72 73 7d 29 0a 20 20 20 20 72 65 73 75 6c 74 73  rs}).    results
23e0: 20 3d 20 75 72 6c 6c 69 62 32 2e 75 72 6c 6f 70   = urllib2.urlop
23f0: 65 6e 28 75 72 6c 2c 70 61 72 61 6d 73 29 2e 72  en(url,params).r
2400: 65 61 64 28 29 0a 20 20 20 20 72 65 74 75 72 6e  ead().    return
2410: 20 73 69 6d 70 6c 65 6a 73 6f 6e 2e 6c 6f 61 64   simplejson.load
2420: 73 28 72 65 73 75 6c 74 73 29 0a 0a 0a 64 65 66  s(results)...def
2430: 20 63 6c 61 73 73 69 66 69 65 72 28 69 64 5f 6e   classifier(id_n
2440: 6f 29 3a 0a 20 20 20 20 27 27 27 0a 20 20 20 20  o):.    '''.    
2450: 0a 20 20 20 20 20 20 20 20 47 65 74 20 74 68 65  .        Get the
2460: 20 69 6e 74 65 6c 6c 69 67 65 6e 63 65 20 63 6c   intelligence cl
2470: 61 73 73 69 66 69 65 72 73 20 66 6f 72 20 61 20  assifiers for a 
2480: 75 73 65 72 27 73 20 73 69 74 65 2e 0a 20 20 20  user's site..   
2490: 20 20 20 20 20 4f 6e 6c 79 20 69 6e 63 6c 75 64       Only includ
24a0: 65 73 20 74 68 65 20 75 73 65 72 27 73 20 6f 77  es the user's ow
24b0: 6e 20 63 6c 61 73 73 69 66 69 65 72 73 2e 20 0a  n classifiers. .
24c0: 20 20 20 20 20 20 20 20 55 73 65 20 2f 72 65 61          Use /rea
24d0: 64 65 72 2f 66 65 65 64 73 5f 74 72 61 69 6e 65  der/feeds_traine
24e0: 72 20 66 6f 72 20 70 6f 70 75 6c 61 72 20 63 6c  r for popular cl
24f0: 61 73 73 69 66 69 65 72 73 2e 0a 20 20 20 20 20  assifiers..     
2500: 20 20 20 0a 20 20 20 20 20 20 20 20 27 27 27 0a     .        '''.
2510: 0a 20 20 20 20 75 72 6c 20 3d 20 6e 62 5f 75 72  .    url = nb_ur
2520: 6c 20 2b 20 27 63 6c 61 73 73 69 66 69 65 72 2f  l + 'classifier/
2530: 25 64 27 20 25 20 69 64 5f 6e 6f 0a 20 20 20 20  %d' % id_no.    
2540: 72 65 73 75 6c 74 73 20 3d 20 75 72 6c 6c 69 62  results = urllib
2550: 32 2e 75 72 6c 6f 70 65 6e 28 75 72 6c 29 2e 72  2.urlopen(url).r
2560: 65 61 64 28 29 0a 20 20 20 20 72 65 74 75 72 6e  ead().    return
2570: 20 73 69 6d 70 6c 65 6a 73 6f 6e 2e 6c 6f 61 64   simplejson.load
2580: 73 28 72 65 73 75 6c 74 73 29 0a 0a 0a 64 65 66  s(results)...def
2590: 20 63 6c 61 73 73 69 66 69 65 72 5f 73 61 76 65   classifier_save
25a0: 28 6c 69 6b 65 5f 74 79 70 65 2c 64 69 73 6c 69  (like_type,disli
25b0: 6b 65 5f 74 79 70 65 2c 72 65 6d 6f 76 65 5f 6c  ke_type,remove_l
25c0: 69 6b 65 5f 74 79 70 65 2c 72 65 6d 6f 76 65 5f  ike_type,remove_
25d0: 64 69 73 6c 69 6b 65 5f 74 79 70 65 29 3a 0a 20  dislike_type):. 
25e0: 20 20 20 27 27 27 0a 20 20 20 20 0a 20 20 20 20     '''.    .    
25f0: 53 61 76 65 20 69 6e 74 65 6c 6c 69 67 65 6e 63  Save intelligenc
2600: 65 20 63 6c 61 73 73 69 66 69 65 72 73 20 28 74  e classifiers (t
2610: 61 67 73 2c 20 74 69 74 6c 65 73 2c 20 61 75 74  ags, titles, aut
2620: 68 6f 72 73 2c 20 61 6e 64 20 74 68 65 20 66 65  hors, and the fe
2630: 65 64 29 20 66 6f 72 20 61 20 66 65 65 64 2e 0a  ed) for a feed..
2640: 20 20 20 20 0a 20 20 20 20 20 20 20 20 27 27 27      .        '''
2650: 0a 20 20 20 20 75 72 6c 20 3d 20 6e 62 5f 75 72  .    url = nb_ur
2660: 6c 20 2b 20 27 63 6c 61 73 73 69 66 69 65 72 2f  l + 'classifier/
2670: 73 61 76 65 27 0a 20 20 20 20 70 61 72 61 6d 73  save'.    params
2680: 20 3d 20 75 72 6c 6c 69 62 2e 75 72 6c 65 6e 63   = urllib.urlenc
2690: 6f 64 65 28 7b 27 6c 69 6b 65 5f 5b 54 59 50 45  ode({'like_[TYPE
26a0: 5d 27 3a 6c 69 6b 65 5f 74 79 70 65 2c 0a 20 20  ]':like_type,.  
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c0: 20 27 64 69 73 6c 69 6b 65 5f 5b 54 59 50 45 5d   'dislike_[TYPE]
26d0: 27 3a 64 69 73 6c 69 6b 65 5f 74 79 70 65 2c 0a  ':dislike_type,.
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f0: 20 20 20 20 27 72 65 6d 6f 76 65 5f 6c 69 6b 65      'remove_like
2700: 5f 5b 54 59 50 45 5d 27 3a 72 65 6d 6f 76 65 5f  _[TYPE]':remove_
2710: 6c 69 6b 65 5f 74 79 70 65 2c 0a 20 20 20 20 20  like_type,.     
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 27 72                'r
2730: 65 6d 6f 76 65 5f 64 69 73 6c 69 6b 65 5f 5b 54  emove_dislike_[T
2740: 59 50 45 5d 27 3a 72 65 6d 6f 76 65 5f 64 69 73  YPE]':remove_dis
2750: 6c 69 6b 65 5f 74 79 70 65 7d 29 0a 20 20 20 20  like_type}).    
2760: 72 65 73 75 6c 74 73 20 3d 20 75 72 6c 6c 69 62  results = urllib
2770: 32 2e 75 72 6c 6f 70 65 6e 28 75 72 6c 2c 70 61  2.urlopen(url,pa
2780: 72 61 6d 73 29 2e 72 65 61 64 28 29 0a 20 20 20  rams).read().   
2790: 20 72 65 74 75 72 6e 20 73 69 6d 70 6c 65 6a 73   return simplejs
27a0: 6f 6e 2e 6c 6f 61 64 73 28 72 65 73 75 6c 74 73  on.loads(results
27b0: 29 0a 0a 0a 64 65 66 20 6f 70 6d 6c 5f 65 78 70  )...def opml_exp
27c0: 6f 72 74 28 29 3a 0a 20 20 20 20 27 27 27 0a 20  ort():.    '''. 
27d0: 20 20 20 0a 20 20 20 20 44 6f 77 6e 6c 6f 61 64     .    Download
27e0: 20 61 20 62 61 63 6b 75 70 20 6f 66 20 66 65 65   a backup of fee
27f0: 64 73 20 61 6e 64 20 66 6f 6c 64 65 72 73 20 61  ds and folders a
2800: 73 20 61 6e 20 4f 50 4d 4c 20 66 69 6c 65 2e 0a  s an OPML file..
2810: 20 20 20 20 20 20 20 20 43 6f 6e 74 61 69 6e 73          Contains
2820: 20 66 6f 6c 64 65 72 73 20 61 6e 64 20 66 65 65   folders and fee
2830: 64 73 20 69 6e 20 58 4d 4c 3b 20 75 73 65 66 75  ds in XML; usefu
2840: 6c 20 66 6f 72 20 69 6d 70 6f 72 74 69 6e 67 20  l for importing 
2850: 69 6e 20 61 6e 6f 74 68 65 72 20 52 53 53 20 72  in another RSS r
2860: 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20 0a  eader..        .
2870: 20 20 20 20 20 20 20 20 27 27 27 0a 20 20 20 20          '''.    
2880: 75 72 6c 20 3d 20 6e 62 5f 75 72 6c 20 2b 20 27  url = nb_url + '
2890: 69 6d 70 6f 72 74 2f 6f 70 6d 6c 5f 65 78 70 6f  import/opml_expo
28a0: 72 74 27 0a 20 20 20 20 72 65 73 75 6c 74 73 20  rt'.    results 
28b0: 3d 20 75 72 6c 6c 69 62 32 2e 75 72 6c 6f 70 65  = urllib2.urlope
28c0: 6e 28 75 72 6c 29 2e 72 65 61 64 28 29 0a 20 20  n(url).read().  
28d0: 20 20 72 65 74 75 72 6e 20 73 69 6d 70 6c 65 6a    return simplej
28e0: 73 6f 6e 2e 6c 6f 61 64 73 28 72 65 73 75 6c 74  son.loads(result
28f0: 73 29 0a 0a 0a 0a 64 65 66 20 6f 70 6d 6c 5f 75  s)....def opml_u
2900: 70 6c 6f 61 64 28 6f 70 6d 6c 5f 66 69 6c 65 29  pload(opml_file)
2910: 3a 0a 20 20 20 20 27 27 27 0a 20 20 20 20 0a 20  :.    '''.    . 
2920: 20 20 20 55 70 6c 6f 61 64 20 61 6e 20 4f 50 4d     Upload an OPM
2930: 4c 20 66 69 6c 65 2e 0a 20 20 20 20 0a 20 20 20  L file..    .   
2940: 20 27 27 27 0a 20 20 20 20 75 72 6c 20 3d 20 6e   '''.    url = n
2950: 62 5f 75 72 6c 20 2b 20 27 69 6d 70 6f 72 74 2f  b_url + 'import/
2960: 6f 70 6d 6c 5f 75 70 6c 6f 61 64 27 0a 20 20 20  opml_upload'.   
2970: 20 66 20 3d 20 6f 70 65 6e 28 6f 70 6d 6c 5f 66   f = open(opml_f
2980: 69 6c 65 29 0a 20 20 20 20 70 61 72 61 6d 73 20  ile).    params 
2990: 3d 20 75 72 6c 6c 69 62 2e 75 72 6c 65 6e 63 6f  = urllib.urlenco
29a0: 64 65 28 7b 27 66 69 6c 65 27 3a 66 7d 29 0a 20  de({'file':f}). 
29b0: 20 20 20 66 2e 63 6c 6f 73 65 28 29 0a 20 20 20     f.close().   
29c0: 20 72 65 73 75 6c 74 73 20 3d 20 75 72 6c 6c 69   results = urlli
29d0: 62 32 2e 75 72 6c 6f 70 65 6e 28 75 72 6c 2c 70  b2.urlopen(url,p
29e0: 61 72 61 6d 73 29 2e 72 65 61 64 28 29 0a 20 20  arams).read().  
29f0: 20 20 72 65 74 75 72 6e 20 73 69 6d 70 6c 65 6a    return simplej
2a00: 73 6f 6e 2e 6c 6f 61 64 73 28 72 65 73 75 6c 74  son.loads(result
2a10: 73 29 0a                                         s).