diff --git a/MANIFEST.in b/MANIFEST.in index 10eea76..52e2bf6 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -4,5 +4,4 @@ include CONTRIBUTORS.rst include README.rst include LICENSE include rtv.1 -include rtv/rtv.cfg include rtv/templates/* diff --git a/README.rst b/README.rst index 79bb11f..9c2b6d7 100644 --- a/README.rst +++ b/README.rst @@ -100,7 +100,7 @@ Auto-generate the config file by running $ rtv --copy-config -See the `default config `_ for the full list of settings. +See the `default config `_ for the full list of settings. ------ Editor diff --git a/rtv/__main__.py b/rtv/__main__.py index 0c3d2c1..2552efa 100644 --- a/rtv/__main__.py +++ b/rtv/__main__.py @@ -10,7 +10,7 @@ import praw import tornado from . import docs -from .config import Config, copy_default_config +from .config import Config, copy_default_config, copy_default_mailcap from .oauth import OAuthHelper from .terminal import Terminal from .objects import curses_session, Color @@ -59,6 +59,10 @@ def main(): copy_default_config() return + if config['copy_mailcap']: + copy_default_mailcap() + return + # Load the browsing history from previous sessions config.load_history() diff --git a/rtv/config.py b/rtv/config.py index d93c849..702e11e 100644 --- a/rtv/config.py +++ b/rtv/config.py @@ -16,9 +16,11 @@ from .objects import KeyMap PACKAGE = os.path.dirname(__file__) HOME = os.path.expanduser('~') TEMPLATE = os.path.join(PACKAGE, 'templates') -DEFAULT_CONFIG = os.path.join(PACKAGE, 'rtv.cfg') +DEFAULT_CONFIG = os.path.join(TEMPLATE, 'rtv.cfg') +DEFAULT_MAILCAP = os.path.join(TEMPLATE 'mailcap') XDG_HOME = os.getenv('XDG_CONFIG_HOME', os.path.join(HOME, '.config')) CONFIG = os.path.join(XDG_HOME, 'rtv', 'rtv.cfg') +MAILCAP = os.path.join(XDG_HOME, '.mailcap') TOKEN = os.path.join(XDG_HOME, 'rtv', 'refresh-token') HISTORY = os.path.join(XDG_HOME, 'rtv', 'history.log') @@ -59,33 +61,50 @@ def build_parser(): parser.add_argument( '--copy-config', dest='copy_config', action='store_const', const=True, help='Copy the default configuration to {HOME}/.config/rtv/rtv.cfg') + parser.add_argument( + '--copy-mailcap', dest='copy_mailcap', action='store_const', const=True, + help='Copy an example mailcap configuration to {HOME}/.mailcap') parser.add_argument( '--enable-media', dest='enable_media', action='store_const', const=True, help='Open external links using programs defined in the mailcap config') return parser +def copy_default_mailcap(filename=MAILCAP): + """ + Copy the example mailcap configuration to the specified file. + """ + return _copy_settings_file(DEFAULT_MAILCAP, filename, 'mailcap') + + def copy_default_config(filename=CONFIG): """ - Copy the default configuration file to the user's {HOME}/.config/rtv + Copy the default rtv user configuration to the specified file. + """ + return _copy_settings_file(DEFAULT_CONFIG, filename, 'config') + + +def _copy_settings_file(source, destination, name): + """ + Copy a file from the repo to the user's home directory. """ - if os.path.exists(filename): + if os.path.exists(destination): try: ch = six.moves.input( - 'File %s already exists, overwrite? y/[n]):' % filename) + 'File %s already exists, overwrite? y/[n]):' % destination) if ch not in ('Y', 'y'): return except KeyboardInterrupt: return - filepath = os.path.dirname(filename) + filepath = os.path.dirname(destination) if not os.path.exists(filepath): os.makedirs(filepath) - print('Copying default settings to %s' % filename) - shutil.copy(DEFAULT_CONFIG, filename) - os.chmod(filename, 0o664) + print('Copying default %s to %s' % (name, destination)) + shutil.copy(source, destination) + os.chmod(destination, 0o664) class OrderedSet(object): @@ -243,4 +262,4 @@ class Config(object): filepath = os.path.dirname(filename) if not os.path.exists(filepath): - os.makedirs(filepath) \ No newline at end of file + os.makedirs(filepath) diff --git a/mailcap b/rtv/templates/mailcap similarity index 75% rename from mailcap rename to rtv/templates/mailcap index 178bc11..fbb938b 100644 --- a/mailcap +++ b/rtv/templates/mailcap @@ -1,5 +1,5 @@ # Example mailcap file for Reddit Terminal Viewer -# + # Copy the contents of this file to {HOME}/.mailcap, or point to using $MAILCAPS # Then launch RTV using the --enable-media flag. All shell commands defined in # this file depend on external programs that must be installed on your system. @@ -23,12 +23,12 @@ image/*; feh -g 640x480 '%s'; test=test -n "$DISPLAY" # Youtube videos are assigned a custom mime-type, which can be streamed with # vlc or youtube-dl. -video/x-youtube; vlc '%s'; test=test -n "$DISPLAY" -video/x-youtube; youtube-dl -q -o - '%s' | mpv -; test=test -n "$DISPLAY" +video/x-youtube; vlc '%s' --width 640 --height 480; test=test -n "$DISPLAY" +video/x-youtube; youtube-dl -q -o - '%s' | mpv - --autofit 640x480; test=test -n "$DISPLAY" # Mpv is a simple and effective video streamer -video/webm; mpv '%s'; test=test -n "$DISPLAY" -video/*; mpv '%s'; test=test -n "$DISPLAY" +video/webm; mpv '%s' --autofit 640x480; test=test -n "$DISPLAY" +video/*; mpv '%s' --autofit 640x480; test=test -n "$DISPLAY" ############################################################################### # Commands below this point will attempt to display media directly in the @@ -36,14 +36,20 @@ video/*; mpv '%s'; test=test -n "$DISPLAY" ############################################################################### # View true images in the terminal, supported by rxvt-unicode, xterm and st +# Requires the w3m-img package # image/*; w3m -o 'ext_image_viewer=off' '%s'; needsterminal -# Ascii images: download, convert to jpg, and print with img2txt # Don't have a solution for albums yet image/x-imgur-album; echo + +# 256 color images using half-width unicode characters +# Much higher quality that img2txt, but must be built from source +# https://github.com/rossy/img2xterm +image/*; curl -s '%s' | convert -resize 80x80 - jpg:/tmp/rtv.jpg && img2xterm /tmp/rtv.jpg; needsterminal; copiousoutput + +# Display images in classic ascii using img2txt and lib-caca image/*; curl -s '%s' | convert - jpg:/tmp/rtv.jpg && img2txt -f utf8 /tmp/rtv.jpg; needsterminal; copiousoutput # Ascii videos video/x-youtube; youtube-dl -q -o - '%s' | mplayer -cache 8192 -vo caca -quiet -; needsterminal video/*; wget '%s' -O - | mplayer -cache 8192 -vo caca -quiet -; needsterminal - diff --git a/rtv/rtv.cfg b/rtv/templates/rtv.cfg similarity index 100% rename from rtv/rtv.cfg rename to rtv/templates/rtv.cfg diff --git a/setup.py b/setup.py index 30a8047..56f34d7 100644 --- a/setup.py +++ b/setup.py @@ -21,7 +21,7 @@ setuptools.setup( license='MIT', keywords='reddit terminal praw curses', packages=['rtv'], - package_data={'rtv': ['templates/*', 'rtv.cfg']}, + package_data={'rtv': ['templates/*']}, data_files=[("share/man/man1", ["rtv.1"])], extras_require={ ':python_version=="2.6" or python_version=="2.7"': ['futures']}, diff --git a/tests/test_config.py b/tests/test_config.py index eb1bcf4..a934fc2 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -5,7 +5,7 @@ import os import codecs from tempfile import NamedTemporaryFile -from rtv.config import Config, copy_default_config, DEFAULT_CONFIG +from rtv.config import Config, copy_default_config, copy_default_mailcap try: from unittest import mock @@ -20,6 +20,19 @@ def test_copy_default_config(): with mock.patch('rtv.config.six.moves.input', return_value='y'): copy_default_config(fp.name) assert fp.read() + # Check that the permissions were changed + permissions = os.stat(fp.name).st_mode & 0o777 + assert permissions == 0o664 + + +def test_copy_default_mailcap(): + "Make sure the example mailcap file was included in the package" + + with NamedTemporaryFile() as fp: + with mock.patch('rtv.config.six.moves.input', return_value='y'): + copy_default_mailcap(fp.name) + assert fp.read() + # Check that the permissions were changed permissions = os.stat(fp.name).st_mode & 0o777 assert permissions == 0o664 diff --git a/tests/test_mime_parsers.py b/tests/test_mime_parsers.py index 355d60f..6be8aa2 100644 --- a/tests/test_mime_parsers.py +++ b/tests/test_mime_parsers.py @@ -52,7 +52,7 @@ URLS = { } -@pytest.mark.parametrize(ARGS, URLS.values(), ids=URLS.keys()) +@pytest.mark.parametrize(ARGS, URLS.values(), ids=list(URLS)) def test_parser(url, modified_url, mime_type, reddit): # Include the reddit fixture so the cassettes get generated