goon/app/models/source_stats.py
goon-foss a4486980a4 style: myslniki em/en z komentarzy i docstringow (calosc repo)
1745 wystapien w 291 plikach (backend, scripts, mobile). Dominowal jeden ksztalt,
' — ' laczace zdania, wiec poszedl przecinek; myslnik otwierajacy mysl zdjety;
zakresy 0–5 i A–Z na dywiz.

Podzial komentarz/kod robil skaner stanow, nie regex, zeby nie ruszyc myslnika
stojacego w stringu albo w wyrazeniu regularnym. Potwierdzone maszynowo: po wycieciu
komentarzy z wersji HEAD i z dysku obie sa identyczne we wszystkich 291 plikach,
czyli poza komentarzami nie zmienilo sie nic. 233 pliki .py parsuja sie bez bledu,
tsc ma te same 11 bledow w tych samych 3 plikach co przed zmiana.

Dwie rzeczy wymagaly poprawki po automacie: wyrownane listy definicji, gdzie myslnik
byl separatorem kolumny (37 miejsc, kolumna przywrocona), i trzy przeniesienia mysli
do nowej linii, gdzie zostawal wiszacy przecinek na poczatku (poprawione recznie).

Bundla nie republikuje: Hermes i tak nie niesie komentarzy, wiec dla uzytkownika
to zero zmiany.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 11:51:57 +02:00

40 lines
2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Source ranking, policzona ocena 0-5★ per origin (tube źródło) dla Sites screen.
User request: ranking stron-źródeł wg (1) częstotliwości odświeżania, (2) bogactwa
metadanych (miniaturka/tagi/desc/aktorzy), (3) szybkości działania (czy realnie gra).
0★ = offline. Liczone okresowo przez `run_source_stats` (scheduler), bo richness to
agregat po ~2M live playback_sources × scenach, za drogie na request /sources.
Jeden wiersz per origin. `components` (JSONB) trzyma surowe składowe do rozkładu w UI
(% thumb/tag/perf/desc/studio/dur, telemetria health, basis). Top-level kolumny to
gotowe gwiazdki, żeby /sources tylko czytał i sortował.
"""
from __future__ import annotations
from datetime import datetime
from sqlalchemy import DateTime, Integer, SmallInteger, String, func
from sqlalchemy.dialects.postgresql import JSONB
from sqlalchemy.orm import Mapped, mapped_column
from app.models.base import Base
class SourceStats(Base):
__tablename__ = "source_stats"
origin: Mapped[str] = mapped_column(String(64), primary_key=True)
# Ocena ogólna 0-5 (0 = offline). Gate: health==0 → stars 0.
stars: Mapped[int] = mapped_column(SmallInteger, nullable=False, default=0)
freshness: Mapped[int] = mapped_column(SmallInteger, nullable=False, default=0)
richness: Mapped[int] = mapped_column(SmallInteger, nullable=False, default=0)
# None gdy brak jakiegokolwiek sygnału (nie powinno się zdarzyć, proxy zawsze daje).
health: Mapped[int | None] = mapped_column(SmallInteger, nullable=True)
scenes: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
new_7d: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
newest_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
# Surowe składowe do rozkładu w UI + diagnostyki. Patrz run_source_stats.
components: Mapped[dict] = mapped_column(JSONB, nullable=False, default=dict)
computed_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), server_default=func.now(), nullable=False
)