From 4bcc6c372fe23f0ae8351e272aef895949d51496 Mon Sep 17 00:00:00 2001 From: Ales Jirasek Date: Wed, 10 Oct 2018 23:47:21 +0200 Subject: [PATCH 1/8] [MallTV] Add new extractor --- youtube_dl/extractor/extractors.py | 3 +- youtube_dl/extractor/malltv.py | 67 ++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 youtube_dl/extractor/malltv.py diff --git a/youtube_dl/extractor/extractors.py b/youtube_dl/extractor/extractors.py index 464c8d690..268b2cbb1 100644 --- a/youtube_dl/extractor/extractors.py +++ b/youtube_dl/extractor/extractors.py @@ -595,6 +595,7 @@ from .mailru import ( MailRuMusicSearchIE, ) from .makertv import MakerTVIE +from .malltv import MallTVIE from .mangomolo import ( MangomoloVideoIE, MangomoloLiveIE, @@ -1367,7 +1368,7 @@ from .webofstories import ( WebOfStoriesPlaylistIE, ) from .weibo import ( - WeiboIE, + WeiboIE, WeiboMobileIE ) from .weiqitv import WeiqiTVIE diff --git a/youtube_dl/extractor/malltv.py b/youtube_dl/extractor/malltv.py new file mode 100644 index 000000000..a778eb10f --- /dev/null +++ b/youtube_dl/extractor/malltv.py @@ -0,0 +1,67 @@ +# coding: utf-8 +from __future__ import unicode_literals + +from .common import InfoExtractor + + +class MallTVIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?mall\.tv/(?:.+/)?(?P.+)' + _TESTS = [ + { + 'url': ('https://www.mall.tv/18-miliard-pro-neziskovky' + '-opravdu-jsou-sportovci-nebo-clovek-v-tisni-pijavice'), + 'md5': '5235290504d20a27a19dd3915b1167b4', + 'info_dict': { + 'id': ('18-miliard-pro-neziskovky-opravdu-jsou-sportovci-nebo-' + 'clovek-v-tisni-pijavice'), + 'ext': 'mp4', + 'title': ('18 miliard pro neziskovky. Opravdu jsou sportovci ' + 'nebo Člověk v tísni pijavice?'), + 'description': ('Pokud někdo hospodaří s penězmi daňových ' + 'poplatníků, pak logicky chceme vědět, jak s ' + 'nimi nakládá. Objem dotací pro neziskovky ' + 'roste, ale opravdu jsou tyto organizace ' + '„pijavice", jak o nich hovoří And') + } + }, + { + 'url': ('https://www.mall.tv/kdo-to-plati/18-miliard-pro-neziskovky' + '-opravdu-jsou-sportovci-nebo-clovek-v-tisni-pijavice'), + 'md5': '5235290504d20a27a19dd3915b1167b4', + 'info_dict': { + 'id': ('18-miliard-pro-neziskovky-opravdu-jsou-sportovci-nebo-' + 'clovek-v-tisni-pijavice'), + 'ext': 'mp4', + 'title': ('18 miliard pro neziskovky. Opravdu jsou sportovci ' + 'nebo Člověk v tísni pijavice?'), + 'description': ('Pokud někdo hospodaří s penězmi daňových ' + 'poplatníků, pak logicky chceme vědět, jak s ' + 'nimi nakládá. Objem dotací pro neziskovky ' + 'roste, ale opravdu jsou tyto organizace ' + '„pijavice", jak o nich hovoří And') + } + }, + ] + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + + self.report_extraction(video_id) + + format_url = self._html_search_regex( + r' Date: Thu, 11 Oct 2018 01:14:35 +0200 Subject: [PATCH 2/8] additional info and better regexes --- youtube_dl/extractor/malltv.py | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/youtube_dl/extractor/malltv.py b/youtube_dl/extractor/malltv.py index a778eb10f..0366d2e83 100644 --- a/youtube_dl/extractor/malltv.py +++ b/youtube_dl/extractor/malltv.py @@ -2,6 +2,7 @@ from __future__ import unicode_literals from .common import InfoExtractor +from ..utils import parse_duration class MallTVIE(InfoExtractor): @@ -22,7 +23,7 @@ class MallTVIE(InfoExtractor): 'nimi nakládá. Objem dotací pro neziskovky ' 'roste, ale opravdu jsou tyto organizace ' '„pijavice", jak o nich hovoří And') - } + }, }, { 'url': ('https://www.mall.tv/kdo-to-plati/18-miliard-pro-neziskovky' @@ -46,22 +47,29 @@ class MallTVIE(InfoExtractor): def _real_extract(self, url): video_id = self._match_id(url) webpage = self._download_webpage(url, video_id) - - self.report_extraction(video_id) + JSON_LD_RE = (r'(?is)]+type=([\"\'])?application/ld\+json>.*' + '(?P{.+}).*') + json_ld = self._search_regex(JSON_LD_RE, webpage, 'JSON_LD', + group='json_ld') + if not json_ld: + info = {} + else: + info = self._json_ld(json_ld, video_id) format_url = self._html_search_regex( - r' Date: Wed, 10 Oct 2018 23:47:21 +0200 Subject: [PATCH 3/8] [MallTV] Add new extractor, better regexe update generic JSON_LD_RE to find json_ld in attributes without quotes, closes #18058 --- youtube_dl/extractor/extractors.py | 3 +- youtube_dl/extractor/malltv.py | 71 ++++++++++++++++++++++++++++++ youtube_dl/utils.py | 2 +- 3 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 youtube_dl/extractor/malltv.py diff --git a/youtube_dl/extractor/extractors.py b/youtube_dl/extractor/extractors.py index 464c8d690..268b2cbb1 100644 --- a/youtube_dl/extractor/extractors.py +++ b/youtube_dl/extractor/extractors.py @@ -595,6 +595,7 @@ from .mailru import ( MailRuMusicSearchIE, ) from .makertv import MakerTVIE +from .malltv import MallTVIE from .mangomolo import ( MangomoloVideoIE, MangomoloLiveIE, @@ -1367,7 +1368,7 @@ from .webofstories import ( WebOfStoriesPlaylistIE, ) from .weibo import ( - WeiboIE, + WeiboIE, WeiboMobileIE ) from .weiqitv import WeiqiTVIE diff --git a/youtube_dl/extractor/malltv.py b/youtube_dl/extractor/malltv.py new file mode 100644 index 000000000..512d999c9 --- /dev/null +++ b/youtube_dl/extractor/malltv.py @@ -0,0 +1,71 @@ +# coding: utf-8 +from __future__ import unicode_literals + +from .common import InfoExtractor +from ..utils import parse_duration + + +class MallTVIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?mall\.tv/(?:.+/)?(?P.+)' + _TESTS = [ + { + 'url': ('https://www.mall.tv/18-miliard-pro-neziskovky' + '-opravdu-jsou-sportovci-nebo-clovek-v-tisni-pijavice'), + 'info_dict': { + 'id': ('18-miliard-pro-neziskovky-opravdu-jsou-sportovci-nebo-' + 'clovek-v-tisni-pijavice'), + 'ext': 'mp4', + 'title': ('18 miliard pro neziskovky. Opravdu jsou sportovci ' + 'nebo Člověk v tísni pijavice?'), + 'description': ('Pokud někdo hospodaří s penězmi daňových ' + 'poplatníků, pak logicky chceme vědět, jak s ' + 'nimi nakládá. Objem dotací pro neziskovky ' + 'roste, ale opravdu jsou tyto organizace ' + '„pijavice", jak o nich hovoří And') + }, + 'params': { + 'skip_download': True + } + }, + { + 'url': ('https://www.mall.tv/kdo-to-plati/18-miliard-pro-neziskovky' + '-opravdu-jsou-sportovci-nebo-clovek-v-tisni-pijavice'), + 'info_dict': { + 'id': ('18-miliard-pro-neziskovky-opravdu-jsou-sportovci-nebo-' + 'clovek-v-tisni-pijavice'), + 'ext': 'mp4', + 'title': ('18 miliard pro neziskovky. Opravdu jsou sportovci ' + 'nebo Člověk v tísni pijavice?'), + 'description': ('Pokud někdo hospodaří s penězmi daňových ' + 'poplatníků, pak logicky chceme vědět, jak s ' + 'nimi nakládá. Objem dotací pro neziskovky ' + 'roste, ale opravdu jsou tyto organizace ' + '„pijavice", jak o nich hovoří And') + }, + 'params': { + 'skip_download': True + } + }, + ] + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + info = self._search_json_ld(webpage, video_id, default={}) + + format_url = self._html_search_regex( + r'.+?index)\1?[^>]*?>', + webpage, 'm3u8 URL', group='src') + formats = self._extract_m3u8_formats(format_url+'.m3u8', + video_id, 'mp4') + self._sort_formats(formats) + title = info.get('title', self._og_search_title(webpage, fatal=False)) + thumbnail = info.get('thumbnailUrl', self._og_search_thumbnail(webpage)) + return { + 'id': video_id, + 'title': title, + 'thumbnail': thumbnail, + 'description': self._og_search_description(webpage), + 'duration': parse_duration(info.get('duration')), + 'formats': formats + } diff --git a/youtube_dl/utils.py b/youtube_dl/utils.py index e84d35d4d..4f21d8821 100644 --- a/youtube_dl/utils.py +++ b/youtube_dl/utils.py @@ -183,7 +183,7 @@ DATE_FORMATS_MONTH_FIRST.extend([ ]) PACKED_CODES_RE = r"}\('(.+)',(\d+),(\d+),'([^']+)'\.split\('\|'\)" -JSON_LD_RE = r'(?is)]+type=(["\'])application/ld\+json\1[^>]*>(?P.+?)' +JSON_LD_RE = r'(?is)]+type=(["\'])?application/ld\+json\1?[^>]*>(?P.+?)' def preferredencoding(): From 2493061dd836680359e5054a39f462a2bc0f0997 Mon Sep 17 00:00:00 2001 From: Ales Jirasek Date: Sun, 6 Jan 2019 18:06:12 +0100 Subject: [PATCH 4/8] fulfilling requested changes --- youtube_dl/extractor/malltv.py | 43 +++++++++++++++++----------------- youtube_dl/utils.py | 2 +- 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/youtube_dl/extractor/malltv.py b/youtube_dl/extractor/malltv.py index 31b555e4a..be8b7a762 100644 --- a/youtube_dl/extractor/malltv.py +++ b/youtube_dl/extractor/malltv.py @@ -1,6 +1,7 @@ # coding: utf-8 from __future__ import unicode_literals +import hashlib from .common import InfoExtractor from ..utils import parse_duration @@ -9,37 +10,33 @@ class MallTVIE(InfoExtractor): _VALID_URL = r'https?://(?:www\.)?mall\.tv/(?:.+/)?(?P.+)' _TESTS = [ { - 'url': ('https://www.mall.tv/18-miliard-pro-neziskovky-opravdu-jsou-sportovci-nebo-clovek-v-tisni-pijavice'), + 'url': 'https://www.mall.tv/18-miliard-pro-neziskovky-opravdu-jsou-sportovci-nebo-clovek-v-tisni-pijavice', + 'md5': '9ced0de056534410837077e23bfba796', 'info_dict': { - 'id': ('18-miliard-pro-neziskovky-opravdu-jsou-sportovci-nebo-clovek-v-tisni-pijavice'), + 'id': 'af7649e93dc6a2a04198e6c8143605a4', 'ext': 'mp4', - 'title': ('18 miliard pro neziskovky. Opravdu jsou sportovci nebo Člověk v tísni pijavice?'), + 'title': '18 miliard pro neziskovky. Opravdu jsou sportovci nebo Člověk v tísni pijavice?', 'description': ('Pokud někdo hospodaří s penězmi daňových ' 'poplatníků, pak logicky chceme vědět, jak s ' 'nimi nakládá. Objem dotací pro neziskovky ' 'roste, ale opravdu jsou tyto organizace ' '„pijavice", jak o nich hovoří And') - }, - 'params': { - 'skip_download': True - } + } }, { - 'url': ('https://www.mall.tv/kdo-to-plati/18-miliard-pro-neziskovky-opravdu-jsou-sportovci-nebo-clovek-v-tisni-pijavice'), + 'url': 'https://www.mall.tv/kdo-to-plati/18-miliard-pro-neziskovky-opravdu-jsou-sportovci-nebo-clovek-v-tisni-pijavice', + 'md5': '9ced0de056534410837077e23bfba796', 'info_dict': { - 'id': ('18-miliard-pro-neziskovky-opravdu-jsou-sportovci-nebo-clovek-v-tisni-pijavice'), + 'id': 'af7649e93dc6a2a04198e6c8143605a4', 'ext': 'mp4', - 'title': ('18 miliard pro neziskovky. Opravdu jsou sportovci nebo Člověk v tísni pijavice?'), + 'title': '18 miliard pro neziskovky. Opravdu jsou sportovci nebo Člověk v tísni pijavice?', 'description': ('Pokud někdo hospodaří s penězmi daňových ' 'poplatníků, pak logicky chceme vědět, jak s ' 'nimi nakládá. Objem dotací pro neziskovky ' 'roste, ale opravdu jsou tyto organizace ' '„pijavice", jak o nich hovoří And') - }, - 'params': { - 'skip_download': True - } - }, + } + } ] def _real_extract(self, url): @@ -53,13 +50,17 @@ class MallTVIE(InfoExtractor): formats = self._extract_m3u8_formats(format_url+'.m3u8', video_id, 'mp4') self._sort_formats(formats) - title = info.get('title', self._og_search_title(webpage, fatal=False)) thumbnail = info.get('thumbnailUrl', self._og_search_thumbnail(webpage)) - return { - 'id': video_id, - 'title': title, - 'thumbnail': thumbnail, + duration = parse_duration(info.get('duration')) + result = { + 'id': hashlib.md5(video_id).hexdigest().decode('utf8'), + 'title': info.get('name', self._og_search_title(webpage)), 'description': self._og_search_description(webpage), - 'duration': parse_duration(info.get('duration')), 'formats': formats } + if thumbnail: + result.update({'thumbnail': thumbnail}) + if duration: + result.update({'duration': duration}) + + return result diff --git a/youtube_dl/utils.py b/youtube_dl/utils.py index 4f21d8821..a82b7c826 100644 --- a/youtube_dl/utils.py +++ b/youtube_dl/utils.py @@ -183,7 +183,7 @@ DATE_FORMATS_MONTH_FIRST.extend([ ]) PACKED_CODES_RE = r"}\('(.+)',(\d+),(\d+),'([^']+)'\.split\('\|'\)" -JSON_LD_RE = r'(?is)]+type=(["\'])?application/ld\+json\1?[^>]*>(?P.+?)' +JSON_LD_RE = r'(?is)]+type=(["\']|)application/ld\+json\1[^>]*>(?P.+?)' def preferredencoding(): From 8559fcbd54c5a7e4c62bf226e8d371057e784af8 Mon Sep 17 00:00:00 2001 From: Ales Jirasek Date: Tue, 5 Feb 2019 21:39:12 +0100 Subject: [PATCH 5/8] Desired improvements, changed regex for _og_regexes to match invalid dashed ones --- youtube_dl/extractor/common.py | 2 +- youtube_dl/extractor/malltv.py | 50 ++++++++++++++-------------------- 2 files changed, 21 insertions(+), 31 deletions(-) diff --git a/youtube_dl/extractor/common.py b/youtube_dl/extractor/common.py index 2dbf81e6e..a652d51f8 100644 --- a/youtube_dl/extractor/common.py +++ b/youtube_dl/extractor/common.py @@ -1052,7 +1052,7 @@ class InfoExtractor(object): @staticmethod def _og_regexes(prop): content_re = r'content=(?:"([^"]+?)"|\'([^\']+?)\'|\s*([^\s"\'=<>`]+?))' - property_re = (r'(?:name|property)=(?:\'og:%(prop)s\'|"og:%(prop)s"|\s*og:%(prop)s\b)' + property_re = (r'(?:name|property)=(?:\'og[:-]%(prop)s\'|"og[:-]%(prop)s"|\s*og[:-]%(prop)s\b)' % {'prop': re.escape(prop)}) template = r']+?%s[^>]+?%s' return [ diff --git a/youtube_dl/extractor/malltv.py b/youtube_dl/extractor/malltv.py index be8b7a762..7a0e5e6fa 100644 --- a/youtube_dl/extractor/malltv.py +++ b/youtube_dl/extractor/malltv.py @@ -4,6 +4,7 @@ from __future__ import unicode_literals import hashlib from .common import InfoExtractor from ..utils import parse_duration +import re class MallTVIE(InfoExtractor): @@ -13,54 +14,43 @@ class MallTVIE(InfoExtractor): 'url': 'https://www.mall.tv/18-miliard-pro-neziskovky-opravdu-jsou-sportovci-nebo-clovek-v-tisni-pijavice', 'md5': '9ced0de056534410837077e23bfba796', 'info_dict': { - 'id': 'af7649e93dc6a2a04198e6c8143605a4', + 'id': 't0zzt0', 'ext': 'mp4', 'title': '18 miliard pro neziskovky. Opravdu jsou sportovci nebo Člověk v tísni pijavice?', - 'description': ('Pokud někdo hospodaří s penězmi daňových ' - 'poplatníků, pak logicky chceme vědět, jak s ' - 'nimi nakládá. Objem dotací pro neziskovky ' - 'roste, ale opravdu jsou tyto organizace ' - '„pijavice", jak o nich hovoří And') + 'description': "Pokud někdo hospodaří s penězmi daňových poplatníků, pak logicky chceme vědět, jak s nimi nakládá. Objem dotací pro neziskovky roste, ale opravdu jsou tyto organizace „pijavice', jak o nich hovoří And" } }, { 'url': 'https://www.mall.tv/kdo-to-plati/18-miliard-pro-neziskovky-opravdu-jsou-sportovci-nebo-clovek-v-tisni-pijavice', 'md5': '9ced0de056534410837077e23bfba796', 'info_dict': { - 'id': 'af7649e93dc6a2a04198e6c8143605a4', + 'id': 't0zzt0', 'ext': 'mp4', 'title': '18 miliard pro neziskovky. Opravdu jsou sportovci nebo Člověk v tísni pijavice?', - 'description': ('Pokud někdo hospodaří s penězmi daňových ' - 'poplatníků, pak logicky chceme vědět, jak s ' - 'nimi nakládá. Objem dotací pro neziskovky ' - 'roste, ale opravdu jsou tyto organizace ' - '„pijavice", jak o nich hovoří And') + 'description': "Pokud někdo hospodaří s penězmi daňových poplatníků, pak logicky chceme vědět, jak s nimi nakládá. Objem dotací pro neziskovky roste, ale opravdu jsou tyto organizace „pijavice', jak o nich hovoří And" } } ] def _real_extract(self, url): - video_id = self._match_id(url) - webpage = self._download_webpage(url, video_id) + display_id = self._match_id(url) + webpage = self._download_webpage(url, display_id) + src_id_regex = r'(?P.+?/(?P\w{6,}?)/index)(?P\1?[^>]*?>)' + video_id = self._html_search_regex(src_id_regex, webpage, 'ID', + group='id') info = self._search_json_ld(webpage, video_id, default={}) - - format_url = self._html_search_regex( - r'.+?index)\1?[^>]*?>', - webpage, 'm3u8 URL', group='src') - formats = self._extract_m3u8_formats(format_url+'.m3u8', - video_id, 'mp4') - self._sort_formats(formats) - thumbnail = info.get('thumbnailUrl', self._og_search_thumbnail(webpage)) + html = re.sub(src_id_regex, r'\g\g.m3u8\g', webpage) + media = self._parse_html5_media_entries('', html, video_id) + thumbnail = info.get('thumbnail', self._og_search_thumbnail(webpage)) duration = parse_duration(info.get('duration')) result = { - 'id': hashlib.md5(video_id).hexdigest().decode('utf8'), - 'title': info.get('name', self._og_search_title(webpage)), - 'description': self._og_search_description(webpage), - 'formats': formats + 'id': video_id, + 'title': info.get('title', self._og_search_title(webpage)), + 'description': self._og_search_description(webpage) } - if thumbnail: - result.update({'thumbnail': thumbnail}) - if duration: - result.update({'duration': duration}) + if media: + result.update(media[0]) + result.update({'thumbnail': thumbnail}) + result.update({'duration': duration}) return result From 7d904e5f01434a0b5a8fd3258214c0049967ea0d Mon Sep 17 00:00:00 2001 From: Ales Jirasek Date: Tue, 5 Feb 2019 21:47:09 +0100 Subject: [PATCH 6/8] regex in utils polished to beauty --- youtube_dl/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/youtube_dl/utils.py b/youtube_dl/utils.py index a82b7c826..b08254962 100644 --- a/youtube_dl/utils.py +++ b/youtube_dl/utils.py @@ -183,7 +183,7 @@ DATE_FORMATS_MONTH_FIRST.extend([ ]) PACKED_CODES_RE = r"}\('(.+)',(\d+),(\d+),'([^']+)'\.split\('\|'\)" -JSON_LD_RE = r'(?is)]+type=(["\']|)application/ld\+json\1[^>]*>(?P.+?)' +JSON_LD_RE = r'(?is)]+type=(["\']?)application/ld\+json\1[^>]*>(?P.+?)' def preferredencoding(): From 14ea1520020898c6e048b541632c11ccc7f82264 Mon Sep 17 00:00:00 2001 From: Ales Jirasek Date: Tue, 5 Feb 2019 21:54:06 +0100 Subject: [PATCH 7/8] no auto fixes by editor --- youtube_dl/extractor/extractors.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/youtube_dl/extractor/extractors.py b/youtube_dl/extractor/extractors.py index 268b2cbb1..72ce5a56b 100644 --- a/youtube_dl/extractor/extractors.py +++ b/youtube_dl/extractor/extractors.py @@ -1368,7 +1368,7 @@ from .webofstories import ( WebOfStoriesPlaylistIE, ) from .weibo import ( - WeiboIE, + WeiboIE, WeiboMobileIE ) from .weiqitv import WeiqiTVIE From 0ba2ab575463a33c3a9f866c262cd3591df4a090 Mon Sep 17 00:00:00 2001 From: Ales Jirasek Date: Wed, 6 Feb 2019 00:13:31 +0100 Subject: [PATCH 8/8] url matching regex fixed, imports and tests --- test/test_InfoExtractor.py | 2 ++ youtube_dl/extractor/malltv.py | 28 +++++++++++++++------------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/test/test_InfoExtractor.py b/test/test_InfoExtractor.py index 4833396a5..22018ede1 100644 --- a/test/test_InfoExtractor.py +++ b/test/test_InfoExtractor.py @@ -42,6 +42,7 @@ class TestInfoExtractor(unittest.TestCase): + ''' self.assertEqual(ie._og_search_title(html), 'Foo') self.assertEqual(ie._og_search_description(html), 'Some video\'s description ') @@ -50,6 +51,7 @@ class TestInfoExtractor(unittest.TestCase): self.assertEqual(ie._og_search_property('foobar', html), 'Foo') self.assertEqual(ie._og_search_property('test1', html), 'foo > < bar') self.assertEqual(ie._og_search_property('test2', html), 'foo >//< bar') + self.assertEqual(ie._og_search_property('test3', html), 'Ill-formatted opengraph') self.assertEqual(ie._og_search_property(('test0', 'test1'), html), 'foo > < bar') self.assertRaises(RegexNotFoundError, ie._og_search_property, 'test0', html, None, fatal=True) self.assertRaises(RegexNotFoundError, ie._og_search_property, ('test0', 'test00'), html, None, fatal=True) diff --git a/youtube_dl/extractor/malltv.py b/youtube_dl/extractor/malltv.py index 7a0e5e6fa..7e0876ecc 100644 --- a/youtube_dl/extractor/malltv.py +++ b/youtube_dl/extractor/malltv.py @@ -1,14 +1,13 @@ # coding: utf-8 from __future__ import unicode_literals -import hashlib -from .common import InfoExtractor -from ..utils import parse_duration import re +from .common import InfoExtractor +from ..utils import parse_duration, merge_dicts class MallTVIE(InfoExtractor): - _VALID_URL = r'https?://(?:www\.)?mall\.tv/(?:.+/)?(?P.+)' + _VALID_URL = r'https?://(?:www\.)?mall\.tv/(?:.+/)?(?P.+)(?:\?.*$|$)' _TESTS = [ { 'url': 'https://www.mall.tv/18-miliard-pro-neziskovky-opravdu-jsou-sportovci-nebo-clovek-v-tisni-pijavice', @@ -17,17 +16,22 @@ class MallTVIE(InfoExtractor): 'id': 't0zzt0', 'ext': 'mp4', 'title': '18 miliard pro neziskovky. Opravdu jsou sportovci nebo Člověk v tísni pijavice?', - 'description': "Pokud někdo hospodaří s penězmi daňových poplatníků, pak logicky chceme vědět, jak s nimi nakládá. Objem dotací pro neziskovky roste, ale opravdu jsou tyto organizace „pijavice', jak o nich hovoří And" + 'description': 'Pokud někdo hospodaří s penězmi daňových poplatníků, pak logicky chceme vědět, jak s nimi nakládá. Objem dotací pro neziskovky roste, ale opravdu jsou tyto organizace „pijavice", jak o nich hovoří And', + 'upload_date': '20181007', + 'timestamp': 1538870400 } }, { 'url': 'https://www.mall.tv/kdo-to-plati/18-miliard-pro-neziskovky-opravdu-jsou-sportovci-nebo-clovek-v-tisni-pijavice', 'md5': '9ced0de056534410837077e23bfba796', + 'only_matching': 1, 'info_dict': { 'id': 't0zzt0', 'ext': 'mp4', 'title': '18 miliard pro neziskovky. Opravdu jsou sportovci nebo Člověk v tísni pijavice?', - 'description': "Pokud někdo hospodaří s penězmi daňových poplatníků, pak logicky chceme vědět, jak s nimi nakládá. Objem dotací pro neziskovky roste, ale opravdu jsou tyto organizace „pijavice', jak o nich hovoří And" + 'description': 'Pokud někdo hospodaří s penězmi daňových poplatníků, pak logicky chceme vědět, jak s nimi nakládá. Objem dotací pro neziskovky roste, ale opravdu jsou tyto organizace „pijavice", jak o nich hovoří And', + 'upload_date': '20181007', + 'timestamp': 1538870400 } } ] @@ -35,12 +39,12 @@ class MallTVIE(InfoExtractor): def _real_extract(self, url): display_id = self._match_id(url) webpage = self._download_webpage(url, display_id) - src_id_regex = r'(?P.+?/(?P\w{6,}?)/index)(?P\1?[^>]*?>)' - video_id = self._html_search_regex(src_id_regex, webpage, 'ID', + src_id_regex = r'(?P\w{6,}?)/index)(?P\1?[^>]*?>)' + video_id = self._search_regex(src_id_regex, webpage, 'ID', group='id') info = self._search_json_ld(webpage, video_id, default={}) - html = re.sub(src_id_regex, r'\g\g.m3u8\g', webpage) - media = self._parse_html5_media_entries('', html, video_id) + html = re.sub(src_id_regex, r'\g.m3u8\g', webpage) + media = self._parse_html5_media_entries(url, html, video_id) thumbnail = info.get('thumbnail', self._og_search_thumbnail(webpage)) duration = parse_duration(info.get('duration')) result = { @@ -48,9 +52,7 @@ class MallTVIE(InfoExtractor): 'title': info.get('title', self._og_search_title(webpage)), 'description': self._og_search_description(webpage) } - if media: - result.update(media[0]) result.update({'thumbnail': thumbnail}) result.update({'duration': duration}) - return result + return merge_dicts(media[0], info, result)