在不下载文件的情况下在网站上查找音频文件的比特率

时间:2014-09-12 18:43:18

标签: python bitrate

我想在不下载文件的情况下在网站上找到mp3的比特率。 使用Python3&诱变移植版本

代码

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

欢迎任何其他方式:) 谢谢

3 个答案:

答案 0 :(得分:3)

首先:

  

我不想下载文件。我只需要从服务器检查。我还想查找图像(jpg,png等)信息,如大小,像素。是不可能的?

不,这是不可能的。获取该信息的唯一方法是解析文件数据,除非下载文件数据,否则无法解析文件数据。

当然,如果服务器以其他方式提供该信息,例如通过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传递给构造函数,然后显式{ {1}}稍后。笨拙,但我所知道的最好的方式是以一种对所有平台都安全可靠的方式编写它。 (同样,如果您不关心Windows,只需使用更简单的第二版。)

如果您不理解os.remove语句,PEP 343可能最好解释它,但过分简化了一下,其想法是运行所有缩进代码,然后自动关闭文件(即使你with或在缩进代码中间引发异常。)


可以从HTTP服务器获取的少数内容之一就是文件的大小。服务器通常会为每个响应发送return标头,如果您发送Content-Length:请求而不是HEAD,则只会获得标头,而不是所有数据。所以:

GET

*事实上,我甚至不确定“使用低级功能”是一种选择;我无法确定,但我认为能够使用开放文件对象或字符串代替文件名是MusicBrainz必须添加到他们的Mutagen分支中的东西,因为没有办法做到这一点。 < / p>

答案 1 :(得分:1)

Info = MediaInfo.parse(mp3file)
for track in Info.tracks:
    if track.track_type == 'General':
        pass
    if track.track_type == 'Audio':
        BitRate = track.bit_rate/1000 + 'Kbps'

下载MediaInfo可执行文件并将其添加到您的Env Vars

编辑:哎呀!对不起,没有读完整的问题。

答案 2 :(得分:0)

Object.keys(obj)

https://pypi.org/project/pymediainfo/下载pymediainfo