LINUX.ORG.RU

Зацените скрипт на питоне, по перекодировке mp3 тэгов.


0

0

Привет всем!

Вот, нашаманил сабж, без нормальных знаний питона это был хардкор,
но что делать только 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 "---------", это чтобы вывод проще разбирать.
Я знаю что это ужасно грязно и просто ужасно,
но если всё-таки есть комментарии по существу, то я буду очень рад...

IMHO, есть один небольшой недостаток:

$ python
-bash: python: command not found

вот...

а вообще допустимый набор средств для автоматизации: sh, bash, gcc/c++, perl

theserg ★★★
()

> но если всё-таки есть комментарии по существу, то я буду очень рад...

В mutagen'е есть скрипт mid3iconv, посмотри на него.

rab_boziy
()
Ответ на: комментарий от Kwintruder

Не слушай их, Питон рулит, а перл с башем для скриптов длиной более 10 строчек не годятся ни разу. :P

ero-sennin ★★
()
Ответ на: комментарий от Kwintruder

>>допустимый набор средств для автоматизации: sh, bash, gcc/c++, perl

> Да, это путь дзен. Я ещё не готов.

ничё, начни с лиспа, потом будеш со временем.

bugmaker ★★★★☆
()
Ответ на: комментарий от theserg

> а вообще допустимый набор средств для автоматизации: sh, bash, 
> gcc/c++, perl
  ^^^^^^^ - автар пеши исчо!

Допустимый набор средств - это тот, который позволяет наиболее
эффективно решить поставленную задачу. 

Begemoth ★★★★★
()
Ответ на: комментарий от bugmaker

> ничё, начни с лиспа, потом будеш со временем.

К чему? К sh, bash, gcc/c++, perl? Это не дзен для лиспера.

Begemoth ★★★★★
()

Я тут немного повредничаю...

Папа завещал делать отступы в четыре пробела http://www.python.org/dev/peps/pep-0008/

Я бы разибл это на либу, которая содержит нужную фунециональность и интерфейс к либе

Мне нравится такое правило написания кода в ядре Linux: никогда не вставляйте коментариев посредине функции, лучше выделить кусок требующий коментирования в отдельную функцию и закоментировать её.

Если придерживаться ограничения длинны строки на 80 символов, то тебе пришлось бы выделить ещё функций => увеличилась бы читаемость, а то на это просто страшно смотреть.

А в целом, хороший скрипт, мне нравится :-)

И прими, таки на вооружение PEP8. Им пользуется большинство (ИМХО) питонщиков. И тебе будет приятней работать с чужими исходниками и им будет приятней работать с твоими.

redvasily
()
Ответ на: комментарий от redvasily

2redvasily

>Я тут немного повредничаю... незаметил.

Заметил коммент по содержанию, за что большое спасибо!

И за советы спасибо!

Kwintruder
() автор топика
Ответ на: комментарий от anonymous

from id3py import id3
from id3py import id3, exception

импорты только нормальные сделай, а то смотрится коряво

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.