diff --git a/README.md b/README.md index 18535cc..f2d7b71 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Needless to say, this is being developed for and tested on Linux. If you're on W ``` $ pip install pysftp pyperclip pillow ``` -as well as `escrotum` or `i3-scrot` (if you’re using i3wm) and `notify-send` which should be available in your favorite package manager +as well as `maim` (https://github.com/naelstrof/maim) and `notify-send` which should be available in your favorite package manager (or pre-installed, depending on your distribution and desktop environment). ### Usage diff --git a/config.py b/config.py index 5df1c30..feee6ad 100644 --- a/config.py +++ b/config.py @@ -16,12 +16,8 @@ curl_command = None # This is where the screenshots are saved locally local_directory = '/home/kageru/pyshare/' - -# Use i3scrot for screen capture. Otherwise, escrotum will be used. -# You might have to install the capture tool you want to use via your package manager. -# i3scrot was much faster for me when working with multiple high-res displays. -# If you do use it, you manually need to set its save directory to your local_directory (above) + 'tmp' in ~/.config/i3-scrot.conf -use_i3scrot = False +# If set to false, images will be deleted after uploading them +keep_local_copies = True # Directory on the ftp server where you want the screenshots to be sent remote_directory = '/usr/share/nginx/html/pyshare/' diff --git a/pyshare.py b/pyshare.py index 7dbffae..5a3a916 100755 --- a/pyshare.py +++ b/pyshare.py @@ -14,11 +14,12 @@ import re character_pool = ascii_letters + digits + def parse_arguments(): parser = ArgumentParser() - parser.add_argument('-m' '--mode', type=str, - help='Sets the input mode. Allowed values are "screenshot" and "clipboard". Implicit it file(s) are set.') - parser.add_argument('-f', '--files', type=str, nargs='*', help='List of files to be uploaded') + parser.add_argument('-m' '--mode', type=str, dest='mode', default='screenshot', + help='Sets the input mode. Allowed values are "screenshot" and "clipboard". Implicit it file(s) are set.') + parser.add_argument('-f', '--files', type=str, nargs='*', dest='files', help='List of files to be uploaded') return parser.parse_args() @@ -37,6 +38,7 @@ def find_valid_filename(prefix, length, ext, conn): return find_valid_filename(prefix, length + 1, ext, conn) return filename + def upload_local_file(path: str) -> str: if config.uploader in ['ftp', 'sftp']: filename = ftp_upload(path)[1] @@ -46,22 +48,12 @@ def upload_local_file(path: str) -> str: def take_screenshot() -> None: - tmppath = os.path.join(config.local_directory, 'tmp') - if not os.path.isdir(tmppath): - os.mkdir(tmppath) - else: - tmpdir = os.listdir(tmppath) - for f in tmpdir: - os.remove(os.path.join(tmppath, f)) - if config.use_i3scrot: - call(['i3-scrot', '-s']) - file = os.path.join(tmppath, os.listdir(tmppath)[0]) - else: - tempname = generate_filename(3, 'png') - call(['escrotum', '-s', tempname]) - file = os.path.join(tmppath, tempname) - ftp_upload(ext='png', sourcefile=file) - os.remove(file) + tempname = generate_filename(config.length, 'png') + file = os.path.join(config.local_directory, tempname) + call(['maim', '-s', file]) + ftp_upload(ext='png', sourcefile=file, mode='screenshot') + if not config.keep_local_copies: + os.remove(file) def ftp_upload(sourcefile, *, mode=None, ext=None) -> tuple: @@ -70,19 +62,32 @@ def ftp_upload(sourcefile, *, mode=None, ext=None) -> tuple: exts = { 'screenshot': 'png', 'text': 'txt', - } - ext = exts.get(mode, mode not in exts and sourcefile.split('.')[-1]) # Only do the split if necessary + } + if re.search('\.tar\.\w{1,4}]', sourcefile): + # properly handle .tar.something files + ext = sourcefile.split('.')[-2:] + else: + ext = exts.get(mode, mode not in exts and sourcefile.split('.')[-1]) # Only do the split if necessary with Connection(config.sftp_address, username=config.username, password=config.password, - private_key=config.private_key, private_key_pass=config.private_key_pass) as conn: + private_key=config.private_key, private_key_pass=config.private_key_pass) as conn: conn.chdir(config.remote_directory) - - filename = find_valid_filename(prefix=config.prefix, length=config.length, ext=ext, conn=conn) + os.chdir(config.local_directory) + + cur_name = sourcefile.split('/')[-1] + filename = cur_name + if mode == 'screenshot': + if conn.exists(cur_name): + filename = find_valid_filename(prefix=config.prefix, length=config.length, ext=ext, conn=conn) + conn.put(filename, filename) + else: + filename = find_valid_filename(prefix=config.prefix, length=config.length, ext=ext, conn=conn) + + if mode == 'file': + conn.put(sourcefile, filename) + fullpath = os.path.join(config.local_directory, filename) - if mode == 'file': - conn.put(sourcefile, filename) - notify_user(config.url_template.format(filename)) return fullpath, filename @@ -107,13 +112,13 @@ def notify_user(url, image=None): def parse_text(args): - text = pyperclip.paste() - if re.match(r'(https?|s?ftp)://', text): - mirror_file(text) - elif os.path.isfile(text): - upload_local_file(text) - else: - upload_text(text) + text = pyperclip.paste() + if re.match(r'(https?|s?ftp)://', text): + mirror_file(text) + elif os.path.isfile(text): + upload_local_file(text) + else: + upload_text(text) def mirror_file(text): @@ -136,14 +141,14 @@ def upload_text(text): if __name__ == '__main__': args = parse_arguments() - if args.mode == 'clipboard': - parse_text(pyperclip.paste()) - elif args.mode == 'screenshot' + if args.mode == 'screenshot': take_screenshot() + elif args.mode == 'clipboard': + parse_text(pyperclip.paste()) else: for file in args.files: upload_local_file(file) - + """ if config.uploader in ['ftp', 'sftp']: if args.files is not None: