/** * Сырые структуры провайдера Stripcash — ровно как в API * (`responses.StripCashModelItem` / `StripCashModelFilter`, см. swagger * `/api/docs/doc.json`, ручки `/v2/stripcash/*`). Названия полей оставлены * в snake_case провайдера: приведение к нормализованному виду делает обёртка * `components/webcam/stripcash-card.vue`, чтобы провайдерная специфика не * расползалась по компонентам. */ export interface IStripcashModel { id?: number; username?: string; age?: number; country?: string; gender?: string; languages?: string[]; tags?: string[]; flags?: string[]; viewers_count?: number; /** Ссылка перехода с партнёрскими метками */ click_url?: string; snapshot_url?: string; popular_snapshot_url?: string; preview_url_thumb_small?: string; /** Видео-превью (используется для проигрывания в карточке) */ stream_url?: string; /** Варианты качества стрима: `{ key: '240p', url }`. Нужны для фолбэк-цепочки превью. */ streams?: Array<{ key?: string, url?: string }> | Record; /** Новая модель у провайдера — плашка «New model» */ isNew?: boolean; is_new?: boolean; /** Цель стримера: сообщение и сколько собрано из нужного (имена как в базе провайдера) */ goalMessage?: string; neededForGoal?: number; earnedForGoal?: number; /** Модель попала в текущую категорию (для фасетной выдачи) */ hit_category?: boolean; } export interface IStripcashModelsResponse { items?: IStripcashModel[]; } /** Ответ фасетной ручки: модели + доступные фильтры + пагинация. */ export interface IStripcashFilteredResponse { items?: IStripcashModel[]; filters?: Array<{ name?: string; title?: string; kind?: string; options?: Array<{ name?: string; title?: string; quantity?: number }>; }>; total?: number; all_pages?: number; current_page?: number; }