22 lines
658 B
Python
22 lines
658 B
Python
# utils/seen_store.py
|
|
import os, redis
|
|
from typing import Iterable
|
|
|
|
REDIS_URL = os.environ.get("REDIS_URL", "redis://localhost:6379/0")
|
|
r = redis.from_url(REDIS_URL, decode_responses=True)
|
|
|
|
def seen_key(username: str) -> str:
|
|
return f"ig:seen:{username}"
|
|
|
|
def mark_seen(username: str, ids: Iterable[str]) -> None:
|
|
if not ids: return
|
|
r.sadd(seen_key(username), *ids)
|
|
|
|
def filter_unseen(username: str, ids: Iterable[str]) -> list[str]:
|
|
# pipeline for speed
|
|
key = seen_key(username)
|
|
pipe = r.pipeline()
|
|
for i in ids:
|
|
pipe.sismember(key, i)
|
|
flags = pipe.execute()
|
|
return [i for i, seen in zip(ids, flags) if not seen] |