Browse Source

Merge branch 'master' of github.com:rg3/youtube-dl

Philipp Hagemeister 11 years ago
parent
commit
0e145dd541

+ 1 - 1
youtube_dl/YoutubeDL.py

@@ -640,7 +640,7 @@ class YoutubeDL(object):
             # subtitles download errors are already managed as troubles in relevant IE
             # subtitles download errors are already managed as troubles in relevant IE
             # that way it will silently go on when used with unsupporting IE
             # that way it will silently go on when used with unsupporting IE
             subtitles = info_dict['subtitles']
             subtitles = info_dict['subtitles']
-            sub_format = self.params.get('subtitlesformat')
+            sub_format = self.params.get('subtitlesformat', 'srt')
             for sub_lang in subtitles.keys():
             for sub_lang in subtitles.keys():
                 sub = subtitles[sub_lang]
                 sub = subtitles[sub_lang]
                 if sub is None:
                 if sub is None:

+ 1 - 1
youtube_dl/extractor/__init__.py

@@ -80,7 +80,7 @@ from .keezmovies import KeezMoviesIE
 from .kickstarter import KickStarterIE
 from .kickstarter import KickStarterIE
 from .keek import KeekIE
 from .keek import KeekIE
 from .liveleak import LiveLeakIE
 from .liveleak import LiveLeakIE
-from .livestream import LivestreamIE
+from .livestream import LivestreamIE, LivestreamOriginalIE
 from .metacafe import MetacafeIE
 from .metacafe import MetacafeIE
 from .metacritic import MetacriticIE
 from .metacritic import MetacriticIE
 from .mit import TechTVMITIE, MITIE
 from .mit import TechTVMITIE, MITIE

+ 1 - 1
youtube_dl/extractor/gamekings.py

@@ -11,7 +11,7 @@ class GamekingsIE(InfoExtractor):
     _TEST = {
     _TEST = {
         u"url": u"http://www.gamekings.tv/videos/phoenix-wright-ace-attorney-dual-destinies-review/",
         u"url": u"http://www.gamekings.tv/videos/phoenix-wright-ace-attorney-dual-destinies-review/",
         u'file': u'20130811.mp4',
         u'file': u'20130811.mp4',
-        u'md5': u'17f6088f7d0149ff2b46f2714bdb1954',
+        u'md5': u'2f32b1f7b80fdc5cb616efb4f387f8a3',
         u'info_dict': {
         u'info_dict': {
             u"title": u"Phoenix Wright: Ace Attorney \u2013 Dual Destinies Review",
             u"title": u"Phoenix Wright: Ace Attorney \u2013 Dual Destinies Review",
             u"description": u"Melle en Steven hebben voor de review een week in de rechtbank doorbracht met Phoenix Wright: Ace Attorney - Dual Destinies.",
             u"description": u"Melle en Steven hebben voor de review een week in de rechtbank doorbracht met Phoenix Wright: Ace Attorney - Dual Destinies.",

+ 44 - 0
youtube_dl/extractor/livestream.py

@@ -1,16 +1,19 @@
 import re
 import re
 import json
 import json
+import xml.etree.ElementTree
 
 
 from .common import InfoExtractor
 from .common import InfoExtractor
 from ..utils import (
 from ..utils import (
     compat_urllib_parse_urlparse,
     compat_urllib_parse_urlparse,
     compat_urlparse,
     compat_urlparse,
     get_meta_content,
     get_meta_content,
+    xpath_with_ns,
     ExtractorError,
     ExtractorError,
 )
 )
 
 
 
 
 class LivestreamIE(InfoExtractor):
 class LivestreamIE(InfoExtractor):
+    IE_NAME = u'livestream'
     _VALID_URL = r'http://new.livestream.com/.*?/(?P<event_name>.*?)(/videos/(?P<id>\d+))?/?$'
     _VALID_URL = r'http://new.livestream.com/.*?/(?P<event_name>.*?)(/videos/(?P<id>\d+))?/?$'
     _TEST = {
     _TEST = {
         u'url': u'http://new.livestream.com/CoheedandCambria/WebsterHall/videos/4719370',
         u'url': u'http://new.livestream.com/CoheedandCambria/WebsterHall/videos/4719370',
@@ -54,3 +57,44 @@ class LivestreamIE(InfoExtractor):
             info = json.loads(self._download_webpage(api_url, video_id,
             info = json.loads(self._download_webpage(api_url, video_id,
                                                      u'Downloading video info'))
                                                      u'Downloading video info'))
             return self._extract_video_info(info)
             return self._extract_video_info(info)
+
+
+# The original version of Livestream uses a different system
+class LivestreamOriginalIE(InfoExtractor):
+    IE_NAME = u'livestream:original'
+    _VALID_URL = r'https?://www\.livestream\.com/(?P<user>[^/]+)/video\?.*?clipId=(?P<id>.*?)(&|$)'
+    _TEST = {
+        u'url': u'http://www.livestream.com/dealbook/video?clipId=pla_8aa4a3f1-ba15-46a4-893b-902210e138fb',
+        u'info_dict': {
+            u'id': u'pla_8aa4a3f1-ba15-46a4-893b-902210e138fb',
+            u'ext': u'flv',
+            u'title': u'Spark 1 (BitCoin) with Cameron Winklevoss & Tyler Winklevoss of Winklevoss Capital',
+        },
+        u'params': {
+            # rtmp
+            u'skip_download': True,
+        },
+    }
+
+    def _real_extract(self, url):
+        mobj = re.match(self._VALID_URL, url)
+        video_id = mobj.group('id')
+        user = mobj.group('user')
+        api_url = 'http://x{0}x.api.channel.livestream.com/2.0/clipdetails?extendedInfo=true&id={1}'.format(user, video_id)
+
+        api_response = self._download_webpage(api_url, video_id)
+        info = xml.etree.ElementTree.fromstring(api_response.encode('utf-8'))
+        item = info.find('channel').find('item')
+        ns = {'media': 'http://search.yahoo.com/mrss'}
+        thumbnail_url = item.find(xpath_with_ns('media:thumbnail', ns)).attrib['url']
+        # Remove the extension and number from the path (like 1.jpg)
+        path = self._search_regex(r'(user-files/.+)_.*?\.jpg$', thumbnail_url, u'path')
+
+        return {
+            'id': video_id,
+            'title': item.find('title').text,
+            'url': 'rtmp://extondemand.livestream.com/ondemand',
+            'play_path': 'mp4:trans/dv15/mogulus-{0}.mp4'.format(path),
+            'ext': 'flv',
+            'thumbnail': thumbnail_url,
+        }

+ 1 - 1
youtube_dl/extractor/soundcloud.py

@@ -87,7 +87,7 @@ class SoundcloudIE(InfoExtractor):
             'uploader': info['user']['username'],
             'uploader': info['user']['username'],
             'upload_date': unified_strdate(info['created_at']),
             'upload_date': unified_strdate(info['created_at']),
             'title':    info['title'],
             'title':    info['title'],
-            'ext':      u'mp3',
+            'ext':      info.get('original_format', u'mp3'),
             'description': info['description'],
             'description': info['description'],
             'thumbnail': thumbnail,
             'thumbnail': thumbnail,
         }
         }

+ 2 - 2
youtube_dl/extractor/youtube.py

@@ -1100,7 +1100,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor, SubtitlesInfoExtractor):
             params = compat_urllib_parse.urlencode({
             params = compat_urllib_parse.urlencode({
                 'lang': lang,
                 'lang': lang,
                 'v': video_id,
                 'v': video_id,
-                'fmt': self._downloader.params.get('subtitlesformat'),
+                'fmt': self._downloader.params.get('subtitlesformat', 'srt'),
                 'name': l[0].encode('utf-8'),
                 'name': l[0].encode('utf-8'),
             })
             })
             url = u'http://www.youtube.com/api/timedtext?' + params
             url = u'http://www.youtube.com/api/timedtext?' + params
@@ -1113,7 +1113,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor, SubtitlesInfoExtractor):
     def _get_available_automatic_caption(self, video_id, webpage):
     def _get_available_automatic_caption(self, video_id, webpage):
         """We need the webpage for getting the captions url, pass it as an
         """We need the webpage for getting the captions url, pass it as an
            argument to speed up the process."""
            argument to speed up the process."""
-        sub_format = self._downloader.params.get('subtitlesformat')
+        sub_format = self._downloader.params.get('subtitlesformat', 'srt')
         self.to_screen(u'%s: Looking for automatic captions' % video_id)
         self.to_screen(u'%s: Looking for automatic captions' % video_id)
         mobj = re.search(r';ytplayer.config = ({.*?});', webpage)
         mobj = re.search(r';ytplayer.config = ({.*?});', webpage)
         err_msg = u'Couldn\'t find automatic captions for %s' % video_id
         err_msg = u'Couldn\'t find automatic captions for %s' % video_id