| 
									
										
										
										
											2014-10-24 09:49:01 +05:30
										 |  |  | # coding: utf-8 | 
					
						
							|  |  |  | from __future__ import unicode_literals | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-06 18:42:57 +00:00
										 |  |  | import re | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-24 09:49:01 +05:30
										 |  |  | from .common import InfoExtractor | 
					
						
							| 
									
										
										
										
											2016-12-10 16:34:01 +01:00
										 |  |  | from ..compat import compat_HTTPError | 
					
						
							| 
									
										
										
										
											2014-10-24 09:49:01 +05:30
										 |  |  | from ..utils import ( | 
					
						
							|  |  |  |     float_or_none, | 
					
						
							| 
									
										
										
										
											2016-01-04 05:04:48 +06:00
										 |  |  |     parse_iso8601, | 
					
						
							| 
									
										
										
										
											2015-12-30 21:50:26 +00:00
										 |  |  |     unescapeHTML, | 
					
						
							| 
									
										
										
										
											2016-12-10 16:34:01 +01:00
										 |  |  |     ExtractorError, | 
					
						
							| 
									
										
										
										
											2014-10-24 09:49:01 +05:30
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-10 16:34:01 +01:00
										 |  |  | class RteBaseIE(InfoExtractor): | 
					
						
							| 
									
										
										
										
											2015-12-30 21:50:26 +00:00
										 |  |  |     def _real_extract(self, url): | 
					
						
							|  |  |  |         item_id = self._match_id(url) | 
					
						
							| 
									
										
										
										
											2016-01-04 05:04:48 +06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-10 16:34:01 +01:00
										 |  |  |         try: | 
					
						
							|  |  |  |             json_string = self._download_json( | 
					
						
							|  |  |  |                 'http://www.rte.ie/rteavgen/getplaylist/?type=web&format=json&id=' + item_id, | 
					
						
							|  |  |  |                 item_id) | 
					
						
							|  |  |  |         except ExtractorError as ee: | 
					
						
							|  |  |  |             if isinstance(ee.cause, compat_HTTPError) and ee.cause.code == 404: | 
					
						
							|  |  |  |                 error_info = self._parse_json(ee.cause.read().decode(), item_id, fatal=False) | 
					
						
							|  |  |  |                 if error_info: | 
					
						
							|  |  |  |                     raise ExtractorError( | 
					
						
							|  |  |  |                         '%s said: %s' % (self.IE_NAME, error_info['message']), | 
					
						
							|  |  |  |                         expected=True) | 
					
						
							|  |  |  |             raise | 
					
						
							| 
									
										
										
										
											2015-12-30 21:50:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # NB the string values in the JSON are stored using XML escaping(!) | 
					
						
							|  |  |  |         show = json_string['shows'][0] | 
					
						
							|  |  |  |         title = unescapeHTML(show['title']) | 
					
						
							|  |  |  |         description = unescapeHTML(show.get('description')) | 
					
						
							|  |  |  |         thumbnail = show.get('thumbnail') | 
					
						
							|  |  |  |         duration = float_or_none(show.get('duration'), 1000) | 
					
						
							| 
									
										
										
										
											2016-01-04 05:04:48 +06:00
										 |  |  |         timestamp = parse_iso8601(show.get('published')) | 
					
						
							| 
									
										
										
										
											2015-12-30 21:50:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         mg = show['media:group'][0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         formats = [] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-06 18:42:57 +00:00
										 |  |  |         if mg.get('url'): | 
					
						
							|  |  |  |             m = re.match(r'(?P<url>rtmpe?://[^/]+)/(?P<app>.+)/(?P<playpath>mp4:.*)', mg['url']) | 
					
						
							|  |  |  |             if m: | 
					
						
							|  |  |  |                 m = m.groupdict() | 
					
						
							|  |  |  |                 formats.append({ | 
					
						
							|  |  |  |                     'url': m['url'] + '/' + m['app'], | 
					
						
							|  |  |  |                     'app': m['app'], | 
					
						
							|  |  |  |                     'play_path': m['playpath'], | 
					
						
							|  |  |  |                     'player_url': url, | 
					
						
							|  |  |  |                     'ext': 'flv', | 
					
						
							|  |  |  |                     'format_id': 'rtmp', | 
					
						
							|  |  |  |                 }) | 
					
						
							| 
									
										
										
										
											2015-12-30 21:50:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if mg.get('hls_server') and mg.get('hls_url'): | 
					
						
							| 
									
										
										
										
											2016-01-04 05:01:32 +06:00
										 |  |  |             formats.extend(self._extract_m3u8_formats( | 
					
						
							|  |  |  |                 mg['hls_server'] + mg['hls_url'], item_id, 'mp4', | 
					
						
							|  |  |  |                 entry_protocol='m3u8_native', m3u8_id='hls', fatal=False)) | 
					
						
							| 
									
										
										
										
											2015-12-30 21:50:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if mg.get('hds_server') and mg.get('hds_url'): | 
					
						
							| 
									
										
										
										
											2016-01-04 05:01:32 +06:00
										 |  |  |             formats.extend(self._extract_f4m_formats( | 
					
						
							|  |  |  |                 mg['hds_server'] + mg['hds_url'], item_id, | 
					
						
							|  |  |  |                 f4m_id='hds', fatal=False)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self._sort_formats(formats) | 
					
						
							| 
									
										
										
										
											2015-12-30 21:50:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return { | 
					
						
							|  |  |  |             'id': item_id, | 
					
						
							|  |  |  |             'title': title, | 
					
						
							|  |  |  |             'description': description, | 
					
						
							|  |  |  |             'thumbnail': thumbnail, | 
					
						
							| 
									
										
										
										
											2016-01-04 05:04:48 +06:00
										 |  |  |             'timestamp': timestamp, | 
					
						
							| 
									
										
										
										
											2015-12-30 21:50:26 +00:00
										 |  |  |             'duration': duration, | 
					
						
							| 
									
										
										
										
											2016-01-04 05:04:48 +06:00
										 |  |  |             'formats': formats, | 
					
						
							| 
									
										
										
										
											2015-12-30 21:50:26 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2016-12-10 16:34:01 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class RteIE(RteBaseIE): | 
					
						
							|  |  |  |     IE_NAME = 'rte' | 
					
						
							|  |  |  |     IE_DESC = 'Raidió Teilifís Éireann TV' | 
					
						
							|  |  |  |     _VALID_URL = r'https?://(?:www\.)?rte\.ie/player/[^/]{2,3}/show/[^/]+/(?P<id>[0-9]+)' | 
					
						
							|  |  |  |     _TEST = { | 
					
						
							|  |  |  |         'url': 'http://www.rte.ie/player/ie/show/iwitness-862/10478715/', | 
					
						
							|  |  |  |         'md5': '4a76eb3396d98f697e6e8110563d2604', | 
					
						
							|  |  |  |         'info_dict': { | 
					
						
							|  |  |  |             'id': '10478715', | 
					
						
							|  |  |  |             'ext': 'mp4', | 
					
						
							|  |  |  |             'title': 'iWitness', | 
					
						
							| 
									
										
										
										
											2017-01-02 20:08:07 +08:00
										 |  |  |             'thumbnail': r're:^https?://.*\.jpg$', | 
					
						
							| 
									
										
										
										
											2016-12-10 16:34:01 +01:00
										 |  |  |             'description': 'The spirit of Ireland, one voice and one minute at a time.', | 
					
						
							|  |  |  |             'duration': 60.046, | 
					
						
							|  |  |  |             'upload_date': '20151012', | 
					
						
							|  |  |  |             'timestamp': 1444694160, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class RteRadioIE(RteBaseIE): | 
					
						
							|  |  |  |     IE_NAME = 'rte:radio' | 
					
						
							|  |  |  |     IE_DESC = 'Raidió Teilifís Éireann radio' | 
					
						
							|  |  |  |     # Radioplayer URLs have two distinct specifier formats, | 
					
						
							|  |  |  |     # the old format #!rii=<channel_id>:<id>:<playable_item_id>:<date>: | 
					
						
							|  |  |  |     # the new format #!rii=b<channel_id>_<id>_<playable_item_id>_<date>_ | 
					
						
							|  |  |  |     # where the IDs are int/empty, the date is DD-MM-YYYY, and the specifier may be truncated. | 
					
						
							|  |  |  |     # An <id> uniquely defines an individual recording, and is the only part we require. | 
					
						
							|  |  |  |     _VALID_URL = r'https?://(?:www\.)?rte\.ie/radio/utils/radioplayer/rteradioweb\.html#!rii=(?:b?[0-9]*)(?:%3A|:|%5F|_)(?P<id>[0-9]+)' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     _TESTS = [{ | 
					
						
							|  |  |  |         # Old-style player URL; HLS and RTMPE formats | 
					
						
							|  |  |  |         'url': 'http://www.rte.ie/radio/utils/radioplayer/rteradioweb.html#!rii=16:10507902:2414:27-12-2015:', | 
					
						
							|  |  |  |         'md5': 'c79ccb2c195998440065456b69760411', | 
					
						
							|  |  |  |         'info_dict': { | 
					
						
							|  |  |  |             'id': '10507902', | 
					
						
							|  |  |  |             'ext': 'mp4', | 
					
						
							|  |  |  |             'title': 'Gloria', | 
					
						
							| 
									
										
										
										
											2017-01-02 20:08:07 +08:00
										 |  |  |             'thumbnail': r're:^https?://.*\.jpg$', | 
					
						
							| 
									
										
										
										
											2016-12-10 16:34:01 +01:00
										 |  |  |             'description': 'md5:9ce124a7fb41559ec68f06387cabddf0', | 
					
						
							|  |  |  |             'timestamp': 1451203200, | 
					
						
							|  |  |  |             'upload_date': '20151227', | 
					
						
							|  |  |  |             'duration': 7230.0, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     }, { | 
					
						
							|  |  |  |         # New-style player URL; RTMPE formats only | 
					
						
							|  |  |  |         'url': 'http://rte.ie/radio/utils/radioplayer/rteradioweb.html#!rii=b16_3250678_8861_06-04-2012_', | 
					
						
							|  |  |  |         'info_dict': { | 
					
						
							|  |  |  |             'id': '3250678', | 
					
						
							|  |  |  |             'ext': 'flv', | 
					
						
							|  |  |  |             'title': 'The Lyric Concert with Paul Herriott', | 
					
						
							| 
									
										
										
										
											2017-01-02 20:08:07 +08:00
										 |  |  |             'thumbnail': r're:^https?://.*\.jpg$', | 
					
						
							| 
									
										
										
										
											2016-12-10 16:34:01 +01:00
										 |  |  |             'description': '', | 
					
						
							|  |  |  |             'timestamp': 1333742400, | 
					
						
							|  |  |  |             'upload_date': '20120406', | 
					
						
							|  |  |  |             'duration': 7199.016, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         'params': { | 
					
						
							|  |  |  |             # rtmp download | 
					
						
							|  |  |  |             'skip_download': True, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     }] |