phoenix.py (5018B)
- # coding: utf-8
- from __future__ import unicode_literals
- import re
- from .youtube import YoutubeIE
- from .zdf import ZDFBaseIE
- from ..compat import compat_str
- from ..utils import (
- int_or_none,
- merge_dicts,
- try_get,
- unified_timestamp,
- urljoin,
- )
- class PhoenixIE(ZDFBaseIE):
- IE_NAME = 'phoenix.de'
- _VALID_URL = r'https?://(?:www\.)?phoenix\.de/(?:[^/]+/)*[^/?#&]*-a-(?P<id>\d+)\.html'
- _TESTS = [{
- # Same as https://www.zdf.de/politik/phoenix-sendungen/wohin-fuehrt-der-protest-in-der-pandemie-100.html
- 'url': 'https://www.phoenix.de/sendungen/ereignisse/corona-nachgehakt/wohin-fuehrt-der-protest-in-der-pandemie-a-2050630.html',
- 'md5': '34ec321e7eb34231fd88616c65c92db0',
- 'info_dict': {
- 'id': '210222_phx_nachgehakt_corona_protest',
- 'ext': 'mp4',
- 'title': 'Wohin führt der Protest in der Pandemie?',
- 'description': 'md5:7d643fe7f565e53a24aac036b2122fbd',
- 'duration': 1691,
- 'timestamp': 1613902500,
- 'upload_date': '20210221',
- 'uploader': 'Phoenix',
- 'series': 'corona nachgehakt',
- 'episode': 'Wohin führt der Protest in der Pandemie?',
- },
- }, {
- # Youtube embed
- 'url': 'https://www.phoenix.de/sendungen/gespraeche/phoenix-streitgut-brennglas-corona-a-1965505.html',
- 'info_dict': {
- 'id': 'hMQtqFYjomk',
- 'ext': 'mp4',
- 'title': 'phoenix streitgut: Brennglas Corona - Wie gerecht ist unsere Gesellschaft?',
- 'description': 'md5:ac7a02e2eb3cb17600bc372e4ab28fdd',
- 'duration': 3509,
- 'upload_date': '20201219',
- 'uploader': 'phoenix',
- 'uploader_id': 'phoenix',
- },
- 'params': {
- 'skip_download': True,
- },
- }, {
- 'url': 'https://www.phoenix.de/entwicklungen-in-russland-a-2044720.html',
- 'only_matching': True,
- }, {
- # no media
- 'url': 'https://www.phoenix.de/sendungen/dokumentationen/mit-dem-jumbo-durch-die-nacht-a-89625.html',
- 'only_matching': True,
- }, {
- # Same as https://www.zdf.de/politik/phoenix-sendungen/die-gesten-der-maechtigen-100.html
- 'url': 'https://www.phoenix.de/sendungen/dokumentationen/gesten-der-maechtigen-i-a-89468.html?ref=suche',
- 'only_matching': True,
- }]
- def _real_extract(self, url):
- article_id = self._match_id(url)
- article = self._download_json(
- 'https://www.phoenix.de/response/id/%s' % article_id, article_id,
- 'Downloading article JSON')
- video = article['absaetze'][0]
- title = video.get('titel') or article.get('subtitel')
- if video.get('typ') == 'video-youtube':
- video_id = video['id']
- return self.url_result(
- video_id, ie=YoutubeIE.ie_key(), video_id=video_id,
- video_title=title)
- video_id = compat_str(video.get('basename') or video.get('content'))
- details = self._download_json(
- 'https://www.phoenix.de/php/mediaplayer/data/beitrags_details.php',
- video_id, 'Downloading details JSON', query={
- 'ak': 'web',
- 'ptmd': 'true',
- 'id': video_id,
- 'profile': 'player2',
- })
- title = title or details['title']
- content_id = details['tracking']['nielsen']['content']['assetid']
- info = self._extract_ptmd(
- 'https://tmd.phoenix.de/tmd/2/ngplayer_2_3/vod/ptmd/phoenix/%s' % content_id,
- content_id, None, url)
- duration = int_or_none(try_get(
- details, lambda x: x['tracking']['nielsen']['content']['length']))
- timestamp = unified_timestamp(details.get('editorialDate'))
- series = try_get(
- details, lambda x: x['tracking']['nielsen']['content']['program'],
- compat_str)
- episode = title if details.get('contentType') == 'episode' else None
- thumbnails = []
- teaser_images = try_get(details, lambda x: x['teaserImageRef']['layouts'], dict) or {}
- for thumbnail_key, thumbnail_url in teaser_images.items():
- thumbnail_url = urljoin(url, thumbnail_url)
- if not thumbnail_url:
- continue
- thumbnail = {
- 'url': thumbnail_url,
- }
- m = re.match('^([0-9]+)x([0-9]+)$', thumbnail_key)
- if m:
- thumbnail['width'] = int(m.group(1))
- thumbnail['height'] = int(m.group(2))
- thumbnails.append(thumbnail)
- return merge_dicts(info, {
- 'id': content_id,
- 'title': title,
- 'description': details.get('leadParagraph'),
- 'duration': duration,
- 'thumbnails': thumbnails,
- 'timestamp': timestamp,
- 'uploader': details.get('tvService'),
- 'series': series,
- 'episode': episode,
- })