1st commit
authorOrakaro <nhatminh_179@hotmail.com>
Mon, 5 May 2014 10:29:57 +0000 (19:29 +0900)
committerOrakaro <nhatminh_179@hotmail.com>
Mon, 5 May 2014 10:29:57 +0000 (19:29 +0900)
README.md [new file with mode: 0644]
rainbowstream/__init__.py [new file with mode: 0644]
rainbowstream/colors.py [new file with mode: 0644]
rainbowstream/config.py [new file with mode: 0644]
rainbowstream/rainbow.py [new file with mode: 0644]
requirements.txt [new file with mode: 0644]
setup.py [new file with mode: 0644]

diff --git a/README.md b/README.md
new file mode 100644 (file)
index 0000000..1102f1c
--- /dev/null
+++ b/README.md
@@ -0,0 +1,24 @@
+## Rainbow Stream
+
+A rainbow stream console for Twitter.
+Base on Python Twitter Tool
+
+## Install
+With python 2.7+ You can:
+```bash
+git clone
+pip install requirements.txt
+pip install -e .
+```
+
+## Usage
+```bash
+rainbowstream
+```
+
+## Screenshot
+
+
+## License
+
+Rainbow Stream are released under an MIT License.
diff --git a/rainbowstream/__init__.py b/rainbowstream/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/rainbowstream/colors.py b/rainbowstream/colors.py
new file mode 100644 (file)
index 0000000..13ab637
--- /dev/null
@@ -0,0 +1,16 @@
+def _wrap_with(code):
+
+    def inner(text, bold=False):
+        c = code
+        if bold:
+            c = "1;%s" % c
+        return "\033[%sm%s\033[0m" % (c, text)
+    return inner
+
+red = _wrap_with('31')
+green = _wrap_with('32')
+yellow = _wrap_with('33')
+blue = _wrap_with('34')
+magenta = _wrap_with('35')
+cyan = _wrap_with('36')
+white = _wrap_with('37')
\ No newline at end of file
diff --git a/rainbowstream/config.py b/rainbowstream/config.py
new file mode 100644 (file)
index 0000000..cc655e9
--- /dev/null
@@ -0,0 +1,2 @@
+CONSUMER_KEY = 'uS6hO2sV6tDKIOeVjhnFnQ'
+CONSUMER_SECRET = 'MEYTOS97VvlHX7K1rwHPEqVpTSqZ71HtvoK4sVuYk'
diff --git a/rainbowstream/rainbow.py b/rainbowstream/rainbow.py
new file mode 100644 (file)
index 0000000..b88db91
--- /dev/null
@@ -0,0 +1,121 @@
+"""
+Colorful user's timeline stream
+"""
+
+from __future__ import print_function
+
+import os, os.path, argparse, random
+
+from twitter.stream import TwitterStream, Timeout, HeartbeatTimeout, Hangup
+from twitter.oauth import OAuth, read_token_file
+from twitter.util import printNicely
+from dateutil import parser
+from pyfiglet import figlet_format
+
+from colors import *
+from config import *
+
+def asciiart():
+    """
+    Draw the Ascii Art
+    """
+    d = [red, green, yellow, blue, magenta, cyan, white]
+    fi = figlet_format('Rainbow Stream', font='doom')
+    print('\n'.join(
+            [random.choice(d)(i) for i in fi.split('\n')]
+        )
+    )
+
+
+def draw(t):
+    """
+    Draw the rainbow
+    """
+    # Retrieve tweet
+    text = t['text']
+    screen_name = t['user']['screen_name']
+    name = t['user']['name']
+    created_at = t['created_at']
+    date = parser.parse(created_at)
+    time = date.strftime('%Y/%m/%d %H:%M:%S')
+
+    # Format info
+    user = green(name) + ' ' + yellow('@' + screen_name) + ' '
+    clock = magenta('['+ time + ']')
+    tweet = white(text)
+    userlen = len(name + screen_name) + 3
+    clocklen = len(time) + 2
+
+    # Draw rainbow
+    terminalrows, terminalcolumns = os.popen('stty size', 'r').read().split()
+    line1 = u"{u:>{uw}} {t:>{tw}}".format(
+        u = user,
+        uw = len(user) + 2,
+        t = clock,
+        tw = len(clock) + int(terminalcolumns) - userlen - 4 - clocklen
+    )
+
+    line2 = '  ' + tweet
+    line3 = '\n'
+
+    return line1, line2, line3
+
+
+def parse_arguments():
+    """
+    Parse the arguments
+    """
+
+    parser = argparse.ArgumentParser(description=__doc__ or "")
+
+    parser.add_argument('-to', '--timeout', help='Timeout for the stream (seconds).')
+    parser.add_argument('-ht', '--heartbeat-timeout', help='Set heartbeat timeout.', default=90)
+    parser.add_argument('-nb', '--no-block', action='store_true', help='Set stream to non-blocking.')
+    parser.add_argument('-tt', '--track-keywords', help='Search the stream for specific text.')
+    return parser.parse_args()
+
+
+def main():
+    args = parse_arguments()
+
+    # The Logo
+    asciiart()
+
+    # When using twitter stream you must authorize.
+    oauth_filename = os.environ.get('HOME', os.environ.get('USERPROFILE', '')) + os.sep + '.twitter_oauth'
+    oauth_token, oauth_token_secret = read_token_file(oauth_filename)
+    auth = OAuth(oauth_token, oauth_token_secret, CONSUMER_KEY, CONSUMER_SECRET)
+
+    # These arguments are optional:
+    stream_args = dict(
+        timeout=args.timeout,
+        block=not args.no_block,
+        heartbeat_timeout=args.heartbeat_timeout)
+
+    # Track keyword
+    query_args = dict()
+    if args.track_keywords:
+        query_args['track'] = args.track_keywords
+
+    # Get stream
+    stream = TwitterStream(auth=auth, domain='userstream.twitter.com', **stream_args)
+    tweet_iter = stream.user(**query_args)
+
+    # Iterate over the sample stream.
+    for tweet in tweet_iter:
+        if tweet is None:
+            printNicely("-- None --")
+        elif tweet is Timeout:
+            printNicely("-- Timeout --")
+        elif tweet is HeartbeatTimeout:
+            printNicely("-- Heartbeat Timeout --")
+        elif tweet is Hangup:
+            printNicely("-- Hangup --")
+        elif tweet.get('text'):
+            line1, line2, line3 = draw(t = tweet)
+            printNicely(line1)
+            printNicely(line2)
+            printNicely(line3)
+
+if __name__ == '__main__':
+    main()
diff --git a/requirements.txt b/requirements.txt
new file mode 100644 (file)
index 0000000..9a2d2e7
--- /dev/null
@@ -0,0 +1,9 @@
+colorama==0.3.1
+pyfiglet==0.6.1
+pyglet==1.1.4
+python-dateutil==2.2
+rainbowstream==0.0.1
+six==1.6.1
+termcolor==1.1.0
+twitter==1.14.3
+wsgiref==0.1.2
diff --git a/setup.py b/setup.py
new file mode 100644 (file)
index 0000000..0aa173e
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,44 @@
+from setuptools import setup, find_packages
+import sys, os
+
+version = '0.0.1'
+
+install_requires = [
+    # -*- Extra requirements: -*-
+    ]
+
+setup(name='rainbowstream',
+      version=version,
+      description="A rainbow streaming console for Twitter (twitter.com)",
+      long_description=open("./README.md", "r").read(),
+      # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
+      classifiers=[
+          "Development Status :: 5 - Production/Stable",
+          "Environment :: Console",
+          "Intended Audience :: End Users/Desktop",
+          "Natural Language :: English",
+          "Operating System :: OS Independent",
+          "Programming Language :: Python :: 2.6",
+          "Programming Language :: Python :: 2.7",
+          "Programming Language :: Python :: 3.2",
+          "Programming Language :: Python :: 3.3",
+          "Programming Language :: Python :: 3.4",
+          "Topic :: Internet :: WWW/HTTP :: Dynamic Content :: CGI Tools/Libraries",
+          "Topic :: Utilities",
+          "License :: OSI Approved :: MIT License",
+          ],
+      keywords='twitter, command-line tools, web 2.0, stream API',
+      author='Vu Nhat Minh',
+      author_email='nhatminh_179@hotmail.com',
+      url='http://vunhatminh.com',
+      license='MIT License',
+      packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
+      include_package_data=True,
+      zip_safe=True,
+      install_requires=install_requires,
+      entry_points="""
+      # -*- Entry points: -*-
+      [console_scripts]
+      rainbowstream=rainbowstream.rainbow:main
+      """,
+      )