-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy patharchives.py
More file actions
121 lines (92 loc) 路 3.12 KB
/
Copy patharchives.py
File metadata and controls
121 lines (92 loc) 路 3.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import os
import json
import settings
from libzim.reader import Archive
PROJECT_DIR = os.path.dirname(os.path.abspath(__file__))
META_DIR = os.path.join(PROJECT_DIR, "zims")
def resolve_path(path):
if not path:
return path
path = os.path.expanduser(path)
if not os.path.isabs(path):
path = os.path.join(PROJECT_DIR, path)
return path
ZIMS_DIR = resolve_path(getattr(settings, "zims_dir", None))
SINGLE_PATH = resolve_path(getattr(settings, "archive_path", None))
SINGLE_TYPE = getattr(settings, "archive_type", "wikipedia")
def root_folder():
marker = os.path.join(os.sep, "storage", "pages")
idx = PROJECT_DIR.rfind(marker)
rest = PROJECT_DIR[idx + len(marker):] if idx != -1 else None
if rest is None or (rest and not rest.startswith(os.sep)):
return getattr(settings, "root_folder", None)
return rest.strip(os.sep).replace(os.sep, "/")
def page_root():
rf = root_folder()
return f"/page/{rf}" if rf else "/page"
def meta_path(name):
return os.path.join(META_DIR, os.path.basename(name) + ".meta")
def has_meta(name):
return os.path.isfile(meta_path(name))
def load_meta(name):
try:
with open(meta_path(name), "r", encoding="utf-8") as f:
return json.load(f)
except (OSError, ValueError):
return {}
def zim_path(name):
name = os.path.basename(name or "")
if not name.endswith(".zim"):
raise FileNotFoundError(name)
if ZIMS_DIR:
candidate = os.path.join(ZIMS_DIR, name)
if os.path.isfile(candidate):
return candidate
if SINGLE_PATH and name == os.path.basename(SINGLE_PATH):
return SINGLE_PATH
raise FileNotFoundError(name)
def zim_names():
names = []
if ZIMS_DIR and os.path.isdir(ZIMS_DIR):
names = sorted(f for f in os.listdir(ZIMS_DIR) if f.endswith(".zim"))
if not names and SINGLE_PATH:
names = [os.path.basename(SINGLE_PATH)]
return names
def available_names():
names = [n for n in zim_names() if has_meta(n)]
if not names and SINGLE_PATH:
names = [os.path.basename(SINGLE_PATH)]
return names
def archive_type(name):
meta = load_meta(name)
if meta.get("type"):
return meta["type"]
if SINGLE_PATH and name == os.path.basename(SINGLE_PATH):
return SINGLE_TYPE
return "generic"
def list_archives():
items = []
for name in available_names():
meta = load_meta(name)
items.append({
"name": name,
"title": meta.get("title") or name,
"type": meta.get("type") or archive_type(name),
"description": meta.get("description", ""),
"article_count": meta.get("article_count"),
"main_path": meta.get("main_path", ""),
})
return items
def open_archive(name):
return Archive(zim_path(name))
def main_path(name, archive=None):
meta = load_meta(name)
if meta.get("main_path"):
return meta["main_path"]
archive = archive or open_archive(name)
try:
if archive.has_main_entry:
return archive.main_entry.get_item().path
except Exception:
pass
return ""