Привет всем!
Вот, нашаманил сабж, без нормальных знаний питона это был хардкор,
но что делать только c eyeD3 + id3py добился желаемого,
все готовые скрипты что я видел, работают с чётко заданными TIT2,
TALB... и т.д., это не устраивало, т.к. есть всякие комменты там и
другое,да и не определялась версия тэгов в них.
То что вы сечас увидите это конечно полный ****ец, но мне нраицца:), и работает даже...
Итак:
#!/usr/bin/python
from eyeD3 import *
import eyeD3.frames
import eyeD3.tag
from eyeD3.tag import *
from eyeD3.frames import *
import eyeD3.utils
from id3py import id3
from id3py import id3, exception
import sys, traceback, os, time, re, locale
import codecs, encodings
from string import atoi, split
# init
top = "./"
mp3Re = re.compile("[.]*\.mp3")
mp3Files = []
allUnsupported = []
# find all mp3 files in the top directory and all sub-directories
for root, dirs, files in os.walk(top, topdown=True):
for name in files:
fullName = os.path.join(root, name)
if mp3Re.search(fullName) != None:
mp3Files.append(fullName)
print "Found %s files." %(len(mp3Files))
# iterate mp3 files
for file in mp3Files:
print "File: %s" %(file)
try:
# read tag and measure time
start = time.time()
t = id3.readTag(file)
end = time.time()
print "Analysis took %f seconds" %(end - start)
# no tag found
if t == None:
print "No tag found!"
# tag found
else:
print "Tag found!"
unsupported = [] # all unsupported frame types for the current tag
# print tag information
print "Version: %d.%d" %(t.version[0], t.version[1]),", Flags: %d" %(int(t.flags)),", Size: %d" %(t.size),", Padding: %d" %(t.padding),", Frames: %s" %(t.frames.keys())
textframe = []#the frame table
textframeid = []#the frameid table
i = 0
print len(t.frames.keys())
# iterate frames
for f in t:
# text information frame
if f.id[0] == "T":
print i, "------", "%s: %s" %(f.id, unicode(f.text, 'cp1251'))
textframe.insert(i, unicode(f.text, 'cp1251'))
textframeid.insert(i, f.id)
i += 1
#url link frame
elif f.id[0] == "W":
print "%s: %s" %(f.id, f.url)
# other frames
else:
print "%s: %d" %(f.id, f.size)
if f.id == "COMM": # comment frame
print i, ':' , unicode(f.comment, 'cp1251') #just set your encoding
textframe.insert(i, unicode(f.comment, 'cp1251'))
textframeid.insert(i, f.id)
i += 1
# check wether the frame is supported by the library
if not f.id in id3.frames:
unsupported.append(f.id)
print "___________________"
for u in unsupported:
if allUnsupported.count(u) == 0:
allUnsupported.append(u)
# EyeD3 start
if eyeD3.tag.isMp3File(file): #check for mp3 files
tag = None;
tag = eyeD3.Tag(file);
tag.link(file);
print tag.getVersionStr()
#
#remove id3v2.4 tag, update & set utf8 encoding
if tag.getVersionStr != "None" or "v2.4":
tag.remove(ID3_ANY_VERSION);
tag.update(ID3_V2_4)
tag.setTextEncoding(UTF_8_ENCODING)
print "--------", tag.getVersionStr()# securecheck
#set the id3 text fields
for j in range(i):
print("---------"), j, #f.text[j]
print "%s : %s" %(textframeid[j], textframe[j])
#set the comment field
if textframeid[j] == "COMM":
print "!!!"
tag.removeComments()
tag.update(ID3_V2_4)
tag.addComment(textframe[j], '', 'rus')#if you need, set your lang:)
else:tag.setTextFrame(textframeid[j], textframe[j])
#and the endcheck...
print tag.getTitle(), tag.getArtist(), tag.getAlbum(), tag.getYear(), tag.getComment()
tag.update()
#eyeD3 has done the job..."""
# catch the exceptions thrown by this library when reading the tag
except exception.ID3LibException, e:
print "Error: %s[%s]" %(e, e.__class__)
if e.source != None:
print "Cause: %s[%s]" %(e.source, e.source.__class__)
# catch other exceptions, shouldn't happen normally
except Exception, e:
print "Error: %s[%s]" %(e, e.__class__)
traceback.print_exc(sys.stdout)
print "All unsupported frames: %s" %(allUnsupported)
print "________________________________________________________"
print
Вот и всё
Всякие разделительные строки типа: print "---------", это чтобы вывод проще разбирать.
Я знаю что это ужасно грязно и просто ужасно,
но если всё-таки есть комментарии по существу, то я буду очень рад...