package metadata

type Format struct {
	// The mandatory URL representing the media:
	//   for plain file media - HTTP URL of this file,
	//   for RTMP - RTMP URL,
	//   for HLS - URL of the M3U8 media playlist,
	//   for HDS - URL of the F4M manifest,
	//   for DASH
	//     - HTTP URL to plain file media (in case of
	//   	unfragmented media)
	//     - URL of the MPD manifest or base URL
	// 	  representing the media if MPD manifest
	//   	is parsed from a string (in case of
	//   	fragmented media)
	//   for MSS - URL of the ISM manifest.
	Url string `json:"url"`

	// Will be calculated from URL if missing
	Ext string `json:"ext"`

	// A human-readable description of the format
	// ("mp4 container with h264/opus").
	// Calculated from the format_id, width, height.
	// and format_note fields if missing.
	Format string `json:"format"`

	// A short description of the format
	// ("mp4_h264_opus" or "19").
	// Technically optional, but strongly recommended.
	FormatID string `json:"format_id"`

	// Additional info about the format
	// ("3D" or "DASH video")
	FormatNote string `json:"format_note"`

	// Width of the video, if known
	Width int `json:"width"`

	// Height of the video, if known
	Height int `json:"height"`

	// Aspect ratio of the video, if known
	// Automatically calculated from width and height
	AspectRatio float64 `json:"aspect_ratio"`

	// Textual description of width and height
	// Automatically calculated from width and height
	Resolution string `json:"resolution"`

	// The dynamic range of the video. One of:
	// "SDR" (None), "HDR10", "HDR10+, "HDR12", "HLG, "DV"
	DynamicRange string `json:"dynamic_range"`

	// Average bitrate of audio and video in KBit/s
	Tbr float64 `json:"tbr"`

	// Average audio bitrate in KBit/s
	Abr float64 `json:"abr"`

	// Average video bitrate in KBit/s
	Vbr float64 `json:"vbr"`

	// Name of the audio codec in use
	ACodec string `json:"acodec"`

	// Name of the video codec in use
	VCodec string `json:"vcodec"`

	// Number of audio channels
	AudioChannels int `json:"audio_channels"`

	// Frame rate
	Fps float64 `json:"fps"`

	// Name of the container format
	Container string `json:"container"`

	// The number of bytes, if known in advance
	Filesize *int `json:"filesize"`

	// An estimate for the number of bytes
	FilesizeApprox *int `json:"filesize_approx"`

	// The protocol that will be used for the actual
	// download, lower-case. One of "http", "https" or
	// one of the protocols defined in downloader.PROTOCOL_MAP
	Protocol string `json:"protocol"`

	// Base URL for fragments. Each fragment's path
	// value (if present) will be relative to
	// this URL.
	FragmentBaseUrl *string `json:"fragment_base_url"`

	// A list of fragments of a fragmented media.
	// Each fragment entry must contain either an url
	// or a path. If an url is present it should be
	// considered by a client. Otherwise both path and
	// fragment_base_url must be present.
	Fragments []Fragment `json:"fragments"`

	// Is a live format that can be downloaded from the start.
	IsFromStart bool `json:"is_from_start"`

	// Order number of this format. If this field is
	// present and not None, the formats get sorted
	// by this field, regardless of all other values.
	// -1 for default (order by other properties),
	// -2 or smaller for less than default.
	// < -1000 to hide the format (if there is
	//    another one which is strictly better)
	Preference *int `json:"preference"`

	// Language code, e.g. "de" or "en-US".
	Language string `json:"language"`

	// Is this in the language mentioned in
	// the URL?
	// 10 if it's what the URL is about,
	// -1 for default (don't know),
	// -10 otherwise, other values reserved for now.
	LanguagePreference int `json:"language_preference"`

	// Order number of the video quality of this
	// format, irrespective of the file format.
	// -1 for default (order by other properties),
	// -2 or smaller for less than default.
	Quality float64 `json:"quality"`

	// Order number for this video source
	// 	(quality takes higher priority)
	// 	-1 for default (order by other properties),
	// 	-2 or smaller for less than default.
	SourcePreference int `json:"source_preference"`

	// A dictionary of additional HTTP headers to add to the request.
	HttpHeaders map[string]string `json:"http_header"`

	// If given and not 1, indicates that the
	// video's pixels are not square.
	// width : height ratio as float.
	StretchedRatio *float64 `json:"stretched_ratio"`

	// The server does not support resuming the (HTTP or RTMP) download.
	NoResume bool `json:"no_resume"`

	// The format has DRM and cannot be downloaded.
	HasDrm bool `json:"has_drm"`

	// A query string to append to each
	// fragment's URL, or to update each existing query string
	// with. Only applied by the native HLS/DASH downloaders.
	ExtraParamToSegmentUrl string `json:"extra_param_to_segment_url"`

	// A dictionary of HLS AES-128 decryption information
	// used by the native HLS downloader to override the
	// values in the media playlist when an '#EXT-X-KEY' tag
	// is present in the playlist
	HlsAes *HlsAes `json:"hls_aes"`
}
