From aea6e7fc3cc2500d7a2341e57b0983f7731a86cd Mon Sep 17 00:00:00 2001 From: Philipp Hagemeister Date: Thu, 3 Apr 2014 05:56:28 +0200 Subject: [PATCH] [cspan] Support multiple segments (Fixes #2674) --- test/test_playlists.py | 14 ++++++++++++++ youtube_dl/extractor/cspan.py | 30 +++++++++++++++++++++--------- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/test/test_playlists.py b/test/test_playlists.py index 4af38632e..5fb679aa1 100644 --- a/test/test_playlists.py +++ b/test/test_playlists.py @@ -42,6 +42,7 @@ from youtube_dl.extractor import ( ToypicsUserIE, XTubeUserIE, InstagramUserIE, + CSpanIE, ) @@ -314,6 +315,19 @@ class TestPlaylists(unittest.TestCase): } expect_info_dict(self, EXPECTED, test_video) + def test_CSpan_playlist(self): + dl = FakeYDL() + ie = CSpanIE(dl) + result = ie.extract( + 'http://www.c-span.org/video/?318608-1/gm-ignition-switch-recall') + self.assertIsPlaylist(result) + self.assertEqual(result['id'], '342759') + self.assertEqual( + result['title'], 'General Motors Ignition Switch Recall') + self.assertEqual(len(result['entries']), 9) + whole_duration = sum(e['duration'] for e in result['entries']) + self.assertEqual(whole_duration, 14855) + if __name__ == '__main__': unittest.main() diff --git a/youtube_dl/extractor/cspan.py b/youtube_dl/extractor/cspan.py index 2a8eda9ef..b6552c542 100644 --- a/youtube_dl/extractor/cspan.py +++ b/youtube_dl/extractor/cspan.py @@ -4,6 +4,7 @@ import re from .common import InfoExtractor from ..utils import ( + int_or_none, unescapeHTML, find_xpath_attr, ) @@ -54,18 +55,29 @@ class CSpanIE(InfoExtractor): info_url = 'http://c-spanvideo.org/videoLibrary/assets/player/ajax-player.php?os=android&html5=program&id=' + video_id data = self._download_json(info_url, video_id) - url = unescapeHTML(data['video']['files'][0]['path']['#text']) - - doc = self._download_xml('http://www.c-span.org/common/services/flashXml.php?programid=' + video_id, + doc = self._download_xml( + 'http://www.c-span.org/common/services/flashXml.php?programid=' + video_id, video_id) - def find_string(s): - return find_xpath_attr(doc, './/string', 'name', s).text + title = find_xpath_attr(doc, './/string', 'name', 'title').text + thumbnail = find_xpath_attr(doc, './/string', 'name', 'poster').text + + files = data['video']['files'] + + entries = [{ + 'id': '%s_%d' % (video_id, partnum + 1), + 'title': ( + title if len(files) == 1 else + '%s part %d' % (title, partnum + 1)), + 'url': unescapeHTML(f['path']['#text']), + 'description': description, + 'thumbnail': thumbnail, + 'duration': int_or_none(f.get('length', {}).get('#text')), + } for partnum, f in enumerate(files)] return { + '_type': 'playlist', + 'entries': entries, + 'title': title, 'id': video_id, - 'title': find_string('title'), - 'url': url, - 'description': description, - 'thumbnail': find_string('poster'), }