Skip to content

Instantly share code, notes, and snippets.

@ayoubzulfiqar
Created April 27, 2023 08:37
Show Gist options
  • Save ayoubzulfiqar/98a59b8102f6d350a14a72c98da94484 to your computer and use it in GitHub Desktop.
Save ayoubzulfiqar/98a59b8102f6d350a14a72c98da94484 to your computer and use it in GitHub Desktop.
This is simple golang script that download YOUTUBE Videos, Audios, as well as Playlist

YouTube Donwload Playlist

package main

import (
	"fmt"
	"log"

	"github.com/kkdai/youtube/v2"
)
// location to save your Videos in Windows directoray
var path string = "C:/Users/ayoubali/Downloads/Video"

func finish() {
	fmt.Println("download done")
}

func downloadSingleVideo() {
	var link string
	fmt.Print("Please enter the video URL: ")
	fmt.Scanln(&link)

	client := youtube.Client{}
	video, err := client.GetVideo(link)
	if err != nil {
		log.Fatalf("Error getting video: %v", err)
	}

	fmt.Printf("The video duration is:\n %v minutes\n -------------------\n", video.Duration.Minutes())
	stream, _, err := client.GetStream(video, &video.Formats[0])
	if err != nil {
		log.Fatalf("Error getting video stream: %v", err)
	}

	err = client.Download(stream, path, video.Title+".mp4")
	if err != nil {
		log.Fatalf("Error downloading video: %v", err)
	}

	finish()
}

func downloadAudio() {
	var link string
	fmt.Print("Please enter the video URL: ")
	fmt.Scanln(&link)

	client := youtube.Client{}
	video, err := client.GetVideo(link)
	if err != nil {
		log.Fatalf("Error getting video: %v", err)
	}

	fmt.Printf("The audio duration is:\n %v minutes\n -------------------\n", video.Duration.Minutes())
	stream, _, err := client.GetStream(video, &video.Formats[len(video.Formats)-2])
	if err != nil {
		log.Fatalf("Error getting audio stream: %v", err)
	}

	err = client.Download(stream, path, video.Title+".mp3")
	if err != nil {
		log.Fatalf("Error downloading audio: %v", err)
	}

	finish()
}

func downloadPlaylist() {
	var playlistLink string
	fmt.Print("Please enter the playlist URL: ")
	fmt.Scanln(&playlistLink)

	client := youtube.Client{}
	playlist, err := client.GetPlaylist(playlistLink)
	if err != nil {
		log.Fatalf("Error getting playlist: %v", err)
	}

	for _, video := range playlist.Videos {
		stream, value, err := client.GetStream(video, &video.Formats[0])
		if err != nil {
			log.Printf("Error getting video stream for %v: %v", value+1, video.Title, err)
			continue
		}

		err = client.Download(stream, path, video.Title+".mp4")
		if err != nil {
			log.Printf("Error downloading video %v: %v", video.Title, err)
			continue
		}
	}

	finish()
}

func main() {
	var userInput string
	fmt.Println(`Choose, What do you want to download ?
	"s" => Single video
	"a" => Audio
	"l" => Playlist`)
	fmt.Scanln(&userInput)

	switch userInput {
	case "s":
		downloadSingleVideo()
	case "a":
		downloadAudio()
	case "l":
		downloadPlaylist()
	default:
		fmt.Printf(`sorry this command "%v" is not found`, userInput)
	}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment