2014-09-12 5 views
2

Я хочу найти битрейт 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 

Любые другие способы также приветствуются :) Спасибо

+0

Кстати, что такое «Mutagen Ported Version»? Была ли это какая-то развилка, которая была создана до того, как Mutagen добавил поддержку 3.x или новую вилку, которая исправляет ошибки 3.x быстрее, чем mainline, игнорируя 2.x или что-то в этом роде? – abarnert

ответ

3

Первая:

Я не хочу, чтобы загрузить файлы. Мне просто нужно проверить с сервера. Я также хочу найти информацию об изображении (jpg, png и т. Д.), Такую как размер, пиксели. Возможно ли это?

Нет, это невозможно. Единственный способ получить эту информацию - это проанализировать данные файла, и вы не можете анализировать данные файла, если вы не загрузите данные файла.

Конечно, если сервер предоставляет эту информацию каким-либо другим способом, например, через REST или RPC API или веб-страницу, которую вы можете очистить, тогда вы можете загрузить информацию ... но в этом случае вы не разбираетесь файл сам, и у вас нет необходимости в Mutagen. (А если вы управляете сервером, вы всегда можете добавить веб-приложение, которое делает синтаксический анализ на стороне сервера и предоставляет информацию в любом формате, который вы хотите.)


Если вы просто беспокоюсь о спасении файл на диск: будь то из stdlib или из сторонних модулей, большинство функций на Python, которые хотят, чтобы имя файла не принимало сетевой URL. Это отличается от некоторых других языков, которые везде используют URL-адреса и стараются обрабатывать URL-адреса и URL-адреса по-разному, когда это возможно (путем загрузки фрагмента файла с помощью фрагмента в память).

Однако, большинство функций, которые хотят файл объект может занять urlrequest или подобный предмет, и, если они не могут, как правило, может занять BytesIO. Таким образом, вам не нужно, чтобы загрузить его в файл на диске:

import urllib.request 

r = urllib.request.open(url) 
spam(r) 

Проблема заключается в том, я не думаю, что мутаген в «простой 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, потому что не было никакого способа это сделать.

+0

Я новичок в Python SO Cant Understanding полностью. :(Вышеуказанный метод будет загружать файл? Что это за строка? << с помощью tempfile.NamedTemporaryFile >> Я получаю здесь ошибку. –

+1

@MuneebK: Ну, вам нужно «импортировать» любые модули, которые вы используете. добавьте строки для этого в мой пример. Но да, это будет загружать файл во временный файл, а затем удалять его, как только вы закончите с ним. – abarnert

+0

@abarnet, я не хочу скачивать файлы. для проверки с сервера. Я также хочу найти информацию о изображении (jpg, png и т. д.), такую ​​как размер, пиксели. Возможно ли это? Можете ли вы мне помочь? Спасибо –

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 Варс

Edit: Упс! Извините, не прочитал полный вопрос.