From a8c4b1adf477beda6c133d7c4feaeccbca0d4aee Mon Sep 17 00:00:00 2001 From: Josue Ortega Date: Sat, 16 Sep 2017 12:58:12 -0600 Subject: [PATCH 01/40] Fix crash when submission page contains non standard characters --- rtv/terminal.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/rtv/terminal.py b/rtv/terminal.py index 9e5218c..98d2af2 100644 --- a/rtv/terminal.py +++ b/rtv/terminal.py @@ -270,9 +270,13 @@ class Terminal(object): # Trying to draw outside of the screen bounds return - text = self.clean(text, n_cols) - params = [] if attr is None else [attr] - window.addstr(row, col, text, *params) + try: + text = self.clean(text, n_cols) + params = [] if attr is None else [attr] + window.addstr(row, col, text, *params) + except curses.error as e: + _logger.warning('add_line raised an exception') + _logger.exception(str(e)) @staticmethod def add_space(window): From 580151faf0b748c0464355fe1a3274521886eeca Mon Sep 17 00:00:00 2001 From: woorst Date: Fri, 6 Oct 2017 19:28:19 -0500 Subject: [PATCH 02/40] handle single image imgur galleries --- rtv/mime_parsers.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/rtv/mime_parsers.py b/rtv/mime_parsers.py index e70515d..031c437 100644 --- a/rtv/mime_parsers.py +++ b/rtv/mime_parsers.py @@ -206,11 +206,14 @@ class ImgurApiMIMEParser(BaseMIMEParser): _logger.warning('Imgur API failure, resp %s', r.json()) return cls.fallback(url, domain) - if 'images' in data: + if 'images' in data and len(data['images']) > 1: # TODO: handle imgur albums with mixed content, i.e. jpeg and gifv link = ' '.join([d['link'] for d in data['images'] if not d['animated']]) mime = 'image/x-imgur-album' else: + data = data['images'][0] if 'images' in data else data + # this handles single image galleries + link = data['mp4'] if data['animated'] else data['link'] mime = 'video/mp4' if data['animated'] else data['type'] From d2079b55100586537c61097d4b6c3e4e37bc0dc5 Mon Sep 17 00:00:00 2001 From: woorst Date: Fri, 6 Oct 2017 20:02:58 -0500 Subject: [PATCH 03/40] test and cassette update --- tests/cassettes/test_parser[imgur_album].yaml | 54 ++++++++++--------- tests/test_mime_parsers.py | 4 +- 2 files changed, 30 insertions(+), 28 deletions(-) diff --git a/tests/cassettes/test_parser[imgur_album].yaml b/tests/cassettes/test_parser[imgur_album].yaml index ca22925..1d015f7 100644 --- a/tests/cassettes/test_parser[imgur_album].yaml +++ b/tests/cassettes/test_parser[imgur_album].yaml @@ -6,50 +6,52 @@ interactions: Accept-Encoding: ['gzip, deflate'] Authorization: ['**********'] Connection: [keep-alive] - User-Agent: [python-requests/2.15.1] + User-Agent: [python-requests/2.14.2] method: GET - uri: https://api.imgur.com/3/album/qx9t5 + uri: https://api.imgur.com/3/album/pRYEi response: body: string: !!binary | - H4sIAAAAAAAAA5WS3W7bMAyF34XXRqx0iVP7rgV2sWEvUMyFoMiKrVaWPIlylhV591F14vQHLdBL - HopH5Ec+QSNQQPUEuoEK/vwtcQ0ZoEajoLLRmAwaFaTXA2pnZ0mgQt3Tk+WqKNm3gpXXGUg3Kk8u - 8Tuyu18/4KTwvW6wg2q12ZyVTum2Q6iKDctASOmiRR69OfufpdTUpAxej0IeyH2IW6MlmRtxcJFM - YGtcS/Go1T6QZ8GWK8pq+0i5DnEIVZ3Xue7b6BfS9XUu6vw86U6MzmukSXbCBJWBDbv9HAQlp7Hh - xuqetFulbftT+cdAtaS0KvDnVokECZa3whjlD7ODDlw0l+i5AqrfJ94XUl8mvmSEDg8DKZNtnT8M - KnEQqVVUl19f8n9FPuh/VH5VrtlqxndVZrAVtjkVXa/XxbKgrEuMpl4+YDYlZ2SvN/npct9Asrx3 - AfmovTCz2onAA9Vd3qFoE8p7cmz4RCJdUzP9BWlB7/fx/iwWLw7jtI/Fw9DC8f5I00QpVaBv0Md0 - DygwJkiMHf8Doo3t9TsDAAA= + H4sIAAAAAAAAA+WVTW+cMBCG/0rkM93FBtvArao2VdRL1W5bVd0IeYEFK3wVG1abKP+94+UrNKqU + pMe9MeOZsed9PPgBxUILFDwgGaMA1V9+biSykJY6T8De/ri5uv744Qrb72wG/jhRUSNrLasSBWWb + 55bJT7QsIBpTmzuYesS1UFR1SQMFtPz2Vdyf0OAJjzLWGYRy4oyuLJFppsFnc2YhEUVVW+qwbXJI + j6vsTuRodptTUt/ljseohepGdiI6mYO3+1xGEJiLU9VCNbTPqxTsTiZHhQLicFiT5R2sZFrXKtit + d2tZpG2ziqpitxa79dj8QXRVIzV0dBC5SixUqsNxMlQS9e2jT6KuBcTLQqSJCs8HRAE0L8swFXme + NKcpS6pQxLN1zkDBr0H2WaVB+EHaF6jNTGP6VBta57LQR2kaFyWYOpk3XUi/FF3Je1MR+x5hZNIM + UwdbaC/KeEz1HJc6PiYmpjIC9Yf6h2D94qRXby74Ll1Git7zl1plWFRKh51s4C6M3kyoUEHeHKdF + ajS9hYpx2Etin7/7u2RIPQfz/E6sntyKAczKSPpojUOS3ajN+ydj8nJanHqvpIUpnmn5BI+wOOfU + FBtZYe4tWPmY+sxxzCxeBqqByhLVttt632nxFlSMsP9BhTF2p8Eins0cNsNy/SUs7MNo+YQTA/Qi + aA1glrR+b7afr982WL7tvo4WPFMzLMamnyBxHMbsCRVz+ZIUNZNmExNxEaAGJj2o20fopo2iRME2 + umkhW2mhW/PA2vbjH8FrHXBNCAAA headers: Accept-Ranges: [bytes] + Access-Control-Allow-Credentials: ['true'] Access-Control-Allow-Headers: ['Authorization, Content-Type, Accept, X-Mashape-Authorization, IMGURPLATFORM, IMGURUIDJAFO, sessionCount, IMGURMWBETA, IMGURMWBETAOPTIN, - X-expSNKPK128'] + X-expSNKPK127'] + Access-Control-Allow-Origin: ['*'] Access-Control-Expose-Headers: ['X-RateLimit-ClientLimit, X-RateLimit-ClientRemaining, X-RateLimit-UserLimit, X-RateLimit-UserRemaining, X-RateLimit-UserReset'] - Age: ['0'] + Age: ['31'] Cache-Control: ['max-age=60, stale-while-revalidate=600, stale-if-error=86400, public'] Connection: [keep-alive] Content-Encoding: [gzip] - Content-Length: ['416'] + Content-Length: ['591'] Content-Type: [application/json] - Date: ['Thu, 14 Sep 2017 04:40:13 GMT'] - ETag: [W/"d0ac94401e94efb8df60bfd684fbbfaf84b274df"] - Fastly-Debug-Digest: [b95c41c703e904c145c615cb1569a4d8cd685a4c48c40c1e2322fe3184806bf9] + Date: ['Sat, 07 Oct 2017 01:01:16 GMT'] + ETag: [W/"8b0927b16241ada44f39c2294331b7b71d81dfb1"] + Fastly-Debug-Digest: [75f7908a66ef856621dff296f5ce58532966f39397442cc5b0bec6811e2cf406] Server: [cat factory 1.0] Vary: [Accept-Encoding] - X-Cache: ['MISS, MISS'] - X-Cache-Hits: ['0, 0'] + X-Cache: ['HIT, HIT'] + X-Cache-Hits: ['2, 1'] X-Frame-Options: [DENY] - X-RateLimit-ClientLimit: ['12500'] - X-RateLimit-ClientRemaining: ['12463'] X-RateLimit-UserLimit: ['500'] - X-RateLimit-UserRemaining: ['497'] - X-RateLimit-UserReset: ['1505367612'] - X-Served-By: ['cache-iad2141-IAD, cache-mdw17335-MDW'] - X-Timer: ['S1505364013.964019,VS0,VE55'] - access-control-allow-methods: ['GET, PUT, POST, DELETE, OPTIONS'] - access-control-allow-origin: ['*'] + X-RateLimit-UserRemaining: ['498'] + X-RateLimit-UserReset: ['1507341645'] + X-Served-By: ['cache-iad2122-IAD, cache-mdw17331-MDW'] + X-Timer: ['S1507338076.081694,VS0,VE12'] + access-control-allow-methods: ['GET, PUT, POST, PATCH, DELETE, OPTIONS'] status: {code: 200, message: OK} version: 1 diff --git a/tests/test_mime_parsers.py b/tests/test_mime_parsers.py index ea77469..57dfc39 100644 --- a/tests/test_mime_parsers.py +++ b/tests/test_mime_parsers.py @@ -50,8 +50,8 @@ URLS = OrderedDict([ 'https://i.imgur.com/yjP1v4B.mp4', 'video/mp4')), ('imgur_album', ( - 'http://imgur.com/a/qx9t5', - 'https://i.imgur.com/uEt0YLI.jpg', + 'https://imgur.com/a/pRYEi', + 'https://i.imgur.com/tiUSazy.png https://i.imgur.com/phIsEAi.png https://i.imgur.com/TvT8V5m.png https://i.imgur.com/qETPFAi.png', 'image/x-imgur-album')), ('instagram_image', ( 'https://www.instagram.com/p/BIxQ0vrBN2Y/?taken-by=kimchi_chic', From 6045ceb35dc9b076d12290c4d5bac9d839b6848d Mon Sep 17 00:00:00 2001 From: woorst Date: Fri, 6 Oct 2017 20:22:38 -0500 Subject: [PATCH 04/40] imgur fallback cassette --- tests/cassettes/test_imgur_fallback.yaml | 473 ++++++++++++----------- 1 file changed, 258 insertions(+), 215 deletions(-) diff --git a/tests/cassettes/test_imgur_fallback.yaml b/tests/cassettes/test_imgur_fallback.yaml index d82f313..48af462 100644 --- a/tests/cassettes/test_imgur_fallback.yaml +++ b/tests/cassettes/test_imgur_fallback.yaml @@ -5,7 +5,7 @@ interactions: Accept: ['*/*'] Accept-Encoding: ['gzip, deflate'] Connection: [keep-alive] - User-Agent: [python-requests/2.15.1] + User-Agent: [python-requests/2.14.2] method: GET uri: http://imgur.com/yW0kbMi response: @@ -15,14 +15,14 @@ interactions: Cache-Control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0'] Connection: [close] Content-Length: ['0'] - Date: ['Thu, 14 Sep 2017 04:40:21 GMT'] + Date: ['Sat, 07 Oct 2017 01:01:21 GMT'] Location: ['https://imgur.com/yW0kbMi'] Retry-After: ['0'] Server: [cat factory 1.0] X-Cache: [HIT] X-Cache-Hits: ['0'] X-Frame-Options: [DENY] - X-Served-By: [cache-dfw1821-DFW] + X-Served-By: [cache-atl6223-ATL] status: {code: 301, message: Moved Permanently} - request: body: null @@ -30,7 +30,7 @@ interactions: Accept: ['*/*'] Accept-Encoding: ['gzip, deflate'] Connection: [keep-alive] - User-Agent: [python-requests/2.15.1] + User-Agent: [python-requests/2.14.2] method: GET uri: https://imgur.com/yW0kbMi response: @@ -44,7 +44,7 @@ interactions: gifs, memes, pictures, new pictures, reaction gifs, share photos, share images, latest images, funny, cute, visual storytelling, imgur\" />\n \n \n\n \ \n\n \n \n \n \n \n \n \n \n \n \n \ \n \n - \ \n\n \n \n\n \n \n\n\n \n \n \n \n \n\n\n\n \n\n\n
\n \n\n
\n\n \n \ \n \n \n\n
\n \ \n\n
\n\n \n\n + id=\"sid\" type=\"hidden\" value=\"7446bb35af059181971ad2c6d121f496\" />\n\n \
\n\t
\n\t\t

\n\t\t\n\t\t
\n\n\t\t
\n\t\t\t
\n\t\t\t\t\nif(typeof jQuery === 'undefined') {\n document.write('\n\n\n\n\n \n\n - \ \n \n\n + type=\"text/javascript\" src=\"//s.imgur.com/min/react15.js?1507313072\">\n\n + \ \n \n\n \ \n\n \n\n \n\n\n + type=\"text/javascript\" src=\"//s.imgur.com/min/advertising.js?1507313072\">\n\n\n \ \n - \ \n\n + \ \n\n \ \n\n \n \n\n \n \n\n \n\n \n\n\n\n\n\n\n \n\n\n\n\n \n - \ \n \n + \ \n \n \ \n\n\n
\n \n\n
\n
\n
\n
\n \
\n
\n \n\n
\n \ \n\n
\n\n \n\n + id=\"sid\" type=\"hidden\" value=\"7446bb35af059181971ad2c6d121f496\" />\n\n \
\n\t
\n\t\t

\n\t\t\n\t\t
\n\n\t\t
\n\t\t\t
\n\t\t\t\t\nif(typeof jQuery === 'undefined') {\n document.write('\n\n\n\n\n \n\n - \ \n \n\n + type=\"text/javascript\" src=\"//s.imgur.com/min/react15.js?1507313072\">\n\n + \ \n \n\n \ \n\n \n\n \n\n\n + type=\"text/javascript\" src=\"//s.imgur.com/min/advertising.js?1507313072\">\n\n\n \ \n - \ \n\n + \ \n\n \ \n\n \n \n\n \n \n\n \n\n \n\n\n\n\n\n\n \n\n\n\n\n \n \n \n \n\n\n\n \n\n\n
\n \n\n
\n
\n
\n \ \n @@ -1206,22 +1185,72 @@ interactions: post-pad\">\n
\n
\n \n\n \
\n\n \n\n \ \n \n \n - \ \n \n - \ \n\n
\n
\n \n\n \n \n\n \n \"\"\n \"\"\n \n + \ \n \n \n
\n\n \n\n + \
\n \n\n \n + \
\n\n \n \n\n + \ \n \n \n + \ \n
\n \n + \ \n \n \n + \ \n\n
\n + \
\n + \ \n\n \n + \ \"\"\n \n \n + \ \n \n
\n\n \n\n
\n + \ \n\n \n
\n\n + \ \n \n\n \n \n \n + \ \n
\n \n + \ \n \n \n + \ \n\n
\n + \
\n + \ \n\n \n + \ \"\"\n \n \n + \ \n \n
\n\n \n\n
\n + \ \n\n \n
\n\n + \ \n \n\n \n \n \n + \ \n
\n \n + \ \n \n \n + \ \n \n\n + \
\n
\n \n\n \"\"\n \n \n
\n\n \n\n \
\n \n\n \n \
\n\n \n \n\n + itemprop=\"datePublished\" content=\"2017-10-06\">\n \n\n + \ \n \n \n \ \n
\n \n \ \n\n \n\n \n \ \n\n \n
\n\n @@ -1269,7 +1298,7 @@ interactions: icon-take-me-up\">
\n
\n
\n \
\n
\n
\n\n
\n \
\n\n
\n\n \n\n + id=\"sid\" type=\"hidden\" value=\"7446bb35af059181971ad2c6d121f496\" />\n\n \
\n\t
\n\t\t

\n\t\t\n\t\t
\n\n\t\t
\n\t\t\t
\n\t\t\t\t\nif(typeof jQuery === 'undefined') {\n document.write('\n\n\n\n\n \n\n - \ \n \n\n + type=\"text/javascript\" src=\"//s.imgur.com/min/react15.js?1507313072\">\n\n + \ \n \n\n \ \n\n \n\n \n\n\n + type=\"text/javascript\" src=\"//s.imgur.com/min/advertising.js?1507313072\">\n\n\n \ \n - \ \n\n + \ \n\n \ \n\n \n \n\n \n \n\n \n\n \n\n\n\n\n\n\n \n\n\n\n\n \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nSafe Mode: On\r\n
\r\n\t
\r\n\t\t\"\"/\r\n\r\n\t\t
\r\n\t\t\t

\r\n\t\t\t\t + \ Create Account | \r\n\t\t\t\tLog in | \r\n  \r\n \r\n \t\t\t

\r\n
\r\n\t\t\t\r\n\r\n\t\t\t
\r\n
\r\n\t\t\t\t\r\n\t\t\t\t\r\n
\r\n\t\t + \
\r\n
\r\n\r\n\t\t
\r\n\r\n\t\t\t\t\t\r\n\t
\r\n
\r\n
\r\n
\r\n\t
\r\n\t\t
+ \
\r\n \r\n
\r\n \r\n + \
\r\n
\r\n
Trump + Toys with Reporters at Press Conference Today
\r\n
\r\n + \
\r\n
\"\" Part of channel(s): Presidency of Donald Trump (current + event)
\r\n

The MSM is circling + the drain and can't be done with fast enough!

\r\n\t\t
\r\n + \ \r\n
\r\n \r\n
+ \ \r\n\r\n + \
\r\n
\r\n
\r\n\t\t\t\t\t
\r\n\t\t\t\t\t\r\n\t\t\t + \
\r\n
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tAdded: + Feb-17-2017 Occurred On: Feb-17-2017 + \
By: TurnOffTelevision + \
In:
Politics + \
Tags: No, + More, Fake, News
Location: United States (load + item map)
Views: + 18845 | Comments: 292 | Votes: 25\r\n + | Favorites: 1 + | Shared: 38 | Updates: 0 | Times + used in channels: 3 + \
\r\n \r\n
\r\n + \
\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n
\r\n\r\n
\r\n\r\n + \ \r\n + \ Direct link:


\r\n Direct + link without comments:
\r\n
\r\n
+ \r\n\t\t\t\t\t
\r\n\t\t\t\t
\r\n + \
\r\n \r\n
\r\n \r\n + \
\r\n \r\n
\r\n \r\n\r\n + \
You need to be registered in order to add comments! + Register HERE
\r\n + \ \r\n \r\n\r\n \r\n
\r\n + \ \r\n
\r\n + \
\r\n\t\r\n \r\n \r\n

\r\n\r\n Advertisement below\r\n
\r\n
\r\n\r\n\r\n
\r\n + \
\r\n \r\n\r\n \r\n\r\n \r\n\r\n\r\n + \ \r\n\r\n\r\n
Liveleak + on Facebook
\r\nLIKE Liveleak.com

\r\n
Items
\r\n
\r\n\t\t\t\t\t
\r\n\t\t\t\t\t\t
    \r\n + \ \t\t\t\t\t\t\t
  • Related
  • \r\n \t\t\t\t\t\t\t
  • User
  • \r\n + \ \t\t\t\t\t\t
\r\n\t\t\t\t\t\t
\r\n\t\t\t + \
\r\n\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t + \r\n\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t
\r\n \t\t
\r\n
Advertisers
\r\n
\r\n\t\t\t
\r\n\t\t\t
\r\n\t\t\t
\r\n\t\t\t\t

\r\n Advertise on Liveleak
\r\n + \ Liveleak Forums
\r\n TomoNews - Animated News
\r\n + \

\r\n
\r\n
+ \r\n \t\t
\r\n\t
\r\n
\r\n
\r\n\t
\r\n\t\t\r\n\r\n\t\t\"Web\r\n\t\tBACK + TO TOP\r\n\r\n\t
\r\n
\r\n \r\n + \ \r\n\r\n + \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"} + headers: + Access-Control-Allow-Origin: ['*'] + Cache-Control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0'] + Connection: [keep-alive] + Content-Type: [text/html; charset=UTF-8] + Date: ['Sun, 29 Oct 2017 13:56:26 GMT'] + Expires: ['Thu, 19 Nov 1981 08:52:00 GMT'] + Pragma: [no-cache] + Server: [nginx/1.6.1] + Set-Cookie: [PHPSESSID=c47884aaee715fa322e3e3952ac01ded; path=/; domain=.liveleak.com, + 'liveleak_safe_mode=1; expires=Mon, 29-Oct-2018 13:56:26 GMT; Max-Age=31536000; + path=/; domain=.liveleak.com; httponly', 'liveleak_use_old_player=1; expires=Mon, + 29-Oct-2018 13:56:26 GMT; Max-Age=31536000; path=/; domain=.liveleak.com; + httponly'] + X-Powered-By: [PHP/5.6.30] + status: {code: 200, message: OK} +version: 1 diff --git a/tests/test_mime_parsers.py b/tests/test_mime_parsers.py index 883a3e7..d9f64a5 100644 --- a/tests/test_mime_parsers.py +++ b/tests/test_mime_parsers.py @@ -70,10 +70,14 @@ URLS = OrderedDict([ re.compile('https://(.*)\.cloudfront\.net/videos/15694926/52450725.mp4(.*)'), 'video/mp4', marks=pytest.mark.xfail(reason="vidme API appears to have changed format"))), - ('liveleak_video', ( + ('liveleak_video_1', ( 'https://www.liveleak.com/view?i=08b_1499296574', re.compile('https://cdn\.liveleak\.com/(.*)\.mp4(.*)'), 'video/mp4')), + ('liveleak_video_2', ( + 'https://www.liveleak.com/view?i=cad_1487311993', + re.compile('www\.youtube\.com/embed/D4GrlOMlOBY'), + 'video/x-youtube')), ('reddit_gif', ( 'https://v.redd.it/wkm9zol8c6fz', 'https://v.redd.it/wkm9zol8c6fz/DASH_600_K', From 00df45bd34b027a7f5021374db54657de55dbd88 Mon Sep 17 00:00:00 2001 From: Michael Lazar Date: Sat, 4 Nov 2017 14:10:50 -0400 Subject: [PATCH 21/40] Fix crash on startup when terminal doesnt support colors --- rtv/objects.py | 4 +--- rtv/terminal.py | 2 +- tests/test_terminal.py | 13 +++++++++++++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/rtv/objects.py b/rtv/objects.py index 40274ac..cec6add 100644 --- a/rtv/objects.py +++ b/rtv/objects.py @@ -83,6 +83,7 @@ def curses_session(): # return from C start_color() is ignorable. try: curses.start_color() + curses.use_default_colors() except: _logger.warning('Curses failed to initialize color support') @@ -92,9 +93,6 @@ def curses_session(): except: _logger.warning('Curses failed to initialize the cursor mode') - # Assign the terminal's default (background) color to code -1 - curses.use_default_colors() - yield stdscr finally: diff --git a/rtv/terminal.py b/rtv/terminal.py index 98d2af2..4a7b8d4 100644 --- a/rtv/terminal.py +++ b/rtv/terminal.py @@ -849,7 +849,7 @@ class Terminal(object): """ monochrome = (not curses.has_colors()) - if theme is None: + if theme is None or monochrome: theme = Theme(monochrome=monochrome) theme.bind_curses() diff --git a/tests/test_terminal.py b/tests/test_terminal.py index a548ae0..52950e7 100644 --- a/tests/test_terminal.py +++ b/tests/test_terminal.py @@ -596,3 +596,16 @@ def test_set_theme(terminal, stdscr): terminal.set_theme(theme=theme) assert terminal.theme.monochrome stdscr.bkgd.assert_called_once_with(' ', 0) + + +def test_set_theme_no_colors(terminal, stdscr): + + with mock.patch('curses.has_colors') as has_colors: + has_colors.return_value = False + + terminal.set_theme() + assert terminal.theme.monochrome + + theme = Theme(monochrome=False) + terminal.set_theme(theme=theme) + assert terminal.theme.monochrome From 29ea05f5bb332fdb9bd660e85877d96bc8b8104b Mon Sep 17 00:00:00 2001 From: Michael Lazar Date: Sat, 4 Nov 2017 15:20:58 -0400 Subject: [PATCH 22/40] Adding support for emacs terminals --- rtv/page.py | 4 +++- tests/test_subreddit.py | 5 +++++ tests/test_terminal.py | 1 + 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/rtv/page.py b/rtv/page.py index 134774c..712cbd6 100644 --- a/rtv/page.py +++ b/rtv/page.py @@ -367,7 +367,9 @@ class Page(object): else: title = sub_name - if os.getenv('DISPLAY'): + # Setting the terminal title will break emacs or systems without + # X window. + if os.getenv('DISPLAY') and not os.getenv('INSIDE_EMACS'): title += ' - rtv {0}'.format(__version__) title = self.term.clean(title) if six.PY3: diff --git a/tests/test_subreddit.py b/tests/test_subreddit.py index 8d74ac9..f9f1352 100644 --- a/tests/test_subreddit.py +++ b/tests/test_subreddit.py @@ -108,6 +108,11 @@ def test_subreddit_title(subreddit_page, terminal, capsys): out, _ = capsys.readouterr() assert not out + with mock.patch.dict('os.environ', {'INSIDE_EMACS': '25.3.1,term:0.96'}): + subreddit_page.draw() + out, _ = capsys.readouterr() + assert not out + def test_subreddit_search(subreddit_page, terminal): window = terminal.stdscr.subwin diff --git a/tests/test_terminal.py b/tests/test_terminal.py index 52950e7..935535b 100644 --- a/tests/test_terminal.py +++ b/tests/test_terminal.py @@ -600,6 +600,7 @@ def test_set_theme(terminal, stdscr): def test_set_theme_no_colors(terminal, stdscr): + # Monochrome should be forced if the terminal doesn't support color with mock.patch('curses.has_colors') as has_colors: has_colors.return_value = False From 1e18c8775733174ae806ecc390e886022dbbe7ae Mon Sep 17 00:00:00 2001 From: Michael Lazar Date: Fri, 10 Nov 2017 19:56:17 -0500 Subject: [PATCH 23/40] Surpressing stdout/stderr from opening web browsers --- requirements.txt | 2 +- rtv/terminal.py | 18 +++++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/requirements.txt b/requirements.txt index f29662f..e0ec043 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,6 +4,6 @@ kitchen==1.2.4 mailcap-fix==0.1.3 requests==2.11.0 six==1.10.0 -pytest==3.0.7 +pytest==3.2.3 vcrpy==1.10.5 pylint==1.6.5 \ No newline at end of file diff --git a/rtv/terminal.py b/rtv/terminal.py index 4a7b8d4..0f6078f 100644 --- a/rtv/terminal.py +++ b/rtv/terminal.py @@ -513,9 +513,21 @@ class Terminal(object): # can re-use the webbrowser instance that has been patched # by RTV. It's also safer because it doesn't inject # python code through the command line. - null = open(os.devnull, 'ab+', 0) - sys.stdout, sys.stderr = null, null - webbrowser.open_new_tab(url) + + # Surpress stdout/stderr from the browser, see + # https://stackoverflow.com/questions/2323080. We can't + # depend on replacing sys.stdout & sys.stderr because + # webbrowser uses Popen(). + stdout, stderr = os.dup(1), os.dup(2) + null = os.open(os.devnull, os.O_RDWR) + try: + os.dup2(null, 1) + os.dup2(null, 2) + webbrowser.open_new_tab(url) + finally: + null.close() + os.dup2(stdout, 1) + os.dup2(stderr, 2) p = Process(target=open_url_silent, args=(url,)) p.start() From 1cb2ee16eca1a7a2594544d3eb6919a6ef396d1d Mon Sep 17 00:00:00 2001 From: Michael Lazar Date: Sun, 12 Nov 2017 12:29:43 -0500 Subject: [PATCH 24/40] Update README.md --- README.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/README.md b/README.md index 70de767..9e664c2 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ $ pip install rtv ### Native packages -See [Repology](https://repology.org/metapackage/rtv/information) for an up-to-date list of supported packages: +See [Repology](https://repology.org/metapackage/rtv/packages) for an up-to-date list of supported packages: ```bash # macOS @@ -66,9 +66,6 @@ $ brew install rtv # Debian 9+, Ubuntu 17.04+ $ apt install rtv -# Fedora 24+ -$ dnf install rtv - # Arch $ yaourt -S rtv From a30fdbd1b32947e9052421e9211b52854c5aaf7f Mon Sep 17 00:00:00 2001 From: jupart Date: Mon, 13 Nov 2017 09:46:31 -0500 Subject: [PATCH 25/40] Wrap text in submission page PAGER output --- rtv/submission_page.py | 6 ++++-- rtv/terminal.py | 12 ++++++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/rtv/submission_page.py b/rtv/submission_page.py index ff587d3..a11ae03 100644 --- a/rtv/submission_page.py +++ b/rtv/submission_page.py @@ -155,13 +155,15 @@ class SubmissionPage(Page): Open the selected item with the system's pager """ + n_rows, n_cols = self.term.stdscr.getmaxyx() + data = self.get_selected_item() if data['type'] == 'Submission': text = '\n\n'.join((data['permalink'], data['text'])) - self.term.open_pager(text) + self.term.open_pager(text, wrap=n_cols) elif data['type'] == 'Comment': text = '\n\n'.join((data['permalink'], data['body'])) - self.term.open_pager(text) + self.term.open_pager(text, wrap=n_cols) else: self.term.flash() diff --git a/rtv/terminal.py b/rtv/terminal.py index 0f6078f..3de28a8 100644 --- a/rtv/terminal.py +++ b/rtv/terminal.py @@ -20,7 +20,7 @@ from tempfile import NamedTemporaryFile import six from kitchen.text.display import textual_width_chop -from . import exceptions, mime_parsers +from . import exceptions, mime_parsers, content from .theme import Theme from .objects import LoadScreen @@ -552,7 +552,7 @@ class Terminal(object): with self.suspend(): webbrowser.open_new_tab(url) - def open_pager(self, data): + def open_pager(self, data, wrap=False): """ View a long block of text using the system's default pager. @@ -561,6 +561,14 @@ class Terminal(object): pager = os.getenv('PAGER') or 'less' command = shlex.split(pager) + + if wrap: + data_lines = content.Content.wrap_text(data, wrap) + data = '' + for line in data_lines: + data += line + '\n' + + try: with self.suspend(): _logger.debug('Running command: %s', command) From 0f75b170d61583bb1fd8572d8a71dca7031a4101 Mon Sep 17 00:00:00 2001 From: jupart Date: Thu, 16 Nov 2017 08:13:27 -0500 Subject: [PATCH 26/40] Wrap PAGER text, updated with PR review feedback --- rtv/terminal.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/rtv/terminal.py b/rtv/terminal.py index 3de28a8..53a5b6a 100644 --- a/rtv/terminal.py +++ b/rtv/terminal.py @@ -552,7 +552,7 @@ class Terminal(object): with self.suspend(): webbrowser.open_new_tab(url) - def open_pager(self, data, wrap=False): + def open_pager(self, data, wrap=None): """ View a long block of text using the system's default pager. @@ -564,10 +564,7 @@ class Terminal(object): if wrap: data_lines = content.Content.wrap_text(data, wrap) - data = '' - for line in data_lines: - data += line + '\n' - + data = '\n'.join(data_lines) try: with self.suspend(): From 048c70b5b700530397818ee95103d1ac16a06322 Mon Sep 17 00:00:00 2001 From: Michael Lazar Date: Sat, 2 Dec 2017 19:43:22 -0500 Subject: [PATCH 27/40] Adding logo files --- resources/logo.png | Bin 0 -> 7627 bytes resources/logo_black.png | Bin 0 -> 12717 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 resources/logo.png create mode 100644 resources/logo_black.png diff --git a/resources/logo.png b/resources/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..bbd2989628b2e00d187583bdd21e14985c634989 GIT binary patch literal 7627 zcmdUU=T}otw01&h(u-1s0E&oo5D}50AYg$|1VnlZ(tA%R0wMweiqeaM(jkBpK_LD> zdKE$oB%wxHLJ>kJ;l}&n{r3I=cb#?S%$YT_XYbk1o@cL_L?c5zRwe-^006-HP+!Lc z002R$b!SF;YPo%IlG_nwB%ZRdx5vw83#K{MlCjL3|xe%9pG=yb`e_qFJp-}Q)yag;oWH`l2X6nJsz zfw%+5rF(Q+-laSo_gWjpX$5F5#0H355Od0rf5dg|0=4?^+!!wl_Gu6C*}h|jH(wx~ zOx^Ji-^_3Gm_~%Kmb&vYipFu=|G!a4sR4Nb>@;#f2w);c-R$Q5J_bh7wlo_?QJp8c zfXd`il~>Ui-oUh=`kc2M>M5}3V_DHQj{C25XEloga_76kYk~7il0HOXAHiD5Elx4| zJ>W*0WBo0Jy8MMBmK|kWDe~!TJck%hDgEv4;87_gbIa&r2w<89PooF4DsOqOC|=Z| zdw{?wvFt$)ecQ4GW_xl&4?n0TG4?T(5t$sgd<6(ezoqRpb{qw52%d5^W>bGaX zqB@q=sGaCdPMoK`$0c~+SHVrkhwPj17UQ)f^?BJEX|m_o<>Rg(m7Wg_XuxLqu?NW7hhbjJpW9sH2iijqXpNKFCFx z9lb=-p<2HfxQskGV%clIvm=hvRgQW7gz;#2UKkY-7(L{{y|Rg5xyHB5>@}J?Q1XD) ze+T$^zQZF}xvnnlIB7N=dAsX`7ZjC2o!aN6Vg`d(o0*~W=bZaaL8{Gq2e$4R%}lrD zv{L*XI7$L zHtza+>sXp6MyM=fT&l&s3nWYv@aOgS%NKE(6~f$1rwa0&pW$QKrd;Sj73bx9qcqvyUh6yoi@Y+&HiE-+pg;P` zx`6-Ov;yL1AF?$$$jZ8C)bl>!HKvf30=S#dmbxm7LnG12{)cjiV8%Ligkc*Q)We9t|V|( z?NK;;qGC-~IWR1;a>$r*{7U43U$J*x=goz_%|E)X5Q1)^J7s z$uE()@fErW(ZxTTx4ZdU8eDk_AZbJrh)CN+-$a99tYWC5yPJfrA!~h@#x6El-c;wq zH2(IJMp!D}wrz6sy;@cGfm`(!WCg73nKw8%=RJnytr+oRkR9@ zht&?iL$mLPw~e$s!wz7OZIy@0U-!5-mqvQ;GT*gkedP+wJbXrGV+aNX(>ImVV|-|) ze#SqKq7UWZJzcwl+v`5wV)3+_?c<{~@hP!1%eP+ST-Zky6x31jW0^v)4$~BH)iGmXM|rJ3>s65>z5BOVp?k!clW{{Mb9f}kLd*}oY5V5Oip61p1zd_S0_ zQRGc#0~sP8bVmFtn-;@?ugvwuAj6Q=z}CO;8X!jSUZG?Lr_s82PRdYdfkL}Yn?3KB zg5CNU=nwAPHu(jT7s6$Uv)6*)wx~;#+Iz`LrJ8kGoi%n7;r% zbV}O>Y}5>62Y5rqWUFJ}Cbm@Tm!HkR=BExg9$hH=>r`A2B&PJ7r`z^s2Hdl)4<(`L zngK7tJIm=1Ay>!3#1YlU{m7l@MQRSQlTu)w4Z8Tw86& z{&8sckssLVoI3-vu1Vm_iUk=~@SCg~nYsBV85ZY;P8PW4f>u~3R2?qZT)nmyw|byH zKh<+7aiufa4q4HvQDjJ_C^(R1yLhfUozTN)PXU6$<3`v^u}*>lom*~Cdi`CWKWXcm zm9Xl~Io}f9|4$1J`I`oRX}l)BAu)XB%o(@!A>aB+yB~1flDIs>7@}2|X!s{=J{Tm$ zU1w*Wy_8KQU@ME)r3WWxdGz}M&>oE?5Rj}|0&Mqh3@F?SZw(L8#)%cnYF1l929*$4 zzR?VNnAXUu8tR3dlwegZ*hPb_ysHM7#3(us)n67Z-pUG2Z-8{nU2m93f5{o=qjyLi zfOp=*_@6qemlY=Kn=bCJsH|IZtum3 z^`X+g8^n?=^I`o8VooE$gyIRoik~AeTrse9vb;18ofE$xxC2zpBs%nvz}^V&w@98F z9VKP8Q)O_EC93m|t~SZIe=NFPw=L#cc|$6$uiGX5Ug!|d(^uMbA0PG{}1MS)t!XW#}jHRz5!TJmD6p?=w@# z#*=Lm!xO4FhRew(cdF8NyQRDJO0I^eK^B6i)=gT!*F`#l(;~<wC6lrMdOqshq)s&F0-r|^@n$fu=+yb z)8gIL*7m9kU09U}#0Bs8RsF4#X&KNTlLKK3Q|LtH@^`}_|2rqfFY{H#y{8^#5R{Osr~q~X z?qI3~d9#k^1{8E2pR{poq|A{MXVnq`U-1{<#h>WV|HFhqrsPkasQCo+13@ot+=PqQF82f7!)gX*I-7x zl?scH!pob z0k!v>z1}35bNj!-eXEG|oF>Eb5NhtaLD#3Lc5#a|oU1#^smx>Kh9>o%7#L}OTJgqz zT1Bmsl?XpZeztrdIiyd(Id0b&6zJmqYnZ;U9m%;JyPkJZgtXeNA!1IJt%<}ED#u)D zT!?On!YS145Ht9B8%w9UjFDy`fXDQo4L?2{rSoGGW&GFbfZ@GONnEh{)q%Hy^yvyp zFTv-7BJ~i3zEG1h=jzCM#;@=3C0o|o!W{x4SW;E)fpBFis~A2ZCYJ4S->%f_sLCm&&zux8w(XgmC4ZT7|@oa%G3xJ*Jdu;GP9Q^CvM+ zyHDLJMB)$_G)PjIZ`bLNX4Q9kTrA{e)kR;(I5vux(srXVUu4}IOP)^UzE&k8d{(gW z8we%o-iQq7G%{CT1CFS*{-`B)UJ+Suu4ze|q?ngs<2=-5s!O(5jG7t_$IoeHa(fH6 z%)y>6wdSGj*_MZcU{YGdl-3dtg7mGmFsPWifAjv>-p2X7PnI<5A&IB>R1maRAA64i z1@4uq`~jI{%As^7-t|bap1c&K8ORVmtn9qCu^_9s>|9*c4hnkf#{1=H1==$`7gxXgJ9RuKN0cf@a-5lss+M zrsqh#`uiX^{^WJ~1q*EW@W@Z07i+*0p=GECx&*Dhtwi$+-Kfmj?cmCG>xazn#D41uhY0?6rZhT4^gim5H7l8tg zP;HI%+*Z(syhS}?nRheosVIEVSmejD%^n!iR-o&8tqjS~`lvJd$p^-Y*d=qv&*=I9qyUb5=!h+3yuL|8r!0 zux5E;wuGGstZiC!MeiJy0HSd|EsAM{wZ;a>nGrLD;IC_#U(Iw6l}3h-k8Ea4f0Lb@ zP(rpRp1e_I{nkjwN{*gfMR(J>DEi(R7JgUwz6?Vg>}DVOMc1+`RLOd=Y?YIZyBIl=X zj;i-yv6r6lFegU*i@~4y+xnbGSK@2h*RGhXe5Y0OscU(>>S90&FFxhS6`1|i#Diui zk;NM2!{uB$N*)I*)^mVO6V#HANhw3Oc|w}=i9VXoO{bp)8^43lpO8^gD_e%AG&`4* z)B(v~WZ8@~v)LuJU!=<4KFGMtchsg_#(SuO5^0j_LL?}%t&gcN@zFL~^-G%(dAMmd zw#R8(KX#-jbnA7G1Y8KlI67^iqwqRo5?5_J)GaM;gMT$us|H&ot%Gu|W78CEb?^Ww z4>M3xSF62*hL=bQ2JgJaUWFez_IAB1cwXxjRf4%6{J(x`Mil&-XAF6`|132`&S|G@ zl>YOgl^AhSJU4wqlle1zt(nk^xuXeT-9*6W0FQh570bS8%Wfl^R}i^elTeDtGFc0K&sPiQc^^CX&#kq*kWpW%UdF*AZ87IE=1ik`3ckI$k80sPE@WrK#) zya=WCWjqt6)h-E67aOH6Mf0H4Rry~pHml<8V$g?u# zh@+d<2L0VUK!QIdaS#D-d!m4URdGo+JKV92b?;#QcG5sC*g(W3-{*zrnj4ZQ_O|d5 zgiuF}?IeV4JTd!AalUuP+4HRkTmr*N7*~Gh5i0B$AK@JRwo-tqlVR1<_JEwM;bNG7 z-#^@J?>)-*=0*=Yu6;stH>8E9*z`yMYe{LlR}o6Sin3!r>tCU@wuG^>` ziW}02-(cv`UjHXZh3eDAG`tyj*^9$eALFJnr!`O%oRdN9X;m3;2!1O&LWbn_1_L}X&ejmA3faRZZQ0N{v4W}MMiKP z)gSlY_0m9fOCL;SxFPp}cf4FYTg)-jzGv0^JGowpWrHRM^fRI{LmW2eCP&@UnQ$D{ zEh>YRiGh!qPdO(TZkp9942J5B#+=I_m4%7bANy(#O|-tCx%$;LK36>pdiDlF7}e%< zF%T>oaWWi|T}0U}PeR-sdA|78FzI*s>-8o9_eekt#{MkclXzm3$)HR@!stiTtc#MNwWb`iTsHZS zlnIa_IVi~ML5i{h^+@b>57MLf35IC-Mq} z1)9^&VftReo=Dr4Emj_Dy6R2Ie6`6~de4x%GgY1YlShX1M&#tde=lpx3q8|N+TVS8w#cawdlu9c#;z9IbZ1%B zd5wB1RQx8waG9u$erDt~B%wtvDS~!w!BxEBX}c-)XzbY)EiB3xZDd$GH*>`dJy(%~ z5Mr4Zwg(%eQS&k?o=cG6@=mBs56`EXX_~0GnR{DEa0gmU;%SnvsjsV}N_V`kCL^zK z)B-YCb&@9PTZ>T0xtWbHgJE)&)swdCKPA|E?%VGR9H0B-2JP&%WeHmU0;G(B#xd+oujlvE%HRUOk>2DW3O7gVm<@^MC&pHpl^O z074`NCiLg0yXX71jUoxbm`YCm0M=85Qc-Gd)lS8k1k)do-mavkOBAzcZ9v;A&VPLRE8s-n`_QtE6|jIq7T=5-d3Nq4a#ARe(#9zhi9Jk8Zn=a zi|O{AI&uH`@YzS&VN01K=>FP?HB-lJqr>+zvO*S`vrf__vt1$JE(&?i<#hDm2YYBd z0p77NKf%9(5b`yT=9YRud>W(qd_MoWkLy8n>I+AatcHB4odlYw6|SS$8xX117gE{^ zRP*j=Y`7){K0>K{lt0`U9glId!AqX2#Oy(gG%eo__fj02I1gXT1!;=gCZBYBI2hpc zM?+lg+eFoGp(B3m`~4>i*y?!%Ee|hcIvrnPPTXta4jX3$8`o1O>#bC?rK9Lu^(5UL zI5Pfk6vxs7-Z>Gw`4klOjnQT?O2GmAzT%&OsKT-8v9vUBsIDqjZ zTe|nO=jQTW!L&>daw?J`w1mV-id^@CYcTBUS@_bs*?Wu&BcV`bEy%rr4h2%3Mb!N! zMNG6^$i?wPYg-pjLzl|PK@kzyhXACOkb>rZ-w7jOI}YojbJk1qNV#{YC~ z@3Yu9R}9UytKC3Q{HG%VwT?f%-OQu)a?6A1)CFsZYps-SLj%9TYo<=EJEay1~n!Ap4xs45s@Ax(9aes4RlzXIq%-G z6Wo089isOrWE&ZC)(><`K`!JKI2LX{!nx0DV2rNOgy{UnyU({jlZl*KTM$>?ly_}s zXB~4eNvY3@OM>wfOUw3B5<7X}I_1F{3)dqamYkLvHebknlbtYge9O4jfL!h5N6H|7 z-MzabL(jI*PKT%(_92bVKyyS^D$+ATEN{)KtZ5v&?`DWDhT5)grA6A3V#w>`*UkPMhS z$?ewEB6j(;T=$&%2JVV)S}@o6d~2a;-jkYs~(4#Z$=u@eoRB5QIAsoa6?NTp-0;BmrmalzrRfiZf>} z^CW5F#o{5=BO9Let{S8;urrrSbX%bXJV%xTD+qP||Vmlq%wwB^Vu=l7&0pf6}W36VcwpZ~ma zI*a2$95@?MReLZn1oVI2;9zMP*dQj1gP4>M%r+tf7#UMYZO#&ig>R~$;vi^kX=!NX z0Qw0ACTM4<>tJX=1psq^uQE{=?&nM48_83m=s1p*FJRxQy z`w<1Qkj!~_Zdj86wUNcTUjBPdp}n;x<6Kg}2C zzX*Cn7^DAY{$KR>6o&ud|BJTK8T_A4{!Ra@!@hsf|1Uew=Tvi$>b;9r)AsGcX;dESLAN?5wcF?)sxu0&8Pm4{gW*$vLQ2(&o%yP&6L;Z9%&uBrNu=&rT z9)R<9ZC{{-{jW0!my4ZVr=Gy@2)%=r1Y4N=_!wdb5&W3?*5^@tiva|QohyT6DJcz% z0CJ|oUT?vlqsfWPQ@*+k#KVi)%3Xj=YHIM4`Tao!{MFPenr> zL2833@uDyT94FsonNYrP_qGwQs(qYwPd{%l;gwRwQ_g0*!5MuRA9(NO@j0YrCwFzh zb2Dqp+;|xlMo3zwaxTu4PE5y3ELvYM&HAgH7rUUGPG(*vv^`{SXWYKkD`a%-k?-uq z+3$}~1r5*Bk)`+Pj5bgVV;@YdaiK!5P{R6Us$fRnZOrqMD?qb2sSZL{ZA z!wfMw=rpk1H8I#T0cFyDMNY)+vl;($A=y=6(Rm}`uf;y_bsGZp*`<2W3 zY*$<+%tx-tc#wMu=4eF3)cj&}3>^>FalxU0thAcaeN(1`{)KX6(RuCa`+=8T2589* zcAmRwD4-`x;78Lxyz6*8{DXf_jG8f2@;^A{vj|=Bf+S*QXb+ZS!LvtdS`g zm-hvGd77?|hlKhvy#!1K(DtOFv6v1bfkrjCs57y;;D~QV774fz6>w`CHT{AJ&BZ~D zTPsIry%ZiFuVvV-gUtJygVa1KZyh?=*5w_%x9=T{(!~|OnJk?XKaH;@_Ll3n zb`36ynm}qlf;Nyff_4;+5lk1fX$Gz4uG)oLV{0oeJ7_(Q?R-^-qVwkf42j}n$?l8m zJxO)wIGS=uSYe8wL+l2O6m_(BNYF+A;4&o%)v9rtYr#}#Jaj;@yPnyL2 z%~YTF%1IiK4abPq2lca2k>N6a9A5f^E&ebbV1FYHt47`S&c%8|oMx>{r2sHBn)t3B z=PB&^k$V8tckyq1H+ur0-EE5=-Nj(fHp*P+leu1;KXpdTg~m0V%x_#TTica7+Ib4L zkbxYlqK_Zc`DT2!dGIp&0dVZk%l4=}OhG9VAFHKoMhpl396C$gce$FhLp)cEV)^xx z7T4}7)gl4^s>&-<`n{07NiiwMSAL)AA}0<-rz*3Rnzt)+`rdu^uVQ@RF1jFn?LNcE zuItfwu(!L7i*SyL7!26?@flQUR z$HusoNw*`mpnF;oJq0L9j+t6P=TKgsZZt2=!In^Q9v@kK{Je=)YPu;BtQ7LXo{B+d z00VK#eKUF7w-7k@&F&6m=Q>UL2mu#bBm+sr%6XHzvmSe^{ok1+vb*dG)Si zmS3bYR#Q*#N{3YJ1KOl;_~^@w>9iJWgDg9KpgnYSvrG)U=QW^g<@J8o$z@i%FYmJu zFx?Mrk{2(#v5R;!i19%bGWd?!{|{slOffJ;{gw?B{$`Xk`Wyg8fExE|*Ah4y_*+9l zl~p~xYYkc^nV0-;2D7e1UjLuL8zzhzOH82&w~&}EQi@a9`kV@8(9lVsp&9M6^x6;d zBxR>zY-D>x;9eC`CN*cEdva=n>a2cK|MV}lr(Tgo89{T<_CQ&M`bO)9G`<2DL(`zO zEK17sqoO)GAt&qoV;gE@hYVZ9%ZtN*dy`)x{V;n*1BJK;PTW`kz&sz*xUuZB(?;NM zDt2&Dx=XdEqR%>yMfgTL(N_(0B#}I`+(`H>wCa5%QoPp`$(&vyRpvW{2^x!AN6n$n zQs)}_`vhmO{b7~XB-Z@y^ah7PHPv7{9hR=epl!j%EJFI^$cQgtM9(q9n{K(d=W+$Q zcTEL6Prb@c%ofu!75nhRFummMRr&L?U+CN4SqyVdHfn^wFIEX2?={U7x}V5AHW9iB z{e8ZvDso`#cvg=djnELEGQki?j8Ty&2)kd2Tj|)ZVa8583AcwwboC9eg&CzIU*|hI zbZVKSX%ql=RrUl=M*yxG%) zjX*NNZ9$y;h5HtJbm}@LE&|+SeE^yC^JA)|TOUReFH;y6m;+OHYuMcEVhc$xdR4?2 zIHg^uKJCg!^x{;?|N0Pc=QJMzUn!!K1D@L?mm(hKyHkI~U4t}uW}%`?*KZ|)qY{e+|EgV0gEW)0}HE@fg#=a6Q1H<>@{lr#tO3gvCQbf)JNx=W)s|k&N zZ3o6fK8)^4BTkc|gzo$07Yr<=aAuwQ9Q{kayUr@`_3!g0$#XsnvCOb{)jxhb3~<<5Nbh-y_?mzK;}gHOisAl z9?u$UHJH^|Ya2aT+7c!5*9WLLPH2*Pd5GB+W+L`daNA#asF=$>F+OfjOXfP&G*IGG zJ;ge7HTrlSi!}b*?fY!1Dy0#K(rDVjE=$!)2bMhqU_a!@8;VGo;g(weMhXj7x;&?1 z#-vs7az8>@cwdG%!2pFl>a;D`UXU1chEa8fbKn~gIDM{oe%ZVnnolp^a{UMpM)%%} z?W}xzc%v|YEB+jAqg#77X2vb)TY`K!>=oruv%*XwK6;`M_xNyPd@5i3Rz%Mf=}8uK zVBCy4nX{<(=zMocZrNGqsupiYnQB^p#O7X@gVgQ!j{HNnTDLW68J*C<-lXewGtgcV%m=R0Df_@h+&k+ z5U+1KnI`(P)IUZeSH!z$JTx<5xtl^)|sLX2ffLz{Ho${CK<-))ZSh$ZCOi6x~XFTsNaLiYtNO5#)bg zcM)bP*%UlC+3%s3^Q$2pD;+|r4SVoq9~FM=j1>| zcB!iv4bFI>a03?NL(`DQ|9JkHK6d7&D-Jq)o3sx8t#;|t+T7m3TPK0{G8Amg3Glk|7{Ih+avqDy>R#x} z@v9?x9Lw~5s|iI$vPRzbzk>Grw2bajXo9g*>@Z!!2~6G!5bE-Lpgvv44{ z3cKUeTQvsu&rPpO75ce+`{cD711Cy`&5vk>=kr1`xh6jC`_CPU>ZL#>Pdfu)$n|R# zNYA$4e$t{U`3CD`=Qx+z8-g-7Zlj}dxFOMKWvx?h*Ptn!jBkS-*P^o^p8NWqw0@}M zzSv2Dn^H;g3F~S(fOP&x`!YnygV?f!TT<{NqpG|5RrusR#NR1tc?56xLIQty{oHWI z_JQfS>FNAqtG%A8fGjjCV72dGnKI{m9VeqEE%Iqw8q-qk?qs&HeBU-D(ZW zQo^-+(AHyhRlxOZZ6#->D%-}zDK3`JoqKN#&1sS% z{OC|h7VFwEB%)O!6zx4`se{P;{Y%W04-p4RYa$0Ox6ljT7ol^3J|0zv%G7(EgfR{g z50B0c_K(;F+S91)459lkj>s<-G*j_;w*>@Wn08^A5)poMCDmCqjapaBbDd-1Pgg&n znNu?QX)P}elE%jXj?K&xNj}1OYtjRiGGNIsNj8$*;$Hph!37$TUyattA9-sT{@VL4 z-)1(t=j@2aZvlI7N83iqfEKuo_CH?W*VioA0>L)#+@=PR8Y#RXHg0r ziZw3^W)0KEonS+0=W;gf1ZUtbpG$f0K#K`DfA1ayC`(M8Vc_{jd)4iJJ>-ctFfP5i z3=K&BpmG2_@sWCI7zux36?bN+3s=xNk~`;NPHv&)s(E^4Z>(Dc<@>|b!>3J5|1^!7 zx%zsRO>XrB+qv3`;h6}z8IqLk86?$?nBqBP1PMPZcX@cI#5=D}GkswaFD={Ub@Boh zdFp&?*(}!85>`{6lQ{HZG?K}ri<)x8-HB`){#K7VBBp6>9*t2egpzkT+PjOhO0MOJ zrAhb-gIh+XRaK*DvP}66<0)KmCB(XuZxDiedXs{Q+05pz@z!%B#arnF|HwSj`_*O1 z=Fn}y5!dmd$s~BC6Bv!C})aq zE^~lt+;JDJd*JFv!5liPNzBHN2{U??~XZA?WhJe3Hr>()W zHaZ732?&pXWpGTW*_KR++fpNp2p~RAPhqcJ0xRQo$ctTPe0FSZ70Psr*CV-;pRCS# zt+{g8kbyb9^I(d5TiJ>JUX|clQ2}@>%nqcLsDN6UkN0E!&hw#H?DrB5WvQOE>M7AG zEz|btIsh#y=1^BC-=tM9>Ek<z~4%@+_GaB<#XMR72h=;ZN!Z~f3So~7P- zP*PuCmj>*H5ynKj%a`hFNaGsEo(i;kJVy`B{^}GJLI%T7Vs^U% z8Sf^ogQsR%zq3NEZwj+393t8&{=-EdTSM!HyHl=hwuWL2ybuYm)9X;1vQtOPZ zfQi~5i5W1N8}n2 zkvu~=B4NpkfOAZzf&0BG6dARygEaXNwHvrRiuEs_R^PICvGuct`!9Z$pEP-xE!t^( zxOa7)!3rdKMs_O~5p7M@ULDWiB<(?_s0WbNC8D$;hYv=$o)aBHI5AQX$@YHp7N&$d zX_96pBxN6-NDnrPC1U2*oORUKI`i`a&a#9bHS&npTmi!VvYa)E{oAjHOC}J@p?^X@9u@qp6gM0`q4A$MW^R)2zz_2H%8seA~UC z-41msblwvao=3P1U`=+m+VCP8ilxcI6&auqEee1tylPq}q!mzeg!xu~MdIcUcJA&t z+hn73lF0Kw-si4Bvs)tPjQDdNPP~_QRLX#WcB?09h0ZHs^t6HS;KSd#giAtpArvQC z3GJ$qysNhXjBDO#+3raHVM=D-3SD4W6P}k2JGnHjI1fH+d6^ zm4dZpHa4|Jb?XVQ0e#6H1jd}T&9<8vlO)n~?V+=On+1Y*rztaKk`C&J$yYF*$DHG&oB;lFC$0b(#xl z+nU&b!2M)^ZW7fUi|?uQwqJI?*4|LOn#EP5v!Hk?oldg;7>MC1JP4LWxjz{{E!g(P ziG?_?BcmkvZj6%fhG_bUP3n@RM1JpG+g#8F1LT$*_llnUFQtJF(x#AHdytyts4?Jr=0~Vdmm9K$0 zx~twTrf3gi9pkGuYH1~NnPwD!&blWi3!*rEn7azfXeXoBTEmfV^7=%uFyMzat-AL8 zu6q@&{`5`kgvut%-eG(%0rkI-`&mXV{ z^4-bkmuU%@r&m-AdV3(WvWHKKR-IBkBgH+k@G-Pc#{#^bk}u*; z#g-q=FdsLsw&~@9T$MYRk?^z0pQT*qVx5Qe4qaz6UFAaaE(q$W5ZYj^S`?ER?_3Qb z7XVMVWVW}mv)aO22h)1K)^Cd>pFPn9;SJA3EFm7R)}1#iu|qo&?tEC)heB zC(SGoIe4D>b(&mlg%SXPdMFs44k#xYkqr10A1!=ZS_R$nSVWbvcgRW*MV%@BsG-dF z&j+>%bn(s>k#bJCc-e?KIYiCbPHlemYk7GYOPW-?ko? zRPMOSJ#dwxmKi~yZrYR+e2}{yIeb>CytghLjE17KB3Rmdf0`&)v6I;fg5J7oCE_~) z-p!6ps?n!j9da(ha>r{Qqp1*P(=8+;LvX;YZ|mJQXzc^(pNE&$JjNyJ%y25nK0u05 zdoDQxX`=Ax$s3Swb)!DaE5-PF91yVw_blK{Mt*_W#=}Gj6E2iRY)iL;*+56`=|g#k z09L6V4Xc^mWQeerC1Vf@_JRV>cZf(t>K}uv9U8+&M2`vzoye2jst8-rY6NPyNxs?o zdekC*mPi0#Yz)oD3%a5P-z^Ws)K8Tv`QJBr;(yhHrsi8VB3Ll87~w=Rj1fKob}0XY zD|}>%&XT`xm^RZ@N)^Ho1hT1D-o!?;&6a;Y7od#+@KcNl@FpuZf{;xv;ive9(x4>wm1h{@@l}}jbs#I>x?Je?tt~&sQK!CjZbNxjg_)F{t z)+QSOQjq~SVtxr8RdlEo6Z2v&+4Qspt^L}C08dx$>);%({Sz1Qv@4!k0`#4uzCs2E zB_d)!je-bpP0+f_a5NV|e2FVQ{M;So=tcUieWTR~jm!L(SX-;`OhAMO2TW*<&NCvl zjQ4dN2*C4nA(7-~N0B+5>>6<#Tl6Q}P!>>a4!-6pjdhGIvmXB*Wk)xZfrNeS0(0i& zT3ylJzPScb`TO2$8+L)P<&G;>D<6hLqa^Bl>G=W|$MeU7s^Ijpg~IRafn2S9Xs~pB z$k_n1Uqj98oQg4yq-77sFM+8w(J`~U6ElF0^-q$Xqc>Xwtm|Ljk!dKSOjk@z6nYEH0LST~CSGeIvSq^Pr$bljxO|Kk^RW}#t z5L#i^YnPh^NB7y(+_+pmW%%h5Tkx76?G++FHTJ2X@uPh@9suo==NDK4N#@C@VtgMw zfH*e~{%a6r==|5m=}lI>@e~Q!pV8ow9x7lALzg2e0RicGiT~WM`kGtbV%MxW*s=>y zod2fd!)1R}xM`Yf<%DNsMzGnCyRWC`5+ylE=d5w^rc+i7F2!F~~hhcVlz@6c>0 zLEmq}DppX&J3hzVYHm005>GKbOV_P}nE4)=9MDEc@FqFV_Bdx+#brAnTIzMNuF=i)ZMq7MZVz5t?Dgs%ke(_;-8|-7S6=$ zDyBC4=5{jz<|Am!M$<~`t>XQjcI_M7+;^~JCg@3^CVdWJ+HMNLaJ1N6G3Nh1y-qVA zk~Mf?tmRuSsO_3%f$WvvQC`og7v)x87L&QVX@Jm)O5vu2CMP~N@avd4Zx#yE%{AOA>;(BGdEz7=F7 z6o(B$H_4jp?@@pCiacrX93(9&ex$01$P#XWzmLw?-pxdo*caBJ624uYV0+lOM~y)h z&5Ghea7e$|GB}J#V6||-iN2oaY=l-f@D=qpTV^gu53K*P&7}#S3yN6>XoO$h>MFQC|#8Fk(4l(Eqr{#i6mUxDX`waHRoo>={QlH%8Y6cWeF>_wW?aXqVY@p>b13cAmBZRj`l+{SocDMz3vLbrVI36JthiUKj z;=QMG1#RU-XiL&jC{W&)_Y)xwxq`Vl!7_Lv^U?ke%ZplbT}>;gkZG*yFFRzYs}9^2 z3|eS4c1t?kYW|Z-`wsG=&S#-%sIc52n#`_TmefKEkeUe%@!11F+J}qj&qnlx6hNe_ zeQ0L}d6vcSHJL`>LVmOTR}o0{P-efm!^5jdXrAkR$Pdsu8k#Hx2~JJ4K3(?i&Q6NI z9v2zgSeGT}=RWLS{UyBOD&F%`GOKcG1yRdDui1!Y;Ws2u=*{&ZgP z)gn2+4+6Zdh1Q#st@a{9f1oGC>X6;P&dv*qca9?2?4Ve`z%pm4f{e6uAlvm2RJt7R zwMY~QkqFSe@7(I}pkLcQ3b`vxepGNX)|{tC%Qn1Yo0*r&KGXb+05`V3DlZO;Ri=6e z+tvKxyqkZ_E8$@-6HYuOB|IbcIG`~4&+5@3jTZom;RM9PPFcet4tRn)SG``Hb#)^e zwr8s{3nCWZfvJA^c!izh`>u8DkVcGX-jE1qI4WF+?jgU_yj@L7OUF~(%nz;kEM#scSAdm0NfGjJDtNrm^g50YYUU4 z8LJeX_B<9$#g>`!P+p9CaDwS-uGDntH--zAAMVNUvg{ue3H$9IxZTGJ#Lp5;q9EJ} z7>Ng(7cDH{R+5I3X|6gwTF_*4s(-~vtV39T+N1u$w12|*`>fmd5ZE@C22Yw;-sOdW z%zMiYI)#m{ieH$n`w1KQCb348mFb$cR^@8(*;^;CeYzR?F$Jx+f)+2k>akUy)8xxdX5rtwQBzlKpxgFsTWAuoLE z!01PM(5e$gBBsxJ)oHinn#i!I%e3U#cd*%v4KY2UjjESW-Zw}Hrb2XYs$&R+#cD}> zR&x8DZmXEObPB6wM$^bbFij{&H;{GMLZwO|Q*4vT-Q^9>94?+%D#_nI9S#6ytoUi$ z2z&*9*xI_It9mlm&1H->u2K!oE}{j6sry)}#dRnsWBHfCYgw=+uK5FVG}xP?<3CPC zd|PZ6)ERZ3U2qY-tQ7;4TjAI#p(RfWBt$7ZC3 zTKh?jt?a9gaef74*S2zN<;hhLOvUmZ{#J?bs;&Pljb|ATns*2Y{|hkMB;IBMP-N7* z>>Sq=cB1?Lgw897E%`6xQy+YyhCT?~XbOh%dKFS!;+-kf@YqYSNK1c+*1jY(AasKE z6%$I7S< z`n3`gY7Xbu++>EyA=`E+s+GmcwXXa zEk5cS<`Ean_s5QV0oDY1bu5v2pw#&XBw%eZ`(M? zf(cqHl3dsrzt~VUU$gSIwnA?q+ddwWzk&W;$ldbL8DHR1~Ig*uhdaDbcvcj|Ah&ow9H z6y8vX{#<9o=3RRtJa@&91UWt7nWsOlgH3otDL;m-7=H{Tvi`2_C$u}`JMJg!=^2qK`#fY2!3K8BGwnvqjZ3N55x7V zOV(Z32(@xV-!BDek~z7B2_;p_=gl-BMKa;(<7hY~)BCBVRM8Ex)5g=Zq*{A(4n8#j zJ?#^Pi^nNw*m<}2x9hmU<)x{?vKs|i5iQcf^Hp=69Tb-Ny_vR5JdqUc1Nn6;<(ljb zUUaIt-f56ue~*)J2c9)u{T;vkM*WfY{8G^!r_IKXQdYU{NblMh2C*ed5$BCA1ewip$X!DoSZs>Sf-CznaVc zgoz7q(sO``GQLOl5!3lxRe@!n6k=q2H?(D|Pp0Ymv>xd4%9pXoLCM?ah&AHfnOf@7 zM9~^@SGcj)#Gbg$_v!9Ls~wqN#-&Q(=F}`;9`X{>t>*}eFAPj(PBPA)$t*jumSsKZ z>o%=~^5QOL&hqeCzK<@{B6KyH1$Y6utC*^&msD8JiENrc0K#xIN51pI|{t zd3Tz)RpLZ&iSr#jSs9Zc-kC*3W#;hdV%`$;)cpsFu;X0q+fF?hd?6Rps_Y)$C410l zE2;*V9y9xU-29a}4mCt61KNfqJg&4iw=)H6)37B;JWE+y2UuATd#RYkdREY%OhoG7 z0Y*@5j(!U^CYJKR!Sgls7rA!L!gx6i$GQizo#-NvhyS7o3e#w@5%MnLbnbCi_4E^d zTha*7VD*^GnIhny!QJoTk}sdK98|F4>Tbw<#)vG+sE<-@jH<;532hvFjS*E6o zZ@bDB`>GZoO(yAe9k;ZXey;gl)>a6Q|C(C~(z%Xm*Hy|;Z_INFnbvpND(E#-41XdzzZFSY=mjt?@AWERD5KZHO z@I-ZIRd1@F5aS+q#QNVtd`%e@s*h5GvA#?F4c(YMVCG`lW3>T5UC5lha_TSfaf13_%58r-$CWw^^cd~Lwi6O42p0FC*3w6Rz zZ7o|#m=W8VipjkEO1M?(r6@6EUQE+l&WVPB{f=ql#RcvTv*sTfAH5wCUd}{5Oj*8( zS%U+J$>gQoKN=PyfbMhsQDq3&9CdqJzH&d%7*yc-ZAWK zhESm)scj?6O)PU4c)Z@=@pr}D`^>GDj5m|K;&9JFHi=@_6lUQ4E9SJRar9T&ZJpOVjq=8 z>CBdI{Gd@BP{QP+pzFV0l zU@0MPDyN|%>qt5J=~sCmG*5y6FIIq<)qqx8@Jc6_uZJL#@~ZsOT(^2_3YEsz$^72JnQ*d(*O|B~ok6BMyfzzs!dR5R5){Tv29`Xv`202s}knq&2={Uqxa1`w&6NVk~IKI z`A=1dDC(fWfspM;H7p9fGOFPA*FUfkqI(@o=pxjcyA#^M$$5?a#pfh=zGt9CZZ9h5 zDnCLS6eyDBIzo{6m(y9%{#O3h2lW0{!EUardJPeFKnIg~?M33=Ia>J^JkM7?E^~Jw zbTpF>p8CTO76n{Dz(=Qx@hSV4-}WBE)7f~S>AjiGJ%BCVQ}jAvc%nz7g`0xe;t*6m zzleJl-wH@01?5&FqTJTO+EH@DX!s0&jZOSl5&gd^>or!fRiXYrE4lygO9cNCgZ^Li lzb^>i+^rShzUvmsS?of`(GT~(iH#z literal 0 HcmV?d00001 From 58e68c2ad4347fe9c461773159935f0bdde662fe Mon Sep 17 00:00:00 2001 From: Michael Lazar Date: Sat, 2 Dec 2017 19:48:59 -0500 Subject: [PATCH 28/40] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9e664c2..cf7ceb3 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ -# RTV (Reddit Terminal Viewer) +

+Reddit Terminal Viewer +

RTV provides an interface to view and interact with reddit from your terminal.
It's compatible with *most* terminal emulators on Linux and OS X. From 4375f095a2a8dd31640bc6aadb0d6786b9a28d42 Mon Sep 17 00:00:00 2001 From: Michael Lazar Date: Sat, 2 Dec 2017 19:49:51 -0500 Subject: [PATCH 29/40] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cf7ceb3..b47b882 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -

+

Reddit Terminal Viewer

From cd6684f41bd544e522edd2644dbded2fa9d7b3e4 Mon Sep 17 00:00:00 2001 From: Michael Lazar Date: Sat, 2 Dec 2017 19:50:07 -0500 Subject: [PATCH 30/40] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b47b882..a068502 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@

Reddit Terminal Viewer -

+

RTV provides an interface to view and interact with reddit from your terminal.
It's compatible with *most* terminal emulators on Linux and OS X. From 4c759ed999457c56645cb5c58449e1fb2407f2d7 Mon Sep 17 00:00:00 2001 From: Michael Lazar Date: Sat, 2 Dec 2017 19:51:18 -0500 Subject: [PATCH 31/40] Update README.md --- README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/README.md b/README.md index a068502..58c5cf6 100644 --- a/README.md +++ b/README.md @@ -11,8 +11,6 @@ It's compatible with *most* terminal emulators on Linux and OS X. RTV is built in **python** using the **curses** library. ---- -

pypi @@ -31,8 +29,6 @@ RTV is built in **python** using the **curses** library.

---- - * [Demo](#demo) * [Installation](#installation) * [Usage](#usage) From 2cf6b1e2a9de1f1080bc70b6695c0001b6d1ac66 Mon Sep 17 00:00:00 2001 From: Michael Lazar Date: Sat, 2 Dec 2017 19:53:46 -0500 Subject: [PATCH 32/40] Update README.md --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 58c5cf6..a3ecbd5 100644 --- a/README.md +++ b/README.md @@ -2,14 +2,13 @@ Reddit Terminal Viewer

-RTV provides an interface to view and interact with reddit from your terminal.
-It's compatible with *most* terminal emulators on Linux and OS X. -

title image

-RTV is built in **python** using the **curses** library. +Reddit Terminal Viewer (RTV) is a lightweight TUI browser for www.reddit.com. It's built in **python** using **curses**, and is compatible with most terminal emulators on Linux and macOS. + +--

@@ -29,6 +28,8 @@ RTV is built in **python** using the **curses** library.

+-- + * [Demo](#demo) * [Installation](#installation) * [Usage](#usage) From 9c49543cb63a7ff2b869802c14dc7f285d592143 Mon Sep 17 00:00:00 2001 From: Michael Lazar Date: Sat, 2 Dec 2017 20:01:27 -0500 Subject: [PATCH 33/40] Update README.md --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a3ecbd5..1a11c6e 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,14 @@ Reddit Terminal Viewer +RTV provides an interface to view and interact with reddit from your terminal.
+It's compatible with most terminal emulators on Linux and macOS. +

title image

-Reddit Terminal Viewer (RTV) is a lightweight TUI browser for www.reddit.com. It's built in **python** using **curses**, and is compatible with most terminal emulators on Linux and macOS. +RTV is built in python using the curses library. -- From ec9bd2974db4ba8cdf4cd906b8ad7703767b15be Mon Sep 17 00:00:00 2001 From: Michael Lazar Date: Sat, 2 Dec 2017 20:03:45 -0500 Subject: [PATCH 34/40] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1a11c6e..add9f21 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ It's compatible with most terminal emulators on Linux and macOS. RTV is built in python using the curses library. --- +---

@@ -31,7 +31,7 @@ RTV is built in python using the curses library.

--- +--- * [Demo](#demo) * [Installation](#installation) From 5d8a128e8a69ae9e9758f9ea08c799fc302bf7e6 Mon Sep 17 00:00:00 2001 From: Michael Lazar Date: Sat, 2 Dec 2017 21:02:26 -0500 Subject: [PATCH 35/40] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index add9f21..93d7ac9 100644 --- a/README.md +++ b/README.md @@ -2,14 +2,18 @@ Reddit Terminal Viewer +

RTV provides an interface to view and interact with reddit from your terminal.
It's compatible with most terminal emulators on Linux and macOS. +

title image

+

RTV is built in python using the curses library. +

--- From 516f2c7473adbbf4578837e118e4cf7d61e03b2d Mon Sep 17 00:00:00 2001 From: Michael Lazar Date: Mon, 4 Dec 2017 11:15:31 -0500 Subject: [PATCH 36/40] Removing python 3.3 from the travis build. --- .travis.yml | 1 - setup.py | 1 - 2 files changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index cbd3026..007faa7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,6 @@ language: python dist: trusty python: - 2.7 - - 3.3 - 3.4 - 3.5 - 3.6 diff --git a/setup.py b/setup.py index 6821a61..37827d8 100644 --- a/setup.py +++ b/setup.py @@ -74,7 +74,6 @@ setuptools.setup( 'Operating System :: POSIX', 'Natural Language :: English', 'Programming Language :: Python :: 2.7', - 'Programming Language :: Python :: 3.3', 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', From ce90244b7a84ea49321b6255d6c69dc8ad4fadf0 Mon Sep 17 00:00:00 2001 From: Michael Lazar Date: Tue, 5 Dec 2017 00:45:36 -0500 Subject: [PATCH 37/40] Upping version --- AUTHORS.rst | 6 +++--- CHANGELOG.rst | 24 ++++++++++++++++++++++++ rtv.1 | 2 +- rtv/__version__.py | 2 +- rtv/packages/__init__.py | 2 +- rtv/packages/praw/__init__.py | 10 +++++++--- rtv/packages/praw/objects.py | 31 +++++++++++++++++++++++-------- 7 files changed, 60 insertions(+), 17 deletions(-) diff --git a/AUTHORS.rst b/AUTHORS.rst index b2cce2f..dc4c557 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -27,10 +27,10 @@ Thanks to the following people for their contributions to this project. * `Lorenz Leitner `_ * `Reshef Elisha `_ * `Ryan Reno `_ +* `jupart `_ * `afloofloo `_ * `Charles Saracco `_ -* `cmccandless `_ +* `Corey McCandless `_ * `Danilo G. Baio `_ * `Fabio Alessandro Locati `_ -* `Hans Roman `_ -* `Marc Abramowitz `_ \ No newline at end of file +* `Hans Roman `_ \ No newline at end of file diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 286284c..c4de868 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -2,6 +2,7 @@ RTV Changelog ============= +.. _1.20.0: http://github.com/michael-lazar/rtv/releases/tag/v1.20.0 .. _1.19.0: http://github.com/michael-lazar/rtv/releases/tag/v1.19.0 .. _1.18.0: http://github.com/michael-lazar/rtv/releases/tag/v1.18.0 .. _1.17.1: http://github.com/michael-lazar/rtv/releases/tag/v1.17.1 @@ -31,6 +32,29 @@ RTV Changelog .. _1.2.1: http://github.com/michael-lazar/rtv/releases/tag/v1.2.1 .. _1.2: http://github.com/michael-lazar/rtv/releases/tag/v1.2 +-------------------- +1.20.0_ (2017-12-05) +-------------------- + +Features + +* Text piped to the ``$PAGER`` will now wrap on word / sentence breaks. +* New MIME parsers have been added for liveleak.com and worldstarhiphop.com. + +Bugfixes + +* Fixed a regression where text from the web browser's stdout/stderr was + being sent to the terminal window. +* Fixed crashing on startup when the terminal doesn't support colors. +* Fixed broken text formatting when running inside of emacs ``term``. + +Codebase + +* Dropped support for python 3.3 because it's no longer supported upstream + by **pytest**. The application will still install through pip but will no + longer be tested. +* Added a text logo to the README. + -------------------- 1.19.0_ (2017-10-24) -------------------- diff --git a/rtv.1 b/rtv.1 index d12c145..3cd8a02 100644 --- a/rtv.1 +++ b/rtv.1 @@ -1,4 +1,4 @@ -.TH "RTV" "1" "October 24, 2017" "Version 1.19.0" "Usage and Commands" +.TH "RTV" "1" "December 05, 2017" "Version 1.20.0" "Usage and Commands" .SH NAME RTV - Reddit Terminal Viewer .SH SYNOPSIS diff --git a/rtv/__version__.py b/rtv/__version__.py index 9f0aedb..5e44d16 100644 --- a/rtv/__version__.py +++ b/rtv/__version__.py @@ -1,4 +1,4 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -__version__ = '1.19.0' +__version__ = '1.20.0' diff --git a/rtv/packages/__init__.py b/rtv/packages/__init__.py index 4932326..91663bf 100644 --- a/rtv/packages/__init__.py +++ b/rtv/packages/__init__.py @@ -10,7 +10,7 @@ from __future__ import absolute_import import sys -__praw_hash__ = 'f3bb10e497e8266faf82892c082b8d32aed6239a' +__praw_hash__ = 'f0373b788356e212be184590741383cc4747a682' __praw_bundled__ = True diff --git a/rtv/packages/praw/__init__.py b/rtv/packages/praw/__init__.py index 0c12d9c..f2215fc 100644 --- a/rtv/packages/praw/__init__.py +++ b/rtv/packages/praw/__init__.py @@ -2310,13 +2310,17 @@ class MultiredditMixin(AuthenticatedReddit): """ url = self.config['multireddit_about'].format(user=self.user.name, multi=name) - self.http.headers['x-modhash'] = self.modhash + + # The modhash isn't necessary for OAuth requests + if not self._use_oauth: + self.http.headers['x-modhash'] = self.modhash + try: self.request(url, data={}, method='DELETE', *args, **kwargs) finally: - del self.http.headers['x-modhash'] + if not self._use_oauth: + del self.http.headers['x-modhash'] - @decorators.restrict_access(scope='subscribe') def edit_multireddit(self, *args, **kwargs): """Edit a multireddit, or create one if it doesn't already exist. diff --git a/rtv/packages/praw/objects.py b/rtv/packages/praw/objects.py index f308938..b5cd607 100644 --- a/rtv/packages/praw/objects.py +++ b/rtv/packages/praw/objects.py @@ -1660,6 +1660,13 @@ class Subreddit(Messageable, Refreshable): class Multireddit(Refreshable): """A class for users' Multireddits.""" + # 2017-11-13 + # Several of the @restrict_access decorators have been removed here, + # because they were duplicated in the corresponding reddit_session + # methods and raised assertion errors. The is the same category of + # bug as this issue: + # https://github.com/praw-dev/praw/issues/477 + # Generic listing selectors get_controversial = _get_sorter('controversial') get_hot = _get_sorter('') @@ -1694,6 +1701,15 @@ class Multireddit(Refreshable): def __init__(self, reddit_session, author=None, name=None, json_dict=None, fetch=False, **kwargs): """Construct an instance of the Multireddit object.""" + + # When get_my_multireddits is called, we extract the author + # and multireddit name from the path. A trailing forward + # slash was recently added to the path string in the API + # response, the needs to be removed to fix the code. + # path = "/user/redditor/m/multi/" + if json_dict and json_dict['path']: + json_dict['path'] = json_dict['path'].rstrip('/') + author = six.text_type(author) if author \ else json_dict['path'].split('/')[-3] if not name: @@ -1742,16 +1758,19 @@ class Multireddit(Refreshable): url = self.reddit_session.config['multireddit_add'].format( user=self._author, multi=self.name, subreddit=subreddit) method = 'DELETE' if _delete else 'PUT' - self.reddit_session.http.headers['x-modhash'] = \ - self.reddit_session.modhash + # The modhash isn't necessary for OAuth requests + if not self.reddit_session._use_oauth: + self.reddit_session.http.headers['x-modhash'] = \ + self.reddit_session.modhash data = {'model': dumps({'name': subreddit})} try: self.reddit_session.request(url, data=data, method=method, *args, **kwargs) finally: - del self.reddit_session.http.headers['x-modhash'] + # The modhash isn't necessary for OAuth requests + if not self.reddit_session._use_oauth: + del self.reddit_session.http.headers['x-modhash'] - @restrict_access(scope='subscribe') def copy(self, to_name): """Copy this multireddit. @@ -1763,7 +1782,6 @@ class Multireddit(Refreshable): return self.reddit_session.copy_multireddit(self._author, self.name, to_name) - @restrict_access(scope='subscribe') def delete(self): """Delete this multireddit. @@ -1774,7 +1792,6 @@ class Multireddit(Refreshable): """ return self.reddit_session.delete_multireddit(self.name) - @restrict_access(scope='subscribe') def edit(self, *args, **kwargs): """Edit this multireddit. @@ -1786,12 +1803,10 @@ class Multireddit(Refreshable): return self.reddit_session.edit_multireddit(name=self.name, *args, **kwargs) - @restrict_access(scope='subscribe') def remove_subreddit(self, subreddit, *args, **kwargs): """Remove a subreddit from the user's multireddit.""" return self.add_subreddit(subreddit, True, *args, **kwargs) - @restrict_access(scope='subscribe') def rename(self, new_name, *args, **kwargs): """Rename this multireddit. From afaa0bf2b3946cb0e7d2d06a00cb9f0ae97a95f5 Mon Sep 17 00:00:00 2001 From: Michael Lazar Date: Thu, 7 Dec 2017 00:22:08 -0500 Subject: [PATCH 38/40] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 93d7ac9..0d81f7e 100644 --- a/README.md +++ b/README.md @@ -73,9 +73,9 @@ $ brew install rtv $ apt install rtv # Arch -$ yaourt -S rtv +$ pacaur -S rtv -# Nix/NixOS +# Nix $ nix-env -i rtv ``` From b828001c6677b252892b2e11162c2bb091eca4b7 Mon Sep 17 00:00:00 2001 From: Michael Lazar Date: Thu, 7 Dec 2017 01:03:34 -0500 Subject: [PATCH 39/40] Adding surf to the list of default webbrowsers --- rtv/objects.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rtv/objects.py b/rtv/objects.py index cec6add..68c9160 100644 --- a/rtv/objects.py +++ b/rtv/objects.py @@ -33,6 +33,10 @@ def patch_webbrowser(): https://bugs.python.org/issue31348 """ + # Add the suckless.org surf browser, which isn't in the python + # standard library + webbrowser.register('surf', None, webbrowser.BackgroundBrowser('surf')) + if sys.platform != 'darwin' or 'BROWSER' not in os.environ: return From 35c847293217ffd51959a625480d63582e52526b Mon Sep 17 00:00:00 2001 From: Michael Lazar Date: Thu, 7 Dec 2017 01:40:26 -0500 Subject: [PATCH 40/40] Fixing the command for the opera webbrowser --- rtv/objects.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rtv/objects.py b/rtv/objects.py index 68c9160..0fc362b 100644 --- a/rtv/objects.py +++ b/rtv/objects.py @@ -37,6 +37,11 @@ def patch_webbrowser(): # standard library webbrowser.register('surf', None, webbrowser.BackgroundBrowser('surf')) + # Fix the opera browser, see https://github.com/michael-lazar/rtv/issues/476. + # By default, opera will open a new tab in the current window, which is + # what we want to do anyway. + webbrowser.register('opera', None, webbrowser.BackgroundBrowser('opera')) + if sys.platform != 'darwin' or 'BROWSER' not in os.environ: return