Extraiga las tags ID3 de una URL de MP3 con una descarga parcial usando python

Necesito extraer tags ID3 y metadatos de archivos mp3 remotos.

Escribí algunas líneas que podrían obtener tags ID3 de archivo local:

from mutagen.mp3 import MP3 import urllib2 audio = MP3("Whistle.mp3") songtitle = audio["TIT2"] artist = audio["TPE1"] print "Title: " + str(songtitle) print "Artist: "+str(artist) 

Necesito lograr esto para enlaces url para archivos mp3. Intenté obtener una descarga parcial de archivos usando urllib2.

 import urllib2 from mutagen.mp3 import MP3 req = urllib2.Request('http://www.1songday.com/wp-content/uploads/2013/08/Lorde-Royals.mp3') req.headers['Range'] = 'bytes=%s-%s' % (0, 100) response = urllib2.urlopen(req) headers = response.info() print headers.type print headers.maintype data = response.read() print len(data) 

¿Cómo puedo extraer las tags ID3 de la URL de MP3 sin descargar completamente el archivo?

    En su ejemplo, las tags ID3 no se recuperan, por lo que no puede extraerlas.

    Jugué un poco después de leer la especificación para ID3 y he aquí una buena manera de comenzar.

     #Search for ID3v1 tags import string tagIndex = string.find(data,'TAG') if (tagIndex>0): if data[tagIndex+3]=='+': print "Found extended ID3v1 tag!" title = data[tagIndex+3:tagIndex+63] print title else: print "Found ID3v1 tags" title = data[tagIndex+3:tagIndex+33] print title #So on. else: #Look for ID3v2 tags if 'TCOM' in data: composerIndex = string.find(data,'TCOM') #and so on. See wikipedia for a full list of frame specifications 

    Las tags id3 se almacenan en los metadatos ID3 que generalmente están delante de los marcos de mp3 (que contienen el audio), pero el estándar mp3 les permite también “seguir los marcos de mp3” .

    Para descargar el número mínimo de bytes que necesita para:

    1. descargue los primeros 10 bytes del mp3, extraiga el encabezado ID3v2 y calcule el tamaño del encabezado id3v2
    2. para recuperar las tags id3v2 completas descargue el size bytes del mp3
    3. utilizar una biblioteca de python para extraer las tags ID3

    Aquí hay un script (python 2 o 3) que extrae la carátula del álbum con una cantidad mínima de tamaño de descarga:

     try: import urllib2 as request # python 2 except ImportError: from urllib import request # python 3 from functools import reduce import sys from io import BytesIO from mutagen.mp3 import MP3 url = sys.argv[1] def get_n_bytes(url, size): req = request.Request(url) req.headers['Range'] = 'bytes=%s-%s' % (0, size-1) response = request.urlopen(req) return response.read() data = get_n_bytes(url, 10) if data[0:3] != 'ID3': raise Exception('ID3 not in front of mp3 file') size_encoded = bytearray(data[-4:]) size = reduce(lambda a,b: a*128+b, size_encoded, 0) header = BytesIO() # mutagen needs one full frame in order to function. Add max frame size data = get_n_bytes(url, size+2881) header.write(data) header.seek(0) f = MP3(header) if f.tags and 'APIC:' in f.tags.keys(): artwork = f.tags['APIC:'].data with open('image.jpg', 'wb') as img: img.write(artwork) 

    Algunas observaciones:

    • comprueba que el ID3 está delante del archivo y que es ID3v2
    • el tamaño de las tags id3 se almacena en los bytes 6 a 9, como se documenta en id3.org
    • desafortunadamente, mutagen necesita un cuadro de audio mp3 completo para analizar las tags id3. Por lo tanto, también debe descargar un fotogtwig de mp3 (que tiene una longitud máxima de 2881 bytes de acuerdo con este comentario )
    • en lugar de suponer ciegamente que la carátula del álbum es jpg, primero debe verificar el formato de la imagen, ya que id3 permite muchos tipos diferentes de imágenes.
    • probado con unos 10 mp3 aleatorios de internet, por ejemplo, este: python url.py http://www.fuelfriendsblog.com/listenup/01%20America.mp3