[NBC] Enhance embedURL extraction (closes #2549)
authorYen Chi Hsuan <yan12125@gmail.com>
Mon, 4 May 2015 13:53:05 +0000 (21:53 +0800)
committerYen Chi Hsuan <yan12125@gmail.com>
Mon, 4 May 2015 13:55:04 +0000 (21:55 +0800)
test/test_utils.py
youtube_dl/extractor/nbc.py
youtube_dl/utils.py

index 6906a65c224ecd28800c1a2fd5131cf4bda48c77..032d3656ae21ec733a11d946e52693ebd560af16 100644 (file)
@@ -53,6 +53,7 @@ from youtube_dl.utils import (
     unified_strdate,
     unsmuggle_url,
     uppercase_escape,
+    lowercase_escape,
     url_basename,
     urlencode_postdata,
     version_tuple,
@@ -418,6 +419,10 @@ class TestUtil(unittest.TestCase):
         self.assertEqual(uppercase_escape('aä'), 'aä')
         self.assertEqual(uppercase_escape('\\U0001d550'), '𝕐')
 
+    def test_lowercase_escape(self):
+        self.assertEqual(lowercase_escape('aä'), 'aä')
+        self.assertEqual(lowercase_escape('\\u0026'), '&')
+
     def test_limit_length(self):
         self.assertEqual(limit_length(None, 12), None)
         self.assertEqual(limit_length('foo', 12), 'foo')
index 6cbe03d0f634138cf4b6f651590be6d700c54c08..dc2091be0d0c8706b2f3b6d78d88fa22fcb8b6d1 100644 (file)
@@ -10,6 +10,8 @@ from ..compat import (
 from ..utils import (
     ExtractorError,
     find_xpath_attr,
+    lowercase_escape,
+    unescapeHTML,
 )
 
 
@@ -46,18 +48,23 @@ class NBCIE(InfoExtractor):
                 'description': 'md5:0b40f9cbde5b671a7ff62fceccc4f442',
             },
             'skip': 'Only works from US',
+        },
+        {
+            # This video has expired but with an escaped embedURL
+            'url': 'http://www.nbc.com/parenthood/episode-guide/season-5/just-like-at-home/515',
+            'skip': 'Expired'
         }
     ]
 
     def _real_extract(self, url):
         video_id = self._match_id(url)
         webpage = self._download_webpage(url, video_id)
-        theplatform_url = self._search_regex(
+        theplatform_url = unescapeHTML(lowercase_escape(self._html_search_regex(
             [
                 r'(?:class="video-player video-player-full" data-mpx-url|class="player" src)="(.*?)"',
                 r'"embedURL"\s*:\s*"([^"]+)"'
             ],
-            webpage, 'theplatform url').replace('_no_endcard', '')
+            webpage, 'theplatform url').replace('_no_endcard', '').replace('\\/', '/')))
         if theplatform_url.startswith('//'):
             theplatform_url = 'http:' + theplatform_url
         return self.url_result(theplatform_url)
index a5a5c317e0507e9ecb49f8ecae67f196877184d6..1013f7c1879e0afac035327e1e60c13ee295ee21 100644 (file)
@@ -1486,6 +1486,14 @@ def uppercase_escape(s):
         s)
 
 
+def lowercase_escape(s):
+    unicode_escape = codecs.getdecoder('unicode_escape')
+    return re.sub(
+        r'\\u[0-9a-fA-F]{4}',
+        lambda m: unicode_escape(m.group(0))[0],
+        s)
+
+
 def escape_rfc3986(s):
     """Escape non-ASCII characters as suggested by RFC 3986"""
     if sys.version_info < (3, 0) and isinstance(s, compat_str):