예제 #1
0
    def root(self):
        if control.is_globosat_available() or control.is_globoplay_available(
        ) or control.is_oiplay_available() or control.is_tntplay_available():
            self.add_directory_item(32001, 'liveChannels', 'live.png',
                                    'live.png')
            if control.is_globosat_available(
            ) or control.is_globoplay_available():
                self.add_directory_item(32002, 'vodChannels', 'ondemand.png',
                                        'ondemand.png')
        else:
            self.add_directory_item(32005, 'settings', 'tools.png',
                                    'tools.png')

        if control.is_globosat_available():
            self.add_directory_item(32080, 'featured', 'featured.png',
                                    'featured.png')
            self.add_directory_item(32090, 'favorites', 'favorites.png',
                                    'favorites.png')
            self.add_directory_item(32095, 'watchlater', 'userlists.png',
                                    'userlists.png')
            self.add_directory_item(32096, 'watchhistory', 'years.png',
                                    'years.png')

        if control.is_globosat_available() or control.is_globoplay_available():
            self.add_directory_item(32010, 'searchMenu', 'search.png',
                                    'search.png')

        # control.addSortMethod(int(sys.argv[1]), control.SORT_METHOD_LABEL_IGNORE_FOLDERS)

        control.content(syshandle, 'files')

        self.end_directory()
예제 #2
0
    def get_channels(self):

        live = []

        threads = []

        if control.is_globoplay_available():
            threads.append(workers.Thread(self.append_result, globoplay.Indexer().get_live_channels, live))

        if control.is_globosat_available():
            threads.append(workers.Thread(self.append_result, globosat.Indexer().get_live, live))
            if control.show_adult_content:
                threads.append(workers.Thread(self.append_result, sexyhotplay.Indexer().get_live_channels, live))

        if control.is_oiplay_available():
            threads.append(workers.Thread(self.append_result, oiplay.get_live_channels, live))

        if control.is_tntplay_available():
            threads.append(workers.Thread(self.append_result, tntplay.get_live_channels, live))

        if control.is_nowonline_available():
            threads.append(workers.Thread(self.append_result, netnow.get_live_channels, live))

        [i.start() for i in threads]
        [i.join() for i in threads]

        live = sorted(live, key=lambda k: k['sorttitle'])
        # live = sorted(live, key=lambda k: '1' if 'isFolder' in k and k['isFolder'] == 'true' else '0')
        live = sorted(live, key=lambda k: k['dateadded'] if 'dateadded' in k else None, reverse=True)

        # shuffle(live)

        self.channel_directory(live)

        return live
예제 #3
0
def get_channels():
    live = []

    threads = []

    if control.is_globoplay_available():
        threads.append(workers.Thread(globoplay.get_live_channels))

    if control.is_globosat_available():
        threads.append(workers.Thread(globosat.get_live_channels))
        if control.show_adult_content:
            threads.append(workers.Thread(sexyhotplay.get_broadcast))

    if control.is_oiplay_available():
        threads.append(workers.Thread(oiplay.get_live_channels))

    if control.is_tntplay_available():
        threads.append(workers.Thread(tntplay.get_live_channels))

    if control.is_nowonline_available():
        threads.append(workers.Thread(netnow.get_live_channels))

    if control.is_sbt_available():
        threads.append(workers.Thread(sbt.get_live_channels))

    if control.is_pluto_available():
        threads.append(workers.Thread(pluto.get_live_channels))

    [i.start() for i in threads]
    [i.join() for i in threads]

    [live.extend(i.get_result()) for i in threads if i.get_result()]

    control.log(live)

    for channel in live:
        channel.update({
            'sort': [
                control.SORT_METHOD_DATEADDED,
                (control.SORT_METHOD_LABEL_IGNORE_FOLDERS, '%U'),
                (control.SORT_METHOD_VIDEO_SORT_TITLE, '%U'),
                (control.SORT_METHOD_STUDIO, '%L')
            ],
            'overlay':
            4,
            'playcount':
            0,
            'content':
            'tvshows',  # 'content': 'tvshows',  # content: files, songs, artists, albums, movies, tvshows, episodes, musicvideos
            'mediatype':
            'episode',  # 'mediatype': "video", "movie", "tvshow", "season", "episode" or "musicvideo"
        })
        properties = channel.get('properties', {})
        if not properties:
            channel['properties'] = properties
        properties.update({'ResumeTime': 0.0})

    return live
예제 #4
0
    def get_channels(self):

        live = []

        threads = []

        if control.is_globoplay_available():
            threads.append(
                workers.Thread(self.append_result,
                               globoplay.Indexer().get_live_channels, live))

        if control.is_globosat_available():
            threads.append(
                workers.Thread(self.append_result,
                               globosat.Indexer().get_live, live))

        threads.append(
            workers.Thread(self.append_result, futuraplay.get_live_channels,
                           live))

        [i.start() for i in threads]
        [i.join() for i in threads]

        # live.append({
        #     'slug': 'bandnews',
        #     'name': 'Bandnews',
        #     'title': 'Bandnews',
        #     'sorttitle': 'Bandnews',
        #     'logo': os.path.join(control.artPath(), 'logo_bandnews.png'),
        #     # 'clearlogo': os.path.join(control.artPath(), 'logo_bandnews.png'),
        #     'color': None,
        #     'fanart': os.path.join(control.artPath(), 'fanart_bandnews.jpg'),
        #     'thumb': None,
        #     'playable': 'true',
        #     'plot': None,
        #     'id': -1,
        #     'channel_id': -1,
        #     'duration': None,
        #     'url': 'http://evcv.mm.uol.com.br:1935/band/bandnews/playlist.m3u8'
        # })

        # control.addSortMethod(int(sys.argv[1]), control.SORT_METHOD_LABEL_IGNORE_FOLDERS)
        live = sorted(live, key=lambda k: k['sorttitle'])
        live = sorted(live,
                      key=lambda k: '1'
                      if 'isFolder' in k and k['isFolder'] == 'true' else '0')
        live = sorted(live,
                      key=lambda k: k['dateadded']
                      if 'dateadded' in k else None,
                      reverse=True)

        # shuffle(live)

        self.channel_directory(live)

        return live
    def __get_vod_channels(self):

        channels = []

        if control.is_globosat_available():
            channels += globosat.Indexer().get_vod()

        if control.is_globoplay_available():
             channels += globoplay.Indexer().get_vod()

        channels = sorted(channels, key=lambda k: k['name'])

        return channels
예제 #6
0
def root():
    if control.is_live_available():
        handler = live.__name__
        method = 'get_channels'
        yield add_directory_item(handler, method, 32001, 'live.png')

    if control.is_vod_available():
        handler = vod.__name__
        method = 'get_vod_channels_directory'
        yield add_directory_item(handler, method, 32002, 'ondemand.png')

    if not control.is_live_available() and not control.is_vod_available():
        handler = __name__
        method = 'open_settings'
        yield add_directory_item(handler, method, 32005, 'tools.png')

    if control.is_globosat_available() or control.is_globoplay_available(
    ) or control.is_telecine_available() or control.is_oiplay_available(
    ) or control.is_nowonline_available() or control.is_tntplay_available():
        handler = __name__
        method = 'search'
        yield add_directory_item(handler, method, 32010, 'search.png')
예제 #7
0
    def root(self):
        self.addDirectoryItem(32001, 'liveChannels', 'live.png',
                              'DefaultLive.png')
        self.addDirectoryItem(32002, 'vodChannels', 'ondemand.png',
                              'DefaultOnDemand.png')

        if control.is_globosat_available():
            self.addDirectoryItem(32080, 'featured', 'featured.png',
                                  'DefaultMovies.png')
            self.addDirectoryItem(32090, 'favorites', 'favorites.png',
                                  'DefaultMovies.png')
            self.addDirectoryItem(32095, 'watchlater', 'userlists.png',
                                  'DefaultMovies.png')
            self.addDirectoryItem(32096, 'watchhistory', 'years.png',
                                  'DefaultMovies.png')

        self.addDirectoryItem(32010, 'searchMenu', 'search.png',
                              'DefaultMovies.png')

        # control.addSortMethod(int(sys.argv[1]), control.SORT_METHOD_LABEL_IGNORE_FOLDERS)

        control.content(syshandle, 'files')

        self.endDirectory()
예제 #8
0
def get_vod_channels_directory():

    channels = []

    if control.is_globosat_available():
        channels.extend(globosat.get_authorized_channels())
        if control.show_adult_content:
            channels.extend(sexyhot.get_channels())

    if control.is_globoplay_available():
        channels.extend(globoplay.get_globoplay_channels())

    if control.is_tntplay_available():
        channels.extend(tnt_vod.get_channels())

    if control.is_nowonline_available():
        channels.extend(netnow.get_channels())

    if control.is_telecine_available():
        channels.extend(telecine.get_channels())

    if control.is_oiplay_available():
        channels.extend(oiplay.get_channels())

    if control.is_pluto_available():
        channels.extend(pluto.get_channels())

    if not control.show_adult_content:
        channels = [
            channel for channel in channels if not channel.get("adult", False)
        ]

    for channel in channels:
        channel.update({'sort': control.SORT_METHOD_LABEL})

        yield channel
예제 #9
0
    def search(self, q, page=1):

        results = []

        threads = []

        if control.is_globoplay_available():
            threads.append(
                workers.Thread(self.add_search_results,
                               globoplay.Indexer().search, results, q, page))

        if control.is_globosat_available():
            threads.append(
                workers.Thread(self.add_search_results,
                               globosat.Indexer().search, results, q, page))

        [i.start() for i in threads]
        [i.join() for i in threads]

        sysaddon = sys.argv[0]
        syshandle = int(sys.argv[1])
        refreshMenu = control.lang(32072).encode('utf-8')

        results = sorted(results,
                         key=lambda k: k['brplayprovider']
                         if 'brplayprovider' in k else '')

        for result in results:
            label = result['label']

            meta = {
                'id': result['id'],
                'title': result['title'],
                'plot': result['plot'],
                'duration': result['duration'],
                'thumb': result['thumb'],
                'fanart': result['fanart'],
                'mediatype': 'episode'
            }
            meta.update({'mediatype': 'video'})
            meta.update({'overlay': 6})
            meta.update({'title': label})
            meta.update({'live': False})

            if 'tvshowtitle' in result:
                meta.update({'tvshowtitle': result['tvshowtitle']})

            sysmeta = urllib.quote_plus(json.dumps(meta))

            provider = result[
                'brplayprovider'] if 'brplayprovider' in result else 'globoplay'

            url = '%s?action=playvod&provider=%s&id_globo_videos=%s&meta=%s' % (
                sysaddon, provider, result['id'], sysmeta)

            item = control.item(label=label)

            fanart = meta['fanart'] if 'fanart' in meta else GLOBO_FANART

            clearlogo = meta['clearlogo'] if 'clearlogo' in meta else None

            art = {
                'thumb': result['thumb'],
                'fanart': fanart,
                'clearlogo': clearlogo
            }

            item.setProperty('Fanart_Image', fanart)

            if 'duration' in meta:
                duration = float(meta['duration']) if 'duration' in meta else 0
                duration = duration * 1000.0
                item.setProperty('totaltime', str(duration))

            item.setArt(art)
            item.setProperty('IsPlayable', "true")
            item.setInfo(type='video', infoLabels=meta)

            cm = [(refreshMenu, 'RunPlugin(%s?action=refresh)' % sysaddon)]
            item.addContextMenuItems(cm)

            # item.setMimeType("application/vnd.apple.mpegurl")

            control.addItem(handle=syshandle,
                            url=url,
                            listitem=item,
                            isFolder=False)

        # if next_page:
        # label = 'Next Page (%s/%s)' % (nextpage, total_pages)

        # 34004 = "More Videos"
        label = control.lang(34004).encode('utf-8')

        meta = {}
        meta.update({'mediatype': 'video'})
        meta.update({'overlay': 6})
        meta.update({'title': label})

        url = '%s?action=search&q=%s&provider=%s&page=%s' % (
            sysaddon, q, 'globoplay', int(page) + 1)

        item = control.item(label=label)

        art = {'icon': NEXT_ICON, 'thumb': NEXT_ICON}

        # item.setProperty('Fanart_Image', GLOBO_FANART)

        item.setArt(art)
        item.setProperty('IsPlayable', "false")
        item.setInfo(type='video', infoLabels=meta)

        control.addItem(handle=syshandle,
                        url=url,
                        listitem=item,
                        isFolder=True)

        control.content(syshandle, 'episodes')
        control.directory(syshandle, cacheToDisc=True)
예제 #10
0
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'
            }
        }
예제 #11
0
def get_globo_americas():

    is_globosat_available = control.is_globosat_available()

    headers = {
        "Accept-Encoding": "gzip",
        "User-Agent": "Globo Play/0 (iPhone)",
        "x-tenant-id": "globo-play-us",
        'x-platform-id': 'web',
        'x-device-id': 'desktop',
        'x-client-version': '0.4.3'
    }

    now = datetime.datetime.utcnow() + datetime.timedelta(
        hours=control.get_current_brasilia_utc_offset())
    date = now.strftime('%Y-%m-%d')
    variables = urllib.quote_plus('{{"date":"{}"}}'.format(date))
    query = 'query%20getEpgBroadcastList%28%24date%3A%20Date%21%29%20%7B%0A%20%20broadcasts%20%7B%0A%20%20%20%20...broadcastFragment%0A%20%20%7D%0A%7D%0Afragment%20broadcastFragment%20on%20Broadcast%20%7B%0A%20%20mediaId%0A%20%20media%20%7B%0A%20%20%20%20serviceId%0A%20%20%20%20headline%0A%20%20%20%20thumb%28size%3A%20720%29%0A%20%20%20%20availableFor%0A%20%20%20%20title%20%7B%0A%20%20%20%20%20%20slug%0A%20%20%20%20%20%20headline%0A%20%20%20%20%20%20titleId%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20imageOnAir%28scale%3A%20X1080%29%0A%20%20transmissionId%0A%20%20geofencing%0A%20%20geoblocked%0A%20%20channel%20%7B%0A%20%20%20%20id%0A%20%20%20%20color%0A%20%20%20%20name%0A%20%20%20%20logo%28format%3A%20PNG%29%0A%20%20%7D%0A%20%20epgByDate%28date%3A%20%24date%29%20%7B%0A%20%20%20%20entries%20%7B%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%20contentRating%0A%20%20%20%20%20%20contentRatingCriteria%0A%20%20%20%20%20%20titleId%0A%20%20%20%20%20%20alternativeTime%0A%20%20%20%20%20%20title%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%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%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%20%20portrait%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20poster%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%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D'
    url = 'https://jarvis.globo.com/graphql?query={query}&variables={variables}'.format(
        query=query, variables=variables)
    control.log('GLOBOPLAY US - GET %s' % url)
    response = cache.get(requests.get,
                         24,
                         url,
                         headers=headers,
                         table='globoplay').json()
    control.log(response)
    broadcasts = response['data']['broadcasts']

    utc_now = int(control.to_timestamp(datetime.datetime.utcnow()))

    # thumb_usa = 'https://live-thumbs.video.globo.com/glbeua/snapshot/' + str(int(time.time()))

    result = []
    for broadcast in broadcasts:
        media_id = str(broadcast.get('mediaId', 0))

        if is_globosat_available and media_id != str(
                GLOBO_US_LIVE_SUBSCRIBER_MEDIA_ID):
            continue

        epg = next((epg for epg in broadcast['epgByDate']['entries']
                    if int(epg['startTime']) <= utc_now < int(epg['endTime'])),
                   {})

        control.log('EPG: %s' % epg)

        channel = broadcast.get('channel', {}) or {}

        logo = channel.get('logo')
        channel_name = channel.get('name', '').replace(
            'TV Globo',
            'Globo') + ' USA'  # broadcast.get('media', {}).get('headline', '')
        fanart = broadcast.get('imageOnAir')
        channel_id = channel.get('id', 0)
        service_id = broadcast.get('media', {}).get('serviceId', 0)
        # channel_slug = '%s-americas' % channel.get('name', '').lower().replace(' ', '')

        duration = epg.get('durationInMinutes', 0) * 60

        title_obj = epg.get('title', {}) or {}

        title = epg.get('name', '')
        description = title_obj.get('description') or epg.get(
            'description', '')
        fanart = (title_obj.get('cover', {}) or {}).get('landscape',
                                                        fanart) or fanart
        poster = (title_obj.get('poster', {}) or {}).get('web')

        label = '[B]' + channel_name + '[/B]' + ('[I] - ' + title +
                                                 '[/I]' if title else '')

        program_datetime = datetime.datetime.utcfromtimestamp(
            epg.get('startTime', 0)) + util.get_utc_delta()
        next_start = datetime.datetime.utcfromtimestamp(epg.get(
            'endTime', 0)) + util.get_utc_delta()

        plotoutline = datetime.datetime.strftime(
            program_datetime, '%H:%M') + ' - ' + datetime.datetime.strftime(
                next_start, '%H:%M')

        description = '%s | %s' % (plotoutline, description)

        tags = [plotoutline]

        if epg.get('liveBroadcast', False):
            tags.append(control.lang(32004))

        tags.extend(epg.get('tags', []) or [])

        result.append({
            'handler':
            PLAYER_HANDLER,
            'method':
            'play_stream',
            'IsPlayable':
            True,
            'id':
            media_id,
            'channel_id':
            channel_id,
            'service_id':
            service_id,
            'live':
            epg.get('liveBroadcast', False) or False,
            'livefeed':
            True,
            'label':
            label,
            'title':
            label,
            # 'title': title,
            'tvshowtitle':
            title,
            'plot':
            description,
            # 'plotoutline': plotoutline,
            # "tagline": plotoutline,
            'tag':
            tags,
            'duration':
            duration,
            "dateadded":
            datetime.datetime.strftime(program_datetime, '%Y-%m-%d %H:%M:%S'),
            'sorttitle':
            title,
            'studio':
            'Globoplay Americas',
            'year':
            title_obj.get('releaseYear'),
            'country':
            title_obj.get('countries', []) or [],
            'genre':
            title_obj.get('genresNames', []) or [],
            'cast':
            title_obj.get('castNames', []) or [],
            'director':
            title_obj.get('directorsNames', []) or [],
            'writer':
            title_obj.get('screenwritersNames', []) or [],
            'credits':
            title_obj.get('artDirectorsNames', []) or [],
            'mpaa':
            epg.get('contentRating'),
            "art": {
                'icon': logo,
                'clearlogo': logo,
                'thumb': fanart,
                'fanart': fanart,
                'tvshow.poster': poster
            }
        })

    return result
예제 #12
0
def get_globo_americas():

    GLOBO_AMERICAS_ID = 7832875

    is_globosat_available = control.is_globosat_available()

    headers = {
        "Accept-Encoding": "gzip",
        "User-Agent": "Globo Play/0 (iPhone)",
        "x-tenant-id": "globo-play-us"
    }

    now = datetime.datetime.now()
    date = now.strftime('%Y-%m-%d')
    variables = urllib.quote_plus('{{"date":"{}"}}'.format(date))
    query = 'query%20getEpgBroadcastList%28%24date%3A%20Date%21%29%20%7B%0A%20%20broadcasts%20%7B%0A%20%20%20%20...broadcastFragment%0A%20%20%7D%0A%7D%0Afragment%20broadcastFragment%20on%20Broadcast%20%7B%0A%20%20mediaId%0A%20%20media%20%7B%0A%20%20%20%20serviceId%0A%20%20%20%20headline%0A%20%20%20%20thumb%28size%3A%20720%29%0A%20%20%20%20availableFor%0A%20%20%20%20title%20%7B%0A%20%20%20%20%20%20slug%0A%20%20%20%20%20%20headline%0A%20%20%20%20%20%20titleId%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20imageOnAir%28scale%3A%20X1080%29%0A%20%20transmissionId%0A%20%20geofencing%0A%20%20geoblocked%0A%20%20channel%20%7B%0A%20%20%20%20id%0A%20%20%20%20color%0A%20%20%20%20name%0A%20%20%20%20logo%28format%3A%20PNG%29%0A%20%20%7D%0A%20%20epgByDate%28date%3A%20%24date%29%20%7B%0A%20%20%20%20entries%20%7B%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%20contentRating%0A%20%20%20%20%20%20contentRatingCriteria%0A%20%20%20%20%20%20titleId%0A%20%20%20%20%20%20alternativeTime%0A%20%20%20%20%20%20title%7B%0A%20%20%20%20%20%20%20%20description%0A%20%20%20%20%20%20%20%20poster%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%20cover%20%7B%0A%20%20%20%20%20%20%20%20%20%20landscape%0A%20%20%20%20%20%20%20%20%20%20portrait%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%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%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D'
    url = 'https://jarvis.globo.com/graphql?query={query}&variables={variables}'.format(
        query=query, variables=variables)
    response = client.request(url, headers=headers)
    broadcasts = response['data']['broadcasts']

    items = []

    utc_now = control.to_timestamp(datetime.datetime.now())

    for broadcast in broadcasts:
        media_id = str(broadcast.get('mediaId', 0))

        if is_globosat_available and media_id != str(GLOBO_AMERICAS_ID):
            continue

        epg = next((epg for epg in broadcast['epgByDate']['entries']
                    if epg['startTime'] <= utc_now < epg['endTime']), {})

        channel = broadcast.get('channel', {}) or {}

        logo = channel.get('logo', None)
        channel_name = broadcast.get('media', {}).get('headline', '')
        fanart = broadcast.get('imageOnAir', None)
        channel_id = channel.get('id', 0)
        service_id = broadcast.get('media', {}).get('serviceId', 0)
        channel_slug = '%s-americas' % channel.get('name', '').lower().replace(
            ' ', '')

        duration = epg.get('durationInMinutes', 0) * 60

        title_obj = epg.get('title', {}) or {}

        title = epg.get('name', '')
        description = title_obj.get('description', None) or epg.get(
            'description', '')
        fanart = title_obj.get('cover', {}).get('landscape', fanart) or fanart

        year = title_obj.get('releaseYear', None)
        country = [
            c.get('name') for c in title_obj.get('countries', []) or []
            if 'name' in c and c['name']
        ]
        genres = [
            c.get('name') for c in title_obj.get('genres', []) or []
            if 'name' in c and c['name']
        ]
        cast = [
            c.get('name') for c in title_obj.get('cast', []) or []
            if 'name' in c and c['name']
        ]
        director = [
            c.get('name') for c in title_obj.get('directors', []) or []
            if 'name' in c and c['name']
        ]
        rating = epg.get('contentRating', '')

        name = ('[B]' if not control.isFTV else '') + channel_name + (
            '[/B]' if not control.isFTV else '') + ('[I] - ' + title +
                                                    '[/I]' if title else '')

        program_datetime = datetime.datetime.utcfromtimestamp(
            epg.get('startTime', 0)) + util.get_utc_delta()
        next_start = datetime.datetime.utcfromtimestamp(epg.get(
            'endTime', 0)) + util.get_utc_delta()

        plotoutline = datetime.datetime.strftime(
            program_datetime, '%H:%M') + ' - ' + datetime.datetime.strftime(
                next_start, '%H:%M')

        if not description or len(description) < 3:
            description = '%s | %s' % (title,
                                       plotoutline) if title else plotoutline

        item = {
            'name':
            name,
            'title':
            title,
            'tvshowtitle':
            title,
            'plot':
            description,
            'plotoutline':
            plotoutline,
            "tagline":
            description,
            'duration':
            duration,
            "dateadded":
            datetime.datetime.strftime(program_datetime, '%Y-%m-%d %H:%M:%S'),
            'brplayprovider':
            'globoplay',
            'logo':
            logo,
            'clearlogo':
            logo,
            'thumb':
            fanart,
            'poster':
            None,
            'fanart':
            fanart,
            'slug':
            channel_slug,
            'sorttitle':
            channel_name,
            'studio':
            channel_name,
            'playable':
            'true',
            'id':
            media_id,
            'channel_id':
            channel_id,
            'service_id':
            service_id,
            'live':
            epg.get('liveBroadcast', False) or False,
            'year':
            year,
            'country':
            country,
            'genre':
            genres,
            'cast':
            cast,
            'director':
            director,
            'mpaa':
            rating,
            'livefeed':
            'false',  # force vod player for us channels
            "mediatype":
            'video'  # "video", "movie", "tvshow", "season", "episode" or "musicvideo"
        }

        items.append(item)

    return items