From 91476ec37e468301d39182aff48936749158e976 Mon Sep 17 00:00:00 2001 From: Orakaro Date: Mon, 5 May 2014 19:29:57 +0900 Subject: [PATCH] 1st commit --- README.md | 24 ++++++++ rainbowstream/__init__.py | 0 rainbowstream/colors.py | 16 +++++ rainbowstream/config.py | 2 + rainbowstream/rainbow.py | 121 ++++++++++++++++++++++++++++++++++++++ requirements.txt | 9 +++ setup.py | 44 ++++++++++++++ 7 files changed, 216 insertions(+) create mode 100644 README.md create mode 100644 rainbowstream/__init__.py create mode 100644 rainbowstream/colors.py create mode 100644 rainbowstream/config.py create mode 100644 rainbowstream/rainbow.py create mode 100644 requirements.txt create mode 100644 setup.py diff --git a/README.md b/README.md new file mode 100644 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 index 0000000..e69de29 diff --git a/rainbowstream/colors.py b/rainbowstream/colors.py new file mode 100644 index 0000000..13ab637 --- /dev/null +++ b/rainbowstream/colors.py @@ -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 index 0000000..cc655e9 --- /dev/null +++ b/rainbowstream/config.py @@ -0,0 +1,2 @@ +CONSUMER_KEY = 'uS6hO2sV6tDKIOeVjhnFnQ' +CONSUMER_SECRET = 'MEYTOS97VvlHX7K1rwHPEqVpTSqZ71HtvoK4sVuYk' diff --git a/rainbowstream/rainbow.py b/rainbowstream/rainbow.py new file mode 100644 index 0000000..b88db91 --- /dev/null +++ b/rainbowstream/rainbow.py @@ -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 index 0000000..9a2d2e7 --- /dev/null +++ b/requirements.txt @@ -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 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 + """, + ) -- 2.25.1