Vamos a programar #78 - Un vistazo a Python.

Hola de nuevo a todos, el día de hoy vamos a ver un vistazo al lenguaje de programación Python y cómo es posible portar alguno de los programas que previamente ya teníamos hechos a este lenguaje.

Hace poco mientras revisaba twitter, alguien me pregunto la razón por la que no había portado los programas que ya tenia a Python y tras analizar, llegué a la conclusión que simplemente lo olvide (por mucho tiempo al parecer).



Entonces para echarle un vistazo rápido al lenguaje, el día de hoy vamos portar uno de los programas que servia para extraer las imágenes en los archivos mp3.

Primero que nada, vamos a tomar un par de cosas en cuenta. Primero: vamos a hacer una portación de la version que hicimos en LUA, asi que puedes (y recomiendo mucho) visitar el post. Y esto se debe principalmente a que LUA y Python son lenguajes interpretados.

Segundo: No te olvides de revisar la documentación en la página de ID3.org y leer la documentación además de los post que hay aquí en el blog.

Tercero: este post será una versión reducida y el programa solo extraerá la imagen del archivo mp3 si la versión de los TAG's es la 2.3, si quieres hacerlo para las otras versiones o extraer más información, puedes usar cómo ejemplo la versión en LUA.

Con lo anterior dicho, pasemos a ver el código en Python que sirve para extraer una imagen embebida en un archivo MP3.

# ---------De la documentación disponible en http://www.id3.org para la versión 2---------------
# -- Para la version 2.2
    # -- Header for 'Attached picture', ID: "APIC">
    # -- Text encoding   $xx
    # -- MIME type       <text string> $00
    # -- Picture type    $xx
    # -- Description     <text string according to encoding> $00 (00)
    # -- Picture data    <binary data>

#Abrimos el archivo
InputFile = input('Ingresa la ruta de un MP3\n')
Rdata = open(InputFile, 'rb+')
#Buscamos que version ID3 es
Rdata.seek(3)
Version = ord(Rdata.read(1))
#escribimos que version es
print(Version)

if Version == 3:

	print('Tag Version 2.3')
	Rdata.seek(0)
	Idata = Rdata.read(1024)
	Found = Idata.find(b'APIC')
	if Found > -1:
		GotPNG = Idata.find(b"\x89\x50\x4e\x47")
		Rdata.seek(Found + 4);
		b1 = ord(Rdata.read(1))
		b1 = b1 * 256 * 256 *256
		b2 = ord(Rdata.read(1))
		b2 = b2 * 256 *256
		b3 = ord(Rdata.read(1))
		b3 = b3 * 256
		b4 = ord(Rdata.read(1))
		bt = b1 + b2 + b3 + b4 + 10
		print(bt)
		
		if GotPNG > -1:
			PPicInit = Idata.find(b'\x89PNG')
			Rdata.seek(PPicInit)
			IMGData =  Rdata.read(bt - (PPicInit - Found))
			OutPath = input('En que carpeta guardar la imagen\n')
			ResultImage = open(OutPath + '/TestImage.png','wb')
			ResultImage.write(IMGData)
			ResultImage.close()
		else:
			JPicInit = Idata.find(b'\xFF\xD8\xFF')
			Rdata.seek(JPicInit)
			IMGData = Rdata.read(bt - (JPicInit - Found))
			OutPath = input('En que carpeta guardar la imagen\n')
			ResultImage = open(OutPath + '/TestImage.png','wb')
			ResultImage.write(IMGData)
			ResultImage.close()
	else:

		print('Not Found')

Rdata.close()
input() 


Cómo podrás ver el código es realmente similar al de LUA, primero preguntamos por la ubicación de un archivo MP3, para un ejemplo insertamos "X:/Dropbox/MUSIC/American Idiot.mp3" y lo abrimos para su lectura en modo binario usando la función "open()"; la función "open()" recibe dos parámetros, el primero es una cadena de texto con la ruta del archivo a abrir y el segundo parámetro es una cadena de texto que indica el modo en el cual el archivo se abrirá, la cadena de texto "rb+" indica que abriremos el archivo en modo de lectura binario. Todo el "stream" lo asignaremos a la variable "Rdata". Al igual que en lua podemos desplazarnos en el archivo con la función "seek()" que recibe un parámetro que será un número que indicará a que lugar del archivo queremos desplazarnos, este puede ir de 0 a la longitud del archivo. Cómo la versión de los TAG's se indica en el byte 3, nos moveremos ahi y lo leeremos (e imprimimos en pantalla que versión es, no es necesario pero ayuda a tener una idea de lo que está sucediendo).

Luego si la versión de los TAG's es la versión 3, nos desplazamos de vuelta al byte 0 (o inicio del archivo) y leemos  un KByte de datos que asignaremos a la variable "Idata". Con los datos asignados, procedemos a buscar el frame que nos interesa (APIC en este caso) con la función "bytes.find()", está función regresa -1 si la cadena de texto a buscar no se encuentra, en caso contrario nos devuelve el lugar en donde se encontró el valor.

Luego buscamos el encabezado de las imágenes PNG y leemos los bytes que nos indican la longitud del frame (4 bytes). Si NO se encontró el encabezado que previamente buscamos, asumimos que la imagen es jpg (asumir es malo ;) ) y buscamos el encabezado de los archivo JPG. Luego leemos los datos de la imagen y preguntamos en que carpeta se quiere guardar la imagen resultante, por ahora el nombre es TESTImage.???. Hacemos lo mismo para la imagen PNG

Y el resultado:

Y bien, por ahora es todo. Cómo de costumbre puedes bajar el programa completo de mi dropbox para probarlo o modificarlo. Además puedes bajar el interprete de la página oficial de Python. En la descarga se incluye un manual bastante extenso del lenguaje con ejemplos y lo necesario para portar lo programas que hemos hecho en el blog.

Los leo luego


No hay comentarios.