fix(dev-scripts): parse all topics from linux-gaming

Signed-off-by: Boris Yumankulov <boria138@altlinux.org>
This commit is contained in:
2025-07-11 13:31:28 +05:00
parent 59bfcdbbba
commit 4818cf5b67

View File

@ -100,34 +100,125 @@ async def fetch_games_json(session):
return [] return []
async def get_linux_gaming_topics(session, category_slug): async def get_linux_gaming_topics(session, category_slug):
"""
Получает все темы из указанной категории linux-gaming.ru.
Сохраняет только нормализованное название (normalized_title) и slug.
"""
page = 0 page = 0
all_topics = [] all_topics = []
max_pages = 100
while True: while page < max_pages:
page += 1 # Пробуем несколько вариантов URL
url = f"{LINUX_GAMING_BASE_URL}/c/{category_slug}/l/latest.json?page={page}" urls_to_try = [
f"{LINUX_GAMING_BASE_URL}/c/{category_slug}/5/l/latest.json", # с id категории
f"{LINUX_GAMING_BASE_URL}/c/{category_slug}/l/latest.json", # только slug
f"{LINUX_GAMING_BASE_URL}/c/5/l/latest.json", # только id
f"{LINUX_GAMING_BASE_URL}/latest.json" # все темы
]
success = False
data = None
for url in urls_to_try:
try: try:
async with session.get(url, headers=LINUX_GAMING_HEADERS, verify_ssl=not DEBUG_MODE) as response: # Добавляем параметры пагинации
params = {
'page': page,
'order': 'default'
}
async with session.get(url, headers=LINUX_GAMING_HEADERS,
params=params, verify_ssl=not DEBUG_MODE) as response:
if response.status == 429:
print(f"Слишком много запросов на странице {page}, ожидание...")
await asyncio.sleep(5)
continue
if response.status == 404:
if DEBUG_MODE:
print(f"URL не найден: {url}")
continue
response.raise_for_status() response.raise_for_status()
data = await response.json() data = await response.json()
topics = data.get("topic_list", {}).get("topics", [])
# Проверяем структуру ответа
topic_list = data.get("topic_list", {})
topics = topic_list.get("topics", [])
if not topics: if not topics:
break if page == 0:
for topic in topics: if DEBUG_MODE:
all_topics.append({ print(f"Нет тем в URL: {url}")
"normalized_title": normalize_name(topic["title"]), continue
"slug": topic["slug"] else:
}) print(f"Страница {page} пуста, завершаем пагинацию.")
print(f"Обработано {len(topics)} тем на странице {page}, всего: {len(all_topics)}.")
except Exception as error:
print(f"Ошибка получения тем для страницы {page}: {error}")
break
return all_topics return all_topics
if DEBUG_MODE and page == 0:
print(f"Успешно подключились к URL: {url}")
success = True
break
except Exception as e:
if DEBUG_MODE:
print(f"Ошибка с URL {url}: {e}")
continue
if not success:
print(f"Не удалось загрузить страницу {page}")
break
# Обрабатываем темы (этот блок должен быть внутри основного цикла)
try:
topic_list = data.get("topic_list", {})
topics = topic_list.get("topics", [])
page_topics_added = 0
for topic in topics:
slug = topic["slug"]
# Пропускаем тему описания категории
if slug is None or slug == "opisanie-kategorii-portprotondb":
if DEBUG_MODE:
print(f"Пропущена тема описания категории")
continue
normalized_title = normalize_name(topic["title"])
# Добавляем только валидные темы
all_topics.append({
"normalized_title": normalized_title,
"slug": slug,
})
page_topics_added += 1
if DEBUG_MODE and page_topics_added <= 3: # Показываем первые 3 темы
print(f"Добавлена тема: {normalized_title} (slug: {slug}")
print(f"Обработано {len(topics)} тем на странице {page}, добавлено: {page_topics_added}, всего: {len(all_topics)}.")
# Проверяем, есть ли еще страницы
more_topics_url = topic_list.get("more_topics_url")
if not more_topics_url:
print("Больше тем нет, завершаем пагинацию.")
break
page += 1
# Добавляем небольшую задержку между запросами
await asyncio.sleep(0.5)
except Exception as e:
print(f"Ошибка при обработке тем на странице {page}: {e}")
break
if not all_topics:
print("Предупреждение: не удалось получить ни одной темы из linux-gaming.ru.")
else:
print(f"Всего получено {len(all_topics)} тем из категории {category_slug}")
return all_topics
async def request_data(): async def request_data():
""" """
Получает данные из Steam, AreWeAntiCheatYet и linux-gaming.ru, Получает данные из Steam, AreWeAntiCheatYet и linux-gaming.ru,