diff options
author | Philipp Hagemeister <phihag@phihag.de> | 2013-11-22 17:44:55 +0100 |
---|---|---|
committer | Philipp Hagemeister <phihag@phihag.de> | 2013-11-22 17:44:55 +0100 |
commit | cffa6aa10757099bfb46c5c4eff5c5d9a3ff97f4 (patch) | |
tree | 90eb610950a347d17c80aace7ddb809a6df3a30b | |
parent | 02e4ebbbad5653b9bbbcf615bdcae6b2c7ea1e30 (diff) |
[bandcamp] Support trackinfo-style songs (Fixes #1270)
-rw-r--r-- | youtube_dl/extractor/bandcamp.py | 46 |
1 files changed, 44 insertions, 2 deletions
diff --git a/youtube_dl/extractor/bandcamp.py b/youtube_dl/extractor/bandcamp.py index 81d5c60e9..8b1d56da3 100644 --- a/youtube_dl/extractor/bandcamp.py +++ b/youtube_dl/extractor/bandcamp.py @@ -3,6 +3,7 @@ import re from .common import InfoExtractor from ..utils import ( + compat_str, compat_urlparse, ExtractorError, ) @@ -11,7 +12,7 @@ from ..utils import ( class BandcampIE(InfoExtractor): IE_NAME = u'Bandcamp' _VALID_URL = r'http://.*?\.bandcamp\.com/track/(?P<title>.*)' - _TEST = { + _TESTS = [{ u'url': u'http://youtube-dl.bandcamp.com/track/youtube-dl-test-song', u'file': u'1812978515.mp3', u'md5': u'cdeb30cdae1921719a3cbcab696ef53c', @@ -19,7 +20,28 @@ class BandcampIE(InfoExtractor): u"title": u"youtube-dl test song \"'/\\\u00e4\u21ad" }, u'skip': u'There is a limit of 200 free downloads / month for the test song' - } + }, { + u'url': u'http://blazo.bandcamp.com/album/jazz-format-mixtape-vol-1', + u'playlist': [ + { + u'file': u'1353101989.mp3', + u'md5': u'39bc1eded3476e927c724321ddf116cf', + u'info_dict': { + u'title': u'Intro', + } + }, + { + u'file': u'38097443.mp3', + u'md5': u'1a2c32e2691474643e912cc6cd4bffaa', + u'info_dict': { + u'title': u'Kero One - Keep It Alive (Blazo remix)', + } + }, + ], + u'params': { + u'playlistend': 2 + } + }] def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) @@ -28,6 +50,26 @@ class BandcampIE(InfoExtractor): # We get the link to the free download page m_download = re.search(r'freeDownloadPage: "(.*?)"', webpage) if m_download is None: + m_trackinfo = re.search(r'trackinfo: (.+),\s*?\n', webpage) + if m_trackinfo: + json_code = m_trackinfo.group(1) + data = json.loads(json_code) + + entries = [] + for d in data: + formats = [{ + 'format_id': 'format_id', + 'url': format_url, + 'ext': format_id.partition('-')[0] + } for format_id, format_url in sorted(d['file'].items())] + entries.append({ + 'id': compat_str(d['id']), + 'title': d['title'], + 'formats': formats, + }) + + return self.playlist_result(entries, title, title) + else: raise ExtractorError(u'No free songs found') download_link = m_download.group(1) |