mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-31 14:45:14 +00:00 
			
		
		
		
	[bbc.co.uk] Add support for bbc.co.uk radio programmes (Closes #2184)
This commit is contained in:
		| @@ -87,8 +87,10 @@ class RtmpFD(FileDownloader): | |||||||
|         url = info_dict['url'] |         url = info_dict['url'] | ||||||
|         player_url = info_dict.get('player_url', None) |         player_url = info_dict.get('player_url', None) | ||||||
|         page_url = info_dict.get('page_url', None) |         page_url = info_dict.get('page_url', None) | ||||||
|  |         app = info_dict.get('app', None) | ||||||
|         play_path = info_dict.get('play_path', None) |         play_path = info_dict.get('play_path', None) | ||||||
|         tc_url = info_dict.get('tc_url', None) |         tc_url = info_dict.get('tc_url', None) | ||||||
|  |         flash_version = info_dict.get('flash_version', None) | ||||||
|         live = info_dict.get('rtmp_live', False) |         live = info_dict.get('rtmp_live', False) | ||||||
|         conn = info_dict.get('rtmp_conn', None) |         conn = info_dict.get('rtmp_conn', None) | ||||||
|  |  | ||||||
| @@ -111,12 +113,16 @@ class RtmpFD(FileDownloader): | |||||||
|             basic_args += ['--swfVfy', player_url] |             basic_args += ['--swfVfy', player_url] | ||||||
|         if page_url is not None: |         if page_url is not None: | ||||||
|             basic_args += ['--pageUrl', page_url] |             basic_args += ['--pageUrl', page_url] | ||||||
|  |         if app is not None: | ||||||
|  |             basic_args += ['--app', app] | ||||||
|         if play_path is not None: |         if play_path is not None: | ||||||
|             basic_args += ['--playpath', play_path] |             basic_args += ['--playpath', play_path] | ||||||
|         if tc_url is not None: |         if tc_url is not None: | ||||||
|             basic_args += ['--tcUrl', url] |             basic_args += ['--tcUrl', url] | ||||||
|         if test: |         if test: | ||||||
|             basic_args += ['--stop', '1'] |             basic_args += ['--stop', '1'] | ||||||
|  |         if flash_version is not None: | ||||||
|  |             basic_args += ['--flashVer', flash_version] | ||||||
|         if live: |         if live: | ||||||
|             basic_args += ['--live'] |             basic_args += ['--live'] | ||||||
|         if conn: |         if conn: | ||||||
|   | |||||||
| @@ -15,6 +15,7 @@ from .arte import ( | |||||||
| from .auengine import AUEngineIE | from .auengine import AUEngineIE | ||||||
| from .bambuser import BambuserIE, BambuserChannelIE | from .bambuser import BambuserIE, BambuserChannelIE | ||||||
| from .bandcamp import BandcampIE, BandcampAlbumIE | from .bandcamp import BandcampIE, BandcampAlbumIE | ||||||
|  | from .bbccouk import BBCCoUkIE | ||||||
| from .blinkx import BlinkxIE | from .blinkx import BlinkxIE | ||||||
| from .bliptv import BlipTVIE, BlipTVUserIE | from .bliptv import BlipTVIE, BlipTVUserIE | ||||||
| from .bloomberg import BloombergIE | from .bloomberg import BloombergIE | ||||||
|   | |||||||
							
								
								
									
										116
									
								
								youtube_dl/extractor/bbccouk.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								youtube_dl/extractor/bbccouk.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,116 @@ | |||||||
|  | from __future__ import unicode_literals | ||||||
|  |  | ||||||
|  | import re | ||||||
|  |  | ||||||
|  | from .common import InfoExtractor | ||||||
|  | from ..utils import ExtractorError | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class BBCCoUkIE(InfoExtractor): | ||||||
|  |     IE_NAME = 'bbc.co.uk' | ||||||
|  |     IE_DESC = 'BBC - iPlayer Radio' | ||||||
|  |     _VALID_URL = r'https?://(?:www\.)?bbc\.co\.uk/programmes/(?P<id>[\da-z]{8})' | ||||||
|  |  | ||||||
|  |     _TEST = { | ||||||
|  |         'url': 'http://www.bbc.co.uk/programmes/p01q7wz1', | ||||||
|  |         'info_dict': { | ||||||
|  |             'id': 'p01q7wz4', | ||||||
|  |             'ext': 'flv', | ||||||
|  |             'title': 'Friction: Blu Mar Ten guest mix: Blu Mar Ten - Guest Mix', | ||||||
|  |             'description': 'Blu Mar Ten deliver a Guest Mix for Friction.', | ||||||
|  |             'duration': 1936, | ||||||
|  |         }, | ||||||
|  |         'params': { | ||||||
|  |             # rtmp download | ||||||
|  |             'skip_download': True, | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     def _real_extract(self, url): | ||||||
|  |         mobj = re.match(self._VALID_URL, url) | ||||||
|  |         group_id = mobj.group('id') | ||||||
|  |  | ||||||
|  |         playlist = self._download_xml('http://www.bbc.co.uk/iplayer/playlist/%s' % group_id, group_id, | ||||||
|  |             'Downloading playlist XML') | ||||||
|  |  | ||||||
|  |         item = playlist.find('./{http://bbc.co.uk/2008/emp/playlist}item') | ||||||
|  |         if item is None: | ||||||
|  |             no_items = playlist.find('./{http://bbc.co.uk/2008/emp/playlist}noItems') | ||||||
|  |             if no_items is not None: | ||||||
|  |                 reason = no_items.get('reason') | ||||||
|  |                 if reason == 'preAvailability': | ||||||
|  |                     msg = 'Episode %s is not yet available' % group_id | ||||||
|  |                 elif reason == 'postAvailability': | ||||||
|  |                     msg = 'Episode %s is no longer available' % group_id | ||||||
|  |                 else: | ||||||
|  |                     msg = 'Episode %s is not available: %s' % (group_id, reason) | ||||||
|  |                 raise ExtractorError(msg, expected=True) | ||||||
|  |             raise ExtractorError('Failed to extract media for episode %s' % group_id, expected=True) | ||||||
|  |  | ||||||
|  |         title = playlist.find('./{http://bbc.co.uk/2008/emp/playlist}title').text | ||||||
|  |         description = playlist.find('./{http://bbc.co.uk/2008/emp/playlist}summary').text | ||||||
|  |  | ||||||
|  |         radio_programme_id = item.get('identifier') | ||||||
|  |         duration = int(item.get('duration')) | ||||||
|  |  | ||||||
|  |         media_selection = self._download_xml( | ||||||
|  |             'http://open.live.bbc.co.uk/mediaselector/5/select/version/2.0/mediaset/pc/vpid/%s'  % radio_programme_id, | ||||||
|  |             radio_programme_id, 'Downloading media selection XML') | ||||||
|  |  | ||||||
|  |         formats = [] | ||||||
|  |         for media in media_selection.findall('./{http://bbc.co.uk/2008/mp/mediaselection}media'): | ||||||
|  |             bitrate = int(media.get('bitrate')) | ||||||
|  |             encoding = media.get('encoding') | ||||||
|  |             service = media.get('service') | ||||||
|  |             connection = media.find('./{http://bbc.co.uk/2008/mp/mediaselection}connection') | ||||||
|  |             protocol = connection.get('protocol') | ||||||
|  |             priority = connection.get('priority') | ||||||
|  |             supplier = connection.get('supplier') | ||||||
|  |             if protocol == 'http': | ||||||
|  |                 href = connection.get('href') | ||||||
|  |                 # ASX playlist | ||||||
|  |                 if supplier == 'asx': | ||||||
|  |                     asx = self._download_xml(href, radio_programme_id, 'Downloading %s ASX playlist' % service) | ||||||
|  |                     for i, ref in enumerate(asx.findall('./Entry/ref')): | ||||||
|  |                         formats.append({ | ||||||
|  |                             'url': ref.get('href'), | ||||||
|  |                             'format_id': '%s_ref%s' % (service, i), | ||||||
|  |                             'abr': bitrate, | ||||||
|  |                             'acodec': encoding, | ||||||
|  |                             'preference': priority, | ||||||
|  |                         }) | ||||||
|  |                     continue | ||||||
|  |                 # Direct link | ||||||
|  |                 formats.append({ | ||||||
|  |                     'url': href, | ||||||
|  |                     'format_id': service, | ||||||
|  |                     'abr': bitrate, | ||||||
|  |                     'acodec': encoding, | ||||||
|  |                     'preference': priority, | ||||||
|  |                 }) | ||||||
|  |             elif protocol == 'rtmp': | ||||||
|  |                 application = connection.get('application', 'ondemand') | ||||||
|  |                 auth_string = connection.get('authString') | ||||||
|  |                 identifier = connection.get('identifier') | ||||||
|  |                 server = connection.get('server') | ||||||
|  |                 formats.append({ | ||||||
|  |                     'url': '%s://%s/%s?%s' % (protocol, server, application, auth_string), | ||||||
|  |                     'play_path': identifier, | ||||||
|  |                     'app': '%s?%s' % (application, auth_string), | ||||||
|  |                     'rtmp_live': False, | ||||||
|  |                     'ext': 'flv', | ||||||
|  |                     'format_id': service, | ||||||
|  |                     'abr': bitrate, | ||||||
|  |                     'acodec': encoding, | ||||||
|  |                     'preference': priority, | ||||||
|  |                 }) | ||||||
|  |  | ||||||
|  |         self._sort_formats(formats) | ||||||
|  |  | ||||||
|  |         return { | ||||||
|  |             'id': radio_programme_id, | ||||||
|  |             'title': title, | ||||||
|  |             'description': description, | ||||||
|  |             'duration': duration, | ||||||
|  |             'formats': formats, | ||||||
|  |         } | ||||||
		Reference in New Issue
	
	Block a user
	 Sergey M.
					Sergey M.