xtreamcodes

package module
v0.0.0-...-da3e899 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 8, 2024 License: MIT Imports: 13 Imported by: 1

README

go.xtream-codes

A Go library for accessing Xtream-Codes servers

Documentation

Overview

Package xtreamcodes provides a Golang interface to the Xtream-Codes IPTV Server API.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type AuthenticationResponse

type AuthenticationResponse struct {
	ServerInfo ServerInfo `json:"server_info"`
	UserInfo   UserInfo   `json:"user_info"`
}

AuthenticationResponse is a container for what the server returns after the initial authentication.

type Base64Value

type Base64Value []byte

Base64Value is a base64url encoded json object,

func New

func New(b []byte) *Base64Value

New returns a pointer to a Base64Value, cast from the given byte slice. This is a convenience function, handling the address creation that a direct cast would not allow.

func NewFromString

func NewFromString(encoded string) (*Base64Value, error)

NewFromString returns a Base64Value containing the decoded data in encoded.

func (*Base64Value) MarshalJSON

func (bv *Base64Value) MarshalJSON() ([]byte, error)

MarshalJSON returns the ba64url encoding of bv for JSON representation.

func (*Base64Value) String

func (bv *Base64Value) String() string

func (*Base64Value) UnmarshalJSON

func (bv *Base64Value) UnmarshalJSON(b []byte) error

UnmarshalJSON sets bv to the bytes represented in the base64url encoding b.

type Category

type Category struct {
	ID     FlexInt `json:"category_id,string"`
	Name   string  `json:"category_name"`
	Parent FlexInt `json:"parent_id"`

	// Set by us, not Xtream.
	Type string `json:"-"`
}

Category describes a grouping of Stream.

type ConvertibleBoolean

type ConvertibleBoolean struct {
	// contains filtered or unexported fields
}

ConvertibleBoolean is a helper type to allow JSON documents using 0/1 or "true" and "false" be converted to bool.

func (ConvertibleBoolean) MarshalJSON

func (bit ConvertibleBoolean) MarshalJSON() ([]byte, error)

MarshalJSON returns a 0 or 1 depending on bool state.

func (*ConvertibleBoolean) UnmarshalJSON

func (bit *ConvertibleBoolean) UnmarshalJSON(data []byte) error

UnmarshalJSON converts a 0, 1, true or false into a bool

type Disposition

type Disposition struct {
	AttachedPic     int `json:"attached_pic"`
	CleanEffects    int `json:"clean_effects"`
	Comment         int `json:"comment"`
	Default         int `json:"default"`
	Dub             int `json:"dub"`
	Forced          int `json:"forced"`
	HearingImpaired int `json:"hearing_impaired"`
	Karaoke         int `json:"karaoke"`
	Lyrics          int `json:"lyrics"`
	Original        int `json:"original"`
	VisualImpaired  int `json:"visual_impaired"`
}

Disposition of FFMPEGStreamInfo

type EPGInfo

type EPGInfo struct {
	ChannelID      string             `json:"channel_id"`
	Description    Base64Value        `json:"description"`
	End            string             `json:"end"`
	EPGID          FlexInt            `json:"epg_id,string"`
	HasArchive     ConvertibleBoolean `json:"has_archive"`
	ID             FlexInt            `json:"id,string"`
	Lang           string             `json:"lang"`
	NowPlaying     ConvertibleBoolean `json:"now_playing"`
	Start          string             `json:"start"`
	StartTimestamp Timestamp          `json:"start_timestamp"`
	StopTimestamp  Timestamp          `json:"stop_timestamp"`
	Title          Base64Value        `json:"title"`
}

EPGInfo describes electronic programming guide information of a stream.

type FFMPEGStreamInfo

type FFMPEGStreamInfo struct {
	AvgFrameRate       string      `json:"avg_frame_rate"`
	BitRate            string      `json:"bit_rate"`
	BitsPerRawSample   string      `json:"bits_per_raw_sample"`
	BitsPerSample      int         `json:"bits_per_sample"`
	ChannelLayout      string      `json:"channel_layout"`
	Channels           int         `json:"channels"`
	ChromaLocation     string      `json:"chroma_location"`
	CodecLongName      string      `json:"codec_long_name"`
	CodecName          string      `json:"codec_name"`
	CodecTag           string      `json:"codec_tag"`
	CodecTagString     string      `json:"codec_tag_string"`
	CodecTimeBase      string      `json:"codec_time_base"`
	CodecType          StreamType  `json:"codec_type"`
	CodedHeight        int         `json:"coded_height"`
	CodedWidth         int         `json:"coded_width"`
	ColorPrimaries     string      `json:"color_primaries"`
	ColorRange         string      `json:"color_range"`
	ColorSpace         string      `json:"color_space"`
	ColorTransfer      string      `json:"color_transfer"`
	DisplayAspectRatio string      `json:"display_aspect_ratio"`
	DivxPacked         string      `json:"divx_packed"`
	DmixMode           string      `json:"dmix_mode"`
	Duration           string      `json:"duration"`
	DurationTs         int         `json:"duration_ts"`
	HasBFrames         int         `json:"has_b_frames"`
	Height             int         `json:"height"`
	ID                 string      `json:"id"`
	Index              int         `json:"index"`
	IsAvc              string      `json:"is_avc"`
	Level              int         `json:"level"`
	LoroCmixlev        string      `json:"loro_cmixlev"`
	LoroSurmixlev      string      `json:"loro_surmixlev"`
	LtrtCmixlev        string      `json:"ltrt_cmixlev"`
	LtrtSurmixlev      string      `json:"ltrt_surmixlev"`
	MaxBitRate         string      `json:"max_bit_rate"`
	NalLengthSize      string      `json:"nal_length_size"`
	NumFrames          string      `json:"nb_frames"`
	PixFmt             string      `json:"pix_fmt"`
	Profile            string      `json:"profile"`
	QuarterSample      string      `json:"quarter_sample"`
	FrameRate          string      `json:"r_frame_rate"`
	Refs               int         `json:"refs"`
	SampleAspectRatio  string      `json:"sample_aspect_ratio"`
	SampleFmt          string      `json:"sample_fmt"`
	SampleRate         string      `json:"sample_rate"`
	StartPts           int         `json:"start_pts"`
	StartTime          string      `json:"start_time"`
	TimeBase           string      `json:"time_base"`
	Timecode           string      `json:"timecode"`
	Width              int         `json:"width"`
	Tags               Tags        `json:"tags"`
	Disposition        Disposition `json:"disposition"`
	SideDataList       []SideData  `json:"side_data_list"`
}

FFMPEGStreamInfo represents any kind of stream (Audio, Video, etc)

func (FFMPEGStreamInfo) IsRotated

func (s FFMPEGStreamInfo) IsRotated() (bool, error)

IsRotated returns true if the stream is rotated.

func (FFMPEGStreamInfo) Rotation

func (s FFMPEGStreamInfo) Rotation() (int, error)

Rotation gets the rotation value of video stream, either from stream side-data, or tags. Returns 0 if it's not rotated, or if we can't figure it out.

type FlexFloat

type FlexFloat float64

func (*FlexFloat) UnmarshalJSON

func (ff *FlexFloat) UnmarshalJSON(b []byte) error

type FlexInt

type FlexInt int64

FlexInt is a int64 which unmarshals from JSON as either unquoted or quoted (with any amount of internal leading/trailing whitespace). Originally found at https://bit.ly/2NkJ0SK and https://play.golang.org/p/KNPxDL1yqL

func (FlexInt) MarshalJSON

func (f FlexInt) MarshalJSON() ([]byte, error)

func (*FlexInt) UnmarshalJSON

func (f *FlexInt) UnmarshalJSON(data []byte) error

type Format

type Format struct {
	BitRate     string `json:"bit_rate"`
	Duration    string `json:"duration"`
	Filename    string `json:"filename"`
	LongName    string `json:"format_long_name"`
	Name        string `json:"format_name"`
	NumPrograms int    `json:"nb_programs"`
	NumStreams  int    `json:"nb_streams"`
	ProbeScore  int    `json:"probe_score"`
	Size        string `json:"size"`
	StartTime   string `json:"start_time"`
	Tags        Tags   `json:"tags"`
}

Format describes container format info.

type JSONStringSlice

type JSONStringSlice struct {
	Slice        []string `json:"-"`
	SingleString bool     `json:"-"`
}

JSONStringSlice is a struct containing a slice of strings. It is needed for cases in which we may get an array or may get a single string in a JSON response.

func (JSONStringSlice) MarshalJSON

func (b JSONStringSlice) MarshalJSON() ([]byte, error)

MarshalJSON returns b as the JSON encoding of b.

func (*JSONStringSlice) UnmarshalJSON

func (b *JSONStringSlice) UnmarshalJSON(data []byte) error

UnmarshalJSON sets *b to a copy of data.

type ProbeInfo

type ProbeInfo struct {
	Format  Format             `json:"format"`
	Streams []FFMPEGStreamInfo `json:"streams"`
}

ProbeInfo is just a nice structure that represents the JSON data returned by ffprobe. Mostly auto-generated with http://mholt.github.io/json-to-go

func NewInfo

func NewInfo(jsonData string) (*ProbeInfo, error)

NewInfo returns a new ProbeInfo structure from the input JSON

func (ProbeInfo) FilterStreams

func (info ProbeInfo) FilterStreams(t StreamType) []FFMPEGStreamInfo

FilterStreams filters out streams of the given StreamType. Returns a []FFMPEGStreamInfo slice, even if it's empty

type Series

type Series struct {
	Episodes map[string][]SeriesEpisode `json:"episodes"`
	Info     SeriesInfo                 `json:"info"`
	Seasons  []interface{}              `json:"seasons"`
}

type SeriesEpisode

type SeriesEpisode struct {
	Added              string  `json:"added"`
	ContainerExtension string  `json:"container_extension"`
	CustomSid          string  `json:"custom_sid"`
	DirectSource       string  `json:"direct_source"`
	EpisodeNum         FlexInt `json:"episode_num"`
	ID                 string  `json:"id"`
	Info               struct {
		Audio        FFMPEGStreamInfo `json:"audio"`
		Bitrate      FlexInt          `json:"bitrate"`
		Duration     string           `json:"duration"`
		DurationSecs FlexInt          `json:"duration_secs"`
		MovieImage   string           `json:"movie_image"`
		Name         string           `json:"name"`
		Plot         string           `json:"plot"`
		Rating       FlexFloat        `json:"rating"`
		ReleaseDate  string           `json:"releasedate"`
		Video        FFMPEGStreamInfo `json:"video"`
	} `json:"info"`
	Season FlexInt `json:"season"`
	Title  string  `json:"title"`
}

type SeriesInfo

type SeriesInfo struct {
	BackdropPath   *JSONStringSlice `json:"backdrop_path,omitempty"`
	Cast           string           `json:"cast"`
	CategoryID     *FlexInt         `json:"category_id,string"`
	Cover          string           `json:"cover"`
	Director       string           `json:"director"`
	EpisodeRunTime string           `json:"episode_run_time"`
	Genre          string           `json:"genre"`
	LastModified   *Timestamp       `json:"last_modified,omitempty"`
	Name           string           `json:"name"`
	Num            FlexInt          `json:"num"`
	Plot           string           `json:"plot"`
	Rating         FlexInt          `json:"rating,string"`
	Rating5        FlexFloat        `json:"rating_5based"`
	ReleaseDate    string           `json:"releaseDate"`
	SeriesID       FlexInt          `json:"series_id"`
	StreamType     string           `json:"stream_type"`
	YoutubeTrailer string           `json:"youtube_trailer"`
}

SeriesInfo contains information about a TV series.

type ServerInfo

type ServerInfo struct {
	HTTPSPort    FlexInt   `json:"https_port,string"`
	Port         FlexInt   `json:"port,string"`
	Process      bool      `json:"process"`
	RTMPPort     FlexInt   `json:"rtmp_port,string"`
	Protocol     string    `json:"server_protocol"`
	TimeNow      string    `json:"time_now"`
	TimestampNow Timestamp `json:"timestamp_now,string"`
	Timezone     string    `json:"timezone"`
	URL          string    `json:"url"`
}

ServerInfo describes the state of the Xtream-Codes server.

type SideData

type SideData struct {
	Displaymatrix string `json:"displaymatrix"`
	Rotation      int    `json:"rotation"`
	Size          int    `json:"side_data_size"`
	Type          string `json:"side_data_type"`
}

SideData describes metadata. More fields may be added later as needed.

type Stream

type Stream struct {
	Added              *Timestamp `json:"added"`
	CategoryID         FlexInt    `json:"category_id,string"`
	CategoryName       string     `json:"category_name"`
	ContainerExtension string     `json:"container_extension"`
	CustomSid          string     `json:"custom_sid"`
	DirectSource       string     `json:"direct_source,omitempty"`
	EPGChannelID       string     `json:"epg_channel_id"`
	Icon               string     `json:"stream_icon"`
	ID                 FlexInt    `json:"stream_id"`
	Name               string     `json:"name"`
	Number             FlexInt    `json:"num"`
	Rating             FlexFloat  `json:"rating"`
	Rating5based       FlexFloat  `json:"rating_5based"`
	TVArchive          FlexInt    `json:"tv_archive"`
	TVArchiveDuration  *FlexInt   `json:"tv_archive_duration"`
	Type               string     `json:"stream_type"`
}

Stream is a streamble video source.

type StreamType

type StreamType string

StreamType is used for enumerating the CodecType field in FFMPEGStreamInfo.

const (
	// VideoStream is the constant for video streams.
	VideoStream StreamType = "video"
	// AudioStream is the constant for audio streams.
	AudioStream = "audio"
)

type Tags

type Tags map[string]interface{}

Tags represents either Format or FFMPEGStreamInfo tags embedded in the file.

type Timestamp

type Timestamp struct {
	time.Time
	// contains filtered or unexported fields
}

Timestamp is a helper struct to convert unix timestamp ints and strings to time.Time.

func (Timestamp) MarshalJSON

func (t Timestamp) MarshalJSON() ([]byte, error)

MarshalJSON returns the Unix timestamp as a string.

func (*Timestamp) UnmarshalJSON

func (t *Timestamp) UnmarshalJSON(b []byte) error

UnmarshalJSON converts the int or string to a Unix timestamp.

type UserInfo

type UserInfo struct {
	ActiveConnections    FlexInt            `json:"active_cons,string"`
	AllowedOutputFormats []string           `json:"allowed_output_formats"`
	Auth                 ConvertibleBoolean `json:"auth"`
	CreatedAt            Timestamp          `json:"created_at"`
	ExpDate              *Timestamp         `json:"exp_date"`
	IsTrial              ConvertibleBoolean `json:"is_trial,string"`
	MaxConnections       FlexInt            `json:"max_connections,string"`
	Message              string             `json:"message"`
	Password             string             `json:"password"`
	Status               string             `json:"status"`
	Username             string             `json:"username"`
}

UserInfo is the current state of the user as it relates to the Xtream-Codes server.

type VideoOnDemandInfo

type VideoOnDemandInfo struct {
	Info struct {
		Audio          FFMPEGStreamInfo `json:"audio"`
		BackdropPath   []string         `json:"backdrop_path"`
		Bitrate        FlexInt          `json:"bitrate"`
		Cast           string           `json:"cast"`
		Director       string           `json:"director"`
		Duration       string           `json:"duration"`
		DurationSecs   FlexInt          `json:"duration_secs"`
		Genre          string           `json:"genre"`
		MovieImage     string           `json:"movie_image"`
		Plot           string           `json:"plot"`
		Rating         FlexFloat        `json:"rating"`
		ReleaseDate    string           `json:"releasedate"`
		TmdbID         FlexInt          `json:"tmdb_id"`
		Video          FFMPEGStreamInfo `json:"video"`
		YoutubeTrailer string           `json:"youtube_trailer"`
	} `json:"info"`
	MovieData struct {
		Added              Timestamp `json:"added"`
		CategoryID         FlexInt   `json:"category_id,string"`
		ContainerExtension string    `json:"container_extension"`
		CustomSid          string    `json:"custom_sid"`
		DirectSource       string    `json:"direct_source"`
		Name               string    `json:"name"`
		StreamID           FlexInt   `json:"stream_id"`
	} `json:"movie_data"`
}

VideoOnDemandInfo contains information about a video on demand stream.

type XtreamClient

type XtreamClient struct {
	Username  string
	Password  string
	BaseURL   string
	UserAgent string

	ServerInfo ServerInfo
	UserInfo   UserInfo

	// Our HTTP client to communicate with Xtream
	HTTP    *http.Client
	Context context.Context
	// contains filtered or unexported fields
}

XtreamClient is the client used to communicate with a Xtream-Codes server.

func NewClient

func NewClient(username, password, baseURL string) (*XtreamClient, error)

NewClient returns an initialized XtreamClient with the given values.

func NewClientWithContext

func NewClientWithContext(ctx context.Context, username, password, baseURL string) (*XtreamClient, error)

NewClientWithContext returns an initialized XtreamClient with the given values.

func NewClientWithUserAgent

func NewClientWithUserAgent(ctx context.Context, username, password, baseURL, userAgent string) (*XtreamClient, error)

NewClientWithUserAgent returns an initialized XtreamClient with the given values.

func (*XtreamClient) GetCategories

func (c *XtreamClient) GetCategories(catType string) ([]Category, error)

GetCategories is a helper function used by GetLiveCategories, GetVideoOnDemandCategories and GetSeriesCategories to reduce duplicate code.

func (*XtreamClient) GetEPG

func (c *XtreamClient) GetEPG(streamID string) ([]EPGInfo, error)

GetEPG returns the full EPG for the given streamID.

func (*XtreamClient) GetLiveCategories

func (c *XtreamClient) GetLiveCategories() ([]Category, error)

GetLiveCategories will return a slice of categories for live streams.

func (*XtreamClient) GetLiveStreams

func (c *XtreamClient) GetLiveStreams(categoryID string) ([]Stream, error)

GetLiveStreams will return a slice of live streams. You can also optionally provide a categoryID to limit the output to members of that category.

func (*XtreamClient) GetSeries

func (c *XtreamClient) GetSeries(categoryID string) ([]SeriesInfo, error)

GetSeries will return a slice of all available Series. You can also optionally provide a categoryID to limit the output to members of that category.

func (*XtreamClient) GetSeriesCategories

func (c *XtreamClient) GetSeriesCategories() ([]Category, error)

GetSeriesCategories will return a slice of categories for series streams.

func (*XtreamClient) GetSeriesInfo

func (c *XtreamClient) GetSeriesInfo(seriesID string) (*Series, error)

GetSeriesInfo will return a series info for the given seriesID.

func (*XtreamClient) GetShortEPG

func (c *XtreamClient) GetShortEPG(streamID string, limit int) ([]EPGInfo, error)

GetShortEPG returns a short version of the EPG for the given streamID. If no limit is provided, the next 4 items in the EPG will be returned.

func (*XtreamClient) GetStreamURL

func (c *XtreamClient) GetStreamURL(streamID int, wantedFormat string) (string, error)

GetStreamURL will return a stream URL string for the given streamID and wantedFormat.

func (*XtreamClient) GetStreams

func (c *XtreamClient) GetStreams(streamAction, categoryID string) ([]Stream, error)

GetStreams is a helper function used by GetLiveStreams and GetVideoOnDemandStreams to reduce duplicate code.

func (*XtreamClient) GetVideoOnDemandCategories

func (c *XtreamClient) GetVideoOnDemandCategories() ([]Category, error)

GetVideoOnDemandCategories will return a slice of categories for VOD streams.

func (*XtreamClient) GetVideoOnDemandInfo

func (c *XtreamClient) GetVideoOnDemandInfo(vodID string) (*VideoOnDemandInfo, error)

GetVideoOnDemandInfo will return VOD info for the given vodID.

func (*XtreamClient) GetVideoOnDemandStreams

func (c *XtreamClient) GetVideoOnDemandStreams(categoryID string) ([]Stream, error)

GetVideoOnDemandStreams will return a slice of VOD streams. You can also optionally provide a categoryID to limit the output to members of that category.

func (*XtreamClient) GetXMLTV

func (c *XtreamClient) GetXMLTV() ([]byte, error)

GetXMLTV will return a slice of bytes for the XMLTV EPG file available from the provider.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL