Aller au contenu

DS Audio galère avec les fichiers ALAC


LolYangccool

Messages recommandés

Bonjour,

Sur iPad, j'utilise DS audio pour aller chercher la musique sur le NAS et la copier sur mon iPad afin de pouvoir en profiter même hors connexion.

Le problème c'est que certains fichiers ALAC sont lus d'autres pas, alors même que je n'ai pas de soucis avec mes Mac pour les lire et qu'en principe l'application est sensé les lire. Je viens d'ailleurs de mettre une note très sévère sur l'App Store puisque ça fait quelques heures que je cherche une solution déjà...

 

Merci à vous si vous en avez une.

Lien vers le commentaire
Partager sur d’autres sites

Bon du coup, est-il possible de détecter dans le dossier iTunes les morceaux en ALAC et de réencoder uniquement ceux-là en MP3 très facilement afin de les envoyer sur le NAS dans un dossier contenant que des MP3 pour ensuite les mettre sur l'iPad ?

Le top serait que cette appli scanne le dossier, copie tel quel dans un autre dossier les MP3 et réencode les ALAC en MP3 avant de les envoyer dans un autre dossier.

Une sorte de tri sélectif en soit.

 

Avec mon Mac Pro ça devrait être fait assez vite, mais faut trouver la bonne appli...

 

SI quelqu'un a une idée, pas nécessairement besoin d'ALAC sur mon iPad, mais comme c'est un 128Go je me disais que ce serait dommage de ne pas en profiter, vu les enceintes que j'ai. ;)

Lien vers le commentaire
Partager sur d’autres sites

Bon du coup, est-il possible de détecter dans le dossier iTunes les morceaux en ALAC et de réencoder uniquement ceux-là en MP3 très facilement afin de les envoyer sur le NAS dans un dossier contenant que des MP3 pour ensuite les mettre sur l'iPad ?

Le top serait que cette appli scanne le dossier, copie tel quel dans un autre dossier les MP3 et réencode les ALAC en MP3 avant de les envoyer dans un autre dossier.

 

Avec Automator et les actions de dossiers ça doit se faire assez simplement, en utilisant l'outil en ligne de commande fourni avec XLD.

 

Sinon directement un applescript qui pilote XLD.

 

La difficulté va être de distinguer un fichier ALAC d'un fichier AAC, vu que les deux ont l'extension .m4a... Il faudrait alors d'abord créer un dossier intelligent qui sélectionne les fichiers ALAC en se basant sur le débit (>350kbps par exemple).

 

Tu peux aussi classer les morceaux suivant leur débit dans iTunes et utiliser la fonction conversion pour créer des versions mp3. Mais ça va créer des doublons...

Lien vers le commentaire
Partager sur d’autres sites

En y repensant, j'ai un script bash qui fait exactement ce que tu veux...! Il synchronise toute une arborescence musicale vers une autre, en recopiant les fichiers dont le débit est inférieur à 400kbps et en convertissant les autres en AAC à débit moyen. Il ne s'occupe que des fichiers modifiés depuis le run précédent. Je l'avais écrit pour mettre de la musique sur une carte SD depuis ma bibliothèque iTunes.

 

Il peut être adapté assez simplement à ton besoin (conversion en MP3 si tu préfères par exemple).

 

Le prérequis est d'installer XLD (simple), mais aussi l'outil en ligne de commande ffmpeg/ffprobe qui permet d'extraire le débit d'un fichier donné : moi je l'ai installé par MacPorts, mais si on n'a pas MacPorts c'est hyper lourd si c'est juste pour installer un outil. On doit pouvoir l'installer d'une autre manière mais je n'ai jamais fouillé.

 

EDIT : ici https://ffmpeg.org/download.html (binaires OS X, c'est ffprobe qu'il faut récupérer et copier dans le dossier /usr/local/bin/

#!/bin/bash

ORIGDIR=/Volumes/DATA/MULTIMEDIA/DISCOTHEQUE
DESTDIR=/Volumes/N130SD/Music
EXCLUSIONS=("Enfants/" "Classique/")

echo "Cleaning irrelevant files..."
cd $DESTDIR
#find . -name "*/._*" -exec rm {} \;
#find . -type f -and -not \( -name "*.mp3" -or -name "*.m4a" \)  -exec rm {} \;

echo "Cleaning unwanted music..."
find . -print > liste1.txt
[ -f liste1_.txt ] && rm liste1_.txt
for excl in ${EXCLUSIONS[*]} ; do
   grep "$excl" liste1.txt >> liste1_.txt
done
while read file ; do
   echo "---deleting ${file}"   
   [ -e "$file" ] && rm -r "$file"
done < liste1_.txt

echo "Cleaning deleted files..."
# pourrait être remplacé par 
# for file in $(find . \( -name "*.mp3" -or -name "*.m4a" \) -print); do...
find . \( -name "*.mp3" -or -name "*.m4a" \) -print  > liste1.txt
while read file ; do

   file_orig="$ORIGDIR/$file"
   file_dest="$DESTDIR/$file"
   if [ ! -f "$file_orig" ] ; then
      dir_orig=$(dirname "$file_orig")
      file_orig=$(basename "$file_orig" .m4a)
      file_orig="${dir_orig}/${file_orig}"
      if [ ! -f "$file_orig" ] ; then
         echo "---deleting $file_dest"
         rm "$file_dest"
      fi
   fi

done < liste1.txt

echo "Cleaning deleted or empty directories..."
find . -type d -print  > liste2.txt
while read dir ; do

   dir_orig="$ORIGDIR/$dir"
   dir_dest="$DESTDIR/$dir"
   if [ -d "$dir_dest" ] && [ ! -d "$dir_orig" ] ; then
      echo "---deleting $dir_dest"
      rm -r "$dir_dest"
   fi
   if [ -d "$dir_dest" ] && [ $(ls -l "$dir_dest"|wc -l) == 0 ] ; then
      echo "---deleting $dir_dest"
      rm -r "$dir_dest"
   fi

done < liste2.txt




echo "Synchronising..."

cd $ORIGDIR

find . \( -name "*.mp3" -or -name "*.m4a" \) -print | grep -v "/._" > liste1.txt
for excl in ${EXCLUSIONS[*]} ; do
   grep -v "$excl" liste1.txt > liste1_.txt
   mv liste1_.txt liste1.txt
done

while read file ; do

   file_orig="$ORIGDIR/$file"
   size_orig=$(stat -f %z "$file_orig")
   duration=$(ffprobe -i "$file_orig" -show_entries format=duration -v quiet -of csv="p=0")
   bitrate=$(echo ${size_orig}\*8/${duration} | bc)
   date_orig=$(stat -f %m "$file_orig")
   file_destc="$DESTDIR/$file"
   file_destt="$DESTDIR/$file.m4a"

   if [ $bitrate -lt 400000 ] ; then
      file_dest="$file_destc"
   else
      file_dest="$file_destt"
   fi

   if [ -f "$file_dest" ] ; then
      date_dest=`stat -f %m "$file_dest"`
   else
      date_dest=$(echo ${date_orig}-100 | bc)
      dir_dest=$(dirname "$file_dest")
      if [ ! -d "$dir_dest" ] ; then
         echo "---creating $dir_dest"
         mkdir -p "$dir_dest"
      fi
   fi

   date_dest=$[date_dest + 2]

   if [ $date_orig -le $date_dest ] ; then
      echo "---ignoring $file_orig"
   fi
   if [ $date_orig -gt $date_dest ] && [ $bitrate -lt 400000 ] ; then
      echo "---copying $file_orig"
      cp "$file_orig" "$file_dest"
      if [ -f "$file_destt" ] ; then
         rm "$file_destt"
      fi 
   fi
   if [ $date_orig -gt $date_dest ]  && [ $bitrate -ge 400000 ] ; then
      echo "---transcoding $file_orig"
      # on suppose qu'au dessus de 400kbps c'est forcément du lossless
      # sinon il faudrait transcoder d'abord vers FLAC avec ffmpeg
      # (ce qui permettrait aussi d'enlever le faux flux video présent dans les .m4a d'iTunes)
      xld -f aac --profile AAC_q60 -o /tmp/n130sync.m4a "$file_orig"
      cp /tmp/n130sync.m4a "$file_dest"
      rm /tmp/n130sync.m4a
      if [ -f "$file_destc" ] ; then
         rm "$file_destc"
      fi 
   fi

done < liste1.txt

Lien vers le commentaire
Partager sur d’autres sites

Merci pehache, je suis en train d'essayer ça.

Le top serait que je garde mes ALAC mais bon...

 

Pour iTunes, je peux dupliquer ma bibliothèque pour éviter de la bousiller avec des doublons effectivement.

 

Là je me bagare avec DS Cloud qui ne synchronise pas correctement les fichiers et dossiers qui possèdent des accents dans le nom... Pour lui ils font 0 octet. Mais je vais ouvrir un autre topic je crois...

Les applis Synology sont pas mal dans l'idée mais dans la pratique ça fonctionne pas super bien d'après ce que je constate. :(

Lien vers le commentaire
Partager sur d’autres sites

Comme on dit, c'est aux risques et péril de l'utilisateur :-)

 

Mais même en les décommentant il n'y a pas de risque... tant qu'on ne se trompe pas entre le dossier source et le dossier destination !

 

EDIT : je posterai une version un peu plus adaptable à différents cas.

Lien vers le commentaire
Partager sur d’autres sites

Une version plus facilement utilisable dans d'autres contextes, et commentée... Il n'y a plus besoin de XLD, mais de "ffmpeg" et "ffprobe".

#!/bin/bash
#
# Compatibilité : macOS X, Linux
#
# Ce script synchronise une arborescence musicale d'un dossier source vers un
# dossier destination, en recopiant simplement les fichiers dont le bitrate est
# inférieur à une certaine limite, et en réencodant les autres en mp3 à un bitrate 
# choisi (en mode ABR). Entre deux exécutions du script, seuls les fichiers 
# modifiés/ajoutés/supprimés/déplacés sont traités.
#
# Pour le réencodage, il nécessite l'installation de "ffmpeg" (logiciel en ligne
# de commande), et de son compagnon "ffprobe" pour la détection du bitrate.
# https://evermeet.cx/ffmpeg/
# Copier les exécutables "ffmpeg" et "ffprobe" de préférence dans /usr/local/bin
#
# ORIGDIR : Dossier source, qui contient l'arborescence à synchroniser
#           Le contenu de ce dossier n'est JAMAIS modifié par le script
# DESTDIR : Dossier destination
#           !!! Le contenu de ce dossier peut être effacé !!!
# EXTENSIONS : seuls les fichiers dont l'extension figure dans cette liste sont 
#              synchronisés
# EXCLUSIONS : chaînes de caractères contenues dans le chemin ou le nom des fichiers
#              que l'on ne veut pas synchroniser
# BITERATEMAX : bitrate (en kb/s) au-delà duquel les fichiers sont réencodés 
# FFBITRATE : bitrate (en kb/s) des fichier réencodés avec ffmpeg
# FORCEREENC : "yes" ou "no" ; si "yes", force le réencodage des fichiers dépassant 
#              BITERATEMAX (utile si par exemple on a changé BITERATEMAX ou FFBITRATE)
# NETTOYAGE : "yes" ou "no" ; si "yes", tous les fichiers n'ayant pas l'extension
#             voulue sont préalablement effacés du dossier destination
# TMP : dossier+préfixe pour les fichiers temporaires (le défaut convient)

# variables à adapter à chaque cas :

ORIGDIR=/Volumes/DATA/MULTIMEDIA/DISCOTHEQUE
DESTDIR=/Volumes/N130SD/Music
EXTENSIONS=(m4a mp3)
EXCLUSIONS=("Enfants/" "Classique/" "BOF/" "Traditionnel/")
BITRATEMAX=400
FFBITRATE=128
FORCEREENC=no
NETTOYAGE=no
TMP=/tmp/musync

# ne rien toucher en dessous de cette ligne
#------------------------------------------------------------------------------

BITRATEMAX=$(($BITRATEMAX * 1000))

EXTSELEC=""
for ext in ${EXTENSIONS[*]} ; do
   EXTSELEC="$EXTSELEC -name *.$ext -or"
done
EXTSELEC="$EXTSELEC -false"
echo "Extension selection line : $EXTSELEC"

ENCEXT=mp3

#------------------------------------------------------------------------------

# Ici on efface du dossier de destination tous les fichiers qui n'ont pas la bonne 
# extension. On efface aussi les fichiers qui commencent par "._", qui sont des
# fichiers cachés générés par macOS X
if [ $NETTOYAGE == yes ] ; then 
   echo "Cleaning irrelevant files..."
   cd $DESTDIR
   find . -name "*/._*" -exec rm {} \;
   find . -type f -and -not \( $EXTSELEC \)  -exec rm {} \;
fi


# Ici on efface du dossier destination les éventuels fichiers définis par les
# exclusions, mais qui ont pu être synchronisés précédemment
echo "Cleaning unwanted music..."
cd $DESTDIR
find . -print > ${TMP}liste1.txt
[ -f ${TMP}liste1_.txt ] && rm ${TMP}liste1_.txt
for excl in ${EXCLUSIONS[*]} ; do
   grep "$excl" ${TMP}liste1.txt >> ${TMP}liste1_.txt
done
while read file ; do
   echo "---deleting ${file}"   
   [ -e "$file" ] && rm -r "$file"
done < ${TMP}liste1_.txt


# Ici on efface du dossier destination les éventuels fichiers synchronisés 
# précédemment mais qui ont été effacés dans le dossier source
echo "Cleaning deleted files..."
cd $DESTDIR
# pourrait être remplacé par 
# for file in $(find . \( $EXTSELEC \) -print); do...
find . \( $EXTSELEC \) -print  > ${TMP}liste1.txt
while read file ; do

   file_orig="$ORIGDIR/$file"
   file_dest="$DESTDIR/$file"
   if [ ! -f "$file_orig" ] ; then
      dir_orig=$(dirname "$file_orig")
      file_orig=$(basename "$file_orig" .$ENCEXT)
      file_orig="${dir_orig}/${file_orig}"
      if [ ! -f "$file_orig" ] ; then
         echo "---deleting $file_dest"
         rm "$file_dest"
      fi
   fi

done < ${TMP}liste1.txt


# Ici on efface du dossier destination les éventuels dossiers vides, ainsi que 
# les dossiers qui ont été effacés du dossier source
echo "Cleaning deleted or empty directories..."
cd $DESTDIR
find . -type d -print  > ${TMP}liste2.txt
while read dir ; do

   dir_orig="$ORIGDIR/$dir"
   dir_dest="$DESTDIR/$dir"
   if [ -d "$dir_dest" ] && [ ! -d "$dir_orig" ] ; then
      echo "---deleting $dir_dest"
      rm -r "$dir_dest"
   fi
   if [ -d "$dir_dest" ] && [ $(ls -l "$dir_dest"|wc -l) == 0 ] ; then
      echo "---deleting $dir_dest"
      rm -r "$dir_dest"
   fi

done < ${TMP}liste2.txt



# Ici on effectue la synchronisation proprement dite, avec recopie ou réencodage
# des fichiers source qui ne sont pas déjà présents dans le dossier destination
echo "Synchronising..."

cd $ORIGDIR

find . \( $EXTSELEC \) -print | grep -v "/._" > ${TMP}liste1.txt
for excl in ${EXCLUSIONS[*]} ; do
   grep -v "$excl" ${TMP}liste1.txt > ${TMP}liste1_.txt
   mv ${TMP}liste1_.txt ${TMP}liste1.txt
done

while read file ; do

   file_orig="$ORIGDIR/$file"
   size_orig=$(stat -f %z "$file_orig")
   duration=$(ffprobe -i "$file_orig" -show_entries format=duration -v quiet -of csv="p=0")
   bitrate=$(echo ${size_orig}\*8/${duration} | bc)
   date_orig=$(stat -f %m "$file_orig")
   file_destc="$DESTDIR/$file"
   file_destt="$DESTDIR/$file.$ENCEXT"

   if [ $bitrate -lt $BITRATEMAX ] ; then
      file_dest="$file_destc"
   else
      file_dest="$file_destt"
   fi

   if [ -f "$file_dest" ] ; then
      date_dest=$(stat -f %m "$file_dest")
   else
      date_dest=$(echo ${date_orig}-100 | bc)
      dir_dest=$(dirname "$file_dest")
      if [ ! -d "$dir_dest" ] ; then
         echo "---creating $dir_dest"
         mkdir -p "$dir_dest"
      fi
   fi

   date_dest=$[date_dest + 2]

   if [ $date_orig -le $date_dest ] ; then
      echo "---ignoring $file_orig"
   fi
   if [ $date_orig -gt $date_dest ] && [ $bitrate -lt 400000 ] ; then
      echo "---copying $file_orig"
      [ -f "$file_destt" ] && rm "$file_destt"
      cp "$file_orig" "$file_destc"
   fi
   if [ $bitrate -ge $BITRATEMAX ] ; then
      if [ $date_orig -gt $date_dest ] || [ $FORCEREENC == yes ] ; then
         echo "---transcoding $file_orig"
         [ -f "$file_destc" ] && rm "$file_destc"
         ffmpeg -i "$file_orig" -c:v copy -c:a libmp3lame -abr 1 -b:a ${FFBITRATE}k -v quiet -y ${TMP}new.$ENCEXT < /dev/null
         cp ${TMP}new.$ENCEXT "$file_destt"
         rm ${TMP}new.$ENCEXT
      fi
   fi

done < ${TMP}liste1.txt

#------------------------------------------------------------------------------


# S'il n'y avait pas besoin de réencodage, les quelques lignes suivantes suffiraient !

#[-f ${TMP}excl.txt] && rm  ${TMP}excl.txt
#for excl in ${EXCLUSIONS[*]} ; do
#   echo "$excl" > ${TMP}excl.txt
#done
#echo "rsync DISCOTHEQUE"
#rsync --archive --times --modify-window 3601 --omit-dir-times --delete --delete-excluded --prune-empty-dirs --verbose \
#      --exclude-from=${TMP}excl.txt \
#      ${ORIGDIR}/ ${DESTDIR}


Lien vers le commentaire
Partager sur d’autres sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

Chargement
×
×
  • Créer...