From b5a1649bc01eba859980ed4f37f52b0167955dcf Mon Sep 17 00:00:00 2001 From: Ethan Dalool Date: Fri, 3 Nov 2017 12:50:16 -0700 Subject: [PATCH] else --- Javascript/opendir_image.js | 5 +- Safeprint/safeprint.py | 4 +- SpinalTap/spinal.py | 8 +- Templates/flask/flasksite.py | 5 + Templates/flask/flasksite_launch.py | 6 +- Toolbox/crop.py | 21 ++++ Toolbox/getcrx.py | 142 ++++++++++++++++++++++++++++ Toolbox/head.py | 15 +++ Toolbox/repeat.py | 16 ++++ Toolbox/resize.py | 29 ++++++ Toolbox/search.py | 20 +++- Toolbox/unique.py | 18 ++-- 12 files changed, 267 insertions(+), 22 deletions(-) create mode 100644 Toolbox/crop.py create mode 100644 Toolbox/getcrx.py create mode 100644 Toolbox/head.py create mode 100644 Toolbox/repeat.py create mode 100644 Toolbox/resize.py diff --git a/Javascript/opendir_image.js b/Javascript/opendir_image.js index cf10790..377a691 100644 --- a/Javascript/opendir_image.js +++ b/Javascript/opendir_image.js @@ -9,7 +9,7 @@ var image_height = 200; var video_height = 300; var audio_width = 1000; var IMAGE_TYPES = ["\\.jpg", "\\.jpeg", "\\.jpg", "\\.bmp", "\\.tiff", "\\.tif", "\\.bmp", "\\.gif", "\\.png", "reddituploads\.com"].join("|"); -var AUDIO_TYPES = ["\\.aac", "\\.mp3", "\\.m4a", "\\.ogg", "\\.opus", "\\.wav"].join("|"); +var AUDIO_TYPES = ["\\.aac", "\\.flac", "\\.mp3", "\\.m4a", "\\.ogg", "\\.opus", "\\.wav"].join("|"); var VIDEO_TYPES = ["\\.mp4", "\\.m4v", "\\.webm", "\\.ogv"].join("|"); IMAGE_TYPES = new RegExp(IMAGE_TYPES, "i"); AUDIO_TYPES = new RegExp(AUDIO_TYPES, "i"); @@ -22,7 +22,8 @@ var CSS = "" + "audio, video { display: block; }" + "audio { width: $audio_width$px; }" + "video { height: $video_height$px; }" -+ "img { display: block; height: $image_height$px; max-width: 100% }" ++ "img { display: block; height: $image_height$px; max-width: 100%; }" ++ "a { color: #000 !important; }" + ".control_panel { position: relative; background-color: #aaa; min-height: 10px; width: 100%; }" + ".workspace { background-color: #ddd; min-height: 10px; float: left; }" + ".arealabel { position:absolute; right: 0; bottom: 0; opacity: 0.8; background-color: #000; color: #fff; }" diff --git a/Safeprint/safeprint.py b/Safeprint/safeprint.py index 51889d8..196e565 100644 --- a/Safeprint/safeprint.py +++ b/Safeprint/safeprint.py @@ -2,7 +2,7 @@ This function is slow and ugly, but I need a way to safely print unicode strings on systems that don't support it without crippling those who do. ''' -def safeprint(text, file_handle=None): +def safeprint(text, file_handle=None, end='\n'): for character in text: try: if file_handle: @@ -15,4 +15,4 @@ def safeprint(text, file_handle=None): else: print('?', end='', flush=False) if not file_handle: - print() + print(end, end='', flush=True) diff --git a/SpinalTap/spinal.py b/SpinalTap/spinal.py index 0c9d3d0..fb2f188 100644 --- a/SpinalTap/spinal.py +++ b/SpinalTap/spinal.py @@ -53,7 +53,7 @@ def callback_v1(fpobj, written_bytes, total_bytes): ''' filename = fpobj.absolute_path.encode('ascii', 'replace').decode() if written_bytes >= total_bytes: - ends = '\n' + ends = '\r\n' else: ends = '' percent = (100 * written_bytes) / max(total_bytes, 1) @@ -414,7 +414,11 @@ def copy_file( written_bytes = 0 while True: - data_chunk = source_handle.read(CHUNK_SIZE) + try: + data_chunk = source_handle.read(CHUNK_SIZE) + except PermissionError as e: + print(source) + raise data_bytes = len(data_chunk) if data_bytes == 0: break diff --git a/Templates/flask/flasksite.py b/Templates/flask/flasksite.py index 17b13d0..4589998 100644 --- a/Templates/flask/flasksite.py +++ b/Templates/flask/flasksite.py @@ -115,6 +115,11 @@ def get_static(filename): filename = os.path.join('static', filename) return flask.send_file(filename) +@site.route("/float/") +def float_type(value): + print(value + 1) + return "correct" + if __name__ == '__main__': #site.run(threaded=True) pass diff --git a/Templates/flask/flasksite_launch.py b/Templates/flask/flasksite_launch.py index 0566bc6..191173c 100644 --- a/Templates/flask/flasksite_launch.py +++ b/Templates/flask/flasksite_launch.py @@ -13,17 +13,17 @@ else: if port == 443: http = gevent.pywsgi.WSGIServer( - listener=('', port), + listener=('0.0.0.0', port), application=flasksite.site, keyfile='https\\flasksite.key', certfile='https\\flasksite.crt', ) else: http = gevent.pywsgi.WSGIServer( - listener=('', port), + listener=('0.0.0.0', port), application=flasksite.site, ) -print('Starting server') +print('Starting server on port %d' % port) http.serve_forever() diff --git a/Toolbox/crop.py b/Toolbox/crop.py new file mode 100644 index 0000000..60fbebe --- /dev/null +++ b/Toolbox/crop.py @@ -0,0 +1,21 @@ +import os +import sys +from PIL import Image + +filename = sys.argv[1] +(name, extension) = os.path.splitext(filename) +newname = '%s_cropped%s' % (name, extension) + +crops = sys.argv[2:] +crops = ' '.join(crops) +crops = crops.replace(',', ' ') +crops = crops.replace(' ', ' ') +crops = crops.split(' ') +crops = [int(x) for x in crops] +crops = list(crops) +print(crops) +i = Image.open(filename) +if len(crops) == 2: + crops.extend(i.size) +i = i.crop(crops) +i.save(newname, quality=100) diff --git a/Toolbox/getcrx.py b/Toolbox/getcrx.py new file mode 100644 index 0000000..5289570 --- /dev/null +++ b/Toolbox/getcrx.py @@ -0,0 +1,142 @@ +import argparse +import io +import json +import os +import requests +import sys +import time +import traceback +import zipfile + +from voussoirkit import clipext + +FILENAME_BADCHARS = '\\/:*?<>|"' + +WEBSTORE_URL = 'https://chrome.google.com/webstore/detail/x/{extension_id}' +CRX_URL = 'https://clients2.google.com/service/update2/crx?response=redirect&prodversion=59.0&x=id%3D{extension_id}%26installsource%3Dondemand%26uc' + +def sanitize_filename(name): + for c in FILENAME_BADCHARS: + name = name.replace(c, '-') + return name + +def prompt_permission(prompt): + answer = input(prompt) + return answer.lower() in {'yes', 'y'} + +def get_webstore_name_version(extension_id): + url = WEBSTORE_URL.format(extension_id=extension_id) + response = requests.get(url) + try: + name = response.text + name = name.split('meta property="og:title" content="')[1] + name = name.split('"')[0] + except IndexError: + name = None + + try: + version = response.text + version = version.split('meta itemprop="version" content="')[1] + version = version.split('"')[0] + except IndexError: + version = None + + return (name, version) + +def get_crx_name_version(crx_bytes): + crx_handle = io.BytesIO(crx_bytes) + crx_archive = zipfile.ZipFile(crx_handle) + manifest = json.loads(crx_archive.read('manifest.json')) + name = manifest.get('name', None) + version = manifest.get('version', None) + return (name, version) + +def getcrx(extension_id, auto_overwrite=None): + url = CRX_URL.format(extension_id=extension_id) + response = requests.get(url) + response.raise_for_status() + + (name, version) = get_webstore_name_version(extension_id) + if name is None or version is None: + (crx_name, crx_ver) = get_crx_name_version(response.content) + name = name or crx_name + version = version or crx_version + + name = name or extension_id + version = version or time.strftime('%Y%m%d') + + version = version or response.url.split('/')[-1] + + crx_filename = '{name} ({id}) [{version}]' + crx_filename = crx_filename.format( + name=name, + id=extension_id, + version=version, + ) + + if not crx_filename.endswith('.crx'): + crx_filename += '.crx' + + crx_filename = sanitize_filename(crx_filename) + if os.path.isfile(crx_filename): + if auto_overwrite is None: + message = '"%s" already exists. Overwrite?' % crx_filename + permission = prompt_permission(message) + else: + permission = False + else: + permission = True + + if permission: + crx_handle = open(crx_filename, 'wb') + crx_handle.write(response.content) + print('Downloaded "%s".' % crx_filename) + +def getcrx_argparse(args): + extension_ids = [] + + if len(args.extension_ids) == 1: + extension_ids.extend(clipext.resolve(args.extension_ids[0], split_lines=True)) + + elif args.extension_ids: + extension_ids.extend(args.extension_ids) + + if args.file: + with open(args.file, 'r') as handle: + lines = handle.readlines() + extension_ids.extend(lines) + + extension_ids = [x.split('/')[-1].strip() for x in extension_ids] + + if args.overwrite and not args.dont_overwrite: + auto_overwrite = True + elif args.dont_overwrite and not args.overwrite: + auto_overwrite = False + else: + auto_overwrite = None + + for extension_id in extension_ids: + try: + getcrx(extension_id, auto_overwrite=auto_overwrite) + except Exception: + if args.fail_early: + raise + else: + traceback.print_exc() + print('Resuming...') + +def main(argv): + parser = argparse.ArgumentParser() + + parser.add_argument('extension_ids', nargs='*', default=None) + parser.add_argument('--file', dest='file', default=None) + parser.add_argument('--fail_early', dest='fail_early', action='store_true') + parser.add_argument('--overwrite', dest='overwrite', action='store_true') + parser.add_argument('--dont_overwrite', dest='dont_overwrite', action='store_true') + parser.set_defaults(func=getcrx_argparse) + + args = parser.parse_args(argv) + args.func(args) + +if __name__ == '__main__': + main(sys.argv[1:]) diff --git a/Toolbox/head.py b/Toolbox/head.py new file mode 100644 index 0000000..c7ecaa3 --- /dev/null +++ b/Toolbox/head.py @@ -0,0 +1,15 @@ +''' +Perform a HEAD request and print the results. +''' +import sys +import json +import requests + +from voussoirkit import clipext + +url = clipext.resolve(sys.argv[1]) +page = requests.head(url) +headers = dict(page.headers) +headers = json.dumps(headers, indent=4, sort_keys=True) +print(page) +print(headers) diff --git a/Toolbox/repeat.py b/Toolbox/repeat.py new file mode 100644 index 0000000..341bc33 --- /dev/null +++ b/Toolbox/repeat.py @@ -0,0 +1,16 @@ +''' +Repeat the input as many times as you want + +> repeat "hello" 8 +> echo hi | repeat !i 4 +''' + +import sys + +from voussoirkit import clipext + +text = clipext.resolve(sys.argv[1]) +repeat_times = int(sys.argv[2]) + +for t in range(repeat_times): + print(text) diff --git a/Toolbox/resize.py b/Toolbox/resize.py new file mode 100644 index 0000000..dc0b3c5 --- /dev/null +++ b/Toolbox/resize.py @@ -0,0 +1,29 @@ +from PIL import Image +import sys + +filename = sys.argv[1] +try: + newname = sys.argv[4] +except IndexError: + newname = None +i = Image.open(filename) +if all(x.isdigit() for x in sys.argv[2:3]): + new_x = int(sys.argv[2]) + new_y = int(sys.argv[3]) +else: + try: + ratio = float(sys.argv[2]) + new_x = int(i.size[0] * ratio) + new_y = int(i.size[1] * ratio) + except ValueError: + print('you did it wrong') + quit() +print(i.size, new_x, new_y) +i = i.resize( (new_x, new_y) ) +if newname is None: + if '.' in filename: + suffix = '_{width}x{height}'.format(width=new_x, height=new_y) + newname = filename.replace('.', suffix + '.') + else: + newname += suffix +i.save(newname, quality=100) diff --git a/Toolbox/search.py b/Toolbox/search.py index 77f31d3..e5bac9f 100644 --- a/Toolbox/search.py +++ b/Toolbox/search.py @@ -1,3 +1,4 @@ +print('importing') import argparse import fnmatch import itertools @@ -45,6 +46,8 @@ def search( local_only=False, text=None, ): + if text is None: + print('starting search') terms = { 'yes_all': yes_all, 'yes_any': yes_any, @@ -98,6 +101,9 @@ def search( search_objects = text.splitlines() for (index, search_object) in enumerate(search_objects): + if index % 10 == 0: + #print(index, end='\r', flush=True) + pass if isinstance(search_object, pathclass.Path): search_text = search_object.basename result_text = search_object.absolute_path @@ -105,7 +111,7 @@ def search( search_text = search_object result_text = search_object if line_numbers: - result_text = '%d | %s' % (index+1, result_text) + result_text = '%4d | %s' % (index+1, result_text) if all_terms_match(search_text, terms, term_matches): if not content_args: @@ -115,9 +121,17 @@ def search( if not filepath.is_file: continue try: - with open(filepath.absolute_path, 'r', encoding='utf-8') as handle: + with open(filepath.absolute_path, 'r') as handle: text = handle.read() - except: + except UnicodeDecodeError: + try: + with open(filepath.absolute_path, 'r', encoding='utf-8') as handle: + text = handle.read() + except UnicodeDecodeError: + #safeprint.safeprint(filepath.absolute_path) + #traceback.print_exc() + continue + except Exception: safeprint.safeprint(filepath.absolute_path) traceback.print_exc() continue diff --git a/Toolbox/unique.py b/Toolbox/unique.py index 8224782..35e6982 100644 --- a/Toolbox/unique.py +++ b/Toolbox/unique.py @@ -5,18 +5,16 @@ from voussoirkit import clipext import sys if len(sys.argv) > 1: - text = clipext.resolve(sys.argv[1]) + source = sys.argv[1] else: - text = clipext.resolve('!input') - -text = text.split('\n') + source = '!input' +lines = clipext.resolve(source, split_lines=True) new_text = [] seen = set() -for item in text: - if item not in seen: - new_text.append(item) - seen.add(item) +for line in lines: + if line not in seen: + #new_text.append(line) + seen.add(line) + print(line) -new_text = '\n'.join(new_text) -print(new_text)