From 5f3e56f343dc31825f9b74809924d0db1ed211c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Lalinsk=C3=BD?= Date: Wed, 25 Nov 2015 17:19:37 +0100 Subject: [PATCH 1/2] [extractor/common] Use shorter file names --- youtube_dl/extractor/common.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/youtube_dl/extractor/common.py b/youtube_dl/extractor/common.py index eb9bfa3d1..387486fa5 100644 --- a/youtube_dl/extractor/common.py +++ b/youtube_dl/extractor/common.py @@ -390,9 +390,9 @@ class InfoExtractor(object): except AttributeError: url = url_or_request basen = '%s_%s' % (video_id, url) - if len(basen) > 240: + if len(basen) > 100: h = '___' + hashlib.md5(basen.encode('utf-8')).hexdigest() - basen = basen[:240 - len(h)] + h + basen = basen[:100 - len(h)] + h raw_filename = basen + '.dump' filename = sanitize_filename(raw_filename, restricted=True) self.to_screen('Saving request to ' + filename) From d473e7057e62fb815d3030ad018f920f237aacff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Lalinsk=C3=BD?= Date: Wed, 25 Nov 2015 17:20:28 +0100 Subject: [PATCH 2/2] [mixcloud] Download shows with files stored externally (fixes #7521) --- youtube_dl/extractor/mixcloud.py | 38 +++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/youtube_dl/extractor/mixcloud.py b/youtube_dl/extractor/mixcloud.py index d47aeceda..0a5339405 100644 --- a/youtube_dl/extractor/mixcloud.py +++ b/youtube_dl/extractor/mixcloud.py @@ -1,6 +1,8 @@ from __future__ import unicode_literals import re +import json +import itertools from .common import InfoExtractor from ..compat import compat_urllib_parse_unquote @@ -41,6 +43,18 @@ class MixcloudIE(InfoExtractor): 'view_count': int, 'like_count': int, }, + }, { + 'url': 'https://www.mixcloud.com/freshlifechurch/moment-maker/', + 'md5': 'b8cbf9ec43e1ae5c9a1757087692d384', + 'info_dict': { + 'id': 'freshlifechurch-moment-maker', + 'ext': 'mp3', + 'title': 'Moment Maker', + 'description': 'md5:ed6ac0493c017b5200a88bb4716663b6', + 'uploader': 'fresh life church', + 'uploader_id': 'freshlifechurch', + 'thumbnail': 're:https?://.*/images/', + }, }] def _check_url(self, url, track_id, ext): @@ -63,12 +77,20 @@ class MixcloudIE(InfoExtractor): webpage = self._download_webpage(url, track_id) preview_url = self._search_regex( - r'\s(?:data-preview-url|m-preview)="([^"]+)"', webpage, 'preview url') - song_url = preview_url.replace('/previews/', '/c/originals/') - if not self._check_url(song_url, track_id, 'mp3'): - song_url = song_url.replace('.mp3', '.m4a').replace('originals/', 'm4a/64/') - if not self._check_url(song_url, track_id, 'm4a'): - raise ExtractorError('Unable to extract track url') + r'\s(?:data-preview-url|m-preview)="([^"]+)"', webpage, 'preview url', default=None) + if preview_url is not None: + song_url = preview_url.replace('/previews/', '/c/originals/') + if not self._check_url(song_url, track_id, 'mp3'): + song_url = song_url.replace('.mp3', '.m4a').replace('originals/', 'm4a/64/') + if not self._check_url(song_url, track_id, 'm4a'): + raise ExtractorError('Unable to extract track url') + else: + play_info_encoded = self._search_regex( + r'\sm-play-info="([^"]+)"', webpage, 'preview url').decode('base64') + secret = 'cGxlYXNlZG9udGRvd25sb2Fkb3VybXVzaWN0aGVhcnRpc3Rzd29udGdldHBhaWQ='.decode('base64') + play_info_json = ''.join(chr(ord(a) ^ ord(b)) for a, b in itertools.izip(play_info_encoded, itertools.cycle(secret))) + play_info = json.loads(play_info_json) + song_url = play_info.get('stream_url') PREFIX = ( r'm-play-on-spacebar[^>]+' @@ -86,11 +108,11 @@ class MixcloudIE(InfoExtractor): description = self._og_search_description(webpage) like_count = str_to_int(self._search_regex( r'\bbutton-favorite\b[^>]+m-ajax-toggle-count="([^"]+)"', - webpage, 'like count', fatal=False)) + webpage, 'like count', default=None)) view_count = str_to_int(self._search_regex( [r'([0-9,.]+)'], - webpage, 'play count', fatal=False)) + webpage, 'play count', default=None)) return { 'id': track_id,