else
This commit is contained in:
parent
629b466c3a
commit
b5a1649bc0
12 changed files with 267 additions and 22 deletions
|
@ -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; }"
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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:
|
||||
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
|
||||
|
|
|
@ -115,6 +115,11 @@ def get_static(filename):
|
|||
filename = os.path.join('static', filename)
|
||||
return flask.send_file(filename)
|
||||
|
||||
@site.route("/float/<float:value>")
|
||||
def float_type(value):
|
||||
print(value + 1)
|
||||
return "correct"
|
||||
|
||||
if __name__ == '__main__':
|
||||
#site.run(threaded=True)
|
||||
pass
|
||||
|
|
|
@ -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()
|
||||
|
|
21
Toolbox/crop.py
Normal file
21
Toolbox/crop.py
Normal file
|
@ -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)
|
142
Toolbox/getcrx.py
Normal file
142
Toolbox/getcrx.py
Normal file
|
@ -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:])
|
15
Toolbox/head.py
Normal file
15
Toolbox/head.py
Normal file
|
@ -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)
|
16
Toolbox/repeat.py
Normal file
16
Toolbox/repeat.py
Normal file
|
@ -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)
|
29
Toolbox/resize.py
Normal file
29
Toolbox/resize.py
Normal file
|
@ -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)
|
|
@ -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:
|
||||
|
@ -114,10 +120,18 @@ def search(
|
|||
filepath = pathclass.Path(search_object)
|
||||
if not filepath.is_file:
|
||||
continue
|
||||
try:
|
||||
with open(filepath.absolute_path, 'r') as handle:
|
||||
text = handle.read()
|
||||
except UnicodeDecodeError:
|
||||
try:
|
||||
with open(filepath.absolute_path, 'r', encoding='utf-8') as handle:
|
||||
text = handle.read()
|
||||
except:
|
||||
except UnicodeDecodeError:
|
||||
#safeprint.safeprint(filepath.absolute_path)
|
||||
#traceback.print_exc()
|
||||
continue
|
||||
except Exception:
|
||||
safeprint.safeprint(filepath.absolute_path)
|
||||
traceback.print_exc()
|
||||
continue
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue