diff --git a/ext/src/shim/cast/classes/ApiConfig.ts b/ext/src/shim/cast/classes/ApiConfig.ts index 8d075b3..e6abf5c 100755 --- a/ext/src/shim/cast/classes/ApiConfig.ts +++ b/ext/src/shim/cast/classes/ApiConfig.ts @@ -8,10 +8,6 @@ import { AutoJoinPolicy export default class ApiConfig { - public additionalSessionRequests: any[] = []; - public customDialLaunchCallback: any = null; - public invisibleSender = false; - constructor ( public sessionRequest: SessionRequest , public sessionListener: (session: Session) => void diff --git a/ext/src/shim/cast/classes/CredentialsData.ts b/ext/src/shim/cast/classes/CredentialsData.ts new file mode 100644 index 0000000..d58f7c6 --- /dev/null +++ b/ext/src/shim/cast/classes/CredentialsData.ts @@ -0,0 +1,9 @@ +"use strict"; + +// https://developers.google.com/cast/docs/reference/chrome/chrome.cast.CredentialsData +export default class DialRequest { + constructor ( + public credentials: string + , public credentialsData: string) { + } +} diff --git a/ext/src/shim/cast/classes/Receiver.ts b/ext/src/shim/cast/classes/Receiver.ts index 13245f5..0aa3996 100755 --- a/ext/src/shim/cast/classes/Receiver.ts +++ b/ext/src/shim/cast/classes/Receiver.ts @@ -3,7 +3,7 @@ import ReceiverDisplayStatus from "./ReceiverDisplayStatus"; import Volume from "./Volume"; -import { ReceiverType } from "../enums"; +import { Capability, ReceiverType } from "../enums"; // https://developers.google.com/cast/docs/reference/chrome/chrome.cast.Receiver @@ -15,7 +15,7 @@ export default class Receiver { constructor ( public label: string , public friendlyName: string - , public capabilities: string[] = [] + , public capabilities: Capability[] = [] , public volume: (Volume | null) = null) { } } diff --git a/ext/src/shim/cast/classes/SessionRequest.ts b/ext/src/shim/cast/classes/SessionRequest.ts index 7308ed4..56c4b06 100755 --- a/ext/src/shim/cast/classes/SessionRequest.ts +++ b/ext/src/shim/cast/classes/SessionRequest.ts @@ -1,19 +1,20 @@ "use strict"; -import { Capability } from "../enums"; +import CredentialsData from "./CredentialsData"; import Timeout from "./Timeout"; +import { Capability } from "../enums"; + // https://developers.google.com/cast/docs/reference/chrome/chrome.cast.SessionRequest export default class SessionRequest { public language: (string | null) = null; - public dialRequest: any = null; constructor ( public appId: string - , public capabilities = [ - Capability.VIDEO_OUT - , Capability.AUDIO_OUT ] - , public requestSessionTimeout: number - = (new Timeout()).requestSession) {} + , public capabilities = [ Capability.VIDEO_OUT + , Capability.AUDIO_OUT ] + , public timeout: number = (new Timeout()).requestSession + , public androidReceiverCompatible = false + , public credentialsData: (CredentialsData | null) = null) {} } diff --git a/ext/src/shim/cast/index.ts b/ext/src/shim/cast/index.ts index 3de3c0e..e4b4235 100755 --- a/ext/src/shim/cast/index.ts +++ b/ext/src/shim/cast/index.ts @@ -3,6 +3,7 @@ import logger from "../../lib/logger"; import ApiConfig from "./classes/ApiConfig"; +import CredentialsData from "./classes/CredentialsData"; import DialRequest from "./classes/DialRequest"; import Error_ from "./classes/Error"; import Image_ from "./classes/Image"; @@ -56,14 +57,13 @@ let sessionErrorCallback: ErrorCallback; export { // Enums - AutoJoinPolicy, Capability, DefaultActionPolicy, DialAppState - , ErrorCode, ReceiverAction, ReceiverAvailability, ReceiverType - , SenderPlatform, SessionStatus, VolumeControlType + AutoJoinPolicy, Capability, DefaultActionPolicy, DialAppState, ErrorCode + , ReceiverAction, ReceiverAvailability, ReceiverType, SenderPlatform + , SessionStatus, VolumeControlType // Classes - , ApiConfig, DialRequest, ReceiverDisplayStatus - , SenderApplication, Session, SessionRequest, Timeout - , Volume + , ApiConfig, CredentialsData, DialRequest, ReceiverDisplayStatus + , SenderApplication, Session, SessionRequest, Timeout, Volume , Error_ as Error , Image_ as Image diff --git a/ext/src/shim/cast/media/classes/AudiobookChapterMediaMetadata.ts b/ext/src/shim/cast/media/classes/AudiobookChapterMediaMetadata.ts new file mode 100644 index 0000000..7e2027b --- /dev/null +++ b/ext/src/shim/cast/media/classes/AudiobookChapterMediaMetadata.ts @@ -0,0 +1,16 @@ +"use strict"; + +import Image from "../../classes/Image"; + +import { MetadataType } from "../enums"; + + +export default class AudiobookChapterMediaMetadata { + public bookTitle?: string; + public chapterNumber?: number; + public chapterTitle?: string; + public images?: Image[]; + public subtitle?: string; + public title?: string; + public type = MetadataType.AUDIOBOOK_CHAPTER; +} diff --git a/ext/src/shim/cast/media/classes/AudiobookContainerMetadata.ts b/ext/src/shim/cast/media/classes/AudiobookContainerMetadata.ts new file mode 100644 index 0000000..2543e09 --- /dev/null +++ b/ext/src/shim/cast/media/classes/AudiobookContainerMetadata.ts @@ -0,0 +1,8 @@ +"use strict"; + +export default class AudiobookContainerMetadata { + public authors?: string[]; + public narrators?: string[]; + public publisher?: string; + public releaseDate?: string; +} diff --git a/ext/src/shim/cast/media/classes/Break.ts b/ext/src/shim/cast/media/classes/Break.ts new file mode 100644 index 0000000..92d688c --- /dev/null +++ b/ext/src/shim/cast/media/classes/Break.ts @@ -0,0 +1,11 @@ +"use strict"; + +export default class Break { + public duration?: number; + public isEmbedded?: boolean; + public isWatched = false; + + constructor(public id: string + , public breakClipIds: string[] + , public position: number) {} +} diff --git a/ext/src/shim/cast/media/classes/BreakClip.ts b/ext/src/shim/cast/media/classes/BreakClip.ts new file mode 100644 index 0000000..991bb1c --- /dev/null +++ b/ext/src/shim/cast/media/classes/BreakClip.ts @@ -0,0 +1,22 @@ +"use strict"; + +import VastAdsRequest from "./VastAdsRequest"; + +import { HlsSegmentFormat } from "../enums"; + + +export default class BreakClip { + public clickThroughUrl?: string; + public contentId?: string; + public contentType?: string; + public contentUrl?: string; + public customData?: {}; + public duration?: number; + public hlsSegmentFormat?: HlsSegmentFormat; + public posterUrl?: string; + public title?: string; + public vastAdsRequest?: VastAdsRequest; + public whenSkippable?: number; + + constructor(public id: string) {} +} diff --git a/ext/src/shim/cast/media/classes/BreakStatus.ts b/ext/src/shim/cast/media/classes/BreakStatus.ts new file mode 100644 index 0000000..18021b5 --- /dev/null +++ b/ext/src/shim/cast/media/classes/BreakStatus.ts @@ -0,0 +1,9 @@ +"use strict"; + +export default class BreakStatus { + public breakClipId?: string; + public breakId?: string; + public currentBreakClipTime?: number; + public currentBreakTime?: number; + public whenSkippable?: number; +} diff --git a/ext/src/shim/cast/media/classes/ContainerMetadata.ts b/ext/src/shim/cast/media/classes/ContainerMetadata.ts new file mode 100644 index 0000000..7866b6c --- /dev/null +++ b/ext/src/shim/cast/media/classes/ContainerMetadata.ts @@ -0,0 +1,17 @@ +"use strict"; + +import Image from "../../classes/Image"; +import MediaMetadata from "../classes/MediaMetadata"; + +import { ContainerType } from "../enums"; + + +export default class ContainerMetadata { + public containerDuration?: number; + public containerImages?: Image[]; + public sections?: MediaMetadata[]; + public title?: string; + + constructor (public containerType: ContainerType + = ContainerType.GENERIC_CONTAINER) {} +} diff --git a/ext/src/shim/cast/media/classes/LiveSeekableRange.ts b/ext/src/shim/cast/media/classes/LiveSeekableRange.ts new file mode 100644 index 0000000..6c1b5bb --- /dev/null +++ b/ext/src/shim/cast/media/classes/LiveSeekableRange.ts @@ -0,0 +1,8 @@ +"use strict"; + +export default class LiveSeekableRange { + constructor (public start?: number + , public end?: number + , public isMovingWindow?: boolean + , public isLiveDone?: boolean) {} +} diff --git a/ext/src/shim/cast/media/classes/LoadRequest.ts b/ext/src/shim/cast/media/classes/LoadRequest.ts index f636978..ce0fef9 100644 --- a/ext/src/shim/cast/media/classes/LoadRequest.ts +++ b/ext/src/shim/cast/media/classes/LoadRequest.ts @@ -5,6 +5,8 @@ import MediaInfo from "./MediaInfo"; export default class LoadRequest { public activeTrackIds: (number[] | null) = null; + public atvCredentials?: string; + public atvCredentialsType?: string; public autoplay: (boolean | null) = true; public currentTime: (number | null) = null; public customData: any = null; diff --git a/ext/src/shim/cast/media/classes/Media.ts b/ext/src/shim/cast/media/classes/Media.ts index dfa55f0..6dd580e 100644 --- a/ext/src/shim/cast/media/classes/Media.ts +++ b/ext/src/shim/cast/media/classes/Media.ts @@ -4,17 +4,21 @@ import logger from "../../../../lib/logger"; import uuid from "uuid/v1"; +import BreakStatus from "./BreakStatus"; import EditTracksInfoRequest from "./EditTracksInfoRequest"; import GetStatusRequest from "./GetStatusRequest"; +import LiveSeekableRange from "./LiveSeekableRange"; import MediaInfo from "./MediaInfo"; import PauseRequest from "./PauseRequest"; import PlayRequest from "./PlayRequest"; +import QueueData from "./QueueData"; import QueueInsertItemsRequest from "./QueueInsertItemsRequest"; import QueueItem from "./QueueItem"; import QueueReorderItemsRequest from "./QueueReorderItemsRequest"; import QueueUpdateItemsRequest from "./QueueUpdateItemsRequest"; import SeekRequest from "./SeekRequest"; import StopRequest from "./StopRequest"; +import VideoInformation from "./VideoInformation"; import VolumeRequest from "./VolumeRequest"; import Volume from "../../classes/Volume"; @@ -96,18 +100,22 @@ export default class Media { }); public activeTrackIds: (number[] | null) = null; + public breakStatus?: BreakStatus; public currentItemId: (number | null) = null; public customData: any = null; public currentTime: number = 0; public idleReason: (string | null) = null; public items: (QueueItem[] | null) = null; + public liveSeekableRange?: LiveSeekableRange; public loadingItemId: (number | null) = null; public media: (MediaInfo | null) = null; public playbackRate: number = 1; public playerState: string = PlayerState.IDLE; public preloadedItemId: (number | null) = null; + public queueData?: QueueData; public repeatMode: string = RepeatMode.OFF; public supportedMediaCommands: string[] = []; + public videoInfo?: VideoInformation; public volume: Volume = new Volume(); @@ -139,6 +147,16 @@ export default class Media { logger.info("STUB :: Media#editTracksInfo"); } + public getEstimatedBreakClipTime () { + logger.info("STUB :: Media#getEstimatedBreakClipTime"); + } + public getEstimatedBreakTime () { + logger.info("STUB :: Media#getEstimatedBreakTime"); + } + public getEstimatedLiveSeekableRange () { + logger.info("STUB :: Media#getEstimatedLiveSeekableRange"); + } + public getEstimatedTime (): number { if (this.currentTime === undefined || this.#lastCurrentTime === undefined) { diff --git a/ext/src/shim/cast/media/classes/MediaInfo.ts b/ext/src/shim/cast/media/classes/MediaInfo.ts index 700b612..6819e92 100644 --- a/ext/src/shim/cast/media/classes/MediaInfo.ts +++ b/ext/src/shim/cast/media/classes/MediaInfo.ts @@ -1,15 +1,20 @@ "use strict"; +import Break from "./Break"; +import BreakClip from "./BreakClip"; import GenericMediaMetadata from "./GenericMediaMetadata"; import MovieMediaMetadata from "./MovieMediaMetadata"; import MusicTrackMediaMetadata from "./MusicTrackMediaMetadata"; import PhotoMediaMetadata from "./PhotoMediaMetadata"; import TvShowMediaMetadata from "./TvShowMediaMetadata"; - import TextTrackStyle from "./TextTrackStyle"; import Track from "./Track"; +import UserActionState from "./UserActionState"; +import VastAdsRequest from "./VastAdsRequest"; -import { StreamType } from "../enums"; +import { HlsSegmentFormat + , HlsVideoSegmentFormat + , StreamType } from "../enums"; type Metadata = @@ -20,12 +25,22 @@ type Metadata = | TvShowMediaMetadata; export default class MediaInfo { + public atvEntity?: string; + public breakClips?: BreakClip[]; + public breaks?: Break[]; public customData: any = null; + public contentUrl?: string; public duration: (number | null) = null; + public entity?: string; + public hlsSegmentFormat?: HlsSegmentFormat; + public hlsVideoSegmentFormat?: HlsVideoSegmentFormat; public metadata: (Metadata | null) = null; + public startAbsoluteTime?: number; public streamType: string = StreamType.BUFFERED; public textTrackStyle: (TextTrackStyle | null) = null; public tracks: (Track[] | null) = null; + public userActionStates?: UserActionState[]; + public vmapAdsRequest?: VastAdsRequest; constructor ( public contentId: string diff --git a/ext/src/shim/cast/media/classes/MediaMetadata.ts b/ext/src/shim/cast/media/classes/MediaMetadata.ts new file mode 100644 index 0000000..6443abc --- /dev/null +++ b/ext/src/shim/cast/media/classes/MediaMetadata.ts @@ -0,0 +1,19 @@ +"use strict"; + +import { MetadataType } from "../enums"; + + +export default class MediaMetadata { + public queueItemId?: number; + public sectionDuration?: number; + public sectionStartAbsoluteTime?: number; + public sectionStartTimeInContainer?: number; + public sectionStartTimeInMedia?: number; + public type: MetadataType; + public metadataType: MetadataType; + + constructor (type: MetadataType) { + this.type = type; + this.metadataType = type; + } +} diff --git a/ext/src/shim/cast/media/classes/QueueData.ts b/ext/src/shim/cast/media/classes/QueueData.ts new file mode 100644 index 0000000..8554bb9 --- /dev/null +++ b/ext/src/shim/cast/media/classes/QueueData.ts @@ -0,0 +1,18 @@ +"use strict"; + +import QueueItem from "./QueueItem"; + +import { RepeatMode } from "../enums"; + + +export default class QueueData { + public shuffle = false; + + constructor(public id?: string + , public name?: string + , public description?: string + , public repeatMode?: RepeatMode + , public items?: QueueItem[] + , public startIndex?: number + , public startTime?: number) {} +} diff --git a/ext/src/shim/cast/media/classes/UserActionState.ts b/ext/src/shim/cast/media/classes/UserActionState.ts new file mode 100644 index 0000000..e25bd56 --- /dev/null +++ b/ext/src/shim/cast/media/classes/UserActionState.ts @@ -0,0 +1,10 @@ +"use strict"; + +import { UserAction } from "../enums"; + + +export default class UserActionState { + public customData: any = null; + + constructor (public userAction: UserAction) {} +} diff --git a/ext/src/shim/cast/media/classes/VastAdsRequest.ts b/ext/src/shim/cast/media/classes/VastAdsRequest.ts new file mode 100644 index 0000000..11df7d7 --- /dev/null +++ b/ext/src/shim/cast/media/classes/VastAdsRequest.ts @@ -0,0 +1,6 @@ +"use strict"; + +export default class VastAdsRequest { + public adsResponse?: string; + public adTagUrl?: string; +} diff --git a/ext/src/shim/cast/media/classes/VideoInformation.ts b/ext/src/shim/cast/media/classes/VideoInformation.ts new file mode 100644 index 0000000..7895ae2 --- /dev/null +++ b/ext/src/shim/cast/media/classes/VideoInformation.ts @@ -0,0 +1,10 @@ +"use strict"; + +import { HdrType } from "../enums"; + + +export default class VideoInformation { + constructor (public width: number + , public height: number + , public hdrType: HdrType) {} +} diff --git a/ext/src/shim/cast/media/enums.ts b/ext/src/shim/cast/media/enums.ts index bc5219d..607c0f4 100755 --- a/ext/src/shim/cast/media/enums.ts +++ b/ext/src/shim/cast/media/enums.ts @@ -1,5 +1,31 @@ "use strict"; +export enum ContainerType { + GENERIC_CONTAINER + , AUDIOBOOK_CONTAINER +} + +export enum HdrType { + SDR = "sdr" + , HDR = "hdr" + , DV = "dv" +} + +export enum HlsSegmentFormat { + AAC = "aac" + , AC3 = "ac3" + , MP3 = "mp3" + , TS = "ts" + , TS_AAC = "ts_aac" + , E_AC3 = "e_ac3" + , FMP4 = "fmp4" +} + +export enum HlsVideoSegmentFormat { + MPEG2_TS = "mpeg2_ts" + , FMP4 = "fmp4" +} + export enum IdleReason { CANCELLED = "CANCELLED" , INTERRUPTED = "INTERRUPTED" @@ -20,6 +46,7 @@ export enum MetadataType { , TV_SHOW , MUSIC_TRACK , PHOTO + , AUDIOBOOK_CHAPTER } export enum PlayerState { @@ -29,6 +56,18 @@ export enum PlayerState { , BUFFERING = "BUFFERING" } +export enum QueueType { + ALBUM = "ALBUM" + , PLAYLIST = "PLAYLIST" + , AUDIOBOOK = "AUDIOBOOK" + , RADIO_STATION = "RADIO_STATION" + , PODCAST_SERIES = "PODCAST_SERIES" + , TV_SERIES = "TV_SERIES" + , VIDEO_PLAYLIST = "VIDEO_PLAYLIST" + , LIVE_TV = "LIVETV" + , MOVIE = "MOVIE" +} + export enum RepeatMode { OFF = "REPEAT_OFF" , ALL = "REPEAT_ALL" @@ -91,3 +130,10 @@ export enum TrackType { , AUDIO = "AUDIO" , VIDEO = "VIDEO" } + +export enum UserAction { + LIKE = "LIKE" + , DISLIKE = "DISLIKE" + , FOLLOW = "FOLLOW" + , UNFOLLOW = "UNFOLLOW" +} diff --git a/ext/src/shim/cast/media/index.ts b/ext/src/shim/cast/media/index.ts index cb2ff62..8a9ac80 100755 --- a/ext/src/shim/cast/media/index.ts +++ b/ext/src/shim/cast/media/index.ts @@ -1,16 +1,25 @@ "use strict"; +import AudiobookChapterMediaMetadata from "./classes/AudiobookChapterMediaMetadata"; +import AudiobookContainerMetadata from "./classes/AudiobookContainerMetadata"; +import Break from "./classes/Break"; +import BreakClip from "./classes/BreakClip"; +import BreakStatus from "./classes/BreakStatus"; +import ContainerMetadata from "./classes/ContainerMetadata"; import EditTracksInfoRequest from "./classes/EditTracksInfoRequest"; import GenericMediaMetadata from "./classes/GenericMediaMetadata"; import GetStatusRequest from "./classes/GetStatusRequest"; +import LiveSeekableRange from "./classes/LiveSeekableRange"; import LoadRequest from "./classes/LoadRequest"; import Media from "./classes/Media"; import MediaInfo from "./classes/MediaInfo"; +import MediaMetadata from "./classes/MediaMetadata"; import MovieMediaMetadata from "./classes/MovieMediaMetadata"; import MusicTrackMediaMetadata from "./classes/MusicTrackMediaMetadata"; import PauseRequest from "./classes/PauseRequest"; import PhotoMediaMetadata from "./classes/PhotoMediaMetadata"; import PlayRequest from "./classes/PlayRequest"; +import QueueData from "./classes/QueueData"; import QueueInsertItemsRequest from "./classes/QueueInsertItemsRequest"; import QueueItem from "./classes/QueueItem"; import QueueLoadRequest from "./classes/QueueLoadRequest"; @@ -23,12 +32,20 @@ import StopRequest from "./classes/StopRequest"; import TextTrackStyle from "./classes/TextTrackStyle"; import Track from "./classes/Track"; import TvShowMediaMetadata from "./classes/TvShowMediaMetadata"; +import UserActionState from "./classes/QueueItem"; +import VastAdsRequest from "./classes/VastAdsRequest"; +import VideoInformation from "./classes/VideoInformation"; import VolumeRequest from "./classes/VolumeRequest"; -import { IdleReason +import { ContainerType + , HdrType + , HlsSegmentFormat + , HlsVideoSegmentFormat + , IdleReason , MediaCommand , MetadataType , PlayerState + , QueueType , RepeatMode , ResumeState , StreamType @@ -37,24 +54,28 @@ import { IdleReason , TextTrackFontStyle , TextTrackType , TextTrackWindowType - , TrackType } from "./enums"; + , TrackType + , UserAction } from "./enums"; export { // Enums - IdleReason, MediaCommand, MetadataType, PlayerState - , RepeatMode, ResumeState, StreamType, TextTrackEdgeType - , TextTrackFontGenericFamily, TextTrackFontStyle, TextTrackType - , TextTrackWindowType, TrackType + ContainerType, HdrType, HlsSegmentFormat, HlsVideoSegmentFormat, IdleReason + , MediaCommand, MetadataType, PlayerState, QueueType, RepeatMode, ResumeState + , StreamType, TextTrackEdgeType, TextTrackFontGenericFamily + , TextTrackFontStyle, TextTrackType, TextTrackWindowType, TrackType + , UserAction // Classes - , EditTracksInfoRequest, GenericMediaMetadata, GetStatusRequest, LoadRequest - , Media, MediaInfo, MovieMediaMetadata, MusicTrackMediaMetadata - , PauseRequest, PhotoMediaMetadata, PlayRequest, QueueInsertItemsRequest + , AudiobookChapterMediaMetadata, AudiobookContainerMetadata, Break, BreakClip + , BreakStatus, ContainerMetadata, EditTracksInfoRequest, GenericMediaMetadata + , GetStatusRequest, LiveSeekableRange, LoadRequest, Media, MediaInfo + , MediaMetadata, MovieMediaMetadata, MusicTrackMediaMetadata, PauseRequest + , PhotoMediaMetadata, PlayRequest, QueueInsertItemsRequest, QueueData , QueueItem, QueueLoadRequest, QueueRemoveItemsRequest , QueueReorderItemsRequest, QueueSetPropertiesRequest, QueueUpdateItemsRequest - , SeekRequest, StopRequest, TextTrackStyle, Track - , TvShowMediaMetadata, VolumeRequest + , SeekRequest, StopRequest, TextTrackStyle, Track, TvShowMediaMetadata + , UserActionState, VastAdsRequest, VideoInformation, VolumeRequest }; export const timeout = {