Vous n'êtes pas identifié(e).
L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT →
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Prochaine révision Les deux révisions suivantes | ||
utilisateurs:slyfox:scripts:accueil [31/07/2018 13:14] Slyfox [Sylmedia] |
utilisateurs:slyfox:scripts:accueil [07/09/2019 10:57] smolski [Installation] |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ====== Slymedia ====== | ||
- | ====== Sylmedia ====== | + | * Objet : Script Slymedia |
- | + | ||
- | * Objet : | + | |
* Niveau requis : {{tag>débutant}} | * Niveau requis : {{tag>débutant}} | ||
* Commentaires : - | * Commentaires : - | ||
* Débutant, à savoir : [[:doc:systeme:commandes:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-) | * Débutant, à savoir : [[:doc:systeme:commandes:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-) | ||
- | * Suivi : {{tag>en chantier}} | + | * Création par [[user>Slyfox]] 14.08.2018 |
- | * Création par [[user>Slyfox]] 31/07/2018 | + | * Suivi : {{tag>À compléter}} |
- | * Commentaires sur le forum : | + | |
- | <note warning>__**Script en cours d’écriture!**__</note> | + | ===== Introduction ===== |
+ | Slymedia est un script (amateur) qui permet de convertir les fichiers vidéo et audio. | ||
- | Installation des paquets: | + | ===== Installation ===== |
- | <code root>apt-get update | + | |
- | apt-get install ffmpeg yad flac vorbis-tools eyed3 kid3-cli</code> | + | |
- | Copier le script ci-dessous dans un fichier et le nommer slymedia.sh \\ | + | Paquets pour le fonctionne du script: |
- | <note>Avant le premier lancement il faut que le fichier soit excutable.</note> | + | |
- | <code root>chmod u+x slymedia.sh</code> | + | |
- | Pour lancer le script, taper le chemin du fichier du script "slymedia.sh" dans le terminal graphique (gnome terminal, terminal mate...)\\ | + | <code root>apt update</code> |
+ | <code root>apt install aptitude</code> | ||
+ | <code root>aptitude install ffmpeg yad flac vorbis-tools eyed3 kid3-cli</code> | ||
+ | <code root>apt upgrade</code> | ||
+ | ===== Script ===== | ||
+ | <note important>En cours d'écriture, peut fonctionner que partiellement.</note> | ||
- | <note>Version du 31.07.2018</note> | + | <note tip>Version du: 17.08.2018</note> |
<code user>#! /bin/bash | <code user>#! /bin/bash | ||
+ | |||
# Paquets à installer: ffmpeg yad flac vorbis-tools eyed3 kid3-cli | # Paquets à installer: ffmpeg yad flac vorbis-tools eyed3 kid3-cli | ||
+ | # Version: 20180817 | ||
+ | |||
#=========================================================================================================== | #=========================================================================================================== | ||
function YADMAIN() | function YADMAIN() | ||
Ligne 46: | Ligne 47: | ||
--field=" ":LBL " " \ | --field=" ":LBL " " \ | ||
--field="":LBL "" \ | --field="":LBL "" \ | ||
+ | --field="<b>Source</b>":LBL " " \ | ||
--field=" ":LBL " " \ | --field=" ":LBL " " \ | ||
--button="Quitter!gtk-quit!:1" \ | --button="Quitter!gtk-quit!:1" \ | ||
Ligne 52: | Ligne 54: | ||
--button="Source!gtk-file!:4" \ | --button="Source!gtk-file!:4" \ | ||
--button="Lancer conversion!gtk-convert!:0" \ | --button="Lancer conversion!gtk-convert!:0" \ | ||
- | "${cdeYadStream[@]}") | + | "${TabYadStream[@]}") |
+ | |||
# Status de sortie Yad | # Status de sortie Yad | ||
status="$?" | status="$?" | ||
+ | |||
# Récupération variables | # Récupération variables | ||
profile=$(awk -F [\|] '{print $2}' <<< "${yadMain}") | profile=$(awk -F [\|] '{print $2}' <<< "${yadMain}") | ||
Ligne 88: | Ligne 90: | ||
--field=" ":LBL " " \ | --field=" ":LBL " " \ | ||
--field="<b>Options</b>":LBL " " \ | --field="<b>Options</b>":LBL " " \ | ||
- | --field="Supprimer toutes les métadonnées":CHK "${metadata}" \ | + | --field="Supprimer tous les tags et images cover":CHK "${metadata}" \ |
--field="Ne pas encoder si même codec que l'original":CHK "${nocopy}" \ | --field="Ne pas encoder si même codec que l'original":CHK "${nocopy}" \ | ||
--field="Dossier source":DIR "${dirIn}" \ | --field="Dossier source":DIR "${dirIn}" \ | ||
Ligne 94: | Ligne 96: | ||
--button="gtk-cancel:2" \ | --button="gtk-cancel:2" \ | ||
--button="gtk-ok:0") | --button="gtk-ok:0") | ||
+ | |||
# Status de sortie Yad | # Status de sortie Yad | ||
status="$?" | status="$?" | ||
+ | |||
# Récupération variables | # Récupération variables | ||
definition=$(awk -F [\|] '{print $2}' <<< "${yadPreference}") | definition=$(awk -F [\|] '{print $2}' <<< "${yadPreference}") | ||
Ligne 106: | Ligne 108: | ||
nocopy=$(awk -F [\|] '{print $20}' <<< "${yadPreference}") | nocopy=$(awk -F [\|] '{print $20}' <<< "${yadPreference}") | ||
dirIn=$(awk -F [\|] '{print $21}' <<< "${yadPreference}") | dirIn=$(awk -F [\|] '{print $21}' <<< "${yadPreference}") | ||
- | |||
- | |||
} | } | ||
#=========================================================================================================== | #=========================================================================================================== | ||
Ligne 113: | Ligne 113: | ||
{ | { | ||
IFS=$"|" | IFS=$"|" | ||
+ | |||
yadSource=$(yad --list \ | yadSource=$(yad --list \ | ||
--radiolist \ | --radiolist \ | ||
Ligne 127: | Ligne 127: | ||
--column="" \ | --column="" \ | ||
--column="Type de source" \ | --column="Type de source" \ | ||
+ | "FALSE" "Fichier avec analyse" \ | ||
"TRUE" "Fichier" \ | "TRUE" "Fichier" \ | ||
"FALSE" "DVD" \ | "FALSE" "DVD" \ | ||
"FALSE" "CD" \ | "FALSE" "CD" \ | ||
"FALSE" "DDL") | "FALSE" "DDL") | ||
+ | |||
# Status de sortie Yad | # Status de sortie Yad | ||
status="$?" | status="$?" | ||
+ | |||
# Récupération variables | # Récupération variables | ||
source=$(awk -F [\|] '/TRUE/ {print $2}' <<< "${yadSource}") | source=$(awk -F [\|] '/TRUE/ {print $2}' <<< "${yadSource}") | ||
Ligne 155: | Ligne 156: | ||
--button="gtk-cancel:2" \ | --button="gtk-cancel:2" \ | ||
--button="gtk-ok:0") | --button="gtk-ok:0") | ||
+ | |||
# Status de sortie Yad | # Status de sortie Yad | ||
status="$?" | status="$?" | ||
+ | } | ||
+ | #=========================================================================================================== | ||
+ | function YADPROGRESS() | ||
+ | { | ||
+ | yad --progress \ | ||
+ | --title "SlyEditImage ${version}" \ | ||
+ | --geometry="550x300" \ | ||
+ | --borders="25" \ | ||
+ | --auto-close \ | ||
+ | --auto-kill \ | ||
+ | --button="gtk-media-stop:1" | ||
+ | |||
+ | yadStatus="$?" | ||
} | } | ||
#=========================================================================================================== | #=========================================================================================================== | ||
Ligne 165: | Ligne 179: | ||
dirSylmedia="/home/$USER/.slymedia" | dirSylmedia="/home/$USER/.slymedia" | ||
[[ ! -d "${dirSylmedia}" ]] && mkdir "${dirSylmedia}" | [[ ! -d "${dirSylmedia}" ]] && mkdir "${dirSylmedia}" | ||
+ | |||
# Suppression des anciens dossiers temporaires | # Suppression des anciens dossiers temporaires | ||
rm -rf "${dirSylmedia}"/tmp* | rm -rf "${dirSylmedia}"/tmp* | ||
+ | |||
# Création du dossier temporaire | # Création du dossier temporaire | ||
dossierTmp="$(mktemp -d "${dirSylmedia}/tmp-XXXXXXXXXXX")" | dossierTmp="$(mktemp -d "${dirSylmedia}/tmp-XXXXXXXXXXX")" | ||
+ | |||
# Création du fichier de configurations | # Création du fichier de configurations | ||
fileConfig="${dirSylmedia}/config.txt" | fileConfig="${dirSylmedia}/config.txt" | ||
+ | |||
[[ ! -f "${fileConfig}" ]] && CONFIGDEFAUT | [[ ! -f "${fileConfig}" ]] && CONFIGDEFAUT | ||
} | } | ||
Ligne 188: | Ligne 202: | ||
# Sauvegarde variables dans fichier de configuaration utilisateur | # Sauvegarde variables dans fichier de configuaration utilisateur | ||
echo -e "profile=\"${profile}\"\nquality=\"${quality}\"\ndirOut=\"${dirOut}\"\ndefinition=\"${definition}\"\nlangAudio=\"${langAudio}\"\ntypeRate=\"${typeRate}\"\nlangSub=\"${langSub}\"\nmetadata=\"${metadata}\"\nnocopy=\"${nocopy}\"\ndirIn=\"${dirIn}\"" > "${fileConfig}" | echo -e "profile=\"${profile}\"\nquality=\"${quality}\"\ndirOut=\"${dirOut}\"\ndefinition=\"${definition}\"\nlangAudio=\"${langAudio}\"\ntypeRate=\"${typeRate}\"\nlangSub=\"${langSub}\"\nmetadata=\"${metadata}\"\nnocopy=\"${nocopy}\"\ndirIn=\"${dirIn}\"" > "${fileConfig}" | ||
+ | |||
echo "profile: ${profile}" | echo "profile: ${profile}" | ||
echo "quality: ${quality}" | echo "quality: ${quality}" | ||
Ligne 207: | Ligne 221: | ||
language="Français" | language="Français" | ||
languageISO="fre" | languageISO="fre" | ||
- | + | ||
elif [[ "${lang}" == "gre" ]] || [[ "${lang}" == "deu" ]] || [[ "${lang}" == "de" ]]; then | elif [[ "${lang}" == "gre" ]] || [[ "${lang}" == "deu" ]] || [[ "${lang}" == "de" ]]; then | ||
language="Allemand" | language="Allemand" | ||
languageISO="deu" | languageISO="deu" | ||
- | + | ||
elif [[ "${lang}" == "eng" ]] || [[ "${lang}" == "en" ]]; then | elif [[ "${lang}" == "eng" ]] || [[ "${lang}" == "en" ]]; then | ||
language="Anglais" | language="Anglais" | ||
languageISO="eng" | languageISO="eng" | ||
- | + | ||
- | + | ||
elif [[ "${lang}" == "ara" ]] || [[ "${lang}" == "ar" ]]; then | elif [[ "${lang}" == "ara" ]] || [[ "${lang}" == "ar" ]]; then | ||
language="Arabe" | language="Arabe" | ||
languageISO="ara" | languageISO="ara" | ||
- | + | ||
elif [[ "${lang}" == "bre" ]] || [[ "${lang}" == "br" ]]; then | elif [[ "${lang}" == "bre" ]] || [[ "${lang}" == "br" ]]; then | ||
language="Breton" | language="Breton" | ||
languageISO="bre" | languageISO="bre" | ||
- | + | ||
elif [[ "${lang}" == "cat" ]] || [[ "${lang}" == "ca" ]]; then | elif [[ "${lang}" == "cat" ]] || [[ "${lang}" == "ca" ]]; then | ||
language="Catalan" | language="Catalan" | ||
languageISO="cat" | languageISO="cat" | ||
+ | |||
elif [[ "${lang}" == "chi" ]] || [[ "${lang}" == "zho" ]] || [[ "${lang}" == "zh" ]]; then | elif [[ "${lang}" == "chi" ]] || [[ "${lang}" == "zho" ]] || [[ "${lang}" == "zh" ]]; then | ||
language="Chinois" | language="Chinois" | ||
languageISO="chi" | languageISO="chi" | ||
- | + | ||
elif [[ "${lang}" == "kor" ]] || [[ "${lang}" == "ko" ]]; then | elif [[ "${lang}" == "kor" ]] || [[ "${lang}" == "ko" ]]; then | ||
language="Coréen" | language="Coréen" | ||
languageISO="kor" | languageISO="kor" | ||
- | + | ||
elif [[ "${lang}" == "cos" ]] || [[ "${lang}" == "co" ]]; then | elif [[ "${lang}" == "cos" ]] || [[ "${lang}" == "co" ]]; then | ||
language="Corse" | language="Corse" | ||
languageISO="cos" | languageISO="cos" | ||
- | + | ||
elif [[ "${lang}" == "hat" ]] || [[ "${lang}" == "ht" ]]; then | elif [[ "${lang}" == "hat" ]] || [[ "${lang}" == "ht" ]]; then | ||
language="Créole_haïtien" | language="Créole_haïtien" | ||
languageISO="hat" | languageISO="hat" | ||
- | + | ||
elif [[ "${lang}" == "hat" ]] || [[ "${lang}" == "ht" ]]; then | elif [[ "${lang}" == "hat" ]] || [[ "${lang}" == "ht" ]]; then | ||
language="Créole_haïtien" | language="Créole_haïtien" | ||
languageISO="hat" | languageISO="hat" | ||
- | + | ||
elif [[ "${lang}" == "rcf" ]] || [[ "${lang}" == "rc" ]]; then | elif [[ "${lang}" == "rcf" ]] || [[ "${lang}" == "rc" ]]; then | ||
language="Créole_Réunionnais" | language="Créole_Réunionnais" | ||
languageISO="rcf" | languageISO="rcf" | ||
- | + | ||
elif [[ "${lang}" == "gla" ]] || [[ "${lang}" == "gd" ]]; then | elif [[ "${lang}" == "gla" ]] || [[ "${lang}" == "gd" ]]; then | ||
language="Écossais" | language="Écossais" | ||
languageISO="gla" | languageISO="gla" | ||
+ | |||
elif [[ "${lang}" == "spa" ]] || [[ "${lang}" == "es" ]]; then | elif [[ "${lang}" == "spa" ]] || [[ "${lang}" == "es" ]]; then | ||
language="Espagnol" | language="Espagnol" | ||
languageISO="spa" | languageISO="spa" | ||
- | + | ||
elif [[ "${lang}" == "epo" ]] || [[ "${lang}" == "eo" ]]; then | elif [[ "${lang}" == "epo" ]] || [[ "${lang}" == "eo" ]]; then | ||
language="Espéranto" | language="Espéranto" | ||
languageISO="epo" | languageISO="epo" | ||
+ | |||
elif [[ "${lang}" == "fin" ]] || [[ "${lang}" == "fi" ]]; then | elif [[ "${lang}" == "fin" ]] || [[ "${lang}" == "fi" ]]; then | ||
language="Finnois" | language="Finnois" | ||
languageISO="fin" | languageISO="fin" | ||
- | + | ||
elif [[ "${lang}" == "glg" ]] || [[ "${lang}" == "gl" ]]; then | elif [[ "${lang}" == "glg" ]] || [[ "${lang}" == "gl" ]]; then | ||
language="Galicien" | language="Galicien" | ||
languageISO="glg" | languageISO="glg" | ||
- | + | ||
- | + | ||
elif [[ "${lang}" == "wel" ]] || [[ "${lang}" == "cym" ]] || [[ "${lang}" == "cy" ]]; then | elif [[ "${lang}" == "wel" ]] || [[ "${lang}" == "cym" ]] || [[ "${lang}" == "cy" ]]; then | ||
language="Gallois" | language="Gallois" | ||
languageISO="wel" | languageISO="wel" | ||
+ | |||
elif [[ "${lang}" == "gre" ]] || [[ "${lang}" == "ell" ]] || [[ "${lang}" == "el" ]]; then | elif [[ "${lang}" == "gre" ]] || [[ "${lang}" == "ell" ]] || [[ "${lang}" == "el" ]]; then | ||
language="Grec" | language="Grec" | ||
languageISO="gre" | languageISO="gre" | ||
- | + | ||
elif [[ "${lang}" == "heb" ]] || [[ "${lang}" == "he" ]]; then | elif [[ "${lang}" == "heb" ]] || [[ "${lang}" == "he" ]]; then | ||
language="Hébreu" | language="Hébreu" | ||
languageISO="heb" | languageISO="heb" | ||
- | + | ||
elif [[ "${lang}" == "hin" ]] || [[ "${lang}" == "hi" ]]; then | elif [[ "${lang}" == "hin" ]] || [[ "${lang}" == "hi" ]]; then | ||
language="Hindi" | language="Hindi" | ||
languageISO="hin" | languageISO="hin" | ||
- | + | ||
elif [[ "${lang}" == "hun" ]] || [[ "${lang}" == "hu" ]]; then | elif [[ "${lang}" == "hun" ]] || [[ "${lang}" == "hu" ]]; then | ||
language="Hongrois" | language="Hongrois" | ||
languageISO="hun" | languageISO="hun" | ||
- | + | ||
elif [[ "${lang}" == "gle" ]] || [[ "${lang}" == "ga" ]]; then | elif [[ "${lang}" == "gle" ]] || [[ "${lang}" == "ga" ]]; then | ||
language="Irlandais" | language="Irlandais" | ||
languageISO="gle" | languageISO="gle" | ||
- | + | ||
elif [[ "${lang}" == "ice" ]] || [[ "${lang}" == "isl" ]] || [[ "${lang}" == "is" ]]; then | elif [[ "${lang}" == "ice" ]] || [[ "${lang}" == "isl" ]] || [[ "${lang}" == "is" ]]; then | ||
language="Islandais" | language="Islandais" | ||
languageISO="ice" | languageISO="ice" | ||
+ | |||
elif [[ "${lang}" == "ita" ]] || [[ "${lang}" == "it" ]]; then | elif [[ "${lang}" == "ita" ]] || [[ "${lang}" == "it" ]]; then | ||
language="Italien" | language="Italien" | ||
languageISO="ita" | languageISO="ita" | ||
- | + | ||
elif [[ "${lang}" == "jpn" ]] || [[ "${lang}" == "jp" ]]; then | elif [[ "${lang}" == "jpn" ]] || [[ "${lang}" == "jp" ]]; then | ||
language="Japonais" | language="Japonais" | ||
languageISO="jpn" | languageISO="jpn" | ||
- | + | ||
elif [[ "${lang}" == "lat" ]] || [[ "${lang}" == "la" ]]; then | elif [[ "${lang}" == "lat" ]] || [[ "${lang}" == "la" ]]; then | ||
language="Latin" | language="Latin" | ||
languageISO="lat" | languageISO="lat" | ||
+ | |||
elif [[ "${lang}" == "ltz" ]] || [[ "${lang}" == "la" ]]; then | elif [[ "${lang}" == "ltz" ]] || [[ "${lang}" == "la" ]]; then | ||
language="Luxembourgeois" | language="Luxembourgeois" | ||
languageISO="ltz" | languageISO="ltz" | ||
- | + | ||
elif [[ "${lang}" == "dut" ]] || [[ "${lang}" == "nld" ]] || [[ "${lang}" == "lb" ]]; then | elif [[ "${lang}" == "dut" ]] || [[ "${lang}" == "nld" ]] || [[ "${lang}" == "lb" ]]; then | ||
language="Néerlandais" | language="Néerlandais" | ||
languageISO="dut" | languageISO="dut" | ||
- | + | ||
elif [[ "${lang}" == "nor" ]] || [[ "${lang}" == "no" ]]; then | elif [[ "${lang}" == "nor" ]] || [[ "${lang}" == "no" ]]; then | ||
language="Norvégien" | language="Norvégien" | ||
languageISO="nor" | languageISO="nor" | ||
- | + | ||
elif [[ "${lang}" == "por" ]] || [[ "${lang}" == "pt" ]]; then | elif [[ "${lang}" == "por" ]] || [[ "${lang}" == "pt" ]]; then | ||
language="Portugais" | language="Portugais" | ||
languageISO="por" | languageISO="por" | ||
- | + | ||
elif [[ "${lang}" == "roh" ]] || [[ "${lang}" == "rm" ]]; then | elif [[ "${lang}" == "roh" ]] || [[ "${lang}" == "rm" ]]; then | ||
language="Romanche" | language="Romanche" | ||
languageISO="roh" | languageISO="roh" | ||
+ | |||
elif [[ "${lang}" == "rus" ]] || [[ "${lang}" == "ru" ]]; then | elif [[ "${lang}" == "rus" ]] || [[ "${lang}" == "ru" ]]; then | ||
language="Russe" | language="Russe" | ||
languageISO="rus" | languageISO="rus" | ||
+ | |||
elif [[ "${lang}" == "swe" ]] || [[ "${lang}" == "sv" ]]; then | elif [[ "${lang}" == "swe" ]] || [[ "${lang}" == "sv" ]]; then | ||
language="Suédois" | language="Suédois" | ||
languageISO="swe" | languageISO="swe" | ||
+ | |||
else | else | ||
language="Inconnu" | language="Inconnu" | ||
Ligne 348: | Ligne 362: | ||
} | } | ||
#=========================================================================================================== | #=========================================================================================================== | ||
- | function STREAM() | + | function STREAM_SIMPLE() |
{ | { | ||
+ | |||
[[ -f "${dossierTmp}/stream.txt" ]] && rm "${dossierTmp}/stream.txt" | [[ -f "${dossierTmp}/stream.txt" ]] && rm "${dossierTmp}/stream.txt" | ||
- | cdeYadStream=() | + | TabYadStream=() |
- | + | ||
IFS=$'\n' | IFS=$'\n' | ||
+ | |||
+ | |||
+ | # Initialisation | ||
+ | nbr="0" | ||
+ | pourcent="0" | ||
+ | timeGo="$(date +%s)" | ||
+ | |||
+ | # Nombre de fichier | ||
+ | nbrFichier=$(awk '/./ {print}' <<< "${fileIn}" | wc -l) | ||
+ | |||
+ | # Calcul le pourcent par fichier | ||
+ | pourcentFichier=$(echo "scale=15; 100/${nbrFichier}" | bc) | ||
+ | |||
for i in ${fileIn}; do | for i in ${fileIn}; do | ||
- | #ffprobe -i "${i}" -hide_banner -v quiet -show_streams | + | # Titre et durée |
+ | #streamFormat=$(ffprobe -i "${i}" -hide_banner -v quiet -show_entries format=bit_rate -of csv=s="|") | ||
+ | #rateTotal=$(ffmpeg -y -i "${i}" 2>&1 | awk '/Duration:/ {printf "%s\n" ,$(NF-1)}') | ||
+ | |||
+ | # Mise en mémoire dans tableau TabYadStream | ||
+ | TabYadStream=(${TabYadStream[@]} --field="<b>TITRE:</b> $(basename "${i}")":LBL " ") | ||
+ | |||
+ | |||
+ | |||
+ | # Nom du fichier | ||
+ | fileNameExt=$(basename "${i}") | ||
+ | fileName="${fileNameExt%.*}" | ||
+ | |||
+ | # Envoi données vers YADPROGRESS | ||
+ | pourcent=$(echo "scale=15; (${pourcent}+${pourcentFichier})" | bc) | ||
+ | |||
+ | ((nbr+=1)) | ||
+ | |||
+ | # Calcul temps restant | ||
+ | timeT="$(date +%s)" | ||
+ | timeRemainingS=$(echo "scale=15; ((${timeT}-${timeGo})*${nbrFichier}/${nbr})-(${timeT}-${timeGo})" | bc | awk -F"." '{print $1}') | ||
+ | timeRemainingHMS=$(date +%T -d "0000-01-01 ${timeRemainingS} seconds") | ||
+ | |||
+ | # Envoi données à YADPROGRESS | ||
+ | echo "${pourcent}" | ||
+ | echo -e "\n#Chargement ${nbr} fichiers sur ${nbrFichier} - Temps restant environ: ${timeRemainingHMS}" | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | done | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | for i in "${TabYadStream[@]}"; do | ||
+ | echo "$i" >>"${dossierTmp}/yadStream.txt" | ||
+ | done | ||
+ | } | ||
+ | #=========================================================================================================== | ||
+ | function STREAM() | ||
+ | { | ||
+ | [[ -f "${dossierTmp}/stream.txt" ]] && rm "${dossierTmp}/stream.txt" | ||
+ | touch "${dossierTmp}/yadStream.txt" | ||
+ | TabYadStream=() | ||
+ | |||
+ | # Initialisation | ||
+ | nbr="0" | ||
+ | pourcent="0" | ||
+ | timeGo="$(date +%s)" | ||
+ | |||
+ | # Nombre de fichier | ||
+ | nbrFichier=$(awk '/./ {print}' <<< "${fileIn}" | wc -l) | ||
+ | |||
+ | # Calcul le pourcent par fichier | ||
+ | pourcentFichier=$(echo "scale=15; 100/${nbrFichier}" | bc) | ||
+ | |||
+ | IFS=$'\n' | ||
+ | |||
+ | for iFileIn in ${fileIn}; do | ||
STREAMTITLE | STREAMTITLE | ||
STREAMVIDEO | STREAMVIDEO | ||
STREAMAUDIO | STREAMAUDIO | ||
STREAMSUBTITLE | STREAMSUBTITLE | ||
- | cdeYadStream=(${cdeYadStream[@]} --field=" ":LBL " ") | + | |
+ | TabYadStream+=( --field=" ":LBL " ") | ||
+ | |||
+ | # Nom du fichier | ||
+ | fileNameExt=$(basename "${iFileIn}") | ||
+ | fileName="${fileNameExt%.*}" | ||
+ | |||
+ | # Envoi données vers YADPROGRESS | ||
+ | pourcent=$(echo "scale=15; (${pourcent}+${pourcentFichier})" | bc) | ||
+ | |||
+ | ((nbr+=1)) | ||
+ | |||
+ | # Calcul temps restant | ||
+ | timeT="$(date +%s)" | ||
+ | timeRemainingS=$(echo "scale=15; ((${timeT}-${timeGo})*${nbrFichier}/${nbr})-(${timeT}-${timeGo})" | bc | awk -F"." '{print $1}') | ||
+ | timeRemainingHMS=$(date +%T -d "0000-01-01 ${timeRemainingS} seconds") | ||
+ | |||
+ | # Envoi données à YADPROGRESS | ||
+ | echo "${pourcent}" | ||
+ | echo -e "\n#Analyse ${nbr} fichiers sur ${nbrFichier} - Temps restant environ: ${timeRemainingHMS}" | ||
+ | done | ||
+ | |||
+ | for i in "${TabYadStream[@]}"; do | ||
+ | echo "$i" >>"${dossierTmp}/yadStream.txt" | ||
done | done | ||
} | } | ||
Ligne 369: | Ligne 482: | ||
{ | { | ||
# Titre et durée | # Titre et durée | ||
- | streamFormat=$(ffprobe -i "${i}" -hide_banner -v quiet -show_entries format=duration,bit_rate -of csv=s="|") | + | streamFormat=$(ffprobe -i "${iFileIn}" -hide_banner -v quiet -show_entries format=duration,bit_rate -of csv=s="|") |
durationS=$(awk -F [\|] '{print $2}' <<< "${streamFormat}") | durationS=$(awk -F [\|] '{print $2}' <<< "${streamFormat}") | ||
- | durationHMS=$(date -d@"${durationS}" -u +%H:%M:%S) | + | durationHMS=$(date +%T -d "0000-01-01 ${durationS} seconds") |
rateTotal=$(awk -F [\|] '{printf "%d kb/s" ,($3/1000)}' <<< "${streamFormat}") | rateTotal=$(awk -F [\|] '{printf "%d kb/s" ,($3/1000)}' <<< "${streamFormat}") | ||
- | + | ||
- | # Mise en mémoire dans tableau cdeYadStream | + | # Mise en mémoire dans tableau TabYadStream |
- | cdeYadStream=(${cdeYadStream[@]} --field="<b>TITRE: $(basename "${i}") - ${durationHMS} - ${rateTotal}</b>":LBL " ") | + | TabYadStream+=( --field="<b>TITRE: $(basename "${iFileIn}") - ${durationHMS} - ${rateTotal}</b>":LBL " ") |
} | } | ||
#=========================================================================================================== | #=========================================================================================================== | ||
function STREAMVIDEO() | function STREAMVIDEO() | ||
{ | { | ||
- | streamVideo=$(ffprobe -i "${i}" -hide_banner -v quiet -select_streams v -show_entries stream=index,codec_name,width,height,r_frame_rate -of csv=s="|") | ||
- | |||
while read line; do | while read line; do | ||
- | + | ||
index=$(awk -F [\|] '{print $2}' <<< "${line}") | index=$(awk -F [\|] '{print $2}' <<< "${line}") | ||
codec=$(awk -F [\|] '{print $3}' <<< "${line}") | codec=$(awk -F [\|] '{print $3}' <<< "${line}") | ||
Ligne 391: | Ligne 501: | ||
fps1=$(awk -F [\|] '{print $6}' <<< "${line}" | awk -F [\/] '{print $1}') | fps1=$(awk -F [\|] '{print $6}' <<< "${line}" | awk -F [\/] '{print $1}') | ||
fps2=$(awk -F [\|] '{print $6}' <<< "${line}" | awk -F [\/] '{print $2}') | fps2=$(awk -F [\|] '{print $6}' <<< "${line}" | awk -F [\/] '{print $2}') | ||
- | + | ||
# Vérifiction si fps1 et fps2 sont des valeurs numériques | # Vérifiction si fps1 et fps2 sont des valeurs numériques | ||
- | + | ||
if [[ "${fps1}" = +([0-9]) ]] && [[ "${fps2}" = +([0-9]) ]]; then | if [[ "${fps1}" = +([0-9]) ]] && [[ "${fps2}" = +([0-9]) ]]; then | ||
fps=$(echo "${fps1} / ${fps2}" | bc -l | awk '{printf "%.3f" ,$1}') | fps=$(echo "${fps1} / ${fps2}" | bc -l | awk '{printf "%.3f" ,$1}') | ||
- | + | ||
elif [[ "${fps1}" = +([0-9]) ]] && [[ "${fps2}" != +([0-9]) ]]; then | elif [[ "${fps1}" = +([0-9]) ]] && [[ "${fps2}" != +([0-9]) ]]; then | ||
fps=$(awk '{printf "%d" ,$1}' <<< "${fps1}") | fps=$(awk '{printf "%d" ,$1}' <<< "${fps1}") | ||
- | + | ||
else | else | ||
fps="N/A" | fps="N/A" | ||
fi | fi | ||
- | + | ||
- | # Mise en forme piste vidéo (envoi vers fichier tmp et envoi dans tableau cdeYadStream) | + | # Type d'image (Front, back, other) |
- | if [[ "${index}" != "" ]]; then | + | if [[ "${codec}" == "mjpeg" ]] || [[ "${codec}" == "png" ]]; then |
- | printf "|${i}|0:${index}|VIDEO|${codec}|${width}|${height}|${fps}|\n" >> "${dossierTmp}/stream.txt" | + | |
- | cdeYadStream=(${cdeYadStream[@]} --field="0:${index} | VIDEO | ${codec} ${width}x${height} ${fps}":CHK "TRUE") | + | # Recherche map depuis numéro id |
- | + | id=$(awk -F [\:] '{print $2}' <<< "0:${index}") | |
+ | typeImage=$(ffprobe -i "${i}" -hide_banner -v quiet -select_streams ${id} -show_entries stream_tags=comment -of csv=s="|" | awk -F [\|] '{print $2}') | ||
+ | |||
+ | |||
+ | # Mise en forme piste vidéo (envoi vers fichier tmp et envoi dans tableau TabYadStream) | ||
+ | if [[ "${index}" != "" ]]; then | ||
+ | printf "|${iFileIn}|0:${index}|VIDEO|${typeImage}|${codec}|${width}|${height}\n" >> "${dossierTmp}/stream.txt" | ||
+ | TabYadStream+=( --field="0:${index} | VIDEO |${typeImage} ${codec} ${width}x${height}":CHK "TRUE") | ||
+ | fi | ||
+ | |||
+ | else | ||
+ | |||
+ | # Mise en forme piste vidéo (envoi vers fichier tmp et envoi dans tableau TabYadStream) | ||
+ | if [[ "${index}" != "" ]]; then | ||
+ | printf "|${iFileIn}|0:${index}|VIDEO|${codec}|${width}|${height}|${fps}\n" >> "${dossierTmp}/stream.txt" | ||
+ | TabYadStream+=( --field="0:${index} | VIDEO |${codec} ${width}x${height} ${fps} fps":CHK "TRUE") | ||
+ | fi | ||
fi | fi | ||
- | + | ||
- | done <<< "${streamVideo}" | + | done <<< $(ffprobe -i "${iFileIn}" -hide_banner -v quiet -select_streams v -show_entries stream=index,codec_name,width,height,r_frame_rate -of csv=s="|") |
} | } | ||
#=========================================================================================================== | #=========================================================================================================== | ||
function STREAMAUDIO() | function STREAMAUDIO() | ||
{ | { | ||
- | streamAudio=$(ffprobe -i "${i}" -hide_banner -v quiet -select_streams a -show_entries stream=index,codec_name,sample_rate,channel_layout,bit_rate -show_entries stream_tags=language -of csv=s="|") | + | while read line; do |
- | + | ||
- | while read line; do | + | |
- | index=$(awk -F [\|] '{print $2}' <<< "${line}") | + | index=$(awk -F [\|] '{print $2}' <<< "${line}") |
- | codec=$(awk -F [\|] '{print $3}' <<< "${line}") | + | codec=$(awk -F [\|] '{print $3}' <<< "${line}") |
- | rate=$(awk -F [\|] '{print $4}' <<< "${line}") | + | rate=$(awk -F [\|] '{print $4}' <<< "${line}") |
- | channelOut=$(awk -F [\|] '{print $5}' <<< "${line}") | + | channelOut=$(awk -F [\|] '{print $5}' <<< "${line}") |
- | lang=$(awk -F [\|] '{print $NF}' <<< "${line}") | + | lang=$(awk -F [\|] '{print $NF}' <<< "${line}") |
- | #debitAudio=$(awk -F [\|] '{print $6}' <<< "${line}") | + | |
- | LANGUE | + | LANGUE |
- | + | ||
- | # Calcul du débit audio | + | # Affectation TRUE ou FALSE |
- | #if [[ "${debitAudio}" = +([0-9]) ]] ; then | + | if [[ "${language}" == "${langAudio}" ]] || [[ "${language}" == "Inconnu" ]] || [[ "${langAudio}" == "Toutes les langues" ]]; then |
- | # debitAudio=$(echo "${debitAudio} / 1000" | bc) | + | bol="TRUE" |
- | #else | + | |
- | # debitAudio="N/A" | + | else |
- | #fi | + | bol="FALSE" |
- | + | fi | |
- | # Affectation TRUE ou FALSE | + | |
- | if [[ "${language}" == "${langAudio}" ]] || [[ "${language}" == "Inconnu" ]] || [[ "${langAudio}" == "Toutes les langues" ]]; then | + | # Mise en forme piste audio (envoi vers fichier tmp et envoi dans tableau TabYadStream) |
- | bol="TRUE" | + | if [[ "${index}" != "" ]]; then |
- | + | printf "|${iFileIn}|0:${index}|AUDIO|${codec}|${language}|${languageISO}|${rate}|${channelOut}|\n" >> "${dossierTmp}/stream.txt" | |
- | else | + | TabYadStream+=( --field="0:${index}| AUDIO | ${language} ${codec} ${rate} Hz ${channelOut}":CHK "${bol}") |
- | bol="FALSE" | + | fi |
- | fi | + | |
- | + | done <<< $(ffprobe -i "${iFileIn}" -hide_banner -v quiet -select_streams a -show_entries stream=index,codec_name,sample_rate,channel_layout,bit_rate -show_entries stream_tags=language -of csv=s="|") | |
- | # Mise en forme piste audio (envoi vers fichier tmp et envoi dans tableau cdeYadStream) | + | |
- | if [[ "${index}" != "" ]]; then | + | |
- | printf "|${i}|0:${index}|AUDIO|${codec}|${language}|${languageISO}|${rate}|${channelOut}|\n" >> "${dossierTmp}/stream.txt" | + | |
- | cdeYadStream=(${cdeYadStream[@]} --field="0:${index}| AUDIO | ${language} ${codec} ${rate} Hz ${channelOut}":CHK "${bol}") | + | |
- | + | ||
- | fi | + | |
- | + | ||
- | done <<< "${streamAudio}" | + | |
} | } | ||
#=========================================================================================================== | #=========================================================================================================== | ||
function STREAMSUBTITLE() | function STREAMSUBTITLE() | ||
{ | { | ||
- | streamSub=$(ffprobe -i "${i}" -hide_banner -v quiet -select_streams s -show_entries stream=index,codec_name -show_entries stream_tags=language -of csv=s="|") | ||
- | |||
while read line; do | while read line; do | ||
+ | |||
index=$(awk -F [\|] '{print $2}' <<< "${line}") | index=$(awk -F [\|] '{print $2}' <<< "${line}") | ||
codec=$(awk -F [\|] '{print $3}' <<< "${line}") | codec=$(awk -F [\|] '{print $3}' <<< "${line}") | ||
lang=$(awk -F [\|] '{print $NF}' <<< "${line}") | lang=$(awk -F [\|] '{print $NF}' <<< "${line}") | ||
+ | |||
LANGUE | LANGUE | ||
- | + | ||
# Affectation TRUE ou FALSE | # Affectation TRUE ou FALSE | ||
if [[ "${language}" == "${langSub}" ]] || [[ "${language}" == "Inconnu" ]] || [[ "${langSub}" == "Toutes les langues" ]]; then | if [[ "${language}" == "${langSub}" ]] || [[ "${language}" == "Inconnu" ]] || [[ "${langSub}" == "Toutes les langues" ]]; then | ||
bol="TRUE" | bol="TRUE" | ||
- | + | ||
else | else | ||
bol="FALSE" | bol="FALSE" | ||
fi | fi | ||
- | + | ||
- | # Mise en forme piste audio (envoi vers fichier tmp et envoi dans tableau cdeYadStream) | + | # Mise en forme piste audio (envoi vers fichier tmp et envoi dans tableau TabYadStream) |
- | + | ||
if [[ "${index}" != "" ]]; then | if [[ "${index}" != "" ]]; then | ||
- | printf "|${i}|0:${index}|SUBTITLE|${codec}|${language}|${languageISO}|\n" >> "${dossierTmp}/stream.txt" | + | printf "|${iFileIn}|0:${index}|SUBTITLE|${codec}|${language}|${languageISO}|\n" >> "${dossierTmp}/stream.txt" |
- | cdeYadStream=(${cdeYadStream[@]} --field="0:${index} | SUBTITLE | ${language} ${codec}":CHK "${bol}") | + | TabYadStream+=( --field="0:${index} | SUBTITLE | ${language} ${codec}":CHK "${bol}") |
- | + | ||
fi | fi | ||
- | + | ||
- | done <<< "${streamSub}" | + | done <<< $(ffprobe -i "${iFileIn}" -hide_banner -v quiet -select_streams s -show_entries stream=index,codec_name -show_entries stream_tags=language -of csv=s="|") |
} | } | ||
#=========================================================================================================== | #=========================================================================================================== | ||
+ | |||
function PROFIL() | function PROFIL() | ||
{ | { | ||
Ligne 491: | Ligne 603: | ||
FLAC | FLAC | ||
conteneur="flac" | conteneur="flac" | ||
+ | |||
elif [[ "${profile}" = "Audio vorbis" ]]; then | elif [[ "${profile}" = "Audio vorbis" ]]; then | ||
VORBIS | VORBIS | ||
conteneur="ogg" | conteneur="ogg" | ||
+ | |||
elif [[ "${profile}" = "Audio aac" ]]; then | elif [[ "${profile}" = "Audio aac" ]]; then | ||
AAC | AAC | ||
conteneur="m4a" | conteneur="m4a" | ||
- | + | ||
elif [[ "${profile}" = "Audio mp3" ]]; then | elif [[ "${profile}" = "Audio mp3" ]]; then | ||
MP3 | MP3 | ||
conteneur="mp3" | conteneur="mp3" | ||
- | + | ||
elif [[ "${profile}" = "Vidéo mkv - x264 - vorbis" ]]; then | elif [[ "${profile}" = "Vidéo mkv - x264 - vorbis" ]]; then | ||
X264 | X264 | ||
VORBIS | VORBIS | ||
conteneur="mkv" | conteneur="mkv" | ||
+ | |||
elif [[ "${profile}" = "Vidéo mkv - x264 - aac" ]]; then | elif [[ "${profile}" = "Vidéo mkv - x264 - aac" ]]; then | ||
X264 | X264 | ||
AAC | AAC | ||
conteneur="mkv" | conteneur="mkv" | ||
- | + | ||
elif [[ "${profile}" = "Vidéo mkv - x264 - mp3" ]]; then | elif [[ "${profile}" = "Vidéo mkv - x264 - mp3" ]]; then | ||
X264 | X264 | ||
MP3 | MP3 | ||
conteneur="mkv" | conteneur="mkv" | ||
- | + | ||
elif [[ "${profile}" = "Vidéo mkv - x265 - aac" ]]; then | elif [[ "${profile}" = "Vidéo mkv - x265 - aac" ]]; then | ||
X265 | X265 | ||
AAC | AAC | ||
conteneur="mkv" | conteneur="mkv" | ||
- | + | ||
elif [[ "${profile}" = "Vidéo mkv - x265 - mp3" ]]; then | elif [[ "${profile}" = "Vidéo mkv - x265 - mp3" ]]; then | ||
X265 | X265 | ||
Ligne 536: | Ligne 648: | ||
if [[ "${quality}" == "Excellente" ]]; then | if [[ "${quality}" == "Excellente" ]]; then | ||
cdeQualityVideo=(${qVideo1[@]}) | cdeQualityVideo=(${qVideo1[@]}) | ||
- | + | ||
elif [[ "${quality}" == "Elevée" ]]; then | elif [[ "${quality}" == "Elevée" ]]; then | ||
cdeQualityVideo=(${qVideo2[@]}) | cdeQualityVideo=(${qVideo2[@]}) | ||
- | + | ||
elif [[ "${quality}" == "Moyenne" ]]; then | elif [[ "${quality}" == "Moyenne" ]]; then | ||
cdeQualityVideo=(${qVideo3[@]}) | cdeQualityVideo=(${qVideo3[@]}) | ||
- | + | ||
elif [[ "${quality}" == "Minimum" ]]; then | elif [[ "${quality}" == "Minimum" ]]; then | ||
cdeQualityVideo=(${qVideo4[@]}) | cdeQualityVideo=(${qVideo4[@]}) | ||
- | + | ||
elif [[ "${quality}" == "Faible" ]]; then | elif [[ "${quality}" == "Faible" ]]; then | ||
cdeQualityVideo=(${qVideo5[@]}) | cdeQualityVideo=(${qVideo5[@]}) | ||
- | + | ||
- | fi | + | |
- | } | + | |
- | #=========================================================================================================== | + | |
- | function QUALITY_AUDIO() | + | |
- | { | + | |
- | # Recherche debit total maximum du fichier source | + | |
- | rateTotal=$(ffprobe -i "${i}" -hide_banner -v quiet -show_entries format=bit_rate -of csv=s="|" | awk -F [\|] '{printf "%d" ,($2/1000)}') | + | |
- | + | ||
- | # Commande selon la qualité | + | |
- | if [[ "${cAudio}" = "copy" ]] || [[ "${cAudio}" == "flac" ]]; then | + | |
- | cdeQualityAudio=() | + | |
- | + | ||
- | elif [[ "${typeRate}" == "CBR" ]]; then | + | |
- | + | ||
- | if [[ "${quality}" == "Excellente" ]] && [[ "${rateTotal}" -ge "320" ]]; then | + | |
- | cdeQualityAudio=(${qAudio1[@]}) | + | |
- | + | ||
- | elif [[ "${quality}" == "Elevée" ]] && [[ "${rateTotal}" -ge "256" ]]; then | + | |
- | cdeQualityAudio=(${qAudio2[@]}) | + | |
- | + | ||
- | elif [[ "${quality}" == "Moyenne" ]] && [[ "${rateTotal}" -ge "192" ]]; then | + | |
- | cdeQualityAudio=(${qAudio3[@]}) | + | |
- | + | ||
- | elif [[ "${quality}" == "Minimum" ]] && [[ "${rateTotal}" -ge "128" ]]; then | + | |
- | cdeQualityAudio=(${qAudio4[@]}) | + | |
- | + | ||
- | elif [[ "${quality}" == "Faible" ]] && [[ "${rateTotal}" -ge "64" ]]; then | + | |
- | cdeQualityAudio=(${qAudio5[@]}) | + | |
- | + | ||
- | else | + | |
- | + | ||
- | if [[ "${codecAudioIn}" == "${codecAudioOut}" ]]; then | + | |
- | cAudio="copy" | + | |
- | cdeQualityAudio=() | + | |
- | + | ||
- | else | + | |
- | cdeQualityAudio=(-b:a "${rateTotal}k") | + | |
- | + | ||
- | fi | + | |
- | + | ||
- | fi | + | |
- | + | ||
- | elif [[ "${typeRate}" == "VBR" ]]; then | + | |
- | + | ||
- | if [[ "${quality}" == "Excellente" ]]; then | + | |
- | cdeQualityAudio=(${qAudio1[@]}) | + | |
- | + | ||
- | elif [[ "${quality}" == "Elevée" ]]; then | + | |
- | cdeQualityAudio=(${qAudio2[@]}) | + | |
- | + | ||
- | elif [[ "${quality}" == "Moyenne" ]]; then | + | |
- | cdeQualityAudio=(${qAudio3[@]}) | + | |
- | + | ||
- | elif [[ "${quality}" == "Minimum" ]]; then | + | |
- | cdeQualityAudio=(${qAudio4[@]}) | + | |
- | + | ||
- | elif [[ "${quality}" == "Faible" ]]; then | + | |
- | cdeQualityAudio=(${qAudio5[@]}) | + | |
- | + | ||
- | fi | + | |
fi | fi | ||
} | } | ||
Ligne 618: | Ligne 670: | ||
else | else | ||
cVideo="libx265" | cVideo="libx265" | ||
+ | |||
+ | qVideo1=(-crf 18 -preset slow) | ||
+ | qVideo2=(-crf 24 -preset slow) | ||
+ | qVideo3=(-crf 30 -preset medium) | ||
+ | qVideo4=(-crf 36 -preset veryfast) | ||
+ | qVideo5=(-crf 42 -preset ultrafast) | ||
fi | fi | ||
- | + | ||
- | qVideo1=(-crf 18 -preset slow) | + | |
- | qVideo2=(-crf 24 -preset slow) | + | |
- | qVideo3=(-crf 30 -preset medium) | + | |
- | qVideo4=(-crf 36 -preset veryfast) | + | |
- | qVideo5=(-crf 42 -preset ultrafast) | + | |
} | } | ||
#=========================================================================================================== | #=========================================================================================================== | ||
Ligne 633: | Ligne 687: | ||
else | else | ||
cVideo="libx264" | cVideo="libx264" | ||
- | fi | + | |
- | + | qVideo1=(-crf 18 -preset slow) | |
- | qVideo1=(-crf 18 -preset slow) | + | qVideo2=(-crf 24 -preset slow) |
- | qVideo2=(-crf 24 -preset slow) | + | qVideo3=(-crf 30 -preset medium) |
- | qVideo3=(-crf 30 -preset medium) | + | qVideo4=(-crf 36 -preset veryfast) |
- | qVideo4=(-crf 36 -preset veryfast) | + | qVideo5=(-crf 42 -preset ultrafast) |
- | qVideo5=(-crf 42 -preset ultrafast) | + | |
+ | fi | ||
} | } | ||
#=========================================================================================================== | #=========================================================================================================== | ||
Ligne 646: | Ligne 701: | ||
if [[ "${codecAudioIn}" = "flac" ]] && [[ "${nocopy}" = "TRUE" ]]; then | if [[ "${codecAudioIn}" = "flac" ]] && [[ "${nocopy}" = "TRUE" ]]; then | ||
cAudio="copy" | cAudio="copy" | ||
- | + | ||
else | else | ||
cAudio="flac" | cAudio="flac" | ||
Ligne 656: | Ligne 711: | ||
if [[ "${codecAudioIn}" = "vorbis" ]] && [[ "${nocopy}" = "TRUE" ]]; then | if [[ "${codecAudioIn}" = "vorbis" ]] && [[ "${nocopy}" = "TRUE" ]]; then | ||
cAudio="copy" | cAudio="copy" | ||
- | + | ||
else | else | ||
codecAudioOut="vorbis" | codecAudioOut="vorbis" | ||
cAudio="libvorbis" | cAudio="libvorbis" | ||
- | + | ||
+ | if [[ "${typeRate}" == "VBR" ]]; then | ||
+ | qAudio1=(-qscale:a 10) | ||
+ | qAudio2=(-qscale:a 8) | ||
+ | qAudio3=(-qscale:a 5) | ||
+ | qAudio4=(-qscale:a 4) | ||
+ | qAudio5=(-qscale:a 0) | ||
+ | |||
+ | elif [[ "${typeRate}" == "CBR" ]]; then | ||
+ | qAudio1=(-b:a 320k) | ||
+ | qAudio2=(-b:a 256k) | ||
+ | qAudio3=(-b:a 160k) | ||
+ | qAudio4=(-b:a 128k) | ||
+ | qAudio5=(-b:a 64k) | ||
+ | fi | ||
+ | |||
fi | fi | ||
- | |||
- | if [[ "${typeRate}" == "VBR" ]]; then | ||
- | qAudio1=(-qscale:a 10) | ||
- | qAudio2=(-qscale:a 8) | ||
- | qAudio3=(-qscale:a 5) | ||
- | qAudio4=(-qscale:a 4) | ||
- | qAudio5=(-qscale:a 0) | ||
- | |||
- | elif [[ "${typeRate}" == "CBR" ]]; then | ||
- | qAudio1=(-b:a 320k) | ||
- | qAudio2=(-b:a 256k) | ||
- | qAudio3=(-b:a 192k) | ||
- | qAudio4=(-b:a 128k) | ||
- | qAudio5=(-b:a 64k) | ||
- | fi | ||
} | } | ||
#=========================================================================================================== | #=========================================================================================================== | ||
Ligne 683: | Ligne 738: | ||
if [[ "${codecAudioIn}" = "aac" ]] && [[ "${nocopy}" = "TRUE" ]]; then | if [[ "${codecAudioIn}" = "aac" ]] && [[ "${nocopy}" = "TRUE" ]]; then | ||
cAudio="copy" | cAudio="copy" | ||
- | + | ||
else | else | ||
codecAudioOut="aac" | codecAudioOut="aac" | ||
cAudio="aac" | cAudio="aac" | ||
- | + | ||
- | fi | + | if [[ "${typeRate}" == "VBR" ]]; then |
- | + | qAudio1=(-q:a 2) | |
- | if [[ "${typeRate}" == "VBR" ]]; then | + | qAudio2=(-q:a 1.5) |
- | qAudio1=(-q:a 0) | + | qAudio3=(-q:a 1) |
- | qAudio2=(-q:a 2) | + | qAudio4=(-q:a 0.7) |
- | qAudio3=(-q:a 5) | + | qAudio5=(-q:a 0.2) |
- | qAudio4=(-q:a 7) | + | |
- | qAudio5=(-q:a 9) | + | elif [[ "${typeRate}" == "CBR" ]]; then |
- | + | qAudio1=(-b:a 320k) | |
- | elif [[ "${typeRate}" == "CBR" ]]; then | + | qAudio2=(-b:a 256k) |
- | qAudio1=(-b:a 320k) | + | qAudio3=(-b:a 160k) |
- | qAudio2=(-b:a 256k) | + | qAudio4=(-b:a 128k) |
- | qAudio3=(-b:a 192k) | + | qAudio5=(-b:a 64k) |
- | qAudio4=(-b:a 128k) | + | fi |
- | qAudio5=(-b:a 64k) | + | |
fi | fi | ||
} | } | ||
Ligne 710: | Ligne 765: | ||
if [[ "${codecAudioIn}" = "mp3" ]] && [[ "${nocopy}" = "TRUE" ]]; then | if [[ "${codecAudioIn}" = "mp3" ]] && [[ "${nocopy}" = "TRUE" ]]; then | ||
cAudio="copy" | cAudio="copy" | ||
- | + | ||
else | else | ||
codecAudioOut="mp3" | codecAudioOut="mp3" | ||
cAudio="libmp3lame" | cAudio="libmp3lame" | ||
+ | |||
+ | if [[ "${typeRate}" == "VBR" ]]; then | ||
+ | qAudio1=(-q:a 0) | ||
+ | qAudio2=(-q:a 1) | ||
+ | qAudio3=(-q:a 4) | ||
+ | qAudio4=(-q:a 7) | ||
+ | qAudio5=(-q:a 9) | ||
+ | |||
+ | elif [[ "${typeRate}" == "CBR" ]]; then | ||
+ | qAudio1=(-b:a 320k) | ||
+ | qAudio2=(-b:a 256k) | ||
+ | qAudio3=(-b:a 160k) | ||
+ | qAudio4=(-b:a 128k) | ||
+ | qAudio5=(-b:a 64k) | ||
+ | fi | ||
fi | fi | ||
+ | } | ||
+ | function FFMPEG_SIMPLE | ||
+ | { | ||
+ | |||
+ | |||
+ | |||
+ | IFS=$'\n' | ||
+ | |||
+ | for iFileIn in ${fileIn}; do | ||
+ | |||
+ | # Initialisation commandes | ||
+ | cdeVideo=() | ||
+ | cdeAudio=() | ||
+ | cdeSub=() | ||
+ | |||
+ | # Nom fichier source | ||
+ | fileNameExtension=$(basename "${iFileIn}") | ||
+ | fileName="${fileNameExtension%.*}" | ||
+ | extension="${fileNameExtension##*.}" | ||
+ | |||
+ | |||
+ | |||
+ | STREAMAUDIO | ||
+ | |||
+ | |||
+ | cat "${dossierTmp}/stream.txt" | ||
+ | |||
+ | |||
+ | exit | ||
+ | |||
+ | |||
+ | |||
- | if [[ "${typeRate}" == "VBR" ]]; then | ||
- | qAudio1=(-q:a 0) | ||
- | qAudio2=(-q:a 2) | ||
- | qAudio3=(-q:a 5) | ||
- | qAudio4=(-q:a 7) | ||
- | qAudio5=(-q:a 9) | ||
- | elif [[ "${typeRate}" == "CBR" ]]; then | + | |
- | qAudio1=(-b:a 320k) | + | done |
- | qAudio2=(-b:a 256k) | + | |
- | qAudio3=(-b:a 192k) | + | |
- | qAudio4=(-b:a 128k) | + | |
- | qAudio5=(-b:a 64k) | + | |
- | fi | + | |
} | } | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
#=========================================================================================================== | #=========================================================================================================== | ||
function FFMPEG() | function FFMPEG() | ||
{ | { | ||
IFS=$'\n' | IFS=$'\n' | ||
+ | for iFileIn in ${fileIn}; do | ||
- | for iFileIn in ${fileIn}; do | ||
- | |||
# Initialisation commandes | # Initialisation commandes | ||
cdeVideo=() | cdeVideo=() | ||
cdeAudio=() | cdeAudio=() | ||
cdeSub=() | cdeSub=() | ||
- | + | ||
- | # Nom fichier | + | # Nom fichier source |
- | fileNameExt=$(basename "${iFileIn}") | + | fileNameExtension=$(basename "${iFileIn}") |
- | fileName="${fileNameExt%.*}" | + | fileName="${fileNameExtension%.*}" |
- | + | extension="${fileNameExtension##*.}" | |
# Recherche map | # Recherche map | ||
- | mapVideo=$(awk -F [\|] '{if ($4 ~ /VIDEO/ && /'${fileName}'/) {printf "%s\n" ,$3}}' <<< "${stream}") | + | mapVideo=$(awk -v iFileIn="${iFileIn}" -v iMapAudio="${iMapAudio}" -F [\|] '{if ($4 == "VIDEO" && $2 == iFileIn) {printf "%s" ,$3}}' <<< "${stream}") |
- | mapAudio=$(awk -F [\|] '{if ($4 ~ /AUDIO/ && /'${fileName}'/) {printf "%s\n" ,$3}}' <<< "${stream}") | + | mapAudio=$(awk -v iFileIn="${iFileIn}" -v iMapAudio="${iMapAudio}" -F [\|] '{if ($4 == "AUDIO" && $2 == iFileIn) {printf "%s" ,$3}}' <<< "${stream}") |
- | mapSub=$(awk -F [\|] '{if ($4 ~ /SUBTITLE/ && /'${fileName}'/) {printf "%s\n" ,$3}}' <<< "${stream}") | + | mapSub=$(awk -v iFileIn="${iFileIn}" -v iMapAudio="${iMapAudio}" -F [\|] '{if ($4 == "SUBTITLE" && $2 == iFileIn) {printf "%s" ,$3}}' <<< "${stream}") |
- | + | ||
echo "==============================================" | echo "==============================================" | ||
echo " iFileIn: ${iFileIn}" | echo " iFileIn: ${iFileIn}" | ||
Ligne 759: | Ligne 863: | ||
echo " mapAudio: ${mapAudio}" | echo " mapAudio: ${mapAudio}" | ||
echo " mapSub: ${mapSub}" | echo " mapSub: ${mapSub}" | ||
- | + | ||
# Metadonnée | # Metadonnée | ||
if [[ "${metadata}" == "TRUE" ]]; then | if [[ "${metadata}" == "TRUE" ]]; then | ||
Ligne 766: | Ligne 870: | ||
cdeMetadata=() | cdeMetadata=() | ||
fi | fi | ||
- | + | ||
FFMPEG_VIDEO | FFMPEG_VIDEO | ||
FFMPEG_AUDIO | FFMPEG_AUDIO | ||
- | + | FFMPEG_OUT | |
# Conversion fichier | # Conversion fichier | ||
- | ffmpeg -y -i "${iFileIn}" -loglevel debug "${cdeMetadata[@]}" "${cdeVideo[@]}" "${cdeAudio[@]}" "${dirOut}/${fileName}.${conteneur}" | + | ffmpeg -y -i "${iFileIn}" -loglevel debug "${cdeMetadata[@]}" "${cdeVideo[@]}" "${cdeAudio[@]}" -t 10 "${dirOut}/${fileName}.${conteneur}" |
- | + | ||
ffmpeg -i "${dirOut}/${fileName}.${conteneur}" ## TEST ## | ffmpeg -i "${dirOut}/${fileName}.${conteneur}" ## TEST ## | ||
- | echo "ffmpeg -y -i "${iFileIn}" "${cdeMetadata[@]}" "${cdeVideo[@]}" "${cdeAudio[@]}" "${dirOut}/${fileName}.${conteneur}"" ## TEST ## | + | |
- | + | echo "==============================================" | |
- | # Cover fichier | + | echo "ffmpeg -y -i ${iFileIn} ${cdeMetadata[@]} ${cdeVideo[@]} ${cdeAudio[@]} -t 10 ${dirOut}/${fileName}.${conteneur} |
- | numImage="1" | + | rateTotal: ${rateTotal}" ## TEST ## |
- | + | echo "==============================================" | |
+ | |||
+ | # Image cover fichier audio | ||
for iMapVideo in ${mapVideo}; do | for iMapVideo in ${mapVideo}; do | ||
- | # Recherche codec vidéo map vidéo | + | numImage="1" |
+ | |||
+ | # Recherche codec vidéo (image) | ||
codecVideoIn=$(awk -F [\|] '{if ($4 ~ /VIDEO/ && /'${iMapVideo}'/ && /'${fileName}'/) {printf "%s" ,$5}}' <<< "${stream}") | codecVideoIn=$(awk -F [\|] '{if ($4 ~ /VIDEO/ && /'${iMapVideo}'/ && /'${fileName}'/) {printf "%s" ,$5}}' <<< "${stream}") | ||
if [[ "${codecVideoIn}" == "mjpeg" ]] || [[ "${codecVideoIn}" == "png" ]]; then | if [[ "${codecVideoIn}" == "mjpeg" ]] || [[ "${codecVideoIn}" == "png" ]]; then | ||
+ | |||
COVER | COVER | ||
- | |||
fi | fi | ||
- | + | ||
done | done | ||
- | + | ||
done | done | ||
- | } | ||
+ | } | ||
#=========================================================================================================== | #=========================================================================================================== | ||
function FFMPEG_VIDEO() | function FFMPEG_VIDEO() | ||
{ | { | ||
numFile="" | numFile="" | ||
+ | |||
for iMapVideo in ${mapVideo}; do | for iMapVideo in ${mapVideo}; do | ||
- | + | ||
- | codecVideoIn=$(awk -F [\|] '{if ($4 ~ /VIDEO/ && /'${iMapVideo}'/ && /'${fileName}'/) {printf "%s" ,$5}}' <<< "${stream}") | + | codecVideoIn=$(awk -v iFileIn="${iFileIn}" -v iMapVideo="${iMapVideo}" -F [\|] '{if ($4 == "VIDEO" && $2 == iFileIn && $3 == iMapVideo){printf "%s" ,$5}}' <<< "${stream}") |
- | + | ||
PROFIL | PROFIL | ||
QUALITY_VIDEO | QUALITY_VIDEO | ||
- | + | ||
if [[ "${profile}" = "Audio FLAC" ]] || [[ "${profile}" = "Audio vorbis" ]] || [[ "${profile}" = "Audio aac" ]] || [[ "${profile}" = "Audio mp3" ]]; then | if [[ "${profile}" = "Audio FLAC" ]] || [[ "${profile}" = "Audio vorbis" ]] || [[ "${profile}" = "Audio aac" ]] || [[ "${profile}" = "Audio mp3" ]]; then | ||
cdeVideo=(-vn) | cdeVideo=(-vn) | ||
+ | |||
else | else | ||
cdeVideo=(${cdeVideo[@]} -map ${iMapVideo} -c:v ${cVideo} ${cdeQualityVideo[@]}) | cdeVideo=(${cdeVideo[@]} -map ${iMapVideo} -c:v ${cVideo} ${cdeQualityVideo[@]}) | ||
+ | |||
fi | fi | ||
- | + | ||
echo "cdeVideo: ${cdeVideo[@]}" | echo "cdeVideo: ${cdeVideo[@]}" | ||
+ | |||
done | done | ||
} | } | ||
+ | |||
#=========================================================================================================== | #=========================================================================================================== | ||
function FFMPEG_AUDIO() | function FFMPEG_AUDIO() | ||
Ligne 823: | Ligne 932: | ||
numAudio="0" | numAudio="0" | ||
+ | |||
+ | |||
for iMapAudio in ${mapAudio}; do | for iMapAudio in ${mapAudio}; do | ||
+ | |||
+ | codecAudioIn=$(awk -v iFileIn="${iFileIn}" -v iMapAudio="${iMapAudio}" -F [\|] '{ | ||
+ | |||
+ | if ($4 == "AUDIO" && $2 == iFileIn && $3 == iMapAudio) | ||
+ | {printf "%s - %s" ,$5,iFileIn} | ||
+ | |||
+ | }' <<< "${stream}") | ||
- | codecAudioIn=$(awk -F [\|] '{if ($4 ~ /AUDIO/ && /'${iMapAudio}'/ && /'${fileName}'/) {printf "%s" ,$5}}' <<< "${stream}") | + | languageISO=$(awk -v iFileIn="${iFileIn}" -v iMapAudio="${iMapAudio}" -F [\|] '{ |
- | languageISO=$(awk -F [\|] '{if ($4 ~ /AUDIO/ && $3 ~ /'${iMapAudio}'/ && /'${fileName}'/) {printf "%s" ,$7}}' <<< "${stream}") | + | |
- | + | if ($4 == "AUDIO" && $2 == iFileIn && $3 == iMapAudio) | |
+ | {printf "%s" ,$7} | ||
+ | |||
+ | }' <<< "${stream}") | ||
+ | |||
PROFIL | PROFIL | ||
QUALITY_AUDIO | QUALITY_AUDIO | ||
Ligne 833: | Ligne 955: | ||
cdeAudio=(${cdeAudio[@]} -map ${iMapAudio} -metadata:s:a:${numAudio} language="${languageISO}" -c:a ${cAudio} ${cdeQualityAudio[@]} ${channel[@]} -cutoff 20000) | cdeAudio=(${cdeAudio[@]} -map ${iMapAudio} -metadata:s:a:${numAudio} language="${languageISO}" -c:a ${cAudio} ${cdeQualityAudio[@]} ${channel[@]} -cutoff 20000) | ||
((numAudio+=1)) | ((numAudio+=1)) | ||
+ | |||
+ | done | ||
+ | } | ||
+ | #=========================================================================================================== | ||
+ | function QUALITY_AUDIO() | ||
+ | { | ||
+ | # Recherche debit total maximum du fichier source | ||
+ | rateTotal=$(ffprobe -i "${iFileIn}" -hide_banner -v quiet -show_entries format=bit_rate -of csv=s="|" | awk -F [\|] '{printf "%d\n" ,($2/1000)}') | ||
+ | # Commande selon la qualité | ||
+ | if [[ "${cAudio}" = "copy" ]] || [[ "${cAudio}" == "flac" ]]; then | ||
+ | cdeQualityAudio=() | ||
+ | |||
+ | elif [[ "${quality}" == "Excellente" ]]; then | ||
+ | |||
+ | if [[ "${rateTotal}" -gt "320" ]]; then | ||
+ | cdeQualityAudio=(${qAudio1[@]}) | ||
+ | |||
+ | elif [[ "${codecAudioIn}" == "${codecAudioOut}" ]]; then | ||
+ | cAudio="copy" | ||
+ | cdeQualityAudio=() | ||
+ | else | ||
+ | cdeQualityAudio=(-b:a "${rateTotal}k") | ||
+ | fi | ||
+ | |||
+ | elif [[ "${quality}" == "Elevée" ]]; then | ||
+ | |||
+ | if [[ "${rateTotal}" -gt "256" ]]; then | ||
+ | cdeQualityAudio=(${qAudio2[@]}) | ||
+ | |||
+ | elif [[ "${codecAudioIn}" == "${codecAudioOut}" ]]; then | ||
+ | cAudio="copy" | ||
+ | cdeQualityAudio=() | ||
+ | else | ||
+ | cdeQualityAudio=(-b:a "${rateTotal}k") | ||
+ | fi | ||
+ | |||
+ | elif [[ "${quality}" == "Moyenne" ]]; then | ||
+ | if [[ "${rateTotal}" -gt "192" ]]; then | ||
+ | cdeQualityAudio=(${qAudio3[@]}) | ||
+ | |||
+ | elif [[ "${codecAudioIn}" == "${codecAudioOut}" ]]; then | ||
+ | cAudio="copy" | ||
+ | cdeQualityAudio=() | ||
+ | else | ||
+ | cdeQualityAudio=(-b:a "${rateTotal}k") | ||
+ | fi | ||
+ | |||
+ | elif [[ "${quality}" == "Minimum" ]]; then | ||
+ | if [[ "${rateTotal}" -gt "128" ]]; then | ||
+ | cdeQualityAudio=(${qAudio4[@]}) | ||
+ | |||
+ | elif [[ "${codecAudioIn}" == "${codecAudioOut}" ]]; then | ||
+ | cAudio="copy" | ||
+ | cdeQualityAudio=() | ||
+ | else | ||
+ | cdeQualityAudio=(-b:a "${rateTotal}k") | ||
+ | fi | ||
+ | |||
+ | elif [[ "${quality}" == "Faible" ]]; then | ||
+ | if [[ "${rateTotal}" -gt "64" ]]; then | ||
+ | cdeQualityAudio=(${qAudio5[@]}) | ||
+ | |||
+ | elif [[ "${codecAudioIn}" == "${codecAudioOut}" ]]; then | ||
+ | cAudio="copy" | ||
+ | cdeQualityAudio=() | ||
+ | |||
+ | else | ||
+ | cdeQualityAudio=(-b:a "${rateTotal}k") | ||
+ | fi | ||
+ | fi | ||
+ | |||
+ | echo "typeRate: ${typeRate}" ## TEST | ||
+ | echo "rateTotal: ${rateTotal}" ## TEST | ||
+ | echo "quality: ${quality}" ## TEST | ||
+ | echo "cdeQualityAudio: ${cdeQualityAudio[@]}" ## TEST | ||
+ | } | ||
+ | #=========================================================================================================== | ||
+ | function FFMPEG_OUT() | ||
+ | { | ||
+ | # Si fichier exsite déjà ajoute "copie" et numéro de la copie | ||
+ | nbrCopie="1" | ||
+ | |||
+ | while [[ -f "${dirOut}/${fileName}.${conteneur}" ]]; do | ||
+ | fileName=$(awk '{gsub(/ - copie.*/, ""); printf "%s - copie '$nbrCopie'" ,$0}' <<< "${fileName}") | ||
+ | ((nbrCopie+=1)) | ||
done | done | ||
} | } | ||
Ligne 841: | Ligne 1048: | ||
# Si codecVideoIn = mjpeg --> jpeg | # Si codecVideoIn = mjpeg --> jpeg | ||
[[ "${codecVideoIn}" == "mjpeg" ]] && codecVideoIn="jpeg" | [[ "${codecVideoIn}" == "mjpeg" ]] && codecVideoIn="jpeg" | ||
+ | |||
# Recherche numéro id depuis la map | # Recherche numéro id depuis la map | ||
id=$(awk -F [\:] '{print $2}' <<< "${iMapVideo}") | id=$(awk -F [\:] '{print $2}' <<< "${iMapVideo}") | ||
+ | |||
# Type d'image (Front, back, other) | # Type d'image (Front, back, other) | ||
typeImage=$(ffprobe -i "${i}" -hide_banner -v quiet -select_streams ${id} -show_entries stream_tags=comment -of csv=s="|" | awk -F [\|] '{print $2}') | typeImage=$(ffprobe -i "${i}" -hide_banner -v quiet -select_streams ${id} -show_entries stream_tags=comment -of csv=s="|" | awk -F [\|] '{print $2}') | ||
+ | |||
# Nom image cover | # Nom image cover | ||
nameImage=$(ffprobe -i "${i}" -hide_banner -v quiet -select_streams ${id} -show_entries stream_tags=title -of csv=s="|" | awk -F [\|] '{print $2}') | nameImage=$(ffprobe -i "${i}" -hide_banner -v quiet -select_streams ${id} -show_entries stream_tags=title -of csv=s="|" | awk -F [\|] '{print $2}') | ||
+ | |||
if [[ "${nameImage}" == "" ]]; then | if [[ "${nameImage}" == "" ]]; then | ||
- | nameImage="cover_${typeImage}" | + | #nameImage="cover_${typeImage}" |
- | + | ||
+ | |||
+ | if [[ "${typeImage}" == "Cover (front)" ]]; then | ||
+ | nameImage="Cover front" | ||
+ | |||
+ | elif [[ "${typeImage}" == "Cover (back)" ]]; then | ||
+ | nameImage="Cover back" | ||
+ | |||
+ | else [[ "${typeImage}" == "Other" ]] | ||
+ | nameImage="Other" | ||
+ | |||
+ | fi | ||
+ | |||
elif [[ "${nameImage}" == "${nameImageSave}" ]]; then | elif [[ "${nameImage}" == "${nameImageSave}" ]]; then | ||
nameImage="${nameImage}_${numImage}" | nameImage="${nameImage}_${numImage}" | ||
- | + | ||
fi | fi | ||
+ | |||
# Sauvegarde du nom de l'image | # Sauvegarde du nom de l'image | ||
nameImageSave="${numImage}" | nameImageSave="${numImage}" | ||
((numImage+=1)) | ((numImage+=1)) | ||
+ | |||
# Extraction image du fichier source | # Extraction image du fichier source | ||
ffmpeg -y -i "${iFileIn}" -map ${iMapVideo} -an "${dossierTmp}/${nameImage}.${codecVideoIn}" | ffmpeg -y -i "${iFileIn}" -map ${iMapVideo} -an "${dossierTmp}/${nameImage}.${codecVideoIn}" | ||
+ | |||
# Image cover pour fichier audio flac | # Image cover pour fichier audio flac | ||
if [[ "${profile}" = "Audio FLAC" ]]; then | if [[ "${profile}" = "Audio FLAC" ]]; then | ||
COVER_FLAC | COVER_FLAC | ||
+ | |||
# Image cover pour fichier audio vorbis | # Image cover pour fichier audio vorbis | ||
elif [[ "${profile}" = "Audio vorbis" ]]; then | elif [[ "${profile}" = "Audio vorbis" ]]; then | ||
COVER_OGG | COVER_OGG | ||
+ | |||
# Image cover pour fichier audio mp3 | # Image cover pour fichier audio mp3 | ||
elif [[ "${profile}" = "Audio mp3" ]]; then | elif [[ "${profile}" = "Audio mp3" ]]; then | ||
COVER_MP3 | COVER_MP3 | ||
+ | |||
# Image cover pour fichier audio aac | # Image cover pour fichier audio aac | ||
elif [[ "${profile}" = "Audio aac" ]]; then | elif [[ "${profile}" = "Audio aac" ]]; then | ||
COVER_OTHER | COVER_OTHER | ||
fi | fi | ||
- | + | ||
+ | |||
echo "=== COVER ===" | echo "=== COVER ===" | ||
echo "id: ${id}" | echo "id: ${id}" | ||
Ligne 892: | Ligne 1111: | ||
function COVER_FLAC() | function COVER_FLAC() | ||
{ | { | ||
+ | |||
if [[ "${typeImage}" == "Cover (front)" ]]; then | if [[ "${typeImage}" == "Cover (front)" ]]; then | ||
typeImage="3" | typeImage="3" | ||
+ | |||
elif [[ "${typeImage}" == "Cover (back)" ]]; then | elif [[ "${typeImage}" == "Cover (back)" ]]; then | ||
typeImage="4" | typeImage="4" | ||
- | + | ||
- | + | ||
- | elif [[ "${typeImage}" == "Other" ]]; then | + | else [[ "${typeImage}" == "Other" ]] |
typeImage="0" | typeImage="0" | ||
- | |||
- | else | ||
- | typeImage="3" | ||
- | |||
fi | fi | ||
+ | |||
# Ajout de l'image au fichier audio | # Ajout de l'image au fichier audio | ||
metaflac --import-picture-from="${typeImage}||${nameImage}||${dossierTmp}/${nameImage}.${codecVideoIn}" "${dirOut}/${fileName}.${conteneur}" | metaflac --import-picture-from="${typeImage}||${nameImage}||${dossierTmp}/${nameImage}.${codecVideoIn}" "${dirOut}/${fileName}.${conteneur}" | ||
- | |||
} | } | ||
#=========================================================================================================== | #=========================================================================================================== | ||
function COVER_OGG() | function COVER_OGG() | ||
{ | { | ||
+ | |||
# Type d'image (Front, back, other) | # Type d'image (Front, back, other) | ||
typeImage=$(ffprobe -i "${i}" -hide_banner -v quiet -select_streams ${id} -show_entries stream_tags=comment -of csv=s="|" | awk -F [\|] '{print $2}') | typeImage=$(ffprobe -i "${i}" -hide_banner -v quiet -select_streams ${id} -show_entries stream_tags=comment -of csv=s="|" | awk -F [\|] '{print $2}') | ||
+ | |||
if [[ "${typeImage}" == "Cover (front)" ]]; then | if [[ "${typeImage}" == "Cover (front)" ]]; then | ||
typeImage="3" | typeImage="3" | ||
+ | |||
elif [[ "${typeImage}" == "Cover (back)" ]]; then | elif [[ "${typeImage}" == "Cover (back)" ]]; then | ||
typeImage="4" | typeImage="4" | ||
+ | |||
elif [[ "${typeImage}" == "Artist/performer" ]]; then | elif [[ "${typeImage}" == "Artist/performer" ]]; then | ||
typeImage="8" | typeImage="8" | ||
- | + | ||
elif [[ "${typeImage}" == "Other" ]]; then | elif [[ "${typeImage}" == "Other" ]]; then | ||
typeImage="0" | typeImage="0" | ||
- | + | ||
else | else | ||
typeImage="3" | typeImage="3" | ||
+ | |||
fi | fi | ||
+ | |||
# Sauvegarde données exsistantes du fichier source | # Sauvegarde données exsistantes du fichier source | ||
vorbiscomment --list --raw "${dirOut}/out.${conteneur}" > "${dossierTmp}/fileSaveOgg.txt" | vorbiscomment --list --raw "${dirOut}/out.${conteneur}" > "${dossierTmp}/fileSaveOgg.txt" | ||
+ | |||
#Suppression image exsistante | #Suppression image exsistante | ||
#sed -i -e '/^metadata_block_picture/d' "${dossierTmp}/fileSaveOgg.txt" | #sed -i -e '/^metadata_block_picture/d' "${dossierTmp}/fileSaveOgg.txt" | ||
+ | |||
# Metadata_block_picture format | # Metadata_block_picture format | ||
#Lien: https://xiph.org/flac/format.html#metadata_block_picture | #Lien: https://xiph.org/flac/format.html#metadata_block_picture | ||
imageMimeType=$(file -b --mime-type "${dossierTmp}/${nameImage}.${codecVideoIn}") | imageMimeType=$(file -b --mime-type "${dossierTmp}/${nameImage}.${codecVideoIn}") | ||
+ | |||
printf "0: %.8x" "${typeImage}" | xxd -r -g0 >> "${dossierTmp}/dataImage.txt" | printf "0: %.8x" "${typeImage}" | xxd -r -g0 >> "${dossierTmp}/dataImage.txt" | ||
printf "0: %.8x" $(echo -n "${imageMimeType}" | wc -c) | xxd -r -g0 >> "${dossierTmp}/dataImage.txt" | printf "0: %.8x" $(echo -n "${imageMimeType}" | wc -c) | xxd -r -g0 >> "${dossierTmp}/dataImage.txt" | ||
Ligne 956: | Ligne 1170: | ||
printf "0: %.8x" 0 | xxd -r -g0 >> "${dossierTmp}/dataImage.txt" | printf "0: %.8x" 0 | xxd -r -g0 >> "${dossierTmp}/dataImage.txt" | ||
printf "0: %.8x" $(wc -c "${dossierTmp}/cover.${codecVideoIn}" | cut --delimiter=' ' --fields=1) | xxd -r -g0 >> "${dossierTmp}/dataImage.txt" | printf "0: %.8x" $(wc -c "${dossierTmp}/cover.${codecVideoIn}" | cut --delimiter=' ' --fields=1) | xxd -r -g0 >> "${dossierTmp}/dataImage.txt" | ||
+ | |||
#Image file | #Image file | ||
cat "${dossierTmp}/cover.${codecVideoIn}" >> "${dossierTmp}/dataImage.txt" | cat "${dossierTmp}/cover.${codecVideoIn}" >> "${dossierTmp}/dataImage.txt" | ||
+ | |||
echo "metadata_block_picture=$(base64 --wrap=0 < "${dossierTmp}/dataImage.txt")" >> "${dossierTmp}/fileSaveOgg.txt" | echo "metadata_block_picture=$(base64 --wrap=0 < "${dossierTmp}/dataImage.txt")" >> "${dossierTmp}/fileSaveOgg.txt" | ||
+ | |||
#Update vorbis file comments | #Update vorbis file comments | ||
vorbiscomment --write --raw --commentfile "${dossierTmp}/fileSaveOgg.txt" "${dirOut}/${fileName}.${conteneur}" | vorbiscomment --write --raw --commentfile "${dossierTmp}/fileSaveOgg.txt" "${dirOut}/${fileName}.${conteneur}" | ||
+ | |||
#Delete temp files | #Delete temp files | ||
rm "${dossierTmp}/dataImage.txt" | rm "${dossierTmp}/dataImage.txt" | ||
Ligne 972: | Ligne 1186: | ||
function COVER_MP3() | function COVER_MP3() | ||
{ | { | ||
- | |||
- | |||
if [[ "${typeImage}" == "Cover (front)" ]]; then | if [[ "${typeImage}" == "Cover (front)" ]]; then | ||
typeImage="FRONT_COVER" | typeImage="FRONT_COVER" | ||
+ | |||
elif [[ "${typeImage}" == "Cover (back)" ]]; then | elif [[ "${typeImage}" == "Cover (back)" ]]; then | ||
typeImage="BACK_COVER" | typeImage="BACK_COVER" | ||
+ | |||
elif [[ "${typeImage}" == "Artist/performer" ]]; then | elif [[ "${typeImage}" == "Artist/performer" ]]; then | ||
typeImage="ARTIST" | typeImage="ARTIST" | ||
- | + | ||
elif [[ "${typeImage}" == "Other" ]]; then | elif [[ "${typeImage}" == "Other" ]]; then | ||
typeImage="OTHER" | typeImage="OTHER" | ||
- | + | ||
else | else | ||
typeImage="FRONT_COVER" | typeImage="FRONT_COVER" | ||
+ | |||
fi | fi | ||
+ | |||
# Ajout de l'image au fichier audio | # Ajout de l'image au fichier audio | ||
eyeD3 --add-image="${dossierTmp}/${nameImage}.${codecVideoIn}":"${typeImage}":"${nameImage}" "${dirOut}/${fileName}.${conteneur}" | eyeD3 --add-image="${dossierTmp}/${nameImage}.${codecVideoIn}":"${typeImage}":"${nameImage}" "${dirOut}/${fileName}.${conteneur}" | ||
Ligne 998: | Ligne 1209: | ||
function COVER_OTHER() | function COVER_OTHER() | ||
{ | { | ||
- | # renommage image cover en "cover" | + | if [[ "${typeImage}" == "Cover \(back\)" ]]; then |
- | mv "${dossierTmp}/${nameImage}.${codecVideoIn}" "${dossierTmp}/cover.${codecVideoIn}" | + | |
- | + | # renommage image cover en "cover" | |
- | # Ajout de l'image au fichier audio | + | mv "${dossierTmp}/${nameImage}.${codecVideoIn}" "${dossierTmp}/cover.${codecVideoIn}" |
- | kid3-cli -c "set picture:"${dossierTmp}/cover.${codecVideoIn}" ''" "${dirOut}/${fileName}.${conteneur}" | + | |
+ | # Ajout de l'image au fichier audio | ||
+ | kid3-cli -c "set picture:"${dossierTmp}/cover.${codecVideoIn}" ''" "${dirOut}/${fileName}.${conteneur}" | ||
+ | |||
+ | fi | ||
} | } | ||
+ | |||
#=========================================================================================================== | #=========================================================================================================== | ||
function MAIN() | function MAIN() | ||
Ligne 1010: | Ligne 1225: | ||
# Chargement fichier de configurations | # Chargement fichier de configurations | ||
. "${fileConfig}" | . "${fileConfig}" | ||
+ | |||
YADMAIN | YADMAIN | ||
+ | |||
# Si aucune source sélectionnée | # Si aucune source sélectionnée | ||
if [[ "${status}" -eq "0" ]] && [[ "${fileIn}" == "" ]]; then | if [[ "${status}" -eq "0" ]] && [[ "${fileIn}" == "" ]]; then | ||
status="4" | status="4" | ||
fi | fi | ||
+ | |||
# YADMAIN Bouton "Quitter" ou "Croix fenêtre" | # YADMAIN Bouton "Quitter" ou "Croix fenêtre" | ||
if [[ "${status}" -eq "1" ]] || [[ "${status}" -eq "252" ]]; then | if [[ "${status}" -eq "1" ]] || [[ "${status}" -eq "252" ]]; then | ||
rm -rf "${dossierTmp}" | rm -rf "${dossierTmp}" | ||
exit | exit | ||
- | + | ||
# YADMAIN Bouton "Configuration par défaut" | # YADMAIN Bouton "Configuration par défaut" | ||
elif [[ "${status}" -eq "3" ]]; then | elif [[ "${status}" -eq "3" ]]; then | ||
Ligne 1028: | Ligne 1243: | ||
CONFIGDEFAUT | CONFIGDEFAUT | ||
MAIN | MAIN | ||
+ | |||
# YADMAIN Bouton "Préférences" | # YADMAIN Bouton "Préférences" | ||
elif [[ "${status}" -eq "2" ]]; then | elif [[ "${status}" -eq "2" ]]; then | ||
SAVE | SAVE | ||
YADPREFERENCE | YADPREFERENCE | ||
- | + | ||
# YADPREFERENCE Bouton "Quitter" ou "Croix fenêtre" | # YADPREFERENCE Bouton "Quitter" ou "Croix fenêtre" | ||
if [[ "${status}" -eq "1" ]] || [[ "${status}" -eq "252" ]]; then | if [[ "${status}" -eq "1" ]] || [[ "${status}" -eq "252" ]]; then | ||
rm -rf "${dossierTmp}" | rm -rf "${dossierTmp}" | ||
exit | exit | ||
- | + | ||
# YADPREFERENCE Bouton "Annuler" | # YADPREFERENCE Bouton "Annuler" | ||
elif [[ "${status}" -eq "2" ]]; then | elif [[ "${status}" -eq "2" ]]; then | ||
MAIN | MAIN | ||
- | + | ||
# YADPREFERENCE Bouton "Valider" | # YADPREFERENCE Bouton "Valider" | ||
elif [[ "${status}" -eq "0" ]]; then | elif [[ "${status}" -eq "0" ]]; then | ||
SAVE | SAVE | ||
- | #STREAM | ||
MAIN | MAIN | ||
- | |||
fi | fi | ||
+ | |||
# YADMAIN Bouton "Source" ou aucune source sélectionnée | # YADMAIN Bouton "Source" ou aucune source sélectionnée | ||
elif [[ "${status}" -eq "4" ]]; then | elif [[ "${status}" -eq "4" ]]; then | ||
SAVE | SAVE | ||
YADSOURCE | YADSOURCE | ||
- | + | ||
# YADSOURCE Bouton "Quitter" ou "Croix fenêtre" | # YADSOURCE Bouton "Quitter" ou "Croix fenêtre" | ||
if [[ "${status}" -eq "1" ]] || [[ "${status}" -eq "252" ]]; then | if [[ "${status}" -eq "1" ]] || [[ "${status}" -eq "252" ]]; then | ||
rm -rf "${dossierTmp}" | rm -rf "${dossierTmp}" | ||
exit | exit | ||
- | + | ||
# YADSOURCE Bouton "Annuler" | # YADSOURCE Bouton "Annuler" | ||
elif [[ "${status}" -eq "2" ]]; then | elif [[ "${status}" -eq "2" ]]; then | ||
MAIN | MAIN | ||
- | + | ||
+ | |||
+ | # YADSOURCE choix "Fichier avec analyse" | ||
+ | elif [[ "${source}" == "Fichier avec analyse" ]]; then | ||
+ | YADFILE | ||
+ | |||
+ | # Si dossier selectionner, liste les fichiers contenu du dossier | ||
+ | [[ -d "${fileIn}" ]] && fileIn=$(ls "${fileIn}"/*) | ||
+ | |||
+ | # YADFILE Bouton "Quitter" ou "Croix fenêtre" | ||
+ | if [[ "${status}" -eq "1" ]] || [[ "${status}" -eq "252" ]]; then | ||
+ | rm -rf "${dossierTmp}" | ||
+ | exit | ||
+ | |||
+ | # YADFILE Bouton "Annuler" | ||
+ | elif [[ "${status}" -eq "2" ]]; then | ||
+ | MAIN | ||
+ | |||
+ | # YADFILE Bouton "Valider" | ||
+ | elif [[ "${status}" -eq "0" ]]; then | ||
+ | |||
+ | STREAM | YADPROGRESS | ||
+ | |||
+ | IFS=$'\n' | ||
+ | TabYadStream=($(cat "${dossierTmp}/yadStream.txt")) | ||
+ | rm "${dossierTmp}/yadStream.txt" | ||
+ | |||
+ | MAIN | ||
+ | fi | ||
+ | |||
# YADSOURCE choix "Fichier" | # YADSOURCE choix "Fichier" | ||
elif [[ "${source}" == "Fichier" ]]; then | elif [[ "${source}" == "Fichier" ]]; then | ||
YADFILE | YADFILE | ||
- | + | ||
+ | # Si dossier selectionner, liste les fichiers contenu du dossier | ||
+ | [[ -d "${fileIn}" ]] && fileIn=$(ls "${fileIn}"/*) | ||
+ | |||
# YADFILE Bouton "Quitter" ou "Croix fenêtre" | # YADFILE Bouton "Quitter" ou "Croix fenêtre" | ||
if [[ "${status}" -eq "1" ]] || [[ "${status}" -eq "252" ]]; then | if [[ "${status}" -eq "1" ]] || [[ "${status}" -eq "252" ]]; then | ||
rm -rf "${dossierTmp}" | rm -rf "${dossierTmp}" | ||
exit | exit | ||
- | + | ||
# YADFILE Bouton "Annuler" | # YADFILE Bouton "Annuler" | ||
elif [[ "${status}" -eq "2" ]]; then | elif [[ "${status}" -eq "2" ]]; then | ||
MAIN | MAIN | ||
- | + | ||
# YADFILE Bouton "Valider" | # YADFILE Bouton "Valider" | ||
elif [[ "${status}" -eq "0" ]]; then | elif [[ "${status}" -eq "0" ]]; then | ||
- | STREAM | + | STREAM_SIMPLE | YADPROGRESS |
+ | |||
+ | IFS=$'\n' | ||
+ | TabYadStream=($(cat "${dossierTmp}/yadStream.txt")) | ||
+ | rm "${dossierTmp}/yadStream.txt" | ||
+ | |||
MAIN | MAIN | ||
fi | fi | ||
Ligne 1087: | Ligne 1337: | ||
elif [[ "${source}" == "DVD" ]]; then | elif [[ "${source}" == "DVD" ]]; then | ||
echo "Source DVD à finir" | echo "Source DVD à finir" | ||
- | + | ||
# YADSOURCE choix "CD" | # YADSOURCE choix "CD" | ||
elif [[ "${source}" == "CD" ]]; then | elif [[ "${source}" == "CD" ]]; then | ||
echo "Source CD à finir" | echo "Source CD à finir" | ||
- | + | ||
# YADSOURCE choix "DDL" | # YADSOURCE choix "DDL" | ||
elif [[ "${source}" == "DDL" ]]; then | elif [[ "${source}" == "DDL" ]]; then | ||
echo "Source DDL à finir" | echo "Source DDL à finir" | ||
+ | |||
fi | fi | ||
Ligne 1101: | Ligne 1351: | ||
elif [[ "${status}" -eq "0" ]]; then | elif [[ "${status}" -eq "0" ]]; then | ||
SAVE | SAVE | ||
- | + | ||
- | # Récupération de la valeur TRUE et FALSE depuis YADMAIN et fusion avec les données du fichier stream.txt | + | if [[ "${source}" == "Fichier avec analyse" ]]; then |
- | IFS=$"|" | + | # Récupération de la valeur TRUE et FALSE depuis YADMAIN et fusion avec les données du fichier stream.txt |
- | numLine="4" | + | IFS=$"|" |
- | stream=$( | + | numLine="4" # Ligne 4 première ligne avec valeur TRUE ou FALSE |
- | while read line; do | + | stream=$( |
- | bol=$(awk 'NR == '${numLine}' {printf "%s" ,$1}' <<< "$(printf "%s\n" ${yadMain} | awk NF)") | + | while read line; do |
- | printf "${bol}${line}\n" | + | bol=$(awk 'NR == '${numLine}' {printf "%s" ,$1}' <<< "$(printf "%s\n" ${yadMain} | awk NF)") |
- | ((numLine+=1)) | + | printf "${bol}${line}\n" |
- | done <<< $(cat "${dossierTmp}/stream.txt") | awk -F [\|] '{if ($1 ~ /TRUE/) {print $0}}') | + | ((numLine+=1)) |
- | + | done <<< $(cat "${dossierTmp}/stream.txt") | awk -F [\|] '{if ($1 ~ /TRUE/) {print $0}}') | |
- | SAVE | + | |
- | FFMPEG | + | SAVE |
- | MAIN | + | FFMPEG |
- | + | MAIN | |
+ | |||
+ | elif [[ "${source}" == "Fichier" ]]; then | ||
+ | |||
+ | SAVE | ||
+ | FFMPEG_SIMPLE | ||
+ | MAIN | ||
+ | fi | ||
fi | fi | ||
} | } | ||
#=========================================================================================================== | #=========================================================================================================== | ||
CONFIGURATION | CONFIGURATION | ||
+ | |||
+ | #fileIn="/home/$USER/Bureau/0in.m4a" ## TEST | ||
+ | #STREAM ## TEST | ||
+ | |||
MAIN | MAIN | ||
+ | |||
+ | |||
+ | |||
</code> | </code> | ||