Browse Source

cli config file

master
dave 1 year ago
parent
commit
11a82da4a0
3 changed files with 52 additions and 8 deletions
  1. +2
    -2
      README.md
  2. +49
    -6
      photoapp/cli.py
  3. +1
    -0
      requirements.txt

+ 2
- 2
README.md View File

@@ -67,8 +67,8 @@ as private or upload images. You may want to run this before starting the server
That's it - you've set up Photolib! Next steps from here would be to the other command line tools to import media.

Besides browsing, most interaction with Photolib will be done using its CLI tool, `photocli`. Note that server address,
username, and password details need to be provided via flags not shown here to in a config file. See `photocli --help`
for more information.
username, and password details need to be provided to the cli via a url flag not shown here. See `photocli --help` for
more information.


Commands


+ 49
- 6
photoapp/cli.py View File

@@ -7,8 +7,44 @@ from photoapp.utils import get_extension
from photoapp.types import known_extensions, PhotoStatus
from photoapp.common import pwhash
from photoapp.ingest import get_photosets
from urllib.parse import urlparse
from tabulate import tabulate
from concurrent.futures import ThreadPoolExecutor, as_completed
import appdirs


APPNAME = "photocli"
DEFAULT_CONFIG = {"uri": None,
"lastbatch": None}


class CliConfig(dict):
def __init__(self, appname, default):
self.confdir = appdirs.user_config_dir(appname)
self.confpath = os.path.join(self.confdir, "cli.json")
super().__init__(**default)
self.init_config()

def init_config(self):
os.makedirs(self.confdir, exist_ok=True)
if os.path.exists(self.confpath):
self.load()
else:
self.write()

def load(self):
with open(self.confpath) as f:
self.update(**json.load(f))

def write(self):
with open(self.confpath, "w") as f:
json.dump(self, f, indent=4)

def __setitem__(self, key, value):
if key not in self:
raise KeyError(key)
super().__setitem__(key, value)
self.write()


class PhotoApiClient(object):
@@ -86,9 +122,7 @@ def confirm(message, options=None, accept=None, confirm_msg="Are you sure?"):
def get_args():
parser = argparse.ArgumentParser(description="photo library cli")
# TODO nicer uri parser
parser.add_argument("--host", required=True, help="photo library server address")
parser.add_argument("--user", required=True)
parser.add_argument("--password", required=True)
parser.add_argument("--host", default=os.environ.get("PHOTOLIB_URI", None), help="photo api server address")
parser.add_argument("-y", "--yes", action="store_true", help="assume yes for all prompts")

sp_action = parser.add_subparsers(dest="action", help="action to take")
@@ -122,13 +156,22 @@ def get_args():
p_delete = p_useraction.add_parser('delete', help='delete users')
p_delete.add_argument("-u", "--username", help="username", required=True)

return parser.parse_args()
return parser.parse_args(), parser


def main():
args = get_args()
config = CliConfig(APPNAME, DEFAULT_CONFIG)
args, parser = get_args()

uri = urlparse(args.host or config["uri"])

if not uri.netloc:
parser.error("need --host, $PHOTOLIB_URI, or config file")

config["uri"] = uri.geturl()

client = PhotoApiClient(args.host, (args.user, args.password, ))
port = f":{uri.port}" if uri.port else ""
client = PhotoApiClient(f"{uri.scheme}://{uri.hostname}{port}", (uri.username, uri.password, ))

if args.action == "checkdupes":
hashes = {}


+ 1
- 0
requirements.txt View File

@@ -1,3 +1,4 @@
appdirs==1.4.3
backports.functools-lru-cache==1.5
boto3==1.9.183
botocore==1.12.183


Loading…
Cancel
Save