package youtube - github.com/kkdai/youtube/v2 - godocs.io

import "github.com/kkdai/youtube/v2"

Package youtube implement youtube download package in go.

Constants

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")
)

Variables

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

Functions

func ExtractVideoID

func ExtractVideoID(videoID string) (string, error)

ExtractVideoID extracts the videoID from the given string

func SetLogLevel

func SetLogLevel(value string)

Types

type CaptionTrack

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

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.

Example

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)
	}
	defer stream.Close()

	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 (*Client) GetPlaylist

func (c *Client) GetPlaylist(url string) (*Playlist, error)

GetPlaylist fetches playlist metadata

func (*Client) GetPlaylistContext

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 (*Client) GetStream

func (c *Client) GetStream(video *Video, format *Format) (io.ReadCloser, int64, error)

GetStream returns the stream and the total size for a specific format

Example

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.
	formats := video.Formats.Quality("medium")
	reader, _, err := testClient.GetStream(video, &formats[0])
	if err != nil {
		panic(err)
	}

	// do something with the reader

	reader.Close()
}

func (*Client) GetStreamContext

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 (*Client) GetStreamURL

func (c *Client) GetStreamURL(video *Video, format *Format) (string, error)

GetStreamURL returns the url for a specific format

func (*Client) GetStreamURLContext

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 (*Client) GetTranscript

func (c *Client) GetTranscript(video *Video, lang string) (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 (*Client) GetTranscriptCtx

func (c *Client) GetTranscriptCtx(ctx context.Context, video *Video, lang string) (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 (*Client) GetVideo

func (c *Client) GetVideo(url string) (*Video, error)

GetVideo fetches video metadata

func (*Client) GetVideoContext

func (c *Client) GetVideoContext(ctx context.Context, url string) (*Video, error)

GetVideoContext fetches video metadata with a context

func (*Client) VideoFromPlaylistEntry

func (c *Client) VideoFromPlaylistEntry(entry *PlaylistEntry) (*Video, error)

func (*Client) VideoFromPlaylistEntryContext

func (c *Client) VideoFromPlaylistEntryContext(ctx context.Context, entry *PlaylistEntry) (*Video, error)

type DecipherOperation

type DecipherOperation func([]byte) []byte

type ErrPlayabiltyStatus

type ErrPlayabiltyStatus struct {
	Status string
	Reason string
}

func (ErrPlayabiltyStatus) Error

func (err ErrPlayabiltyStatus) Error() string

type ErrPlaylistStatus

type ErrPlaylistStatus struct {
	Reason string
}

func (ErrPlaylistStatus) Error

func (err ErrPlaylistStatus) Error() string

type ErrUnexpectedStatusCode

type ErrUnexpectedStatusCode int

ErrUnexpectedStatusCode is returned on unexpected HTTP status codes

func (ErrUnexpectedStatusCode) Error

func (err ErrUnexpectedStatusCode) Error() string

type Format

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"`

	// AudioTrack is only available for videos with multiple audio track languages
	AudioTrack *struct {
		DisplayName    string `json:"displayName"`
		ID             string `json:"id"`
		AudioIsDefault bool   `json:"audioIsDefault"`
	}
}

func (*Format) LanguageDisplayName

func (f *Format) LanguageDisplayName() string

type FormatList

type FormatList []Format

func (FormatList) AudioChannels

func (list FormatList) AudioChannels(n int) FormatList

AudioChannels returns a new FormatList filtered by the matching AudioChannels

func (FormatList) Itag

func (list FormatList) Itag(itagNo int) FormatList

Type returns a new FormatList filtered by itag

func (FormatList) Language

func (list FormatList) Language(displayName string) FormatList

Type returns a new FormatList filtered by display name

func (FormatList) Quality

func (list FormatList) Quality(quality string) FormatList

Quality returns a new FormatList filtered by quality, quality label or itag, but not audio quality

func (FormatList) Select

func (list FormatList) Select(f func(Format) bool) (result FormatList)

Type returns a new FormatList filtered by itag

func (FormatList) Sort

func (list FormatList) Sort()

Sort sorts all formats fields

func (FormatList) Type

func (list FormatList) Type(value string) FormatList

Type returns a new FormatList filtered by mime type

func (FormatList) WithAudioChannels

func (list FormatList) WithAudioChannels() FormatList

AudioChannels returns a new FormatList filtered by the matching AudioChannels

type Playlist

type Playlist struct {
	ID          string
	Title       string
	Description string
	Author      string
	Videos      []*PlaylistEntry
}

Example

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

type PlaylistEntry struct {
	ID         string
	Title      string
	Author     string
	Duration   time.Duration
	Thumbnails Thumbnails
}

type Thumbnail

type Thumbnail struct {
	URL    string
	Width  uint
	Height uint
}

type Thumbnails

type Thumbnails []Thumbnail

type TranscriptSegment

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 (TranscriptSegment) String

func (tr TranscriptSegment) String() string

type Video

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 (*Video) FilterQuality

func (v *Video) FilterQuality(quality string)

FilterQuality reduces the format list to formats matching the quality

func (*Video) SortBitrateAsc

func (v *Video) SortBitrateAsc(i int, j int) bool

func (*Video) SortBitrateDesc

func (v *Video) SortBitrateDesc(i int, j int) bool

type VideoTranscript

type VideoTranscript []TranscriptSegment

func (VideoTranscript) String

func (vt VideoTranscript) String() string

Directories

cmd

cmd/youtubedr

downloader

Details

Version: v2.10.1 (latest)

Platform: linux/amd64

Imports: 23 packages

Refresh now

Back to home

Search