+# coding: utf-8\r
+from __future__ import unicode_literals\r
+\r
+import re\r
+\r
+from .common import InfoExtractor\r
+from ..compat import compat_str\r
+from ..utils import (\r
+ int_or_none,\r
+ js_to_json,\r
+ try_get,\r
+)\r
+\r
+\r
+class JojIE(InfoExtractor):\r
+ _VALID_URL = r'''(?x)\r
+ (?:\r
+ joj:|\r
+ https?://media\.joj\.sk/embed/\r
+ )\r
+ (?P<id>[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12})\r
+ '''\r
+ _TESTS = [{\r
+ 'url': 'https://media.joj.sk/embed/a388ec4c-6019-4a4a-9312-b1bee194e932',\r
+ 'info_dict': {\r
+ 'id': 'a388ec4c-6019-4a4a-9312-b1bee194e932',\r
+ 'ext': 'mp4',\r
+ 'title': 'NOVÉ BÝVANIE',\r
+ 'thumbnail': r're:^https?://.*\.jpg$',\r
+ 'duration': 3118,\r
+ }\r
+ }, {\r
+ 'url': 'joj:a388ec4c-6019-4a4a-9312-b1bee194e932',\r
+ 'only_matching': True,\r
+ }]\r
+\r
+ @staticmethod\r
+ def _extract_urls(webpage):\r
+ return re.findall(\r
+ r'<iframe\b[^>]+\bsrc=["\'](?P<url>(?:https?:)?//media\.joj\.sk/embed/[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12})',\r
+ webpage)\r
+\r
+ def _real_extract(self, url):\r
+ video_id = self._match_id(url)\r
+\r
+ webpage = self._download_webpage(\r
+ 'https://media.joj.sk/embed/%s' % video_id, video_id)\r
+\r
+ title = self._search_regex(\r
+ (r'videoTitle\s*:\s*(["\'])(?P<title>(?:(?!\1).)+)\1',\r
+ r'<title>(?P<title>[^<]+)'), webpage, 'title',\r
+ default=None, group='title') or self._og_search_title(webpage)\r
+\r
+ bitrates = self._parse_json(\r
+ self._search_regex(\r
+ r'(?s)bitrates\s*=\s*({.+?});', webpage, 'bitrates',\r
+ default='{}'),\r
+ video_id, transform_source=js_to_json, fatal=False)\r
+\r
+ formats = []\r
+ for format_url in try_get(bitrates, lambda x: x['mp4'], list) or []:\r
+ if isinstance(format_url, compat_str):\r
+ height = self._search_regex(\r
+ r'(\d+)[pP]\.', format_url, 'height', default=None)\r
+ formats.append({\r
+ 'url': format_url,\r
+ 'format_id': '%sp' % height if height else None,\r
+ 'height': int(height),\r
+ })\r
+ if not formats:\r
+ playlist = self._download_xml(\r
+ 'https://media.joj.sk/services/Video.php?clip=%s' % video_id,\r
+ video_id)\r
+ for file_el in playlist.findall('./files/file'):\r
+ path = file_el.get('path')\r
+ if not path:\r
+ continue\r
+ format_id = file_el.get('id') or file_el.get('label')\r
+ formats.append({\r
+ 'url': 'http://n16.joj.sk/storage/%s' % path.replace(\r
+ 'dat/', '', 1),\r
+ 'format_id': format_id,\r
+ 'height': int_or_none(self._search_regex(\r
+ r'(\d+)[pP]', format_id or path, 'height',\r
+ default=None)),\r
+ })\r
+ self._sort_formats(formats)\r
+\r
+ thumbnail = self._og_search_thumbnail(webpage)\r
+\r
+ duration = int_or_none(self._search_regex(\r
+ r'videoDuration\s*:\s*(\d+)', webpage, 'duration', fatal=False))\r
+\r
+ return {\r
+ 'id': video_id,\r
+ 'title': title,\r
+ 'thumbnail': thumbnail,\r
+ 'duration': duration,\r
+ 'formats': formats,\r
+ }\r