Fix blip.tv regular expression to not match blipXtv
[youtube-dl] / youtube-dl
index 9f391db0d6f3cb3bc2fa2c2e2a6de0dbc63e7e07..6a4209222aaa1dd63e08542f715508ad539df8a9 100755 (executable)
@@ -9,8 +9,6 @@
 # Author: Gergely Imreh
 # Author: Philipp Hagemeister <phihag@phihag.de>
 # License: Public domain code
-from __future__ import with_statement
-import contextlib
 import cookielib
 import datetime
 import gzip
@@ -712,8 +710,11 @@ class FileDownloader(object):
                        try:
                                descfn = filename + '.description'
                                self.report_writedescription(descfn)
-                               with contextlib.closing(open(descfn, 'wb')) as descfile:
+                               descfile = open(descfn, 'wb')
+                               try:
                                        descfile.write(info_dict['description'].encode('utf-8'))
+                               finally:
+                                       descfile.close()
                        except (OSError, IOError):
                                self.trouble(u'ERROR: Cannot write description file: %s' % str(descfn))
                                return
@@ -727,8 +728,11 @@ class FileDownloader(object):
                                self.trouble(u'ERROR: No JSON encoder found. Update to Python 2.6+, setup a json module, or leave out --write-info-json.')
                                return
                        try:
-                               with contextlib.closing(open(infofn, 'wb')) as infof:
+                               infof = open(infofn, 'wb')
+                               try:
                                        json.dump(info_dict, infof)
+                               finally:
+                                       infof.close()
                        except (OSError, IOError):
                                self.trouble(u'ERROR: Cannot write metadata to JSON file: %s' % str(infofn))
                                return
@@ -1024,7 +1028,7 @@ class InfoExtractor(object):
 class YoutubeIE(InfoExtractor):
        """Information extractor for youtube.com."""
 
-       _VALID_URL = r'^((?:https?://)?(?:youtu\.be/|(?:\w+\.)?youtube(?:-nocookie)?\.com/)(?:(?:(?:v|embed|e)/)|(?:(?:watch(?:_popup)?(?:\.php)?)?(?:\?|#!?)(?:.+&)?v=)))?([0-9A-Za-z_-]+)(?(1).+)?$'
+       _VALID_URL = r'^((?:https?://)?(?:youtu\.be/|(?:\w+\.)?youtube(?:-nocookie)?\.com/)(?:(?:(?:v|embed|e)/)|(?:(?:watch(?:_popup)?(?:\.php)?)?(?:\?|#!?)(?:.+&)?v=))?)?([0-9A-Za-z_-]+)(?(1).+)?$'
        _LANG_URL = r'http://www.youtube.com/?hl=en&persist_hl=1&gl=US&persist_gl=1&opt_out_ackd=1'
        _LOGIN_URL = 'https://www.youtube.com/signup?next=/&gl=US&hl=en'
        _AGE_URL = 'http://www.youtube.com/verify_age?next_url=/&gl=US&hl=en'
@@ -1258,9 +1262,9 @@ class YoutubeIE(InfoExtractor):
                        video_url_list = [(None, video_info['conn'][0])]
                elif 'url_encoded_fmt_stream_map' in video_info and len(video_info['url_encoded_fmt_stream_map']) >= 1:
                        url_data_strs = video_info['url_encoded_fmt_stream_map'][0].split(',')
-                       url_data = [dict(pairStr.split('=') for pairStr in uds.split('&')) for uds in url_data_strs]
+                       url_data = [parse_qs(uds) for uds in url_data_strs]
                        url_data = filter(lambda ud: 'itag' in ud and 'url' in ud, url_data)
-                       url_map = dict((ud['itag'], urllib.unquote(ud['url'])) for ud in url_data)
+                       url_map = dict((ud['itag'][0], ud['url'][0]) for ud in url_data)
                        
                        format_limit = self._downloader.params.get('format_limit', None)
                        if format_limit is not None and format_limit in self._available_formats:
@@ -1282,7 +1286,7 @@ class YoutubeIE(InfoExtractor):
                                        return
                                video_url_list = [(req_format, url_map[req_format])] # Specific format
                else:
-                       self._downloader.trouble(u'ERROR: no fmt_url_map or conn information found in video info')
+                       self._downloader.trouble(u'ERROR: no conn or url_encoded_fmt_stream_map information found in video info')
                        return
 
                for format_param, video_real_url in video_url_list:
@@ -1292,7 +1296,6 @@ class YoutubeIE(InfoExtractor):
                        # Extension
                        video_extension = self._video_extensions.get(format_param, 'flv')
 
-                       # Find the video URL in fmt_url_map or conn paramters
                        try:
                                # Process video information
                                self._downloader.process_info({
@@ -2717,7 +2720,6 @@ class FacebookIE(InfoExtractor):
                        # Extension
                        video_extension = self._video_extensions.get(format_param, 'mp4')
 
-                       # Find the video URL in fmt_url_map or conn paramters
                        try:
                                # Process video information
                                self._downloader.process_info({
@@ -2739,7 +2741,7 @@ class FacebookIE(InfoExtractor):
 class BlipTVIE(InfoExtractor):
        """Information extractor for blip.tv"""
 
-       _VALID_URL = r'^(?:https?://)?(?:\w+\.)?blip.tv(/.+)$'
+       _VALID_URL = r'^(?:https?://)?(?:\w+\.)?blip\.tv(/.+)$'
        _URL_EXT = r'^.*\.([a-z0-9]+)$'
 
        @staticmethod
@@ -2761,7 +2763,11 @@ class BlipTVIE(InfoExtractor):
                        self._downloader.trouble(u'ERROR: invalid URL: %s' % url)
                        return
 
-               json_url = url + ('&' if '?' in url else '?') + 'skin=json&version=2&no_wrap=1'
+               if '?' in url:
+                       cchar = '&'
+               else:
+                       cchar = '?'
+               json_url = url + cchar + 'skin=json&version=2&no_wrap=1'
                request = urllib2.Request(json_url)
                self.report_extraction(mobj.group(1))
                try:
@@ -2771,7 +2777,10 @@ class BlipTVIE(InfoExtractor):
                        return
                try:
                        json_data = json.loads(json_code)
-                       data = json_data['Post'] if 'Post' in json_data else json_data
+                       if 'Post' in json_data:
+                               data = json_data['Post']
+                       else:
+                               data = json_data
 
                        upload_date = datetime.datetime.strptime(data['datestamp'], '%m-%d-%y %H:%M%p').strftime('%Y%m%d')
                        video_url = data['media']['url']