first
This commit is contained in:
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
dist/
|
||||||
|
build/
|
||||||
|
Pipfile*
|
||||||
|
*.egg-info/
|
||||||
19
README.md
Normal file
19
README.md
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# QuickDrop
|
||||||
|
|
||||||
|
This is a simple CLI for quickly sharing a file or folder via Dropbox
|
||||||
|
that's already located in a Dropbox folder.
|
||||||
|
|
||||||
|
It's as simple as
|
||||||
|
|
||||||
|
$ export DROPBOX_ACCESS_TOKEN=yourdropboxaccesstoken
|
||||||
|
$ export DROPBOX_ROOT_PATH=yourdropboxrootpath
|
||||||
|
$ pip install quickdrop
|
||||||
|
|
||||||
|
Collecting quickdrop
|
||||||
|
...
|
||||||
|
Successfully installed quickdrop-x.y.z
|
||||||
|
|
||||||
|
$ url <filepath.whatever>
|
||||||
|
|
||||||
|
Okay, <filepath.whatever> is now shared, accessible via
|
||||||
|
https://www.dropbox.com/sh/bunchofrandomchars/morerandomcharsnstuff?dl=0.
|
||||||
0
quickdrop/__init__.py
Normal file
0
quickdrop/__init__.py
Normal file
88
quickdrop/quickdrop.py
Normal file
88
quickdrop/quickdrop.py
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
import os
|
||||||
|
from pathlib import Path
|
||||||
|
import sys
|
||||||
|
|
||||||
|
import click
|
||||||
|
import dropbox
|
||||||
|
import pyperclip
|
||||||
|
|
||||||
|
|
||||||
|
DROPBOX_ACCESS_TOKEN = os.getenv('DROPBOX_ACCESS_TOKEN')
|
||||||
|
DROPBOX_ROOT_PATH = os.getenv('DROPBOX_ROOT_PATH')
|
||||||
|
LB = '\n'
|
||||||
|
|
||||||
|
|
||||||
|
@click.command()
|
||||||
|
@click.argument('filepath', type=click.Path(exists=True))
|
||||||
|
def cli(filepath):
|
||||||
|
check_for_env_vars()
|
||||||
|
dropbox_relative_path = get_relative_path(filepath)
|
||||||
|
url = share_file(dropbox_relative_path)
|
||||||
|
copy_to_clipboard(url)
|
||||||
|
print(f'Okay, {filepath} is now shared, accessible via {LB}{url}.')
|
||||||
|
print('This url was also copied to your clipboard for your convenience.')
|
||||||
|
|
||||||
|
|
||||||
|
def share_file(filepath):
|
||||||
|
try:
|
||||||
|
shared_link = get_client().sharing_create_shared_link(filepath)
|
||||||
|
except dropbox.exceptions.ApiError as e:
|
||||||
|
raise click.ClickException('There was a problem with the path.')
|
||||||
|
else:
|
||||||
|
return shared_link.url
|
||||||
|
|
||||||
|
|
||||||
|
def get_relative_path(filepath):
|
||||||
|
DROPBOX_ROOT = Path(DROPBOX_ROOT_PATH).expanduser()
|
||||||
|
|
||||||
|
if '/' not in filepath:
|
||||||
|
filepath = f'/{filepath}'
|
||||||
|
|
||||||
|
elif not filepath.startswith('/') and not filepath.startswith('~'):
|
||||||
|
*path_parts, filename = filepath.split('/')
|
||||||
|
relevant_path_parts = []
|
||||||
|
for path_part in path_parts:
|
||||||
|
if path_part not in DROPBOX_ROOT_PATH:
|
||||||
|
relevant_path_parts.append(path_part)
|
||||||
|
filepath = os.path.join(*relevant_path_parts, f'/{filename}')
|
||||||
|
|
||||||
|
filepath_expanded_user = Path(filepath).expanduser()
|
||||||
|
|
||||||
|
path = Path(str(filepath_expanded_user).replace(str(DROPBOX_ROOT), ''))
|
||||||
|
|
||||||
|
return str(path)
|
||||||
|
|
||||||
|
|
||||||
|
def check_for_valid_access_token():
|
||||||
|
if not DROPBOX_ACCESS_TOKEN:
|
||||||
|
raise click.ClickException(
|
||||||
|
'Please get an access token here and store it in an environment '
|
||||||
|
'variable called "DROPBOX_ACCESS_TOKEN": '
|
||||||
|
' https://www.dropbox.com/developers/apps')
|
||||||
|
try:
|
||||||
|
dbx = get_client()
|
||||||
|
dbx.users_get_current_account()
|
||||||
|
except dropbox.exceptions.AuthError as e:
|
||||||
|
raise click.ClickException(str(e))
|
||||||
|
|
||||||
|
|
||||||
|
def check_for_env_vars():
|
||||||
|
check_for_valid_access_token()
|
||||||
|
check_for_dropbox_root_path()
|
||||||
|
|
||||||
|
|
||||||
|
def check_for_dropbox_root_path():
|
||||||
|
if not DROPBOX_ROOT_PATH:
|
||||||
|
raise click.ClickException(
|
||||||
|
'Please create an environment variable called "DROPBOX_ROOT_PATH" '
|
||||||
|
'with the path to your computer\'s root Dropbox folder.')
|
||||||
|
if not Path(DROPBOX_ROOT_PATH).exists:
|
||||||
|
raise click.ClickException(f'{DROPBOX_ROOT_PATH} doesn\'t exist!')
|
||||||
|
|
||||||
|
|
||||||
|
def get_client():
|
||||||
|
return dropbox.Dropbox(DROPBOX_ACCESS_TOKEN)
|
||||||
|
|
||||||
|
|
||||||
|
def copy_to_clipboard(url):
|
||||||
|
pyperclip.copy(url)
|
||||||
28
setup.py
Normal file
28
setup.py
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
from setuptools import setup, find_packages
|
||||||
|
|
||||||
|
|
||||||
|
with open('README.md') as file:
|
||||||
|
long_description = file.read()
|
||||||
|
|
||||||
|
setup(
|
||||||
|
name="quickdrop",
|
||||||
|
version="0.01",
|
||||||
|
py_modules=['quickdrop'],
|
||||||
|
url='https://github.com/zevaverbach/quickdrop',
|
||||||
|
install_requires=[
|
||||||
|
'dropbox',
|
||||||
|
'Click',
|
||||||
|
'pyperclip',
|
||||||
|
],
|
||||||
|
include_package_data=True,
|
||||||
|
packages=find_packages(),
|
||||||
|
description=(
|
||||||
|
'Quickly get a shared link for any file or folder in a Dropbox-synced '
|
||||||
|
'folder'),
|
||||||
|
long_description_content_type='text/markdown',
|
||||||
|
long_description=long_description,
|
||||||
|
entry_points='''
|
||||||
|
[console_scripts]
|
||||||
|
url=quickdrop.quickdrop:cli
|
||||||
|
''',
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user