абузы: free-панели new-api на вкладке (роут /api/panels + грид), CSS вынесен из JS, панельный классификатор даёт freeapi-вес, тесты
Some checks failed
ci / test (3.10) (push) Has been cancelled
ci / test (3.11) (push) Has been cancelled
ci / test (3.12) (push) Has been cancelled

This commit is contained in:
Vlad Gothbreach
2026-10-27 02:06:32 +03:00
parent b09cb5f873
commit 16512bf4a1
21 changed files with 1386 additions and 130 deletions

View File

@@ -19,6 +19,7 @@ from .sources_tg_abuse import TG_ABUSE
from .sources_ext4 import EXTRA5
from .sources_ext5 import EXTRA6
from .sources_fresh import fresh as _fresh_sources
from .sources_quality import quality_sources as _quality_sources
from .sources_x import X_SOURCES
@@ -298,7 +299,7 @@ def _gen_sources():
return out
def all_sources():
def all_sources(include_fresh=True):
"""Реестр + пользовательские источники из панели, без дублей по url и по имени.
Дедуп по двум ключам обязателен:
@@ -306,8 +307,10 @@ def all_sources():
* name — имя источника является первичным ключом в source_flags/runs, поэтому
зеркала одного и того же ресурса (rss.arxiv vs export.arxiv, old.reddit vs
www.reddit) обязаны схлопываться, иначе переключение/состояние «плывут».
Побеждает первое вхождение; порядок: реестр → сгенерированные → свежая волна →
Побеждает первое вхождение; порядок: реестр → сгенерированные → свежая и quality-волны →
пользовательские → abuse-radar → panels.json.
include_fresh=False исключает текущий generated fresh-модуль при регенерации.
"""
from . import source_state
extra = []
@@ -318,7 +321,8 @@ def all_sources():
("name", "category", "kind", "url", "adapter", "tags", "limit", "detail", "extra")}
extra.append(Source(**d))
seen_url, seen_name, out = set(), set(), []
for s in SOURCES + _gen_sources() + _fresh_sources(S) + extra + radar_sources() + panel_sources():
fresh = _fresh_sources(S) if include_fresh else []
for s in SOURCES + _gen_sources() + fresh + _quality_sources(S) + extra + radar_sources() + panel_sources():
key = (s.url or "").rstrip("/").lower()
name = (s.name or "").strip().lower()
if (key and key in seen_url) or (name and name in seen_name):