]>
Commit | Line | Data |
---|---|---|
fecb20a5 | 1 | import re |
2 | ||
fecb20a5 | 3 | from .common import InfoExtractor |
4 | from ..utils import ( | |
5 | unified_timestamp, | |
6 | extract_attributes, | |
7 | ) | |
8 | ||
9 | ||
10 | class N1InfoAssetIE(InfoExtractor): | |
11 | _VALID_URL = r'https?://best-vod\.umn\.cdn\.united\.cloud/stream\?asset=(?P<id>[^&]+)' | |
12 | _TESTS = [{ | |
13 | 'url': 'https://best-vod.umn.cdn.united.cloud/stream?asset=ljsottomazilirija3060921-n1info-si-worldwide&stream=hp1400&t=0&player=m3u8v&sp=n1info&u=n1info&p=n1Sh4redSecre7iNf0', | |
14 | 'md5': '28b08b32aeaff2b8562736ccd5a66fe7', | |
15 | 'info_dict': { | |
16 | 'id': 'ljsottomazilirija3060921-n1info-si-worldwide', | |
17 | 'ext': 'mp4', | |
18 | 'title': 'ljsottomazilirija3060921-n1info-si-worldwide', | |
19 | } | |
20 | }] | |
21 | ||
22 | def _real_extract(self, url): | |
23 | video_id = self._match_id(url) | |
24 | formats = self._extract_m3u8_formats( | |
25 | url, video_id, 'mp4', entry_protocol='m3u8_native', m3u8_id='hls', fatal=False) | |
26 | ||
27 | self._sort_formats(formats) | |
28 | ||
29 | return { | |
30 | 'id': video_id, | |
31 | 'title': video_id, | |
32 | 'formats': formats, | |
33 | } | |
34 | ||
35 | ||
36 | class N1InfoIIE(InfoExtractor): | |
37 | IE_NAME = 'N1Info:article' | |
0f651893 | 38 | _VALID_URL = r'https?://(?:(?:(?:ba|rs|hr)\.)?n1info\.(?:com|si)|nova\.rs)/(?:[^/]+/){1,2}(?P<id>[^/]+)' |
fecb20a5 | 39 | _TESTS = [{ |
40 | # Youtube embedded | |
41 | 'url': 'https://rs.n1info.com/sport-klub/tenis/kako-je-djokovic-propustio-istorijsku-priliku-video/', | |
42 | 'md5': '01ddb6646d0fd9c4c7d990aa77fe1c5a', | |
43 | 'info_dict': { | |
44 | 'id': 'L5Hd4hQVUpk', | |
45 | 'ext': 'mp4', | |
46 | 'upload_date': '20210913', | |
47 | 'title': 'Ozmo i USO21, ep. 13: Novak Đoković – Danil Medvedev | Ključevi Poraza, Budućnost | SPORT KLUB TENIS', | |
48 | 'description': 'md5:467f330af1effedd2e290f10dc31bb8e', | |
49 | 'uploader': 'Sport Klub', | |
50 | 'uploader_id': 'sportklub', | |
51 | } | |
52 | }, { | |
53 | 'url': 'https://rs.n1info.com/vesti/djilas-los-plan-za-metro-nece-resiti-nijedan-saobracajni-problem/', | |
54 | 'info_dict': { | |
55 | 'id': 'bgmetrosot2409zta20210924174316682-n1info-rs-worldwide', | |
56 | 'ext': 'mp4', | |
57 | 'title': 'Đilas: Predlog izgradnje metroa besmislen; SNS odbacuje navode', | |
58 | 'upload_date': '20210924', | |
59 | 'timestamp': 1632481347, | |
60 | }, | |
61 | 'params': { | |
62 | 'skip_download': True, | |
63 | }, | |
64 | }, { | |
65 | 'url': 'https://n1info.si/novice/slovenija/zadnji-dnevi-na-kopaliscu-ilirija-ilirija-ni-umrla-ubili-so-jo/', | |
66 | 'info_dict': { | |
67 | 'id': 'ljsottomazilirija3060921-n1info-si-worldwide', | |
68 | 'ext': 'mp4', | |
69 | 'title': 'Zadnji dnevi na kopališču Ilirija: “Ilirija ni umrla, ubili so jo”', | |
70 | 'timestamp': 1632567630, | |
71 | 'upload_date': '20210925', | |
72 | }, | |
73 | 'params': { | |
74 | 'skip_download': True, | |
75 | }, | |
76 | }, { | |
77 | # Reddit embedded | |
78 | 'url': 'https://ba.n1info.com/lifestyle/vucic-bolji-od-tita-ako-izgubi-ja-cu-da-crknem-jugoslavija-je-gotova/', | |
79 | 'info_dict': { | |
80 | 'id': '2wmfee9eycp71', | |
81 | 'ext': 'mp4', | |
82 | 'title': '"Ako Vučić izgubi izbore, ja ću da crknem, Jugoslavija je gotova"', | |
83 | 'upload_date': '20210924', | |
84 | 'timestamp': 1632448649.0, | |
85 | 'uploader': 'YouLotWhatDontStop', | |
86 | }, | |
87 | 'params': { | |
fecb20a5 | 88 | 'skip_download': True, |
89 | }, | |
0f651893 | 90 | }, { |
91 | 'url': 'https://nova.rs/vesti/politika/zaklina-tatalovic-ani-brnabic-pricate-lazi-video/', | |
92 | 'info_dict': { | |
93 | 'id': 'tnjganabrnabicizaklinatatalovic100danavladegp-novas-worldwide', | |
94 | 'ext': 'mp4', | |
95 | 'title': 'Žaklina Tatalović Ani Brnabić: Pričate laži (VIDEO)', | |
96 | 'upload_date': '20211102', | |
97 | 'timestamp': 1635861677, | |
98 | }, | |
fecb20a5 | 99 | }, { |
100 | 'url': 'https://hr.n1info.com/vijesti/pravobraniteljica-o-ubojstvu-u-zagrebu-radi-se-o-doista-nezapamcenoj-situaciji/', | |
101 | 'only_matching': True, | |
102 | }] | |
103 | ||
104 | def _real_extract(self, url): | |
105 | video_id = self._match_id(url) | |
106 | webpage = self._download_webpage(url, video_id) | |
107 | ||
108 | title = self._html_search_regex(r'<h1[^>]+>(.+?)</h1>', webpage, 'title') | |
109 | timestamp = unified_timestamp(self._html_search_meta('article:published_time', webpage)) | |
110 | ||
111 | videos = re.findall(r'(?m)(<video[^>]+>)', webpage) | |
112 | entries = [] | |
113 | for video in videos: | |
114 | video_data = extract_attributes(video) | |
115 | entries.append({ | |
116 | '_type': 'url_transparent', | |
117 | 'url': video_data.get('data-url'), | |
118 | 'id': video_data.get('id'), | |
119 | 'title': title, | |
120 | 'thumbnail': video_data.get('data-thumbnail'), | |
121 | 'timestamp': timestamp, | |
0f651893 | 122 | 'ie_key': 'N1InfoAsset'}) |
fecb20a5 | 123 | |
124 | embedded_videos = re.findall(r'(<iframe[^>]+>)', webpage) | |
125 | for embedded_video in embedded_videos: | |
126 | video_data = extract_attributes(embedded_video) | |
0f651893 | 127 | url = video_data.get('src') or '' |
fecb20a5 | 128 | if url.startswith('https://www.youtube.com'): |
0f651893 | 129 | entries.append(self.url_result(url, ie='Youtube')) |
fecb20a5 | 130 | elif url.startswith('https://www.redditmedia.com'): |
0f651893 | 131 | entries.append(self.url_result(url, ie='RedditR')) |
fecb20a5 | 132 | |
133 | return { | |
134 | '_type': 'playlist', | |
135 | 'id': video_id, | |
136 | 'title': title, | |
137 | 'timestamp': timestamp, | |
138 | 'entries': entries, | |
139 | } |