1# coding: utf-8 2from __future__ import unicode_literals 3 4from .common import InfoExtractor 5from ..utils import ( 6 clean_html, 7 int_or_none, 8 traverse_obj 9) 10 11 12_API_URL = 'https://dak1vd5vmi7x6.cloudfront.net/api/v1/publicrole/{}/{}?id={}' 13 14 15class ManotoTVIE(InfoExtractor): 16 IE_DESC = 'Manoto TV (Episode)' 17 _VALID_URL = r'https?://(?:www\.)?manototv\.com/episode/(?P<id>[0-9]+)' 18 _TESTS = [{ 19 'url': 'https://www.manototv.com/episode/8475', 20 'info_dict': { 21 'id': '8475', 22 'series': 'خانه های رویایی با برادران اسکات', 23 'season_number': 7, 24 'episode_number': 25, 25 'episode_id': 'My Dream Home S7: Carol & John', 26 'duration': 3600, 27 'categories': ['سرگرمی'], 28 'title': 'کارول و جان', 29 'description': 'md5:d0fff1f8ba5c6775d312a00165d1a97e', 30 'thumbnail': r're:^https?://.*\.(jpeg|png|jpg)$', 31 'ext': 'mp4' 32 }, 33 'params': { 34 'skip_download': 'm3u8', 35 } 36 }, { 37 'url': 'https://www.manototv.com/episode/12576', 38 'info_dict': { 39 'id': '12576', 40 'series': 'فیلم های ایرانی', 41 'episode_id': 'Seh Mah Taatili', 42 'duration': 5400, 43 'view_count': int, 44 'categories': ['سرگرمی'], 45 'title': 'سه ماه تعطیلی', 46 'description': 'سه ماه تعطیلی فیلمی به کارگردانی و نویسندگی شاپور قریب ساختهٔ سال ۱۳۵۶ است.', 47 'thumbnail': r're:^https?://.*\.(jpeg|png|jpg)$', 48 'ext': 'mp4' 49 }, 50 'params': { 51 'skip_download': 'm3u8', 52 } 53 }] 54 55 def _real_extract(self, url): 56 video_id = self._match_id(url) 57 episode_json = self._download_json(_API_URL.format('showmodule', 'episodedetails', video_id), video_id) 58 details = episode_json.get('details', {}) 59 formats = self._extract_m3u8_formats(details.get('videoM3u8Url'), video_id, 'mp4') 60 self._sort_formats(formats) 61 return { 62 'id': video_id, 63 'series': details.get('showTitle'), 64 'season_number': int_or_none(details.get('analyticsSeasonNumber')), 65 'episode_number': int_or_none(details.get('episodeNumber')), 66 'episode_id': details.get('analyticsEpisodeTitle'), 67 'duration': int_or_none(details.get('durationInMinutes'), invscale=60), 68 'view_count': details.get('viewCount'), 69 'categories': [details.get('videoCategory')], 70 'title': details.get('episodeTitle'), 71 'description': clean_html(details.get('episodeDescription')), 72 'thumbnail': details.get('episodelandscapeImgIxUrl'), 73 'formats': formats, 74 } 75 76 77class ManotoTVShowIE(InfoExtractor): 78 IE_DESC = 'Manoto TV (Show)' 79 _VALID_URL = r'https?://(?:www\.)?manototv\.com/show/(?P<id>[0-9]+)' 80 _TESTS = [{ 81 'url': 'https://www.manototv.com/show/2526', 82 'playlist_mincount': 68, 83 'info_dict': { 84 'id': '2526', 85 'title': 'فیلم های ایرانی', 86 'description': 'مجموعه ای از فیلم های سینمای کلاسیک ایران', 87 }, 88 }] 89 90 def _real_extract(self, url): 91 show_id = self._match_id(url) 92 show_json = self._download_json(_API_URL.format('showmodule', 'details', show_id), show_id) 93 show_details = show_json.get('details', {}) 94 title = show_details.get('showTitle') 95 description = show_details.get('showSynopsis') 96 97 series_json = self._download_json(_API_URL.format('showmodule', 'serieslist', show_id), show_id) 98 playlist_id = str(traverse_obj(series_json, ('details', 'list', 0, 'id'))) 99 100 playlist_json = self._download_json(_API_URL.format('showmodule', 'episodelist', playlist_id), playlist_id) 101 playlist = traverse_obj(playlist_json, ('details', 'list')) or [] 102 103 entries = [ 104 self.url_result( 105 'https://www.manototv.com/episode/%s' % item['slideID'], ie=ManotoTVIE.ie_key(), video_id=item['slideID']) 106 for item in playlist] 107 return self.playlist_result(entries, show_id, title, description) 108 109 110class ManotoTVLiveIE(InfoExtractor): 111 IE_DESC = 'Manoto TV (Live)' 112 _VALID_URL = r'https?://(?:www\.)?manototv\.com/live/' 113 _TEST = { 114 'url': 'https://www.manototv.com/live/', 115 'info_dict': { 116 'id': 'live', 117 'title': 'Manoto TV Live', 118 'ext': 'mp4', 119 'is_live': True, 120 }, 121 'params': { 122 'skip_download': 'm3u8', 123 } 124 } 125 126 def _real_extract(self, url): 127 video_id = 'live' 128 json = self._download_json(_API_URL.format('livemodule', 'details', ''), video_id) 129 details = json.get('details', {}) 130 video_url = details.get('liveUrl') 131 formats = self._extract_m3u8_formats(video_url, video_id, 'mp4', live=True) 132 self._sort_formats(formats) 133 return { 134 'id': video_id, 135 'title': 'Manoto TV Live', 136 'is_live': True, 137 'formats': formats, 138 } 139