💾 Archived View for godocs.io › github.com › kkdai › youtube › v2 captured on 2023-09-28 at 16:17:40. Gemini links have been rewritten to link to archived content
⬅️ Previous capture (2021-12-05)
-=-=-=-=-=-=-
import "github.com/kkdai/youtube/v2"
Package youtube implement youtube download package in go.
const ( Size1Kb = 1024 Size1Mb = Size1Kb * 1024 Size10Mb = Size1Mb * 10 )
const ( ErrCipherNotFound = constError("cipher not found") ErrSignatureTimestampNotFound = constError("signature timestamp not found") ErrInvalidCharactersInVideoID = constError("invalid characters in video id") ErrVideoIDMinLength = constError("the video id must be at least 10 characters long") ErrReadOnClosedResBody = constError("http: read on closed response body") ErrNotPlayableInEmbed = constError("embedding of this video has been disabled") ErrLoginRequired = constError("login required to confirm your age") ErrVideoPrivate = constError("user restricted access to this video") ErrInvalidPlaylist = constError("no playlist detected or invalid playlist ID") )
var ( // WebClient, better to use Android client but go ahead. WebClient = clientInfo{ // contains filtered or unexported fields } // AndroidClient, download go brrrrrr. AndroidClient = clientInfo{ // contains filtered or unexported fields } // EmbeddedClient, not really tested. EmbeddedClient = clientInfo{ // contains filtered or unexported fields } )
var DefaultClient = AndroidClient
DefaultClient type to use. No reason to change but you could if you wanted to.
var ( ErrNoFormat = errors.New("no video format provided") )
var ( ErrTranscriptDisabled = errors.New("transcript is disabled on this video") )
var Logger = getLogger(os.Getenv("LOGLEVEL"))
The global logger for all Client instances
func ExtractVideoID(videoID string) (string, error)
ExtractVideoID extracts the videoID from the given string
func SetLogLevel(value string)
type CaptionTrack struct { BaseURL string `json:"baseUrl"` Name struct { SimpleText string `json:"simpleText"` } `json:"name"` VssID string `json:"vssId"` LanguageCode string `json:"languageCode"` Kind string `json:"kind,omitempty"` IsTranslatable bool `json:"isTranslatable"` }
type Client struct { // HTTPClient can be used to set a custom HTTP client. // If not set, http.DefaultClient will be used HTTPClient *http.Client // MaxRoutines to use when downloading a video. MaxRoutines int // ChunkSize to use when downloading videos in chunks. Default is Size10Mb. ChunkSize int64 // contains filtered or unexported fields }
Client offers methods to download video metadata and video streams.
ExampleDownload : Example code for how to use this package for download video.
Code:
{ videoID := "BaW_jenozKc" client := youtube.Client{} video, err := client.GetVideo(videoID) if err != nil { panic(err) } formats := video.Formats.WithAudioChannels() // only get videos with audio stream, _, err := client.GetStream(video, &formats[0]) if err != nil { panic(err) } file, err := os.Create("video.mp4") if err != nil { panic(err) } defer file.Close() _, err = io.Copy(file, stream) if err != nil { panic(err) } }
func (c *Client) GetPlaylist(url string) (*Playlist, error)
GetPlaylist fetches playlist metadata
func (c *Client) GetPlaylistContext(ctx context.Context, url string) (*Playlist, error)
GetPlaylistContext fetches playlist metadata, with a context, along with a list of Videos, and some basic information for these videos. Playlist entries cannot be downloaded, as they lack all the required metadata, but can be used to enumerate all IDs, Authors, Titles, etc.
func (c *Client) GetStream(video *Video, format *Format) (io.ReadCloser, int64, error)
GetStream returns the stream and the total size for a specific format
Code:
{ video, err := testClient.GetVideo("https://www.youtube.com/watch?v=9_MbW9FK1fA") if err != nil { panic(err) } // Typically youtube only provides separate streams for video and audio. // If you want audio and video combined, take a look a the downloader package. format := video.Formats.FindByQuality("medium") reader, _, err := testClient.GetStream(video, format) if err != nil { panic(err) } // do something with the reader reader.Close() }
func (c *Client) GetStreamContext(ctx context.Context, video *Video, format *Format) (io.ReadCloser, int64, error)
GetStreamContext returns the stream and the total size for a specific format with a context.
func (c *Client) GetStreamURL(video *Video, format *Format) (string, error)
GetStreamURL returns the url for a specific format
func (c *Client) GetStreamURLContext(ctx context.Context, video *Video, format *Format) (string, error)
GetStreamURLContext returns the url for a specific format with a context
func (c *Client) GetTranscript(video *Video) (VideoTranscript, error)
GetTranscript fetches the video transcript if available.
Not all videos have transcripts, only relatively new videos. If transcripts are disabled or not available, ErrTranscriptDisabled is returned.
func (c *Client) GetTranscriptCtx(ctx context.Context, video *Video) (VideoTranscript, error)
GetTranscriptCtx fetches the video transcript if available.
Not all videos have transcripts, only relatively new videos. If transcripts are disabled or not available, ErrTranscriptDisabled is returned.
func (c *Client) GetVideo(url string) (*Video, error)
GetVideo fetches video metadata
func (c *Client) GetVideoContext(ctx context.Context, url string) (*Video, error)
GetVideoContext fetches video metadata with a context
func (c *Client) VideoFromPlaylistEntry(entry *PlaylistEntry) (*Video, error)
func (c *Client) VideoFromPlaylistEntryContext(ctx context.Context, entry *PlaylistEntry) (*Video, error)
type DecipherOperation func([]byte) []byte
type ErrPlayabiltyStatus struct { Status string Reason string }
func (err ErrPlayabiltyStatus) Error() string
type ErrPlaylistStatus struct { Reason string }
func (err ErrPlaylistStatus) Error() string
type ErrUnexpectedStatusCode int
ErrUnexpectedStatusCode is returned on unexpected HTTP status codes
func (err ErrUnexpectedStatusCode) Error() string
type Format struct { ItagNo int `json:"itag"` URL string `json:"url"` MimeType string `json:"mimeType"` Quality string `json:"quality"` Cipher string `json:"signatureCipher"` Bitrate int `json:"bitrate"` FPS int `json:"fps"` Width int `json:"width"` Height int `json:"height"` LastModified string `json:"lastModified"` ContentLength int64 `json:"contentLength,string"` QualityLabel string `json:"qualityLabel"` ProjectionType string `json:"projectionType"` AverageBitrate int `json:"averageBitrate"` AudioQuality string `json:"audioQuality"` ApproxDurationMs string `json:"approxDurationMs"` AudioSampleRate string `json:"audioSampleRate"` AudioChannels int `json:"audioChannels"` // InitRange is only available for adaptive formats InitRange *struct { Start string `json:"start"` End string `json:"end"` } `json:"initRange"` // IndexRange is only available for adaptive formats IndexRange *struct { Start string `json:"start"` End string `json:"end"` } `json:"indexRange"` }
type FormatList []Format
func (list FormatList) AudioChannels(n int) (result FormatList)
AudioChannels returns a new FormatList filtered by the matching AudioChannels
func (list FormatList) FindByItag(itagNo int) *Format
FindByItag returns the first format matching the itag number
func (list FormatList) FindByQuality(quality string) *Format
FindByQuality returns the first format matching Quality or QualityLabel
Examples: tiny, small, medium, large, 720p, hd720, hd1080
func (list FormatList) Quality(quality string) (result FormatList)
Quality returns a new FormatList filtered by quality, quality label or itag, but not audio quality
func (list FormatList) Sort()
Sort sorts all formats fields
func (list FormatList) Type(t string) (result FormatList)
Type returns a new FormatList filtered by mime type of video
func (list FormatList) WithAudioChannels() (result FormatList)
AudioChannels returns a new FormatList filtered by the matching AudioChannels
type Playlist struct { ID string Title string Description string Author string Videos []*PlaylistEntry }
Example usage for playlists: downloading and checking information.
Code:
{ playlistID := "PLQZgI7en5XEgM0L1_ZcKmEzxW1sCOVZwP" client := youtube.Client{} playlist, err := client.GetPlaylist(playlistID) if err != nil { panic(err) } /* ----- Enumerating playlist videos ----- */ header := fmt.Sprintf("Playlist %s by %s", playlist.Title, playlist.Author) println(header) println(strings.Repeat("=", len(header)) + "\n") for k, v := range playlist.Videos { fmt.Printf("(%d) %s - '%s'\n", k+1, v.Author, v.Title) } /* ----- Downloading the 1st video ----- */ entry := playlist.Videos[0] video, err := client.VideoFromPlaylistEntry(entry) if err != nil { panic(err) } // Now it's fully loaded. fmt.Printf("Downloading %s by '%s'!\n", video.Title, video.Author) stream, _, err := client.GetStream(video, &video.Formats[0]) if err != nil { panic(err) } file, err := os.Create("video.mp4") if err != nil { panic(err) } defer file.Close() _, err = io.Copy(file, stream) if err != nil { panic(err) } println("Downloaded /video.mp4") }
type PlaylistEntry struct { ID string Title string Author string Duration time.Duration Thumbnails Thumbnails }
type Thumbnail struct { URL string Width uint Height uint }
type Thumbnails []Thumbnail
type TranscriptSegment struct { // Text is the transcipt text. Text string `json:"text"` // StartMs is the start timestamp in ms. StartMs int `json:"offset"` // OffsetText e.g. '4:00'. OffsetText string `json:"offsetText"` // Duration the transcript segment spans in ms. Duration int `json:"duration"` }
TranscriptSegment is a single transcipt segment spanning a few milliseconds.
func (tr TranscriptSegment) String() string
type Video struct { ID string Title string Description string Author string ChannelID string ChannelHandle string Views int Duration time.Duration PublishDate time.Time Formats FormatList Thumbnails Thumbnails DASHManifestURL string // URI of the DASH manifest file HLSManifestURL string // URI of the HLS manifest file CaptionTracks []CaptionTrack }
func (v *Video) FilterQuality(quality string)
FilterQuality reduces the format list to formats matching the quality
func (v *Video) SortBitrateAsc(i int, j int) bool
func (v *Video) SortBitrateDesc(i int, j int) bool
type VideoTranscript []TranscriptSegment
func (vt VideoTranscript) String() string