从远程mp3中提取封面艺术

时间:2017-01-19 15:45:07

标签: python id3 mutagen

我需要从远程mp3文件中提取封面图片并将其保存到文件而不下载整个mp3。但我没有成功。我试着下载文件的前100个字节,如:

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)

我已经读过id 3标签位于mp3的最后128个字节。现在我需要一些帮助来帮助只下载包含apic封面艺术的最后一个字节并提取图像。

感谢您帮助我

2 个答案:

答案 0 :(得分:2)

秘密艺术在id3v2标签的文件的开头。

这是一个hacky解决方案:读取直到读取整个文件或者mutagen没有错误输出。如果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())

答案 1 :(得分:0)

ID3标签通常位于mp3文件前面,而不是后面。我从互联网上检查了一些随机的mp3,并且前面有他们所有的ID3标签,尽管mp3 format允许他们在最后拥有它。

如果您只想下载绝对最小字节数(因为您不想浪费您的手机用户带宽),您需要:

  1. 部分下载10个字节并检查ID3标签是否在文件前面。如果不是:下载整个文件
  2. 从字节6-9中提取大小(请注意,最左边的位总是设置为零,为described on id3.org
  3. 对您刚刚计算的尺寸进行新的部分下载
  4. 之后,您将下载完整的ID3标签,并可以提取它们。现在,mutagen还有一个限制,你需要下载第一个mp3音频帧,否则会引发异常:mutagen.mp3.HeaderNotFoundError: can't sync to an MPEG frame。如果你有这个限制我posted a python solution at a similar question(事实上这可能是重复的,我看你也已经将问题的源代码复制到你的问题中)。

    如果您绝对想要最小化下载大小,那么您可能想尝试few other modules,希望不需要同时下载第一个音频帧。