我想在不下载文件的情况下在网站上找到mp3的比特率。使用Python3和Mutagen移植版本
代码
from mutagen.id3 import ID3
audio = ID3("http://songs.djmazadownload.com/music/indian_movies/Creature%20(2014)/01%20-%20Creature%20-%20Sawan%20Aaya%20Hai%20%5BDJMaza.Info%5D.mp3")
print (audio.info.length, audio.info.bitrate)
错误
Traceback (most recent call last):
File "C:\Python_Mass_downloader\New folder\download.py", line 20, in <module>
audio = ID3("http://songs.djmazadownload.com/music/indian_movies/Creature%20(2014)/01%20-%20Creature%20-%20Sawan%20Aaya%20Hai%20%5BDJMaza.Info%5D.mp3")
File "C:\Python34\lib\site-packages\mutagen\id3.py", line 76, in __init__
super(ID3, self).__init__(*args, **kwargs)
File "C:\Python34\lib\site-packages\mutagen\_util.py", line 41, in __init__
super(DictProxy, self).__init__(*args, **kwargs)
File "C:\Python34\lib\site-packages\mutagen\__init__.py", line 46, in __init__
self.load(*args, **kwargs)
File "C:\Python34\lib\site-packages\mutagen\id3.py", line 122, in load
self._fileobj = open(filename, 'rb')
OSError: [Errno 22] Invalid argument: 'http://songs.djmazadownload.com/music/indian_movies/Creature%20(2014)/01%20-%20Creature%20-%20Sawan%20Aaya%20Hai%20%5BDJMaza.Info%5D.mp3'
样本输入
http://songs.djmazadownload.com/music/indian_movies/Creature%20%282014%29/01%20-%20Creature%20-%20Sawan%20Aaya%20Hai%20%5BDJMaza.Info%5D.mp3
也欢迎任何其他方式:)谢谢
第一的:
我不想下载文件。我只需要从服务器检查。我也想查找图像的(jpg,png等)信息,例如size,pixel。有可能吗?
不,不可能。获取该信息的唯一方法是解析文件数据,除非下载文件数据,否则无法解析文件数据。
当然,如果服务器以其他方式(例如通过REST或RPC API或您可以抓取的网页)提供了该信息,则可以下载该信息……但是,在这种情况下,您并不是自己解析文件的,而且您不需要Mutagen。(如果控制服务器,则始终可以添加一个Web应用程序,该应用程序在服务器端进行解析并以所需的任何格式提供信息。)
如果您只是担心将文件保存到磁盘:无论是从stdlib还是从第三方模块,Python中大多数需要文件名的函数都不能使用网络URL。这与其他一些语言不同,后者使用无处不在的URL,并在可能的情况下(通过将文件逐块下载到内存中)尝试以相同的方式对待http和文件URL。
但是,大多数需要文件对象的函数都可以采用urlrequest
或类似的对象,如果不能,通常可以采用BytesIO
。因此,您无需将其下载到磁盘上的文件中:
import urllib.request
r = urllib.request.open(url)
spam(r)
问题是,我不认为Mutagen的“简单API”函数ID3
可以接受文件对象,而只能接受文件名。因此,您将不得不使用其他库,使用较低级的功能*,或下载到临时文件。
但是即使最后一个也不是那么糟糕:
import tempfile
import urllib.request
r = urllib.request.open(url)
with tempfile.NamedTemporaryFile(mode='wb', delete=False) as f:
f.write(r.read())
try:
id3 = mutagen.id3.ID3(f.name)
finally:
os.remove(f.name)
或者,如果您不关心Windows,则可以将其简化为:
r = urllib.request.open(url)
with tempfile.NamedTemporaryFile(mode='wb') as f:
f.write(r.read())
f.flush()
id3 = mutagen.id3.ID3(f.name)
NamedTemporaryFile
创建并打开一个临时文件。默认情况下,它将在您关闭时将其删除(在with
语句结束时立即删除)。以这种方式使用它的问题在于,在Windows上,ID3
可能无法打开临时文件,除非您将其关闭,这意味着您必须传递delete=False
给构造函数,然后os.remove
在以后显式将其传递。笨拙,但是我所知道的最好的方式是,对所有平台都安全可靠地编写它。(同样,如果您不关心Windows,只需使用较简单的第二个版本。)
如果您不理解该with
语句,则PEP 343可能最好地解释了该语句,但过分简化了,其想法是运行所有缩进的代码,然后自动关闭文件(即使您return
或在缩进的中间引发异常)代码)。
您可以从HTTP服务器获取的少数内容之一就是文件的大小。服务器通常会Content-Length:
为每个响应发送一个标头,如果您发送HEAD
请求而不是发送一个GET
,那么您只会获得标头,而不是所有数据。所以:
>>> req = urllib.request.Request(url, method='HEAD')
>>> resp = urllib.request.urlopen(req)
>>> size = int(resp.headers['Content-Length'])
6201098
*实际上,我什至不确定“使用较低级别的函数”是否是一个选项;我不确定,但我认为MusicBrainz必须添加到Mutagen的分支中,才能使用打开的文件对象或字符串代替文件名,因为没有办法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句