#!/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 .
##############################################################################
# Requirements: youtube-dl, ffmpeg (with appropriate codec support)
# Usage: youtubedl ...
########################################################
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