|
#!/bin/env bash
|
|
|
|
# Download multiple Youtube videos and convert them
|
|
# Copyright (C) 2019 Pekka Helenius
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
##############################################################################
|
|
|
|
# Requirements: youtube-dl, ffmpeg (with appropriate codec support)
|
|
|
|
# Usage: youtubedl <video_1_url> <video_2_url> ... <video_n_url>
|
|
|
|
########################################################
|
|
|
|
DOWNLOAD_DIR=$HOME/Videos
|
|
|
|
########################################################
|
|
|
|
echo -e "\nNumber of videos:\t$#"
|
|
echo -e "Download destination:\t$DOWNLOAD_DIR"
|
|
|
|
CNT=0
|
|
|
|
for p in ${@}; do
|
|
VIDEOARRAY[$CNT]=$p
|
|
|
|
for video_url in "${VIDEOARRAY[$CNT]}"; do
|
|
|
|
echo -e "\n[$((1 + $CNT))] Video download URL:\t$video_url"
|
|
|
|
read INPUT_FILENAME <<< $(youtube-dl --get-filename --no-warnings --restrict-filenames -o "%(title)s.%(ext)s" $video_url | sed 's/\.[^.]*$//')
|
|
|
|
if [[ ! -z $INPUT_FILENAME ]]; then
|
|
echo -e "[$((1 + $CNT))] Video name:\t\t$(echo $INPUT_FILENAME)"
|
|
youtube-dl --restrict-filenames -o "$DOWNLOAD_DIR/%(title)s.%(ext)s" $video_url
|
|
|
|
#Sometimes we get invalid suffix for a file with youtube-dl name command (for example mkv file is stated as mp4 by youtube-dl). To circumvent this problem, find the real file with correct suffix and add it to an array for ffmpeg to process
|
|
TRUNAME=$(ls $DOWNLOAD_DIR | grep "$INPUT_FILENAME")
|
|
|
|
VIDEONAMES[$CNT]=$TRUNAME
|
|
|
|
fi
|
|
|
|
done
|
|
let CNT++
|
|
done
|
|
|
|
for converted in $(echo "${VIDEONAMES[*]}"); do
|
|
echo -e "Converting $converted"
|
|
|
|
OUTPUT_FILEFORMAT='mp4'
|
|
OUTPUT_FILE=$(echo "$converted" | sed "s/\.\w*$/-converted.$OUTPUT_FILEFORMAT/")
|
|
|
|
#This makes sure we use mp4 suffix
|
|
OUTPUT_FILE_AFTER=$(echo "$converted" | sed "s/\.\w*$/.$OUTPUT_FILEFORMAT/")
|
|
|
|
ffmpeg -i "$DOWNLOAD_DIR/$converted" -acodec libopus -strict -2 -vcodec libx265 -pix_fmt yuv420p -x265-params crf=28:keyint=240:min-keyint=20 -preset:v veryslow -y "$DOWNLOAD_DIR/$OUTPUT_FILE"
|
|
|
|
rm $DOWNLOAD_DIR/$converted
|
|
|
|
echo -e "\n[$CNT] Conversion done."
|
|
mv $DOWNLOAD_DIR/$OUTPUT_FILE $DOWNLOAD_DIR/$OUTPUT_FILE_AFTER
|
|
done
|