浏览代码

[abc:iview] Fix extraction (closes #14711)

ABC dropped unmetering, so change to metered hls urls which
require auth.
d2au 7 年之前
父节点
当前提交
2e65e7db9e
共有 1 个文件被更改,包括 23 次插入5 次删除
  1. 23 5
      youtube_dl/extractor/abc.py

+ 23 - 5
youtube_dl/extractor/abc.py

@@ -1,6 +1,9 @@
 from __future__ import unicode_literals
 from __future__ import unicode_literals
 
 
+import hashlib
+import hmac
 import re
 import re
+import time
 
 
 from .common import InfoExtractor
 from .common import InfoExtractor
 from ..compat import compat_str
 from ..compat import compat_str
@@ -126,20 +129,35 @@ class ABCIViewIE(InfoExtractor):
         title = video_params.get('title') or video_params['seriesTitle']
         title = video_params.get('title') or video_params['seriesTitle']
         stream = next(s for s in video_params['playlist'] if s.get('type') == 'program')
         stream = next(s for s in video_params['playlist'] if s.get('type') == 'program')
 
 
-        format_urls = [
-            try_get(stream, lambda x: x['hds-unmetered'], compat_str)]
+        key = 'android.content.res.Resources'.encode('utf-8')
+        time_str = str(int(time.time()))
+        house_number = video_params.get('episodeHouseNumber')
+        path = '/auth/hls/sign?ts={0}&hn={1}&d=android-mobile'.format(
+            time_str, house_number)
+        sig = hmac.new(key, path.encode('utf-8'), hashlib.sha256).hexdigest()
+        auth_url = 'http://iview.abc.net.au{0}&sig={1}'.format(path, sig)
+        token = self._download_webpage(auth_url, video_id)
+
+        format_urls = []
+
+        def tokenize_url(url, token):
+            return ''.join([url, '?hdnea=', token])
 
 
         # May have higher quality video
         # May have higher quality video
         sd_url = try_get(
         sd_url = try_get(
-            stream, lambda x: x['streams']['hds']['sd'], compat_str)
+            stream, lambda x: x['streams']['hls']['sd'], compat_str)
         if sd_url:
         if sd_url:
-            format_urls.append(sd_url.replace('metered', 'um'))
+            format_urls.append(tokenize_url(sd_url, token))
+        else:
+            sd_low_url = try_get(
+                stream, lambda x: x['streams']['hls']['sd-low'], compat_str)
+            format_urls.append(tokenize_url(sd_low_url, token))
 
 
         formats = []
         formats = []
         for format_url in format_urls:
         for format_url in format_urls:
             if format_url:
             if format_url:
                 formats.extend(
                 formats.extend(
-                    self._extract_akamai_formats(format_url, video_id))
+                    self._extract_m3u8_formats(format_url, video_id, 'mp4'))
         self._sort_formats(formats)
         self._sort_formats(formats)
 
 
         subtitles = {}
         subtitles = {}