J'ai besoin d'intimité. Non pas parce que mes actions sont douteuses, mais parce que votre jugement et vos intentions le sont.
5138 links
Youtube-dl n'est plus maintenu. Vive yt-dlp
Le code source de youtube-dl compresse dans 2 images... Dangereux mais malin.
Python 2 n'étant plus maintenu, il faut utiliser python3 et les outils qui vont avec, notamment pip3.
sudo apt install python3-pip
sudo pip3 install --upgrade youtube_dl
!!! ATTENTION !!! une erreur dans mon affichage fait que je suis obligé de mettre une espace :
address
et }
dans l'url youtube de la fonction ydlmp3
{
et 1:-
et 2:-
dans les attributions de variables.Pensez à les supprimer pour que ça fonctionne.
Edit : python2 n'étant plus maintenu, il faut utiliser python3 et ses outils dérivés (pip3 notamment)
#!/bin/bash
set -e -u -o pipefail
IFS=$'\n\t'
on_error() { echo "Error on or near line $1; exiting with status $2"; exit "$2"; }
trap 'on_error ${LINENO} $?' ERR
confirm()
{
read -r -p "${ 1 } [y/N] " response
case "$response" in
[yY][eE][sS]|[yY])
true
;;
*)
false
;;
esac
}
updateYoutubedl() {
#sudo curl -L https ://yt-dl.org/downloads/latest/youtube-dl -o /usr/local/bin/youtube-dl
#sudo chmod a+rx /usr/local/bin/youtube-dl
sudo -H pip3 install --upgrade youtube_dl
}
# Usage `ydlmp3 8WZEPtN8_f0 "Kina Grannis/New"` for record in "Musique/Kina Grannis/New" or
# `ydlmp3 8WZEPtN8_f0` for record in "Musique"
ydlmp3() {
readonly origin=$(pwd)
#default value is an empty string (because of ":-" notation)
local address=${ 1:-}
local dirname=${ 2:-}
cd ~/Musique/
if [ ! -z "${dirname}" ];
then
if [ ! -d "${dirname}" ];
then mkdir "${dirname}/"
fi
cd "${dirname}/"
fi
if confirm "Do you want to update ?"; then
updateYoutubedl
fi
echo "File will be recorded in \"$(pwd)\" folder"
youtube-dl --extract-audio --audio-format mp3 https ://www.youtube.com/watch?v="${address }"
cd "${origin}"
}
# Usage `ydlmovies 8WZEPtN8_f0 "dir"` for record in "~/Téléchargements/dir" or
# `ydlmovies 8WZEPtN8_f0` for record in "~/Téléchargements/"
ydlmovies() {
readonly origin=$(pwd)
local dirname=${ 1:-}
if [ ! -z "${dirname}" ];
then
cd ~/Téléchargements/
if [ ! -d "${dirname}" ];
then mkdir "${dirname}/"
fi
cd "${dirname}/"
else
cd ~/Téléchargements/
fi
if confirm "Do you want to update ?"; then
updateYoutubedl
fi
youtube-dl --batch-file "~/urls"
cd "${origin}"
if [ -f ~/urls ]; then
if confirm "Do you want to delete urls ?"; then
cat /dev/null > ~/urls
fi
fi
}
# Usage `ydlmp3list`
ydlmp3list() {
readonly origin=$(pwd)
local dirname=${ 1:-}
cd ~/Musique/
if [ ! -z "${dirname}" ];
then
if [ ! -d "${dirname}" ];
then mkdir "${dirname}/"
fi
cd "${dirname}/"
fi
if confirm "Do you want to update ?"; then
updateYoutubedl
fi
echo "File will be recorded in \"$(pwd)\" folder"
youtube-dl --extract-audio --audio-format mp3 --batch-file "~/urls"
cd "${origin}"
if [ -f ~/urls ]; then
if confirm "Do you want to delete urls ?"; then
cat /dev/null > ~/urls
fi
fi
}
Je place cela dans le fichier .bashrc
(ou .bash_ytdl
si dans le fichier .bashrc
j'ai mis le code suivant :
# Youtube-dl functions.
# You may want to put all your additions into a separate file like
# ~/.bash_ytdl, instead of adding them here directly.
if [ -f ~/.bash_ytdl ]; then
. ~/.bash_ytdl
fi
)
Pour les scripts ydlmovies
et ydlmp3list
, il faut avoir enregistré les urls des fichiers que l'on souhaite télécharger, dans un fichier urls
dans le dossier Home
(une ligne par url).
Merci. Je ne connaissais pas cette possibilité.
Une des choses que j'utilise le plus dans le gestionnaire de fichier de gnome/mate, c'est à dire respectivement Nautilus et Caja, ce sont les scripts.
Par ailleurs, pour télécharger une vidéo, sur youtube, twitter, pluzz, rutube, et plein d'autres sites, l'idéal c'est youtube-dl.
https://ytdl-org.github.io/youtube-dl/index.html
Alors à force de tout passer dans la console, j'ai un .bash_history un peu chargé. Pourquoi ne pas utiliser les scripts. Voilà comment faire.
Pour nautilus ça se passe là :~/.local/share/nautilus/scripts
Pour caja, ici : ~/.local/share/caja/scripts
Et pour nemo, c'est là : ~/.local/share/nemo/scripts
les dépendances : youtube-dl
, xclip
et notify-send
(optionnel)
Premier script : yt-clipboard
#!/bin/sh
sel=$(xclip -d ":0" -o -selection clipboard)
notify-send "youtube-dl $sel"
youtube-dl "$sel"
notify-send "Récuperation de la vidéo terminée"
Deuxième script : yt-selection
#!/bin/sh
sel=$(xclip -d ":0" -o -selection primary)
notify-send "youtube-dl $sel"
youtube-dl "$sel"
notify-send "Récuperation de la vidéo terminée"
Troisième script : yt-clipboard-mp3
#!/bin/sh
sel=$(xclip -d ":0" -o -selection clipboard)
notify-send "youtube-dl $sel"
youtube-dl --extract-audio --audio-format mp3 -l "$sel"
notify-send "Récuperation du mp3 terminée"
Les scripts sont à passer en exécutable.
Ensuite, il suffit de choisir le répertoire cible, copier l'url de la page où se trouve la vidéo, cliquer avec le bouton droit n'importe où dedans et dans le menu script, choisir le premier script.
Le 2e script utilise ce qui est en sélection (une adresse sélectionnée à la souris)
Le 3e script permet de transformer la vidéo en mp3
Edit : pour installer notify-send, il faut lancer la commande suivante :
sudo apt install libnotify-bin
Depends: youtube-dl, yad (0.28 or newer), jq, ffmpeg, wget (optional)
Placer tous les scripts (youtube-dl y compris) dans /usr/bin
Créer un fichier yad-ydl (ou le nom que vous voulez) dans ce même dossier.
Copier le code suivant (attention, à cause d'une erreur de parsage de mon shaarli, il faut supprimer l'espace après le https de la ligne 387)
#!/bin/bash
# NAME: YAD Youtube Downloader
#
# DESCRIPTION: youtube-dl frontend for YT videos
#
# This script is a fork of the script by "damo" from BunsenLabs
# MAINTAINER: Misko_2083 <Miloš Pavlović> June 2016
#
# June 2016
# New: Format selection dialog
# Multiprogress bars
# * Progress bar method is improved version of Glutanimate's yad_wget script
# * yad-wget <a href="https://github.com/Glutanimate/misc-scripts/blob/master/Internet/yad_wget">https://github.com/Glutanimate/misc-scripts/blob/master/Internet/yad_wget</a>
# New GUI with multi-download options
# Simultaneous downloads of videos
# Option to chose the number of simultaneous downloads
#
# August 2016
# New: Support for lists
# Auto-detection if a URL is a list or a video
# Option to download videos from a list
# An option to select all/none
# Improved: Format selection dialog data
#
# March 2017
# New: Progress bar while loading the format info
# Window icon is stored in the script
# Check for youtube-dl version
# Improved: Dialog Wording and appearance
# ***********************
# INITIALIZATION
# ***********************
declare -i SIMULTANEOUS
declare -i FIELDS
SVG='<''svg width="48" height="48" viewBox="0 0 245 245">
<radialGradient fx="5%" fy="5%" id="rg" r="65%">
<stop offset="0%" stop-color="white"/>
<stop offset="100%" stop-color="lightgray"/>
</radialGradient>
<radialGradient fx="5%" fy="5%" id="gr" r="65%">
<stop offset="0%" stop-color="#932420"/>
<stop offset="100%" stop-color="#CB322C"/>
</radialGradient>
<linearGradient id="lg" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#932420"/>
<stop offset="1" stop-color="#CB322C"/>
</linearGradient>
<rect width="235" x="5" y="5" fill="url(#rg)" rx="30"
height="235" ry="30" stroke="white" stroke-width="4"
stroke-opacity="0.4"/>
<rect width="215" x="16" y="115" fill="url(#gr)" rx="50"
height="115" ry="50" stroke="white" stroke-width="2"
stroke-opacity="0.4"/>
<g>
<text x="50%" y="42%" text-anchor="middle" stroke="none" fill="black"
font-family="Sans" font-size="90" font-weight="800">You</text>
<text x="50%" y="82%" text-anchor="middle" stroke="none" fill="white"
font-family="Sans" font-size="70" font-weight="800">Tube</text>
</g>
</svg>'
# Set GUI variables up
TITLE="YAD YouTube Downloader" # dialog title
# Progress dialog text
TEXT="<b>Downloads</b> in progress...
Cancel and Clean- removes *.part files
Cancel - Cancels the download"
ICON="/tmp/yt.svg"
if [ ! -f "$ICON" ]; then
echo "SVG file not found. Creating it."
echo "$SVG" > "$ICON"
fi
IMAGE="$ICON"
declare -i MODE
MODE=1 # Defaiult dialog mode: 0 - Multi, 1 - Manual
#Multy download dialog options
SIMULTANEOUS=2 # set default number of simultaneous downloads (1-5)
FIELDS=8 # number of URL fields
# List checkboxes (default mode) TRUE/FALSE
SELECT_ALL="TRUE"
# Set global variables (Do not change)
FORMAT="" # Set global variable for the format selection
ENTRY="" # Set global variable for the entry
# Check if yad is installed
if ! hash yad &>/dev/null;then
echo "yad has not been found"
echo "Install it first and run the script again"
exit
fi
# Check if youtube-dl is installed
if ! hash youtube-dl &>/dev/null;then
DLG=$(yad --form \
--borders=10 --image-on-top \
--text=" youtube-dl not found\n\n Install it first and run the script again" --button="gtk-ok:0" \
--center --title "$TITLE" --window-icon "$ICON" --image "$IMAGE" \
)
exit
fi
# Check if ffmpeg is installed
if ! hash ffmpeg &>/dev/null;then
DLG=$(yad --form \
--borders=10 --image-on-top \
--text=" ffmpeg not found\n\n Install it first and run the script again" --button="gtk-ok:0" \
--center --title "$TITLE" --window-icon "$ICON" --image "$IMAGE" \
)
exit
fi
# Check if jq is installed
if ! hash jq &>/dev/null;then
DLG=$(yad --form \
--borders=10 --image-on-top \
--text=" jq not found\n\n Install it first and run the script again" --button="gtk-ok:0" \
--center --title "$TITLE" --window-icon "$ICON" --image "$IMAGE" \
)
exit
fi
# ***********************
# END INITIALIZATION
# ***********************
# ***********************
# FUNCTIONS
# ***********************
# ------------------
function download()
# ------------------
{
# Download function
# Passed: $1 - TYPE
# $2 - URL
# $3 - COUNTER (to identify the bar)
# Checks if the TYPE is a playlist
# and adds apropriate option to UTYPE variable
if [[ "$1" == "playlist?list" ]]; then
UTYPE="--yes-playlist" # if a playlist
else
UTYPE="" # if a video
fi
cd "$SAVEDIR" # Changes current path
# Starts the download and pipes the output to a loop
# Loop is used to display the text in multi-progressbar
youtube-dl ${UTUBE} ${UTYPE} --newline -i -o "%(title)s-%(id)s.%(ext)s" "<a href="https://www.youtube.com/$1=$2"">https://www.youtube.com/$1=$2"</a>; 2>&1 \
| while read -r line; do
if [[ "$(echo $line | grep '[0-9]*%')" ]];then
percent=$(echo $line | awk '{print $2}')
if [[ ! "$(echo "${percent}" | grep "100")" ]]; then # do not print 100% yet in case of conversion (mp3) or playlist
echo "$3:${percent%.*}" # sends percentage to the progress bar
fi
fi
if [[ "$(echo $line | grep -E '\[download\]|\[ffmpeg\]')" ]];then
progress=$(echo $line | awk '{$1=""; print substr ($0, 0, 75)}')
echo "$3:#$progress" # sends text to the progressbar
fi
done
RET_YT="${PIPESTATUS[0]}"
if [[ "$RET_YT" = 0 ]]
then
echo "$3:100%"
echo "$3:#Download completed."
else
echo "$3:#Download error."
fi
}
# ------------------
function format_selection()
# ------------------
{
# Format selection
# Temp file to store the items for the list
res=$(mktemp --tmpdir ytlist.XXXXXXXX)
CNT=0
while [ $CNT -lt 1 ]; do
echo "5"
# Fetching available format data and redirecting to res temp file
youtube-dl -j --skip-download --all-formats "$YTEMP" --newline \
| jq -r '.format_id, .format, .ext,
if .vcodec == "none" then "audio only" else .vcodec end,
if .acodec == "none" then "video only" else .acodec end,
if .filesize == null then "" else .filesize/1024/1024 end' > $res
# Checks youtube-dl return status
if [[ ${PIPESTATUS[0]} -ne 0 ]]; then
yad --form \
--borders=10 --image-on-top \
--text="Available formats could not be retreived\nCheck your connection or update youtube-dl" --button="gtk-ok:0" \
--center --title "$TITLE" --window-icon "$ICON" --image "$IMAGE"
rm -f $res # rm temp file
main # go back
fi
# temp file for awk to write to
res2=$(mktemp --tmpdir ytlist.XXXXXXXX)
# awk converts every sixth line (if not empty) to two decimal places and adds MiB
awk '{if (NR % 6 == 0 && $1 !=""){printf("%.2f MiB\n", $1)} else {print $0}}' $res > $res2
cp -f $res2 $res
rm -f $res2
CNT=$(($CNT+1))
done | yad --progress --pulsate --center --title "$TITLE" --window-icon "$ICON" --image "$IMAGE" --auto-close \
--borders=10 --button="Cancel!gtk-no:1" --text="Downloading format info..."
RET=$?
case "$RET" in
0) # Continue
;;
1) # Canceled
rm -f $res2 # rm temp file
rm -f $res # rm temp file
main
;;
*)
rm -f $res2 # rm temp file
rm -f $res # rm temp file
main
;;
esac
# Calls format (list) selection dialog
FORMAT="$(yad --list --width=600 --height=500 --hide-column=1 --column="format" \
--column="format" --column="extension" --column=video --column="audio" --column="filesize" \
--button="back!back:2" --button="Refresh!reload:3" --button="Exit!gtk-cancel:1" --button="Download!gtk-ok:0" \
--window-icon="$ICON" --image="$IMAGE" --image-on-top \
--text "$FILENAME\nSelect a format to download" --borders=10 \
--center --title "$TITLE" --window-icon "$ICON" --image "$IMAGE" \
< "$res" )"
RET=$?
case "$RET" in
0) # Continue
;;
1) # Canceled
rm -f $res # rm temp file
exit
;;
2) # Back
rm -f $res # rm temp file
main
;;
3) # Refresh
rm -f $res # rm temp file
format_selection
;;
*) # Default
rm -f $res # rm temp file
exit
;;
esac
rm -f $res # rm temp file
FORMAT=$(echo "$FORMAT" | cut -d '|' -f 1)
if [[ -z $FORMAT ]];then
yad --text="You haven't selected a download format\nDo you want to return to the main window?" \
--borders=10 --form --button="No!gtk-cancel:1" --button="Yes!gtk-ok:0" \
--center --title "$TITLE" --window-icon "$ICON" --image "$IMAGE"
RET=$?
case "$RET" in
0) # Back
main
;;
*) # Cancelled
exit
;;
esac
fi
}
# ------------------
function list_selection()
# ------------------
{
# Temp file to store the items from a list
res=$(mktemp --tmpdir ytlist.XXXXXXXX)
youtube-dl -j --flat-playlist "<a href="https://www.youtube.com/playlist?list=${YTEMP}"">https://www.youtube.com/playlist?list=${YTEMP}"</a>; \
| jq -r '.title, .id' | sed '1~2s/^/'"$SELECT_ALL"'\n/' \
| yad --text='Select items to download' --list --checklist --column "Select" --column "Title" --column "Url" --no-markup \
--button="$(if [[ "$SELECT_ALL" = "TRUE" ]]; then echo Select None; else echo Select All; fi)!gtk-yes:4" \
--button="back!back:2" --button="Refresh!reload:3" --button="Exit!gtk-cancel:1" --button="Download!gtk-ok:0" \
--window-icon="$ICON" --image="$IMAGE" --image-on-top \
--borders=10 --width=600 --height=500 --print-column=3 --separator=" " \
--center --title "$TITLE" --window-icon "$ICON" --image "$IMAGE" > $res
RET=$?
case "$RET" in
0) # Continue
;;
1) # Canceled
rm -f $res # rm temp file
exit
;;
2) # Back
rm -f $res # rm temp file
main
;;
3) # Refresh
list_selection
;;
4) # Select All/None
if [[ "$SELECT_ALL" = "TRUE" ]]; then
SELECT_ALL="FALSE"
else
SELECT_ALL="TRUE"
fi
list_selection
;;
*)
rm -f $res # rm temp file
exit
;;
esac
# Checks if temp file is empty
if [[ ! -s "$res" ]];then
yad --text="At least one item needs to be selected\nDo you want to return to the main window?" \
--borders=10 --form --button="No!gtk-cancel:1" --button="Yes!gtk-ok:0" \
--center --title "$TITLE" --window-icon "$ICON" --image "$IMAGE"
RET=$?
case "$RET" in
0) # Back
rm -f $res # rm temp file
main
;;
*) # Canceled
rm -f $res # rm temp file
exit
;;
esac
fi
# Starts the download function
list_download
}
# ------------------
list_download()
# ------------------
{
i=0
TOTAL=$(wc -l "$res" | cut -d ' ' -f 1)
cd "$SAVEDIR"
while read -r line || [[ -n "$line" ]]; do
i=$(($i+1))
PERCENT=$(($i*100/${TOTAL})) # Calculates percentage
echo "#Downloading $i/$TOTAL: $line" # Writes to the progress-bar
youtube-dl ${UTUBE} --newline -i -o "%(title)s-%(id)s.%(ext)s" "<a href="https://www.youtube.com/watch?v=${line}"">https://www.youtube.com/watch?v=${line}"</a>; 2>&1 &
PID="$!"
wait "$PID"
echo "$PERCENT"
done < "$res" | yad --progress --center --text="Downloading list items" --title "$TITLE" --window-icon "$ICON" --image "$IMAGE" --auto-close \
--borders=10 --button="Cancel!gtk-no:1"
if (( $? == 1 ));then # Download canceled, so clean up
kill "$PID" &>/dev/null # Kills any running download process
notify-send -t 3000 --icon "dialog-info" "Download cancelled"
while read -r line || [[ -n "$line" ]]; do
rm "$(find "$SAVEDIR" -type f -name "*-$line.*" | grep part)" &>/dev/null # Finds & removes the part file
echo "#$line"
sleep "0.1"
done < "$res" | yad --progress --pulsate --center --title "$TITLE" --window-icon "$ICON" --image "$IMAGE" --auto-close \
--borders=10 --button="Cancel!gtk-no:1" --text="Cleaning part files"
fi
rm -f $res # rm temp file
exit # exit here
}
# ------------------
function download_format()
# ------------------
{
FILENAME="$(youtube-dl --get-filename "$1")" # Get filename
YTEMP="$1" # Temp variable
format_selection # Start format selection dialog
}
# ------------------
check_version()
# ------------------
{
wget --spider --user-agent="Mozilla/5.0 Gecko/20100101" --timeout=30 -q "<a href="https://rg3.github.io/youtube-dl/"">https://rg3.github.io/youtube-dl/"</a>; -O /dev/null
if [[ "$?" -ne "0" ]]; then
yad --text="Can't connect to youtube-dl server site\nMake sure the internet connection is up and active" \
--borders=10 --form --button="Ok!gtk-ok:0" \
--center --title "$TITLE" --window-icon "$ICON" --image "$IMAGE"
main
fi
ytdlcv=$(youtube-dl --version)
ytdllv=$(wget -O- -q "https ://rg3.github.io/youtube-dl/update/LATEST_VERSION")
if [[ "$ytdlcv" == "$ytdllv" ]]; then
yad --text="Installed version of youtube-dl - <b>$ytdlcv</b>\nAvailable version of youtube-dl - <b>$ytdllv</b>\n\nyoutube-dl is up-to-date" \
--borders=10 --form --button="Ok!gtk-ok:0" \
--center --title "$TITLE" --window-icon "$ICON" --image "$IMAGE"
else
yad --text="Installed version of youtube-dl - <b>$ytdlcv</b>\nAvailable version of youtube-dl - <b>$ytdllv</b>\n\nyoutube-dl update is available" \
--borders=10 --form --button="Ok!gtk-ok:0" \
--center --title "$TITLE" --window-icon "$ICON" --image "$IMAGE"
fi
}
# ------------------
dialog()
# ------------------
{
# Dialogs
if [[ "$MODE" = "0" ]]; then
OIFS=$IFS # save Internal Field Separator
IFS=$'\n' # separator is "\n" in returned choices
c=0
YADFIELD=()
while [[ ${c} -lt $FIELDS ]];do
c=$(($c+1))
YADFIELD+=($(echo "--field=<b>YouTube url\:</b> ${c}:NORM"; echo "")) # Store yad form fields in an array
done
ENTRY="$(yad --form --columns=1 --window-icon "$ICON" --center \
--borders=10 --title "$TITLE" --image "$IMAGE" --image-on-top \
--text "<b>Select a folder to download\n and paste URL(s) in the appropriate field(s)</b>" \
--button="Switch GUI!reload:2" $(if hash wget &>/dev/null;then echo "--button=youtube-dl:3";fi) \
--button="Exit!gtk-cancel:1" --button="Download!gtk-ok:0" \
--field="Enter Save directory:DIR" "$HOME/Downloads" \
--field="Download Options:CB" "Audio only (mp3)!Video (22/18/17)" \
--field="Simultaneous Downloads:NUM" "$SIMULTANEOUS!1..5!1" \
${YADFIELD[@]} \
)"
RET=$?
IFS=$OIFS # reset IFS back to default
case "$RET" in
0) # Continue
;;
1) # Canceled
exit
;;
2)
MODE=1
dialog
;;
3)
check_version
main
;;
*)
exit
;;
esac
elif [[ "$MODE" = "1" ]]; then
ENTRY="$(yad --form --columns=1 --window-icon "$ICON" --center \
--borders=10 --title "$TITLE" --image "$IMAGE" --image-on-top \
--text "<b>Select a folder to download\n and paste URL into the appropriate field</b>" \
--button="Switch GUI!reload:2" $(if hash wget &>/dev/null;then echo "--button=youtube-dl:3";fi) \
--button="Exit!gtk-cancel:1" --button="Download!gtk-ok:0" \
--field="Enter Save directory:DIR" "$HOME/Downloads" \
--field="Download Options:CB" "Custom!Audio only (mp3)!Video (22/18/17)" \
--field="Simultaneous Downloads:NUM" "1!1..1!1" \
--field="<b>YouTube url</b>:" "" \ # Only one url field for the Manual format selection
)"
RET=$?
case "$RET" in
0) # Continue
;;
1) # Canceled
exit
;;
2)
MODE=0
dialog
;;
3)
check_version
main
;;
*)
exit
;;
esac
fi
}
# ------------------
main()
# ------------------
{
while :; do
dialog # calls the main dialog
OIFS=$IFS # save Internal Field Separator
IFS="|" # separator is "|" in returned choices
i=0
retChoice=()
e=0
URLIST=()
for ret in $ENTRY;do
retChoice[$i]="$ret"
i=$(($i+1)) # iterate i
if [[ "$i" -gt 3 ]] && [[ "$ret" != "" ]];then # get form fields if they are not empty
retType="${ret%%'='*}" # trim to the '=', TYPE position
TYPE[$e]="${retType##*'/'}" # extract type, playlist or video
retUrl="${ret%%'&'*}" # trim to the '&' character, URL position
URLIST[$e]="${retUrl##*'='}" # extract filename
YADBARS="$YADBARS --bar=${URLIST[$e]}:NORM" # add bars to a yad multiprogress dialog
e=$(($e+1)) # iterate e
fi
done
IFS=$OIFS # reset IFS back to default
SAVEDIR=${retChoice[0]} # directory path
OPTION=${retChoice[1]}
case $OPTION in
"Video (22/18/17)")
UTUBE="-f 22/18/17"
;;
"Audio only (mp3)")
UTUBE="--extract-audio --audio-format mp3 --audio-quality 0"
;;
esac
MAXDLS=${retChoice[2]} # maximum number of simultaneous downloads
if [[ -z $SAVEDIR ]] || [[ ${#URLIST[@]} -eq 0 ]];then
yad --form --text="<b>Enter at least one url field\nand select a folder</b>" --borders=10 \
--center --title "$TITLE" --window-icon "$ICON" --image "$IMAGE" --button="gtk-ok:0"
else
break
fi
done
if [[ "$MODE" = "1" ]] && [[ "$OPTION" == "Custom" ]]; then
if [[ "${TYPE[@]}" == "watch?v" ]];then
for URL in ${URLIST[@]}; do
download_format "<a href="https://www.youtube.com/watch?v=$URL"">https://www.youtube.com/watch?v=$URL"</a>; # call format selection dialog
UTUBE="-f $FORMAT"
done
else
YTEMP="${URLIST[0]}"
list_selection
fi
fi
}
# ------------------
function progress()
# ------------------
{
OIFS=$IFS # save Internal Field Separator
IFS=" " # separator is " " in returned choices
COUNTER="1"
DYNAMIC_COUNTER="1"
PID=()
c=0
for URL in ${URLIST[@]}; do
if [[ "$DYNAMIC_COUNTER" = "$MAXDLS" ]] # only download n files at a time
then
download "${TYPE[$c]}" "$URL" "$COUNTER" & # pass TYPE, URL and COUNTER to download function
PID+=("$!") # gets process pid
max="$(($COUNTER-1))" # -1, since start counter is 1, and arrays begin at 0
MAX_PID=${PID[$max]} # sets the variable pid from array PID
wait $MAX_PID # wait until process with MAX_PID finishes
DYNAMIC_COUNTER="1" # reset dynamic counter
else
download "${TYPE[$c]}" "$URL" "$COUNTER" & # pass TYPE, URL and counter number to download function
PID+=("$!")
DYNAMIC_COUNTER="$(($DYNAMIC_COUNTER+1))" # iterate dinamic counter
fi
c=$(($c+1)) # iterate TYPE counter
COUNTER="$[$COUNTER+1]" # iterate counter
done | yad --multi-progress $YADBARS --title "$TITLE" --button="Cancel and Clean!gtk-close:1" --button="Cancel!gtk-close:0" \
--text "$TEXT" --center --window-icon "$ICON" --image "$IMAGE" --image-on-top --auto-close
if (( $? == 1 ));then # Download canceled, so clean up
for pid in ${PID[@]};do
kill $pid &>/dev/null # Kills any running download process
done
for url in ${URLIST[@]}; do
rm "$(find "$SAVEDIR" -type f -name "*-$url.*" | grep part)" &>/dev/null # Finds & removes the part file
done
notify-send -t 3000 --icon "dialog-info" "Download cancelled"
exit
fi
IFS=$OIFS # reset IFS back to default
}
# ***********************
# END FUNCTIONS
# ***********************
# ***********************
# MAIN
# ***********************
main # Calls the main loop
progress # Starts the download
# ***********************
# END MAIN
# ***********************
Une fois le code collé, rendre le fichier executable :
sudo chmod a+rx /usr/bin/yad-ydl
youtube-dl
is running in the background, but it is still sending output to your terminal, and producing quite a lot of it to inform you of its progress. There are a number of ways to change this, but you'll probably either want to make youtube-dl produce less output, or cause its output to be sent to a file (or discarded altogether) instead of appearing in your terminal.
Way 1: Run youtube-dl -q
to suppress status messages.
If you don't want to see the progress messages, you can pass the -q
flag (or --quiet
, which does the same thing) to the youtube-dl command:
youtube-dl -q https ://www.youtube.com/watch?v=NZ-ElsvYKyo &
You'd have to replace that URL with whatever you're trying to download, of course. Some messages may still be printed, including errors and warnings. But it's likely you want to see those.
If you don't want youtube-dl to produce any warnings, you can run youtube-dl with the --no-warnings
flag. I don't suggest doing that, though, unless you're sure that's what you want.
youtube-dl -q --no-warnings https ://www.youtube.com/watch?v=NZ-ElsvYKyo &
To learn more about the command-line options accepted by youtube-dl, you can run man youtube-dl or read its manual page online.
Way 2: Redirect standard output of youtube-dl to a file.
To append the output to dl.log in the current directory (you can name this what you want, and it will be created if it doesn't already exist), run:
youtube-dl https ://www.youtube.com/watch?v=NZ-ElsvYKyo >> dl.log&
If you want to overwrite dl.log instead of appending text to the end, use >
instead of >>
:
youtube-dl https ://www.youtube.com/watch?v=NZ-ElsvYKyo > dl.log &
Normal output will then be redirected to dl.log (or whatever file you tell it to use). Error output, however, will still be shown on your terminal. For example, when I ran that command, I got one warning printed to my terminal:
ek@Io:~$ youtube-dl https ://www.youtube.com/watch?v=NZ-ElsvYKyo >> dl.log &
[1] 14456
ek@Io:~$ WARNING: Requested formats are incompatible for merge and will be merged into mkv
Everything else went into the log file:
ek@Io:~$ cat dl.log
[youtube] NZ-ElsvYKyo: Downloading webpage
[youtube] NZ-ElsvYKyo: Downloading video info webpage
[youtube] NZ-ElsvYKyo: Extracting video information
[youtube] NZ-ElsvYKyo: Downloading MPD manifest
[download] Destination: Lecture 1 _ Topics in String Theory-NZ-ElsvYKyo.f244.webm
[download] 23.2% of 359.52MiB at 204.49KiB/s ETA 23:02ek@Io:~$
You can view the output with cat (as I've done above) at any time, to check the progress.
When you run youtube-dl without -q
, it produces output that is primarily meant for a terminal. This output includes control characters that tell a terminal to erase the previous progress message, so that it may be visually replaced with the new progress message. Some ways of viewing the file, like cat dl.log, will not show the "erased" messages or the control characters. They're still part of the file, though, and you can view them with some other utilities; for example, view dl.log works.
Way 2a: Redirect the output to /dev/null
to get rid of it.
If you want the output to just be discarded rather than saved in an actual file, then you can redirect it to /dev/null
:
youtube-dl https ://www.youtube.com/watch?v=NZ-ElsvYKyo > /dev/null &
With /dev/null
, it doesn't matter if you "overwrite" (>
) or "append" (>>
).
This is a handy technique in general, though probably unnecessary with youtube-dl. If you want to suppress progress, you can just run youtube-dl -q
instead.
Way 3: Redirect standard error, too.
Regular output and error output are separate. It's common for youtube-dl to produce both. The above method redirected only standard output. You can also redirect standard error. There's a lot you can do with redirection, including redirecting the two output streams to separate files. For our purposes here, I'll just show how to send both standard output and standard error to the same file:
youtube-dl https ://www.youtube.com/watch?v=NZ-ElsvYKyo &>> dl.log &
When I ran that, my shell showed only
[2] 15009
...and both regular output and error output appeared in dl.log:
ek@Io:~$ cat dl.log
[youtube] NZ-ElsvYKyo: Downloading webpage
[youtube] NZ-ElsvYKyo: Downloading video info webpage
[youtube] NZ-ElsvYKyo: Extracting video information
[youtube] NZ-ElsvYKyo: Downloading MPD manifest
WARNING: Requested formats are incompatible for merge and will be merged into mkv.
[download] Destination: Lecture 1 _ Topics in String Theory-NZ-ElsvYKyo.f244.webm
[download] 0.0% of 359.52MiB at 107.65KiB/s ETA 56:59ek@Io:~$
The above example used &>>
, which appends to dl.log. To overwrite the file instead, use &>
(or >&
, which also works) instead of &>>
:
youtube-dl https ://www.youtube.com/watch?v=NZ-ElsvYKyo &> dl.log &
Way 3a: Redirect both normal and error output to /dev/null
.
If you really want to, you can redirect both standard output and standard error to /dev/null
so it is all simply discarded:
youtube-dl https ://www.youtube.com/watch?v=NZ-ElsvYKyo &> /dev/null &
You probably want to see actual error messages, though. If it's just status messages and warnings you don't want, then you don't need any redirection. In that case you can use youtube-dl -q --no-warnings
as described above. (See Way 1.)
Ouvrir votre fichier .bashrc
situé dans votre dossier personnel (/home/votreprofil) avec votre éditeur préféré et ajoutez le code suivant :
(Mon éditeur Markdown ne fonctionnant pas bien, supprimez l'espace entre le https
et le :
du reste de l'adresse youtube)
ydlmp3() {
origin=$(pwd)
cd ~/Musique/
if [ ! -z "$2" ]
then
if [ ! -d "$2" ]
then mkdir "$2/"
fi
cd "$2/"
fi
echo "File will be recorded in \"$(pwd)\" folder"
youtube-dl --extract-audio --audio-format mp3 https ://www.youtube.com/watch?v="$1"
cd "$origin"
}
Exemples d'utilisation :
Pour créer le dossier ~/Musique/Snarky Puppy et télécharger le morceau situé à l'adresse https://www.youtube.com/watch?v=NJvekPJ9rCI
ydlmp3 NJvekPJ9rCI "Snarky Puppy"
La même chose mais pour le télécharger dans le dossier ~/Musique sans créer de sous-dossier :
ydlmp3 NJvekPJ9rCI
Placer dans un fichier (que l'on nommera "urls" pour l'exemple), les urls à télécharger. Puis lancer la commande :
youtube-dl --batch-file urls
dans le dossier dans lequel vous souhaitez que vos films soient sauvegardés.
Pour paramétrer youtube-dl.
youtube-dl --extract-audio --audio-format mp3 <a href="https://www.youtube.com/watch?v=kfVsfOSbJY0">https://www.youtube.com/watch?v=kfVsfOSbJY0</a>
Merci pour l'astuce