Add Pocket support
authorLnAlex <contact@alexandrelion.com>
Mon, 3 Aug 2015 19:54:16 +0000 (21:54 +0200)
committerLnAlex <contact@alexandrelion.com>
Mon, 3 Aug 2015 19:54:16 +0000 (21:54 +0200)
- You can now link your Pocket account to add a tweet in your "read for later" list.

- By default, Pocket support is disabled. You need to enable it with : config POCKET_SUPPORT = true .

docs/index.rst
rainbowstream/colorset/config
rainbowstream/rainbow.py
setup.py

index 5152f4fd22065d7b220873b58494c60b47f59f73..6e85da0f033b8f817d9c7694106c2fa85d39c03c 100644 (file)
@@ -170,6 +170,8 @@ Here is full list of supported command:
 \r
 -  ``open 12`` will open url in tweet with *[id=12]* in your OS’s default browser.\r
 \r
 \r
 -  ``open 12`` will open url in tweet with *[id=12]* in your OS’s default browser.\r
 \r
+-  ``pt 12`` will add tweet with *[id=12]* in your Pocket list.\r
+\r
 **Direct Messages Commands**\r
 \r
 -  ``inbox`` will show inbox messages. ``inbox 7`` will show newest 7 messages.\r
 **Direct Messages Commands**\r
 \r
 -  ``inbox`` will show inbox messages. ``inbox 7`` will show newest 7 messages.\r
@@ -400,6 +402,8 @@ You also can view or set a new value of every config key by ``config`` command (
     + ``#recipient_name``: Message's recipient name\r
     + ``#recipient_nick``: Message's recipient screen name\r
 \r
     + ``#recipient_name``: Message's recipient name\r
     + ``#recipient_nick``: Message's recipient screen name\r
 \r
+- ``POCKET_SUPPORT`` : enable Pocket support.\r
+\r
 In every format, you can use unicode characters like ``\u2665``.\r
 Mac users also can use emoji characters as well (Ex: ``::zap::``).\r
 See `Emoji cheatsheet`_ for details.\r
 In every format, you can use unicode characters like ``\u2665``.\r
 Mac users also can use emoji characters as well (Ex: ``::zap::``).\r
 See `Emoji cheatsheet`_ for details.\r
@@ -421,6 +425,7 @@ steps
        # Consumer information\r
        CONSUMER_KEY = 'APIKey' # Your Twitter application's API key\r
        CONSUMER_SECRET = 'APISecret' # Your Twitter application's API secret\r
        # Consumer information\r
        CONSUMER_KEY = 'APIKey' # Your Twitter application's API key\r
        CONSUMER_SECRET = 'APISecret' # Your Twitter application's API secret\r
+       PCKT_CONSUMER_KEY = 'PocketAPIKey' # Your Pocket application's API key\r
 \r
 -  Use pip to install in local\r
 \r
 \r
 -  Use pip to install in local\r
 \r
@@ -446,3 +451,4 @@ steps
 .. _Issue #10: https://github.com/DTVD/rainbowstream/issues/10\r
 .. _default config: https://github.com/DTVD/rainbowstream/blob/master/rainbowstream/colorset/config\r
 .. _Emoji cheatsheet: http://www.emoji-cheat-sheet.com/\r
 .. _Issue #10: https://github.com/DTVD/rainbowstream/issues/10\r
 .. _default config: https://github.com/DTVD/rainbowstream/blob/master/rainbowstream/colorset/config\r
 .. _Emoji cheatsheet: http://www.emoji-cheat-sheet.com/\r
+.. _Pocket API: http://getpocket.com/developer/docs/overview\r
index bae4eb77c02b265f7e17ff2cd0040337cf6fb9be..491ae61061fd19b798f900afc8497b00a9c45e0e 100644 (file)
@@ -61,5 +61,6 @@
             "CLOCK_FORMAT" : "%Y/%m/%d %H:%M:%S",
             "DISPLAY" : "\n  #sender_name #sender_nick #to #recipient_name #recipient_nick :\n  #clock message_id:#id\n  #message"
         }
             "CLOCK_FORMAT" : "%Y/%m/%d %H:%M:%S",
             "DISPLAY" : "\n  #sender_name #sender_nick #to #recipient_name #recipient_nick :\n  #clock message_id:#id\n  #message"
         }
-    }
+    },
+    "POCKET_SUPPORT": false
 }
 }
index 53fcd639f4ef2b83929f899fa74a53a8d8c3b879..b65e62a8640cea31a2306dd3dde2b475078f4e03 100644 (file)
@@ -11,6 +11,7 @@ import traceback
 import pkg_resources
 import socks
 import socket
 import pkg_resources
 import socks
 import socket
+import re
 
 from io import BytesIO
 from twitter.stream import TwitterStream, Timeout, HeartbeatTimeout, Hangup
 
 from io import BytesIO
 from twitter.stream import TwitterStream, Timeout, HeartbeatTimeout, Hangup
@@ -19,6 +20,8 @@ from twitter.oauth import OAuth, read_token_file
 from twitter.oauth_dance import oauth_dance
 from twitter.util import printNicely
 
 from twitter.oauth_dance import oauth_dance
 from twitter.util import printNicely
 
+from pocket import Pocket
+
 from .draw import *
 from .colors import *
 from .config import *
 from .draw import *
 from .colors import *
 from .config import *
@@ -132,6 +135,35 @@ def authen():
         CONSUMER_SECRET)
 
 
         CONSUMER_SECRET)
 
 
+def pckt_authen():
+    """
+    Authenticate with Pocket OAuth
+    """
+    pocket_credential = os.environ.get(
+         'HOME',
+        os.environ.get(
+            'USERPROFILE',
+            '')) + os.sep + '.rainbow_pckt_oauth'
+
+    if not os.path.exists(pocket_credential):
+        request_token = Pocket.get_request_token(consumer_key=PCKT_CONSUMER_KEY)
+        auth_url = Pocket.get_auth_url(code=request_token, redirect_uri="/")
+        webbrowser.open(auth_url)
+        printNicely(green("*** Press [ENTER] after authorization ***"))
+        raw_input()
+        user_credentials = Pocket.get_credentials(consumer_key=PCKT_CONSUMER_KEY, code=request_token)
+        access_token = user_credentials['access_token']
+        f = open(pocket_credential, 'w')
+        f.write(access_token)
+        f.close()
+    else:
+        with open(pocket_credential, 'r') as f:
+            access_token = str(f.readlines()[0])
+            f.close()
+
+    return Pocket(PCKT_CONSUMER_KEY, access_token)
+
+
 def build_mute_dict(dict_data=False):
     """
     Build muting list
 def build_mute_dict(dict_data=False):
     """
     Build muting list
@@ -243,6 +275,8 @@ def init(args):
         c['IGNORE_LIST'] = []
     # Mute dict
     c['IGNORE_LIST'] += build_mute_dict()
         c['IGNORE_LIST'] = []
     # Mute dict
     c['IGNORE_LIST'] += build_mute_dict()
+    # Pocket init
+    pckt = pckt_authen() if c['POCKET_SUPPORT'] else None
 
 
 def trend():
 
 
 def trend():
@@ -404,6 +438,54 @@ def tweet():
     t.statuses.update(status=g['stuff'])
 
 
     t.statuses.update(status=g['stuff'])
 
 
+def pocket():
+    """
+    Add new link to Pocket along with tweet id
+    """
+    if not c['POCKET_SUPPORT']:
+        printNicely(red('Pocket isn\'t enabled.'))
+        return
+
+    # Get tweet infos
+    p = pckt_authen()
+
+    t = Twitter(auth=authen())
+    try:
+        id = int(g['stuff'].split()[0])
+        tid = c['tweet_dict'][id]
+    except:
+        printNicely(red('Sorry I can\'t understand.'))
+        return
+
+    tweet = t.statuses.show(id=tid)
+
+    if len(tweet['entities']['urls']) > 0:
+        url = tweet['entities']['urls'][0]['expanded_url']
+    else:
+        url = "https://twitter.com/" + \
+                tweet['user']['screen_name'] + '/status/' + str(tid)
+
+    # Add link to pocket
+    try:
+        p.add(title=re.sub(r'(http:\/\/\S+)', r'', tweet['text']),
+            url=url,
+            tweet_id=tid)
+    except:
+        printNicely(red('Something is wrong about your Pocket account,'+ \
+                        ' please restart Rainbowstream.'))
+        pocket_credential = os.environ.get(
+            'HOME',
+            os.environ.get(
+                'USERPROFILE',
+                '')) + os.sep + '.rainbow_pckt_oauth'
+        if os.path.exists(pocket_credential):
+            os.remove(pocket_credential)
+        return
+
+    printNicely(green('Pocketed !'))
+    printNicely('')
+
+
 def retweet():
     """
     ReTweet
 def retweet():
     """
     ReTweet
@@ -1291,7 +1373,7 @@ def switch():
             return
         # Kill old thread
         g['stream_stop'] = True
             return
         # Kill old thread
         g['stream_stop'] = True
-        try: 
+        try:
             stuff = g['stuff'].split()[1]
         except:
             stuff = None
             stuff = g['stuff'].split()[1]
         except:
             stuff = None
@@ -1414,7 +1496,7 @@ def config():
             debug_option()
             printNicely(red('Just can not set the key.'))
     else:
             debug_option()
             printNicely(red('Just can not set the key.'))
     else:
-        printNicely(light_magenta('Sorry I can\'s understand.'))
+        printNicely(light_magenta('Sorry I can\'t understand.'))
 
 
 def help_discover():
 
 
 def help_discover():
@@ -1488,6 +1570,8 @@ def help_tweets():
         light_yellow('[id=12]') + ' in your OS\'s image viewer.\n'
     usage += s * 2 + light_green('open 12') + ' will open url in tweet with ' + \
         light_yellow('[id=12]') + ' in your OS\'s default browser.\n'
         light_yellow('[id=12]') + ' in your OS\'s image viewer.\n'
     usage += s * 2 + light_green('open 12') + ' will open url in tweet with ' + \
         light_yellow('[id=12]') + ' in your OS\'s default browser.\n'
+    usage += s * 2 + light_green('pt 12') + '  will add tweet with ' + \
+        light_yellow('[id=12]') + ' in your Pocket list.\n'
     printNicely(usage)
 
 
     printNicely(usage)
 
 
@@ -1789,6 +1873,7 @@ cmdset = [
     'c',
     'v',
     'q',
     'c',
     'v',
     'q',
+    'pt',
 ]
 
 # Handle function set
 ]
 
 # Handle function set
@@ -1837,6 +1922,7 @@ funcset = [
     clear,
     upgrade_center,
     quit,
     clear,
     upgrade_center,
     quit,
+    pocket,
 ]
 
 
 ]
 
 
@@ -1917,6 +2003,7 @@ def listen():
             [],  # clear
             [],  # version
             [],  # quit
             [],  # clear
             [],  # version
             [],  # quit
+            [],  # pocket
         ]
     ))
     init_interactive_shell(d)
         ]
     ))
     init_interactive_shell(d)
index 8e4d00f169628b6e3e945833312f9f84d69d3165..99b932f9cbd67565e1e12dbc73494293e1c7ebed 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -13,7 +13,8 @@ install_requires = [
     "pyfiglet",
     "twitter",
     "Pillow",
     "pyfiglet",
     "twitter",
     "Pillow",
-    "PySocks"
+    "PySocks",
+    "pocket"
 ]
 
 # Copy default config if not exists
 ]
 
 # Copy default config if not exists