|
@@ -118,7 +118,10 @@ ALLOWED_IN_OUTPUT_DIR = {
|
|
|
FAVICON_FILENAME,
|
|
FAVICON_FILENAME,
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+@enforce_types
|
|
|
def help(out_dir: str=OUTPUT_DIR) -> None:
|
|
def help(out_dir: str=OUTPUT_DIR) -> None:
|
|
|
|
|
+ """Print the ArchiveBox help message and usage"""
|
|
|
|
|
+
|
|
|
all_subcommands = list_subcommands()
|
|
all_subcommands = list_subcommands()
|
|
|
COMMANDS_HELP_TEXT = '\n '.join(
|
|
COMMANDS_HELP_TEXT = '\n '.join(
|
|
|
f'{cmd.ljust(20)} {summary}'
|
|
f'{cmd.ljust(20)} {summary}'
|
|
@@ -182,7 +185,11 @@ def help(out_dir: str=OUTPUT_DIR) -> None:
|
|
|
print(' https://github.com/pirate/ArchiveBox/wiki')
|
|
print(' https://github.com/pirate/ArchiveBox/wiki')
|
|
|
|
|
|
|
|
|
|
|
|
|
-def version(quiet: bool=False, out_dir: str=OUTPUT_DIR) -> None:
|
|
|
|
|
|
|
+@enforce_types
|
|
|
|
|
+def version(quiet: bool=False,
|
|
|
|
|
+ out_dir: str=OUTPUT_DIR) -> None:
|
|
|
|
|
+ """Print the ArchiveBox version and dependency information"""
|
|
|
|
|
+
|
|
|
if quiet:
|
|
if quiet:
|
|
|
print(VERSION)
|
|
print(VERSION)
|
|
|
else:
|
|
else:
|
|
@@ -191,37 +198,44 @@ def version(quiet: bool=False, out_dir: str=OUTPUT_DIR) -> None:
|
|
|
|
|
|
|
|
print('{white}[i] Dependency versions:{reset}'.format(**ANSI))
|
|
print('{white}[i] Dependency versions:{reset}'.format(**ANSI))
|
|
|
for name, dependency in DEPENDENCIES.items():
|
|
for name, dependency in DEPENDENCIES.items():
|
|
|
- print_dependency_version(name, dependency)
|
|
|
|
|
|
|
+ print(printable_dependency_version(name, dependency))
|
|
|
|
|
|
|
|
print()
|
|
print()
|
|
|
print('{white}[i] Code locations:{reset}'.format(**ANSI))
|
|
print('{white}[i] Code locations:{reset}'.format(**ANSI))
|
|
|
for name, folder in CODE_LOCATIONS.items():
|
|
for name, folder in CODE_LOCATIONS.items():
|
|
|
- print_folder_status(name, folder)
|
|
|
|
|
|
|
+ print(printable_folder_status(name, folder))
|
|
|
|
|
|
|
|
print()
|
|
print()
|
|
|
print('{white}[i] External locations:{reset}'.format(**ANSI))
|
|
print('{white}[i] External locations:{reset}'.format(**ANSI))
|
|
|
for name, folder in EXTERNAL_LOCATIONS.items():
|
|
for name, folder in EXTERNAL_LOCATIONS.items():
|
|
|
- print_folder_status(name, folder)
|
|
|
|
|
|
|
+ print(printable_folder_status(name, folder))
|
|
|
|
|
|
|
|
print()
|
|
print()
|
|
|
print('{white}[i] Data locations:{reset}'.format(**ANSI))
|
|
print('{white}[i] Data locations:{reset}'.format(**ANSI))
|
|
|
for name, folder in DATA_LOCATIONS.items():
|
|
for name, folder in DATA_LOCATIONS.items():
|
|
|
- print_folder_status(name, folder)
|
|
|
|
|
|
|
+ print(printable_folder_status(name, folder))
|
|
|
|
|
|
|
|
print()
|
|
print()
|
|
|
check_dependencies()
|
|
check_dependencies()
|
|
|
|
|
|
|
|
|
|
|
|
|
-def run(subcommand: str, subcommand_args: Optional[List[str]], stdin: Optional[IO]=None, out_dir: str=OUTPUT_DIR) -> None:
|
|
|
|
|
|
|
+@enforce_types
|
|
|
|
|
+def run(subcommand: str,
|
|
|
|
|
+ subcommand_args: Optional[List[str]],
|
|
|
|
|
+ stdin: Optional[IO]=None,
|
|
|
|
|
+ out_dir: str=OUTPUT_DIR) -> None:
|
|
|
|
|
+ """Run a given ArchiveBox subcommand with the given list of args"""
|
|
|
run_subcommand(
|
|
run_subcommand(
|
|
|
subcommand=subcommand,
|
|
subcommand=subcommand,
|
|
|
subcommand_args=subcommand_args,
|
|
subcommand_args=subcommand_args,
|
|
|
stdin=stdin,
|
|
stdin=stdin,
|
|
|
- out_dir=out_dir,
|
|
|
|
|
|
|
+ pwd=out_dir,
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+@enforce_types
|
|
|
def init(out_dir: str=OUTPUT_DIR) -> None:
|
|
def init(out_dir: str=OUTPUT_DIR) -> None:
|
|
|
|
|
+ """Initialize a new ArchiveBox collection in the current directory"""
|
|
|
os.makedirs(out_dir, exist_ok=True)
|
|
os.makedirs(out_dir, exist_ok=True)
|
|
|
|
|
|
|
|
is_empty = not len(set(os.listdir(out_dir)) - ALLOWED_IN_OUTPUT_DIR)
|
|
is_empty = not len(set(os.listdir(out_dir)) - ALLOWED_IN_OUTPUT_DIR)
|
|
@@ -364,7 +378,10 @@ def init(out_dir: str=OUTPUT_DIR) -> None:
|
|
|
print(' archivebox help')
|
|
print(' archivebox help')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+@enforce_types
|
|
|
def info(out_dir: str=OUTPUT_DIR) -> None:
|
|
def info(out_dir: str=OUTPUT_DIR) -> None:
|
|
|
|
|
+ """Print out some info and statistics about the archive collection"""
|
|
|
|
|
+
|
|
|
check_data_folder(out_dir=out_dir)
|
|
check_data_folder(out_dir=out_dir)
|
|
|
|
|
|
|
|
print('{green}[*] Scanning archive collection main index...{reset}'.format(**ANSI))
|
|
print('{green}[*] Scanning archive collection main index...{reset}'.format(**ANSI))
|
|
@@ -454,6 +471,7 @@ def add(import_str: Optional[str]=None,
|
|
|
update_all: bool=not ONLY_NEW,
|
|
update_all: bool=not ONLY_NEW,
|
|
|
index_only: bool=False,
|
|
index_only: bool=False,
|
|
|
out_dir: str=OUTPUT_DIR) -> List[Link]:
|
|
out_dir: str=OUTPUT_DIR) -> List[Link]:
|
|
|
|
|
+ """Add a new URL or list of URLs to your archive"""
|
|
|
|
|
|
|
|
check_data_folder(out_dir=out_dir)
|
|
check_data_folder(out_dir=out_dir)
|
|
|
|
|
|
|
@@ -518,6 +536,7 @@ def remove(filter_str: Optional[str]=None,
|
|
|
yes: bool=False,
|
|
yes: bool=False,
|
|
|
delete: bool=False,
|
|
delete: bool=False,
|
|
|
out_dir: str=OUTPUT_DIR) -> List[Link]:
|
|
out_dir: str=OUTPUT_DIR) -> List[Link]:
|
|
|
|
|
+ """Remove the specified URLs from the archive"""
|
|
|
|
|
|
|
|
check_data_folder(out_dir=out_dir)
|
|
check_data_folder(out_dir=out_dir)
|
|
|
|
|
|
|
@@ -586,7 +605,7 @@ def remove(filter_str: Optional[str]=None,
|
|
|
|
|
|
|
|
@enforce_types
|
|
@enforce_types
|
|
|
def update(resume: Optional[float]=None,
|
|
def update(resume: Optional[float]=None,
|
|
|
- only_new: bool=not ONLY_NEW,
|
|
|
|
|
|
|
+ only_new: bool=ONLY_NEW,
|
|
|
index_only: bool=False,
|
|
index_only: bool=False,
|
|
|
overwrite: bool=False,
|
|
overwrite: bool=False,
|
|
|
filter_patterns_str: Optional[str]=None,
|
|
filter_patterns_str: Optional[str]=None,
|
|
@@ -596,6 +615,7 @@ def update(resume: Optional[float]=None,
|
|
|
after: Optional[str]=None,
|
|
after: Optional[str]=None,
|
|
|
before: Optional[str]=None,
|
|
before: Optional[str]=None,
|
|
|
out_dir: str=OUTPUT_DIR) -> List[Link]:
|
|
out_dir: str=OUTPUT_DIR) -> List[Link]:
|
|
|
|
|
+ """Import any new links from subscriptions and retry any previously failed/skipped links"""
|
|
|
|
|
|
|
|
check_dependencies()
|
|
check_dependencies()
|
|
|
check_data_folder(out_dir=out_dir)
|
|
check_data_folder(out_dir=out_dir)
|
|
@@ -659,8 +679,9 @@ def list_all(filter_patterns_str: Optional[str]=None,
|
|
|
before: Optional[float]=None,
|
|
before: Optional[float]=None,
|
|
|
sort: Optional[str]=None,
|
|
sort: Optional[str]=None,
|
|
|
csv: Optional[str]=None,
|
|
csv: Optional[str]=None,
|
|
|
- json: Optional[str]=None,
|
|
|
|
|
|
|
+ json: bool=False,
|
|
|
out_dir: str=OUTPUT_DIR) -> Iterable[Link]:
|
|
out_dir: str=OUTPUT_DIR) -> Iterable[Link]:
|
|
|
|
|
+ """List, filter, and export information about archive entries"""
|
|
|
|
|
|
|
|
check_data_folder(out_dir=out_dir)
|
|
check_data_folder(out_dir=out_dir)
|
|
|
|
|
|
|
@@ -756,12 +777,14 @@ def list_folders(links: List[Link],
|
|
|
raise ValueError('Status not recognized.')
|
|
raise ValueError('Status not recognized.')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+@enforce_types
|
|
|
def config(config_options_str: Optional[str]=None,
|
|
def config(config_options_str: Optional[str]=None,
|
|
|
config_options: Optional[List[str]]=None,
|
|
config_options: Optional[List[str]]=None,
|
|
|
get: bool=False,
|
|
get: bool=False,
|
|
|
set: bool=False,
|
|
set: bool=False,
|
|
|
reset: bool=False,
|
|
reset: bool=False,
|
|
|
out_dir: str=OUTPUT_DIR) -> None:
|
|
out_dir: str=OUTPUT_DIR) -> None:
|
|
|
|
|
+ """Get and set your ArchiveBox project configuration values"""
|
|
|
|
|
|
|
|
check_data_folder(out_dir=out_dir)
|
|
check_data_folder(out_dir=out_dir)
|
|
|
|
|
|
|
@@ -863,6 +886,7 @@ def schedule(add: bool=False,
|
|
|
every: Optional[str]=None,
|
|
every: Optional[str]=None,
|
|
|
import_path: Optional[str]=None,
|
|
import_path: Optional[str]=None,
|
|
|
out_dir: str=OUTPUT_DIR):
|
|
out_dir: str=OUTPUT_DIR):
|
|
|
|
|
+ """Set ArchiveBox to regularly import URLs at specific times using cron"""
|
|
|
|
|
|
|
|
check_data_folder(out_dir=out_dir)
|
|
check_data_folder(out_dir=out_dir)
|
|
|
|
|
|
|
@@ -957,10 +981,13 @@ def schedule(add: bool=False,
|
|
|
raise SystemExit(0)
|
|
raise SystemExit(0)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+@enforce_types
|
|
|
|
|
+def server(runserver_args: Optional[List[str]]=None,
|
|
|
|
|
+ reload: bool=False,
|
|
|
|
|
+ debug: bool=False,
|
|
|
|
|
+ out_dir: str=OUTPUT_DIR) -> None:
|
|
|
|
|
+ """Run the ArchiveBox HTTP server"""
|
|
|
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-def server(runserver_args: Optional[List[str]]=None, reload: bool=False, out_dir: str=OUTPUT_DIR) -> None:
|
|
|
|
|
runserver_args = runserver_args or []
|
|
runserver_args = runserver_args or []
|
|
|
check_data_folder(out_dir=out_dir)
|
|
check_data_folder(out_dir=out_dir)
|
|
|
|
|
|
|
@@ -982,7 +1009,10 @@ def server(runserver_args: Optional[List[str]]=None, reload: bool=False, out_dir
|
|
|
call_command("runserver", *runserver_args)
|
|
call_command("runserver", *runserver_args)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+@enforce_types
|
|
|
def manage(args: Optional[List[str]]=None, out_dir: str=OUTPUT_DIR) -> None:
|
|
def manage(args: Optional[List[str]]=None, out_dir: str=OUTPUT_DIR) -> None:
|
|
|
|
|
+ """Run an ArchiveBox Django management command"""
|
|
|
|
|
+
|
|
|
check_data_folder(out_dir=out_dir)
|
|
check_data_folder(out_dir=out_dir)
|
|
|
|
|
|
|
|
setup_django(out_dir)
|
|
setup_django(out_dir)
|