Select Git revision
lam.shore.co.il
planet NaN GiB
#!/usr/bin/env python3
"""Planets and aggregators reader."""
import argparse
import pathlib
import sys
import webbrowser
import xdg.BaseDirectory # pylint: disable=import-error
import yaml
EXAMPLE_CONFIG = """---
general:
# For the list of available browsers, consult
# https://docs.python.org/3/library/webbrowser.html?highlight=webbrowser#webbrowser.register
browser: w3m
sites:
shore: https://www.shore.co.il/blog/
"""
def build_arg_parser():
"""Build and return the argument parser."""
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument(
"-C",
"--config",
type=pathlib.Path,
help="Use a different configuration file.",
)
parser.add_argument(
"-l", "--list", action="store_true", help="List available sites."
)
parser.add_argument("-b", "--browser", help="Use a specific browser.")
parser.add_argument("site", nargs="?", help="Name of the site to open.")
return parser
def get_config(path=None):
"""Returns a configuration dictionary.
If a path is passed, that file path is used. Otherwise, use the default
path. If path is None and the default doesn't exist, an example file is
created."""
if path:
path = path.expanduser()
if not path.exists() and not path.is_file():
arg_parser.error("Configuration file does not exist.")
else:
base_dir = pathlib.Path(xdg.BaseDirectory.save_config_path("planet"))
path = base_dir / "config.yaml"
if not path.exists():
with open(path, "w", encoding="utf-8") as configfile:
configfile.write(EXAMPLE_CONFIG)
arg_parser.error(
f"Missing config file, generated an example one at {path}."
)
try:
with open(path, "r", encoding="utf-8") as configfile:
config = yaml.safe_load(configfile)
except Exception as exception: # pylint: disable=broad-except
arg_parser.error(str(exception))
if "sites" not in config or not isinstance(config["sites"], dict):
arg_parser.error(
"Config file missing 'sites' key or 'sites' is not a dictionary."
)
return config
def list_sites(config):
"""Prints a list of sites from the config."""
for site in config["sites"].keys():
print(site)
def open_site(config, site, browser_name=None):
"""Opens a site from the config in a webbrowser."""
if browser_name == "":
browser_name = None
elif browser_name is not None:
pass
elif "general" in config and "browser" in config["general"]:
browser_name = config["general"]["browser"]
else:
browser_name = None
browser = webbrowser.get(using=browser_name)
if site not in config["sites"]:
arg_parser.error(f"Unknown site {site}.")
browser.open(config["sites"][site])
if __name__ == "__main__":
arg_parser = build_arg_parser()
args = arg_parser.parse_args()
if not args.list and not args.site:
arg_parser.error(
"You must specify either site name or -l to list the available sites." # noqa: E501
)
conf = get_config(args.config)
if args.list:
list_sites(conf)
else:
open_site(conf, args.site, args.browser)
sys.exit()