Tabele per urzadzenie (migracja 0037): clip_seen (wykluczenie, wiersz przy
podaniu klipu), clip_feed_events (append-only: impression z dwell, skip,
complete, like, unlike, not_interested, autoswipe), clip_affinity (wagi
tag/nisza/tworca w JSONB), clip_favorites, clip_blacklist. GIN na clips.niches.
GET /clips/feed: kursor base64 {seed, pk, page} zamiast offsetu; 80% z puli
afinicznosci (skany po tagu/niszy/tworcy od losowego uuid, punktacja
sum wag + 0,3 ln(1+lajki) + swiezosc, max 2 klipy tworcy na strone) + 20%
explore (okno 2000 id po PK, losowanie wazone lajkami, zawijanie na koncu).
Bez wag 100% explore. POST /clips/events: zapis, podniesienie outcome,
ulubione, delty wag (like +5, complete +3, dwell>=10 s +1, skip<2 s -1,
not_interested -4 i -8 na wskazany cel). Onboarding 3 tapow, opcje,
blacklista tag/nisza/tworca, reset feedu, ulubione. Import miedzy
urzadzeniami kopiuje clip_seen, clip_favorites i clip_blacklist.
Job clips-maintenance co 24 h: decay wag x0,97, retencja zdarzen 90 dni,
reaper (HEAD na 2000 najdawniej sprawdzanych). Logika bez bazy w
app/clips_feed.py z testami (kursor, delty, cap/decay, punktacja, sklad).
87 lines
2.5 KiB
Python
87 lines
2.5 KiB
Python
from app.models.base import Base
|
|
from app.models.blacklist import BlacklistedPerformer, BlacklistedStudio, BlacklistedTag
|
|
from app.models.bug_report import BugReport
|
|
from app.models.clip import Clip, ClipTag
|
|
from app.models.clip_feed import ClipAffinity, ClipBlacklist, ClipFavorite, ClipFeedEvent, ClipSeen
|
|
from app.models.external_record import ExternalRecord
|
|
from app.models.favorite_movie import FavoriteMovie
|
|
from app.models.favorite_performer import FavoritePerformer
|
|
from app.models.favorite_scene import FavoriteScene
|
|
from app.models.favorite_site import FavoriteSite
|
|
from app.models.favorite_studio import FavoriteStudio
|
|
from app.models.ingest_run import IngestRun
|
|
from app.models.merge_candidate import MergeCandidate
|
|
from app.models.movie import (
|
|
Movie,
|
|
MovieChapter,
|
|
MovieExternalRef,
|
|
MoviePerformer,
|
|
MovieTag,
|
|
)
|
|
from app.models.movie_playback_source import MoviePlaybackSource
|
|
from app.models.performer import Performer, PerformerAlias, PerformerExternalRef
|
|
from app.models.play_progress import MoviePlayProgress, ScenePlayProgress
|
|
from app.models.playback_event import PlaybackEvent
|
|
from app.models.playback_source import PlaybackSource
|
|
from app.models.duration_backfill_queue import DurationBackfillQueue
|
|
from app.models.phash_backfill_queue import PhashBackfillQueue
|
|
from app.models.phash_blacklist import PhashBlacklist
|
|
from app.models.saved_search import SavedSearch
|
|
from app.models.source_stats import SourceStats
|
|
from app.models.scene import (
|
|
Scene,
|
|
SceneExternalRef,
|
|
SceneFingerprint,
|
|
ScenePerformer,
|
|
SceneTag,
|
|
)
|
|
from app.models.source import Source
|
|
from app.models.studio import Studio, StudioAlias, StudioExternalRef
|
|
from app.models.tag import Tag
|
|
|
|
__all__ = [
|
|
"Base",
|
|
"BlacklistedPerformer",
|
|
"BlacklistedStudio",
|
|
"BlacklistedTag",
|
|
"BugReport",
|
|
"Clip",
|
|
"ClipAffinity",
|
|
"ClipBlacklist",
|
|
"ClipFavorite",
|
|
"ClipFeedEvent",
|
|
"ClipSeen",
|
|
"ClipTag",
|
|
"ExternalRecord",
|
|
"FavoriteMovie",
|
|
"FavoritePerformer",
|
|
"FavoriteScene",
|
|
"FavoriteSite",
|
|
"FavoriteStudio",
|
|
"IngestRun",
|
|
"MergeCandidate",
|
|
"Movie",
|
|
"MovieChapter",
|
|
"MovieExternalRef",
|
|
"MoviePerformer",
|
|
"MoviePlaybackSource",
|
|
"MovieTag",
|
|
"Performer",
|
|
"PerformerAlias",
|
|
"PerformerExternalRef",
|
|
"MoviePlayProgress",
|
|
"ScenePlayProgress",
|
|
"PlaybackSource",
|
|
"PhashBlacklist",
|
|
"SavedSearch",
|
|
"Scene",
|
|
"SceneExternalRef",
|
|
"SceneFingerprint",
|
|
"ScenePerformer",
|
|
"SceneTag",
|
|
"Source",
|
|
"Studio",
|
|
"StudioAlias",
|
|
"StudioExternalRef",
|
|
"Tag",
|
|
]
|