-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgenerate_token_map.py
More file actions
86 lines (67 loc) · 2.47 KB
/
Copy pathgenerate_token_map.py
File metadata and controls
86 lines (67 loc) · 2.47 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
#!/usr/bin/env python3
import os
import json
import argparse
import hashlib
import base64
from datetime import datetime
import re
MAP_FILE = "/etc/nginx/podcast_tokens.map"
BACKUP_DIR = "/etc/nginx/token_map_backups"
def slugify(text):
return re.sub(r"[\W_]+", "-", text.strip().lower())
def generate_token_for_name(name, seed=None):
raw = f"{seed}:{name}".encode("utf-8")
h = hashlib.sha256(raw).digest()
return base64.urlsafe_b64encode(h)[:16].decode("utf-8")
def create_token_map(archive_root, seed=None):
token_map = {}
for dir_name in sorted(os.listdir(archive_root)):
dir_path = os.path.join(archive_root, dir_name)
if os.path.isdir(dir_path):
token = generate_token_for_name(dir_name, seed=seed)
token_map[token] = dir_name
return token_map
def write_token_map(token_map, output_path=MAP_FILE):
os.makedirs(os.path.dirname(output_path), exist_ok=True)
# Backup old map
if os.path.exists(output_path):
os.makedirs(BACKUP_DIR, exist_ok=True)
timestamp = datetime.now().strftime("%Y%m%d-%H%M%S")
backup_file = os.path.join(BACKUP_DIR, f"podcast_tokens_{timestamp}.map")
os.rename(output_path, backup_file)
print(f"📦 Backed up previous map to {backup_file}")
with open(output_path, "w") as f:
for token, folder in token_map.items():
f.write(f"{token} {folder};\n")
print(f"✅ Wrote token map to {output_path}")
def write_reference_json(token_map, archive_root):
ref_path = os.path.join(archive_root, "tokens.json")
with open(ref_path, "w") as f:
json.dump(token_map, f, indent=2)
print(f"📘 Reference tokens.json written to: {ref_path}")
if __name__ == "__main__":
parser = argparse.ArgumentParser(
description="Generate nginx token map for podcast access"
)
parser.add_argument(
"--archive_dir",
default="/srv/www/petit-pois/pods",
help="Root directory of podcast folders",
)
parser.add_argument(
"--map_file",
default=MAP_FILE,
help="Path to output nginx token map file",
)
parser.add_argument(
"--seed",
default=0,
type=int,
help="Optional seed for reproducible token generation (default: random)",
)
args = parser.parse_args()
seed = args.seed
token_map = create_token_map(args.archive_dir, seed=seed)
write_token_map(token_map, args.map_file)
write_reference_json(token_map, args.archive_dir)