Files
TwitchClient/src/twitchclient/schema.py

1512 lines
30 KiB
Python

from datetime import datetime
from typing import Any, Literal, TypedDict
from pydantic import BaseModel, ConfigDict, Field
from . import scopes
from .eventsub import subscriptions as sub
class BaseSchema(BaseModel):
model_config = ConfigDict(extra='forbid')
class Error(Exception):
status_code: int
error: str
def __init__(self, status_code: int, error: str) -> None:
self.status_code = status_code
self.error = error
super().__init__(f'{status_code}: {error}')
class ClientError(Error):
pass
class InternalError(Error):
pass
class Pagination(BaseSchema):
cursor: str
class AppAccessToken(BaseSchema):
access_token: str
expires_in: int
token_type: Literal['bearer']
class UserAccessToken(BaseSchema):
access_token: str
refresh_token: str
scope: list[scopes.Any]
expires_in: int
token_type: Literal['bearer']
class AccessTokenValidation(BaseSchema):
client_id: str
login: str
scopes: list[scopes.Any]
user_id: int
expires_in: int
class StartCommercialData(BaseSchema):
length: int
message: str
retry_after: int
class StartCommercial(BaseSchema):
data: list[StartCommercialData]
class AdScheduleData(BaseSchema):
next_ad_at: datetime | None
last_ad_at: datetime | None
duration: int
preroll_free_time: int
snooze_count: int
snooze_refresh_at: datetime
class AdSchedule(BaseSchema):
data: list[AdScheduleData]
class SnoozeNextAdData(BaseSchema):
snooze_count: int
snooze_refresh_at: datetime
next_ad_at: datetime
class SnoozeNextAd(BaseSchema):
data: list[SnoozeNextAdData]
class DateRange(BaseSchema):
started_at: datetime
ended_at: datetime
class ExtensionAnalyticsData(BaseSchema):
extension_id: str
URL: str
type: str
date_range: DateRange
class ExtensionAnalytics(BaseSchema):
data: list[ExtensionAnalyticsData]
pagination: Pagination | dict[Any, Any] | None = None
class GameAnalyticsData(BaseSchema):
game_id: int
URL: str
type: str
date_range: DateRange
class GameAnalytics(BaseSchema):
data: list[GameAnalyticsData]
pagination: Pagination | dict[Any, Any] | None = None
class BitsLeaderboardData(BaseSchema):
user_id: int
user_login: str
user_name: str
rank: int
score: int
class BitsLeaderboard(BaseSchema):
data: list[BitsLeaderboardData]
date_range: DateRange
total: int
class CheermotesImageAnimated(BaseSchema):
field_1: str = Field(..., alias='1')
field_1_5: str = Field(..., alias='1.5')
field_2: str = Field(..., alias='2')
field_3: str = Field(..., alias='3')
field_4: str = Field(..., alias='4')
class CheermotesImageStatic(BaseSchema):
field_1: str = Field(..., alias='1')
field_1_5: str = Field(..., alias='1.5')
field_2: str = Field(..., alias='2')
field_3: str = Field(..., alias='3')
field_4: str = Field(..., alias='4')
class CheermotesImage(BaseSchema):
animated: CheermotesImageAnimated
static: CheermotesImageStatic
class CheermotesImages(BaseSchema):
light: CheermotesImage
dark: CheermotesImage
class CheermotesTier(BaseSchema):
min_bits: int
id: Literal['1', '100', '500', '1000', '5000', '10000', '100000']
color: str
can_cheer: bool
show_in_bits_card: bool
images: CheermotesImages
class CheermotesData(BaseSchema):
prefix: str
tiers: list[CheermotesTier]
type: Literal[
'global_first_party',
'global_third_party',
'channel_custom',
'display_only',
'sponsored',
]
order: int
last_updated: datetime
is_charitable: bool
class Cheermotes(BaseSchema):
data: list[CheermotesData]
class ExtensionProductCost(BaseSchema):
amount: int
type: Literal['bits']
class ExtensionProductData(BaseSchema):
domain: str
sku: str
cost: ExtensionProductCost
inDevelopment: bool
displayName: str
expiration: str
broadcast: bool
class ExtensionTransactionsData(BaseSchema):
id: str
timestamp: datetime
broadcaster_id: int
broadcaster_login: str
broadcaster_name: str
user_id: int
user_login: str
user_name: str
product_type: Literal['BITS_IN_EXTENSION']
product_data: ExtensionProductData
class ExtensionTransactions(BaseSchema):
data: list[ExtensionTransactionsData]
pagination: Pagination | dict[Any, Any] | None = None
class ContentClassificationLabel(TypedDict):
id: Literal[
'DebatedSocialIssuesAndPolitics',
'DrugsIntoxication',
'SexualThemes',
'ViolentGraphic',
'Gambling',
'ProfanityVulgarity',
]
is_enabled: bool
class ChannelInformation(BaseSchema):
broadcaster_id: int
broadcaster_login: str
broadcaster_name: str
broadcaster_language: str
game_name: str
game_id: int | str
title: str
delay: int
tags: list[str]
content_classification_labels: list[str]
is_branded_content: bool
class ChannelsInformation(BaseSchema):
data: list[ChannelInformation]
class ChannelEditor(BaseSchema):
user_id: int
user_name: str
created_at: datetime
class ChannelEditors(BaseSchema):
data: list[ChannelEditor]
class FollowedChannel(BaseSchema):
broadcaster_id: int
broadcaster_login: str
broadcaster_name: str
followed_at: datetime
class FollowedChannels(BaseSchema):
data: list[FollowedChannel]
pagination: Pagination | dict[Any, Any] | None = None
total: int
class ChannelFollower(BaseSchema):
user_id: int
user_login: str
user_name: str
followed_at: datetime
class ChannelFollowers(BaseSchema):
data: list[ChannelFollower]
pagination: Pagination | dict[Any, Any] | None = None
total: int
class CustomRewardImage(BaseSchema):
url_1x: str
url_2x: str
url_4x: str
class MaxPerStreamSetting(BaseSchema):
is_enabled: bool
max_per_stream: int
class MaxPerUserPerStreamSetting(BaseSchema):
is_enabled: bool
max_per_user_per_stream: int
class GlobalCooldownSetting(BaseSchema):
is_enabled: bool
global_cooldown_seconds: int
class CustomReward(BaseSchema):
broadcaster_id: int
broadcaster_login: str
broadcaster_name: str
id: str
title: str
prompt: str
cost: int
is_paused: bool
is_in_stock: bool
background_color: str
is_enabled: bool
is_user_input_required: bool
should_redemptions_skip_request_queue: bool
redemptions_redeemed_current_stream: int | None
cooldown_expires_at: datetime | None
image: CustomRewardImage | None
default_image: CustomRewardImage
max_per_stream_setting: MaxPerStreamSetting
max_per_user_per_stream_setting: MaxPerUserPerStreamSetting
global_cooldown_setting: GlobalCooldownSetting
class CustomRewards(BaseSchema):
data: list[CustomReward]
class CustomRewardRedemptionReward(BaseSchema):
id: str
title: str
prompt: str
cost: int
class CustomRewardRedemption(BaseSchema):
id: int
broadcaster_id: int
broadcaster_login: str
broadcaster_name: str
user_id: int
user_login: str
user_name: str
user_input: str
status: Literal['CANCELED', 'FULFILLED', 'UNFULFILLED']
redeemed_at: datetime
reward: CustomRewardRedemptionReward
class CustomRewardRedemptions(BaseSchema):
data: list[CustomRewardRedemption]
class CharityCampaignCurrentAmount(BaseSchema):
amount: int
decimal_places: int
currency: str
class CharityCampaignTargetAmount(BaseSchema):
value: int
decimal_places: int
currency: str
class CharityCampaignData(BaseSchema):
id: str
broadcaster_id: int
broadcaster_login: str
broadcaster_name: str
charity_name: str
charity_description: str
charity_logo: str
charity_website: str
current_amount: CharityCampaignCurrentAmount
target_amount: CharityCampaignTargetAmount
class CharityCampaign(BaseSchema):
data: list[CharityCampaignData]
class CharityDonationAmount(BaseSchema):
value: int
decimal_places: int
currency: str
class CharityDonation(BaseSchema):
id: str
campaign_id: str
user_id: int
user_login: str
user_name: str
amount: CharityDonationAmount
class CharityDonations(BaseSchema):
data: list[CharityDonation]
pagination: Pagination | dict[Any, Any] | None = None
class ChattersData(BaseSchema):
user_id: int
user_login: str
user_name: str
class Chatters(BaseSchema):
data: list[ChattersData]
pagination: Pagination | dict[Any, Any] | None = None
total: int
class ChannelEmoteImages(BaseSchema):
url_1x: str
url_2x: str
url_4x: str
class ChannelEmote(BaseSchema):
id: int
name: str
images: ChannelEmoteImages
tier: int
emote_type: Literal[
'none',
'bitstier',
'follower',
'subscriptions',
'channelpoints',
'rewards',
'hypetrain',
'prime',
'turbo',
'smilies',
'globals',
'owl2019',
'twofactor',
'limitedtime',
]
format: list[Literal['animated', 'static']]
scale: list[Literal['1.0', '2.0', '3.0']]
theme_mode: list[Literal['dark', 'light']]
class ChannelEmotes(BaseSchema):
data: list[ChannelEmote]
template: str
class GlobalEmotes(ChannelEmotes):
pass
class EmoteSets(ChannelEmotes):
pass
class ChannelChatBadgesVersion(BaseSchema):
id: str
image_url_1x: str
image_url_2x: str
image_url_4x: str
title: str
description: str
click_action: str | None
click_url: str | None
class ChannelChatBadgesData(BaseSchema):
set_id: str
versions: list[ChannelChatBadgesVersion]
class ChannelChatBadges(BaseSchema):
data: list[ChannelChatBadgesData]
class GlobalChatBadges(ChannelChatBadges):
pass
class ChatSettingsData(BaseSchema):
broadcaster_id: int
emote_mode: bool
follower_mode: bool
follower_mode_duration: int | None
moderator_id: int | None = None
non_moderator_chat_delay: bool | None = None
non_moderator_chat_delay_duration: int | None = None
slow_mode: bool
slow_mode_wait_time: int | None
subscriber_mode: bool
unique_chat_mode: bool
class ChatSettings(BaseSchema):
data: list[ChatSettingsData]
class SharedChatSessionParticipant(BaseSchema):
broadcaster_id: int
class SharedChatSessionData(BaseSchema):
session_id: str
host_broadcaster_id: int
participants: list[SharedChatSessionParticipant]
created_at: datetime
updated_at: datetime
class SharedChatSession(BaseSchema):
data: list[SharedChatSessionData]
class UserEmotes(ChannelEmotes):
pagination: Pagination | dict[Any, Any] | None = None
class MessageDropReason(BaseSchema):
code: str
message: str
class MessageData(BaseSchema):
message_id: str
is_sent: bool
drop_reason: MessageDropReason | None = None
class Message(BaseSchema):
data: list[MessageData]
class UserChatColorData(BaseSchema):
user_id: int
user_login: str
user_name: str
color: str
class UserChatColor(BaseSchema):
data: list[UserChatColorData]
class Clip(BaseSchema):
id: str
url: str
embed_url: str
broadcaster_id: int
broadcaster_name: str
creator_id: int
creator_name: str
video_id: str
game_id: int
language: str
title: str
view_count: int
created_at: datetime
thumbnail_url: str
duration: float
vod_offset: int | None
is_featured: bool
class Clips(BaseSchema):
data: list[Clip]
pagination: Pagination | dict[Any, Any] | None = None
class ClipDownload(BaseSchema):
clip_id: str
landscape_download_url: str | None
portrait_download_url: str | None
class ClipsDownloads(BaseSchema):
data: list[ClipDownload]
class Conduit(BaseSchema):
id: str
shard_count: int
class Conduits(BaseSchema):
data: list[Conduit]
class ConduitShardTransportWebhook(BaseSchema):
method: Literal['webhook']
callback: str
class ConduitShardTransportWebsocket(BaseSchema):
method: Literal['websocket']
session_id: str
connected_at: datetime
disconnected_at: datetime
class ConduitShard(BaseSchema):
id: str
status: Literal[
'enabled',
'webhook_callback_verification_pending',
'webhook_callback_verification_failed',
'notification_failures_exceeded',
'websocket_disconnected',
'websocket_failed_ping_pong',
'websocket_received_inbound_traffic',
'websocket_internal_error',
'websocket_network_timeout',
'websocket_network_error',
'websocket_failed_to_reconnect',
]
transport: ConduitShardTransportWebhook | ConduitShardTransportWebsocket
class ConduitShards(BaseSchema):
data: list[ConduitShard]
pagination: Pagination | dict[Any, Any] | None = None
class UpdateConduitShardTransportWebhook(TypedDict):
method: Literal['webhook']
callback: str | None
session_id: str | None
class UpdateConduitShardTransportWebsocket(TypedDict):
method: Literal['websocket']
session_id: str | None
class UpdateConduitShard(TypedDict):
id: str
transport: (
UpdateConduitShardTransportWebhook
| UpdateConduitShardTransportWebsocket
)
class UpdateConduitShardsError(BaseSchema):
id: str
message: str
code: str
class UpdateConduitShards(ConduitShards):
errors: list[UpdateConduitShardsError]
class ContentClassificationLabelModel(BaseSchema):
id: Literal[
'DebatedSocialIssuesAndPolitics',
'DrugsIntoxication',
'SexualThemes',
'ViolentGraphic',
'Gambling',
'ProfanityVulgarity',
'MatureGame',
]
description: str
name: str
class ContentClassificationLabels(BaseSchema):
data: list[ContentClassificationLabelModel]
class DropEntitlement(BaseSchema):
id: str
benefit_id: str
timestamp: datetime
user_id: int
game_id: int
fulfillment_status: Literal['CLAIMED', 'FULFILLED']
last_updated: datetime
class DropsEntitlements(BaseSchema):
data: list[DropEntitlement]
pagination: Pagination | dict[Any, Any] | None = None
class UpdateDropsEntitlementsData(BaseSchema):
status: Literal[
'INVALID_ID', 'NOT_FOUND', 'SUCCESS', 'UNAUTHORIZED', 'UPDATE_FAILED'
]
ids: list[str]
class UpdateDropsEntitlements(BaseSchema):
data: list[UpdateDropsEntitlementsData]
class ExtensionConfigurationSegmentData(BaseSchema):
segment: Literal['broadcaster', 'developer', 'global']
broadcaster_id: int
content: str
version: str
class ExtensionConfigurationSegment(BaseSchema):
data: list[ExtensionConfigurationSegmentData]
class ExtensionLiveChannel(BaseSchema):
broadcaster_id: int
broadcaster_name: str
game_name: str
game_id: int
title: str
class ExtensionLiveChannels(BaseSchema):
data: list[ExtensionLiveChannel]
paginaiton: Pagination | dict[Any, Any] | None = None
class ExtensionSecret(BaseSchema):
content: str
active_at: datetime
expires_at: datetime
class ExtensionSecretData(BaseSchema):
format_version: int
secrets: list[ExtensionSecret]
class ExtensionSecrets(BaseSchema):
data: list[ExtensionSecretData]
class ExtensionViewsMobile(BaseSchema):
viewer_url: str
class ExtensionViewsPanel(BaseSchema):
viewer_url: str
height: int
can_link_external_content: bool
class ExtensionViewsVideoOverlay(BaseSchema):
viewer_url: str
can_link_external_content: bool
class ExtensionViewsComponent(BaseSchema):
viewer_url: str
aspect_width: int
aspect_height: int
aspect_ratio_x: int
aspect_ratio_y: int
autoscale: bool
scale_pixels: int
target_height: int
size: int
zoom: bool
zoom_pixels: int
can_link_external_content: bool
class ExtensionViews(BaseSchema):
mobile: ExtensionViewsMobile
panel: ExtensionViewsPanel
video_overlay: ExtensionViewsVideoOverlay
component: ExtensionViewsComponent
class Extension(BaseSchema):
author_name: str
bits_enabled: bool
can_install: bool
configuration_location: Literal['hosted', 'custom', 'none']
description: str
eula_tos_url: str
has_chat_support: bool
icon_url: str
icon_urls: dict[str, str]
id: str
name: str
privacy_policy_url: str
request_identity_link: bool
screenshot_urls: list[str]
state: Literal[
'Approved',
'AssetsUploaded',
'Deleted',
'Deprecated',
'InReview',
'InTest',
'PendingAction',
'Rejected',
'Released',
]
subscriptions_support_level: Literal['none', 'optional']
summary: str
support_email: str
version: str
viewer_summary: str
views: ExtensionViews
allowlisted_config_urls: list[str]
allowlisted_panel_urls: list[str]
class Extensions(BaseSchema):
data: list[Extension]
class ExtensionBitsProductCost(BaseSchema):
amount: int
type: Literal['bits']
class ExtensionBitsProduct(BaseSchema):
sku: str
cost: ExtensionBitsProductCost
in_development: bool
display_name: str
expiration: datetime
is_broadcast: bool
class ExtensionBitsProducts(BaseSchema):
data: list[ExtensionBitsProduct]
class EventsubBaseSubscriptions(BaseSchema):
data: list[sub.Any]
total: int
total_cost: int
max_total_cost: int
pagination: Pagination | dict[Any, Any] | None = None
class EventsubWebsocketDisconnectSubscriptions(EventsubBaseSubscriptions):
disconnected_at: datetime
class EventsubWebsocketConnectSubscriptions(EventsubBaseSubscriptions):
connected_at: datetime
class EventsubSubscription(BaseSchema):
data: (
EventsubWebsocketDisconnectSubscriptions
| EventsubWebsocketConnectSubscriptions
| EventsubBaseSubscriptions
)
class EventsubSubscriptions(BaseSchema):
data: list[
EventsubSubscription
| EventsubWebsocketConnectSubscriptions
| EventsubBaseSubscriptions
]
class Game(BaseSchema):
id: int
name: str
box_art_url: str
igdb_id: int | str
class Games(BaseSchema):
data: list[Game]
paginaiton: Pagination | dict[Any, Any] | None = None
class CreatorGoal(BaseSchema):
id: str
broadcaster_id: int
broadcaster_login: str
broadcaster_name: str
type: Literal[
'follower',
'subscription',
'subscription_count',
'new_subscription',
'new_subscription_count',
]
description: str
current_amount: int
target_amount: int
created_at: datetime
class CreatorGoals(BaseSchema):
data: list[CreatorGoal]
class TopContribution(BaseSchema):
user_id: int
user_login: str
user_name: str
type: Literal['bits', 'other', 'subscription']
total: int
class SharedTrainParticipant(BaseSchema):
broadcaster_user_id: int
broadcaster_user_login: str
broadcaster_user_name: str
class HypeTrainCurrent(BaseSchema):
id: str
broadcaster_user_id: int
broadcaster_user_login: str
broadcaster_user_name: str
level: int
total: int
progress: int
goal: int
top_contributions: list[TopContribution]
shared_train_participants: list[SharedTrainParticipant]
started_at: datetime
expires_at: datetime
type: Literal['trasure', 'golden_kappa', 'regular']
class HypeTrainAllTimeHigh(BaseModel):
level: int
total: int
achieved_at: datetime
class HypeTrainSharedAllTimeHigh(BaseModel):
level: int
total: int
achieved_at: datetime
class HypeTrain(BaseSchema):
current: HypeTrainCurrent
all_time_high: HypeTrainAllTimeHigh
shared_all_time_high: HypeTrainSharedAllTimeHigh
class HypeTrainStatus(BaseSchema):
data: list[HypeTrain]
class AutomodStatusData(BaseSchema):
msg_id: int
is_permitted: bool
class AutomodStatus(BaseSchema):
data: list[AutomodStatusData]
class AutomodSettingsData(BaseSchema):
broadcaster_id: int
moderator_id: int
overall_level: int | None
disability: int
aggression: int
sexuality_sex_or_gender: int
misogyny: int
bullying: int
swearing: int
race_ethnicity_or_religion: int
sex_based_terms: int
class AutomodSettings(BaseSchema):
data: list[AutomodSettingsData]
class BannedUser(BaseSchema):
user_id: int
user_login: str
user_name: str
expires_at: datetime | str
created_at: datetime
reason: str
moderator_id: int
moderator_login: str
moderator_name: str
class BannedUsers(BaseSchema):
data: list[BannedUser]
pagination: Pagination | dict[Any, Any] | None = None
class BanUserData(BaseSchema):
broadcaster_id: int
moderator_id: int
user_id: int
created_at: datetime
end_time: datetime | None
class BanUser(BaseSchema):
data: list[BanUserData]
class UnbanRequest(BaseSchema):
id: str
broadcaster_id: int
broadcaster_login: str
broadcaster_name: str
moderator_id: int
moderator_login: str
moderator_name: str
user_id: int
user_login: str
user_name: str
text: str
status: Literal[
'approved', 'denied', 'pending', 'acknowledged', 'canceled'
]
created_at: datetime
resolved_at: datetime | None
resolution_text: str | None
class UnbanRequests(BaseSchema):
data: list[UnbanRequest]
pagination: Pagination | dict[Any, Any] | None = None
class BlockedTerm(BaseSchema):
broadcaster_id: int
moderator_id: int
id: str
text: str
created_at: datetime
updated_at: datetime
expires_at: datetime | None
class BlockedTerms(BaseSchema):
data: list[BlockedTerm]
pagination: Pagination | dict[Any, Any] | None = None
class ModeratedChannel(BaseSchema):
broadcaster_id: int
broadcaster_login: str
broadcaster_name: str
class ModeratedChannels(BaseSchema):
data: list[ModeratedChannel]
pagination: Pagination | dict[Any, Any] | None = None
class Moderator(BaseSchema):
user_id: int
user_login: str
user_name: str
class Moderators(BaseSchema):
data: list[Moderator]
pagination: Pagination | dict[Any, Any] | None = None
class VIP(BaseSchema):
user_id: int
user_login: str
user_name: str
class VIPs(BaseSchema):
data: list[VIP]
pagination: Pagination | dict[Any, Any] | None = None
class ShieldModeStatusData(BaseSchema):
moderator_id: int
moderator_login: str
moderator_name: str
is_active: bool
last_activated_at: datetime
class ShieldModeStatus(BaseSchema):
data: list[ShieldModeStatusData]
class UserWarn(BaseSchema):
broadcaster_id: int
user_id: int
moderator_id: int
reason: str
class UserWarns(BaseSchema):
data: list[UserWarn]
class PollChoice(BaseSchema):
id: str
title: str
votes: int
channel_points_votes: int
class Poll(BaseSchema):
id: str
broadcaster_id: int
broadcaster_name: str
broadcaster_login: str
title: str
choices: list[PollChoice]
channel_points_voting_enabled: bool
channel_points_per_vote: int
status: Literal[
'ACTIVE', 'COMPLETED', 'TERMINATED', 'ARCHIVED', 'MODERATED', 'INVALID'
]
duration: int
started_at: datetime
ended_at: datetime | None
class Polls(BaseSchema):
data: list[Poll]
pagination: Pagination | dict[Any, Any] | None = None
class PredictionTopPredictor(BaseSchema):
user_id: int
user_login: str
user_name: str
channel_points_used: int
channel_points_won: int
class PredictionOutcome(BaseSchema):
id: str
title: str
users: int
channel_points: int
top_predictors: list[PredictionTopPredictor]
color: Literal['BLUE', 'PINK']
class Prediction(BaseSchema):
id: str
broadcaster_id: int
broadcaster_name: str
broadcaster_login: str
title: str
winning_outcome_id: str | None
outcomes: list[PredictionOutcome]
prediction_window: int
status: Literal['ACTIVE', 'CANCELED', 'LOCKED', 'RESOLVED']
created_at: datetime
ended_at: datetime | None
locked_at: datetime | None
class Predictions(BaseSchema):
data: list[Prediction]
pagination: Pagination | dict[Any, Any] | None = None
class Raid(BaseSchema):
created_at: datetime
is_mature: bool
class Raids(BaseSchema):
data: list[Raid]
class ScheduleVacation(BaseSchema):
start_time: datetime
end_time: datetime
class ScheduleSegmentCategory(BaseSchema):
id: str
name: str
class ScheduleSegment(BaseSchema):
id: str
start_time: datetime
end_time: datetime
title: str
canceled_until: datetime | None
category: ScheduleSegmentCategory
is_recurring: bool
class Schedule(BaseSchema):
broadcaster_id: int
broadcaster_login: str
broadcaster_name: str
vacation: ScheduleVacation | None
segments: list[ScheduleSegment]
class Schedules(BaseSchema):
data: list[Schedule]
pagination: Pagination | dict[Any, Any] | None = None
class Category(BaseSchema):
id: int | str
name: str
box_art_url: str
class Categories(BaseSchema):
data: list[Category]
pagination: Pagination | dict[Any, Any] | None = None
class Channel(BaseSchema):
broadcaster_language: str
broadcaster_login: str
display_name: str
game_id: int | str
game_name: str
id: int
is_live: bool
tags: list[str]
thumbnail_url: str
title: str
started_at: datetime | None
class Channels(BaseSchema):
data: list[Channel]
pagination: Pagination | dict[Any, Any] | None = None
class StreamKey(BaseSchema):
stream_key: str
class StreamKeys(BaseSchema):
data: list[StreamKey]
class Stream(BaseSchema):
id: int
user_id: int
user_name: str
user_login: str
game_id: int | str
game_name: str
type: Literal['live']
title: str
tags: list[str]
tag_ids: list[str] = Field(..., deprecated=True)
viewer_count: int
started_at: datetime
language: str
thumbnail_url: str
is_mature: bool
class Streams(BaseSchema):
data: list[Stream]
pagination: Pagination | dict[Any, Any] | None = None
class BaseStreamMarker(BaseSchema):
id: str
created_at: datetime
description: str
position_seconds: int
class StreamMarker(BaseStreamMarker):
URL: str
class CreateStreamMarkers(BaseSchema):
data: list[BaseStreamMarker]
class StreamMarkerVideo(BaseSchema):
video_id: int
markers: list[StreamMarker]
class StreamMarkersData(BaseSchema):
user_id: int
user_login: str
user_name: str
videos: list[StreamMarkerVideo]
class StreamMarkers(BaseSchema):
data: list[StreamMarkersData]
pagination: Pagination | dict[Any, Any] | None = None
class Subscription(BaseSchema):
broadcaster_id: int
broadcaster_login: str
broadcaster_name: str
gifter_id: int | None = None
gifter_login: str | None = None
gifter_name: str | None = None
is_gift: bool
tier: Literal['1000', '2000', '3000']
class BroadcasterSubscription(Subscription):
plan_name: str
user_id: int
user_login: str
user_name: str
class BroadcasterSubscriptions(BaseSchema):
data: list[BroadcasterSubscription]
pagination: Pagination | dict[Any, Any] | None = None
total: int
points: int
class UserSubscription(BaseSchema):
data: list[Subscription]
class ChannelTeam(BaseSchema):
id: int
broadcaster_id: int
broadcaster_login: str
broadcaster_name: str
background_image_url: str | None
banner: str | None
created_at: datetime
updated_at: datetime
info: str
thumbnail_url: str
team_name: str
team_display_name: str
class ChannelTeams(BaseSchema):
data: list[ChannelTeam]
class TeamUser(BaseSchema):
user_id: int
user_login: str
user_name: str
class Team(BaseSchema):
id: int
users: list[TeamUser]
background_image_url: str | None
banner: str | None
created_at: datetime
updated_at: datetime
info: str
thumbnail_url: str
team_name: str
team_display_name: str
class Teams(BaseSchema):
data: list[Team]
class User(BaseSchema):
id: int
login: str
display_name: str
type: Literal['admin', 'global_mod', 'staff', '']
broadcaster_type: Literal['partner', 'affiliate', '']
description: str | None
profile_image_url: str
offline_image_url: str
email: str | None = None
created_at: datetime
view_count: int = Field(..., deprecated=True)
class Users(BaseSchema):
data: list[User]
class AuthorizationByUser(BaseSchema):
user_id: int
user_login: str
user_name: str
scopes: list[scopes.Any]
class AuthorizationsByUser(BaseSchema):
data: list[AuthorizationByUser]
class UserBlock(BaseSchema):
user_id: int
user_login: str
display_name: str
class UserBlockList(BaseSchema):
data: list[UserBlock]
class UserExtension(BaseSchema):
id: str
version: str
name: str
can_activate: bool
type: list[Literal['component', 'mobile', 'overlay', 'panel']]
class UserExtensions(BaseSchema):
data: list[UserExtension]
class UserActiveExtensionPanelActive(BaseSchema):
active: Literal[True]
id: str
version: str
name: str
class UserActiveExtensionPanelInactive(BaseSchema):
active: Literal[False]
class UserActiveExtensionOverlayActive(UserActiveExtensionPanelActive):
pass
class UserActiveExtensionOverlayInactive(UserActiveExtensionPanelInactive):
pass
class UserActiveExtensionComponentActive(UserActiveExtensionPanelActive):
x: int
y: int
class UserActiveExtensionComponentInactive(UserActiveExtensionPanelInactive):
pass
class UserActiveExtension(BaseSchema):
panel: dict[
int, UserActiveExtensionPanelActive | UserActiveExtensionPanelInactive
]
overlay: dict[
int,
UserActiveExtensionOverlayActive | UserActiveExtensionOverlayInactive,
]
component: dict[
int,
UserActiveExtensionComponentActive
| UserActiveExtensionComponentInactive,
]
class UserActiveExtensions(BaseSchema):
data: list[UserActiveExtension]
class VideoMutedSegment(BaseSchema):
duration: int
offset: int
class Video(BaseSchema):
id: int
stream_id: str | None
user_id: int
user_login: str
user_name: str
title: str
description: str
created_at: datetime
published_at: datetime
url: str
thumbnail_url: str
viewable: Literal['public']
view_count: int
language: str
type: Literal['archive', 'highlight', 'upload']
duration: str
muted_segments: list[VideoMutedSegment]
class Videos(BaseSchema):
data: list[Video]
pagination: Pagination | dict[Any, Any] | None
class DeleteVideos(BaseSchema):
data: list[int]