ÈÐ Wïgê† Ðð† ñåmê

ïñ£ð§ê¢, ïñ£ðrmå†ïðñ §ê¢µr, Ðïgï†ål £ðrêñ§ï¢§, hå¢kïñg, §¥§†êm åÐmïñ阮rå†ïðñ, lïñµx ßlðg


Several people have asked me if I could create a playlist downloader similar to my single downloader.  I set out to do just that.

Here is the code


20120628 – added a check to validate if file already exists

[codesyntax lang=”bash”]

#!/bin/bash

# set -x

# By Ed Wiget
# This script automates downloading youtube video plylists and converting to mp3 file

# 20120625 - initial script based off of http://www.edwiget.name/2011/08/ge%E2%80%A0-%C2%A5d-%C2%A7hd%C2%A2k-dn/
# 20120628 - add a check to see if the name already exists and if so skips it

# you should do this sudo command and the svn rtmpdump commands below before running this script
# sudo apt-get install youtube-dl lame faad ffmpeg ffprobe

# for rtmp and librtmp do this:
# svn co svn://svn.mplayerhq.hu/rtmpdump rtmpdump
# cd rtmpdump/trunk
# make
# sudo make install

# set this variable to the location of your scripts:
BASE_DIR=~/scripts

# this sets the location of the python youtube-dl script, relative to above
YOUTUBE_DL=${BASE_DIR}/youtube-dl/youtube-dl

# this sets the path of the downloaded files and temp directory
DL_FILES=~/test-yt

# this sets the path to were the final mp3 is stored
MP3_LOCATION=~/Music

# this sets the location of the video file downloaded
VID_LOCATION=~/Videos

# this checks for the youtube-dl script and if it doesn't exist, it gets it
# if it does exist, it checks to make sure its the latest version
if [ ! -d ${BASE_DIR}/youtube-dl ]; then
	echo "grabbing the youtube-dl script"
	cd ${BASE_DIR}
	git clone git://github.com/rg3/youtube-dl.git youtube-dl
	chmod 700 ${BASE_DIR}/youtube-dl/youtube-dl
else
	echo -e "youtube-dl already exists\n\nMaking sure we have the latest version"
	${YOUTUBE_DL} -U
	chmod 700 ${BASE_DIR}/youtube-dl/youtube-dl
fi

# this checks to make sure we have ffmpeg and lame installed, and if not, grabs them
FFMPEG1=`which ffmpeg | wc -l`
LAME1=`which lame | wc -l`

if [ ${FFMPEG1} = 1 ]; then
	echo "ffmpeg already exists"
else
	echo "grabbing ffmpeg"
	# for ubuntu based distros, use this line
	sudo apt-get install ffmpeg
	# for redhat based distros, use this line
	#sudo yum install ffmpeg
fi

if [ ${LAME1} = 1 ]; then
	echo "lame already exists"
else
	echo "grabbing lame"
	# for ubuntu use this line
	sudo apt-get install lame
	# for redhat use this line
	# sudo yum install lame
fi

# next we ask the user for the video file, it should be in format like:
# http://www.youtube.com/playlist?list=PL4E71AC1BFE99D171
echo -e "What is the video playlist to download, ie. http://www.youtube.com/playlist?list=PL4E71AC1BFE99D171"
read VIDEO_URL

echo "You entered ${VIDEO_URL} is this correct? ( y / n )"
read ANS
	if [ ${ANS} = "y" ]; then
		wget -O /tmp/playlist.output ${VIDEO_URL} 

			for i in `cat /tmp/playlist.output | grep --color=auto -E 'watch\?v=' | cut -d '=' -f3 | sed 's/&list//g' | grep -iv "hid"`; do
				URL="http://www.youtube.com/watch?v=$i"
				cd ${DL_FILES}
				# grab the song title
				SONG_TITLE=`${YOUTUBE_DL} --get-title ${URL}`
				echo -e "the song title is ${SONG_TITLE}"
                                # here we check if the song already exists, if so it skips it....
                                SONGCHK=`ls ${MP3_LOCATION}/"${SONG_TITLE}"* | wc -l`
                                if [ "${SONGCHK}" -ge "1" ]; then
                                        echo "song already exists....."
                                else
				# downloading video
				echo "downloading video....please wait"
				${YOUTUBE_DL} ${URL}
				# we need to convert the dl url to a filename for later processing
				# the url is like:  http://www.youtube.com/watch?v=6E2hYDIFDIU 
				# the downloaded file will be 6E2hYDIFDIU.mp4
				MP4_FILE=`echo ${URL} | awk -F/ '{print$4}' | awk -F= '{print$2}'`
				# get the downloaded file extension
				FILE_EXT=`ls ${DL_FILES}/${MP4_FILE}* | awk -F. '{print$2}'`
				echo "your video is located in ${DL_FILES}/${MP4_FILE}.${FILE_EXT}"
				echo ""
				echo "converting ${DL_FILES}/${MP4_FILE}.${FILE_EXT} to wav.....please wait"
				# ffmpeg -i 6E2hYDIFDIU.flv 6E2hYDIFDIU.wav
				ffmpeg -i ${DL_FILES}/${MP4_FILE}.${FILE_EXT} ${DL_FILES}/"${SONG_TITLE}".wav
				echo "video converted to wav file....converting wav to mp3"
				lame -b 128 ${DL_FILES}/"${SONG_TITLE}".wav ${MP3_LOCATION}/"${SONG_TITLE}".mp3
				echo "${SONG_TITLE} is now available at ${MP3_LOCATION}/${SONG_TITLE}.mp3"
				# added 20110813
				# check to see if video is mp4, if so, mv to Music folder.  If not, convert to mp4 then move.
					if [ "`echo ${FILE_EXT}`" = "mp4" ]; then
       					echo -e "\n\nmoving video download file ${DL_FILES}/${MP4_FILE}.${FILE_EXT} to ${VID_LOCATION}/${SONG_TITLE}.${FILE_EXT}"
       					mv ${DL_FILES}/${MP4_FILE}.${FILE_EXT} ${VID_LOCATION}/"${SONG_TITLE}".${FILE_EXT}
       					echo "video file is now at ${VID_LOCATION}/"${SONG_TITLE}".${FILE_EXT}"
					else
						echo -e "converting ${DL_FILES}/${MP4_FILE}.${FILE_EXT} to ${DL_FILES}/${MP4_FILE}.mp4....please wait"
						ffmpeg -i ${DL_FILES}/${MP4_FILE}.${FILE_EXT} ${DL_FILES}/${MP4_FILE}.mp4
						mv ${DL_FILES}/${MP4_FILE}.mp4 ${VID_LOCATION}/"${SONG_TITLE}".mp4
						echo "video file is now at ${VID_LOCATION}/"${SONG_TITLE}".mp4"
					fi
                echo -e "\n\ndone .... and enjoy"
                                   fi
			done
	else
		echo "there was an error...."
		exit
	fi		
echo "all done.....enjoy"

[/codesyntax]


Leave a Reply