#!/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