2014-11-12 2 views
7

Мне нужно извлечь теги ID3 и метаданные удаленных mp3-файлов.Извлечь ID3-теги MP3-URL с частичной загрузкой с помощью python

Я написал несколько строк, которые могли бы получить ID3 теги локального файла:

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) 

Мне нужно добиться этого для URL-адреса ссылок для mp3 файлов. Я попытался получить частичную загрузку файлов с помощью 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) 

Как я могу извлечь теги ID3 в формате MP3 без полной загрузки файла?

+0

Вы получили, как только забираете первые 100 байт файла MP3. Где вы застряли? – scav

+2

Ах, похоже, что теги id3 находятся в LAST 128 байт файла. Поэтому, если вы не знаете размер файла, вы не сможете создать заголовок Range, чтобы получить их. Может быть, запрос HEAD может сначала получить длину файла ... – scav

ответ

0

В вашем примере теги ID3 не выбраны, поэтому вы не можете их извлечь.

Я немного поиграл после прочтения спецификации для ID3, и вот хороший способ начать работу.

#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 
0

теги ID3 хранятся в метаданных ID3, которые, как правило, перед из mp3 кадров (содержащих аудио), но mp3 стандарт позволяет им также "follow the mp3 frames".

Чтобы скачать минимальное количество байт, которые вам необходимо:

  1. скачать первые 10 байт mp3, извлечение заголовка ID3v2 и вычислить размер ID3v2 заголовка
  2. , чтобы получить полный ID3v2 теги скачать size байт mp3
  3. использовать библиотеку питона для извлечения тегов ID3 ​​

Вот скрипт (питон 2 или 3), которая извлекает альбом искусства Wi го минимальное количество размера загрузки:

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) 

Несколько замечания:

  • он проверяет, что ID3 находится в передней части файла, и что это ID3v2
  • размер тегов id3 является хранится в байтах с 6 по 9, так как documented on id3.org
  • К сожалению, мутагену нужен один полный звуковой фрейм mp3 для анализа тегов id3. Таким образом, вы должны также скачать один mp3 кадр (который на максимум 2881 байт длиной согласно this comment)
  • вместо того, чтобы слепо предполагающих, что альбом искусства JPG вы должны проверить формат изображения первых, как id3 allows many different image types
  • протестирована с около 10 случайных mp3 из Интернета, например этот: python url.py http://www.fuelfriendsblog.com/listenup/01%20America.mp3
Смежные вопросы