Add media and channel management routes: introduce new routes for admin channels, media, and shows in the routing structure. Update navigation in the admin layout to include links for these new sections. Enhance type definitions for media assets and shows in the API types. Integrate HLS.js for improved streaming support.

This commit is contained in:
Leonid Pershin
2026-07-24 16:18:54 +03:00
parent 1bbfd15907
commit a2685fb602
24 changed files with 2050 additions and 42 deletions
+117
View File
@@ -36,3 +36,120 @@ export type PagedList<T> = {
page: number
pageSize: number
}
export type CreatedIdResponse = { id: string }
// ── Медиа ────────────────────────────────────────────────────────────────
export type MediaAssetStatus = 'Pending' | 'Processing' | 'Ready' | 'Failed'
export type MediaSource = 'Upload' | 'Inbox'
export type MediaAssetDto = {
id: string
originalFileName: string
source: MediaSource
status: MediaAssetStatus
durationSeconds: number | null
segmentCount: number | null
width: number | null
height: number | null
videoCodec: string | null
audioCodec: string | null
errorMessage: string | null
createdAt: string
}
// ── Библиотека (шоу) ───────────────────────────────────────────────────────
export type ShowKind = 'Series' | 'Single'
export type ShowSummaryDto = {
id: string
name: string
kind: ShowKind
episodeCount: number
createdAt: string
}
export type EpisodeDto = {
id: string
mediaAssetId: string
position: number
assetName: string | null
assetStatus: MediaAssetStatus | null
durationSeconds: number | null
}
export type ShowDto = {
id: string
name: string
kind: ShowKind
description: string | null
episodes: EpisodeDto[]
}
// ── Каналы ────────────────────────────────────────────────────────────────
export type BlockMode = 'Count' | 'Duration'
export type AdInsertion = 'BetweenBlocks' | 'BetweenEpisodes'
export type OverrideMode = 'Exclusive' | 'Boost'
export type ScheduleEntryKind = 'Program' | 'Ad'
export type ChannelSummaryDto = {
id: string
name: string
slug: string
isEnabled: boolean
}
export type ChannelShowDto = {
id: string
showId: string
showName: string
weight: number
blockMode: BlockMode
blockValue: number
isEnabled: boolean
nextEpisodeIndex: number
}
export type ChannelAdDto = {
id: string
mediaAssetId: string
assetName: string | null
position: number
}
export type OverrideShowDto = { showId: string; showName: string; weight: number }
export type ProgrammingOverrideDto = {
id: string
mode: OverrideMode
startsAtUtc: string
endsAtUtc: string
shows: OverrideShowDto[]
}
export type ChannelDto = {
id: string
name: string
slug: string
isEnabled: boolean
adInsertion: AdInsertion
adsPerBreak: number
fillerAssetId: string | null
shows: ChannelShowDto[]
ads: ChannelAdDto[]
overrides: ProgrammingOverrideDto[]
}
export type ScheduleEntryDto = {
id: string
kind: ScheduleEntryKind
mediaAssetId: string
startsAtUtc: string
endsAtUtc: string
showId: string | null
showName: string | null
episodeIndex: number | null
}
// ── Публичный эфир ─────────────────────────────────────────────────────────
export type PublicChannelDto = { id: string; slug: string; name: string }