2017-01-19 43 views
1

Мне нужно извлечь обложку из удаленного mp3-файла и сохранить ее в файл без скачивания всего mp3. Но у меня нет успеха. Я пытаюсь загрузить первые 100 байт файла как:экстракт обложки из удаленного mp3

import urllib2 
from mutagen.mp3 import MP3 

req = urllib2.Request('http://www.stephaniequinn.com/Music/Commercial%20DEMO%20-%2001.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) 

Я читал о том, что идентификатор 3 Бирки на последних 128 байт в формате mp3. Теперь мне нужна помощь в помощи для загрузки только последних байтов, содержащих апикальное обложку и извлечение изображения.

спасибо за помощь мне

+0

mp3, на который вы ссылаетесь, в вашем примере не прилагается. Можете ли вы предоставить обложку? – hansaplast

+0

если я скачаю этот mp3 VLC, покажу некоторые обложки ... Я ищу другого, пожалуйста, подождите – fteinz

+0

вы используете linux или windows? Вам понадобятся некоторые инструменты командной строки, чтобы найти положение обложки в mp3-файле – hansaplast

ответ

2

Скрытое искусство находится в самом начале файла в качестве ID3v2 тега.

Вот хакерское решение: прочитайте до тех пор, пока весь файл не будет прочитан, или мутаген не выйдет из строя. Это будет читать весь файл, если mp3 не является mp3. В идеале вы передавали бы его файл с возможностью поиска, который выполняет буферизацию, возможно, для этого есть библиотека.

# Python 2 or 3 
try: 
    import urllib2 as request 
except ImportError: 
    from urllib import request 
from io import BytesIO 
from mutagen import MutagenError 
from mutagen.mp3 import MP3 


def get_mp3(url): 
    """ 
    Args: 
     url (str) 
    Returns: 
     mutagen.mp3.MP3 
    Raises: 
     mutagen.MutagenError 
     EnvironmentError 
    """ 

    r = request.urlopen(url) 
    try: 
     size = 128 
     filelike = BytesIO() 
     while 1: 
      data = r.read(size) 
      size *= 2 
      filelike.seek(0, 2) 
      filelike.write(data) 
      filelike.seek(0) 
      try: 
       return MP3(filelike) 
      except MutagenError: 
       if not data: 
        raise 
       pass 
    finally: 
     r.close() 

try: 
    f = get_mp3("http://web.ist.utl.pt/antonio.afonso/www.aadsm.net/libraries/id3/music/Bruno_Walter_-_01_-_Beethoven_Symphony_No_1_Menuetto.mp3") 
except (MutagenError, EnvironmentError): 
    pass 
else: 
    if f.tags: 
     for frame in f.tags.getall("APIC"): 
      print(frame.pprint()) 
+0

вы проверили, не загрузил ли этот файл весь файл? Я предположил, что, когда не задает 'Range' в заголовке, он загружает весь файл, несмотря на то, что он говорит' read' загружать только несколько байтов? – hansaplast

+0

@hansaplast Я не знаю. Глядя на него, используя «strace -y -e recvfrom python foo.py "показывает, что он по крайней мере не загружает весь файл. – lazka

0

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

Если вы хотите загрузить только абсолютный минимум байтов (как вы не хотите тратить пропускной мобильные пользователи) вам необходимо:

  1. сделать частичную загрузку 10 байт и проверка что теги ID3 находятся перед файлом. Если нет: скачать весь файл
  2. извлечь размер от байта 6-9 (обратите внимание, что байты имеют крайний левый бит всегда равен нулю, так как described on id3.org)
  3. сделать свежий частичное загрузку размера вы просто вычисленной

После этого вы загрузите полные теги ID3 и сможете их извлечь. Теперь у мутагена есть ограничение на то, что вам нужно загрузить первый mp3-аудиокадр, в противном случае это вызовет исключение: mutagen.mp3.HeaderNotFoundError: can't sync to an MPEG frame. Если это ограничение подходит для вас I posted a python solution at a similar question (на самом деле это, вероятно, дубликат, я вижу, вы также скопировали исходный код вопроса в свой вопрос).

Если вы абсолютно хотите свести к минимуму размер вашей загрузки, вы, вероятно, захотите попробовать few other modules, который, надеюсь, не требует также загрузки первого аудиокарта.

 Смежные вопросы

  • Нет связанных вопросов^_^