diff --git a/yt_dlp/extractor/netzkino.py b/yt_dlp/extractor/netzkino.py index c07b1715af..05f6c23a31 100644 --- a/yt_dlp/extractor/netzkino.py +++ b/yt_dlp/extractor/netzkino.py @@ -2,84 +2,59 @@ from .common import InfoExtractor from ..utils import ( clean_html, int_or_none, - js_to_json, - parse_iso8601, + url_or_none, + urljoin, ) +from ..utils.traversal import traverse_obj class NetzkinoIE(InfoExtractor): - _WORKING = False - _VALID_URL = r'https?://(?:www\.)?netzkino\.de/\#!/[^/]+/(?P[^/]+)' - + _GEO_COUNTRIES = ['DE'] + _VALID_URL = r'https?://(?:www\.)?netzkino\.de/details/(?P[^/?#]+)' _TESTS = [{ - 'url': 'https://www.netzkino.de/#!/scifikino/rakete-zum-mond', - 'md5': '92a3f8b76f8d7220acce5377ea5d4873', + 'url': 'https://www.netzkino.de/details/snow-beast', + 'md5': '1a4c90fe40d3ccabce163287e45e56dd', 'info_dict': { - 'id': 'rakete-zum-mond', + 'id': 'snow-beast', 'ext': 'mp4', - 'title': 'Rakete zum Mond \u2013 Jules Verne', - 'description': 'md5:f0a8024479618ddbfa450ff48ffa6c60', - 'upload_date': '20120813', - 'thumbnail': r're:https?://.*\.jpg$', - 'timestamp': 1344858571, + 'title': 'Snow Beast', 'age_limit': 12, - }, - 'params': { - 'skip_download': 'Download only works from Germany', - }, - }, { - 'url': 'https://www.netzkino.de/#!/filme/dr-jekyll-mrs-hyde-2', - 'md5': 'c7728b2dadd04ff6727814847a51ef03', - 'info_dict': { - 'id': 'dr-jekyll-mrs-hyde-2', - 'ext': 'mp4', - 'title': 'Dr. Jekyll & Mrs. Hyde 2', - 'description': 'md5:c2e9626ebd02de0a794b95407045d186', - 'upload_date': '20190130', - 'thumbnail': r're:https?://.*\.jpg$', - 'timestamp': 1548849437, - 'age_limit': 18, - }, - 'params': { - 'skip_download': 'Download only works from Germany', + 'alt_title': 'Snow Beast', + 'cast': 'count:3', + 'categories': 'count:7', + 'creators': 'count:2', + 'description': 'md5:e604a954a7f827a80e96a3a97d48b269', + 'location': 'US', + 'release_year': 2011, + 'thumbnail': r're:https?://.+\.jpg', }, }] def _real_extract(self, url): - mobj = self._match_valid_url(url) - video_id = mobj.group('id') + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + next_js_data = self._search_nextjs_data(webpage, video_id) - api_url = f'https://api.netzkino.de.simplecache.net/capi-2.0a/movies/{video_id}.json?d=www' - info = self._download_json(api_url, video_id) - custom_fields = info['custom_fields'] - - production_js = self._download_webpage( - 'http://www.netzkino.de/beta/dist/production.min.js', video_id, - note='Downloading player code') - avo_js = self._search_regex( - r'var urlTemplate=(\{.*?"\})', - production_js, 'URL templates') - templates = self._parse_json( - avo_js, video_id, transform_source=js_to_json) - - suffix = { - 'hds': '.mp4/manifest.f4m', - 'hls': '.mp4/master.m3u8', - 'pmd': '.mp4', - } - film_fn = custom_fields['Streaming'][0] - formats = [{ - 'format_id': key, - 'ext': 'mp4', - 'url': tpl.replace('{}', film_fn) + suffix[key], - } for key, tpl in templates.items()] + query = traverse_obj(next_js_data, ( + 'props', '__dehydratedState', 'queries', ..., 'state', + 'data', 'data', lambda _, v: v['__typename'] == 'CmsMovie', any)) + if 'DRM' in traverse_obj(query, ('licenses', 'nodes', ..., 'properties', {str})): + self.report_drm(video_id) return { 'id': video_id, - 'formats': formats, - 'title': info['title'], - 'age_limit': int_or_none(custom_fields.get('FSK')[0]), - 'timestamp': parse_iso8601(info.get('date'), delimiter=' '), - 'description': clean_html(info.get('content')), - 'thumbnail': info.get('thumbnail'), + **traverse_obj(query, { + 'title': ('originalTitle', {clean_html}), + 'age_limit': ('fskRating', {int_or_none}), + 'alt_title': ('originalTitle', {clean_html}, filter), + 'cast': ('cast', 'nodes', ..., 'person', 'name', {clean_html}, filter), + 'creators': (('directors', 'writers'), 'nodes', ..., 'person', 'name', {clean_html}, filter), + 'categories': ('categories', 'nodes', ..., 'category', 'title', {clean_html}, filter), + 'description': ('longSynopsis', {clean_html}, filter), + 'duration': ('runtimeInSeconds', {int_or_none}), + 'location': ('productionCountry', {clean_html}, filter), + 'release_year': ('productionYear', {int_or_none}), + 'thumbnail': ('coverImage', 'masterUrl', {url_or_none}), + 'url': ('videoSource', 'pmdUrl', {urljoin('https://pmd.netzkino-seite.netzkino.de/')}), + }), }