def docu_list(self, url): self.items = [] try: html = client.request(url) cat_list = client.parseDOM(html, 'article', attrs={'class': 'module'}) for content in cat_list: docu_info = re.findall('<h2>(.+?)</h2>', content)[0] docu_url = re.findall('href="(.+?)"', docu_info)[0] docu_title = re.findall('href=".+?">(.+?)</a>', docu_info)[0].strip() docu_title = utils.convert(docu_title).encode('utf-8') docu_plot = re.findall('<p>(.+?)</p>', content)[0] docu_plot = utils.convert(docu_plot).encode('utf-8') try: docu_icon = re.findall('img data-src="(.+?)"', content)[0] except Exception: docu_icon = client.parseDOM(content, 'img', ret='src')[0] item = control.item(label=docu_title) item.setProperty("IsPlayable", "true") item.setArt({"thumb": docu_icon, "icon": docu_icon}) item.setInfo(type="video", infoLabels={"Title": docu_title, "mediatype": "video", 'plot': docu_plot, 'mediatype': 'video', 'plotoutline': docu_plot}) try: item.setContentLookup(False) except AttributeError: pass url = '%s?action=docuTDNavigator&docuPlay=%s' % (sysaddon, docu_url) self.items.append((url, item, False)) try: navi_content = client.parseDOM(html, 'div', attrs={'class': 'pagination module'})[0] links = client.parseDOM(navi_content, 'a', ret='href') link = links[(len(links)-1)] next_url = '%s?action=docuTDNavigator&docuCat=%s' % (sysaddon, link) item = control.item(label=control.lang(32053).encode('utf-8')) item.setArt({"thumb": control.addonNext(), "icon": control.addonNext()}) self.items.append((next_url, item, True)) except Exception: failure = traceback.format_exc() log_utils.log('Top Docs: Docu_List: Exception in Nav - ' + str(failure)) pass except Exception: failure = traceback.format_exc() log_utils.log('Top Docs: Docu_List: Exception in List - ' + str(failure)) pass return self.items
def docu_list(self, url): try: html = client.request(url) cat_list = client.parseDOM(html, 'article', attrs={'class':'module'}) for content in cat_list: docu_info = client.parseDOM(content, 'h2')[0] docu_url = client.parseDOM(docu_info, 'a', ret='href')[0] docu_title = client.parseDOM(docu_info, 'a')[0].replace("&","&").replace(''',"'").replace('"','"').replace(''',"'").replace('–',' - ').replace('’',"'").replace('‘',"'").replace('&','&').replace('â','') try: docu_icon = client.parseDOM(content, 'img', ret='data-src')[0] except: docu_icon = client.parseDOM(content, 'img', ret='src')[0] docu_action = 'docuHeaven&docuPlay=%s' % docu_url self.list.append({'name': docu_title, 'url': docu_url, 'image': docu_icon, 'action': docu_action}) try: navi_content = client.parseDOM(html, 'div', attrs={'class':'pagination module'})[0] links = client.parseDOM(navi_content, 'a', ret='href') tmp_list = [] link = links[(len(links)-1)] docu_action = 'docuHeaven&docuCat=%s' % link self.list.append({'name': control.lang(32053), 'url': link, 'image': control.addonNext(), 'action': docu_action}) except: pass except Exception as e: log_utils.log('documentary docu_list : Exception - ' + str(e)) pass self.addDirectory(self.list) return self.list
def index(self): txtfilter = self.getFilter() if not txtfilter: txtfilter = "none" self.addDir('[B]Current filter:[/B] ' + txtfilter, '', 'openSettings', '', Folder=False) html = client.request(self.base_link) blogpage = re.compile( "content='([^']+)' itemprop='image_url'.*?href='([^']+)'>([^<]+)<", re.DOTALL | re.IGNORECASE).findall(html) for img, url, name in blogpage: self.addDir(name, url, 'listStreams', img) try: nextp = re.compile("'blog-pager-older-link' href='([^']+)'", re.DOTALL | re.IGNORECASE).findall(html)[0] nextp = nextp.replace('&', '&') self.addDir( control.lang(32053).encode('utf-8'), nextp, 'liveTV', control.addonNext()) except: pass xbmcplugin.endOfDirectory(syshandle)
def get_poster_offer(id, page=1, per_page=40): control.log('get_poster_offer: %s | page: %s' % (id, page)) query = 'query%20getOffer%28%24id%3A%20ID%21%2C%20%24page%3A%20Int%2C%20%24perPage%3A%20Int%2C%20%24context%3A%20RecommendedOfferContextInput%29%20%7B%0A%20%20genericOffer%28id%3A%20%24id%29%20%7B%0A%20%20%20%20...%20on%20Offer%20%7B%0A%20%20%20%20%20%20id%0A%20%20%20%20%20%20contentType%0A%20%20%20%20%20%20userBased%0A%20%20%20%20%20%20paginatedItems%28page%3A%20%24page%2C%20perPage%3A%20%24perPage%29%20%7B%0A%20%20%20%20%20%20%20%20page%0A%20%20%20%20%20%20%20%20perPage%0A%20%20%20%20%20%20%20%20hasNextPage%0A%20%20%20%20%20%20%20%20nextPage%0A%20%20%20%20%20%20%20%20resources%20%7B%0A%20%20%20%20%20%20%20%20%20%20...titleHome%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20...%20on%20RecommendedOffer%20%7B%0A%20%20%20%20%20%20contentType%0A%20%20%20%20%20%20items%28page%3A%20%24page%2C%20perPage%3A%20%24perPage%2C%20context%3A%20%24context%29%20%7B%0A%20%20%20%20%20%20%20%20customTitle%0A%20%20%20%20%20%20%20%20abExperiment%20%7B%0A%20%20%20%20%20%20%20%20%20%20experiment%0A%20%20%20%20%20%20%20%20%20%20alternative%0A%20%20%20%20%20%20%20%20%20%20trackId%0A%20%20%20%20%20%20%20%20%20%20convertUrl%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20resources%20%7B%0A%20%20%20%20%20%20%20%20%20%20...titleHome%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20page%0A%20%20%20%20%20%20%20%20perPage%0A%20%20%20%20%20%20%20%20hasNextPage%0A%20%20%20%20%20%20%20%20nextPage%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D%0Afragment%20titleHome%20on%20Title%20%7B%0A%20%20originVideoId%0A%20%20titleId%0A%20%20type%0A%20%20originProgramId%0A%20%20headline%0A%20%20originalHeadline%0A%20%20description%0A%20%20slug%0A%20%20contentRating%0A%20%20contentRatingCriteria%0A%20%20releaseYear%0A%20%20format%0A%20%20countries%0A%20%20genresNames%0A%20%20directorsNames%0A%20%20artDirectorsNames%0A%20%20authorsNames%0A%20%20castNames%0A%20%20screenwritersNames%0A%20%20cover%20%7B%0A%20%20%20%20%20%20landscape%28scale%3A%20X1080%29%0A%20%20%20%20%20%20web%0A%20%20%20%20%7D%0A%20%20poster%20%7B%0A%20%20%20%20web%0A%20%20%7D%0A%20%20logo%20%7B%0A%20%20%20%20web%0A%20%20%7D%0A%20%20channel%20%7B%0A%20%20%20%20id%0A%20%20%20%20name%0A%20%20%20%20slug%0A%20%20%7D%0A%7D' variables = '{{"id":"{id}","page":{page},"perPage":{perPage}}}'.format(id=id, page=page, perPage=per_page) generic_offer = request_query(query, variables).get('data', {}).get('genericOffer', {}) or {} items = generic_offer.get('paginatedItems', generic_offer.get('items', {})) or {} custom_title = items.get('customTitle') for resource in items.get('resources', []) or []: playable = True if resource.get('originVideoId') else False yield { 'handler': PLAYER_HANDLER if playable else __name__, 'method': 'playlive' if playable else 'get_title', 'id': resource.get('originVideoId', resource.get('titleId')) or resource.get('titleId'), 'IsPlayable': playable, 'custom_title': custom_title, 'tagline': custom_title, # 'type': resource.get('type'), 'label': resource.get('headline', ''), 'title': resource.get('headline', ''), 'originaltitle': resource.get('originalHeadline', ''), 'studio': resource.get('channel', {}).get('name'), 'year': resource.get('releaseYear', ''), 'country': resource.get('countries', []), 'genre': resource.get('genresNames', []), 'cast': resource.get('castNames', []), 'director': resource.get('directorsNames', []), 'writer': resource.get('screenwritersNames', []), 'credits': resource.get('artDirectorsNames', []), 'tag': resource.get('contentRatingCriteria'), 'mpaa': resource.get('contentRating', ''), 'plot': resource.get('description', ''), 'mediatype': 'movie' if resource.get('type', '') == 'MOVIE' else 'tvshow', # "video", "movie", "tvshow", "season", "episode" or "musicvideo" 'art': { 'poster': (resource.get('poster', {}) or {}).get('web'), 'clearlogo': (resource.get('logo', {}) or {}).get('web'), 'fanart': (resource.get('cover', {}) or {}).get('web', FANART) } } if items.get('hasNextPage', False): yield { 'handler': __name__, 'method': 'get_poster_offer', 'id': id, 'page': items.get('nextPage'), 'label': '%s (%s)' % (control.lang(34136).encode('utf-8'), page), 'art': { 'poster': control.addonNext(), 'fanart': FANART }, 'properties': { 'SpecialSort': 'bottom' } }
def get_thumb_offer(id, page=1, per_page=200): query = 'query%20getOfferThumbById%28%24id%3A%20ID%21%2C%20%24page%3A%20Int%2C%20%24perPage%3A%20Int%2C%20%24context%3A%20RecommendedOfferContextInput%29%20%7B%0A%20%20genericOffer%28id%3A%20%24id%29%20%7B%0A%20%20%20%20...%20on%20Offer%20%7B%0A%20%20%20%20%20%20contentType%0A%20%20%20%20%20%20userBased%0A%20%20%20%20%20%20paginatedItems%28page%3A%20%24page%2C%20perPage%3A%20%24perPage%29%20%7B%0A%20%20%20%20%20%20%20%20page%0A%20%20%20%20%20%20%20%20perPage%0A%20%20%20%20%20%20%20%20hasNextPage%0A%20%20%20%20%20%20%20%20nextPage%0A%20%20%20%20%20%20%20%20resources%20%7B%0A%20%20%20%20%20%20%20%20%20%20...videoFragment%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20...%20on%20RecommendedOffer%20%7B%0A%20%20%20%20%20%20contentType%0A%20%20%20%20%20%20items%28page%3A%20%24page%2C%20perPage%3A%20%24perPage%2C%20context%3A%20%24context%29%20%7B%0A%20%20%20%20%20%20%20%20customTitle%0A%20%20%20%20%20%20%20%20abExperiment%20%7B%0A%20%20%20%20%20%20%20%20%20%20experiment%0A%20%20%20%20%20%20%20%20%20%20alternative%0A%20%20%20%20%20%20%20%20%20%20trackId%0A%20%20%20%20%20%20%20%20%20%20convertUrl%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20resources%20%7B%0A%20%20%20%20%20%20%20%20%20%20...videoFragment%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20page%0A%20%20%20%20%20%20%20%20perPage%0A%20%20%20%20%20%20%20%20hasNextPage%0A%20%20%20%20%20%20%20%20nextPage%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D%0A%0Afragment%20videoFragment%20on%20Video%20%7B%0A%20%20id%0A%20%20kind%0A%20%20headline%0A%20%20description%0A%20%20liveThumbnail%0A%20%20thumb%0A%20%20broadcast%20%7B%0A%20%20%20%20mediaId%0A%20%20%20%20trimmedLogo%28scale%3A%20X56%29%0A%20%20%20%20imageOnAir%0A%20%20%20%20channel%20%7B%0A%20%20%20%20%20%20name%0A%20%20%20%20%20%20payTvServiceId%0A%20%20%20%20%20%20trimmedLogo%28scale%3A%20X56%29%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20title%20%7B%0A%20%20%20%20titleId%0A%20%20%20%20originProgramId%0A%20%20%20%20headline%0A%20%20%20%20description%0A%20%20%20%20slug%0A%20%20%20%20releaseYear%0A%20%20%20%20contentRating%0A%20%20%20%20contentRatingCriteria%0A%20%20%20%20type%0A%20%20%20%20format%0A%20%20%20%20countries%0A%20%20%20%20directors%20%7B%0A%20%20%20%20%20%20%20%20name%0A%20%20%20%20%7D%0A%20%20%20%20cast%20%7B%0A%20%20%20%20%20%20%20%20name%0A%20%20%20%20%7D%0A%20%20%20%20genres%20%7B%0A%20%20%20%20%20%20%20%20name%0A%20%20%20%20%7D%0A%20%20%20%20cover%20%7B%0A%20%20%20%20%20%20landscape%28scale%3A%20X1080%29%0A%20%20%20%20%20%20web%0A%20%20%20%20%7D%0A%20%20%20%20poster%20%7B%0A%20%20%20%20%20%20%20%20web%0A%20%20%20%20%7D%0A%20%20%20%20logo%20%7B%0A%20%20%20%20%20%20%20%20web%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20availableFor%0A%20%20serviceId%0A%20%20duration%0A%7D' variables = '{{"id":"{id}","page":{page},"perPage":{per_page}}}'.format(id=id, page=page, per_page=per_page) generic_offer = request_query(query, variables).get('data', {}).get('genericOffer', {}) items = generic_offer.get('paginatedItems', generic_offer.get('items', {})) or {} custom_title = items.get('customTitle') for item in items.get('resources', []): yield { 'handler': PLAYER_HANDLER, 'method': 'playlive', 'IsPlayable': True, 'custom_title': custom_title, 'tagline': custom_title, 'id': str(item.get('id', '')), 'label': '%s: %s' % (item.get('title', {}).get('headline', ''), item.get('headline', '')), 'title': item.get('headline', ''), 'originaltitle': item.get('originalHeadline', ''), 'tvshowtitle': item.get('title', {}).get('headline'), 'duration': (item.get('duration', 0) or 0) / 1000, 'year': item.get('title', {}).get('releaseYear', ''), 'country': item.get('countries', []), 'genre': item.get('genresNames', []), 'cast': item.get('castNames', []), 'director': item.get('directorsNames', []), 'writer': item.get('screenwritersNames', []), 'credits': item.get('artDirectorsNames', []), 'mpaa': (item.get('title', {}) or {}).get('contentRating', ''), 'plot': item.get('description', ''), 'mediatype': 'video', # "video", "movie", "tvshow", "season", "episode" or "musicvideo" 'art': { 'thumb': item.get('thumb', LOGO), 'fanart': item.get('title', {}).get('cover', {}).get('web', FANART), # 'poster': ((item.get('title', {}) or {}).get('poster', {}) or {}).get('web'), 'icon': ((item.get('title', {}) or {}).get('logo', {}) or {}).get('web'), } } if items.get('hasNextPage', False): yield { 'handler': __name__, 'method': 'get_thumb_offer', 'id': id, 'page': items.get('nextPage'), 'label': '%s (%s)' % (control.lang(34136).encode('utf-8'), page), 'art': { 'poster': control.addonNext(), 'fanart': FANART }, 'properties': { 'SpecialSort': 'bottom' } }
def search(term, page=1, limit=20): params = { 'query': urllib.quote_plus(term), 'limit': limit, 'offset': (page-1) * limit, 'onlyMyPackages': 'Y', 'onlyTvVas': 'N', 'order': '', 'type': ['live:tv', 'tv_channels:tv_single_row', 'moviesvod:movies', 'series:tv'], # 'type': ['series:tv', 'moviesvod:movies'], 'channel': PLATFORM } url = 'https://www.nowonline.com.br/avsclient/contents/search?{qs}'.format(qs=urllib.urlencode(params, True)) response = request_logged_in(url).get('response', []) or [] has_more_pages = False for section in response: if not has_more_pages and int(section.get('total', 0)) > (int(section.get('startIndex', 0)) + int(section.get('maxResult', 0))): has_more_pages = True live_tv = section.get('category') in ['tv_channels', 'live'] for item in section.get('results', []) or []: if live_tv: result = scraper_live.hydrate_channel(item) else: result = _hydrate_content(item) result.update({ 'studio': 'Now Online' }) yield result if has_more_pages: yield { 'handler': __name__, 'method': 'search', 'term': term, 'page': page + 1, 'limit': limit, 'label': control.lang(34136).encode('utf-8'), 'art': { 'poster': control.addonNext(), 'fanart': FANART }, 'properties': { 'SpecialSort': 'bottom' } }
def my_downloads_to_listItem(self, page): try: from datetime import datetime import time sysaddon, syshandle = argv[0], int(argv[1]) my_downloads, pages = self.downloads(page) except: my_downloads = None if not my_downloads: return extensions = supported_video_extensions() my_downloads = [i for i in my_downloads if i['download'].lower().endswith(tuple(extensions))] downloadMenu, deleteMenu = getLS(40048), getLS(40050) for count, item in enumerate(my_downloads, 1): if page > 1: count += (page-1) * 50 try: cm = [] try: datetime_object = datetime.strptime(item['generated'], FormatDateTime).date() except TypeError: datetime_object = datetime(*(time.strptime(item['generated'], FormatDateTime)[0:6])).date() name = string_tools.strip_non_ascii_and_unprintable(item['filename']) size = float(int(item['filesize'])) / 1073741824 label = '%02d | %.2f GB | %s | [I]%s [/I]' % (count, size, datetime_object, name) url_link = item['download'] url = '%s?action=play_URL&url=%s' % (sysaddon, url_link) cm.append((downloadMenu, 'RunPlugin(%s?action=download&name=%s&image=%s&url=%s&caller=realdebrid)' % (sysaddon, quote_plus(name), quote_plus(rd_icon), url_link))) cm.append((deleteMenu % 'File', 'RunPlugin(%s?action=rd_DeleteDownload&id=%s&name=%s)' % (sysaddon, item['id'], name))) item = control.item(label=label, offscreen=True) item.addContextMenuItems(cm) item.setArt({'icon': rd_icon, 'poster': rd_icon, 'thumb': rd_icon, 'fanart': addonFanart, 'banner': rd_icon}) item.setInfo(type='video', infoLabels='') control.addItem(handle=syshandle, url=url, listitem=item, isFolder=False) except: log_utils.error() if page < pages: page += 1 next = True else: next = False if next: try: nextMenu = getLS(32053) url = '%s?action=rd_MyDownloads&query=%s' % (sysaddon, page) page = ' [I](%s)[/I]' % page nextMenu = '[COLOR skyblue]' + nextMenu + page + '[/COLOR]' item = control.item(label=nextMenu, offscreen=True) icon = control.addonNext() item.setArt({'icon': rd_icon, 'poster': rd_icon, 'thumb': rd_icon, 'fanart': addonFanart, 'banner': rd_icon}) control.addItem(handle=syshandle, url=url, listitem=item, isFolder=True) except: log_utils.error() control.content(syshandle, 'files') control.directory(syshandle, cacheToDisc=True)
def index(self): txtfilter = self.getFilter() if not txtfilter: txtfilter = "none" self.addDir('[B]Current filter:[/B] ' + txtfilter, '', 'openSettings', '', Folder=False) html = client.request(self.base_link) blogpage = re.compile("content='([^']+)' itemprop='image_url'.*?href='([^']+)'>([^<]+)<", re.DOTALL | re.IGNORECASE).findall(html) for img, url, name in blogpage: self.addDir(name, url, 'listStreams', img) try: nextp = re.compile("'blog-pager-older-link' href='([^']+)'", re.DOTALL | re.IGNORECASE).findall(html)[0] nextp = nextp.replace('&', '&') self.addDir(control.lang(32053).encode('utf-8'), nextp, 'liveTV', control.addonNext()) except: pass xbmcplugin.endOfDirectory(syshandle)
def get_broadcastthumb_offer(id, page=1, per_page=200): query = 'query%20getLocalizedOffer%28%24id%3A%20ID%21%2C%20%24affiliateCode%3A%20String%29%20%7B%0A%20%20localizedOffer%28id%3A%20%24id%2C%20affiliateCode%3A%20%24affiliateCode%29%20%7B%0A%20%20%20%20__typename%0A%20%20%20%20...%20on%20LocalizedOffer%20%7B%0A%20%20%20%20%20%20contentType%0A%20%20%20%20%20%20paginatedItems%20%7B%0A%20%20%20%20%20%20%20%20resources%20%7B%0A%20%20%20%20%20%20%20%20%20%20__typename%0A%20%20%20%20%20%20%20%20%20%20...%20on%20Broadcast%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20transmissionId%0A%20%20%20%20%20%20%20%20%20%20%20%20mediaId%0A%20%20%20%20%20%20%20%20%20%20%20%20channelId%0A%20%20%20%20%20%20%20%20%20%20%20%20slug%0A%20%20%20%20%20%20%20%20%20%20%20%20assets%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20previewUrl%28format%3A%20MP4%2C%20scale%3A%20X216%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20teaserUrl%28format%3A%20MP4%2C%20scale%3A%20X360%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20thumbUrl%28format%3A%20JPEG%2C%20scale%3A%20X360%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20__typename%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20media%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20headline%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20thumb%28size%3A%201080%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20liveThumbnail%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20__typename%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20mutedMediaId%0A%20%20%20%20%20%20%20%20%20%20%20%20promotionalMediaId%0A%20%20%20%20%20%20%20%20%20%20%20%20logo%3A%20trimmedLogo%28scale%3A%20X56%29%0A%20%20%20%20%20%20%20%20%20%20%20%20trimmedLogo%0A%20%20%20%20%20%20%20%20%20%20%20%20channel%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20logo%3A%20trimmedLogo%28scale%3A%20X56%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20pageIdentifier%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20__typename%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20epgCurrentSlots%28limit%3A%201%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20startTime%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20endTime%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20programId%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20liveBroadcast%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20durationInMinutes%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20title%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20titleId%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20description%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cover%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20portrait%3A%20portrait%28scale%3A%20X768%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20landscape%3A%20landscape%28scale%3A%20X720%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20__typename%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20__typename%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20__typename%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20imageOnAir%3A%20imageOnAir%28scale%3A%20X720%29%0A%20%20%20%20%20%20%20%20%20%20%20%20__typename%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20page%0A%20%20%20%20%20%20%20%20perPage%0A%20%20%20%20%20%20%20%20nextPage%0A%20%20%20%20%20%20%20%20hasNextPage%0A%20%20%20%20%20%20%20%20__typename%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20contentType%0A%20%20%20%20%20%20__typename%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D' variables = '{{"id":"{id}","affiliateCode":null,"page":{page},"perPage":{per_page}}}'.format( id=id, page=page, per_page=per_page) page = request_query(query, variables).get('data', {}).get('localizedOffer', {}).get('paginatedItems', {}) for item in page.get('resources', []): media = item.get('media', {}) or {} yield { 'handler': PLAYER_HANDLER, 'method': 'playlive', 'IsPlayable': True, 'livefeed': True, 'id': item.get('mediaId'), 'label': media.get('headline', ''), 'title': media.get('headline', ''), 'mediatype': 'video', 'art': { 'thumb': '%s?v=%s' % (media.get('liveThumbnail', FANART) or FANART, str(int(time.time()))), 'fanart': item.get('imageOnAir', FANART), 'icon': item.get('logo') } } if page.get('hasNextPage', False): yield { 'handler': __name__, 'method': 'get_broadcastthumb_offer', 'id': id, 'page': page.get('nextPage'), 'label': '%s (%s)' % (control.lang(34136).encode('utf-8'), page), 'art': { 'poster': control.addonNext(), 'fanart': FANART }, 'properties': { 'SpecialSort': 'bottom' } }
def get_genres(id, page=1): query = 'query%20allCategoriesQuery(%24page%3A%20Int%2C%20%24perPage%3A%20Int%2C%20%24parentCategoryId%3A%20ID)%20%7B%0A%20%20categories(page%3A%20%24page%2C%20perPage%3A%20%24perPage%2C%20parentCategoryId%3A%20%24parentCategoryId)%20%7B%0A%20%20%20%20page%0A%20%20%20%20hasNextPage%0A%20%20%20%20nextPage%0A%20%20%20%20resources%20%7B%0A%20%20%20%20%20%20name%0A%20%20%20%20%20%20background%0A%20%20%20%20%20%20navigation%20%7B%0A%20%20%20%20%20%20%20%20...%20on%20MenuSlugNavigation%20%7B%0A%20%20%20%20%20%20%20%20%20%20slug%0A%20%20%20%20%20%20%20%20%20%20__typename%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20...%20on%20MenuPageNavigation%20%7B%0A%20%20%20%20%20%20%20%20%20%20identifier%0A%20%20%20%20%20%20%20%20%20%20__typename%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20__typename%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20__typename%0A%20%20%20%20%7D%0A%20%20%20%20__typename%0A%20%20%7D%0A%7D%0A' variables = '{{"page":{page},"perPage":200,"parentCategoryId":"{id}"}}'.format(page=page, id=id) response = request_query(query, variables) or {} categories = response.get('data', {}).get('categories', {}) resources = categories.get('resources', []) for resource in resources: yield { 'handler': __name__, 'method': 'get_videos', 'label': resource.get('name', ''), 'slug': resource.get('navigation', {}).get('identifier'), 'art': { 'thumb': resource.get('background', LOGO), 'fanart': FANART } } if categories.get('hasNextPage', False): yield { 'handler': __name__, 'method': 'get_genres', 'page': categories.get('nextPage'), 'id': id, 'label': '%s (%s)' % (control.lang(34136).encode('utf-8'), page), 'art': { 'poster': control.addonNext(), 'fanart': FANART }, 'properties': { 'SpecialSort': 'bottom' } }
def scrape4(self, url): try: headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0', 'Referer': self.base4_link } html = client.request(url, headers=headers) if '/watch-' in url: contents = re.compile( '<p style="text-align: center;">(.+?)</p>', re.DOTALL).findall(html) for content in contents: links = re.compile( '<a href="(.+?)" class="small cool-blue vision-button" target="_blank">(.+?)</a>', re.DOTALL).findall(content) for link, info1 in links: if 'pakfashionstore.com' in link: link = self.cleanURL(link) sourcepage = client.request(link, headers=headers) try: try: link = re.compile( '<iframe.+?src="(.+?)"', flags=re.DOTALL | re.IGNORECASE).findall(sourcepage)[0] except: link = re.compile( "<iframe.+?src='(.+?)'", flags=re.DOTALL | re.IGNORECASE).findall(sourcepage)[0] except: link = link CustomResolved = self.resolve(link) if CustomResolved: link = CustomResolved Blocked = self.checkURL(link) if Blocked: continue icon = re.compile('<img.+?src="(.+?)"', re.DOTALL).findall(html)[0] elements = urlparse.urlparse(link) host = elements.netloc title = '[B]%s[/B] - %s' % (host.replace('www.', ''), info1) item = control.item(label=title) item.setProperty("IsPlayable", "true") item.setArt({"thumb": icon, "icon": icon}) item.setInfo(type="video", infoLabels={ "title": title, "mediatype": "video" }) link = '%s?action=wrestlingPlay&url=%s' % (sysaddon, link) self.items.append((link, item, False)) else: page = client.parseDOM( html, 'div', attrs={'class': 'loop-content switchable-view grid-mini'})[0] contents = client.parseDOM(page, 'div', attrs={'class': 'thumb'}) for content in contents: title, link = re.compile( '<a class="clip-link" .+? title="(.+?)" href="(.+?)">', re.DOTALL).findall(content)[0] icon = re.compile('<img src="(.+?)"', re.DOTALL).findall(content)[0] item = control.item(label=title) item.setArt({"thumb": icon, "icon": icon}) link = '%s?action=wrestlingScrape&url=%s' % (sysaddon, link) self.items.append((link, item, True)) try: navi_link = re.compile('<link rel="next" href="(.+?)" />', re.DOTALL).findall(html)[0] next_url = '%s?action=wrestlingScrape&url=%s' % (sysaddon, navi_link) item = control.item(label=control.lang(32053).encode('utf-8')) item.setArt({ "thumb": control.addonNext(), "icon": control.addonNext() }) self.items.append((next_url, item, True)) except: pass if not self.items: self.errorForSources() self.addDirectoryItem('No Results Found, Go Back to Menu?', 'wrestlingMenuAWL', self.art4_link, 'DefaultTVShows.png') except Exception: pass control.addItems(syshandle, self.items) self.endDirectory()
def get_offer(id, page=1): control.log('Globosat - GET OFFER: %s | page: %s' % (id, page)) variables = '{{"id":"{id}","page":{page},"perPage":200}}'.format(id=id, page=page) query = 'query%20getOffer%28%24id%3A%20ID%21%2C%20%24page%3A%20Int%2C%20%24perPage%3A%20Int%29%20%7B%0A%20%20genericOffer%28id%3A%20%24id%29%20%7B%0A%20%20%20%20...%20on%20Offer%20%7B%0A%20%20%20%20%20%20id%0A%20%20%20%20%20%20contentType%0A%20%20%20%20%20%20items%3A%20paginatedItems%28page%3A%20%24page%2C%20perPage%3A%20%24perPage%29%20%7B%0A%20%20%20%20%20%20%20%20page%0A%20%20%20%20%20%20%20%20nextPage%0A%20%20%20%20%20%20%20%20perPage%0A%20%20%20%20%20%20%20%20hasNextPage%0A%20%20%20%20%20%20%20%20resources%20%7B%0A%20%20%20%20%20%20%20%20%20%20...VideoFragment%0A%20%20%20%20%20%20%20%20%20%20...TitleFragment%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D%0Afragment%20VideoFragment%20on%20Video%20%7B%0A%20%20id%0A%20%20availableFor%0A%20%20headline%0A%20%20description%0A%20%20kind%0A%20%20duration%0A%20%20formattedDuration%0A%20%20thumb%0A%20%20liveThumbnail%0A%20%20title%20%7B%0A%20%20%20%20titleId%0A%20%20%20%20originProgramId%0A%20%20%20%20headline%0A%20%20%20%20description%0A%20%20%20%20slug%0A%20%20%20%20type%0A%20%20%20%20contentRating%0A%20%20%20%20contentRatingCriteria%0A%20%20%20%20releaseYear%0A%20%20%20%20countries%0A%20%20%20%20genresNames%0A%20%20%20%20directorsNames%0A%20%20%20%20artDirectorsNames%0A%20%20%20%20authorsNames%0A%20%20%20%20castNames%0A%20%20%20%20screenwritersNames%0A%20%20%20%20cover%20%7B%0A%20%20%20%20%20%20landscape%28scale%3A%20X1080%29%0A%20%20%20%20%20%20web%0A%20%20%20%20%7D%0A%20%20%20%20poster%20%7B%0A%20%20%20%20%20%20web%0A%20%20%20%20%7D%0A%20%20%20%20logo%20%7B%0A%20%20%20%20%20%20web%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20channel%20%7B%0A%20%20%20%20id%0A%20%20%20%20name%0A%20%20%20%20slug%0A%20%20%7D%0A%7D%0Afragment%20TitleFragment%20on%20Title%20%7B%0A%20%20titleId%0A%20%20originVideoId%0A%20%20originProgramId%0A%20%20slug%0A%20%20headline%0A%20%20originalHeadline%0A%20%20description%0A%20%20type%0A%20%20format%0A%20%20contentRating%0A%20%20contentRatingCriteria%0A%20%20releaseYear%0A%20%20channel%20%7B%0A%20%20%20%20id%0A%20%20%20%20name%0A%20%20%20%20slug%0A%20%20%7D%0A%20%20cover%20%7B%0A%20%20%20%20%20%20landscape%28scale%3A%20X1080%29%0A%20%20%20%20%20%20web%0A%20%20%20%20%7D%0A%20%20poster%20%7B%0A%20%20%20%20web%0A%20%20%7D%0A%20%20logo%20%7B%0A%20%20%20%20web%0A%20%20%7D%0A%20%20countries%0A%20%20genresNames%0A%20%20directorsNames%0A%20%20artDirectorsNames%0A%20%20authorsNames%0A%20%20castNames%0A%20%20screenwritersNames%0A%7D' generic_offer = request_query(query, variables).get('data', {}).get('genericOffer', {}) content_type = generic_offer.get('contentType') items = generic_offer.get('items', {}) resources = items.get('resources', []) for resource in resources: if content_type == 'VIDEO': title = resource.get('title', {}) video_id = resource.get('id') else: title = resource video_id = title.get('originVideoId') playable = title.get('type') == 'MOVIE' or content_type == 'VIDEO' yield { 'handler': PLAYER_HANDLER if playable else __name__, 'method': 'playlive' if playable else 'get_title', 'id': video_id, 'IsPlayable': playable, 'title_id': title.get('titleId'), 'label': resource.get('headline', title.get('headline')), 'title': resource.get('headline', title.get('headline')), 'tvshowtitle': title.get('headline') if title.get('type') in ['SERIE', 'TV_PROGRAM'] else None, 'plot': resource.get('description', title.get('description')), 'year': title.get('releaseYear'), 'originaltitle': title.get('originalHeadline', ''), 'country': title.get('countries', []), 'genre': title.get('genresNames', []), 'cast': title.get('castNames', []), 'director': title.get('directorsNames', []), 'writer': title.get('screenwritersNames', []), 'credits': title.get('artDirectorsNames', []), 'tag': title.get('contentRatingCriteria'), 'mpaa': title.get('contentRating'), 'studio': title.get('channel', {}).get('name'), 'duration': resource.get('duration', 0) / 1000, 'mediatype': 'episode' if resource.get('kind') == 'episode' else 'movie' if title.get('type') == 'MOVIE' else 'tvshow', 'art': { 'clearlogo': (title.get('logo', {}) or {}).get('web'), 'thumb': resource.get('thumb'), 'poster': resource.get('poster', {}).get('web') if resource.get('kind') != 'episode' else None, 'tvshow.poster': title.get('poster', {}).get('web') if resource.get('kind') == 'episode' else None, 'fanart': title.get('cover', {}).get('landscape', FANART) } } has_next_page = items.get('hasNextPage', False) page = items.get('nextPage', 0) if has_next_page: yield { 'handler': __name__, 'method': 'get_offer', 'id': id, 'page': page, 'label': '%s (%s)' % (control.lang(34136).encode('utf-8'), page), 'art': { 'poster': control.addonNext(), 'fanart': FANART }, 'properties': { 'SpecialSort': 'bottom' } }
def search(term, page=1): if not term: return query = 'query%20search%28%24query%3A%20String%21%2C%20%24page%3A%20Int%29%20%7B%0A%20%20search%20%7B%0A%20%20%20%20titles%28query%3A%20%24query%2C%20page%3A%20%24page%29%20%7B%0A%20%20%20%20%20%20...titlesCollection%0A%20%20%20%20%7D%0A%20%20%20%20videos%28query%3A%20%24query%2C%20page%3A%20%24page%29%20%7B%0A%20%20%20%20%20%20...videosCollection%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D%0Afragment%20titlesCollection%20on%20TitleCollection%20%7B%0A%20%20page%0A%20%20perPage%0A%20%20hasNextPage%0A%20%20nextPage%0A%20%20total%0A%20%20resources%20%7B%0A%20%20%20%20id%0A%20%20%20%20titleId%0A%20%20%20%20slug%0A%20%20%20%20headline%0A%20%20%20%20originalHeadline%0A%20%20%20%20description%0A%20%20%20%20originVideoId%0A%20%20%20%20originProgramId%0A%20%20%20%20type%0A%20%20%20%20format%0A%20%20%20%20contentRating%0A%20%20%20%20contentRatingCriteria%0A%20%20%20%20releaseYear%0A%20%20%20%20channel%20%7B%0A%20%20%20%20%20%20id%0A%20%20%20%20%20%20name%0A%20%20%20%20%20%20slug%0A%20%20%20%20%7D%0A%20%20%20%20cover%20%7B%0A%20%20%20%20%20%20%20%20landscape%28scale%3A%20X1080%29%0A%20%20%20%20%20%20%20%20web%0A%20%20%20%20%20%20%7D%0A%20%20%20%20poster%20%7B%0A%20%20%20%20%20%20web%0A%20%20%20%20%7D%0A%20%20%20%20logo%20%7B%0A%20%20%20%20%20%20web%0A%20%20%20%20%7D%0A%20%20%20%20countries%0A%20%20%20%20genresNames%0A%20%20%20%20directorsNames%0A%20%20%20%20artDirectorsNames%0A%20%20%20%20authorsNames%0A%20%20%20%20castNames%0A%20%20%20%20screenwritersNames%0A%20%20%20%20subset%20%7B%0A%20%20%20%20%20%20id%0A%20%20%20%20%7D%0A%20%20%20%20channel%20%7B%0A%20%20%20%20%20%20id%0A%20%20%20%20%20%20name%0A%20%20%20%20%20%20slug%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D%0Afragment%20videosCollection%20on%20VideoCollection%20%7B%0A%20%20page%0A%20%20perPage%0A%20%20hasNextPage%0A%20%20nextPage%0A%20%20total%0A%20%20resources%20%7B%0A%20%20%20%20id%0A%20%20%20%20kind%0A%20%20%20%20headline%0A%20%20%20%20liveThumbnail%0A%20%20%20%20thumb%0A%20%20%20%20title%20%7B%0A%20%20%20%20%20%20titleId%0A%20%20%20%20%20%20%20%20slug%0A%20%20%20%20%20%20%20%20headline%0A%20%20%20%20%20%20%20%20originalHeadline%0A%20%20%20%20%20%20%20%20description%0A%20%20%20%20%20%20%20%20originVideoId%0A%20%20%20%20%20%20%20%20originProgramId%0A%20%20%20%20%20%20%20%20type%0A%20%20%20%20%20%20%20%20format%0A%20%20%20%20%20%20%20%20contentRating%0A%20%20%20%20%20%20%20%20contentRatingCriteria%0A%20%20%20%20%20%20%20%20releaseYear%0A%20%20%20%20%20%20%20%20channel%20%7B%0A%20%20%20%20%20%20%20%20%20%20id%0A%20%20%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20%20%20slug%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20cover%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20landscape%28scale%3A%20X1080%29%0A%20%20%20%20%20%20%20%20%20%20%20%20web%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20poster%20%7B%0A%20%20%20%20%20%20%20%20%20%20web%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20logo%20%7B%0A%20%20%20%20%20%20%20%20%20%20web%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20countries%0A%20%20%20%20%20%20%20%20genresNames%0A%20%20%20%20%20%20%20%20directorsNames%0A%20%20%20%20%20%20%20%20artDirectorsNames%0A%20%20%20%20%20%20%20%20authorsNames%0A%20%20%20%20%20%20%20%20castNames%0A%20%20%20%20%20%20%20%20screenwritersNames%0A%20%20%20%20%7D%0A%20%20%20%20channel%20%7B%0A%20%20%20%20%20%20id%0A%20%20%20%20%20%20name%0A%20%20%20%20%20%20slug%0A%20%20%20%20%7D%0A%20%20%20%20availableFor%0A%20%20%20%20duration%0A%20%20%20%20formattedDuration%0A%20%20%20%20exhibitedAt%0A%20%20%7D%0A%7D' variables = '{{"query":"{term}","page":{page}}}'.format(term=term, page=page) response = request_query(query, variables).get('data', {}).get('search', {}) titles = response.get('titles', {}) provider = control.lang(31200).encode('utf-8') for title in titles.get('resources', []): playable = True if title.get('originVideoId') else False yield { 'handler': PLAYER_HANDLER if playable else __name__, 'method': 'playlive' if playable else 'get_title', 'title_id': title.get('titleId'), 'id': title.get('originVideoId'), 'program_id': title.get('originProgramId'), 'IsPlayable': playable, 'label': title.get('headline', ''), 'title': title.get('headline', ''), 'studio': title.get('channel', {}).get('name', provider), 'year': title.get('releaseYear', ''), 'originaltitle': title.get('originalHeadline', ''), 'country': title.get('countries', []), 'genre': title.get('genresNames', []), 'cast': title.get('castNames', []), 'director': title.get('directorsNames', []), 'writer': title.get('screenwritersNames', []), 'credits': title.get('artDirectorsNames', []), 'tag': title.get('contentRatingCriteria'), 'mpaa': title.get('contentRating', ''), 'plot': title.get('description', ''), 'mediatype': 'movie' if title.get('type', '') == 'MOVIE' else 'tvshow', # "video", "movie", "tvshow", "season", "episode" or "musicvideo" 'art': { 'poster': title.get('poster', {}).get('web'), 'clearlogo': title.get('logo', {}).get('web'), 'fanart': title.get('cover', {}).get('web', FANART) } } videos = response.get('videos', {}) or {} for video in videos.get('resources', []): title = video.get('title', {}) yield { 'handler': PLAYER_HANDLER, 'method': 'playlive', 'id': video.get('id'), 'program_id': title.get('originProgramId'), 'IsPlayable': True, 'label': video.get('headline', ''), 'title': video.get('headline', ''), 'tvshowtitle': title.get('headline', ''), 'studio': (title.get('channel', {}) or {}).get('name', provider), 'year': title.get('releaseYear', ''), 'originaltitle': title.get('originalHeadline', ''), 'country': title.get('countries', []), 'genre': title.get('genresNames', []), 'cast': title.get('castNames', []) or [], 'director': title.get('directorsNames', []), 'writer': title.get('screenwritersNames', []), 'credits': title.get('artDirectorsNames', []), 'tag': title.get('contentRatingCriteria'), 'mpaa': title.get('contentRating', ''), 'plot': title.get('description', ''), 'mediatype': 'episode', # "video", "movie", "tvshow", "season", "episode" or "musicvideo" 'art': { 'thumb': video.get('thumb', FANART) or FANART, 'tvshow.poster': title.get('poster', {}).get('web'), 'clearlogo': (title.get('logo', {}) or {}).get('web'), 'fanart': (title.get('cover', {}) or {}).get('web', FANART) } } if videos.get('hasNextPage', False) or titles.get('hasNextPage', False): yield { 'handler': __name__, 'method': 'search', 'term': term, 'page': videos.get('nextPage', titles.get('nextPage')), 'label': '%s (%s)' % (control.lang(34136).encode('utf-8'), page), 'art': { 'poster': control.addonNext(), 'fanart': FANART }, 'properties': { 'SpecialSort': 'bottom' } }
def get_episodes(title_id, season, page=1): variables = '{{"titleId":"{id}", "episodeTitlePage": {page}}}'.format( id=title_id, page=page) query = 'query%20fetchTitleQuery%28%24titleId%3A%20String%2C%20%24episodeTitlePage%3A%20Int%2C%20%24episodeTitlePerPage%3A%20Int%20%3D%20300%29%20%7B%0A%20%20title%28titleId%3A%20%24titleId%29%20%7B%0A%20%20%20%20...titleFragment%0A%20%20%7D%0A%7D%0Afragment%20titleFragment%20on%20Title%20%7B%0A%20%20titleId%0A%20%20slug%0A%20%20headline%0A%20%20description%0A%20%20originProgramId%0A%20%20type%0A%20%20format%0A%20%20contentRating%0A%20%20contentRatingCriteria%0A%20%20releaseYear%0A%20%20channel%20%7B%0A%20%20%20%20id%0A%20%20%20%20name%0A%20%20%20%20slug%0A%20%20%7D%0A%20%20cover%20%7B%0A%20%20%20%20%20%20landscape%28scale%3A%20X1080%29%0A%20%20%20%20%20%20web%0A%20%20%20%20%7D%0A%20%20poster%20%7B%0A%20%20%20%20web%0A%20%20%7D%0A%20%20logo%20%7B%0A%20%20%20%20web%0A%20%20%7D%0A%20%20countries%0A%20%20directors%20%7B%0A%20%20%20%20name%0A%20%20%7D%0A%20%20cast%20%7B%0A%20%20%20%20name%0A%20%20%7D%0A%20%20genres%20%7B%0A%20%20%20%20name%0A%20%20%7D%0A%20%20structure%20%7B%0A%20%20%20%20%20%20...seasonedStructureFragment%0A%20%20%20%20%20%20...filmPlaybackStructureFragment%0A%20%20%20%20%20%20...episodeListStructureFragment%0A%20%20%20%20%7D%0A%7D%0Afragment%20seasonedStructureFragment%20on%20SeasonedStructure%20%7B%0A%20%20seasons%20%7B%0A%20%20%20%20resources%20%7B%0A%20%20%20%20%20%20id%0A%20%20%20%20%20%20number%0A%20%20%20%20%20%20titleId%0A%20%20%20%20%20%20totalEpisodes%0A%20%20%20%20%20%20episodes%28page%3A%20%24episodeTitlePage%2C%20perPage%3A%20%24episodeTitlePerPage%29%20%7B%0A%20%20%20%20%20%20%20%20page%0A%20%20%20%20%20%20%20%20hasNextPage%0A%20%20%20%20%20%20%20%20nextPage%0A%20%20%20%20%20%20%20%20resources%20%7B%0A%20%20%20%20%20%20%20%20%20%20number%0A%20%20%20%20%20%20%20%20%20%20seasonNumber%0A%20%20%20%20%20%20%20%20%20%20seasonId%0A%20%20%20%20%20%20%20%20%20%20video%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20id%0A%20%20%20%20%20%20%20%20%20%20%20%20exhibitedAt%0A%20%20%20%20%20%20%20%20%20%20%20%20encrypted%0A%20%20%20%20%20%20%20%20%20%20%20%20availableFor%0A%20%20%20%20%20%20%20%20%20%20%20%20headline%0A%20%20%20%20%20%20%20%20%20%20%20%20description%0A%20%20%20%20%20%20%20%20%20%20%20%20thumb%0A%20%20%20%20%20%20%20%20%20%20%20%20duration%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D%0Afragment%20filmPlaybackStructureFragment%20on%20FilmPlaybackStructure%20%7B%0A%20%20videoPlayback%20%7B%0A%20%20%20%20id%0A%20%20%20%20exhibitedAt%0A%20%20%20%20encrypted%0A%20%20%20%20availableFor%0A%20%20%20%20headline%0A%20%20%20%20description%0A%20%20%20%20thumb%0A%20%20%20%20duration%0A%20%20%7D%0A%7D%0Afragment%20episodeListStructureFragment%20on%20EpisodeListStructure%20%7B%0A%20%20episodes%28page%3A%20%24episodeTitlePage%2C%20perPage%3A%20%24episodeTitlePerPage%29%20%7B%0A%20%20%20%20page%0A%20%20%20%20hasNextPage%0A%20%20%20%20nextPage%0A%20%20%20%20resources%20%7B%0A%20%20%20%20%20%20id%0A%20%20%20%20%20%20number%0A%20%20%20%20%20%20seasonNumber%0A%20%20%20%20%20%20seasonId%0A%20%20%20%20%20%20video%20%7B%0A%20%20%20%20%20%20%20%20id%0A%20%20%20%20%20%20%20%20exhibitedAt%0A%20%20%20%20%20%20%20%20encrypted%0A%20%20%20%20%20%20%20%20availableFor%0A%20%20%20%20%20%20%20%20headline%0A%20%20%20%20%20%20%20%20description%0A%20%20%20%20%20%20%20%20thumb%0A%20%20%20%20%20%20%20%20duration%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D' title = request_query(query, variables)['data']['title'] if not title.get('structure', {}): return structure = title['structure'] if 'seasons' not in structure: return season_resource = next( (s for s in structure.get('seasons', {}).get('resources', []) if s.get('number', 0) == season), {}) if not season_resource: return episodes = (season_resource.get('episodes', {}) or {}) for episode in episodes.get('resources', []): video = episode.get('video', {}) yield { 'handler': PLAYER_HANDLER, 'method': 'playlive', 'IsPlayable': True, 'id': video.get('id'), 'label': video.get('headline', ''), 'title': video.get('headline', ''), 'plot': video.get('description', ''), 'duration': video.get('duration', 0) / 1000, 'episode': episode.get('number'), 'season': episode.get('seasonNumber'), 'mediatype': 'episode', 'tvshowtitle': title.get('headline'), 'year': title.get('releaseYear'), 'country': [ c.get('name') for c in title.get('countries', []) if 'name' in c and c['name'] ], 'genre': [ c.get('name') for c in title.get('genres', []) if 'name' in c and c['name'] ], 'cast': [ c.get('name') for c in title.get('cast', []) if 'name' in c and c['name'] ], 'director': [ c.get('name') for c in title.get('directors', []) if 'name' in c and c['name'] ], 'mpaa': title.get('contentRating'), 'studio': title.get('channel', {}).get('name'), 'dateadded': video.get('exhibitedAt', '').replace('Z', '').replace('T', ' '), 'aired': (video.get('exhibitedAt', '') or '').split('T')[0], 'sort': control.SORT_METHOD_EPISODE, 'art': { 'thumb': video.get('thumb'), 'fanart': title.get('cover', {}).get('landscape', FANART), 'tvshow.poster': title.get('poster', {}).get('web'), } } page = episodes.get('nextPage', 0) if episodes.get('hasNextPage', False) else 0 if page > 0: yield { 'handler': __name__, 'method': 'get_episodes', 'title_id': title_id, 'season': season, 'page': page, 'label': '%s (%s)' % (control.lang(34136).encode('utf-8'), page), 'art': { 'poster': control.addonNext(), 'fanart': FANART }, 'properties': { 'SpecialSort': 'bottom' } }
def search(term, page=1, limit=20): params = { 'q': term, 'orderby': 'DateDescending', 'page': page, 'limit': limit, 'offerids': urllib.quote_plus(','.join(get_offers())), 'maxRating': 18 } url = 'https://apim.oi.net.br/app/oiplay/ummex/v1/search?%s' % urllib.urlencode( params) try: response = request_cached(url) or [] except: control.log(traceback.format_exc(), control.LOGERROR) response = [] hosts = get_subscribed_host_ids() for item in response: provider = next((cp for cp in item.get('contentProviders', []) if cp.get('hostId') in hosts), {}) if not provider: continue yield { 'handler': __name__, 'method': 'get_content', 'id': item.get('tmsId'), 'studio': u'Oi Play', 'label': item.get('title'), 'title': item.get('title'), 'tvshowtitle': item.get('seriesTitle'), 'plot': item.get('synopsis'), 'genre': item.get('genres'), 'year': item.get('releaseYear'), 'episode': item.get('episodeNumber'), 'season': item.get('seasonNumber'), 'mpaa': item.get('rating'), 'duration': item.get('durationInSeconds', 0), 'setCast': [{ 'name': cast.get('name'), 'thumbnail': cast.get('photoUrl'), } for cast in item.get('castMembers', []) or []], 'directors': item.get('directors'), 'playType': item.get('playType'), 'adult': item.get('isAdult'), 'mediatype': 'movie' if item.get('itemType') == 'Movie' else 'tvshow' if item.get('itemType') == 'Serie' else 'video', 'art': { 'thumb': next((image.get('url') for image in item.get('programImages', []) if image.get('type') == 'Thumbnail'), LOGO), 'posterr': next((image.get('url') for image in item.get('programImages', []) if image.get('type') == 'Thumbnail'), LOGO), 'fanart': next((image.get('url') for image in item.get('programImages', []) if image.get('type') == 'Backdrop'), FANART), } } if len(response) >= limit: yield { 'handler': __name__, 'method': 'search', 'term': term, 'page': page + 1, 'limit': limit, 'label': control.lang(34136).encode('utf-8'), 'art': { 'poster': control.addonNext(), 'fanart': FANART }, 'properties': { 'SpecialSort': 'bottom' } }
def get_page(path, absolute=False): control.log('get_page: %s' % path) if not path: return if path == '/account/profiles/mylist': path = '/account/profile/user-tracks' if path.startswith('/account/') or absolute: url = path else: url = '/pages?id=' + path use_pagination = control.setting('telecine_use_pagination') == 'true' while url: response = get_cached(BASE_URL + url) template = response.get('template') control.log('template: %s' % template) if not template or template == 'Cinelist': entry = next(iter(response.get('entries', [])), response) list_obj = entry.get('list', response) # image_size = 'poster' if 'poster' in entry.get('template', 'poster').lower() else 'thumb' for item in list_obj.get('items', []): category = item.get('category', '').split('/') has_category = category and len(category) == 3 genre = category[0] if has_category else None subgenre = category[1] if has_category else None year = category[2] if has_category else None yield { 'handler': HANDLER, 'method': 'get_film' if item.get('path').startswith('/filme/') else 'get_page', 'id': item.get('id'), 'path': item.get('path'), 'label': item.get('name'), 'plot': item.get('mouseOverDescription', response.get('description')), 'genre': [genre, subgenre], 'year': year, 'overlay': 5 if item.get('percentWatched', 0) > 0.9 else 4, 'mediatype': 'movie' if item.get('originalImageUrl') else None, 'art': { 'poster': item.get('originalImageUrl', FANART), 'thumb': FANART if not item.get('originalImageUrl') else None, 'fanart': FANART }, 'properties': { 'playcount': 1 if item.get('percentWatched', 0) > 0.9 else 0 } } url = list_obj.get('paging', {}).get('next') if url and use_pagination: yield { 'handler': HANDLER, 'method': 'get_page', 'absolute': True, 'path': list_obj.get('paging', {}).get('next'), 'label': control.lang(34136).encode('utf-8'), 'art': { 'poster': control.addonNext(), 'fanart': FANART }, 'properties': { 'SpecialSort': 'bottom' } } url = None else: fanart = FANART for index, item in enumerate(response.get('entries', [])): list_type = item.get('type') if list_type in ['TextEntry', 'ImageEntry']: fanart = item.get('originalImageUrl', FANART) continue image_size = 'poster' if 'poster' in item.get( 'template', 'poster') else 'thumb' if list_type == 'UserEntry': path = item.get('list', {}).get('paging', {}).get('next') else: path = item.get('list', {}).get('path') yield { 'handler': HANDLER, 'method': 'get_page', 'path': path, 'label': item.get('title', item.get('text', '')) or control.lang(34132).encode('utf-8'), 'plot': response.get('description'), 'sorttitle': "%04d" % (index, ), 'sort': [ control.SORT_METHOD_VIDEO_SORT_TITLE, control.SORT_METHOD_LABEL ], 'art': { image_size: item.get('originalImageUrl', FANART), 'fanart': item.get('originalImageUrl', fanart) } } url = None
def movieDirectory(self, items): if items == None or len(items) == 0: control.idle() ; sys.exit() sysaddon = sys.argv[0] syshandle = int(sys.argv[1]) addonPoster, addonBanner = control.addonPoster(), control.addonBanner() addonFanart, settingFanart = control.addonFanart(), control.setting('fanart') traktCredentials = trakt.getTraktCredentialsInfo() try: isOld = False ; control.item().getArt('type') except: isOld = True isEstuary = True if 'estuary' in control.skin else False isPlayable = 'true' if not 'plugin' in control.infoLabel('Container.PluginName') else 'false' indicators = playcount.getMovieIndicators(refresh=True) if action == 'movies' else playcount.getMovieIndicators() playbackMenu = control.lang(32063).encode('utf-8') if control.setting('hosts.mode') == '2' else control.lang(32064).encode('utf-8') watchedMenu = control.lang(32068).encode('utf-8') if trakt.getTraktIndicatorsInfo() == True else control.lang(32066).encode('utf-8') unwatchedMenu = control.lang(32069).encode('utf-8') if trakt.getTraktIndicatorsInfo() == True else control.lang(32067).encode('utf-8') queueMenu = control.lang(32065).encode('utf-8') traktManagerMenu = control.lang(32070).encode('utf-8') nextMenu = control.lang(32053).encode('utf-8') for i in items: try: label = '%s (%s)' % (i['title'], i['year']) imdb, title, year = i['imdb'], i['originaltitle'], i['year'] sysname = urllib.quote_plus('%s (%s)' % (title, year)) systitle = urllib.quote_plus(title) poster, banner, fanart = i['poster'], i['banner'], i['fanart'] if banner == '0' and not fanart == '0': banner = fanart elif banner == '0' and not poster == '0': banner = poster if poster == '0': poster = addonPoster if banner == '0': banner = addonBanner meta = dict((k,v) for k, v in i.iteritems() if not v == '0') meta.update({'mediatype': 'movie'}) #meta.update({'trailer': '%s?action=trailer&name=%s' % (sysaddon, sysname)}) meta.update({'trailer': 'plugin://script.extendedinfo/?info=playtrailer&&id=%s' % imdb}) if i['duration'] == '0': meta.update({'duration': '120'}) try: meta.update({'duration': str(int(meta['duration']) * 60)}) except: pass try: meta.update({'genre': cleangenre.lang(meta['genre'], self.lang)}) except: pass if isEstuary == True: try: del meta['cast'] except: pass sysmeta = urllib.quote_plus(json.dumps(meta)) url = '%s?action=play&title=%s&year=%s&imdb=%s&meta=%s&t=%s' % (sysaddon, systitle, year, imdb, sysmeta, self.systime) sysurl = urllib.quote_plus(url) path = '%s?action=play&title=%s&year=%s&imdb=%s' % (sysaddon, systitle, year, imdb) cm = [] cm.append((queueMenu, 'RunPlugin(%s?action=queueItem)' % sysaddon)) try: overlay = int(playcount.getMovieOverlay(indicators, imdb)) if overlay == 7: cm.append((unwatchedMenu, 'RunPlugin(%s?action=moviePlaycount&imdb=%s&query=6)' % (sysaddon, imdb))) meta.update({'playcount': 1, 'overlay': 7}) else: cm.append((watchedMenu, 'RunPlugin(%s?action=moviePlaycount&imdb=%s&query=7)' % (sysaddon, imdb))) meta.update({'playcount': 0, 'overlay': 6}) except: pass if traktCredentials == True: cm.append((traktManagerMenu, 'RunPlugin(%s?action=traktManager&name=%s&imdb=%s&content=movie)' % (sysaddon, sysname, imdb))) cm.append((playbackMenu, 'RunPlugin(%s?action=alterSources&url=%s&meta=%s)' % (sysaddon, sysurl, sysmeta))) if isOld == True: cm.append((control.lang2(19033).encode('utf-8'), 'Action(Info)')) item = control.item(label=label) item.setArt({'icon': poster, 'thumb': poster, 'poster': poster, 'banner': banner}) if settingFanart == 'true' and not fanart == '0': item.setProperty('Fanart_Image', fanart) elif not addonFanart == None: item.setProperty('Fanart_Image', addonFanart) item.addContextMenuItems(cm) item.setProperty('IsPlayable', isPlayable) item.setInfo(type='Video', infoLabels = meta) control.addItem(handle=syshandle, url=url, listitem=item, isFolder=False) except: pass try: url = items[0]['next'] if url == '': raise Exception() icon = control.addonNext() url = '%s?action=moviePage&url=%s' % (sysaddon, urllib.quote_plus(url)) item = control.item(label=nextMenu) item.setArt({'icon': icon, 'thumb': icon, 'poster': icon, 'banner': icon}) if not addonFanart == None: item.setProperty('Fanart_Image', addonFanart) control.addItem(handle=syshandle, url=url, listitem=item, isFolder=True) except: pass control.content(syshandle, 'movies') #control.do_block_check(False) control.directory(syshandle, cacheToDisc=True) views.setView('movies', {'skin.confluence': 500})
def scrape3(self, url): try: headers = { 'User-Agent': client.agent(), 'Referer': self.base3_link } html = client.request(url, headers=headers) if '/category/' in url: page = client.parseDOM( html, 'div', attrs={'class': 'main-content-col-body'})[0] contents = client.parseDOM(page, 'div', attrs={'class': 'entry-content'}) for content in contents: link, title = re.compile( '<a href=(.+?) target=_self title="(.+?)">', re.DOTALL).findall(content)[0] icon = re.compile('<img src=(.+?) alt style>', re.DOTALL).findall(content)[0] item = control.item(label=title) item.setArt({"thumb": icon, "icon": icon}) link = '%s?action=wrestlingScrape&url=%s' % (sysaddon, link) self.items.append((link, item, True)) else: contents = re.compile( '<p style="text-align: center;">(.+?)</p>', re.DOTALL).findall(html) for content in contents: links = re.compile( '<a class=.+?href="(.+?)" target=_blank.+?>(.+?)</a>', re.DOTALL).findall(content) for link, info1 in links: if 'education-load.com' in link: sourcepage = client.request(link, headers=headers) try: try: link = re.compile( '<iframe.+?src="(.+?)"', flags=re.DOTALL | re.IGNORECASE | re.MULTILINE).findall(sourcepage)[0] except: link = re.compile( "<iframe.+?src='(.+?)'", flags=re.DOTALL | re.IGNORECASE | re.MULTILINE).findall(sourcepage)[0] except: link = link CustomResolved = self.resolve(link) if CustomResolved: link = CustomResolved Blocked = self.checkURL(link) if Blocked: continue icon = re.compile('<img.+?src="(.+?)"', re.DOTALL).findall(html)[0] elements = urlparse.urlparse(link) host = elements.netloc title = '[B]%s[/B] - %s' % (host.replace('www.', ''), info1) item = control.item(label=title) item.setProperty("IsPlayable", "true") item.setArt({"thumb": icon, "icon": icon}) item.setInfo(type="video", infoLabels={ "title": title, "mediatype": "video" }) link = '%s?action=wrestlingPlay&url=%s' % (sysaddon, link) self.items.append((link, item, False)) try: navi_link = re.compile('<link rel=next href=(.+?)>', re.DOTALL).findall(html)[0] next_url = '%s?action=wrestlingScrape&url=%s' % (sysaddon, navi_link) item = control.item(label=control.lang(32053).encode('utf-8')) item.setArt({ "thumb": control.addonNext(), "icon": control.addonNext() }) self.items.append((next_url, item, True)) except: pass if not self.items: self.errorForSources() self.addDirectoryItem('No Results Found, Go Back to Menu?', 'wrestlingMenu24', self.art3_link, 'DefaultTVShows.png') except Exception: pass control.addItems(syshandle, self.items) self.endDirectory()
def addDirectory(self, items, content): if items == None or len(items) == 0: return #control.idle() ; sys.exit() sysaddon = sys.argv[0] syshandle = int(sys.argv[1]) addonFanart, addonThumb, artPath = control.addonFanart( ), control.addonThumb(), control.artPath() playRandom = control.lang(32535) nextMenu = control.lang(32053) for i in items: try: name = i['name'] plot = i['plot'] or '[CR]' if i['image'].startswith('http'): thumb = i['image'] elif not artPath == None: thumb = os.path.join(artPath, i['image']) else: thumb = addonThumb try: item = control.item(label=name, offscreen=True) except: item = control.item(label=name) item.setArt({ 'icon': thumb, 'thumb': thumb, 'poster': thumb, 'fanart': addonFanart }) item.setInfo(type='video', infoLabels={'plot': plot}) cm = [] if content == 'movies': link = urllib_parse.quote_plus(self.person_movie_link % i['id']) cm.append( (playRandom, 'RunPlugin(%s?action=random&rtype=movie&url=%s)' % (sysaddon, link))) url = '%s?action=movies&url=%s' % (sysaddon, link) elif content == 'tvshows': link = urllib_parse.quote_plus(self.person_tv_link % i['id']) cm.append( (playRandom, 'RunPlugin(%s?action=random&rtype=show&url=%s)' % (sysaddon, link))) url = '%s?action=tvshows&url=%s' % (sysaddon, link) else: url = '%s?action=personsSelect&name=%s&url=%s' % ( sysaddon, urllib_parse.quote_plus(name), urllib_parse.quote_plus(i['id'])) if cm: item.addContextMenuItems(cm) control.addItem(handle=syshandle, url=url, listitem=item, isFolder=True) except: log_utils.log('people_dir', 1) pass try: next = items[0]['next'] if next == '': raise Exception() icon = control.addonNext() url = '%s?action=persons&url=%s&content=%s' % ( sysaddon, urllib_parse.quote_plus(next), content) try: item = control.item(label=nextMenu, offscreen=True) except: item = control.item(label=nextMenu) item.setArt({ 'icon': icon, 'thumb': icon, 'poster': icon, 'banner': icon, 'fanart': addonFanart }) item.setProperty('SpecialSort', 'bottom') control.addItem(handle=syshandle, url=url, listitem=item, isFolder=True) except: pass control.content(syshandle, '') control.directory(syshandle, cacheToDisc=True)
def pco_show(self, show, page): try: url = self.pcocats_link % show url = url + '?showAllEpisodes=true' html = client.request(url) progID = re.compile('categoryID2=(.+?)"', re.DOTALL).findall(html)[0] first = None items = [] if page == '1': icon_item = client.parseDOM(html, 'div', attrs={'class': 'col-sm-3 col-xs-12 current-episode-img'})[0] icon = client.parseDOM(icon_item, 'img', ret='src')[0] latest_content = re.compile('<div class="letestEpiDes">(.+?)</div>', re.DOTALL).findall(html)[0] ep_title = re.compile('href=".+?" style="color:inherit;">(.+?)</a>', re.DOTALL).findall(latest_content)[0] first = ep_title ep_page = urlparse.urljoin(self.pco_link, re.compile('href="(.+?)"', re.DOTALL).findall(latest_content)[0]) episode_action = 'podcastOne&podcastepisode=%s' % ep_page item = control.item(label=ep_title) item.setArt({"thumb": icon, "icon": icon}) item.setInfo(type="music", infoLabels={"Title": ep_title, "mediatype": "music"}) item.setProperty("IsPlayable", "true") link = '%s?action=%s' % (sysaddon, episode_action) items.append((link, item, False)) url = self.pco_page_link % (page, progID) html = client.request(url) episode_list = client.parseDOM(html, 'div', attrs={'class': 'flex space-between align-center no-wrap'}) for content in episode_list: icon = re.compile('src="(.+?)"', re.DOTALL).findall(content)[0] ep_title = re.compile('href=".+?" style="color:inherit;">(.+?)</a>', re.DOTALL).findall(content)[0] if ep_title == first: continue ep_page = urlparse.urljoin(self.pco_link, re.compile('href="(.+?)"', re.DOTALL).findall(content)[0]) episode_action = 'podcastOne&podcastepisode=%s' % ep_page item = control.item(label=ep_title) item.setArt({"thumb": icon, "icon": icon}) item.setInfo(type="music", infoLabels={"Title": ep_title, "mediatype": "music"}) item.setProperty("IsPlayable", "true") link = '%s?action=%s' % (sysaddon, episode_action) items.append((link, item, False)) except Exception: failure = traceback.format_exc() log_utils.log('PodCastOne Show - Exception: \n' + str(failure)) try: if len(items) > 13: next_url = '%s?action=podcastOne&podcastshow=%s&page=%s' % (sysaddon, show, int(page)+1) item = control.item(label=control.lang(32053).encode('utf-8')) item.setArt({"thumb": control.addonNext(), "icon": control.addonNext()}) items.append((next_url, item, True)) except Exception: failure = traceback.format_exc() log_utils.log('PodCastOne Show - Exception: \n' + str(failure)) control.addItems(syshandle, items) self.endDirectory() return
def movieDirectory(self, items): if items == None or len(items) == 0: control.idle() ; sys.exit() sysaddon = sys.argv[0] syshandle = int(sys.argv[1]) addonPoster, addonBanner = control.addonPoster(), control.addonBanner() addonFanart, settingFanart = control.addonFanart(), control.setting('fanart') traktCredentials = trakt.getTraktCredentialsInfo() try: isOld = False ; control.item().getArt('type') except: isOld = True isPlayable = 'true' if not 'plugin' in control.infoLabel('Container.PluginName') else 'false' indicators = playcount.getMovieIndicators(refresh=True) if action == 'movies' else playcount.getMovieIndicators() playbackMenu = control.lang(32063).encode('utf-8') if control.setting('hosts.mode') == '2' else control.lang(32064).encode('utf-8') watchedMenu = control.lang(32068).encode('utf-8') if trakt.getTraktIndicatorsInfo() == True else control.lang(32066).encode('utf-8') unwatchedMenu = control.lang(32069).encode('utf-8') if trakt.getTraktIndicatorsInfo() == True else control.lang(32067).encode('utf-8') queueMenu = control.lang(32065).encode('utf-8') traktManagerMenu = control.lang(32070).encode('utf-8') nextMenu = control.lang(32053).encode('utf-8') addToLibrary = control.lang(32551).encode('utf-8') for i in items: try: label = '%s (%s)' % (i['title'], i['year']) imdb, tmdb, title, year = i['imdb'], i['tmdb'], i['originaltitle'], i['year'] sysname = urllib.quote_plus('%s (%s)' % (title, year)) systitle = urllib.quote_plus(title) meta = dict((k,v) for k, v in i.iteritems() if not v == '0') meta.update({'code': imdb, 'imdbnumber': imdb, 'imdb_id': imdb}) meta.update({'tmdb_id': tmdb}) meta.update({'mediatype': 'movie'}) meta.update({'trailer': '%s?action=trailer&name=%s' % (sysaddon, urllib.quote_plus(label))}) #meta.update({'trailer': 'plugin://script.extendedinfo/?info=playtrailer&&id=%s' % imdb}) if not 'duration' in i: meta.update({'duration': '120'}) elif i['duration'] == '0': meta.update({'duration': '120'}) try: meta.update({'duration': str(int(meta['duration']) * 60)}) except: pass try: meta.update({'genre': cleangenre.lang(meta['genre'], self.lang)}) except: pass poster = [i[x] for x in ['poster3', 'poster', 'poster2'] if i.get(x, '0') != '0'] poster = poster[0] if poster else addonPoster meta.update({'poster': poster}) sysmeta = urllib.quote_plus(json.dumps(meta)) url = '%s?action=play&title=%s&year=%s&imdb=%s&meta=%s&t=%s' % (sysaddon, systitle, year, imdb, sysmeta, self.systime) sysurl = urllib.quote_plus(url) path = '%s?action=play&title=%s&year=%s&imdb=%s' % (sysaddon, systitle, year, imdb) cm = [] cm.append(('Find similar', 'ActivateWindow(10025,%s?action=movies&url=https://api.trakt.tv/movies/%s/related,return)' % ( sysaddon, imdb))) cm.append((queueMenu, 'RunPlugin(%s?action=queueItem)' % sysaddon)) try: overlay = int(playcount.getMovieOverlay(indicators, imdb)) if overlay == 7: cm.append((unwatchedMenu, 'RunPlugin(%s?action=moviePlaycount&imdb=%s&query=6)' % (sysaddon, imdb))) meta.update({'playcount': 1, 'overlay': 7}) else: cm.append((watchedMenu, 'RunPlugin(%s?action=moviePlaycount&imdb=%s&query=7)' % (sysaddon, imdb))) meta.update({'playcount': 0, 'overlay': 6}) except: pass if traktCredentials == True: cm.append((traktManagerMenu, 'RunPlugin(%s?action=traktManager&name=%s&imdb=%s&content=movie)' % (sysaddon, sysname, imdb))) cm.append((playbackMenu, 'RunPlugin(%s?action=alterSources&url=%s&meta=%s)' % (sysaddon, sysurl, sysmeta))) if isOld == True: cm.append((control.lang2(19033).encode('utf-8'), 'Action(Info)')) cm.append((addToLibrary, 'RunPlugin(%s?action=movieToLibrary&name=%s&title=%s&year=%s&imdb=%s&tmdb=%s)' % (sysaddon, sysname, systitle, year, imdb, tmdb))) item = control.item(label=label) art = {} art.update({'icon': poster, 'thumb': poster, 'poster': poster}) if 'banner' in i and not i['banner'] == '0': art.update({'banner': i['banner']}) else: art.update({'banner': addonBanner}) if 'clearlogo' in i and not i['clearlogo'] == '0': art.update({'clearlogo': i['clearlogo']}) if 'clearart' in i and not i['clearart'] == '0': art.update({'clearart': i['clearart']}) if settingFanart == 'true' and 'fanart2' in i and not i['fanart2'] == '0': item.setProperty('Fanart_Image', i['fanart2']) elif settingFanart == 'true' and 'fanart' in i and not i['fanart'] == '0': item.setProperty('Fanart_Image', i['fanart']) elif not addonFanart == None: item.setProperty('Fanart_Image', addonFanart) item.setArt(art) item.addContextMenuItems(cm) item.setProperty('IsPlayable', isPlayable) item.setInfo(type='Video', infoLabels = meta) video_streaminfo = {'codec': 'h264'} item.addStreamInfo('video', video_streaminfo) control.addItem(handle=syshandle, url=url, listitem=item, isFolder=False) except: pass try: url = items[0]['next'] if url == '': raise Exception() icon = control.addonNext() url = '%s?action=moviePage&url=%s' % (sysaddon, urllib.quote_plus(url)) item = control.item(label=nextMenu) item.setArt({'icon': icon, 'thumb': icon, 'poster': icon, 'banner': icon}) if not addonFanart == None: item.setProperty('Fanart_Image', addonFanart) control.addItem(handle=syshandle, url=url, listitem=item, isFolder=True) except: pass control.content(syshandle, 'movies') control.directory(syshandle, cacheToDisc=True) views.setView('movies', {'skin.estuary': 55, 'skin.confluence': 500})
def tvshowDirectory(self, items): if items == None or len(items) == 0: control.idle() ; sys.exit() sysaddon = sys.argv[0] syshandle = int(sys.argv[1]) addonPoster, addonBanner = control.addonPoster(), control.addonBanner() addonFanart, settingFanart = control.addonFanart(), control.setting('fanart') traktCredentials = trakt.getTraktCredentialsInfo() try: isOld = False ; control.item().getArt('type') except: isOld = True isEstuary = True if 'estuary' in control.skin else False indicators = playcount.getTVShowIndicators(refresh=True) if action == 'tvshows' else playcount.getTVShowIndicators() watchedMenu = control.lang(32068).encode('utf-8') if trakt.getTraktIndicatorsInfo() == True else control.lang(32066).encode('utf-8') unwatchedMenu = control.lang(32069).encode('utf-8') if trakt.getTraktIndicatorsInfo() == True else control.lang(32067).encode('utf-8') queueMenu = control.lang(32065).encode('utf-8') traktManagerMenu = control.lang(32070).encode('utf-8') nextMenu = control.lang(32053).encode('utf-8') for i in items: try: label = i['title'] systitle = sysname = urllib.quote_plus(i['originaltitle']) sysimage = urllib.quote_plus(i['poster']) imdb, tvdb, year = i['imdb'], i['tvdb'], i['year'] poster, banner, fanart = i['poster'], i['banner'], i['fanart'] if banner == '0' and not fanart == '0': banner = fanart elif banner == '0' and not poster == '0': banner = poster if poster == '0': poster = addonPoster if banner == '0': banner = addonBanner meta = dict((k,v) for k, v in i.iteritems() if not v == '0') meta.update({'mediatype': 'tvshow'}) meta.update({'trailer': '%s?action=trailer&name=%s' % (sysaddon, sysname)}) if i['duration'] == '0': meta.update({'duration': '60'}) try: meta.update({'duration': str(int(meta['duration']) * 60)}) except: pass try: meta.update({'genre': cleangenre.lang(meta['genre'], self.lang)}) except: pass if isEstuary == True: try: del meta['cast'] except: pass try: overlay = int(playcount.getTVShowOverlay(indicators, tvdb)) if overlay == 7: meta.update({'playcount': 1, 'overlay': 7}) else: meta.update({'playcount': 0, 'overlay': 6}) except: pass url = '%s?action=seasons&tvshowtitle=%s&year=%s&imdb=%s&tvdb=%s' % (sysaddon, systitle, year, imdb, tvdb) cm = [] cm.append((queueMenu, 'RunPlugin(%s?action=queueItem)' % sysaddon)) cm.append((watchedMenu, 'RunPlugin(%s?action=tvPlaycount&name=%s&imdb=%s&tvdb=%s&query=7)' % (sysaddon, systitle, imdb, tvdb))) cm.append((unwatchedMenu, 'RunPlugin(%s?action=tvPlaycount&name=%s&imdb=%s&tvdb=%s&query=6)' % (sysaddon, systitle, imdb, tvdb))) if traktCredentials == True: cm.append((traktManagerMenu, 'RunPlugin(%s?action=traktManager&name=%s&tvdb=%s&content=tvshow)' % (sysaddon, sysname, tvdb))) if isOld == True: cm.append((control.lang2(19033).encode('utf-8'), 'Action(Info)')) item = control.item(label=label) item.setArt({'icon': poster, 'thumb': poster, 'poster': poster, 'tvshow.poster': poster, 'season.poster': poster, 'banner': banner, 'tvshow.banner': banner, 'season.banner': banner}) if settingFanart == 'true' and not fanart == '0': item.setProperty('Fanart_Image', fanart) elif not addonFanart == None: item.setProperty('Fanart_Image', addonFanart) item.addContextMenuItems(cm) item.setInfo(type='Video', infoLabels = meta) control.addItem(handle=syshandle, url=url, listitem=item, isFolder=True) except: pass try: url = items[0]['next'] if url == '': raise Exception() icon = control.addonNext() url = '%s?action=tvshowPage&url=%s' % (sysaddon, urllib.quote_plus(url)) item = control.item(label=nextMenu) item.setArt({'icon': icon, 'thumb': icon, 'poster': icon, 'tvshow.poster': icon, 'season.poster': icon, 'banner': icon, 'tvshow.banner': icon, 'season.banner': icon}) if not addonFanart == None: item.setProperty('Fanart_Image', addonFanart) control.addItem(handle=syshandle, url=url, listitem=item, isFolder=True) except: pass control.content(syshandle, 'tvshows') #control.do_block_check(False) control.directory(syshandle, cacheToDisc=True) views.setView('tvshows', {'skin.confluence': 500})
def tvshowDirectory(self, items): if items == None or len(items) == 0: control.idle() ; sys.exit() sysaddon = sys.argv[0] syshandle = int(sys.argv[1]) addonPoster, addonBanner = control.addonPoster(), control.addonBanner() addonFanart, settingFanart = control.addonFanart(), control.setting('fanart') traktCredentials = trakt.getTraktCredentialsInfo() try: isOld = False ; control.item().getArt('type') except: isOld = True indicators = playcount.getTVShowIndicators(refresh=True) if action == 'tvshows' else playcount.getTVShowIndicators() flatten = True if control.setting('flatten.tvshows') == 'true' else False watchedMenu = control.lang(32068).encode('utf-8') if trakt.getTraktIndicatorsInfo() == True else control.lang(32066).encode('utf-8') unwatchedMenu = control.lang(32069).encode('utf-8') if trakt.getTraktIndicatorsInfo() == True else control.lang(32067).encode('utf-8') queueMenu = control.lang(32065).encode('utf-8') traktManagerMenu = control.lang(32070).encode('utf-8') nextMenu = control.lang(32053).encode('utf-8') playRandom = control.lang(32535).encode('utf-8') for i in items: try: label = i['title'] systitle = sysname = urllib.quote_plus(i['originaltitle']) sysimage = urllib.quote_plus(i['poster']) imdb, tvdb, year = i['imdb'], i['tvdb'], i['year'] meta = dict((k,v) for k, v in i.iteritems() if not v == '0') meta.update({'code': imdb, 'imdbnumber': imdb, 'imdb_id': imdb}) meta.update({'tvdb_id': tvdb}) meta.update({'mediatype': 'tvshow'}) meta.update({'trailer': '%s?action=trailer&name=%s' % (sysaddon, sysname)}) if not 'duration' in i: meta.update({'duration': '60'}) elif i['duration'] == '0': meta.update({'duration': '60'}) try: meta.update({'duration': str(int(meta['duration']) * 60)}) except: pass try: meta.update({'genre': cleangenre.lang(meta['genre'], self.lang)}) except: pass try: overlay = int(playcount.getTVShowOverlay(indicators, tvdb)) if overlay == 7: meta.update({'playcount': 1, 'overlay': 7}) else: meta.update({'playcount': 0, 'overlay': 6}) except: pass if flatten == True: url = '%s?action=episodes&tvshowtitle=%s&year=%s&imdb=%s&tvdb=%s' % (sysaddon, systitle, year, imdb, tvdb) else: url = '%s?action=seasons&tvshowtitle=%s&year=%s&imdb=%s&tvdb=%s' % (sysaddon, systitle, year, imdb, tvdb) cm = [] cm.append((playRandom, 'RunPlugin(%s?action=random&rtype=season&tvshowtitle=%s&year=%s&imdb=%s&tvdb=%s)' % (sysaddon, urllib.quote_plus(systitle), urllib.quote_plus(year), urllib.quote_plus(imdb), urllib.quote_plus(tvdb)))) cm.append((queueMenu, 'RunPlugin(%s?action=queueItem)' % sysaddon)) #cm.append((watchedMenu, 'RunPlugin(%s?action=tvPlaycount&name=%s&imdb=%s&tvdb=%s&query=7)' % (sysaddon, systitle, imdb, tvdb))) #cm.append((unwatchedMenu, 'RunPlugin(%s?action=tvPlaycount&name=%s&imdb=%s&tvdb=%s&query=6)' % (sysaddon, systitle, imdb, tvdb))) if traktCredentials == True: cm.append((traktManagerMenu, 'RunPlugin(%s?action=traktManager&name=%s&tvdb=%s&content=tvshow)' % (sysaddon, sysname, tvdb))) if isOld == True: cm.append((control.lang2(19033).encode('utf-8'), 'Action(Info)')) item = control.item(label=label) art = {} if 'poster' in i and not i['poster'] == '0': art.update({'icon': i['poster'], 'thumb': i['poster'], 'poster': i['poster']}) #elif 'poster2' in i and not i['poster2'] == '0': #art.update({'icon': i['poster2'], 'thumb': i['poster2'], 'poster': i['poster2']}) else: art.update({'icon': addonPoster, 'thumb': addonPoster, 'poster': addonPoster}) if 'banner' in i and not i['banner'] == '0': art.update({'banner': i['banner']}) #elif 'banner2' in i and not i['banner2'] == '0': #art.update({'banner': i['banner2']}) elif 'fanart' in i and not i['fanart'] == '0': art.update({'banner': i['fanart']}) else: art.update({'banner': addonBanner}) if 'clearlogo' in i and not i['clearlogo'] == '0': art.update({'clearlogo': i['clearlogo']}) if 'clearart' in i and not i['clearart'] == '0': art.update({'clearart': i['clearart']}) if settingFanart == 'true' and 'fanart' in i and not i['fanart'] == '0': item.setProperty('Fanart_Image', i['fanart']) #elif settingFanart == 'true' and 'fanart2' in i and not i['fanart2'] == '0': #item.setProperty('Fanart_Image', i['fanart2']) elif not addonFanart == None: item.setProperty('Fanart_Image', addonFanart) item.setArt(art) item.addContextMenuItems(cm) item.setInfo(type='Video', infoLabels = meta) video_streaminfo = {'codec': 'h264'} item.addStreamInfo('video', video_streaminfo) control.addItem(handle=syshandle, url=url, listitem=item, isFolder=True) except: pass try: url = items[0]['next'] if url == '': raise Exception() icon = control.addonNext() url = '%s?action=tvshowPage&url=%s' % (sysaddon, urllib.quote_plus(url)) item = control.item(label=nextMenu) item.setArt({'icon': icon, 'thumb': icon, 'poster': icon, 'banner': icon}) if not addonFanart == None: item.setProperty('Fanart_Image', addonFanart) control.addItem(handle=syshandle, url=url, listitem=item, isFolder=True) except: pass control.content(syshandle, 'tvshows') control.directory(syshandle, cacheToDisc=True) views.setView('tvshows', {'skin.estuary': 55, 'skin.confluence': 500})
def tvshowDirectory(self, items, next=True): control.playlist.clear() if not items: # with reuselanguageinvoker on an empty directory must be loaded, do not use sys.exit() control.hide() ; control.notification(title=32002, message=33049) sysaddon, syshandle = argv[0], int(argv[1]) is_widget = 'plugin' not in control.infoLabel('Container.PluginName') settingFanart = control.setting('fanart') == 'true' addonPoster, addonFanart, addonBanner = control.addonPoster(), control.addonFanart(), control.addonBanner() indicators = getTVShowIndicators(refresh=True) unwatchedEnabled = control.setting('tvshows.unwatched.enabled') == 'true' flatten = control.setting('flatten.tvshows') == 'true' if trakt.getTraktIndicatorsInfo(): watchedMenu, unwatchedMenu = control.lang(32068), control.lang(32069) else: watchedMenu, unwatchedMenu = control.lang(32066), control.lang(32067) traktManagerMenu, queueMenu = control.lang(32070), control.lang(32065) showPlaylistMenu, clearPlaylistMenu = control.lang(35517), control.lang(35516) playRandom, addToLibrary = control.lang(32535), control.lang(32551) nextMenu = control.lang(32053) for i in items: try: imdb, tmdb, tvdb, year, trailer = i.get('imdb', ''), i.get('tmdb', ''), i.get('tvdb', ''), i.get('year', ''), i.get('trailer', '') title = i.get('tvshowtitle') or i.get('title') systitle = quote_plus(title) meta = dict((k, v) for k, v in iter(i.items()) if v is not None and v != '') meta.update({'code': imdb, 'imdbnumber': imdb, 'mediatype': 'tvshow', 'tag': [imdb, tmdb]}) # "tag" and "tagline" for movies only, but works in my skin mod so leave if unwatchedEnabled: trakt.seasonCount(imdb) # pre-cache season counts for the listed shows try: meta.update({'genre': cleangenre.lang(meta['genre'], self.lang)}) except: pass try: if 'tvshowtitle' not in meta: meta.update({'tvshowtitle': title}) except: pass poster = meta.get('poster3') or meta.get('poster2') or meta.get('poster') or addonPoster landscape = meta.get('landscape') fanart = '' if settingFanart: fanart = meta.get('fanart3') or meta.get('fanart2') or meta.get('fanart') or landscape or addonFanart thumb = meta.get('thumb') or poster or landscape icon = meta.get('icon') or poster banner = meta.get('banner3') or meta.get('banner2') or meta.get('banner') or addonBanner art = {} art.update({'poster': poster, 'tvshow.poster': poster, 'fanart': fanart, 'icon': icon, 'thumb': thumb, 'banner': banner, 'clearlogo': meta.get('clearlogo', ''), 'tvshow.clearlogo': meta.get('clearlogo', ''), 'clearart': meta.get('clearart', ''), 'tvshow.clearart': meta.get('clearart', ''), 'landscape': landscape}) for k in ('poster2', 'poster3', 'fanart2', 'fanart3', 'banner2', 'banner3', 'trailer'): meta.pop(k, None) meta.update({'poster': poster, 'fanart': fanart, 'banner': banner, 'thumb': thumb, 'icon': icon}) ####-Context Menu and Overlays-#### cm = [] try: overlay = int(getTVShowOverlay(indicators, imdb, tvdb)) watched = (overlay == 5) if self.traktCredentials: cm.append((traktManagerMenu, 'RunPlugin(%s?action=tools_traktManager&name=%s&imdb=%s&tvdb=%s&watched=%s)' % (sysaddon, systitle, imdb, tvdb, watched))) if watched: meta.update({'playcount': 1, 'overlay': 5}) cm.append((unwatchedMenu, 'RunPlugin(%s?action=playcount_TVShow&name=%s&imdb=%s&tvdb=%s&query=4)' % (sysaddon, systitle, imdb, tvdb))) else: meta.update({'playcount': 0, 'overlay': 4}) cm.append((watchedMenu, 'RunPlugin(%s?action=playcount_TVShow&name=%s&imdb=%s&tvdb=%s&query=5)' % (sysaddon, systitle, imdb, tvdb))) except: pass sysmeta, sysart = quote_plus(jsdumps(meta)), quote_plus(jsdumps(art)) cm.append(('Find similar', 'ActivateWindow(10025,%s?action=tvshows&url=https://api.trakt.tv/shows/%s/related,return)' % (sysaddon, imdb))) cm.append((playRandom, 'RunPlugin(%s?action=play_Random&rtype=season&tvshowtitle=%s&year=%s&imdb=%s&tmdb=%s&tvdb=%s&art=%s)' % (sysaddon, systitle, year, imdb, tmdb, tvdb, sysart))) cm.append((queueMenu, 'RunPlugin(%s?action=playlist_QueueItem&name=%s)' % (sysaddon, systitle))) cm.append((showPlaylistMenu, 'RunPlugin(%s?action=playlist_Show)' % sysaddon)) cm.append((clearPlaylistMenu, 'RunPlugin(%s?action=playlist_Clear)' % sysaddon)) cm.append((addToLibrary, 'RunPlugin(%s?action=library_tvshowToLibrary&tvshowtitle=%s&year=%s&imdb=%s&tmdb=%s&tvdb=%s)' % (sysaddon, systitle, year, imdb, tmdb, tvdb))) cm.append(('[COLOR red]Venom Settings[/COLOR]', 'RunPlugin(%s?action=tools_openSettings)' % sysaddon)) #################################### if flatten: url = '%s?action=episodes&tvshowtitle=%s&year=%s&imdb=%s&tmdb=%s&tvdb=%s&meta=%s' % (sysaddon, systitle, year, imdb, tmdb, tvdb, sysmeta) else: url = '%s?action=seasons&tvshowtitle=%s&year=%s&imdb=%s&tmdb=%s&tvdb=%s&art=%s' % (sysaddon, systitle, year, imdb, tmdb, tvdb, sysart) if trailer: meta.update({'trailer': trailer}) else: meta.update({'trailer': '%s?action=play_Trailer&type=%s&name=%s&year=%s&imdb=%s' % (sysaddon, 'show', systitle, year, imdb)}) item = control.item(label=title, offscreen=True) if 'castandart' in i: item.setCast(i['castandart']) item.setArt(art) if unwatchedEnabled: try: count = getShowCount(indicators, imdb, tvdb) # this is threaded without .join() so not all results are immediately seen if count: item.setProperties({'WatchedEpisodes': str(count['watched']), 'UnWatchedEpisodes': str(count['unwatched'])}) item.setProperties({'TotalSeasons': str(meta.get('total_seasons', '')), 'TotalEpisodes': str(count['total'])}) else: item.setProperties({'WatchedEpisodes': '0', 'UnWatchedEpisodes': str(meta.get('total_aired_episodes', ''))}) # temp use TMDb's "total_aired_episodes" for threads not finished....next load counts will update with trakt data item.setProperties({'TotalSeasons': str(meta.get('total_seasons', '')), 'TotalEpisodes': str(meta.get('total_aired_episodes', ''))}) except: pass item.setProperty('IsPlayable', 'false') item.setProperty('tmdb_id', str(tmdb)) if is_widget: item.setProperty('isVenom_widget', 'true') item.setUniqueIDs({'imdb': imdb, 'tmdb': tmdb, 'tvdb': tvdb}) item.setInfo(type='video', infoLabels=control.metadataClean(meta)) item.addContextMenuItems(cm) control.addItem(handle=syshandle, url=url, listitem=item, isFolder=True) except: from resources.lib.modules import log_utils log_utils.error() if next: try: if not items: raise Exception() url = items[0]['next'] if not url: raise Exception() url_params = dict(parse_qsl(urlsplit(url).query)) if 'imdb.com' in url and 'start' in url_params: page = ' [I](%s)[/I]' % str(int(((int(url_params.get('start')) - 1) / int(self.page_limit)) + 1)) else: page = ' [I](%s)[/I]' % url_params.get('page') nextMenu = '[COLOR skyblue]' + nextMenu + page + '[/COLOR]' u = urlparse(url).netloc.lower() if u in self.imdb_link or u in self.trakt_link: url = '%s?action=tvshowPage&url=%s' % (sysaddon, quote_plus(url)) elif u in self.tmdb_link: url = '%s?action=tmdbTvshowPage&url=%s' % (sysaddon, quote_plus(url)) elif u in self.tvmaze_link: url = '%s?action=tvmazeTvshowPage&url=%s' % (sysaddon, quote_plus(url)) item = control.item(label=nextMenu, offscreen=True) icon = control.addonNext() item.setProperty('IsPlayable', 'false') item.setArt({'icon': icon, 'thumb': icon, 'poster': icon, 'banner': icon}) item.setProperty ('SpecialSort', 'bottom') control.addItem(handle=syshandle, url=url, listitem=item, isFolder=True) except: from resources.lib.modules import log_utils log_utils.error() control.content(syshandle, 'tvshows') control.directory(syshandle, cacheToDisc=True) # control.sleep(500) views.setView('tvshows', {'skin.estuary': 55, 'skin.confluence': 500})
def movieDirectory(self, items): if items == None or len(items) == 0: control.idle() ; sys.exit() sysaddon = sys.argv[0] syshandle = int(sys.argv[1]) addonPoster, addonBanner = control.addonPoster(), control.addonBanner() addonFanart, settingFanart = control.addonFanart(), control.setting('fanart') traktCredentials = trakt.getTraktCredentialsInfo() try: isOld = False ; control.item().getArt('type') except: isOld = True isPlayable = 'true' if not 'plugin' in control.infoLabel('Container.PluginName') else 'false' indicators = playcount.getMovieIndicators(refresh=True) if action == 'movies' else playcount.getMovieIndicators() playbackMenu = control.lang(32063).encode('utf-8') if control.setting('hosts.mode') == '2' else control.lang(32064).encode('utf-8') #watchedMenu = control.lang(32068).encode('utf-8') if trakt.getTraktIndicatorsInfo() == True else control.lang(32066).encode('utf-8') #unwatchedMenu = control.lang(32069).encode('utf-8') if trakt.getTraktIndicatorsInfo() == True else control.lang(32067).encode('utf-8') queueMenu = control.lang(32065).encode('utf-8') traktManagerMenu = control.lang(32070).encode('utf-8') nextMenu = control.lang(32053).encode('utf-8') addToLibrary = control.lang(32551).encode('utf-8') for i in items: try: label = '%s (%s)' % (i['title'], i['year']) imdb, tmdb, title, year = i['imdb'], i['tmdb'], i['originaltitle'], i['year'] sysname = urllib.quote_plus('%s (%s)' % (title, year)) systitle = urllib.quote_plus(title) meta = dict((k,v) for k, v in i.iteritems() if not v == '0') meta.update({'code': imdb, 'imdbnumber': imdb, 'imdb_id': imdb}) meta.update({'tmdb_id': tmdb}) meta.update({'mediatype': 'movie'}) meta.update({'trailer': '%s?action=trailer&name=%s' % (sysaddon, urllib.quote_plus(label))}) #meta.update({'trailer': 'plugin://script.extendedinfo/?info=playtrailer&&id=%s' % imdb}) if not 'duration' in i: meta.update({'duration': '120'}) elif i['duration'] == '0': meta.update({'duration': '120'}) try: meta.update({'duration': str(int(meta['duration']) * 60)}) except: pass try: meta.update({'genre': cleangenre.lang(meta['genre'], self.lang)}) except: pass poster = [i[x] for x in ['poster3', 'poster', 'poster2'] if i.get(x, '0') != '0'] poster = poster[0] if poster else addonPoster meta.update({'poster': poster}) sysmeta = urllib.quote_plus(json.dumps(meta)) url = '%s?action=play&title=%s&year=%s&imdb=%s&meta=%s&t=%s' % (sysaddon, systitle, year, imdb, sysmeta, self.systime) sysurl = urllib.quote_plus(url) path = '%s?action=play&title=%s&year=%s&imdb=%s' % (sysaddon, systitle, year, imdb) cm = [] cm.append((queueMenu, 'RunPlugin(%s?action=queueItem)' % sysaddon)) try: overlay = int(playcount.getMovieOverlay(indicators, imdb)) if overlay == 7: #cm.append((unwatchedMenu, 'RunPlugin(%s?action=moviePlaycount&imdb=%s&query=6)' % (sysaddon, imdb))) meta.update({'playcount': 1, 'overlay': 7}) else: #cm.append((watchedMenu, 'RunPlugin(%s?action=moviePlaycount&imdb=%s&query=7)' % (sysaddon, imdb))) meta.update({'playcount': 0, 'overlay': 6}) except: pass if traktCredentials == True: cm.append((traktManagerMenu, 'RunPlugin(%s?action=traktManager&name=%s&imdb=%s&content=movie)' % (sysaddon, sysname, imdb))) cm.append((playbackMenu, 'RunPlugin(%s?action=alterSources&url=%s&meta=%s)' % (sysaddon, sysurl, sysmeta))) if isOld == True: cm.append((control.lang2(19033).encode('utf-8'), 'Action(Info)')) cm.append((addToLibrary, 'RunPlugin(%s?action=movieToLibrary&name=%s&title=%s&year=%s&imdb=%s&tmdb=%s)' % (sysaddon, sysname, systitle, year, imdb, tmdb))) item = control.item(label=label) art = {} art.update({'icon': poster, 'thumb': poster, 'poster': poster}) if 'banner' in i and not i['banner'] == '0': art.update({'banner': i['banner']}) else: art.update({'banner': addonBanner}) if 'clearlogo' in i and not i['clearlogo'] == '0': art.update({'clearlogo': i['clearlogo']}) if 'clearart' in i and not i['clearart'] == '0': art.update({'clearart': i['clearart']}) if settingFanart == 'true' and 'fanart2' in i and not i['fanart2'] == '0': item.setProperty('Fanart_Image', i['fanart2']) elif settingFanart == 'true' and 'fanart' in i and not i['fanart'] == '0': item.setProperty('Fanart_Image', i['fanart']) elif not addonFanart == None: item.setProperty('Fanart_Image', addonFanart) item.setArt(art) item.addContextMenuItems(cm) item.setProperty('IsPlayable', isPlayable) item.setInfo(type='Video', infoLabels = meta) video_streaminfo = {'codec': 'h264'} item.addStreamInfo('video', video_streaminfo) control.addItem(handle=syshandle, url=url, listitem=item, isFolder=False) except: pass try: url = items[0]['next'] if url == '': raise Exception() icon = control.addonNext() url = '%s?action=moviePage&url=%s' % (sysaddon, urllib.quote_plus(url)) item = control.item(label=nextMenu) item.setArt({'icon': icon, 'thumb': icon, 'poster': icon, 'banner': icon}) if not addonFanart == None: item.setProperty('Fanart_Image', addonFanart) control.addItem(handle=syshandle, url=url, listitem=item, isFolder=True) except: pass control.content(syshandle, 'movies') control.directory(syshandle, cacheToDisc=True) views.setView('movies', {'skin.estuary': 55, 'skin.confluence': 500})
def tvshowDirectory(self, items): if items == None or len(items) == 0: control.idle() ; sys.exit() sysaddon = sys.argv[0] syshandle = int(sys.argv[1]) addonPoster, addonBanner = control.addonPoster(), control.addonBanner() addonFanart, settingFanart = control.addonFanart(), control.setting('fanart') traktCredentials = trakt.getTraktCredentialsInfo() try: isOld = False ; control.item().getArt('type') except: isOld = True indicators = playcount.getTVShowIndicators(refresh=True) if action == 'tvshows' else playcount.getTVShowIndicators() flatten = True if control.setting('flatten.tvshows') == 'true' else False watchedMenu = control.lang(32068).encode('utf-8') if trakt.getTraktIndicatorsInfo() == True else control.lang(32066).encode('utf-8') unwatchedMenu = control.lang(32069).encode('utf-8') if trakt.getTraktIndicatorsInfo() == True else control.lang(32067).encode('utf-8') queueMenu = control.lang(32065).encode('utf-8') traktManagerMenu = control.lang(32070).encode('utf-8') nextMenu = control.lang(32053).encode('utf-8') playRandom = control.lang(32535).encode('utf-8') addToLibrary = control.lang(32551).encode('utf-8') for i in items: try: label = i['title'] systitle = sysname = urllib.quote_plus(i['originaltitle']) sysimage = urllib.quote_plus(i['poster']) imdb, tvdb, year = i['imdb'], i['tvdb'], i['year'] meta = dict((k,v) for k, v in i.iteritems() if not v == '0') meta.update({'code': imdb, 'imdbnumber': imdb, 'imdb_id': imdb}) meta.update({'tvdb_id': tvdb}) meta.update({'mediatype': 'tvshow'}) meta.update({'trailer': '%s?action=trailer&name=%s' % (sysaddon, urllib.quote_plus(label))}) if not 'duration' in i: meta.update({'duration': '60'}) elif i['duration'] == '0': meta.update({'duration': '60'}) try: meta.update({'duration': str(int(meta['duration']) * 60)}) except: pass try: meta.update({'genre': cleangenre.lang(meta['genre'], self.lang)}) except: pass try: overlay = int(playcount.getTVShowOverlay(indicators, tvdb)) if overlay == 7: meta.update({'playcount': 1, 'overlay': 7}) else: meta.update({'playcount': 0, 'overlay': 6}) except: pass if flatten == True: url = '%s?action=episodes&tvshowtitle=%s&year=%s&imdb=%s&tvdb=%s' % (sysaddon, systitle, year, imdb, tvdb) else: url = '%s?action=seasons&tvshowtitle=%s&year=%s&imdb=%s&tvdb=%s' % (sysaddon, systitle, year, imdb, tvdb) cm = [] cm.append((playRandom, 'RunPlugin(%s?action=random&rtype=season&tvshowtitle=%s&year=%s&imdb=%s&tvdb=%s)' % (sysaddon, urllib.quote_plus(systitle), urllib.quote_plus(year), urllib.quote_plus(imdb), urllib.quote_plus(tvdb)))) cm.append((queueMenu, 'RunPlugin(%s?action=queueItem)' % sysaddon)) cm.append((watchedMenu, 'RunPlugin(%s?action=tvPlaycount&name=%s&imdb=%s&tvdb=%s&query=7)' % (sysaddon, systitle, imdb, tvdb))) cm.append((unwatchedMenu, 'RunPlugin(%s?action=tvPlaycount&name=%s&imdb=%s&tvdb=%s&query=6)' % (sysaddon, systitle, imdb, tvdb))) if traktCredentials == True: cm.append((traktManagerMenu, 'RunPlugin(%s?action=traktManager&name=%s&tvdb=%s&content=tvshow)' % (sysaddon, sysname, tvdb))) if isOld == True: cm.append((control.lang2(19033).encode('utf-8'), 'Action(Info)')) cm.append((addToLibrary, 'RunPlugin(%s?action=tvshowToLibrary&tvshowtitle=%s&year=%s&imdb=%s&tvdb=%s)' % (sysaddon, systitle, year, imdb, tvdb))) item = control.item(label=label) art = {} if 'poster' in i and not i['poster'] == '0': art.update({'icon': i['poster'], 'thumb': i['poster'], 'poster': i['poster']}) #elif 'poster2' in i and not i['poster2'] == '0': #art.update({'icon': i['poster2'], 'thumb': i['poster2'], 'poster': i['poster2']}) else: art.update({'icon': addonPoster, 'thumb': addonPoster, 'poster': addonPoster}) if 'banner' in i and not i['banner'] == '0': art.update({'banner': i['banner']}) #elif 'banner2' in i and not i['banner2'] == '0': #art.update({'banner': i['banner2']}) elif 'fanart' in i and not i['fanart'] == '0': art.update({'banner': i['fanart']}) else: art.update({'banner': addonBanner}) if 'clearlogo' in i and not i['clearlogo'] == '0': art.update({'clearlogo': i['clearlogo']}) if 'clearart' in i and not i['clearart'] == '0': art.update({'clearart': i['clearart']}) if settingFanart == 'true' and 'fanart' in i and not i['fanart'] == '0': item.setProperty('Fanart_Image', i['fanart']) #elif settingFanart == 'true' and 'fanart2' in i and not i['fanart2'] == '0': #item.setProperty('Fanart_Image', i['fanart2']) elif not addonFanart == None: item.setProperty('Fanart_Image', addonFanart) item.setArt(art) item.addContextMenuItems(cm) item.setInfo(type='Video', infoLabels = meta) video_streaminfo = {'codec': 'h264'} item.addStreamInfo('video', video_streaminfo) control.addItem(handle=syshandle, url=url, listitem=item, isFolder=True) except: pass try: url = items[0]['next'] if url == '': raise Exception() icon = control.addonNext() url = '%s?action=tvshowPage&url=%s' % (sysaddon, urllib.quote_plus(url)) item = control.item(label=nextMenu) item.setArt({'icon': icon, 'thumb': icon, 'poster': icon, 'banner': icon}) if not addonFanart == None: item.setProperty('Fanart_Image', addonFanart) control.addItem(handle=syshandle, url=url, listitem=item, isFolder=True) except: pass control.content(syshandle, 'tvshows') control.directory(syshandle, cacheToDisc=True) views.setView('tvshows', {'skin.estuary': 55, 'skin.confluence': 500})
def tvshowDirectory(self, items): if items == None or len(items) == 0: return isFolder = True if control.setting('autoplay') == 'false' and control.setting('hosts.mode') == '1' else False isFolder = False if control.window.getProperty('PseudoTVRunning') == 'True' else isFolder traktCredentials = trakt.getTraktCredentialsInfo() indicators = playcount.getTVShowIndicators() addonPoster, addonBanner = control.addonPoster(), control.addonBanner() addonFanart, settingFanart = control.addonFanart(), control.setting('fanart') sysaddon = sys.argv[0] for i in items: try: label = i['title'] systitle = sysname = urllib.quote_plus(i['originaltitle']) sysimage = urllib.quote_plus(i['poster']) imdb, tvdb, year = i['imdb'], i['tvdb'], i['year'] poster, banner, fanart = i['poster'], i['banner'], i['fanart'] if banner == '0' and not poster == '0': banner = poster if poster == '0': poster = addonPoster if banner == '0': banner = addonBanner meta = dict((k,v) for k, v in i.iteritems() if not v == '0') meta.update({'trailer': '%s?action=trailer&name=%s' % (sysaddon, sysname)}) if i['duration'] == '0': meta.update({'duration': '60'}) try: meta.update({'duration': str(int(meta['duration']) * 60)}) except: pass try: meta.update({'genre': cleangenre.lang(meta['genre'], self.lang)}) except: pass sysmeta = urllib.quote_plus(json.dumps(meta)) url = '%s?action=seasons&tvshowtitle=%s&year=%s&imdb=%s&tvdb=%s' % (sysaddon, systitle, year, imdb, tvdb) try: overlay = int(playcount.getTVShowOverlay(indicators, tvdb)) if overlay == 7: meta.update({'playcount': 1, 'overlay': 7}) else: meta.update({'playcount': 0, 'overlay': 6}) except: pass cm = [] if isFolder == False: cm.append((control.lang(30232).encode('utf-8'), 'RunPlugin(%s?action=queueItem)' % sysaddon)) if traktCredentials == True: cm.append((control.lang(30236).encode('utf-8'), 'RunPlugin(%s?action=traktManager&name=%s&tvdb=%s&content=tvshow)' % (sysaddon, sysname, tvdb))) cm.append((control.lang(30242).encode('utf-8'), 'RunPlugin(%s?action=trailer&name=%s)' % (sysaddon, sysname))) cm.append((control.lang(30233).encode('utf-8'), 'Action(Info)')) cm.append((control.lang(30234).encode('utf-8'), 'RunPlugin(%s?action=tvPlaycount&name=%s&imdb=%s&tvdb=%s&query=7)' % (sysaddon, systitle, imdb, tvdb))) cm.append((control.lang(30235).encode('utf-8'), 'RunPlugin(%s?action=tvPlaycount&name=%s&imdb=%s&tvdb=%s&query=6)' % (sysaddon, systitle, imdb, tvdb))) cm.append((control.lang(30240).encode('utf-8'), 'RunPlugin(%s?action=addView&content=tvshows)' % sysaddon)) item = control.item(label=label, iconImage=poster, thumbnailImage=poster) try: item.setArt({'poster': poster, 'tvshow.poster': poster, 'season.poster': poster, 'banner': banner, 'tvshow.banner': banner, 'season.banner': banner}) except: pass if settingFanart == 'true' and not fanart == '0': item.setProperty('Fanart_Image', fanart) elif not addonFanart == None: item.setProperty('Fanart_Image', addonFanart) item.setInfo(type='Video', infoLabels = meta) item.setProperty('Video', 'true') item.addContextMenuItems(cm, replaceItems=True) control.addItem(handle=int(sys.argv[1]), url=url, listitem=item, isFolder=True) except: pass try: url = items[0]['next'] if url == '': raise Exception() url = '%s?action=tvshows&url=%s' % (sysaddon, urllib.quote_plus(url)) addonNext = control.addonNext() item = control.item(label=control.lang(30241).encode('utf-8'), iconImage=addonNext, thumbnailImage=addonNext) item.addContextMenuItems([], replaceItems=False) if not addonFanart == None: item.setProperty('Fanart_Image', addonFanart) control.addItem(handle=int(sys.argv[1]), url=url, listitem=item, isFolder=True) except: pass control.content(int(sys.argv[1]), 'tvshows') control.directory(int(sys.argv[1]), cacheToDisc=True) views.setView('tvshows', {'skin.estuary': 54, 'skin.confluence': 500})
def movieDirectory(self, items, unfinished=False, next=True): if not items: # with reuselanguageinvoker on an empty directory must be loaded, do not use sys.exit() control.hide() ; control.notification(title=32001, message=33049) from resources.lib.modules.player import Bookmarks sysaddon, syshandle = argv[0], int(argv[1]) disable_player_art = control.setting('disable.player.art') == 'true' hosts_mode = control.setting('hosts.mode') is_widget = 'plugin' not in control.infoLabel('Container.PluginName') settingFanart = control.setting('fanart') == 'true' addonPoster, addonFanart, addonBanner = control.addonPoster(), control.addonFanart(), control.addonBanner() indicators = playcount.getMovieIndicators(refresh=True) isPlayable = 'false' if 'plugin' not in control.infoLabel('Container.PluginName'): isPlayable = 'true' elif hosts_mode != '1': isPlayable = 'true' if hosts_mode == '2': playbackMenu = control.lang(32063) else: playbackMenu = control.lang(32064) if trakt.getTraktIndicatorsInfo(): watchedMenu, unwatchedMenu = control.lang(32068), control.lang(32069) else: watchedMenu, unwatchedMenu = control.lang(32066), control.lang(32067) playlistManagerMenu, queueMenu = control.lang(35522), control.lang(32065) traktManagerMenu, addToLibrary = control.lang(32070), control.lang(32551) nextMenu, clearSourcesMenu = control.lang(32053), control.lang(32611) for i in items: try: imdb, tmdb, title, year = i.get('imdb', ''), i.get('tmdb', ''), i['title'], i.get('year', '') trailer, runtime = i.get('trailer'), i.get('duration') label = '%s (%s)' % (title, year) try: labelProgress = label + '[COLOR %s] [%s][/COLOR]' % (self.highlight_color, str(round(float(i['progress'] * 100), 1)) + '%') except: labelProgress = label try: if int(re.sub(r'[^0-9]', '', str(i['premiered']))) > int(re.sub(r'[^0-9]', '', str(self.today_date))): labelProgress = '[COLOR %s][I]%s[/I][/COLOR]' % (self.unairedcolor, labelProgress) except: pass if i.get('traktHistory') is True: try: air_time = tools.Time.convert(stringTime=i.get('lastplayed', ''), zoneFrom='utc', zoneTo='local', formatInput='%Y-%m-%dT%H:%M:%S.000Z', formatOutput='%b %d %Y %I:%M %p') if air_time[12] == '0': air_time = air_time[:12] + '' + air_time[13:] labelProgress = labelProgress + '[COLOR %s] [%s][/COLOR]' % (self.highlight_color, air_time) except: pass sysname, systitle = quote_plus(label), quote_plus(title) meta = dict((k, v) for k, v in control.iteritems(i) if v is not None and v != '') meta.update({'code': imdb, 'imdbnumber': imdb, 'mediatype': 'movie', 'tag': [imdb, tmdb]}) try: meta.update({'genre': cleangenre.lang(meta['genre'], self.lang)}) except: pass poster = meta.get('poster3') or meta.get('poster2') or meta.get('poster') or addonPoster fanart = '' if settingFanart: fanart = meta.get('fanart3') or meta.get('fanart2') or meta.get('fanart') or addonFanart landscape = meta.get('landscape') or fanart thumb = meta.get('thumb') or poster or landscape icon = meta.get('icon') or poster banner = meta.get('banner3') or meta.get('banner2') or meta.get('banner') or addonBanner art = {} if disable_player_art and hosts_mode == '2': # setResolvedUrl uses the selected ListItem so pop keys out here if user wants no player art for k in ('clearart', 'clearlogo', 'discart'): meta.pop(k, None) art.update({'icon': icon, 'thumb': thumb, 'banner': banner, 'poster': poster, 'fanart': fanart, 'landscape': landscape, 'clearlogo': meta.get('clearlogo', ''), 'clearart': meta.get('clearart', ''), 'discart': meta.get('discart', ''), 'keyart': meta.get('keyart', '')}) for k in ('poster2', 'poster3', 'fanart2', 'fanart3', 'banner2', 'banner3', 'trailer'): meta.pop(k, None) meta.update({'poster': poster, 'fanart': fanart, 'banner': banner}) ####-Context Menu and Overlays-#### cm = [] if self.traktCredentials: cm.append((traktManagerMenu, 'RunPlugin(%s?action=tools_traktManager&name=%s&imdb=%s)' % (sysaddon, sysname, imdb))) try: overlay = int(playcount.getMovieOverlay(indicators, imdb)) watched = (overlay == 5) if watched: cm.append((unwatchedMenu, 'RunPlugin(%s?action=playcount_Movie&name=%s&imdb=%s&query=4)' % (sysaddon, sysname, imdb))) meta.update({'playcount': 1, 'overlay': 5}) # lastplayed = trakt.watchedMoviesTime(imdb) # meta.update({'lastplayed': lastplayed}) else: cm.append((watchedMenu, 'RunPlugin(%s?action=playcount_Movie&name=%s&imdb=%s&query=5)' % (sysaddon, sysname, imdb))) meta.update({'playcount': 0, 'overlay': 4}) except: pass sysmeta, sysart = quote_plus(jsdumps(meta)), quote_plus(jsdumps(art)) url = '%s?action=play&title=%s&year=%s&imdb=%s&tmdb=%s&meta=%s' % (sysaddon, systitle, year, imdb, tmdb, sysmeta) sysurl = quote_plus(url) cm.append((playlistManagerMenu, 'RunPlugin(%s?action=playlist_Manager&name=%s&url=%s&meta=%s&art=%s)' % (sysaddon, sysname, sysurl, sysmeta, sysart))) cm.append((queueMenu, 'RunPlugin(%s?action=playlist_QueueItem&name=%s)' % (sysaddon, sysname))) cm.append((playbackMenu, 'RunPlugin(%s?action=alterSources&url=%s&meta=%s)' % (sysaddon, sysurl, sysmeta))) if hosts_mode == '1': cm.append(('Rescrape Item', 'RunPlugin(%s?action=play&title=%s&year=%s&imdb=%s&tmdb=%s&meta=%s&rescrape=true)' % (sysaddon, systitle, year, imdb, tmdb, sysmeta))) elif hosts_mode != '1': cm.append(('Rescrape Item', 'PlayMedia(%s?action=play&title=%s&year=%s&imdb=%s&tmdb=%s&meta=%s&rescrape=true)' % (sysaddon, systitle, year, imdb, tmdb, sysmeta))) cm.append((addToLibrary, 'RunPlugin(%s?action=library_movieToLibrary&name=%s&title=%s&year=%s&imdb=%s&tmdb=%s)' % (sysaddon, sysname, systitle, year, imdb, tmdb))) cm.append(('Find similar', 'ActivateWindow(10025,%s?action=movies&url=https://api.trakt.tv/movies/%s/related,return)' % (sysaddon, imdb))) cm.append((clearSourcesMenu, 'RunPlugin(%s?action=cache_clearSources)' % sysaddon)) cm.append(('[COLOR red]Venom Settings[/COLOR]', 'RunPlugin(%s?action=tools_openSettings)' % sysaddon)) #################################### if trailer: meta.update({'trailer': trailer}) else: meta.update({'trailer': '%s?action=trailer&type=%s&name=%s&year=%s&imdb=%s' % (sysaddon, 'movie', sysname, year, imdb)}) item = control.item(label=labelProgress, offscreen=True) if 'castandart' in i: item.setCast(i['castandart']) item.setArt(art) item.setUniqueIDs({'imdb': imdb, 'tmdb': tmdb}) item.setProperty('IsPlayable', isPlayable) if is_widget: item.setProperty('isVenom_widget', 'true') resumetime = Bookmarks().get(name=label, imdb=imdb, tmdb=tmdb, year=str(year), runtime=runtime, ck=True) # item.setProperty('TotalTime', str(meta['duration'])) # Adding this property causes the Kodi bookmark CM items to be added item.setProperty('ResumeTime', str(resumetime)) try: watched_percent = round(float(resumetime) / float(runtime) * 100, 1) # resumetime and runtime are both in seconds item.setProperty('PercentPlayed', str(watched_percent)) except: pass item.setInfo(type='video', infoLabels=control.metadataClean(meta)) item.addContextMenuItems(cm) control.addItem(handle=syshandle, url=url, listitem=item, isFolder=False) except: log_utils.error() if next: try: if not items: raise Exception() url = items[0]['next'] if not url: raise Exception() url_params = dict(parse_qsl(urlsplit(url).query)) if 'imdb.com' in url and 'start' in url_params: page = ' [I](%s)[/I]' % str(int(((int(url_params.get('start')) - 1) / int(self.count)) + 1)) else: page = ' [I](%s)[/I]' % url_params.get('page') nextMenu = '[COLOR skyblue]' + nextMenu + page + '[/COLOR]' u = urlparse(url).netloc.lower() if u not in self.tmdb_link: url = '%s?action=moviePage&url=%s' % (sysaddon, quote_plus(url)) elif u in self.tmdb_link: url = '%s?action=tmdbmoviePage&url=%s' % (sysaddon, quote_plus(url)) item = control.item(label=nextMenu, offscreen=True) icon = control.addonNext() item.setProperty('IsPlayable', 'false') item.setArt({'icon': icon, 'thumb': icon, 'poster': icon, 'banner': icon}) item.setProperty ('SpecialSort', 'bottom') control.addItem(handle=syshandle, url=url, listitem=item, isFolder=True) except: log_utils.error() control.content(syshandle, 'movies') control.directory(syshandle, cacheToDisc=True) control.sleep(500) views.setView('movies', {'skin.estuary': 55, 'skin.confluence': 500})
def movieDirectory(self, items): if items == None or len(items) == 0: return isFolder = True if control.setting('autoplay') == 'false' and control.setting('hosts.mode') == '1' else False isFolder = False if control.window.getProperty('PseudoTVRunning') == 'True' else isFolder playbackMenu = control.lang(30204).encode('utf-8') if control.setting('autoplay') == 'true' else control.lang(30203).encode('utf-8') traktCredentials = trakt.getTraktCredentialsInfo() indicators = playcount.getMovieIndicators() cacheToDisc = False if not action == 'movieSearch' else True addonPoster, addonBanner = control.addonPoster(), control.addonBanner() addonFanart, settingFanart = control.addonFanart(), control.setting('fanart') sysaddon = sys.argv[0] for i in items: try: label = '%s (%s)' % (i['title'], i['year']) imdb, title, year = i['imdb'], i['originaltitle'], i['year'] sysname = urllib.quote_plus('%s (%s)' % (title, year)) sysimage = urllib.quote_plus(i['poster']) systitle = urllib.quote_plus(title) poster, banner, fanart = i['poster'], i['banner'], i['fanart'] if poster == '0': poster = addonPoster if banner == '0' and poster == '0': banner = addonBanner elif banner == '0': banner = poster meta = dict((k,v) for k, v in i.iteritems() if not v == '0') meta.update({'trailer': '%s?action=trailer&name=%s' % (sysaddon, sysname)}) if i['duration'] == '0': meta.update({'duration': '120'}) try: meta.update({'duration': str(int(meta['duration']) * 60)}) except: pass try: meta.update({'genre': cleangenre.lang(meta['genre'], self.lang)}) except: pass try: del meta['tagline'] except: pass sysmeta = urllib.quote_plus(json.dumps(meta)) url = '%s?action=play&title=%s&year=%s&imdb=%s&meta=%s&t=%s' % (sysaddon, systitle, year, imdb, sysmeta, self.systime) sysurl = urllib.quote_plus(url) path = '%s?action=play&title=%s&year=%s&imdb=%s' % (sysaddon, systitle, year, imdb) if isFolder == True: url = '%s?action=sources&title=%s&year=%s&imdb=%s&meta=%s' % (sysaddon, systitle, year, imdb, sysmeta) try: overlay = int(playcount.getMovieOverlay(indicators, imdb)) if overlay == 7: meta.update({'playcount': 1, 'overlay': 7}) else: meta.update({'playcount': 0, 'overlay': 6}) except: pass cm = [] cm.append((playbackMenu, 'RunPlugin(%s?action=alterSources&url=%s&meta=%s)' % (sysaddon, sysurl, sysmeta))) if isFolder == False: cm.append((control.lang(30202).encode('utf-8'), 'RunPlugin(%s?action=queueItem)' % sysaddon)) if traktCredentials == True: cm.append((control.lang(30208).encode('utf-8'), 'RunPlugin(%s?action=traktManager&name=%s&imdb=%s&content=movie)' % (sysaddon, sysname, imdb))) cm.append((control.lang(30214).encode('utf-8'), 'RunPlugin(%s?action=trailer&name=%s)' % (sysaddon, sysname))) cm.append((control.lang(30205).encode('utf-8'), 'Action(Info)')) cm.append((control.lang(30206).encode('utf-8'), 'RunPlugin(%s?action=moviePlaycount&imdb=%s&query=7)' % (sysaddon, imdb))) cm.append((control.lang(30207).encode('utf-8'), 'RunPlugin(%s?action=moviePlaycount&imdb=%s&query=6)' % (sysaddon, imdb))) cm.append((control.lang(30212).encode('utf-8'), 'RunPlugin(%s?action=addView&content=movies)' % sysaddon)) item = control.item(label=label, iconImage=poster, thumbnailImage=poster) try: item.setArt({'poster': poster, 'banner': banner}) except: pass if settingFanart == 'true' and not fanart == '0': item.setProperty('Fanart_Image', fanart) elif not addonFanart == None: item.setProperty('Fanart_Image', addonFanart) item.setInfo(type='Video', infoLabels = meta) item.setProperty('Video', 'true') #item.setProperty('IsPlayable', 'true') item.addContextMenuItems(cm, replaceItems=True) control.addItem(handle=int(sys.argv[1]), url=url, listitem=item, isFolder=isFolder) except: pass try: url = items[0]['next'] if url == '': raise Exception() url = '%s?action=movies&url=%s' % (sysaddon, urllib.quote_plus(url)) addonNext = control.addonNext() item = control.item(label=control.lang(30213).encode('utf-8'), iconImage=addonNext, thumbnailImage=addonNext) item.addContextMenuItems([], replaceItems=True) if not addonFanart == None: item.setProperty('Fanart_Image', addonFanart) control.addItem(handle=int(sys.argv[1]), url=url, listitem=item, isFolder=True) except: pass control.content(int(sys.argv[1]), 'movies') control.directory(int(sys.argv[1]), cacheToDisc=cacheToDisc) views.setView('movies', {'skin.confluence': 500})
def get_list(id, page=1, page_size=50): qs = { 'limit': page_size, 'maxRating': 18, 'offerids': urllib.quote_plus(','.join(get_offers())), 'orderby': 'titleAsc', # DateDesc 'page': page } url = 'https://apim.oi.net.br/app/oiplay/ummex/v1/lists/{id}?{query}'.format( id=id, query=urllib.urlencode(qs)) response = request_cached(url) hosts = get_subscribed_host_ids() for item in response.get('items', []): provider = next((cp for cp in item.get('contentProviders', []) if cp.get('hostId') in hosts), {}) if not provider: continue yield { 'handler': __name__, 'method': 'get_content', 'id': item.get('tmsId'), 'label': item.get('title'), 'title': item.get('title'), 'tvshowtitle': item.get('seriesTitle'), 'plot': item.get('synopsis'), 'genre': item.get('genres'), 'year': item.get('releaseYear'), 'episode': item.get('episodeNumber'), 'season': item.get('seasonNumber'), 'mpaa': item.get('rating'), 'duration': item.get('durationInSeconds', 0), 'setCast': [{ 'name': cast.get('name'), 'thumbnail': cast.get('photoUrl'), } for cast in item.get('castMembers', [])], 'directors': item.get('directors'), 'playType': item.get('playType'), 'adult': item.get('isAdult'), 'mediatype': 'movie' if item.get('itemType') == 'Movie' else 'tvshow' if item.get('itemType') == 'Serie' else 'video', 'art': { 'thumb': next((image.get('url') for image in item.get('programImages', []) if image.get('type') == 'Thumbnail'), LOGO), 'fanart': next((image.get('url') for image in item.get('programImages', []) if image.get('type') == 'Backdrop'), FANART), } } if len(response.get('items', [])) >= page_size: yield { 'handler': __name__, 'method': 'get_list', 'id': id, 'page': page + 1, 'label': control.lang(34136).encode('utf-8'), 'art': { 'poster': control.addonNext(), 'fanart': FANART }, 'properties': { 'SpecialSort': 'bottom' } }
def tvshowDirectory(self, items): if items == None or len(items) == 0: return isFolder = True if control.setting( 'autoplay') == 'false' and control.setting( 'hosts.mode') == '1' else False isFolder = False if control.window.getProperty( 'PseudoTVRunning') == 'True' else isFolder traktCredentials = trakt.getTraktCredentialsInfo() indicators = playcount.getTVShowIndicators() addonPoster, addonBanner = control.addonPoster(), control.addonBanner() addonFanart, settingFanart = control.addonFanart(), control.setting( 'fanart') sysaddon = sys.argv[0] for i in items: try: label = i['title'] systitle = sysname = urllib.quote_plus(i['originaltitle']) sysimage = urllib.quote_plus(i['poster']) imdb, tvdb, year = i['imdb'], i['tvdb'], i['year'] poster, banner, fanart = i['poster'], i['banner'], i['fanart'] if banner == '0' and not poster == '0': banner = poster if poster == '0': poster = addonPoster if banner == '0': banner = addonBanner meta = dict((k, v) for k, v in i.iteritems() if not v == '0') meta.update({ 'trailer': '%s?action=trailer&name=%s' % (sysaddon, sysname) }) if i['duration'] == '0': meta.update({'duration': '60'}) try: meta.update({'duration': str(int(meta['duration']) * 60)}) except: pass try: meta.update( {'genre': cleangenre.lang(meta['genre'], self.lang)}) except: pass sysmeta = urllib.quote_plus(json.dumps(meta)) url = '%s?action=seasons&tvshowtitle=%s&year=%s&imdb=%s&tvdb=%s' % ( sysaddon, systitle, year, imdb, tvdb) try: overlay = int(playcount.getTVShowOverlay(indicators, tvdb)) if overlay == 7: meta.update({'playcount': 1, 'overlay': 7}) else: meta.update({'playcount': 0, 'overlay': 6}) except: pass cm = [] if isFolder == False: cm.append((control.lang(30232).encode('utf-8'), 'RunPlugin(%s?action=queueItem)' % sysaddon)) if traktCredentials == True: cm.append((control.lang(30236).encode( 'utf-8' ), 'RunPlugin(%s?action=traktManager&name=%s&tvdb=%s&content=tvshow)' % (sysaddon, sysname, tvdb))) cm.append((control.lang(30242).encode('utf-8'), 'RunPlugin(%s?action=trailer&name=%s)' % (sysaddon, sysname))) cm.append( (control.lang(30233).encode('utf-8'), 'Action(Info)')) cm.append((control.lang(30234).encode( 'utf-8' ), 'RunPlugin(%s?action=tvPlaycount&name=%s&imdb=%s&tvdb=%s&query=7)' % (sysaddon, systitle, imdb, tvdb))) cm.append((control.lang(30235).encode( 'utf-8' ), 'RunPlugin(%s?action=tvPlaycount&name=%s&imdb=%s&tvdb=%s&query=6)' % (sysaddon, systitle, imdb, tvdb))) cm.append((control.lang(30240).encode('utf-8'), 'RunPlugin(%s?action=addView&content=tvshows)' % sysaddon)) item = control.item(label=label, iconImage=poster, thumbnailImage=poster) try: item.setArt({ 'poster': poster, 'tvshow.poster': poster, 'season.poster': poster, 'banner': banner, 'tvshow.banner': banner, 'season.banner': banner }) except: pass if settingFanart == 'true' and not fanart == '0': item.setProperty('Fanart_Image', fanart) elif not addonFanart == None: item.setProperty('Fanart_Image', addonFanart) item.setInfo(type='Video', infoLabels=meta) item.setProperty('Video', 'true') item.addContextMenuItems(cm, replaceItems=True) control.addItem(handle=int(sys.argv[1]), url=url, listitem=item, isFolder=True) except: pass try: url = items[0]['next'] if url == '': raise Exception() url = '%s?action=tvshows&url=%s' % (sysaddon, urllib.quote_plus(url)) addonNext = control.addonNext() item = control.item(label=control.lang(30241).encode('utf-8'), iconImage=addonNext, thumbnailImage=addonNext) item.addContextMenuItems([], replaceItems=False) if not addonFanart == None: item.setProperty('Fanart_Image', addonFanart) control.addItem(handle=int(sys.argv[1]), url=url, listitem=item, isFolder=True) except: pass control.content(int(sys.argv[1]), 'tvshows') control.directory(int(sys.argv[1]), cacheToDisc=True) views.setView('tvshows', {'skin.confluence': 500})
def search(query, page=1): if not query: yield control.run_plugin_url() return print('[BRplay] - search: %s | %s' % (query, page)) threads = [] if control.is_globoplay_available(): threads.append( workers.Thread(convert_to_list, globoplay.search, query, page)) if control.is_globosat_available(): threads.append( workers.Thread(convert_to_list, globosat.search, query, page)) if control.is_telecine_available(): threads.append( workers.Thread(convert_to_list, telecine.search, query, page)) if control.is_oiplay_available(): threads.append( workers.Thread(convert_to_list, oiplay.search, query, page)) if control.is_nowonline_available(): threads.append( workers.Thread(convert_to_list, netnow.search, query, page)) if control.is_tntplay_available(): threads.append( workers.Thread(convert_to_list, tnt_vod.search, query, page)) [i.start() for i in threads] [i.join() for i in threads] random.shuffle(threads) all_results = (thread.get_result() for thread in threads) control.log(all_results) combined = list(roundrobin(*all_results)) # combined = chain(*all_results) has_next_page = False if not combined: control.okDialog(line1=control.lang(34141).encode('utf-8'), heading=control.lang(32010).encode('utf-8')) yield control.run_plugin_url() return rank = 1 for result in combined: if result.get('page'): has_next_page = True continue result.update({ 'sort': [(control.SORT_METHOD_UNSORTED, '%U'), control.SORT_METHOD_STUDIO], # 'sort': [(control.SORT_METHOD_TRACKNUM, '%U'), control.SORT_METHOD_STUDIO, (control.SORT_METHOD_LABEL_IGNORE_FOLDERS, '%U')], 'tracknumber': rank, 'sorttitle': '%04d' % (rank, ), 'content': 'episodes', 'mediatype': 'video' }) rank += 1 yield result if has_next_page: yield { 'handler': __name__, 'method': 'search', 'query': query, 'page': page + 1, 'label': '%s (%s)' % (control.lang(34136).encode('utf-8'), page + 1), 'art': { 'poster': control.addonNext(), 'fanart': control.addonFanart() }, 'properties': { 'SpecialSort': 'bottom' } }
def scrape(self, url): url = urlparse.urljoin(self.base_main_link, url) items = [] try: html = client.request(url, timeout=10) item_list = client.parseDOM( html, 'div', attrs={'class': 'item col-lg-3 col-md-3 col-sm-12 '}) for content in item_list: link = re.compile('href="(.+?)"', re.DOTALL).findall(content)[0] icon, title = re.compile('img src="(.+?)" alt="(.+?)"', re.DOTALL).findall(content)[0] try: link = link.replace(self.base_main_link, '') title = utils.convert(title).encode('utf-8') item = control.item(label=title) item.setArt({"thumb": icon, "icon": icon}) if 'videos_categories' in link: # Still navigating categories link = '%s?action=b98RabbitNav&url=%s' % (sysaddon, link) items.append((link, item, True)) else: # This is where the goodies are item.setInfo(type="video", infoLabels={ "Title": title, "mediatype": "video" }) item.setProperty("IsPlayable", "true") link = '%s?action=b98CarrotLink&url=%s&title=%s&image=%s' % ( sysaddon, link, title, icon) items.append((link, item, False)) except Exception: failure = traceback.format_exc() log_utils.log('B98 - Failed to Build: \n' + str(failure)) continue # Try doing a next hole, if available try: navi_link = re.compile( 'a class="next page-numbers" href="(.+?)"', re.DOTALL).findall(html)[0] navi_link = navi_link.replace(self.base_main_link, '') next_url = '%s?action=b98RabbitNav&url=%s' % (sysaddon, navi_link) item = control.item(label=control.lang(32053).encode('utf-8')) item.setArt({ "thumb": control.addonNext(), "icon": control.addonNext() }) items.append((next_url, item, True)) except Exception: pass except Exception: pass control.addItems(syshandle, items) self.endDirectory(category='B98 Cartoons')
def get_title(title_id, page=1): if not title_id: return control.log('get_title: %s | page %s' % (title_id, page)) variables = '{{"titleId":"{id}", "episodeTitlePage": {page}, "userIsLoggedIn": true}}'.format( id=title_id, page=page) query = 'query%20getTitleFavorited%28%24titleId%3A%20String%2C%20%24episodeTitlePage%3A%20Int%2C%20%24episodeTitlePerPage%3A%20Int%20%3D%20300%2C%20%24userIsLoggedIn%3A%20Boolean%21%29%20%7B%0A%20%20title%28titleId%3A%20%24titleId%29%20%7B%0A%20%20%20%20...titleFragment%0A%20%20%20%20...continueWatchingTitleFragment%0A%20%20%20%20favorited%0A%20%20%20%20__typename%0A%20%20%7D%0A%7D%0Afragment%20titleFragment%20on%20Title%20%7B%0A%20%20titleId%0A%20%20slug%0A%20%20headline%0A%20%20originalHeadline%0A%20%20description%0A%20%20originVideoId%0A%20%20originProgramId%0A%20%20type%0A%20%20format%0A%20%20contentRating%0A%20%20contentRatingCriteria%0A%20%20releaseYear%0A%20%20channel%20%7B%0A%20%20%20%20id%0A%20%20%20%20name%0A%20%20%20%20slug%0A%20%20%7D%0A%20%20cover%20%7B%0A%20%20%20%20%20%20landscape%28scale%3A%20X1080%29%0A%20%20%20%20%20%20web%0A%20%20%20%20%7D%0A%20%20poster%20%7B%0A%20%20%20%20web%0A%20%20%7D%0A%20%20logo%20%7B%0A%20%20%20%20web%0A%20%20%7D%0A%20%20countries%0A%20%20genresNames%0A%20%20directorsNames%0A%20%20artDirectorsNames%0A%20%20authorsNames%0A%20%20castNames%0A%20%20screenwritersNames%0A%20%20structure%20%7B%0A%20%20%20%20%20%20...seasonedStructureFragment%0A%20%20%20%20%20%20...filmPlaybackStructureFragment%0A%20%20%20%20%20%20...episodeListStructureFragment%0A%20%20%20%20%7D%0A%7D%0Afragment%20seasonedStructureFragment%20on%20SeasonedStructure%20%7B%0A%20%20seasons%20%7B%0A%20%20%20%20resources%20%7B%0A%20%20%20%20%20%20id%0A%20%20%20%20%20%20number%0A%20%20%20%20%20%20titleId%0A%20%20%20%20%20%20totalEpisodes%0A%20%20%20%20%20%20episodes%28page%3A%20%24episodeTitlePage%2C%20perPage%3A%20%24episodeTitlePerPage%29%20%7B%0A%20%20%20%20%20%20%20%20page%0A%20%20%20%20%20%20%20%20hasNextPage%0A%20%20%20%20%20%20%20%20nextPage%0A%20%20%20%20%20%20%20%20resources%20%7B%0A%20%20%20%20%20%20%20%20%20%20number%0A%20%20%20%20%20%20%20%20%20%20seasonNumber%0A%20%20%20%20%20%20%20%20%20%20seasonId%0A%20%20%20%20%20%20%20%20%20%20video%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20id%0A%20%20%20%20%20%20%20%20%20%20%20%20exhibitedAt%0A%20%20%20%20%20%20%20%20%20%20%20%20encrypted%0A%20%20%20%20%20%20%20%20%20%20%20%20availableFor%0A%20%20%20%20%20%20%20%20%20%20%20%20headline%0A%20%20%20%20%20%20%20%20%20%20%20%20description%0A%20%20%20%20%20%20%20%20%20%20%20%20thumb%0A%20%20%20%20%20%20%20%20%20%20%20%20duration%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D%0Afragment%20filmPlaybackStructureFragment%20on%20FilmPlaybackStructure%20%7B%0A%20%20videoPlayback%20%7B%0A%20%20%20%20id%0A%20%20%20%20exhibitedAt%0A%20%20%20%20encrypted%0A%20%20%20%20availableFor%0A%20%20%20%20headline%0A%20%20%20%20description%0A%20%20%20%20thumb%0A%20%20%20%20duration%0A%20%20%7D%0A%7D%0Afragment%20episodeListStructureFragment%20on%20EpisodeListStructure%20%7B%0A%20%20episodes%28page%3A%20%24episodeTitlePage%2C%20perPage%3A%20%24episodeTitlePerPage%29%20%7B%0A%20%20%20%20page%0A%20%20%20%20hasNextPage%0A%20%20%20%20nextPage%0A%20%20%20%20resources%20%7B%0A%20%20%20%20%20%20id%0A%20%20%20%20%20%20number%0A%20%20%20%20%20%20seasonNumber%0A%20%20%20%20%20%20seasonId%0A%20%20%20%20%20%20video%20%7B%0A%20%20%20%20%20%20%20%20id%0A%20%20%20%20%20%20%20%20exhibitedAt%0A%20%20%20%20%20%20%20%20encrypted%0A%20%20%20%20%20%20%20%20availableFor%0A%20%20%20%20%20%20%20%20headline%0A%20%20%20%20%20%20%20%20description%0A%20%20%20%20%20%20%20%20thumb%0A%20%20%20%20%20%20%20%20duration%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D%0Afragment%20continueWatchingTitleFragment%20on%20Title%20%7B%0A%20%20structure%20%7B%0A%20%20%20%20...%20on%20SeasonedStructure%20%7B%0A%20%20%20%20%20%20continueWatching%20%40include%28if%3A%20%24userIsLoggedIn%29%20%7B%0A%20%20%20%20%20%20%20%20video%20%7B%0A%20%20%20%20%20%20%20%20%20%20...continueWatchingVideoFragment%0A%20%20%20%20%20%20%20%20%20%20__typename%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20__typename%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20__typename%0A%20%20%20%20%7D%0A%20%20%20%20...%20on%20FilmPlaybackStructure%20%7B%0A%20%20%20%20%20%20continueWatching%20%40include%28if%3A%20%24userIsLoggedIn%29%20%7B%0A%20%20%20%20%20%20%20%20...continueWatchingVideoFragment%0A%20%20%20%20%20%20%20%20__typename%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20__typename%0A%20%20%20%20%7D%0A%20%20%20%20...%20on%20EpisodeListStructure%20%7B%0A%20%20%20%20%20%20continueWatching%20%40include%28if%3A%20%24userIsLoggedIn%29%20%7B%0A%20%20%20%20%20%20%20%20video%20%7B%0A%20%20%20%20%20%20%20%20%20%20...continueWatchingVideoFragment%0A%20%20%20%20%20%20%20%20%20%20__typename%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20__typename%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20__typename%0A%20%20%20%20%7D%0A%20%20%20%20__typename%0A%20%20%7D%0A%20%20__typename%0A%7D%0Afragment%20continueWatchingVideoFragment%20on%20Video%20%7B%0A%20%20id%0A%20%20headline%0A%20%20description%0A%20%20watchedProgress%0A%20%20duration%0A%20%20contentRating%0A%20%20contentRatingCriteria%0A%20%20__typename%0A%7D' title = request_query(query, variables)['data']['title'] if not title.get('structure', {}): return structure = title['structure'] page = 0 is_favorite = title.get('favorited', False) if 'videoPlayback' in structure: video = title['structure']['videoPlayback'] yield { 'handler': PLAYER_HANDLER, 'method': 'playlive', 'id': video.get('id', ''), 'title_id': title.get('titleId'), 'label': title.get('headline', ''), 'title': title.get('headline'), 'originaltitle': title.get('originalHeadline'), 'plot': title.get('description'), 'year': title.get('releaseYear'), 'country': title.get('countries', []), 'genre': title.get('genresNames', []), 'cast': title.get('castNames', []), 'director': title.get('directorsNames', []), 'writer': title.get('screenwritersNames', []), 'credits': title.get('artDirectorsNames', []), 'mpaa': title.get('contentRating'), 'studio': title.get('channel', {}).get('name'), 'mediatype': 'movie', 'IsPlayable': True, 'art': { 'clearlogo': title.get('logo', {}).get('web'), 'poster': title.get('poster', {}).get('web'), 'fanart': title.get('cover', {}).get('landscape', FANART) } } elif 'episodes' in structure: episodes = structure.get('episodes', {}) page = episodes.get('nextPage', 0) if episodes.get( 'hasNextPage', False) else 0 for resource in episodes.get('resources', []): video = resource.get('video', {}) yield { 'handler': PLAYER_HANDLER, 'method': 'playlive', 'IsPlayable': True, 'id': video.get('id'), 'label': video.get('headline', ''), 'title': video.get('headline', ''), 'originaltitle': title.get('originalHeadline'), 'plot': video.get('description', ''), 'duration': video.get('duration', 0) / 1000, 'episode': resource.get('number'), 'season': resource.get('seasonNumber'), 'mediatype': 'episode', 'tvshowtitle': title.get('headline'), 'year': title.get('releaseYear'), 'country': title.get('countries', []), 'genre': title.get('genresNames', []), 'cast': title.get('castNames', []), 'director': title.get('directorsNames', []), 'writer': title.get('screenwritersNames', []), 'credits': title.get('artDirectorsNames', []), 'mpaa': title.get('contentRating'), 'studio': title.get('channel', {}).get('name'), 'aired': (video.get('exhibitedAt', '') or '').split('T')[0], 'art': { 'thumb': video.get('thumb'), 'fanart': title.get('cover', {}).get('landscape', FANART), 'tvshow.poster': title.get('poster', {}).get('web'), }, 'sort': control.SORT_METHOD_EPISODE if resource.get('number') and resource.get('seasonNumber') else None } elif 'seasons' in structure: seasons = structure.get('seasons', {}).get('resources', []) if len(seasons) == 1: season = seasons[0] for episode in season.get('episodes', {}).get('resources', []): video = episode.get('video', {}) yield { 'handler': PLAYER_HANDLER, 'method': 'playlive', 'IsPlayable': True, 'id': video.get('id'), 'label': video.get('headline', ''), 'title': video.get('headline', ''), 'originaltitle': title.get('originalHeadline'), 'plot': video.get('description', ''), 'duration': video.get('duration', 0) / 1000, 'episode': episode.get('number'), 'season': episode.get('seasonNumber'), 'mediatype': 'episode', 'tvshowtitle': title.get('headline'), 'year': title.get('releaseYear'), 'country': title.get('countries', []), 'genre': title.get('genresNames', []), 'cast': title.get('castNames', []), 'director': title.get('directorsNames', []), 'writer': title.get('screenwritersNames', []), 'credits': title.get('artDirectorsNames', []), 'mpaa': title.get('contentRating'), 'studio': title.get('channel', {}).get('name'), 'aired': (video.get('exhibitedAt', '') or '').split('T')[0], 'art': { 'thumb': video.get('thumb'), 'fanart': title.get('cover', {}).get('landscape', FANART), 'tvshow.poster': title.get('poster', {}).get('web'), }, 'sort': control.SORT_METHOD_EPISODE } else: for season in structure.get('seasons', {}).get('resources', []): yield { 'handler': __name__, 'method': 'get_episodes', 'title_id': title_id, 'label': '%s %s' % (control.lang(34137).encode('utf-8'), season.get('number', 0)), 'sort': [(control.SORT_METHOD_LABEL, '%Y')], 'season': season.get('number', 0), 'mediatype': 'season', 'art': { 'clearlogo': title.get('logo', {}).get('web'), 'poster': title.get('poster', {}).get('web'), 'fanart': title.get('cover', {}).get('landscape', FANART) } } else: control.log('@@@@@ globosat - unsupported structure: %s' % structure) if page > 0: yield { 'handler': __name__, 'method': 'get_title', 'title_id': title_id, 'page': page, 'label': '%s (%s)' % (control.lang(34136).encode('utf-8'), page), 'art': { 'poster': control.addonNext(), 'fanart': FANART }, 'properties': { 'SpecialSort': 'bottom' } }