我需要提取远程 mp3 文件的 ID3 标签和元数据。
我写了几行可以获取本地文件的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)
我需要为 mp3 文件的 url 链接实现此目的。我尝试使用 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)
如何在不完全下载文件的情况下提取 MP3 url 的 ID3 标签?
id3标签存储在ID3元数据中,通常是in frontmp3 帧(包含音频),但 mp3 标准还允许它们“跟随 mp3 帧” https://en.wikipedia.org/wiki/MP3.
要下载最小字节数,您需要:
- 下载 mp3 的前 10 个字节,提取 ID3v2 标头并计算 id3v2 标头的大小
- 检索完整的 id3v2 标签下载
size
mp3 的字节数
- 使用Python库提取ID3标签
这是一个脚本(python 2 或 3),它以最小的下载大小提取专辑封面:
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中,如下所示记录在 id3.org 上 http://id3.org/id3v2.3.0#ID3v2_header
- 不幸的是,mutagen 需要一个完整的 mp3 音频帧来解析 id3 标签。因此,您还需要下载一帧 mp3(根据规定,最大长度为 2881 字节)这条评论 https://www.mars.org/pipermail/mad-dev/2002-January/000425.html)
- 不要盲目地假设专辑封面是 jpg,您应该首先检查图像格式为 id3允许许多不同的图像类型 http://www.richardfarrar.com/embedding-album-art-in-mp3-files/
- 使用来自互联网的大约 10 个随机 mp3 进行测试,例如这个 :
python url.py http://www.fuelfriendsblog.com/listenup/01%20America.mp3
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)