Contenu | Rechercher | Menus

Annonce

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

À propos de l'équipe du forum.

#1 Le 07/07/2012, à 20:40

billou

Conversion avec respect d'arborescence Flac vers Vorbis?

Salut la compagnie, j'ai toute une bibilothèque d'albums rippés et encodé en Flac, et tagués proprement via EasyTag, à des fins d'archivage (et pour une meilleure qualité audio sur les appareils "fixes") smile

Néanmoins disposant d'un smartphone sous Androïd, je compte réencoder ces derniers afin d'en disposer dessus, seulement je suis confronté à quelques problèmes.

-Déjà, habituellement, j'utilise XCFA qui fait très bien son taff, mais j'aimerais profiter du coreI5 que je viens de m'offrir pour encoder plus rapidement avec tous les cœurs utilisés, ce que XCFA ne permet (apparemment?) pas pour l'instant. neutral

-Deuxièmement, un autre problème se pose, mes pistes sont nommées telles que taguées, et l'un ou l'autre, il n'est pas rare que les caractères utilisés soient des kanjis (japonais) ou du cyrillique (Russe), beaucoup de logiciels me flinguent les caractères en question après ré-encodage, y compris dans l'idtag. yikes

Et enfin, je n'ai pas encore vu de logiciel proposer le respect de l'arborescence originale avec tous les sous dossiers & cie (classés proprement)... Et j'imagine que pour correspondre à mes besoins, le terminal devrait être d'une grande utilité?

Donc si quelqu'un connaît la commande miracle "type", ça m'arrangerait pas mal, il/elle aura ma gratitude éternelle ! tongue

Dernière modification par billou (Le 07/07/2012, à 20:42)

Hors ligne

#2 Le 07/07/2012, à 23:26

Grouar

Re : Conversion avec respect d'arborescence Flac vers Vorbis?

Tiens c'est marrant, j'ai eu le meme problème il y a quelques semaines.

Du coup j'ai écrit un petit script en python qui fait ce que tu demandes, mais sans le multi-threading (donc on ne profite pas de tous les coeurs). Au niveau du temps d'exécution, ça a mis chez moi 2-3h pour encoder ~ 3000 morceaux sur un i5-2500k.

Les kanjis des noms de fichier et des metadata de mes musiques ont bien été préservés.

Voici le script si ça t'intéresse tout de meme (la seule dépendance, outre python,  est oggenc) :

EDIT : je viens de le modifier un peu, voici un script qui permet d'utiliser tous les coeurs à disposition :

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import os,glob,shutil,multiprocessing

inputFolder = "/home/grou/python/input"
outputFolder = "/home/grou/python/output"
transcodeCommand = "oggenc -q 6"

tasks=[]

def ntab(N):
  tab=""
  for i in range(2*N):
    tab+="    "
  return tab 
  
def transcode(input):
   os.system(transcodeCommand + input)
   
def transcodeFolder(input,location,level):
   if os.path.isdir(input):
      os.chdir(outputFolder+"/"+location)
      try:
         os.makedirs(input.split("/")[-1])
      except:
         print ntab(level)+"/!\\ Can't create " + outputFolder+"/"+location+"/"+input.split("/")[-1] + " directory. Please check if it already exists in the outputFolder."
      os.chdir(input)
      try:
         for i in glob.glob("*"):
            transcodeFolder(input+"/"+i,location+"/"+input.split("/")[-1],level+1)
      except:
         print ntab(level)+"LOOP FAILED for input : " +input + " \n"+ntab(level)+ "Location : " + location
   elif input.split(".")[-1]== "flac" or input.split(".")[-1]=="wav":
      try:
         tasks.append(" "+ "\""+input + "\"" + " -o \"" + outputFolder + location + "/"+input.split("/")[-1].split(".")[0]+".ogg\"")
      except:
         print "ERROR transcoding " + input
   elif input.split(".")[-1]=="mp3" or input.split(".")[-1]=="ogg":
      try:
         shutil.copy2(input,outputFolder+location)
      except:
         print input+" copy FAILED."
   else:
      print ntab(level)+input +" is not a .flac,.wav,.mp3,.ogg file. Skipping."
  
  

transcodeFolder(inputFolder,"",0)
pool = multiprocessing.Pool(None)
wait = pool.map_async(transcode,tasks)
wait.wait()
print "Finished !"

Pense à modifier les variables inputFolder et ouputFolder.

Si tu veux modifier la qualité de l'encodage, change le 6 de la variable transcodeCommand. Je te renvoie à cette page pour l'échelle de qualité.

Ceci dit, ya peut etre plus simple ^^'

Dernière modification par Grouar (Le 08/07/2012, à 01:35)

Hors ligne

#3 Le 08/07/2012, à 02:19

NumberJ

Re : Conversion avec respect d'arborescence Flac vers Vorbis?

Grouar a écrit :

Ceci dit, ya peut etre plus simple ^^'

Je propose ma solution :

#!/usr/bin/python

import os
import shutil
import multiprocessing
import subprocess

inputFolder = "/home/grou/python/input"
outputFolder = "/home/grou/python/output"
transcodeCommand = ["oggenc", "-q", "6"]

def execute_no_output(args):
    """Execute a command without outputing anything on the console.
    """
    p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    while p.poll() is None:
        p.communicate()
    return p.returncode

def transcode(source):
    """Create the program arguments used to transcode a file with subprocess.
    """
    pos = source.rfind('.')
    target = source[:pos] + '.ogg'
    return transcodeCommand + [
            os.path.join(
                    inputFolder,
                    source),
            "-o",
            os.path.join(
                    outputFolder,
                    target)]

tasks = []
nb_processed = 0

os.chdir(inputFolder)
for dirpath, dirnames, filenames in os.walk('.'):
    print "Entering %s..." % dirpath

    target = os.path.join(outputFolder, dirpath)
    if not os.path.isdir(target):
        print "Creating %s" % target
        os.makedirs(target)

    for name in filenames:
        ext = name.split('.')[-1].lower()
        if ext in ['flac', 'wav']:
            tasks.append(transcode(
                    os.path.join(dirpath, name)))
        elif ext in ['mp3', 'ogg']:
            shutil.copy(
                    os.path.join(inputFolder, dirpath, name),
                    os.path.join(outputFolder, dirpath, name))
        else:
            print "%s is not a .flac, .wav, .mp3, .ogg file. Skipping." % (
                    os.path.join(inputFolder, dirpath, name),)
        nb_processed += 1

pool = multiprocessing.Pool(None)
pool.map(execute_no_output, tasks)
print "Processed %d files (%d encoded)" % (nb_processed, len(tasks))

Dernière modification par NumberJ (Le 08/07/2012, à 02:20)

Hors ligne

#4 Le 08/07/2012, à 06:54

billou

Re : Conversion avec respect d'arborescence Flac vers Vorbis?

Effectivement, vos scripts sont très utiles, merci ! smile

Par contre NumberJ, le multithreading est une amélioration notable que tu apportes (ça encode plusieurs morceaux en même temps? Il n'y a qu'un fork d'oggenc sous windows qui permet d'encoder via plusieurs cœurs, que j'ai trouvé...

Ce qui est dommage, c'est qu'on perd l'affichage de la progression dans le terminal comme sur la version de Grouar. :-/

Hors ligne

#5 Le 08/07/2012, à 10:06

NumberJ

Re : Conversion avec respect d'arborescence Flac vers Vorbis?

billou a écrit :

Ce qui est dommage, c'est qu'on perd l'affichage de la progression dans le terminal comme sur la version de Grouar. :-/

Ah mais je pensais que c'était l'objectif.

Le problème c'est justement que comme ça encode plusieurs trucs en parallèle, si on laisse les processus afficher quelque chose on aurait un mix immonde (et illisible) de toutes les progressions.

Il n'est pas très difficile d'ajouter la progression en terme de nombre de fichiers traités sur le total (puisque ce total est calculé au début). On n'a qu'à dire que je le laisse comme exercice au lecteur tongue (mais je peux l'ajouter si tu veux)

Hors ligne

#6 Le 08/07/2012, à 10:23

billou

Re : Conversion avec respect d'arborescence Flac vers Vorbis?

Bah, ça serait cool que tu le rajoutes, par contre le script en question, est publié sous GPL? Ça pourrait être sympa de publier ça se le wiki pour ceux qui en auraient besoin ! smile

J'aimerais bien toucher un peu le python, tout comme la programmation, je suis capable d'en saisir les rouages, mais je crois que j'ai une haine maladive pour le "par coeur" depuis ma plus tendre enfance, bloquer, ça aide pas... :-/

Là j'y verrais bien un petit GUI qui y serait adjoint, faudrait que je regarde comme ça fonctionne ! smile

Hors ligne

#7 Le 08/07/2012, à 13:39

kamui57

Re : Conversion avec respect d'arborescence Flac vers Vorbis?

Est-ce que avec find ça pourrait aller pour le respect de l'arborescence ? un truc du genre

find -iname *.flac -exec <convert> "{}" "{}".ogg \;

? (avec <convert> la commande pour convertir un .flac vers un .ogg)
(aucune idée pour le multithreading et la barre de progression par contre)
avec echo au lieu de <convert> j'ai dans un répertoire avec kanjis

[dim. juil. 08][13:32:33][~/Musique/Toshi]
-> find -iname *.mp3 -exec echo "{}" "{}".ogg  \;
./(1995.03.29) GRACE/09_-_Toshi_-_Everlasting_Love.mp3 ./(1995.03.29) GRACE/09_-_Toshi_-_Everlasting_Love.mp3.ogg
(…)
./(1997.11.21) NATURAL HIGH/01_-_Toshi_-_NATURAL_HIGH.mp3 ./(1997.11.21) NATURAL HIGH/01_-_Toshi_-_NATURAL_HIGH.mp3.ogg
./(1997.11.21) NATURAL HIGH/03_-_Toshi_-_NATURAL_HIGH_(ORIGINAL_KARAOKE).mp3 ./(1997.11.21) NATURAL HIGH/03_-_Toshi_-_NATURAL_HIGH_(ORIGINAL_KARAOKE).mp3.ogg
./(1997.11.21) NATURAL HIGH/02_-_Toshi_-_Love_Song.mp3 ./(1997.11.21) NATURAL HIGH/02_-_Toshi_-_Love_Song.mp3.ogg
./toshi samurai japan/01 エアポート.mp3 ./toshi samurai japan/01 エアポート.mp3.ogg
./toshi samurai japan/04 春の息吹.mp3 ./toshi samurai japan/04 春の息吹.mp3.ogg
./toshi samurai japan/02 雨音.mp3 ./toshi samurai japan/02 雨音.mp3.ogg
./toshi samurai japan/03 武士JAPAN.mp3 ./toshi samurai japan/03 武士JAPAN.mp3.ogg
./MISSION/06_-_Toshi_-_Heart_of_the_back.mp3 ./MISSION/06_-_Toshi_-_Heart_of_the_back.mp3.ogg
(…)
[dim. juil. 08][13:36:11][~/Musique/Toshi]

Quand le dernier arbre aura été abattu, et le dernier animal exterminé, les hommes se rendront compte que l'argent ne se mange pas (proverbe indien)
Toshiba Satellite L655 4 Go RAM, Archlinux Gnome-shell,LXDE / W7
Toshiba Satellite M30 512 Mo RAM, Archlinux Gnome 3 restreint / Crunchbang LXDE
https://help.ubuntu.com/community/Pastebinit pour poster du texte sur internet en console

Hors ligne

#8 Le 08/07/2012, à 19:00

NumberJ

Re : Conversion avec respect d'arborescence Flac vers Vorbis?

Ca peut se faire avec find, mais t'auras pas le multithreading ou la progression, et si tu veux output dans un autre dossier il faut rajouter un peu de sed supplémentaire.

Hors ligne

#9 Le 08/07/2012, à 20:08

NumberJ

Re : Conversion avec respect d'arborescence Flac vers Vorbis?

billou a écrit :

Bah, ça serait cool que tu le rajoutes, par contre le script en question, est publié sous GPL? Ça pourrait être sympa de publier ça se le wiki pour ceux qui en auraient besoin ! smile

J'ai rajouté la progression, et j'en ai fait un truc plus générique, des fois que vous vouliez encoder d'autres trucs (des JPEG, etc).
Les fonctions tr_copy et tr_encode en haut sont les actions qui sont appliquées aux fichiers suivant leur type.
https://gist.github.com/3072068

Faites-en ce que vous voulez !

Hors ligne

#10 Le 12/07/2012, à 13:32

billou

Re : Conversion avec respect d'arborescence Flac vers Vorbis?

Merci ! wink

Hors ligne

#11 Le 02/08/2013, à 09:55

billou

Re : Conversion avec respect d'arborescence Flac vers Vorbis?

Petit up, je viens de tester ton dernier script, je ne sais pas si c'est du à la version de python, mais de mon côté ça ne fonctionne plus, il y a des erreurs de syntaxe... sad

Hors ligne