Contenu | Rechercher | Menus

Annonce

L'équipe des administrateurs et modérateurs du forum vous invite à prendre connaissance des nouvelles règles.
En cas de besoin, vous pouvez intervenir dans cette discussion.

Ubuntu 18.04 LTS
Ubuntu-fr propose des clés USB de Ubuntu et toutes ses « saveurs » ainsi qu'un magnifique t-shirt pour cette toute nouvelle version d'Ubuntu !

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 06/05/2018, à 16:52

Lulux3

Télécharger et "en même temps" Encoder une Webvidéo: TEW.sh

Bonjour
J'utilise youtube-dl pour télécharger des vidéos, que je réencode en x265 pour économiser de l'espace disque.
Il est possible, grâce à ffmpeg, de réaliser l'encodage à la volée, ce qui économise pas mal de temps lorsqu'on a une connection un peu lente.
Cette manip est assez fastidieuses en ligne de commande, alors je me suis fait un petit script interactif pour simplifier tout ça.
Il se contente d'une url en paramètre (et en option un fichier de destination). Il récupère les données (dont les sous-titres si disponibles) avec youtube-dl, puis affiche un résumé.
On peut alors modifier chaque paramètre: choix de la qualité de la vidéo principale, choix des soustitres, ajouter un flux ou un fichier à muxer, mappage, et bien entendu codecs, destination et format.
Lorsque tout est OK, on lance le processus d'encodage, mais il est aussi possible de simplement télécharger les flux sélectionnés.
On peut donc en une seule opération, obtenir par exemple une vidéo multilingue avec sous-titres, encodée en x265.
Testé avec succès sur Arte et  France-tv, mais cela devrait marcher sur bien d'autres sites (en fait tous les sites sur lesquels youtube-dl est fonctionnel, dont bien sûr youtube)
Installation:
- Prérequis: youtube-dl et ffmpeg doivent être installés (dispos dans les dépots officiels).
- Copier le texte ci-dessous dans un éditeur de texte
- Adapter les paramètres (lignes 5à15) selon vos préférences.
- Sauver, de préférence dans un répertoire dédié, sous le nom: TEW.sh, et donner le droit d'exécution.
Utilisation:
- Se rendre sur la page de la vidéo souhaitée, et copier l'url dans le presse papier,
- Ouvrir un terminal dans le répertoire où se trouve le script,
- Taper la commande:

./TEW.sh <url> [destination]

- Vérifier les options résumées, et corriger si nécessaire en suivant les instructions
- Lorsque tout est OK, taper P pour lancer le processus, ou T pour un téléchargement classique

N'hésitez pas à me faire part de vos remarques.

Le script :
édit mis à  jour le 12/05/2018

#!/bin/bash
# Téléchargement et Encodage simultané de Webvidéo.
# utilise youtube-dl (téléchargement) et ffmpeg (encodage).
# Mise à jour le 12 mai 2018
# Usage: ./TEW.sh <url>

# Variables de couleur
	export DataCoul="\e[1;32m"
	export SurCoul="\e[1;31;47m"
	export NoCoul="\e[0m"
# Options vidéos par défaut (changer à vos risques):
	VideoCodec="hevc -preset veryfast -crf 26 -x265-params info=false"
	AudioCodec="copy"
	SubCodec="subrip"
	SubLang="fr"
	VidFormat="mkv"
	VidQual="best"
	AltMap="a s"
	StreamTags="a:0 -l=fr a:0 -t=VF a:1 -t=VO s:0 -l=fr"
# Options Youtube-dl à conserver:
	YdlOpt="--restrict-filenames --prefer-ffmpeg --ignore-config"
# Noms de fichiers:
	ScriptName="Perm.tew"
	TempScriptName="Temp.tew"


#Fonction de selection et de nettoyage du répertoire
#Renomme les fichiers selectionnée avec en supprimant les espaces
SelRen_Files ()
{
	Crit=$1
	n=1
	TmpList=$(ls -1 | grep -h "$Crit")
	ModList=""
	while read Line
	do
		ModLine=$(echo "${Line}" | sed -e 's/[[:blank:]/&,]/_/g')
		if [[ ! "${Line}" == "${ModLine}" ]]
		then mv "${Line}" "${ModLine}"
		fi
	done <<< $TmpList
	ModList=$(ls -1 | grep -h -n "$Crit")
	echo "${ModList}"
}

# Récupération des données et soustitres
	echo -e "#Liste éphémère de tâches TEW" > $TempScriptName
	url=$1
	while [[ ! ${url} == "" ]]
	do
		Saisie=$(youtube-dl $YdlOpt $url --get-id)
		if [[ ${#Saisie} -eq 0 ]]
		then read -p "impossible de résoudre cette URL"
			url=""
		else
			if [[ ! "${Saisie}" == "${VidId}" ]]
			then 
				VidId=$Saisie
				download_url=$(youtube-dl $YdlOpt -f $VidQual $url -g)
					if [[ "${#download_url}" -eq 0 ]]
					then echo "Format ${VidQual} indisponible: utiliser le format par défaut" 
						download_url=$(youtube-dl $YdlOpt $url -g)
						VidQual="best"
					fi
				if [[ ! "${AltSource}" == "" ]]
				then
					if [[ ! "$AltSource" == "$AltUrl" ]]
					then AltUrl=$(youtube-dl $YdlOpt -f $AltSource $url -g)
						if [[ "${#AltUrl}" -eq 0 ]]
						then read -p "[Info]: Qualité ${AltSource} indisponible: sélectioner manuellement [OK]"
							AltSource=""
							AltUrl=""
						fi
					else read -p "Confirmer la sélection du fichier complémentaire ${AltSource} (O,N)" $Saisie
						if [[ $(echo "${Saisie}" | grep '[OoYy]' ) == "" ]]
						then AltSource=""
							AlTUrl=""
						fi
					fi
				fi
				youtube-dl $url $YdlOpt "--write-sub" "-o" "%(id)s.%(ext)s" "--all-subs" "--skip-download" 
				VidName=$(youtube-dl $YdlOpt $url -e)
				ExtFiles=$(SelRen_Files "${VidId}") 
				read SubFile <<< $(echo "${ExtFiles}" | grep -h "\."$SubLang"\.")
				SubFile=$(echo $SubFile | sed -e 's/^[0-9]*://')
				Tag0=$(echo ${VidName} | sed -e 's/[[:blank:]/&,]/_/g')
				VidDest="${Tag0}-${VidId}.${VidFormat}"
			else
				ExtFiles=$(SelRen_Files "${VidId}")	
			fi

# Résumé et choix
			Saisie=""
			Key=""
			while [[ $(echo "$Key" | grep '[PpYyRr]') == "" ]]
			do
				echo "=============================================="
				echo -e "Résumé des paramètres:"
				echo -e "Nom de la vidéo: ${DataCoul} ${VidName}"
				echo -e "${NoCoul}Vidéo ID       : ${DataCoul}" $VidId
				echo "----------------------------------------------"
				echo -e "${SurCoul}F${NoCoul}ormat      : ${DataCoul} $VidQual${NoCoul}"
				echo -e "Fichiers homonymes trouvés:"
				echo -e "${DataCoul}${ExtFiles}${NoCoul}"
				echo -e "Source complémentaire: fichier ${SurCoul}n°${NoCoul} ou ${SurCoul}Q${NoCoul}ualité. (Aucune = ${SurCoul}0${NoCoul}):\n${DataCoul}$AltSource${NoCoul}" 
				echo -e "${SurCoul}M${NoCoul}appage de la source complémentaire: ${DataCoul}$AltMap${NoCoul}" 
				echo -e "Fichier de so${SurCoul}U${NoCoul}s-titres: ${DataCoul}$SubFile${NoCoul}"
				echo -e "----------------------------------------------"
				echo -e "Codec ${SurCoul}V${NoCoul}idéo et paramètres: ${DataCoul}$VideoCodec${NoCoul}" 
				echo -e "Codec ${SurCoul}A${NoCoul}udio et paramètres: ${DataCoul}$AudioCodec${NoCoul}" 
				echo -e "Codec ${SurCoul}S${NoCoul}oustitres         : ${DataCoul}$SubCodec${NoCoul}" 
				echo -e "${SurCoul}D${NoCoul}estination de la vidéo  : ${DataCoul}$VidDest${NoCoul}"
				echo -e "${SurCoul}T${NoCoul}ags des flux de sortie  : ${DataCoul}$StreamTags${NoCoul}"  
				echo "=============================================="
				echo -e "\e[1;5;32mF n° Q 0 M U V A S D T ${NoCoul}: modifier un paramètre,"
				echo -e "\e[1;5;32mP${NoCoul} [-option]: lancer le processus (ffmpeg)"
				echo -e "\e[1;5;32mY${NoCoul} [-option]: téléchargement simple (youtube-dl"
				echo -e "Options:\n${DataCoul}-a${NoCoul}: afficher la commande\n${DataCoul}-s${NoCoul}: ajouter à la liste de tâches"
				#NON IMPLEMENTE: "\n${DataCoul}-x${NoCoul}: exécuter dans un nouveau terminal"
				echo -e "\e[1;5;32mR${NoCoul}: Sortir"
				read -p "votre choix [P]: " Key Opt
				if [[ ${#Key} -eq 0 ]]
				then Key="P"
				fi
				case $Key in
					[0-9]*)
						AltSource=$(echo "$ExtFiles" | grep -h "$Saisie:" | sed -e 's/[0-9]*://g')
						AltUrl=$AltSource
					;;
					"F"|"f")
						youtube-dl "-F" $url
						read -p "sélectionner le code format (Source principale): " Saisie
						VerSaisie=$(youtube-dl $YdlOpt "-f" "$Saisie" "-g" $url)
						if [[ ! "$VerSaisie" == "" ]]
						then download_url=$VerSaisie
							VidQual=$Saisie
						else echo "impossible de trouver une URL pour cette source"
						fi
					;;
					"Q"|"q")
						youtube-dl "-F" $url
						read -p "sélectionner le code format (Source complémentaire): " Saisie
						VerSaisie=$(youtube-dl $YdlOpt "-f" "$Saisie" "-g" $url)
						if [[ ! "$VerSaisie" == "" ]]
						then AltSource=$Saisie
							AltUrl=$VerSaisie
						else echo "impossible de trouver une URL pour cette source"
						fi
					;;
					"M"|"m")
						read -p "sélectionner le(s) flux à mapper: [A]udio, [V]idéo, [Soustitres]): " Saisie
						Saisie=$(echo "${Saisie,,}" | grep -o -E -e '-?[vas](:[0-9]*)?' | tr "\n$" "\ ")				
						if [[ ! $Saisie == "" ]]
						then AltMap=$Saisie
						fi
					;;
					"U"|"u")
						read -p "saisir le filtre de langue (fr, en, etc..) " Filtre
						VerSaisie=$(echo "$ExtFiles" | grep -i "\."${Filtre}"\.")
						if [[ ! "$VerSaisie" == "" ]]
						then SubLang=$Saisie
							echo -e "${DataCoul}${VerSaisie}${NoCoul}"
							read -p "saisir le n° d'un fichier dans la liste ci-dessus (0 pour aucun) " Saisie
							if [ $Saisie == "0" ]
							then SubFile=""		
							else
								VerSaisie=$(echo "$VerSaisie" | grep -h "$Saisie:" | sed -e 's/^[0-9]*://')
								if [[ ! "$VerSaisie" == "" ]]
									then SubFile=$VerSaisie
									else echo "pas de fichier correspondant"
								fi
							fi
						else  echo "pas de fichier correspondant"
						fi
					;;
					"V"|"v")
						read -p "saisir le codec vidéo et ses paramètres: " Saisie
						if [[ ! "$Saisie" == "" ]]
						then VideoCodec=$Saisie
						fi
					;;
					"A"|"a")
						read -p "saisir le codec audio et ses paramètres: " Saisie
						if [[ ! "$Saisie" == "" ]]
						then AudioCodec=$Saisie
						fi			
					;;
					"S"|"s")
						read -p "saisir le codec soustitre et ses paramètres: " Saisie
						if [[ ! "$Saisie" == "" ]]
						then SubCodec=$Saisie
						fi			
					;;
					"D"|"d")
						read -p "saisir le nom du fichier de sortie: " Saisie
						if [[ ! "$Saisie" == "" ]]
						then VidDest=$(echo "$Saisie" | sed -e 's/[[:blank:]/&,]/_/g')
						fi
					;;
					"T"|"t")
						echo -e "ajouter un flux à tagger: [A]udio(:n) [V]idéo(:n), [S]oustitres(:n)"
						echo -e "et un tag à associer: -l=<langue>, -t=<Titre> ou [E]ffacer"
						read  Saisie Opt
						Saisie=$(echo "${Saisie,,}" | grep -o -E -e "([vas](:[0-9]*)?).*")
						if [[ ! "${Saisie}" == "" ]]
						then							
							if [[ $(echo ${Opt} | grep -o -E -e '^[Ee]') == "" ]]
							then Opt=$(echo "${Opt}" | sed -r 's/[[:blank:]]/_/g' | grep -o -E -e "-[LlTtl]=[^,]*")
								while read tag 
								do	
									if [[ ! ${#tag} -eq 0 ]]
									then 
										StreamTags="${StreamTags} ${Saisie} ${tag}"
									fi
								done <<< "${Opt}"
							else
								StreamTags=$(echo ${StreamTags} | sed -E "s/${Saisie}(:[0-9]*)?(\ -[LlTt]=[^ ]*)?//g")
							fi						
						fi
					;;
					
					[Pp]*)
						Command="ffmpeg -y -i ${download_url}"
						Map="-map 0"
						Tags=$(echo "${StreamTags}" | sed -E 's/[vas](:[0-9]*)? *-[lLtT]/-metadata:s:&/g' | sed -E 's/-[Ll]=/language=/g' | sed -E 's/-[Tt]=/title=/g')								
						Tags="-metadata title=${Tag0} ${Tags}"
						if [[ ! "${#AltUrl}" -eq 0 ]]
						then
							Saisie=$(echo $AltMap | sed 's/[vas]/1:&/g' | sed -E 's/(-?1:[vas](:[0-9]*)?)/-map &?/g')
							Map="${Map} ${Saisie}"
						
							Command="$Command -i ${AltUrl}"
							n=2
						else n=1
						fi					
						if [[ ! $SubFile == "" ]]
						then
							Command="$Command -i ${SubFile}"
							Map=$Map" -map $n:s?"
						fi
						Command="$Command $Map $Tags -c copy -c:a $AudioCodec -c:s $SubCodec -c:v:0 $VideoCodec ${VidDest}"
					;;
					[Yy]*)
						if [[ ! "$AltSource" == "$AltUrl" ]]
						then VidQual="$VidQual,$AltSource"
						fi
						Command="youtube-dl -o '%(title)s-%(id)s-%(format)s.%(ext)s' -f ${VidQual} ${url}"
					;;
				esac
			done
			case $Opt in
				"-A"|"-a")	
					echo -e "\n${SurCoul}${Command}${NoCoul}\n"
				;;
				"-S"|"-s")	
					if [[ ! ${#Queue} -eq 0 ]]
					then Queue=$Queue"\n"
					fi
					Line="#["$(date '+%D_%H:%M:%S')"]\n${Command}"
					Queue="${Queue}""${Line}"
					echo -e $Line >> $TempScriptName
				;;
				*)
					${Command}
				;;
			esac		
		fi
		Command=""
		Key="0"
		until [[ $Key == "" ]]
		do
			echo "=============================================="
			if [[ ! ${#Queue} -eq 0 ]]
			then
				echo -e "\e[1;5;32mA${NoCoul}fficher la liste de tâches"
				echo -e "\e[1;5;32mV${NoCoul}ider la liste de tâches"
				echo -e "\e[1;5;32mC${NoCoul}réer un script avec la liste des tâches"
				if [ -f $ScriptName ]
				then
					echo -e "\e[1;5;32mS${NoCoul}auver la liste à la fin du script existant"
				fi
				echo -e "e\e[1;5;32mX${NoCoul}écuter la liste des tâches"
			fi
			echo -e "\e[1;5;32mQ${NoCoul}uitter"	
			read -p "votre choix, <nouvelle url> ou [Retour]: " Key
			case $Key in
				"A"|"a")	
					echo -e "\n${SurCoul}${Queue}${NoCoul}\n"
				;;
				"V"|"v")	
					Queue=""
					rm $TempScriptName
				;;
				"C"|"c")
					echo -e "#Liste des tâches TEW" >> $ScriptName	
					echo -e "${Queue}" >> $ScriptName
					chmod "a+x" ${ScriptName}
					echo -e "Le script ${DataCoul}${ScriptName}${NoCoul} a été créé"
				;;
				"S"|"s")
					echo -e "${Queue}" >> $ScriptName
					echo -e "Le script ${DataCoul}${ScriptName}${NoCoul} a été mis à jour"
				;;
				"X"|"x")
					chmod "a+x" ${TempScriptName}
					echo -e "\e[1;5;32mFonction non implémentée.${NoCoul}\nSolution provisoire:"
					echo -e "- Ouvrir Nautilus sans fermer ce terminal"
					echo -e "- Naviguer vers le fichier ${DataCoul}$TempScriptName${NoCoul}"
					echo -e "- Choisir ${DataCoul}Lancer dans un Terminal${NoCoul}"
					read -p "[Retour]" 
				;;
				"Q"|"q")
					exit
				;;
				*)
					if [[ ! ${#Key} -eq 0 ]]
					then url="${Key}"
						Key=""
					fi
				;;
			esac
		done		
	done

Dernière modification par Lulux3 (Le 13/05/2018, à 16:48)

Hors ligne

#2 Le 12/05/2018, à 22:28

Lulux3

Re : Télécharger et "en même temps" Encoder une Webvidéo: TEW.sh

Bonjour
Je viens de poster une mise à jour assez sympa:
- L'ensemble du processus prend place dans une boucle: on garde donc tous les paramètres après l'éxécution, même en cas de plantage de ffmpeg ou ydl.
- On peut changer l'url et relancer un traitement avec les mêmes paramètres (ou pas): pratique pour les séries par exemple.
- On peut opter pour une mise en queue au lieu d'une exécution immédiate: pas besoin d'attendre pour préparer la tâche suivante.
- Le mappage reconnait les "stream-specifiers" de ffmpeg de la forme [-]{a,v,s}[:n]
- Les métadonnées peuvent être ajoutées aux flux.

Hors ligne