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 →
Ceci est une ancienne révision du document !
Installation des paquets:
apt-get update apt-get install ffmpeg yad flac vorbis-tools eyed3 kid3-cli
Copier le script ci-dessous dans un fichier et le nommer slymedia.sh
Déplacer le fichier slymedia.sh dans le dossier /home ou a convenance.
Avant le premier lancement il faut que le fichier soit exécutable (adapter si nécessaire le chemin du fichier).
chmod u+x /$HOME/slymedia.sh
Pour lancer le script, ouvrir un terminal graphique (gnome terminal, terminal mate…) et taper le chemin du fichier slymedia.sh (adapter si nécessaire le chemin du fichier).
ou
Faire un double clic sur le fichier.
/$HOME/slymedia.sh
#! /bin/bash # Paquets à installer: ffmpeg yad flac vorbis-tools eyed3 kid3-cli #=========================================================================================================== function YADMAIN() { yadMain=$(yad --form \ --geometry="640x720" \ --borders="20" \ --title "SlyMedia" \ --item-separator="!" \ --columns=1 \ --scroll \ --field=" ":LBL " " \ --field="<b>Profil</b>":CB "${profile}!Audio FLAC!Audio vorbis!Audio aac!Audio mp3!Vidéo mkv - x264 - vorbis!Vidéo mkv - x264 - aac!Vidéo mkv - x264 - mp3!Vidéo mkv - x265 - vorbis!Vidéo mkv - x265 - aac!Vidéo mkv - x265 - mp3" \ --field=" ":LBL " " \ --field="<b>Qualité</b>":CB "${quality}!Excellente!Elevée!Moyenne!Minimum!Faible" \ --field=" ":LBL " " \ --field="<b>Dossier destination</b>":DIR "${dirOut}" \ --field=" ":LBL " " \ --field="":LBL "" \ --field=" ":LBL " " \ --button="Quitter!gtk-quit!:1" \ --button="Options par défaut!gtk-refresh!:3" \ --button="Préférences!gtk-preferences!:2" \ --button="Source!gtk-file!:4" \ --button="Lancer conversion!gtk-convert!:0" \ "${cdeYadStream[@]}") # Status de sortie Yad status="$?" # Récupération variables profile=$(awk -F [\|] '{print $2}' <<< "${yadMain}") quality=$(awk -F [\|] '{print $4}' <<< "${yadMain}") dirOut=$(awk -F [\|] '{print $6}' <<< "${yadMain}") } #=========================================================================================================== function YADPREFERENCE() { # Sélection du ou des fichiers source yadPreference=$(yad --form \ --title "SlyMedia" \ --geometry="640x720" \ --borders="20" \ --field="<b>Préférences vidéo</b>":LBL " " \ --field="Définition de la vidéo":CB "${definition}!Identique à la source!3840x2160 (UHD 16:9)!1920x1080 (FULL-HD 16:9)!1280x720 (HD 16:9)!1024x576 (16:9)!768x432 (16:9)!512x288 (16:9)!256x144 (16:9)!720x576 (SD PAL)!720x480 (SD NTSC)!640x480 (4:3)!320x240 (4:3)!1024x768 (4:3)!1280x960 (4:3)!1280x800 (16:10)!1440x900 (16:10)!1680x1050 (16:10)!1920x1200 (16:10)!2560x1600 (16:10)" \ --field=" ":LBL " " \ --field=" ":LBL " " \ --field=" ":LBL " " \ --field="<b>Préférences audio</b>":LBL " " \ --field="Langue audio préférée":CB "${langAudio}!Toutes les langues!Aucune!Français!Allemand!Anglais!Arabe!Espagnol!Espéranto!Italien!Japonais!Latin!Luxembourgeois!Néerlandais!Portugais!Romanche!Russe" \ --field=" ":LBL " " \ --field="Débit binaire":CB "${typeRate}!VBR!CBR" \ --field=" ":LBL " " \ --field=" ":LBL " " \ --field=" ":LBL " " \ --field="<b>Préférences sous-titre</b>":LBL " " \ --field="Langue sous-titre préférée":CB "${langSub}!Toutes les langues!Aucune!Français!Allemand!Anglais!Arabe!Espagnol!Espéranto!Italien!Japonais!Latin!Luxembourgeois!Néerlandais!Portugais!Romanche!Russe" \ --field=" ":LBL " " \ --field=" ":LBL " " \ --field=" ":LBL " " \ --field="<b>Options</b>":LBL " " \ --field="Supprimer toutes les métadonnées":CHK "${metadata}" \ --field="Ne pas encoder si même codec que l'original":CHK "${nocopy}" \ --field="Dossier source":DIR "${dirIn}" \ --button="gtk-quit:1" \ --button="gtk-cancel:2" \ --button="gtk-ok:0") # Status de sortie Yad status="$?" # Récupération variables definition=$(awk -F [\|] '{print $2}' <<< "${yadPreference}") langAudio=$(awk -F [\|] '{print $7}' <<< "${yadPreference}") typeRate=$(awk -F [\|] '{print $9}' <<< "${yadPreference}") langSub=$(awk -F [\|] '{print $14}' <<< "${yadPreference}") metadata=$(awk -F [\|] '{print $19}' <<< "${yadPreference}") nocopy=$(awk -F [\|] '{print $20}' <<< "${yadPreference}") dirIn=$(awk -F [\|] '{print $21}' <<< "${yadPreference}") } #=========================================================================================================== function YADSOURCE() { IFS=$"|" yadSource=$(yad --list \ --radiolist \ --title="Slymedia" \ --text="Choississez une source" \ --print-all \ --geometry="320x300" \ --borders="20" \ --center \ --button="gtk-quit:1" \ --button="gtk-cancel:2" \ --button="gtk-ok:0" \ --column="" \ --column="Type de source" \ "TRUE" "Fichier" \ "FALSE" "DVD" \ "FALSE" "CD" \ "FALSE" "DDL") # Status de sortie Yad status="$?" # Récupération variables source=$(awk -F [\|] '/TRUE/ {print $2}' <<< "${yadSource}") } #=========================================================================================================== function YADFILE() { # Sélection du ou des fichiers source fileIn=$(yad --file \ --multiple \ --title "SlyMedia" \ --geometry="640x720" \ --borders="20" \ --separator="\n" \ --center \ --file-filter="Fichier media | *mkv *.ogg *.mp4 *.avi *.vob *.flac *.mp3 *.m4a" \ --file-filter "Tous | *" \ --filename="${dirIn}" \ --button="gtk-quit:1" \ --button="gtk-cancel:2" \ --button="gtk-ok:0") # Status de sortie Yad status="$?" } #=========================================================================================================== function CONFIGURATION() { # Création du dossier .slymedia dirSylmedia="/home/$USER/.slymedia" [[ ! -d "${dirSylmedia}" ]] && mkdir "${dirSylmedia}" # Suppression des anciens dossiers temporaires rm -rf "${dirSylmedia}"/tmp* # Création du dossier temporaire dossierTmp="$(mktemp -d "${dirSylmedia}/tmp-XXXXXXXXXXX")" # Création du fichier de configurations fileConfig="${dirSylmedia}/config.txt" [[ ! -f "${fileConfig}" ]] && CONFIGDEFAUT } #=========================================================================================================== function CONFIGDEFAUT() { # Options par défaut echo -e "profile=\"Vidéo mkv - x264 - vorbis\"\nquality=\"Elevée\"\ndirOut=\"${HOME}\"\ndefinition=\"Identique à la source\"\nlangAudio=\"Toutes les langues\"\ntypeRate=\"VBR\"\nlangSub=\"Toutes les langues\"\nmetadata=\"FALSE\"\nnocopy=\"FALSE\"\ndirIn=\"${HOME}/\"" > "${fileConfig}" } #=========================================================================================================== function SAVE() { # 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 "profile: ${profile}" echo "quality: ${quality}" echo "dirOut: ${dirOut}" echo "definition: ${definition}" echo "langAudio: ${langAudio}" echo "typeRate: ${typeRate}" echo "langSub: ${langSub}" echo "metadata: ${metadata}" echo "nocopy: ${nocopy}" echo "dirIn: ${dirIn}" echo "==============================================" } #=========================================================================================================== function LANGUE() { if [[ "${lang}" == "fre" ]] || [[ "${lang}" == "fra" ]] || [[ "${lang}" == "fr" ]]; then language="Français" languageISO="fre" elif [[ "${lang}" == "gre" ]] || [[ "${lang}" == "deu" ]] || [[ "${lang}" == "de" ]]; then language="Allemand" languageISO="deu" elif [[ "${lang}" == "eng" ]] || [[ "${lang}" == "en" ]]; then language="Anglais" languageISO="eng" elif [[ "${lang}" == "ara" ]] || [[ "${lang}" == "ar" ]]; then language="Arabe" languageISO="ara" elif [[ "${lang}" == "bre" ]] || [[ "${lang}" == "br" ]]; then language="Breton" languageISO="bre" elif [[ "${lang}" == "cat" ]] || [[ "${lang}" == "ca" ]]; then language="Catalan" languageISO="cat" elif [[ "${lang}" == "chi" ]] || [[ "${lang}" == "zho" ]] || [[ "${lang}" == "zh" ]]; then language="Chinois" languageISO="chi" elif [[ "${lang}" == "kor" ]] || [[ "${lang}" == "ko" ]]; then language="Coréen" languageISO="kor" elif [[ "${lang}" == "cos" ]] || [[ "${lang}" == "co" ]]; then language="Corse" languageISO="cos" elif [[ "${lang}" == "hat" ]] || [[ "${lang}" == "ht" ]]; then language="Créole_haïtien" languageISO="hat" elif [[ "${lang}" == "hat" ]] || [[ "${lang}" == "ht" ]]; then language="Créole_haïtien" languageISO="hat" elif [[ "${lang}" == "rcf" ]] || [[ "${lang}" == "rc" ]]; then language="Créole_Réunionnais" languageISO="rcf" elif [[ "${lang}" == "gla" ]] || [[ "${lang}" == "gd" ]]; then language="Écossais" languageISO="gla" elif [[ "${lang}" == "spa" ]] || [[ "${lang}" == "es" ]]; then language="Espagnol" languageISO="spa" elif [[ "${lang}" == "epo" ]] || [[ "${lang}" == "eo" ]]; then language="Espéranto" languageISO="epo" elif [[ "${lang}" == "fin" ]] || [[ "${lang}" == "fi" ]]; then language="Finnois" languageISO="fin" elif [[ "${lang}" == "glg" ]] || [[ "${lang}" == "gl" ]]; then language="Galicien" languageISO="glg" elif [[ "${lang}" == "wel" ]] || [[ "${lang}" == "cym" ]] || [[ "${lang}" == "cy" ]]; then language="Gallois" languageISO="wel" elif [[ "${lang}" == "gre" ]] || [[ "${lang}" == "ell" ]] || [[ "${lang}" == "el" ]]; then language="Grec" languageISO="gre" elif [[ "${lang}" == "heb" ]] || [[ "${lang}" == "he" ]]; then language="Hébreu" languageISO="heb" elif [[ "${lang}" == "hin" ]] || [[ "${lang}" == "hi" ]]; then language="Hindi" languageISO="hin" elif [[ "${lang}" == "hun" ]] || [[ "${lang}" == "hu" ]]; then language="Hongrois" languageISO="hun" elif [[ "${lang}" == "gle" ]] || [[ "${lang}" == "ga" ]]; then language="Irlandais" languageISO="gle" elif [[ "${lang}" == "ice" ]] || [[ "${lang}" == "isl" ]] || [[ "${lang}" == "is" ]]; then language="Islandais" languageISO="ice" elif [[ "${lang}" == "ita" ]] || [[ "${lang}" == "it" ]]; then language="Italien" languageISO="ita" elif [[ "${lang}" == "jpn" ]] || [[ "${lang}" == "jp" ]]; then language="Japonais" languageISO="jpn" elif [[ "${lang}" == "lat" ]] || [[ "${lang}" == "la" ]]; then language="Latin" languageISO="lat" elif [[ "${lang}" == "ltz" ]] || [[ "${lang}" == "la" ]]; then language="Luxembourgeois" languageISO="ltz" elif [[ "${lang}" == "dut" ]] || [[ "${lang}" == "nld" ]] || [[ "${lang}" == "lb" ]]; then language="Néerlandais" languageISO="dut" elif [[ "${lang}" == "nor" ]] || [[ "${lang}" == "no" ]]; then language="Norvégien" languageISO="nor" elif [[ "${lang}" == "por" ]] || [[ "${lang}" == "pt" ]]; then language="Portugais" languageISO="por" elif [[ "${lang}" == "roh" ]] || [[ "${lang}" == "rm" ]]; then language="Romanche" languageISO="roh" elif [[ "${lang}" == "rus" ]] || [[ "${lang}" == "ru" ]]; then language="Russe" languageISO="rus" elif [[ "${lang}" == "swe" ]] || [[ "${lang}" == "sv" ]]; then language="Suédois" languageISO="swe" else language="Inconnu" languageISO="und" fi } #=========================================================================================================== function STREAM() { [[ -f "${dossierTmp}/stream.txt" ]] && rm "${dossierTmp}/stream.txt" cdeYadStream=() IFS=$'\n' for i in ${fileIn}; do #ffprobe -i "${i}" -hide_banner -v quiet -show_streams STREAMTITLE STREAMVIDEO STREAMAUDIO STREAMSUBTITLE cdeYadStream=(${cdeYadStream[@]} --field=" ":LBL " ") done } #=========================================================================================================== function STREAMTITLE() { # Titre et durée streamFormat=$(ffprobe -i "${i}" -hide_banner -v quiet -show_entries format=duration,bit_rate -of csv=s="|") durationS=$(awk -F [\|] '{print $2}' <<< "${streamFormat}") durationHMS=$(date -d@"${durationS}" -u +%H:%M:%S) rateTotal=$(awk -F [\|] '{printf "%d kb/s" ,($3/1000)}' <<< "${streamFormat}") # Mise en mémoire dans tableau cdeYadStream cdeYadStream=(${cdeYadStream[@]} --field="<b>TITRE: $(basename "${i}") - ${durationHMS} - ${rateTotal}</b>":LBL " ") } #=========================================================================================================== 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 index=$(awk -F [\|] '{print $2}' <<< "${line}") codec=$(awk -F [\|] '{print $3}' <<< "${line}") width=$(awk -F [\|] '{print $4}' <<< "${line}") height=$(awk -F [\|] '{print $5}' <<< "${line}") fps1=$(awk -F [\|] '{print $6}' <<< "${line}" | awk -F [\/] '{print $1}') fps2=$(awk -F [\|] '{print $6}' <<< "${line}" | awk -F [\/] '{print $2}') # Vérifiction si fps1 et fps2 sont des valeurs numériques if [[ "${fps1}" = +([0-9]) ]] && [[ "${fps2}" = +([0-9]) ]]; then fps=$(echo "${fps1} / ${fps2}" | bc -l | awk '{printf "%.3f" ,$1}') elif [[ "${fps1}" = +([0-9]) ]] && [[ "${fps2}" != +([0-9]) ]]; then fps=$(awk '{printf "%d" ,$1}' <<< "${fps1}") else fps="N/A" fi # Mise en forme piste vidéo (envoi vers fichier tmp et envoi dans tableau cdeYadStream) if [[ "${index}" != "" ]]; 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") fi done <<< "${streamVideo}" } #=========================================================================================================== 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 index=$(awk -F [\|] '{print $2}' <<< "${line}") codec=$(awk -F [\|] '{print $3}' <<< "${line}") rate=$(awk -F [\|] '{print $4}' <<< "${line}") channelOut=$(awk -F [\|] '{print $5}' <<< "${line}") lang=$(awk -F [\|] '{print $NF}' <<< "${line}") #debitAudio=$(awk -F [\|] '{print $6}' <<< "${line}") LANGUE # Calcul du débit audio #if [[ "${debitAudio}" = +([0-9]) ]] ; then # debitAudio=$(echo "${debitAudio} / 1000" | bc) #else # debitAudio="N/A" #fi # Affectation TRUE ou FALSE if [[ "${language}" == "${langAudio}" ]] || [[ "${language}" == "Inconnu" ]] || [[ "${langAudio}" == "Toutes les langues" ]]; then bol="TRUE" else bol="FALSE" fi # 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() { 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 index=$(awk -F [\|] '{print $2}' <<< "${line}") codec=$(awk -F [\|] '{print $3}' <<< "${line}") lang=$(awk -F [\|] '{print $NF}' <<< "${line}") LANGUE # Affectation TRUE ou FALSE if [[ "${language}" == "${langSub}" ]] || [[ "${language}" == "Inconnu" ]] || [[ "${langSub}" == "Toutes les langues" ]]; then bol="TRUE" else bol="FALSE" fi # Mise en forme piste audio (envoi vers fichier tmp et envoi dans tableau cdeYadStream) if [[ "${index}" != "" ]]; then printf "|${i}|0:${index}|SUBTITLE|${codec}|${language}|${languageISO}|\n" >> "${dossierTmp}/stream.txt" cdeYadStream=(${cdeYadStream[@]} --field="0:${index} | SUBTITLE | ${language} ${codec}":CHK "${bol}") fi done <<< "${streamSub}" } #=========================================================================================================== function PROFIL() { if [[ "${profile}" = "Audio FLAC" ]]; then FLAC conteneur="flac" elif [[ "${profile}" = "Audio vorbis" ]]; then VORBIS conteneur="ogg" elif [[ "${profile}" = "Audio aac" ]]; then AAC conteneur="m4a" elif [[ "${profile}" = "Audio mp3" ]]; then MP3 conteneur="mp3" elif [[ "${profile}" = "Vidéo mkv - x264 - vorbis" ]]; then X264 VORBIS conteneur="mkv" elif [[ "${profile}" = "Vidéo mkv - x264 - aac" ]]; then X264 AAC conteneur="mkv" elif [[ "${profile}" = "Vidéo mkv - x264 - mp3" ]]; then X264 MP3 conteneur="mkv" elif [[ "${profile}" = "Vidéo mkv - x265 - aac" ]]; then X265 AAC conteneur="mkv" elif [[ "${profile}" = "Vidéo mkv - x265 - mp3" ]]; then X265 MP3 conteneur="mkv" fi } #=========================================================================================================== function QUALITY_VIDEO() { # Commande selon la qualité if [[ "${quality}" == "Excellente" ]]; then cdeQualityVideo=(${qVideo1[@]}) elif [[ "${quality}" == "Elevée" ]]; then cdeQualityVideo=(${qVideo2[@]}) elif [[ "${quality}" == "Moyenne" ]]; then cdeQualityVideo=(${qVideo3[@]}) elif [[ "${quality}" == "Minimum" ]]; then cdeQualityVideo=(${qVideo4[@]}) elif [[ "${quality}" == "Faible" ]]; then 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 } #=========================================================================================================== function X265() { if [[ "${codecVideoIn}" = "h265" ]] && [[ "${nocopy}" = "TRUE" ]]; then cVideo="copy" else cVideo="libx265" 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) } #=========================================================================================================== function X264() { if [[ "${codecVideoIn}" = "h264" ]] && [[ "${nocopy}" = "TRUE" ]]; then cVideo="copy" else cVideo="libx264" 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) } #=========================================================================================================== function FLAC() { if [[ "${codecAudioIn}" = "flac" ]] && [[ "${nocopy}" = "TRUE" ]]; then cAudio="copy" else cAudio="flac" fi } #=========================================================================================================== function VORBIS() { if [[ "${codecAudioIn}" = "vorbis" ]] && [[ "${nocopy}" = "TRUE" ]]; then cAudio="copy" else codecAudioOut="vorbis" cAudio="libvorbis" 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 } #=========================================================================================================== function AAC() { if [[ "${codecAudioIn}" = "aac" ]] && [[ "${nocopy}" = "TRUE" ]]; then cAudio="copy" else codecAudioOut="aac" cAudio="aac" fi 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) qAudio2=(-b:a 256k) qAudio3=(-b:a 192k) qAudio4=(-b:a 128k) qAudio5=(-b:a 64k) fi } #=========================================================================================================== function MP3() { if [[ "${codecAudioIn}" = "mp3" ]] && [[ "${nocopy}" = "TRUE" ]]; then cAudio="copy" else codecAudioOut="mp3" cAudio="libmp3lame" fi 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) qAudio2=(-b:a 256k) qAudio3=(-b:a 192k) qAudio4=(-b:a 128k) qAudio5=(-b:a 64k) fi } #=========================================================================================================== function FFMPEG() { IFS=$'\n' for iFileIn in ${fileIn}; do # Initialisation commandes cdeVideo=() cdeAudio=() cdeSub=() # Nom fichier fileNameExt=$(basename "${iFileIn}") fileName="${fileNameExt%.*}" # Recherche map mapVideo=$(awk -F [\|] '{if ($4 ~ /VIDEO/ && /'${fileName}'/) {printf "%s\n" ,$3}}' <<< "${stream}") mapAudio=$(awk -F [\|] '{if ($4 ~ /AUDIO/ && /'${fileName}'/) {printf "%s\n" ,$3}}' <<< "${stream}") mapSub=$(awk -F [\|] '{if ($4 ~ /SUBTITLE/ && /'${fileName}'/) {printf "%s\n" ,$3}}' <<< "${stream}") echo "==============================================" echo " iFileIn: ${iFileIn}" echo " fileName: ${fileName}" echo " mapVideo: ${mapVideo}" echo " mapAudio: ${mapAudio}" echo " mapSub: ${mapSub}" # Metadonnée if [[ "${metadata}" == "TRUE" ]]; then cdeMetadata=(-map_metadata -1) else cdeMetadata=() fi FFMPEG_VIDEO FFMPEG_AUDIO # Conversion fichier ffmpeg -y -i "${iFileIn}" -loglevel debug "${cdeMetadata[@]}" "${cdeVideo[@]}" "${cdeAudio[@]}" "${dirOut}/${fileName}.${conteneur}" ffmpeg -i "${dirOut}/${fileName}.${conteneur}" ## TEST ## echo "ffmpeg -y -i "${iFileIn}" "${cdeMetadata[@]}" "${cdeVideo[@]}" "${cdeAudio[@]}" "${dirOut}/${fileName}.${conteneur}"" ## TEST ## # Cover fichier numImage="1" for iMapVideo in ${mapVideo}; do # Recherche codec vidéo map vidéo codecVideoIn=$(awk -F [\|] '{if ($4 ~ /VIDEO/ && /'${iMapVideo}'/ && /'${fileName}'/) {printf "%s" ,$5}}' <<< "${stream}") if [[ "${codecVideoIn}" == "mjpeg" ]] || [[ "${codecVideoIn}" == "png" ]]; then COVER fi done done } #=========================================================================================================== function FFMPEG_VIDEO() { numFile="" for iMapVideo in ${mapVideo}; do codecVideoIn=$(awk -F [\|] '{if ($4 ~ /VIDEO/ && /'${iMapVideo}'/ && /'${fileName}'/) {printf "%s" ,$5}}' <<< "${stream}") PROFIL QUALITY_VIDEO if [[ "${profile}" = "Audio FLAC" ]] || [[ "${profile}" = "Audio vorbis" ]] || [[ "${profile}" = "Audio aac" ]] || [[ "${profile}" = "Audio mp3" ]]; then cdeVideo=(-vn) else cdeVideo=(${cdeVideo[@]} -map ${iMapVideo} -c:v ${cVideo} ${cdeQualityVideo[@]}) fi echo "cdeVideo: ${cdeVideo[@]}" done } #=========================================================================================================== function FFMPEG_AUDIO() { numAudio="0" for iMapAudio in ${mapAudio}; do codecAudioIn=$(awk -F [\|] '{if ($4 ~ /AUDIO/ && /'${iMapAudio}'/ && /'${fileName}'/) {printf "%s" ,$5}}' <<< "${stream}") languageISO=$(awk -F [\|] '{if ($4 ~ /AUDIO/ && $3 ~ /'${iMapAudio}'/ && /'${fileName}'/) {printf "%s" ,$7}}' <<< "${stream}") PROFIL QUALITY_AUDIO cdeAudio=(${cdeAudio[@]} -map ${iMapAudio} -metadata:s:a:${numAudio} language="${languageISO}" -c:a ${cAudio} ${cdeQualityAudio[@]} ${channel[@]} -cutoff 20000) ((numAudio+=1)) done } #=========================================================================================================== function COVER() { # Si codecVideoIn = mjpeg --> jpeg [[ "${codecVideoIn}" == "mjpeg" ]] && codecVideoIn="jpeg" # Recherche numéro id depuis la map id=$(awk -F [\:] '{print $2}' <<< "${iMapVideo}") # 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}') # 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}') if [[ "${nameImage}" == "" ]]; then nameImage="cover_${typeImage}" elif [[ "${nameImage}" == "${nameImageSave}" ]]; then nameImage="${nameImage}_${numImage}" fi # Sauvegarde du nom de l'image nameImageSave="${numImage}" ((numImage+=1)) # Extraction image du fichier source ffmpeg -y -i "${iFileIn}" -map ${iMapVideo} -an "${dossierTmp}/${nameImage}.${codecVideoIn}" # Image cover pour fichier audio flac if [[ "${profile}" = "Audio FLAC" ]]; then COVER_FLAC # Image cover pour fichier audio vorbis elif [[ "${profile}" = "Audio vorbis" ]]; then COVER_OGG # Image cover pour fichier audio mp3 elif [[ "${profile}" = "Audio mp3" ]]; then COVER_MP3 # Image cover pour fichier audio aac elif [[ "${profile}" = "Audio aac" ]]; then COVER_OTHER fi echo "=== COVER ===" echo "id: ${id}" echo "typeImage: ${typeImage}" echo "nameImage: ${nameImage}" } #=========================================================================================================== function COVER_FLAC() { if [[ "${typeImage}" == "Cover (front)" ]]; then typeImage="3" elif [[ "${typeImage}" == "Cover (back)" ]]; then typeImage="4" elif [[ "${typeImage}" == "Other" ]]; then typeImage="0" else typeImage="3" fi # Ajout de l'image au fichier audio metaflac --import-picture-from="${typeImage}||${nameImage}||${dossierTmp}/${nameImage}.${codecVideoIn}" "${dirOut}/${fileName}.${conteneur}" } #=========================================================================================================== function COVER_OGG() { # 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}') if [[ "${typeImage}" == "Cover (front)" ]]; then typeImage="3" elif [[ "${typeImage}" == "Cover (back)" ]]; then typeImage="4" elif [[ "${typeImage}" == "Artist/performer" ]]; then typeImage="8" elif [[ "${typeImage}" == "Other" ]]; then typeImage="0" else typeImage="3" fi # Sauvegarde données exsistantes du fichier source vorbiscomment --list --raw "${dirOut}/out.${conteneur}" > "${dossierTmp}/fileSaveOgg.txt" #Suppression image exsistante #sed -i -e '/^metadata_block_picture/d' "${dossierTmp}/fileSaveOgg.txt" # Metadata_block_picture format #Lien: https://xiph.org/flac/format.html#metadata_block_picture imageMimeType=$(file -b --mime-type "${dossierTmp}/${nameImage}.${codecVideoIn}") printf "0: %.8x" "${typeImage}" | xxd -r -g0 >> "${dossierTmp}/dataImage.txt" printf "0: %.8x" $(echo -n "${imageMimeType}" | wc -c) | xxd -r -g0 >> "${dossierTmp}/dataImage.txt" echo -n "${imageMimeType}" >> "${dossierTmp}/dataImage.txt" printf "0: %.8x" $(echo -n "${nameImage}" | wc -c) | xxd -r -g0 >> "${dossierTmp}/dataImage.txt" echo -n "${nameImage}" >> "${dossierTmp}/dataImage.txt" printf "0: %.8x" 0 | xxd -r -g0 >> "${dossierTmp}/dataImage.txt" printf "0: %.8x" 0 | xxd -r -g0 >> "${dossierTmp}/dataImage.txt" 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" #Image file cat "${dossierTmp}/cover.${codecVideoIn}" >> "${dossierTmp}/dataImage.txt" echo "metadata_block_picture=$(base64 --wrap=0 < "${dossierTmp}/dataImage.txt")" >> "${dossierTmp}/fileSaveOgg.txt" #Update vorbis file comments vorbiscomment --write --raw --commentfile "${dossierTmp}/fileSaveOgg.txt" "${dirOut}/${fileName}.${conteneur}" #Delete temp files rm "${dossierTmp}/dataImage.txt" rm "${dossierTmp}/fileSaveOgg.txt" } #=========================================================================================================== function COVER_MP3() { if [[ "${typeImage}" == "Cover (front)" ]]; then typeImage="FRONT_COVER" elif [[ "${typeImage}" == "Cover (back)" ]]; then typeImage="BACK_COVER" elif [[ "${typeImage}" == "Artist/performer" ]]; then typeImage="ARTIST" elif [[ "${typeImage}" == "Other" ]]; then typeImage="OTHER" else typeImage="FRONT_COVER" fi # Ajout de l'image au fichier audio eyeD3 --add-image="${dossierTmp}/${nameImage}.${codecVideoIn}":"${typeImage}":"${nameImage}" "${dirOut}/${fileName}.${conteneur}" } #=========================================================================================================== function COVER_OTHER() { # renommage image cover en "cover" mv "${dossierTmp}/${nameImage}.${codecVideoIn}" "${dossierTmp}/cover.${codecVideoIn}" # Ajout de l'image au fichier audio kid3-cli -c "set picture:"${dossierTmp}/cover.${codecVideoIn}" ''" "${dirOut}/${fileName}.${conteneur}" } #=========================================================================================================== function MAIN() { # Chargement fichier de configurations . "${fileConfig}" YADMAIN # Si aucune source sélectionnée if [[ "${status}" -eq "0" ]] && [[ "${fileIn}" == "" ]]; then status="4" fi # YADMAIN Bouton "Quitter" ou "Croix fenêtre" if [[ "${status}" -eq "1" ]] || [[ "${status}" -eq "252" ]]; then rm -rf "${dossierTmp}" exit # YADMAIN Bouton "Configuration par défaut" elif [[ "${status}" -eq "3" ]]; then SAVE CONFIGDEFAUT MAIN # YADMAIN Bouton "Préférences" elif [[ "${status}" -eq "2" ]]; then SAVE YADPREFERENCE # YADPREFERENCE Bouton "Quitter" ou "Croix fenêtre" if [[ "${status}" -eq "1" ]] || [[ "${status}" -eq "252" ]]; then rm -rf "${dossierTmp}" exit # YADPREFERENCE Bouton "Annuler" elif [[ "${status}" -eq "2" ]]; then MAIN # YADPREFERENCE Bouton "Valider" elif [[ "${status}" -eq "0" ]]; then SAVE #STREAM MAIN fi # YADMAIN Bouton "Source" ou aucune source sélectionnée elif [[ "${status}" -eq "4" ]]; then SAVE YADSOURCE # YADSOURCE Bouton "Quitter" ou "Croix fenêtre" if [[ "${status}" -eq "1" ]] || [[ "${status}" -eq "252" ]]; then rm -rf "${dossierTmp}" exit # YADSOURCE Bouton "Annuler" elif [[ "${status}" -eq "2" ]]; then MAIN # YADSOURCE choix "Fichier" elif [[ "${source}" == "Fichier" ]]; then YADFILE # 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 MAIN fi # YADSOURCE choix "DVD" elif [[ "${source}" == "DVD" ]]; then echo "Source DVD à finir" # YADSOURCE choix "CD" elif [[ "${source}" == "CD" ]]; then echo "Source CD à finir" # YADSOURCE choix "DDL" elif [[ "${source}" == "DDL" ]]; then echo "Source DDL à finir" fi # YADMAIN Bouton "Lancer conversion" elif [[ "${status}" -eq "0" ]]; then SAVE # Récupération de la valeur TRUE et FALSE depuis YADMAIN et fusion avec les données du fichier stream.txt IFS=$"|" numLine="4" stream=$( while read line; do bol=$(awk 'NR == '${numLine}' {printf "%s" ,$1}' <<< "$(printf "%s\n" ${yadMain} | awk NF)") printf "${bol}${line}\n" ((numLine+=1)) done <<< $(cat "${dossierTmp}/stream.txt") | awk -F [\|] '{if ($1 ~ /TRUE/) {print $0}}') SAVE FFMPEG MAIN fi } #=========================================================================================================== CONFIGURATION MAIN