|
@@ -1,11 +1,17 @@
|
|
|
__package__ = 'archivebox.core'
|
|
__package__ = 'archivebox.core'
|
|
|
|
|
|
|
|
|
|
+
|
|
|
import uuid
|
|
import uuid
|
|
|
|
|
+import json
|
|
|
|
|
+
|
|
|
|
|
+from pathlib import Path
|
|
|
|
|
+from typing import Optional, List
|
|
|
|
|
|
|
|
from django.db import models
|
|
from django.db import models
|
|
|
from django.utils.functional import cached_property
|
|
from django.utils.functional import cached_property
|
|
|
from django.utils.text import slugify
|
|
from django.utils.text import slugify
|
|
|
from django.core.cache import cache
|
|
from django.core.cache import cache
|
|
|
|
|
+from django.urls import reverse
|
|
|
from django.db.models import Case, When, Value, IntegerField
|
|
from django.db.models import Case, When, Value, IntegerField
|
|
|
from django.contrib.auth.models import User # noqa
|
|
from django.contrib.auth.models import User # noqa
|
|
|
|
|
|
|
@@ -130,6 +136,11 @@ class Snapshot(models.Model):
|
|
|
def icons(self) -> str:
|
|
def icons(self) -> str:
|
|
|
return snapshot_icons(self)
|
|
return snapshot_icons(self)
|
|
|
|
|
|
|
|
|
|
+ @cached_property
|
|
|
|
|
+ def extension(self) -> str:
|
|
|
|
|
+ from ..util import extension
|
|
|
|
|
+ return extension(self.url)
|
|
|
|
|
+
|
|
|
@cached_property
|
|
@cached_property
|
|
|
def bookmarked(self):
|
|
def bookmarked(self):
|
|
|
return parse_date(self.timestamp)
|
|
return parse_date(self.timestamp)
|
|
@@ -176,12 +187,34 @@ class Snapshot(models.Model):
|
|
|
return cache.get_or_set(cache_key, calc_dir_size)
|
|
return cache.get_or_set(cache_key, calc_dir_size)
|
|
|
|
|
|
|
|
@cached_property
|
|
@cached_property
|
|
|
- def history(self):
|
|
|
|
|
|
|
+ def thumbnail_url(self) -> Optional[str]:
|
|
|
|
|
+ result = self.archiveresult_set.filter(
|
|
|
|
|
+ extractor='screenshot',
|
|
|
|
|
+ status='succeeded'
|
|
|
|
|
+ ).only('output').last()
|
|
|
|
|
+ if result:
|
|
|
|
|
+ return reverse('Snapshot', args=[f'{str(self.timestamp)}/{result.output}'])
|
|
|
|
|
+ return None
|
|
|
|
|
+
|
|
|
|
|
+ @cached_property
|
|
|
|
|
+ def headers(self) -> Optional[dict]:
|
|
|
|
|
+ try:
|
|
|
|
|
+ return json.loads((Path(self.link_dir) / 'headers.json').read_text().strip())
|
|
|
|
|
+ except Exception:
|
|
|
|
|
+ pass
|
|
|
|
|
+ return None
|
|
|
|
|
+
|
|
|
|
|
+ @cached_property
|
|
|
|
|
+ def status_code(self) -> Optional[str]:
|
|
|
|
|
+ return self.headers and self.headers.get('Status-Code')
|
|
|
|
|
+
|
|
|
|
|
+ @cached_property
|
|
|
|
|
+ def history(self) -> dict:
|
|
|
# TODO: use ArchiveResult for this instead of json
|
|
# TODO: use ArchiveResult for this instead of json
|
|
|
return self.as_link_with_details().history
|
|
return self.as_link_with_details().history
|
|
|
|
|
|
|
|
@cached_property
|
|
@cached_property
|
|
|
- def latest_title(self):
|
|
|
|
|
|
|
+ def latest_title(self) -> Optional[str]:
|
|
|
if self.title:
|
|
if self.title:
|
|
|
return self.title # whoopdedoo that was easy
|
|
return self.title # whoopdedoo that was easy
|
|
|
|
|
|
|
@@ -211,7 +244,7 @@ class Snapshot(models.Model):
|
|
|
|
|
|
|
|
return None
|
|
return None
|
|
|
|
|
|
|
|
- def save_tags(self, tags=()):
|
|
|
|
|
|
|
+ def save_tags(self, tags: List[str]=()) -> None:
|
|
|
tags_id = []
|
|
tags_id = []
|
|
|
for tag in tags:
|
|
for tag in tags:
|
|
|
if tag.strip():
|
|
if tag.strip():
|