package domain import ( "context" "mal/internal/db" ) type PlaybackService interface { BuildWatchData(ctx context.Context, animeID int, titleCandidates []string, episode string, mode string, userID string) (map[string]any, error) SaveProgress(ctx context.Context, userID string, animeID int64, episode int, timeSeconds float64) error CompleteAnime(ctx context.Context, userID string, animeID int64) error ResolveProxyToken(token string) (string, string, error) } type ProviderStream struct { Name string `json:"name"` URL string `json:"url"` Quality string `json:"quality"` MalID int `json:"mal_id"` IsCurrent bool `json:"is_current"` } type ProviderData struct { Streams []ProviderStream `json:"streams"` } type EpisodeData struct { MalID int `json:"mal_id"` Title string `json:"title"` IsFiller bool `json:"is_filler"` IsRecap bool `json:"is_recap"` } type PlaybackRepository interface { GetWatchListEntry(ctx context.Context, params db.GetWatchListEntryParams) (db.WatchListEntry, error) GetContinueWatchingEntry(ctx context.Context, params db.GetContinueWatchingEntryParams) (db.ContinueWatchingEntry, error) SaveWatchProgress(ctx context.Context, params db.SaveWatchProgressParams) error UpsertWatchListEntry(ctx context.Context, params db.UpsertWatchListEntryParams) (db.WatchListEntry, error) UpsertContinueWatchingEntry(ctx context.Context, params db.UpsertContinueWatchingEntryParams) (db.ContinueWatchingEntry, error) DeleteContinueWatchingEntry(ctx context.Context, params db.DeleteContinueWatchingEntryParams) error }