2010-12-12 98 views
1

J'écris un script qui utilise des fichiers .CUE pour diviser des fichiers musicaux monolithiques en pistes individuelles, puis les encode en MP3 le long avec les balises correctes du CUE. Tout fonctionne, mais malheureusement les balises (appliquées simplement en les incluant avec les arguments de la ligne de commande de lame) apparaissent de manière fiable comme du charabia dans iTunes lorsqu'elles incluent des caractères Unicode (ce qu'elles font toujours, car la musique est japonaise).Exécuter des commandes shell à partir d'objets bytes dans python 3.1 (Ou écrire des tags mp3 UTF-8 dans python 3.1)

Je peux les corriger en les exécutant par le biais du script this, mais c'est un autre script à exécuter, et parfois attacher des guillemets aux balises (Un bogue que je n'ai pas pu réparer), nécessitant encore une exécution d'un script retirer. Donc, ma solution préférée est de coder la chaîne lame command + arguments comme UTF-8 avant de l'exécuter, mais python 3.1 semble ne pas avoir de support pour exécuter des commandes à partir d'octets plutôt que de chaînes. Il suffit de passer une chaîne pour encoder à la place.

Sinon, je suis content d'utiliser simplement une bibliothèque de tags pour insérer les tags une fois l'encodage terminé, même si une telle solution est plus lente et moins élégante. Toutes les suggestions sont les bienvenues, cependant!

Merci d'avance.

EDIT: J'invoque lame comme ça (désolé pour la ligne longue):

args = "lame --tt \"{0}\" --tn {1:02d} --ta \"{2}\" --tl \"{3}\" \"{4}\" \"{5}.mp3\"".format(item.title, item.tracknumber, item.artist, albumObject.title, item.wavFile, "{0:02d} ".format(item.tracknumber) + item.title) 
#args = bytearray(args, "utf-8") 
retcode = subprocess.check_call(args) 
+1

aussi, il serait utile de voir comment vous invoquez boiteux dans votre script –

+0

Quel système êtes-vous - Windows, Mac, Linux? Si Windows, la "page de code système par défaut" est-elle définie en japonais? –

+0

Je suis sur OSX. Le terminal que j'exécute est UTF-8, par défaut. – Ripdog

Répondre

1

Si vous choisissez d'utiliser la bibliothèque de marquage vous pouvez regarder eyeD3; alors vous pouvez définir UTF-8 balises codées comme suit:

import eyeD3 

tag = eyeD3.Tag ('file.mp3') 
tag.setVersion (eyeD3.ID3_V2_4) 
tag.setTextEncoding (eyeD3.UTF_8_ENCODING) 
tag.setArtist ('artist') 
tag.setAlbum ('album') 
tag.setTitle ('title') 
tag.update() 
+0

Merci pour cela. Malheureusement, ce module ne semble pas supporter python 3.1. Je vais essayer, mais si je dois rétroporter mon script en 2.6, je finirai probablement par utiliser Mutagen. Merci encore – Ripdog