|
|
@@ -1,6 +1,7 @@
|
|
|
__package__ = 'archivebox.index'
|
|
|
|
|
|
import os
|
|
|
+from pathlib import Path
|
|
|
|
|
|
from datetime import datetime, timedelta
|
|
|
|
|
|
@@ -11,6 +12,8 @@ from dataclasses import dataclass, asdict, field, fields
|
|
|
|
|
|
from ..system import get_dir_size
|
|
|
|
|
|
+from ..config import OUTPUT_DIR, ARCHIVE_DIR_NAME
|
|
|
+
|
|
|
class ArchiveError(Exception):
|
|
|
def __init__(self, message, hints=None):
|
|
|
super().__init__(message)
|
|
|
@@ -51,7 +54,15 @@ class ArchiveResult:
|
|
|
assert self.output
|
|
|
|
|
|
@classmethod
|
|
|
- def from_json(cls, json_info):
|
|
|
+ def guess_ts(_cls, dict_info):
|
|
|
+ from ..util import parse_date
|
|
|
+ parsed_timestamp = parse_date(dict_info["timestamp"])
|
|
|
+ start_ts = parsed_timestamp
|
|
|
+ end_ts = parsed_timestamp + timedelta(seconds=int(dict_info["duration"]))
|
|
|
+ return start_ts, end_ts
|
|
|
+
|
|
|
+ @classmethod
|
|
|
+ def from_json(cls, json_info, guess=False):
|
|
|
from ..util import parse_date
|
|
|
|
|
|
info = {
|
|
|
@@ -59,9 +70,23 @@ class ArchiveResult:
|
|
|
for key, val in json_info.items()
|
|
|
if key in cls.field_names()
|
|
|
}
|
|
|
- info['start_ts'] = parse_date(info['start_ts'])
|
|
|
- info['end_ts'] = parse_date(info['end_ts'])
|
|
|
- info['cmd_version'] = info.get('cmd_version')
|
|
|
+ if guess:
|
|
|
+ keys = info.keys()
|
|
|
+ if "start_ts" not in keys:
|
|
|
+ info["start_ts"], info["end_ts"] = cls.guess_ts(json_info)
|
|
|
+ else:
|
|
|
+ info['start_ts'] = parse_date(info['start_ts'])
|
|
|
+ info['end_ts'] = parse_date(info['end_ts'])
|
|
|
+ if "pwd" not in keys:
|
|
|
+ info["pwd"] = str(Path(OUTPUT_DIR) / ARCHIVE_DIR_NAME / json_info["timestamp"])
|
|
|
+ if "cmd_version" not in keys:
|
|
|
+ info["cmd_version"] = "Undefined"
|
|
|
+ if "cmd" not in keys:
|
|
|
+ info["cmd"] = []
|
|
|
+ else:
|
|
|
+ info['start_ts'] = parse_date(info['start_ts'])
|
|
|
+ info['end_ts'] = parse_date(info['end_ts'])
|
|
|
+ info['cmd_version'] = info.get('cmd_version')
|
|
|
return cls(**info)
|
|
|
|
|
|
def to_dict(self, *keys) -> dict:
|
|
|
@@ -182,7 +207,7 @@ class Link:
|
|
|
return info
|
|
|
|
|
|
@classmethod
|
|
|
- def from_json(cls, json_info):
|
|
|
+ def from_json(cls, json_info, guess=False):
|
|
|
from ..util import parse_date
|
|
|
|
|
|
info = {
|
|
|
@@ -200,7 +225,7 @@ class Link:
|
|
|
cast_history[method] = []
|
|
|
for json_result in method_history:
|
|
|
assert isinstance(json_result, dict), 'Items in Link["history"][method] must be dicts'
|
|
|
- cast_result = ArchiveResult.from_json(json_result)
|
|
|
+ cast_result = ArchiveResult.from_json(json_result, guess)
|
|
|
cast_history[method].append(cast_result)
|
|
|
|
|
|
info['history'] = cast_history
|