diff --git a/archivebox/cli/__init__.py b/archivebox/cli/__init__.py index d3ec62cc..9622c98f 100644 --- a/archivebox/cli/__init__.py +++ b/archivebox/cli/__init__.py @@ -15,10 +15,10 @@ from importlib import import_module CLI_DIR = Path(__file__).resolve().parent # these common commands will appear sorted before any others for ease-of-use -meta_cmds = ('help', 'version') # dont require valid data folder at all -main_cmds = ('init', 'config') # dont require existing db present -archive_cmds = ('add', 'remove', 'update', 'list', 'status', 'setup') # require existing db present -fake_db = ("oneshot",) # use fake in-memory db +meta_cmds = ('help', 'version') # dont require valid data folder at all +main_cmds = ('init', 'config', 'setup') # dont require existing db present +archive_cmds = ('add', 'remove', 'update', 'list', 'status') # require existing db present +fake_db = ("oneshot",) # use fake in-memory db display_first = (*meta_cmds, *main_cmds, *archive_cmds) diff --git a/archivebox/cli/archivebox_init.py b/archivebox/cli/archivebox_init.py index 5753269c..48b65b1f 100755 --- a/archivebox/cli/archivebox_init.py +++ b/archivebox/cli/archivebox_init.py @@ -32,12 +32,18 @@ def main(args: Optional[List[str]]=None, stdin: Optional[IO]=None, pwd: Optional action='store_true', help='Run any updates or migrations without rechecking all snapshot dirs', ) + parser.add_argument( + '--setup', #'-s', + action='store_true', + help='Automatically install dependencies and extras used for archiving', + ) command = parser.parse_args(args or ()) reject_stdin(__command__, stdin) init( force=command.force, quick=command.quick, + setup=command.setup, out_dir=pwd or OUTPUT_DIR, ) diff --git a/archivebox/main.py b/archivebox/main.py index b886c61c..6e5dc5e5 100644 --- a/archivebox/main.py +++ b/archivebox/main.py @@ -101,6 +101,11 @@ from .config import ( USE_CHROME, CHROME_BINARY, CHROME_VERSION, + YOUTUBEDL_BINARY, + YOUTUBEDL_VERSION, + SINGLEFILE_VERSION, + READABILITY_VERSION, + MERCURY_VERSION, USE_YOUTUBEDL, USE_NODE, NODE_VERSION, @@ -108,6 +113,7 @@ from .config import ( CONFIG, USER_CONFIG, get_real_name, + setup_django, ) from .logging_util import ( TERM_WIDTH, @@ -295,19 +301,19 @@ def run(subcommand: str, @enforce_types -def init(force: bool=False, quick: bool=False, out_dir: Path=OUTPUT_DIR) -> None: +def init(force: bool=False, quick: bool=False, setup: bool=False, out_dir: Path=OUTPUT_DIR) -> None: """Initialize a new ArchiveBox collection in the current directory""" from core.models import Snapshot - Path(out_dir).mkdir(exist_ok=True) + out_dir.mkdir(exist_ok=True) is_empty = not len(set(os.listdir(out_dir)) - ALLOWED_IN_OUTPUT_DIR) - if (Path(out_dir) / JSON_INDEX_FILENAME).exists(): + if (out_dir / JSON_INDEX_FILENAME).exists(): stderr("[!] This folder contains a JSON index. It is deprecated, and will no longer be kept up to date automatically.", color="lightyellow") stderr(" You can run `archivebox list --json --with-headers > index.json` to manually generate it.", color="lightyellow") - existing_index = (Path(out_dir) / SQL_INDEX_FILENAME).exists() + existing_index = (out_dir / SQL_INDEX_FILENAME).exists() if is_empty and not existing_index: print('{green}[+] Initializing a new ArchiveBox v{} collection...{reset}'.format(VERSION, **ANSI)) @@ -343,12 +349,12 @@ def init(force: bool=False, quick: bool=False, out_dir: Path=OUTPUT_DIR) -> None print(f' + ./{CONFIG_FILE.relative_to(OUTPUT_DIR)}...') write_config_file({}, out_dir=out_dir) - if (Path(out_dir) / SQL_INDEX_FILENAME).exists(): + if (out_dir / SQL_INDEX_FILENAME).exists(): print('\n{green}[*] Verifying main SQL index and running any migrations needed...{reset}'.format(**ANSI)) else: print('\n{green}[+] Building main SQL index and running initial migrations...{reset}'.format(**ANSI)) - DATABASE_FILE = Path(out_dir) / SQL_INDEX_FILENAME + DATABASE_FILE = out_dir / SQL_INDEX_FILENAME for migration_line in apply_migrations(out_dir): print(f' {migration_line}') @@ -443,15 +449,16 @@ def init(force: bool=False, quick: bool=False, out_dir: Path=OUTPUT_DIR) -> None print(' For more usage and examples, run:') print(' archivebox help') - json_index = Path(out_dir) / JSON_INDEX_FILENAME - html_index = Path(out_dir) / HTML_INDEX_FILENAME + json_index = out_dir / JSON_INDEX_FILENAME + html_index = out_dir / HTML_INDEX_FILENAME index_name = f"{date.today()}_index_old" if json_index.exists(): json_index.rename(f"{index_name}.json") if html_index.exists(): html_index.rename(f"{index_name}.html") - + if setup: + run_subcommand('setup', pwd=out_dir) @enforce_types def status(out_dir: Path=OUTPUT_DIR) -> None: