60 lines
2.2 KiB
Python
60 lines
2.2 KiB
Python
import logging
|
|
|
|
from typing import Set, List
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class ProcessedPostsManager:
|
|
def __init__(self, file_path: str = "storage/processed.txt"):
|
|
self.file_path = file_path
|
|
self.processed_posts: Set[str] = self._load()
|
|
|
|
def _load(self) -> Set[str]:
|
|
try:
|
|
with open(self.file_path, "r", encoding="utf-8") as processed:
|
|
ids = {line.strip() for line in processed if line.strip()}
|
|
logger.info(
|
|
f"Загружено {len(ids)} обработанных постов из {self.file_path}."
|
|
)
|
|
return ids
|
|
|
|
except FileNotFoundError:
|
|
logger.info(f"Файл {self.file_path} не найден, начинаем с пустого списка.")
|
|
return set()
|
|
|
|
except Exception as e:
|
|
logger.error(
|
|
f"Ошибка при загрузке {self.file_path}: {e}. Начинаем с пустого списка."
|
|
)
|
|
return set()
|
|
|
|
def _save(self):
|
|
"""Full rewrite — use for batch operations only."""
|
|
with open(self.file_path, "w", encoding="utf-8") as processed:
|
|
processed.write("".join(f"{pid}\n" for pid in self.processed_posts))
|
|
|
|
def is_processed(self, post_id: int) -> bool:
|
|
return str(post_id) in self.processed_posts
|
|
|
|
def mark_processed(self, post_id: int):
|
|
"""Mark a single post processed and append to file (no full rewrite)."""
|
|
str_id = str(post_id)
|
|
if str_id in self.processed_posts:
|
|
return
|
|
|
|
self.processed_posts.add(str_id)
|
|
with open(self.file_path, "a", encoding="utf-8") as f:
|
|
f.write(str_id + "\n")
|
|
logger.debug(f"Пост {post_id} отмечен как обработанный.")
|
|
|
|
def add_existing_posts(self, post_ids: List[int]):
|
|
before = len(self.processed_posts)
|
|
for post_id in post_ids:
|
|
self.processed_posts.add(str(post_id))
|
|
self._save()
|
|
added = len(self.processed_posts) - before
|
|
logger.info(
|
|
f"Добавлено {added} новых записей в список обработанных (всего: {len(self.processed_posts)})."
|
|
)
|