Source

gett-cli / uploader.py

Full commit
#!/usr/bin/env python

import sys, os, os.path
import argparse
import signal
import re

from gett import *
from time import sleep

url_re = re.compile(r'^(?:http://ge\.tt/|/)?(\w+)(?:/(?:v/(\d+)))?$')

signal.signal(signal.SIGINT, signal.SIG_DFL)

home = os.getenv('USERPROFILE') or os.getenv('HOME')

parser = argparse.ArgumentParser(description="A simple ge.tt uploader")
parser.add_argument('file', nargs='*', type=argparse.FileType('rb'), help="Name of a file to upload")
parser.add_argument('-t', dest='title', help='Title of the share (defaults to first file name)')
parser.add_argument('-s', dest='share', help='Name of the share to upload to (defaults to a newly created one)')
parser.add_argument('-D', dest='debug', action='store_true', help='Debug API calls')
parser.add_argument('-S', dest='seq', action='store_true', help='Force sequential upload of files in order (by default, files are uploaded in parallel although the progress bars are displayed in ascending file size order)')

parser.add_argument('--delete', nargs=1, dest='share_or_file', help='Delete a share or a file (url or path)')

auth_group = parser.add_argument_group('Authentification (optional)')
auth_group.add_argument('-e', dest='email', help='Email to login with')
auth_group.add_argument('-p', dest='password', help='Password to login with')
auth_group.add_argument('-k', dest='tokenfile', help='Ge.tt token file path (~/.gett-token)', default=os.path.join(home, '.gett-token'))

args = parser.parse_args()

if args.debug:
    import gett
    gett.DEBUG = True

user = User()
try:
    # Try to log-in with the token

    token = open(args.tokenfile, 'r').read()
    user.login_token(token)
except:
    # If it doesn't work, ask the user its email and password

    if not args.email:
        args.email = input('Please enter your Ge.tt email: ')

    if not args.password:
        import getpass
        args.password = getpass.getpass('Please enter your Ge.tt password: ')

    try:
        user.login_auth(args.email, args.password)
    except Exception as ex:
        print('Unable to login: %s' % ex.args[0])
        sys.exit(1)

with open(args.tokenfile, 'w') as file:
    file.write(user.rtoken)

if not args.share_or_file:
    args.share_or_file = []

for item in args.share_or_file:
    match = url_re.match(item)

    if not match:
        parser.error('argument --delete: invalid format, please supply file/share url or path')

    share = user.get_share(match.group(1))

    if match.group(2):
        id = match.group(2)
        file = share.files[id]
        file.destroy()
    else:
        share.destroy()

if args.file:
    if args.share:
        share = user.get_share(args.share)
    else:
        if args.title:
            share = user.create_share(args.title)
        else:
            share = user.create_share(os.path.basename(args.file[0].name))


    uploads = []

    for fp in args.file:
        name = os.path.basename(fp.name)
        file = share.create_file(name)

        print('%s: %s' % (name, file.url))

        upload = FileUpload(file, fp)

        if not args.seq:
            upload.start()

        uploads.append(upload)

    print()

    if not args.seq:
        uploads.sort(key=lambda item: item.file_size)

    def print_status(upload, index, count):
        name = upload.file.name

        if len(name) > 15:
            name = name[:12] + '...'

        name = name.ljust(15)

        bar_size = int(50 * upload.percent_done / 100)
        bar = '[' + (bar_size * '#') + ((50 - bar_size) * '-') + ']'

        sys.stderr.write('\r%s (%d/%d) %s %d %%' % (name, index, count, bar, upload.percent_done))

    for i, upload in enumerate(uploads):
        if args.seq:
            upload.start()

        while True:
            print_status(upload, i + 1, len(uploads))
            upload.join(0.5)

            if not upload.is_alive():
                print_status(upload, i + 1, len(uploads))

                if upload.ex:
                    sys.stderr.write(('\rError uploading %s: %s' % (upload.file.name, upload.ex)).ljust(80))

                sys.stderr.write('\n')
                break

user.refresh()

def humanize(nbytes):
    if nbytes >= 10**9:
        return '%.2f GB' % (nbytes / 10**9)
    if nbytes >= 10**6:
        return '%.2f MB' % (nbytes / 10**6)
    if nbytes >= 10**3:
        return '%.2f KB' % (nbytes / 10**3)

    return '%.2f B' % nbytes

print('Storage used : %s out of %s (%d %%)' % (
        humanize(user.storage_used),
        humanize(user.storage_limit),
        int(100 * user.storage_used / user.storage_limit)))