def get_authorized_channels(): query = 'query%20getChannelsList%28%24page%3A%20Int%2C%20%24perPage%3A%20Int%29%20%7B%0A%20%20broadcastChannels%28page%3A%20%24page%2C%20perPage%3A%20%24perPage%2C%20filtersInput%3A%20%7Bfilter%3A%20WITH_PAGES%7D%29%20%7B%0A%20%20%20%20page%0A%20%20%20%20perPage%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%20pageIdentifier%0A%20%20%20%20%20%20name%0A%20%20%20%20%20%20logo%28format%3A%20PNG%29%0A%20%20%20%20%20%20trimmedLogo%0A%20%20%20%20%20%20color%0A%20%20%20%20%20%20requireUserTeam%0A%20%20%20%20%20%20pageIdentifier%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D%0A' variables = '{"page":1,"perPage":100}' query_response = request_query(query, variables) resources = query_response['data']['broadcastChannels']['resources'] for broadcast in resources: yield { 'handler': __name__, 'method': 'get_channel_programs', "id": broadcast['id'], "adult": broadcast['id'] in [2065, 2006], 'art': { 'thumb': broadcast['trimmedLogo'], 'fanart': FANART }, 'slug': broadcast['pageIdentifier'], "label": broadcast['name'] } yield { 'handler': pfc.__name__, 'method': 'get_premiere_cards', "id": 1995, "adult": False, 'art': { 'thumb': PREMIERE_LOGO, 'fanart': PREMIERE_FANART }, "label": 'Premiere' }
def get_epg_with_coordinates(media_id, latitude, longitude): query = 'query%20Epg%28%24mediaId%3A%20ID%21%2C%20%24coordinates%3A%20CoordinatesData%29%20%7B%0A%20%20broadcast%28mediaId%3A%20%24mediaId%2C%20coordinates%3A%20%24coordinates%29%20%7B%0A%20%20%20%20...EpgFragment%0A%20%20%7D%0A%7D%0Afragment%20EpgFragment%20on%20Broadcast%20%7B%0A%20%20mediaId%0A%20%20withoutDVRMediaId%0A%20%20imageOnAir%28scale%3A%20X1080%29%0A%20%20channel%20%7B%0A%20%20%20%20id%0A%20%20%20%20name%0A%20%20%20%20logo%28format%3A%20PNG%29%0A%20%20%20%20slug%0A%20%20%7D%0A%20%20affiliateSignal%20%7B%0A%20%20%20%20%20%20id%0A%20%20%20%20%20%20dtvChannel%0A%20%20%20%20%20%20dtvHDID%0A%20%20%20%20%20%20dtvID%0A%20%20%20%20%7D%0A%20%20epgCurrentSlots%28limit%3A%202%29%20%7B%0A%20%20%20%20%20%20titleId%0A%20%20%20%20%20%20programId%0A%20%20%20%20%20%20name%0A%20%20%20%20%20%20metadata%0A%20%20%20%20%20%20description%0A%20%20%20%20%20%20startTime%0A%20%20%20%20%20%20endTime%0A%20%20%20%20%20%20durationInMinutes%0A%20%20%20%20%20%20liveBroadcast%0A%20%20%20%20%20%20tags%0A%20%20%20%20%20%20alternativeTime%0A%20%20%20%20%20%20contentRating%0A%20%20%20%20%20%20contentRatingCriteria%0A%20%20%20%20%20%20title%20%7B%0A%20%20%20%20%20%20%20%20releaseYear%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%20countries%0A%20%20%20%20%20%20%20%20directors%20%7B%0A%20%20%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20cast%20%7B%0A%20%20%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20genres%20%7B%0A%20%20%20%20%20%20%20%20%20%20name%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%20structure%20%7B%0A%20%20%20%20%20%20%20%20%20%20...seasonedStructureFragment%0A%20%20%20%20%20%20%20%20%20%20...filmPlaybackStructureFragment%0A%20%20%20%20%20%20%20%20%20%20...episodeListStructureFragment%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%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%201%2C%20perPage%3A%204%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%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%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%201%2C%20perPage%3A%204%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%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' variables = '{{"mediaId":"{media_id}","coordinates":{{"lat":"{lat}", "long": "{long}"}}}}'.format( media_id=media_id, lat=latitude, long=longitude) response = request_query(query, variables, use_cache=False) return (response.get('data', {}) or {}).get('broadcast', {}) or {}
def get_channel_programs(slug, art=None): if art is None: art = {} variables = '{{"id":"{id}","filter":"HOME"}}'.format(id=slug) query = 'query%20getPageOffers%28%24id%3A%20ID%21%2C%20%24filter%3A%20PageType%29%20%7B%0A%20%20page%3A%20page%28id%3A%20%24id%2C%20filter%3A%20%7Btype%3A%20%24filter%7D%29%20%7B%0A%20%20%20%20offerItems%20%7B%0A%20%20%20%20%20%20...%20on%20PageOffer%20%7B%0A%20%20%20%20%20%20%20%20offerId%0A%20%20%20%20%20%20%20%20title%0A%20%20%20%20%20%20%20%20navigation%20%7B%0A%20%20%20%20%20%20%20%20%20%20...%20on%20URLNavigation%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20url%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20...%20on%20CategoriesPageNavigation%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20identifier%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%20componentType%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D' offers = request_query(query, variables).get('data', {}).get('page', {}).get('offerItems', []) for offer in offers: if not offer: continue if offer.get('componentType') == 'TAKEOVER': continue yield { 'handler': __name__, 'method': 'get_offer', 'id': offer.get('offerId'), 'label': offer.get('title', ''), 'art': { 'thumb': art.get('thumb'), 'fanart': FANART } }
def get_epg_with_coordinates(media_id, latitude, longitude): query = 'query%20getAllBroadcasts%28%24affiliateCode%3A%20String%2C%20%24logoScale%3A%20BroadcastChannelTrimmedLogoScales%20%3D%20X56%2C%20%24imageOnAirScale%3A%20BroadcastImageOnAirScales%20%3D%20X1080%29%20%7B%0A%20%20broadcasts%28filtersInput%3A%20%7BaffiliateCode%3A%20%24affiliateCode%7D%29%20%7B%20%0A%20%20%20%20mediaId%0A%20%20%20%20mutedMediaId%0A%20%20%20%20promotionalMediaId%0A%20%20%20%20promotionalText%0A%20%20%20%20geofencing%0A%20%20%20%20geoblocked%0A%20%20%20%20imageOnAir%28scale%3A%20%24imageOnAirScale%29%0A%20%20%20%20channel%20%7B%0A%20%20%20%20%20%20id%0A%20%20%20%20%20%20color%0A%20%20%20%20%20%20name%0A%20%20%20%20%20%20text%3A%20name%0A%20%20%20%20%20%20logo%28format%3A%20PNG%29%0A%20%20%20%20%20%20trimmedLogo%28scale%3A%20%24logoScale%29%0A%20%20%20%20%20%20slug%0A%20%20%20%20%20%20requireUserTeam%0A%20%20%20%20%7D%0A%20%20%20%20epgCurrentSlots%20%7B%0A%20%20%20%20%20%20composite%0A%20%20%20%20%20%20name%0A%20%20%20%20%20%20titleId%0A%20%20%20%20%20%20metadata%0A%20%20%20%20%20%20description%0A%20%20%20%20%20%20tags%0A%20%20%20%20%20%20startTime%0A%20%20%20%20%20%20endTime%0A%20%20%20%20%20%20liveBroadcast%0A%20%20%20%20%20%20durationInMinutes%0A%20%20%20%20%20%20contentRating%0A%20%20%20%20%20%20contentRatingCriteria%0A%0A%20%20%20%20%20%20title%20%7B%0A%20%20%20%20%20%20%20%20titleId%0A%20%20%20%20%20%20%20%20originProgramId%0A%20%20%20%20%20%20%20%20releaseYear%0A%20%20%20%20%20%20%20%20cover%20%7B%0A%20%20%20%20%20%20%20%20%20%20landscape%28scale%3A%20X1080%29%0A%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%20countries%0A%20%20%20%20%20%20%20%20directorsNames%0A%20%20%20%20%20%20%20%20castNames%0A%20%20%20%20%20%20%20%20genresNames%0A%20%20%20%20%20%20%20%20authorsNames%0A%20%20%20%20%20%20%20%20screenwritersNames%0A%20%20%20%20%20%20%20%20artDirectorsNames%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20media%20%7B%0A%20%20%20%20%20%20serviceId%0A%20%20%20%20%20%20availableFor%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D' variables = '{{"mediaId":"{media_id}","coordinates":{{"lat":"{lat}","long":"{long}"}}}}'.format( media_id=media_id, lat=latitude, long=longitude) response = request_query(query, variables, use_cache=False) return (response.get('data', {}) or {}).get('broadcast', {}) or {}
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_live_channels(): today_str = datetime.datetime.utcnow().strftime('%Y-%m-%d') query = 'query%20getAllBroadcasts%28%24logoScale%3A%20BroadcastChannelTrimmedLogoScales%20%3D%20X56%29%20%7B%0A%20%20broadcasts%20%7B%0A%20%20%20%20mediaId%0A%20%20%20%20mutedMediaId%0A%20%20%20%20promotionalMediaId%0A%20%20%20%20promotionalText%0A%20%20%20%20geofencing%0A%20%20%20%20geoblocked%0A%20%20%20%20channel%20%7B%0A%20%20%20%20%20%20id%0A%20%20%20%20%20%20color%0A%20%20%20%20%20%20name%0A%20%20%20%20%20%20text%3A%20name%0A%20%20%20%20%20%20logo%28format%3A%20PNG%29%0A%20%20%20%20%20%20trimmedLogo%28scale%3A%20%24logoScale%29%0A%20%20%20%20%20%20slug%0A%20%20%20%20%20%20requireUserTeam%0A%20%20%20%20%7D%0A%20%20%20%20epgCurrentSlots%20%7B%0A%20%20%20%20%20%20composite%0A%20%20%20%20%20%20name%0A%20%20%20%20%20%20titleId%0A%20%20%20%20%20%20metadata%0A%20%20%20%20%20%20description%0A%20%20%20%20%20%20tags%0A%20%20%20%20%20%20startTime%0A%20%20%20%20%20%20endTime%0A%20%20%20%20%20%20liveBroadcast%0A%20%20%20%20%20%20durationInMinutes%0A%20%20%20%20%20%20contentRating%0A%20%20%20%20%20%20contentRatingCriteria%0A%0A%20%20%20%20%20%20title%20%7B%0A%20%20%20%20%20%20%20%20titleId%0A%20%20%20%20%20%20%20%20originProgramId%0A%20%20%20%20%20%20%20%20releaseYear%0A%20%20%20%20%20%20%20%20cover%20%7B%0A%20%20%20%20%20%20%20%20%20%20landscape%28scale%3A%20X1080%29%0A%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%20countries%0A%20%20%20%20%20%20%20%20directorsNames%0A%20%20%20%20%20%20%20%20castNames%0A%20%20%20%20%20%20%20%20genresNames%0A%20%20%20%20%20%20%20%20authorsNames%0A%20%20%20%20%20%20%20%20screenwritersNames%0A%20%20%20%20%20%20%20%20artDirectorsNames%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20media%20%7B%0A%20%20%20%20%20%20serviceId%0A%20%20%20%20%20%20availableFor%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D' variables = '{{"date":"{date}"}}'.format(date=today_str) response = request_query(query, variables, use_cache=False) authorized_services = [] if control.setting('globosat_ignore_channel_authorization') != 'true': service_ids = [ broadcast['media']['serviceId'] for broadcast in response['data']['broadcasts'] ] authorized_services = get_authorized_services(service_ids) for broadcast in response['data']['broadcasts']: if 'epgCurrentSlots' not in broadcast or not broadcast[ 'epgCurrentSlots']: continue service_id = broadcast['media']['serviceId'] if control.setting( 'globosat_ignore_channel_authorization') != 'true' and ( service_id not in authorized_services or not auth_helper.is_available_for( broadcast.get('media', {}).get('availableFor'))): continue geofencing = broadcast.get('geofencing', False) media_id = broadcast.get('mediaId') if geofencing: affiliate = get_globosat_affiliate() if affiliate: code, latitude, longitude = control.get_coordinates(affiliate) broadcast = get_epg_with_coordinates(media_id, latitude, longitude) program = next(iter(broadcast.get('epgCurrentSlots')), {}) or {} live_text = u' (' + control.lang( 32004) + u')' if program['liveBroadcast'] else u'' program_detail = u': ' + program['metadata'] if program[ 'metadata'] else u'' program_name = program['name'] + program_detail if program[ 'metadata'] and not program['metadata'].startswith( program['name']) else program['metadata'] if program[ 'metadata'] else program['name'] channel_name = broadcast['channel']['name'] label = u"[B]%s[/B][I] - %s[/I]%s" % (channel_name, program_name, live_text) fanart = FANART_URL.format(media_id=broadcast['mediaId']) # thumb = SNAPSHOT_URL.format(transmission=THUMBS[str(broadcast['channel']['id'])]) + '/?v=' + str(int(time.time())) if str(broadcast['channel']['id']) in THUMBS else THUMB_URL.format(media_id=broadcast['mediaId']) thumb = THUMB_URL.format(media_id=broadcast['mediaId']) program_date = datetime.datetime.utcfromtimestamp(program['startTime']) end_time = datetime.datetime.utcfromtimestamp(program['endTime']) duration = (end_time - program_date).total_seconds() title = program.get('title', {}) or {} thumb = (title.get('cover', {}) or {}).get('landscape', thumb) or thumb program_time_desc = datetime.datetime.strftime( program_date, '%H:%M') + ' - ' + datetime.datetime.strftime( end_time, '%H:%M') description = '%s | %s' % (program_time_desc, program.get('description')) tags = [program_time_desc] if program.get('liveBroadcast', False): tags.append(control.lang(32004)) tags.extend(program.get('tags', []) or []) yield { 'handler': PLAYER_HANDLER, 'method': 'playlive', 'id': media_id, 'IsPlayable': True, 'livefeed': True, 'live': program['liveBroadcast'], 'channel_id': broadcast['channel']['id'], 'service_id': service_id, 'program_id': title.get('originProgramId'), 'studio': 'Canais Globo', 'label': label, 'title': label, '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': program.get('contentRating'), # 'title': program.get('metadata', program.get('name', '')), 'tvshowtitle': program['name'] if program_name else None, 'sorttitle': program_name, 'tag': tags, 'plot': description, 'duration': int(duration), 'dateadded': datetime.datetime.strftime(program_date, '%Y-%m-%d %H:%M:%S'), 'mediatype': 'episode', 'art': { 'icon': broadcast['channel']['logo'], 'clearlogo': broadcast['channel']['logo'], 'fanart': (title.get('cover', {}) or {}).get('landscape', fanart) or fanart, 'thumb': thumb, 'tvshow.poster': (title.get('poster', {}) or {}).get('web', thumb), } }
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 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' } }