ytdl

package module
v0.5.2 Latest Latest
Warning

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

Go to latest
Published: Oct 12, 2019 License: MIT Imports: 16 Imported by: 0

README

ytdl Build Status GoDoc

Go library for downloading YouTube videos

Documentation: https://godoc.org/github.com/rylio/ytdl

Example

package main

import (
	"fmt"
	"os"

	"github.com/rylio/ytdl"
)

func main() {
	vid, err := ytdl.GetVideoInfo("https://www.youtube.com/watch?v=WkVvG4QTO9M")
	if err != nil {
		fmt.Println("Failed to get video info")
		return
	}
	file, _ := os.Create(vid.Title + ".mp4")
	defer file.Close()
	vid.Download(vid.Formats[0], file)
}

ytdl CLI

  • To install: go get -u github.com/rylio/ytdl/...

  • Or use Docker image docker pull brucewangno1/ytdl:1.0

Usage
  • ytdl [global options] [youtube url or video id]
  • Or using Docker: docker run -it --rm -v /directory/you/want/to/save/the/download/:/ytdl/ brucewangno1/ytdl:1.0 [global options] "[youtube url or video id]"
Options
  • --help, -h - show help
  • --filter, -f - Filter out formats
    • Syntax: -f key:value1,value2,...,valueN
      • Shortcuts for best/worst(e.g. -f best)
        • best/worst - best/worst video and audio
        • best-video/worst-video - best/worst video
        • best-fps/worst-fps - best/worst video with fps as the first priority
        • best-audio/worst-audio - best/worst audio
    • To exclude: -f !key:value1,...
    • Available keys (See format.go for available values):
      • ext - extension of video
      • res - resolution of video
      • videnc - video encoding
      • audenc - audio encoding
      • prof - youtube video profile
      • audbr - audio bitrate
    • Default filters
      • ext:mp4
      • !videnc:
      • !audenc:
      • best
  • --output, -o - Output to specific path
    • Supports templates, ex: {{.Title}}.{{.Ext}}
    • Defaults to {{.Title}}.{{.Ext}}
    • Supported template variables are Title, Ext, DatePublished, Resolution
    • Pass - to output to stdout, former stdout output is redirected to stderr
  • --info, -i - Just gets video info, outputs to stdout
  • --no-progress - Disables the progress bar
  • --silent, -s - Disables all output, except for fatal errors
  • --debug, -d - Output debug logs
  • --append, -a - append to output file, instead of truncating
  • --range, -r - specify a range of bytes, placed in http range header, ex: 0-100
  • --download-url, -u - just print download url to, don't do anything else
  • --version, -v - print out ytdl cli version
  • --start-offset - offset the beginning of the video by a duration of time(e.g. 20s or 1m)
  • --download-option, -p - Print video and audio download options and accept input interactively
Examples

Download content based on itag

ytdl -f itag:22 'https://www.youtube.com/watch?v=9bZkp7q19f0'

Download content with the best fps

ytdl -f best-fps 'https://www.youtube.com/watch?v=9bZkp7q19f0'

Get all download formats (Requires jq to be installed)

./ytdl -j 'http://youtube.com/watch?v=9bZkp7q19f0' | jq ".formats"

Extract title of the video (Requires jq to be installed)

ytdl -j 'http://youtube.com/watch?v=9bZkp7q19f0' | jq ".title"

Print download url without downloading the content

ytdl -f itag:22 --download-url 'https://www.youtube.com/watch?v=9bZkp7q19f0'

Print video and audio download options and accept input interactively

ytdl -p 'https://www.youtube.com/watch?v=9bZkp7q19f0'

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Added some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request

License

ytdl is released under the MIT License, see LICENSE for more details.

Documentation

Index

Constants

This section is empty.

Variables

View Source
var FORMATS = map[int]Format{
	5: Format{
		Extension:     "flv",
		Resolution:    "240p",
		VideoEncoding: "Sorenson H.283",
		AudioEncoding: "mp3",
		Itag:          5,
		AudioBitrate:  64,
	},
	6: Format{
		Extension:     "flv",
		Resolution:    "270p",
		VideoEncoding: "Sorenson H.263",
		AudioEncoding: "mp3",
		Itag:          6,
		AudioBitrate:  64,
	},
	13: Format{
		Extension:     "3gp",
		Resolution:    "",
		VideoEncoding: "MPEG-4 Visual",
		AudioEncoding: "aac",
		Itag:          13,
		AudioBitrate:  0,
	},
	17: Format{
		Extension:     "3gp",
		Resolution:    "144p",
		VideoEncoding: "MPEG-4 Visual",
		AudioEncoding: "aac",
		Itag:          17,
		AudioBitrate:  24,
	},
	18: Format{
		Extension:     "mp4",
		Resolution:    "360p",
		VideoEncoding: "H.264",
		AudioEncoding: "aac",
		Itag:          18,
		AudioBitrate:  96,
	},
	22: Format{
		Extension:     "mp4",
		Resolution:    "720p",
		VideoEncoding: "H.264",
		AudioEncoding: "aac",
		Itag:          22,
		AudioBitrate:  192,
	},
	34: Format{
		Extension:     "flv",
		Resolution:    "480p",
		VideoEncoding: "H.264",
		AudioEncoding: "aac",
		Itag:          34,
		AudioBitrate:  128,
	},
	35: Format{
		Extension:     "flv",
		Resolution:    "360p",
		VideoEncoding: "H.264",
		AudioEncoding: "aac",
		Itag:          35,
		AudioBitrate:  128,
	},
	36: Format{
		Extension:     "3gp",
		Resolution:    "240p",
		VideoEncoding: "MPEG-4 Visual",
		AudioEncoding: "aac",
		Itag:          36,
		AudioBitrate:  36,
	},
	37: Format{
		Extension:     "mp4",
		Resolution:    "1080p",
		VideoEncoding: "H.264",
		AudioEncoding: "aac",
		Itag:          37,
		AudioBitrate:  192,
	},
	38: Format{
		Extension:     "mp4",
		Resolution:    "3072p",
		VideoEncoding: "H.264",
		AudioEncoding: "aac",
		Itag:          38,
		AudioBitrate:  192,
	},
	43: Format{
		Extension:     "webm",
		Resolution:    "360p",
		VideoEncoding: "VP8",
		AudioEncoding: "vorbis",
		Itag:          43,
		AudioBitrate:  128,
	},
	44: Format{
		Extension:     "webm",
		Resolution:    "480p",
		VideoEncoding: "VP8",
		AudioEncoding: "vorbis",
		Itag:          44,
		AudioBitrate:  128,
	},
	45: Format{
		Extension:     "webm",
		Resolution:    "720p",
		VideoEncoding: "VP8",
		AudioEncoding: "vorbis",
		Itag:          45,
		AudioBitrate:  192,
	},
	46: Format{
		Extension:     "webm",
		Resolution:    "1080p",
		VideoEncoding: "VP8",
		AudioEncoding: "vorbis",
		Itag:          46,
		AudioBitrate:  192,
	},
	82: Format{
		Extension:     "mp4",
		Resolution:    "360p",
		VideoEncoding: "H.264",
		Itag:          82,
		AudioBitrate:  96,
	},
	83: Format{
		Extension:     "mp4",
		Resolution:    "240p",
		VideoEncoding: "H.264",
		AudioEncoding: "aac",
		Itag:          83,
		AudioBitrate:  96,
	},
	84: Format{
		Extension:     "mp4",
		Resolution:    "720p",
		VideoEncoding: "H.264",
		AudioEncoding: "aac",
		Itag:          84,
		AudioBitrate:  192,
	},
	85: Format{
		Extension:     "mp4",
		Resolution:    "1080p",
		VideoEncoding: "H.264",
		AudioEncoding: "aac",
		Itag:          85,
		AudioBitrate:  192,
	},
	100: Format{
		Extension:     "webm",
		Resolution:    "360p",
		VideoEncoding: "VP8",
		AudioEncoding: "vorbis",
		Itag:          100,
		AudioBitrate:  128,
	},
	101: Format{
		Extension:     "webm",
		Resolution:    "360p",
		VideoEncoding: "VP8",
		AudioEncoding: "vorbis",
		Itag:          101,
		AudioBitrate:  192,
	},
	102: Format{
		Extension:     "webm",
		Resolution:    "720p",
		VideoEncoding: "VP8",
		AudioEncoding: "vorbis",
		Itag:          102,
		AudioBitrate:  192,
	},

	133: Format{
		Extension:     "mp4",
		Resolution:    "240p",
		VideoEncoding: "H.264",
		AudioEncoding: "",
		Itag:          133,
		AudioBitrate:  0,
	},
	134: Format{
		Extension:     "mp4",
		Resolution:    "360p",
		VideoEncoding: "H.264",
		AudioEncoding: "",
		Itag:          134,
		AudioBitrate:  0,
	},
	135: Format{
		Extension:     "mp4",
		Resolution:    "480p",
		VideoEncoding: "H.264",
		AudioEncoding: "",
		Itag:          135,
		AudioBitrate:  0,
	},
	136: Format{
		Extension:     "mp4",
		Resolution:    "720p",
		VideoEncoding: "H.264",
		AudioEncoding: "",
		Itag:          136,
		AudioBitrate:  0,
	},
	137: Format{
		Extension:     "mp4",
		Resolution:    "1080p",
		VideoEncoding: "H.264",
		AudioEncoding: "",
		Itag:          137,
		AudioBitrate:  0,
	},
	138: Format{
		Extension:     "mp4",
		Resolution:    "2160p",
		VideoEncoding: "H.264",
		AudioEncoding: "",
		Itag:          138,
		AudioBitrate:  0,
	},
	160: Format{
		Extension:     "mp4",
		Resolution:    "144p",
		VideoEncoding: "H.264",
		AudioEncoding: "",
		Itag:          160,
		AudioBitrate:  0,
	},
	242: Format{
		Extension:     "webm",
		Resolution:    "240p",
		VideoEncoding: "VP9",
		AudioEncoding: "",
		Itag:          242,
		AudioBitrate:  0,
	},
	243: Format{
		Extension:     "webm",
		Resolution:    "360p",
		VideoEncoding: "VP9",
		AudioEncoding: "",
		Itag:          243,
		AudioBitrate:  0,
	},
	244: Format{
		Extension:     "webm",
		Resolution:    "480p",
		VideoEncoding: "VP9",
		AudioEncoding: "",
		Itag:          244,
		AudioBitrate:  0,
	},
	247: Format{
		Extension:     "webm",
		Resolution:    "720p",
		VideoEncoding: "VP9",
		AudioEncoding: "",
		Itag:          247,
		AudioBitrate:  0,
	},
	248: Format{
		Extension:     "webm",
		Resolution:    "1080p",
		VideoEncoding: "VP9",
		AudioEncoding: "",
		Itag:          248,
		AudioBitrate:  9,
	},
	264: Format{
		Extension:     "mp4",
		Resolution:    "1440p",
		VideoEncoding: "H.264",
		AudioEncoding: "",
		Itag:          264,
		AudioBitrate:  0,
	},
	266: Format{
		Extension:     "mp4",
		Resolution:    "2160p",
		VideoEncoding: "H.264",
		AudioEncoding: "",
		Itag:          266,
		AudioBitrate:  0,
	},
	271: Format{
		Extension:     "webm",
		Resolution:    "1440p",
		VideoEncoding: "VP9",
		AudioEncoding: "",
		Itag:          271,
		AudioBitrate:  0,
	},
	272: Format{
		Extension:     "webm",
		Resolution:    "2160p",
		VideoEncoding: "VP9",
		AudioEncoding: "",
		Itag:          272,
		AudioBitrate:  0,
	},
	278: Format{
		Extension:     "webm",
		Resolution:    "144p",
		VideoEncoding: "VP9",
		AudioEncoding: "",
		Itag:          278,
		AudioBitrate:  0,
	},
	298: Format{
		Extension:     "mp4",
		Resolution:    "720p",
		VideoEncoding: "H.264",
		AudioEncoding: "",
		Itag:          298,
		AudioBitrate:  0,
	},
	299: Format{
		Extension:     "mp4",
		Resolution:    "1080p",
		VideoEncoding: "H.264",
		AudioEncoding: "",
		Itag:          299,
		AudioBitrate:  0,
	},
	302: Format{
		Extension:     "webm",
		Resolution:    "720p",
		VideoEncoding: "VP9",
		AudioEncoding: "",
		Itag:          302,
		AudioBitrate:  0,
	},
	303: Format{
		Extension:     "webm",
		Resolution:    "1080p",
		VideoEncoding: "VP9",
		AudioEncoding: "",
		Itag:          303,
		AudioBitrate:  0,
	},

	139: Format{
		Extension:     "mp4",
		Resolution:    "",
		VideoEncoding: "",
		AudioEncoding: "aac",
		Itag:          139,
		AudioBitrate:  48,
	},
	140: Format{
		Extension:     "mp4",
		Resolution:    "",
		VideoEncoding: "",
		AudioEncoding: "aac",
		Itag:          140,
		AudioBitrate:  128,
	},
	141: Format{
		Extension:     "mp4",
		Resolution:    "",
		VideoEncoding: "",
		AudioEncoding: "aac",
		Itag:          141,
		AudioBitrate:  256,
	},
	171: Format{
		Extension:     "webm",
		Resolution:    "",
		VideoEncoding: "",
		AudioEncoding: "vorbis",
		Itag:          171,
		AudioBitrate:  128,
	},
	172: Format{
		Extension:     "webm",
		Resolution:    "",
		VideoEncoding: "",
		AudioEncoding: "vorbis",
		Itag:          172,
		AudioBitrate:  192,
	},
	249: Format{
		Extension:     "webm",
		Resolution:    "",
		VideoEncoding: "",
		AudioEncoding: "opus",
		Itag:          249,
		AudioBitrate:  50,
	},
	250: Format{
		Extension:     "webm",
		Resolution:    "",
		VideoEncoding: "",
		AudioEncoding: "opus",
		Itag:          250,
		AudioBitrate:  70,
	},
	251: Format{
		Extension:     "webm",
		Resolution:    "",
		VideoEncoding: "",
		AudioEncoding: "opus",
		Itag:          251,
		AudioBitrate:  160,
	},

	92: Format{
		Extension:     "ts",
		Resolution:    "240p",
		VideoEncoding: "H.264",
		AudioEncoding: "aac",
		Itag:          92,
		AudioBitrate:  48,
	},
	93: Format{
		Extension:     "ts",
		Resolution:    "480p",
		VideoEncoding: "H.264",
		AudioEncoding: "aac",
		Itag:          93,
		AudioBitrate:  128,
	},
	94: Format{
		Extension:     "ts",
		Resolution:    "720p",
		VideoEncoding: "H.264",
		AudioEncoding: "aac",
		Itag:          94,
		AudioBitrate:  128,
	},
	95: Format{
		Extension:     "ts",
		Resolution:    "1080p",
		VideoEncoding: "H.264",
		AudioEncoding: "aac",
		Itag:          95,
		AudioBitrate:  256,
	},
	96: Format{
		Extension:     "ts",
		Resolution:    "720p",
		VideoEncoding: "H.264",
		AudioEncoding: "aac",
		Itag:          96,
		AudioBitrate:  256,
	},
	120: Format{
		Extension:     "flv",
		Resolution:    "720p",
		VideoEncoding: "H.264",
		AudioEncoding: "aac",
		Itag:          120,
		AudioBitrate:  128,
	},
	127: Format{
		Extension:     "ts",
		Resolution:    "",
		VideoEncoding: "",
		AudioEncoding: "aac",
		Itag:          127,
		AudioBitrate:  96,
	},
	128: Format{
		Extension:     "ts",
		Resolution:    "",
		VideoEncoding: "",
		AudioEncoding: "aac",
		Itag:          128,
		AudioBitrate:  96,
	},
	132: Format{
		Extension:     "ts",
		Resolution:    "240p",
		VideoEncoding: "H.264",
		AudioEncoding: "aac",
		Itag:          132,
		AudioBitrate:  48,
	},
	151: Format{
		Extension:     "ts",
		Resolution:    "720p",
		VideoEncoding: "H.264",
		AudioEncoding: "aac",
		Itag:          151,
		AudioBitrate:  24,
	},
}

FORMATS is a map of all itags and their formats

Functions

This section is empty.

Types

type Format

type Format struct {
	Itag          int    `json:"itag"`
	Extension     string `json:"extension"`
	Resolution    string `json:"resolution"`
	VideoEncoding string `json:"videoEncoding"`
	AudioEncoding string `json:"audioEncoding"`
	AudioBitrate  int    `json:"audioBitrate"`
	// contains filtered or unexported fields
}

Format is a youtube is a static youtube video format

func (Format) CompareKey added in v0.5.0

func (f Format) CompareKey(other Format, key FormatKey) int

func (Format) ValueForKey added in v0.4.0

func (f Format) ValueForKey(key FormatKey) interface{}

ValueForKey gets the format value for a format key, used for filtering

type FormatKey

type FormatKey string

FormatKey is a string type containing a key in a video format map

const (
	FormatExtensionKey     FormatKey = "ext"
	FormatResolutionKey    FormatKey = "res"
	FormatVideoEncodingKey FormatKey = "videnc"
	FormatAudioEncodingKey FormatKey = "audenc"
	FormatItagKey          FormatKey = "itag"
	FormatAudioBitrateKey  FormatKey = "audbr"
	FormatFPSKey           FormatKey = "fps"
)

Available format Keys

type FormatList added in v0.5.0

type FormatList []Format

FormatList is a slice of formats with filtering functionality

func (FormatList) Best added in v0.5.0

func (formats FormatList) Best(key FormatKey) FormatList

func (FormatList) Copy added in v0.5.0

func (formats FormatList) Copy() FormatList

func (FormatList) Extremes added in v0.5.0

func (formats FormatList) Extremes(key FormatKey, best bool) FormatList

func (FormatList) Filter added in v0.5.0

func (formats FormatList) Filter(key FormatKey, values []interface{}) FormatList

func (FormatList) Sort added in v0.5.0

func (formats FormatList) Sort(key FormatKey, reverse bool)

func (FormatList) Subtract added in v0.5.0

func (formats FormatList) Subtract(other FormatList) FormatList

func (FormatList) Worst added in v0.5.0

func (formats FormatList) Worst(key FormatKey) FormatList

type ThumbnailQuality

type ThumbnailQuality string

ThumbnailQuality is a youtube thumbnail quality option

const ThumbnailQualityDefault ThumbnailQuality = "default"

ThumbnailQualityDefault is the default quality thumbnail jpg

const ThumbnailQualityHigh ThumbnailQuality = "hqdefault"

ThumbnailQualityHigh is the high quality thumbnail jpg

const ThumbnailQualityMaxRes ThumbnailQuality = "maxresdefault"

ThumbnailQualityMaxRes is the maximum resolution quality jpg

const ThumbnailQualityMedium ThumbnailQuality = "mqdefault"

ThumbnailQualityMedium is the medium quality thumbnail jpg

const ThumbnailQualitySD ThumbnailQuality = "sddefault"

ThumbnailQualitySD is the standard def quality thumbnail jpg

type VideoInfo added in v0.3.0

type VideoInfo struct {
	// The video ID
	ID string `json:"id"`
	// The video title
	Title string `json:"title"`
	// The video description
	Description string `json:"description"`
	// The date the video was published
	DatePublished time.Time `json:"datePublished"`
	// Formats the video is available in
	Formats FormatList `json:"formats"`
	// List of keywords associated with the video
	Keywords []string `json:"keywords"`
	// Author of the video
	Author string `json:"author"`
	// Duration of the video
	Duration time.Duration
	// contains filtered or unexported fields
}

VideoInfo contains the info a youtube video

func GetVideoInfo added in v0.3.0

func GetVideoInfo(value interface{}) (*VideoInfo, error)

GetVideoInfo fetches info from a url string, url object, or a url string

func GetVideoInfoFromID added in v0.3.0

func GetVideoInfoFromID(id string) (*VideoInfo, error)

GetVideoInfoFromID fetches video info from a youtube video id

func GetVideoInfoFromShortURL added in v0.5.1

func GetVideoInfoFromShortURL(u *url.URL) (*VideoInfo, error)

GetVideoInfoFromShortURL fetches video info from a short youtube url

func GetVideoInfoFromURL added in v0.3.0

func GetVideoInfoFromURL(u *url.URL) (*VideoInfo, error)

GetVideoInfoFromURL fetches video info from a youtube url

func (*VideoInfo) Download added in v0.3.0

func (info *VideoInfo) Download(format Format, dest io.Writer) error

Download is a convenience method to download a format to an io.Writer

func (*VideoInfo) GetDownloadURL added in v0.3.0

func (info *VideoInfo) GetDownloadURL(format Format) (*url.URL, error)

GetDownloadURL gets the download url for a format

func (*VideoInfo) GetThumbnailURL added in v0.3.0

func (info *VideoInfo) GetThumbnailURL(quality ThumbnailQuality) *url.URL

GetThumbnailURL returns a url for the thumbnail image with the given quality

Directories

Path Synopsis
cmd

Jump to

Keyboard shortcuts

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