-
Notifications
You must be signed in to change notification settings - Fork 12
Expand file tree
/
Copy patharchives.py
More file actions
97 lines (75 loc) · 2.5 KB
/
Copy patharchives.py
File metadata and controls
97 lines (75 loc) · 2.5 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
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")
ZIMS_DIR = getattr(settings, "zims_dir", None)
SINGLE_PATH = getattr(settings, "archive_path", None)
SINGLE_TYPE = getattr(settings, "archive_type", "wikipedia")
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 ValueError("invalid archive 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 ""