]>
Commit | Line | Data |
---|---|---|
91a6adde JMF |
1 | # encoding: utf-8 |
2 | from __future__ import unicode_literals | |
3 | ||
91a6adde | 4 | import base64 |
2b9faf55 PH |
5 | import re |
6 | import time | |
91a6adde JMF |
7 | |
8 | from .common import InfoExtractor | |
9 | from ..utils import ( | |
10 | struct_unpack, | |
2b9faf55 | 11 | remove_end, |
91a6adde JMF |
12 | ) |
13 | ||
14 | ||
2b9faf55 PH |
15 | def _decrypt_url(png): |
16 | encrypted_data = base64.b64decode(png) | |
17 | text_index = encrypted_data.find(b'tEXt') | |
18 | text_chunk = encrypted_data[text_index - 4:] | |
19 | length = struct_unpack('!I', text_chunk[:4])[0] | |
20 | # Use bytearray to get integers when iterating in both python 2.x and 3.x | |
21 | data = bytearray(text_chunk[8:8 + length]) | |
22 | data = [chr(b) for b in data if b != 0] | |
23 | hash_index = data.index('#') | |
24 | alphabet_data = data[:hash_index] | |
25 | url_data = data[hash_index + 1:] | |
26 | ||
27 | alphabet = [] | |
28 | e = 0 | |
29 | d = 0 | |
30 | for l in alphabet_data: | |
31 | if d == 0: | |
32 | alphabet.append(l) | |
33 | d = e = (e + 1) % 4 | |
34 | else: | |
35 | d -= 1 | |
36 | url = '' | |
37 | f = 0 | |
38 | e = 3 | |
39 | b = 1 | |
40 | for letter in url_data: | |
41 | if f == 0: | |
42 | l = int(letter) * 10 | |
43 | f = 1 | |
44 | else: | |
45 | if e == 0: | |
46 | l += int(letter) | |
47 | url += alphabet[l] | |
48 | e = (b + 3) % 4 | |
49 | f = 0 | |
50 | b += 1 | |
51 | else: | |
52 | e -= 1 | |
53 | ||
54 | return url | |
55 | ||
56 | ||
91a6adde JMF |
57 | class RTVEALaCartaIE(InfoExtractor): |
58 | IE_NAME = 'rtve.es:alacarta' | |
59 | IE_DESC = 'RTVE a la carta' | |
60 | _VALID_URL = r'http://www\.rtve\.es/alacarta/videos/[^/]+/[^/]+/(?P<id>\d+)' | |
61 | ||
2b9faf55 | 62 | _TESTS = [{ |
91a6adde | 63 | 'url': 'http://www.rtve.es/alacarta/videos/balonmano/o-swiss-cup-masculina-final-espana-suecia/2491869/', |
9aeaf730 | 64 | 'md5': '1d49b7e1ca7a7502c56a4bf1b60f1b43', |
91a6adde JMF |
65 | 'info_dict': { |
66 | 'id': '2491869', | |
67 | 'ext': 'mp4', | |
68 | 'title': 'Balonmano - Swiss Cup masculina. Final: España-Suecia', | |
69 | }, | |
2b9faf55 PH |
70 | }, { |
71 | 'note': 'Live stream', | |
72 | 'url': 'http://www.rtve.es/alacarta/videos/television/24h-live/1694255/', | |
73 | 'info_dict': { | |
74 | 'id': '1694255', | |
75 | 'ext': 'flv', | |
76 | 'title': 'TODO', | |
77 | } | |
78 | }] | |
91a6adde JMF |
79 | |
80 | def _real_extract(self, url): | |
81 | mobj = re.match(self._VALID_URL, url) | |
82 | video_id = mobj.group('id') | |
83 | info = self._download_json( | |
84 | 'http://www.rtve.es/api/videos/%s/config/alacarta_videos.json' % video_id, | |
85 | video_id)['page']['items'][0] | |
86 | png_url = 'http://www.rtve.es/ztnr/movil/thumbnail/default/videos/%s.png' % video_id | |
87 | png = self._download_webpage(png_url, video_id, 'Downloading url information') | |
2b9faf55 | 88 | video_url = _decrypt_url(png) |
91a6adde JMF |
89 | |
90 | return { | |
91 | 'id': video_id, | |
92 | 'title': info['title'], | |
93 | 'url': video_url, | |
2b9faf55 PH |
94 | 'thumbnail': info.get('image'), |
95 | 'page_url': url, | |
96 | } | |
97 | ||
98 | ||
99 | class RTVELiveIE(InfoExtractor): | |
100 | IE_NAME = 'rtve.es:live' | |
101 | IE_DESC = 'RTVE.es live streams' | |
9d048a17 | 102 | _VALID_URL = r'http://www\.rtve\.es/(?:deportes/directo|noticias|television)/(?P<id>[a-zA-Z0-9-]+)' |
2b9faf55 PH |
103 | |
104 | _TESTS = [{ | |
105 | 'url': 'http://www.rtve.es/noticias/directo-la-1/', | |
106 | 'info_dict': { | |
107 | 'id': 'directo-la-1', | |
108 | 'ext': 'flv', | |
109 | 'title': 're:^La 1 de TVE [0-9]{4}-[0-9]{2}-[0-9]{2}Z[0-9]{6}$', | |
110 | }, | |
111 | 'params': { | |
112 | 'skip_download': 'live stream', | |
113 | } | |
114 | }] | |
115 | ||
116 | def _real_extract(self, url): | |
117 | mobj = re.match(self._VALID_URL, url) | |
118 | start_time = time.gmtime() | |
119 | video_id = mobj.group('id') | |
120 | ||
121 | webpage = self._download_webpage(url, video_id) | |
122 | player_url = self._search_regex( | |
123 | r'<param name="movie" value="([^"]+)"/>', webpage, 'player URL') | |
124 | title = remove_end(self._og_search_title(webpage), ' en directo') | |
125 | title += ' ' + time.strftime('%Y-%m-%dZ%H%M%S', start_time) | |
126 | ||
127 | vidplayer_id = self._search_regex( | |
128 | r' id="vidplayer([0-9]+)"', webpage, 'internal video ID') | |
129 | png_url = 'http://www.rtve.es/ztnr/movil/thumbnail/default/videos/%s.png' % vidplayer_id | |
130 | png = self._download_webpage(png_url, video_id, 'Downloading url information') | |
131 | video_url = _decrypt_url(png) | |
132 | ||
2b9faf55 PH |
133 | return { |
134 | 'id': video_id, | |
135 | 'ext': 'flv', | |
136 | 'title': title, | |
137 | 'url': video_url, | |
138 | 'app': 'rtve-live-live?ovpfv=2.1.2', | |
139 | 'player_url': player_url, | |
140 | 'rtmp_live': True, | |
91a6adde | 141 | } |