mirror of
https://github.com/migatu/conjurer.git
synced 2026-07-14 21:38:38 +00:00
2aeb3d286f
Intermediate commits (oldest → newest): - Generated scripts - new function - more work needed - Search client - serverside - added server side search - M - fix - fix deploy - zmiana nazwy - Params of radio - Watcher
94 lines
2.5 KiB
Python
Executable File
94 lines
2.5 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
import argparse
|
|
import json
|
|
import os
|
|
import sys
|
|
import uuid
|
|
from pathlib import Path
|
|
|
|
# CONFIGURATION
|
|
JSON_DB = '/var/log/share_scan.json'
|
|
SHARE_DIR = Path('/var/www/html/share')
|
|
BASE_URL = 'https://czernobog.pl/share'
|
|
|
|
# Ensure share directory exists
|
|
SHARE_DIR.mkdir(parents=True, exist_ok=True)
|
|
|
|
def load_db():
|
|
with open(JSON_DB) as f:
|
|
return json.load(f)['entries']
|
|
|
|
def relevancy(path, keywords):
|
|
score = 0
|
|
low = path.lower()
|
|
for kw in keywords:
|
|
if kw.lower() in low:
|
|
score += low.count(kw.lower())
|
|
return score
|
|
|
|
def find_matches(entries, keywords):
|
|
scored = []
|
|
for e in entries:
|
|
score = relevancy(e['path'], keywords)
|
|
if score > 0:
|
|
scored.append((score, e['path']))
|
|
scored.sort(reverse=True, key=lambda x: x[0])
|
|
return [p for _, p in scored]
|
|
|
|
def interactive_select(candidates):
|
|
print("Search results:")
|
|
for idx, p in enumerate(candidates, 1):
|
|
print(f" {idx:3d}. {p}")
|
|
sel = input("\nSelect files (e.g. 1,3-5): ").strip()
|
|
nums = set()
|
|
for part in sel.split(','):
|
|
if '-' in part:
|
|
a,b = part.split('-',1)
|
|
nums.update(range(int(a), int(b)+1))
|
|
else:
|
|
nums.add(int(part))
|
|
return [candidates[i-1] for i in sorted(nums) if 1 <= i <= len(candidates)]
|
|
|
|
def publish(paths):
|
|
urls = []
|
|
for path in paths:
|
|
token = uuid.uuid4().hex
|
|
link = SHARE_DIR / token
|
|
try:
|
|
os.symlink(path, link)
|
|
except FileExistsError:
|
|
pass
|
|
urls.append(f"{BASE_URL}/{token}")
|
|
return urls
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description="Search and share files from JSON DB")
|
|
parser.add_argument('keywords', nargs='*',
|
|
help='Search keywords (interactive if omitted)')
|
|
parser.add_argument('-n','--count', type=int, default=10,
|
|
help='How many top results to share')
|
|
args = parser.parse_args()
|
|
|
|
if not args.keywords:
|
|
# Interactive: ask for query
|
|
q = input("Enter search keywords (space-separated): ").strip().split()
|
|
args.keywords = q
|
|
|
|
entries = load_db()
|
|
matches = find_matches(entries, args.keywords)
|
|
top_n = matches[:args.count]
|
|
|
|
if sys.stdin.isatty():
|
|
# interactive selection
|
|
sel = interactive_select(top_n)
|
|
else:
|
|
# non-interactive: share all top_n
|
|
sel = top_n
|
|
|
|
urls = publish(sel)
|
|
for u in urls:
|
|
print(u)
|
|
|
|
if __name__=='__main__':
|
|
main()
|