2014-11-12 8 views
7

का उपयोग करके आंशिक डाउनलोड के साथ एमपी 3 यूआरएल के आईडी 3 टैग निकालें मुझे दूरस्थ एमपी 3 फ़ाइलों के आईडी 3 टैग और मेटा-डेटा निकालने की आवश्यकता है।पायथन

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) 

मैं एमपी 3 फ़ाइलों के लिए यूआरएल लिंक के लिए इस लक्ष्य को हासिल करने की जरूरत है:

मैं कुछ लाइनों है कि स्थानीय फ़ाइल के ID3 टैग मिल सकता है लिखा था। मैंने 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) 

मैं पूरी तरह से फ़ाइल डाउनलोड किए बिना एमपी 3 यूआरएल के आईडी 3 टैग कैसे निकाल सकता हूं?

+0

आपको एमपी 3 फ़ाइल के पहले 100 बाइट्स लाने के लिए मिला है। कहाँ रह गया। – scav

+2

आह, ऐसा लगता है कि id3 टैग फ़ाइल के अंतिम 128 बाइट्स में हैं। इसलिए जब तक कि आप फ़ाइल के आकार को नहीं जानते हैं, आप उन्हें प्राप्त करने के लिए एक रेंज हेडर बनाने में सक्षम नहीं होंगे। हो सकता है कि एक हेड अनुरोध पहले फ़ाइल की लंबाई प्राप्त कर सके ... – scav

उत्तर

0

आपके उदाहरण में, आईडी 3 टैग नहीं लाए जाते हैं, इसलिए आप उन्हें निकालने नहीं कर सकते हैं।

मैंने आईडी 3 के लिए spec पढ़ने के बाद थोड़ा सा खेला और यहां शुरू करने का एक अच्छा तरीका है।

#Search for ID3v1 tags 
import string 
tagIndex = string.find(data,'TAG') 
if (tagIndex>0): 
    if data[tagIndex+3]=='+': 
    print "Found extended ID3v1 tag!" 
    title = data[tagIndex+3:tagIndex+63] 
    print title 
    else: 
    print "Found ID3v1 tags" 
    title = data[tagIndex+3:tagIndex+33] 
    print title 
    #So on. 
else: 
    #Look for ID3v2 tags 
    if 'TCOM' in data: 
    composerIndex = string.find(data,'TCOM') 
    #and so on. See wikipedia for a full list of frame specifications 
0

ID3 टैग ID3 मेटाडाटा जो आम तौर पर एमपी 3 फ्रेम (ऑडियो युक्त) के सामने में है में जमा हो जाती है, लेकिन एमपी 3 मानक "follow the mp3 frames" लिए भी उन्हें अनुमति देता है। ,

  1. डाउनलोड एमपी 3 के पहले 10 बाइट्स ID3v2 हैडर निकालने और ID3v2 हैडर
  2. के आकार की गणना पूर्ण ID3v2 पुनः प्राप्त करने के:

    बाइट्स की न्यूनतम संख्या डाउनलोड करने के लिए आप की जरूरत है टैग एमपी 3 के size बाइट्स डाउनलोड

  3. ID3 टैग

यहाँ एक स्क्रिप्ट है निकालने के लिए एक अजगर पुस्तकालय का उपयोग करें (अजगर 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) 

कुछ टिप्पणी: डाउनलोड आकार का एक न्यूनतम राशि th

  • यह जाँच करता है कि ID3 फ़ाइल के सामने है और यह ID3v2
  • ID3 टैग के आकार है कि बाइट 6 से 9 में संग्रहीत, documented on id3.org
  • दुर्भाग्यवश mutagen को id3 टैग को पार्स करने के लिए एक पूर्ण एमपी 3 ऑडियो फ्रेम की आवश्यकता है। आप इसलिए भी एक एमपी 3 फ्रेम
  • बजाय आँख बंद करके संभालने एल्बम कला आप पहली बार id3 के रूप में छवि प्रारूप के लिए जाँच करनी चाहिए jpg जाता है कि (जो लंबे समय से this comment के अनुसार अधिकतम 2881 बाइट्स में है) डाउनलोड करने की आवश्यकता allows many different image types
  • के साथ परीक्षण किया इंटरनेट से लगभग 10 यादृच्छिक एमपी 3, उदाहरण के लिए यह एक: python url.py http://www.fuelfriendsblog.com/listenup/01%20America.mp3