Beispiel #1
0
    def _get_combate_schedule(self, schedule):
        globosat_schedule_url = "http://api.simulcast.globosat.tv/combate/?page=%s"
        headers = {
            "User-Agent": "GlobosatPlay/142 CFNetwork/811.4.18 Darwin/16.5.0",
            "Authorization": "Token 59150c4cc6a00f467bf225cf3bf8f44617e27037",
            "Accept-Encoding": "gzip, deflate"
        }

        page = 1
        response = client.request(globosat_schedule_url % page,
                                  headers=headers)

        results = response['results']

        while response['next'] is not None:
            page += 1
            response = client.request(globosat_schedule_url % page,
                                      headers=headers)
            results += response['results']

        for result in results:
            beginsAt = util.strptime_workaround(
                result['day'], '%d/%m/%Y %H:%M') + util.get_utc_delta()
            schedule.append({
                "name":
                result['channel']['title'],
                "title":
                result['title'],
                "description":
                result['subtitle'],
                "begins_at":
                beginsAt.isoformat(),
                "ends_at":
                beginsAt + datetime.timedelta(minutes=result['duration']),
                "id":
                result['id_midia_live_play'],
                "program_id":
                None,
                "live_poster":
                None,
                "thumbnail":
                result['channel']['url_snapshot'],
                "thumbnail_hd":
                result['channel']['url_snapshot'],
                "fanart":
                result['thumb_cms'],
                "color":
                result['channel']['color']
            })

        return schedule
Beispiel #2
0
def __get_full_day_schedule(today, affiliate='RJ'):

    url = "https://api.globoplay.com.br/v1/epg/%s/praca/%s?api_key=%s" % (today, affiliate, GLOBOPLAY_APIKEY)
    headers = {'Accept-Encoding': 'gzip'}
    slots = client.request(url, headers=headers)['gradeProgramacao']['slots']

    result = []
    for index, slot in enumerate(slots):
        cast = None
        castandrole = None
        if 'elenco' in slot:
            try:
                cast_raw = slot['elenco'].split('||')
                cast = [c.strip() for c in cast_raw[0].split(',')] if cast_raw is not None and len(cast_raw) > 0 else None
                if cast_raw is not None and len(cast_raw) > 1 and cast_raw[1].strip().startswith('Elenco de dublagem:'):
                    castandrole_raw = cast_raw[1].strip().split('Elenco de dublagem:')
                    if len(castandrole_raw) > 1: #Dubladores e seus personagens
                        castandrole_raw = castandrole_raw[1].split('Outras Vozes:')
                        castandrole = [(c.strip().split(':')[1].strip(), c.strip().split(':')[0].strip()) for c in castandrole_raw[0].split('/')]
                        if len(castandrole_raw) > 1: #Outros dubladores sem papel definido
                            castandrole = [(c.strip(), 'Outros') for c in castandrole_raw[1].split('/')]
            except Exception as ex:
                control.log("ERROR POPULATING CAST: %s" % repr(ex))
                pass

        program_datetime_utc = util.strptime_workaround(slot['data_exibicao_e_horario']) + datetime.timedelta(hours=3)
        program_datetime = program_datetime_utc + util.get_utc_delta()

        # program_local_date_string = datetime.datetime.strftime(program_datetime, '%d/%m/%Y %H:%M')

        title = slot['nome_programa'] if 'nome_programa' in slot else None
        if slot["tipo"] == "confronto":
            showtitle = slot['confronto']['titulo_confronto'] + ' - ' + slot['confronto']['participantes'][0]['nome'] + ' X ' + slot['confronto']['participantes'][1]['nome']
        else:
            showtitle = slot['nome'] if 'nome' in slot else None

        next_start = slots[index+1]['data_exibicao_e_horario'] if index+1 < len(slots) else None
        next_start = (util.strptime_workaround(next_start) + datetime.timedelta(hours=3) + util.get_utc_delta()) if next_start else datetime.datetime.now()

        item = {
            "tagline": slot['chamada'] if 'chamada' in slot else slot['nome'],
            "closed_caption": slot['closed_caption'],
            "facebook": slot['facebook'],
            "twitter": slot['twitter'],
            "hd": slot['hd'],
            "id": slot['id'],
            "id_programa": slot['id_programa'],
            "id_webmedia": slot['id_webmedia'],
            "fanart": 'https://s02.video.glbimg.com/x720/%s.jpg' % get_globo_live_id(),
            "thumb": slot['imagem'],
            "logo": slot['logo'],
            "clearlogo": slot['logo'],
            "poster": slot['poster'] if 'poster' in slot else 'None',
            "subtitle": slot['nome'],
            "title": title,
            "plot": slot['resumo'] if 'resumo' in slot else None, #program_local_date_string + ' - ' + (slot['resumo'] if 'resumo' in slot else showtitle.replace(' - ', '\n') if showtitle and len(showtitle) > 0 else slot['nome_programa']),
            "plotoutline": datetime.datetime.strftime(program_datetime, '%H:%M') + ' - ' + datetime.datetime.strftime(next_start, '%H:%M'),
            "mediatype": 'episode' if showtitle and len(showtitle) > 0 else 'video',
            "genre": slot['tipo_programa'],
            "datetimeutc": program_datetime_utc,
            "dateadded": datetime.datetime.strftime(program_datetime, '%Y-%m-%d %H:%M:%S'),
            # 'StartTime': datetime.datetime.strftime(program_datetime, '%H:%M:%S'),
            # 'EndTime': datetime.datetime.strftime(next_start, '%H:%M:%S'),
            'duration': util.get_total_seconds(next_start - program_datetime)
        }

        if showtitle and len(showtitle) > 0:
            item.update({
                'tvshowtitle': showtitle
            })

        if slot['tipo'] == 'filme':
            item.update({
                "originaltitle": slot['titulo_original'] if 'titulo_original' in slot else None,
                'genre': slot['genero'] if 'genero' in slot else None,
                'year': slot['ano'] if 'ano' in slot else None,
                'director': slot['direcao'] if 'direcao' in slot else None
            })
            if cast:
                item.update({
                    'cast': cast
                })
            if castandrole:
                item.update({
                    'castandrole': castandrole,
                })

        result.append(item)

    return result
Beispiel #3
0
def get_videos(page=1):
    page_size = 24
    variables = '{{"id":"7e679166-caa2-457c-a5f3-56ff7ca79a69","page":{page},"perPage":{pagesize}}}'
    query = '''query getOffer($id: ID!, $page: Int, $perPage: Int) {
  genericOffer(id: $id) {
    ... on Offer {
      id
      contentType
      items: paginatedItems(page: $page, perPage: $perPage) {
        page
        nextPage
        perPage
        hasNextPage
        resources {
          ...VideoFragment
          ...TitleFragment
          __typename
        }
        __typename
      }
      __typename
    }
    __typename
  }
}
fragment VideoFragment on Video {
  id
  availableFor
  headline
  kind
  duration
  formattedDuration
  thumb
  liveThumbnail
  preview
  originalContent
  exhibitedAt
  title {
    titleId
    headline
    slug
    __typename
  }
  channel {
    id
    name
    slug
    __typename
  }
  __typename
}
fragment TitleFragment on Title {
  titleId
  headline
  slug
  poster {
    web
    __typename
  }
  channel {
    id
    name
    slug
    __typename
  }
  __typename
}'''
    # url = 'https://products-jarvis.globo.com/graphql?operationName=getOffer&variables={var}&extensions=%7B%22persistedQuery%22%3A%7B%22version%22%3A1%2C%22sha256Hash%22%3A%22ed91671dc38a0f931c33239fd7b299d9035ea25177c212eb05fd512ab69ee134%22%7D%7D'
    url = 'https://products-jarvis.globo.com/graphql?query={query}&variables={var}'
    headers = {
        'x-tenant-id': 'sexy-hot',
        'x-platform-id': 'web',
        'x-device-id': 'desktop',
        'x-client-version': '0.4.3',
        'User-Agent':
        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36',
        'accept-encoding': 'gzip'
    }

    result = client.request(url.format(
        query=urllib.quote_plus(query),
        var=urllib.quote_plus(variables.format(page=page,
                                               pagesize=page_size))),
                            headers=headers)

    videos = []

    for video in result['data']['genericOffer']['items']['resources']:
        date = util.strptime(video['exhibitedAt'],
                             '%Y-%m-%dT%H:%M:%SZ') + util.get_utc_delta()
        videos.append({
            'id_sexyhot':
            video['id'],
            'mediatype':
            'movie' if video['kind'] == 'film' else
            'episode' if video['kind'] in ['serie', 'episode'] else 'video',
            'overlay':
            6,
            'duration':
            int(video['duration']) / 1000,
            'title':
            video['headline'],
            'plot':
            '',
            'thumb':
            video['thumb'],
            'poster':
            video['thumb'],
            'fanart':
            os.path.join(artPath, 'fanart_sexyhot.png'),
            'dateadded':
            datetime.datetime.strftime(date, '%Y-%m-%d %H:%M:%S')
        })

    next_page = result['data']['genericOffer']['items']['nextPage'] if result[
        'data']['genericOffer']['items']['hasNextPage'] else None

    return videos, next_page
Beispiel #4
0
def __get_simulcast_data(result):

    utc_timezone = control.get_current_brasilia_utc_offset()

    live_text = ' (' + control.lang(32004) + ')' if result['live'] else ''
    program_date = util.strptime_workaround(result['day'], '%d/%m/%Y %H:%M') + datetime.timedelta(hours=-utc_timezone) + util.get_utc_delta() if not result['day'] is None else datetime.datetime.now()
    # program_local_date_string = datetime.datetime.strftime(program_date, '%d/%m/%Y %H:%M')
    # duration_str = (' - ' + str(result['duration'] or 0) + ' minutos') if (result['duration'] or 0) > 0 else ''

    name = "[B]" + result['channel']['title'] + "[/B]" + ('[I] - ' + (result['title'] or '') + '[/I]' if result['title'] else '') + live_text

    return {
        'slug': result['channel']['title'].lower(),
        'studio': result['channel']['title'],
        'name': name,
        'title': result['subtitle'],
        'tvshowtitle': result['title'] if result['title'] else None,
        'sorttitle': result['channel']['title'],
        'logo': None,
        'color': result['channel']['color'],
        'fanart': result['thumb_cms'],
        'thumb': result['channel']['url_snapshot'] + '?v=' + str(int(time.time())),
        'live': result['live'],
        'playable': 'true',
        'plot': result['subtitle'] or '' if not control.isFTV else ' ', #(result['title'] or '') + ' - ' + (result['subtitle'] or ''), #program_local_date_string + duration_str + '\n' + (result['title'] or '') + '\n' + (result['subtitle'] or ''),
        'plotoutline': datetime.datetime.strftime(program_date, '%H:%M') + ' - ' + (datetime.datetime.strftime(program_date + datetime.timedelta(minutes=(result['duration'] or 0)), '%H:%M') if (result['duration'] or 0) > 0 else 'N/A'),
        # 'programTitle': result['subtitle'],
        'id': result['id_midia_live_play'],
        'channel_id': result['channel']['id_globo_videos'],
        'duration': int(result['duration'] or 0) * 60,
        # 'tagline': result['subtitle'],
        # 'date': datetime.datetime.strftime(program_date, '%d.%m.%Y'),
        # 'aired': datetime.datetime.strftime(program_date, '%Y-%m-%d'),
        'dateadded': datetime.datetime.strftime(program_date, '%Y-%m-%d %H:%M:%S'),
        # 'StartTime': datetime.datetime.strftime(program_date, '%H:%M:%S'),
        # 'EndTime': datetime.datetime.strftime(program_date + datetime.timedelta(minutes=(result['duration'] or 0)), '%H:%M:%S'),
        'brplayprovider': 'globosat'
    }
Beispiel #5
0
def __get_universal_epg():
    utc_timezone = control.get_current_brasilia_utc_offset()
    utc_now = datetime.datetime.today().utcnow()
    now = utc_now + datetime.timedelta(hours=utc_timezone)
    epg_url = 'http://ancine.grade.globosat.tv/programada/01253766000140_UniversalChannel%s.csv' % datetime.datetime.strftime(now, '%Y%m%d')  # '20180205'
    epg_csv = cache.get(client.request, 2, epg_url)

    epg_data = csv.reader(epg_csv.splitlines(), delimiter='\\', quotechar='"')

    for program in list(epg_data):
        p_date = program[0]
        p_start = program[1]
        p_end = program[2]
        original_title = program[3]
        director = program[4]
        title = program[5]
        tvshow = program[6]
        episode = program[7]
        country = program[8]
        year = program[9]
        rating = program[10]
        plot = program[11]

        start_time = util.strptime_workaround(p_date + ' ' + p_start, '%Y%m%d %H:%M') - datetime.timedelta(hours=(utc_timezone))
        end_time = util.strptime_workaround(p_date + ' ' + p_end, '%Y%m%d %H:%M') - datetime.timedelta(hours=(utc_timezone))

        start_hour = p_start.split(':')[0]
        end_hour = p_end.split(':')[0]
        if int(end_hour) < int(start_hour):
            end_time = end_time + datetime.timedelta(days=1)

        if end_time > utc_now > start_time:

            studio = 'Universal Channel'

            return {
                'original_title': original_title,
                'director': director,
                'title': title,
                'tvshowtitle': tvshow,
                'episode': episode,
                'country': country,
                'year': year,
                'rating': rating,
                'plot': plot,
                'duration': util.get_total_seconds(end_time - start_time),
                "dateadded": datetime.datetime.strftime(start_time + util.get_utc_delta(), '%Y-%m-%d %H:%M:%S'),
                "plotoutline": datetime.datetime.strftime(start_time + util.get_utc_delta(), '%H:%M') + ' - ' + datetime.datetime.strftime(end_time + util.get_utc_delta(), '%H:%M'),
            }

    return {
                'original_title': None,
                'director': None,
                'title': None,
                'tvshowtitle': None,
                'episode': None,
                'country': None,
                'year': None,
                'rating': None,
                'plot': None,
                'duration': None,
                "dateadded": None
            }
Beispiel #6
0
def get_premiere_live_24h_channels():

    live = []

    headers = {'Authorization': GLOBOSAT_API_AUTHORIZATION, 'Accept-Encoding': 'gzip'}
    live_channels = client.request(PREMIERE_24H_SIMULCAST, headers=headers)

    studio = 'Premiere Clubes'

    # control.log("-- PREMIERE CLUBES SIMULCAST: %s" % repr(live_channels))

    utc_timezone = control.get_current_brasilia_utc_offset()

    for channel_data in live_channels:
        program_date = util.strptime_workaround(channel_data['starts_at'][0:19]) + datetime.timedelta(hours=-utc_timezone) + util.get_utc_delta() if channel_data and 'starts_at' in channel_data and channel_data['starts_at'] is not None else None
        live_text = ' (' + control.lang(32004) + ')' if channel_data['live'] else ''
        studio = channel_data['channel']['title']
        title = '[B]' + studio + '[/B]' + ('[I] - ' + channel_data['name'] + '[/I]' if channel_data['name'] else '') + live_text

        live_channel = {
            'slug': 'premiere-fc',
            'name': title,
            'studio': studio,
            'title': channel_data['description'],
            'tvshowtitle': channel_data['name'],
            'sorttitle': studio,
            'logo': PREMIERE_LOGO,
            'clearlogo': PREMIERE_LOGO,
            'fanart': channel_data['image_url'],
            'thumb': channel_data['snapshot_url'] + '?v=' + str(int(time.time())),
            'playable': 'true',
            'plot': channel_data['description'],
            'id': int(channel_data['media_globovideos_id']),
            'channel_id': int(channel_data['channel']['globovideos_id']),
            'duration': int(channel_data['duration'] or 0) / 1000,
            'isFolder': 'false',
            'live': channel_data['live'],
            'livefeed': 'true',
            'brplayprovider': 'globosat'
        }

        if program_date is not None:
            live_channel.update({'dateadded': datetime.datetime.strftime(program_date, '%Y-%m-%d %H:%M:%S')})

        live.append(live_channel)

    return live
Beispiel #7
0
def get_channel_epg_now(channel):
    url = 'https://apim.oi.net.br/app/oiplay/ummex/v1/epg/{channel}/beforenowandnext?beforeCount=0&nextCount=0&includeCurrentProgram=true'.format(
        channel=channel)
    response = client.request(url)

    now = response['schedules'][0]
    program = now['program']

    title = program['seriesTitle']
    series = u" (S" + str(program['seasonNumber']) + u':E' + str(
        program['episodeNumber']
    ) + u")" if program['programType'] == 'Series' else u''
    episode_title = program['title'] + series if 'title' in program and program[
        'title'] != title else ''
    studio = response['title']

    thumb = None
    fanart = None
    if 'programImages' in program and len(program['programImages']) > 0:
        thumb = next(image['url'] for image in program['programImages']
                     if image['type'] == 'Thumbnail')
        fanart = next(image['url'] for image in program['programImages']
                      if image['type'] == 'Backdrop') or thumb
        thumb = thumb or fanart

    logo = response['positiveLogoUrl']

    cast = [c['name'] for c in program['castMembers']]

    date = util.strptime(now['startTimeUtc'],
                         '%Y-%m-%dT%H:%M:%SZ') + util.get_utc_delta()

    return {
        'slug':
        response['callLetter'],
        'name':
        u"[B]" + studio + u"[/B][I] - " + title +
        (u': ' + episode_title if episode_title else u'') + u"[/I]",
        'studio':
        studio,
        'title':
        episode_title,
        'tvshowtitle':
        title,
        'sorttitle':
        studio,
        'thumb':
        thumb,
        'logo':
        logo,
        'clearlogo':
        logo,
        'clearart':
        logo,
        'banner':
        None,
        'color':
        None,
        'fanart':
        fanart,
        'id':
        response['prgSvcId'],
        'channel_id':
        response['prgSvcId'],
        'brplayprovider':
        'oiplay',
        'playable':
        'true',
        'livefeed':
        'true',
        'dateadded':
        datetime.datetime.strftime(date, '%Y-%m-%d %H:%M:%S'),
        'plot':
        program['synopsis'],
        'duration':
        now['durationSeconds'],
        'adult':
        program['isAdult'],
        'cast':
        cast,
        'director':
        program['directors'],
        'genre':
        program['genres'],
        'rating':
        program['rating'],
        'year':
        program['releaseYear'],
        'episode':
        program['episodeNumber'] if program['episodeNumber'] else None,
        'season':
        program['seasonNumber'] if program['seasonNumber'] else None,
        "mediatype":
        'episode' if program['episodeNumber'] else 'video'
    }
def get_channel_epg_now(channel):
    url = 'https://apim.oi.net.br/app/oiplay/ummex/v1/epg/{channel}/beforenowandnext?beforeCount=0&nextCount=0&includeCurrentProgram=true'.format(
        channel=channel)
    response = requests.get(url).json()

    now = response['schedules'][0]
    program = now['program']

    title = program['seriesTitle']
    series = u" (S" + str(program['seasonNumber']) + u':E' + str(
        program['episodeNumber']
    ) + u")" if program['programType'] == 'Series' else u''
    episode_title = program['title'] + series if 'title' in program and program[
        'title'] != title else ''
    studio = response['title']

    thumb = None
    fanart = None
    if 'programImages' in program and len(program['programImages']) > 0:
        thumb = next((image['url'] for image in program['programImages']
                      if image['type'] == 'Thumbnail'), None)
        fanart = next((image['url'] for image in program['programImages']
                       if image['type'] == 'Backdrop'), thumb) or thumb
        thumb = thumb or fanart

    logo = response['positiveLogoUrl']

    cast = [c['name'] for c in program['castMembers']]

    date = util.strptime(now['startTimeUtc'],
                         '%Y-%m-%dT%H:%M:%SZ') + util.get_utc_delta()
    program_name = title + (u': ' + episode_title if episode_title else u'')

    stop_time = date + datetime.timedelta(
        seconds=int(now.get('durationSeconds', 0)))

    program_time_desc = datetime.datetime.strftime(
        date, '%H:%M') + ' - ' + datetime.datetime.strftime(
            stop_time, '%H:%M')
    tags = [program_time_desc]

    description = '%s | %s' % (program_time_desc, program['synopsis'])

    return {
        'handler': PLAYER_HANDLER,
        'method': 'playlive',
        'id': response['prgSvcId'],
        'IsPlayable': True,
        'livefeed': True,
        'label': u"[B]" + studio + u"[/B][I] - " + program_name + u"[/I]",
        'title': u"[B]" + studio + u"[/B][I] - " + program_name + u"[/I]",
        'studio': 'Oi Play',
        # 'title': episode_title,
        'tvshowtitle': title,
        'sorttitle': program_name,
        'channel_id': response['prgSvcId'],
        'dateadded': datetime.datetime.strftime(date, '%Y-%m-%d %H:%M:%S'),
        'plot': description,
        'tag': tags,
        'duration': now['durationSeconds'],
        'adult': program['isAdult'],
        'cast': cast,
        'director': program['directors'],
        'genre': program['genres'],
        'rating': program['rating'],
        'year': program['releaseYear'],
        'episode':
        program['episodeNumber'] if program['episodeNumber'] else None,
        'season': program['seasonNumber'] if program['seasonNumber'] else None,
        'art': {
            'icon': logo,
            'thumb': thumb,
            'tvshow.poster': thumb,
            'clearlogo': logo,
            'fanart': fanart
        }
    }
Beispiel #9
0
def get_mais_canais():

    query = 'query%20getBroadcastList%20%7B%0A%20%20%20%20%20%20broadcasts%20%7B%0A%20%20%20%20%20%20%20%20...broadcastFragment%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20fragment%20broadcastFragment%20on%20Broadcast%20%7B%0A%20%20%20%20%20%20mediaId%0A%20%20%20%20%20%20transmissionId%0A%20%20%20%20%20%20logo%0A%20%20%20%20%20%20imageOnAir%28scale%3A%20X1080%29%0A%20%20%20%20%20%20withoutDVRMediaId%0A%20%20%20%20%20%20promotionalMediaId%0A%20%20%20%20%20%20salesPageCallToAction%0A%20%20%20%20%20%20promotionalText%0A%20%20%20%20%20%20geofencing%0A%20%20%20%20%20%20geoblocked%0A%20%20%20%20%20%20ignoreAdvertisements%0A%20%20%20%20%20%20channel%20%7B%0A%20%20%20%20%20%20%20%20id%0A%20%20%20%20%20%20%20%20color%0A%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20logo%28format%3A%20PNG%29%0A%20%20%20%20%20%20%20%20requireUserTeam%0A%20%20%20%20%20%20%20%20payTvServiceId%0A%20%20%20%20%20%20%20%20payTvUsersMessage%0A%20%20%20%20%20%20%20%20payTvExternalLink%0A%20%20%20%20%20%20%20%20payTvExternalLinkLabel%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20epgCurrentSlots%20%7B%0A%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20metadata%0A%20%20%20%20%20%20%20%20description%0A%20%20%20%20%20%20%20%20tags%0A%20%20%20%20%20%20%20%20startTime%0A%20%20%20%20%20%20%20%20endTime%0A%20%20%20%20%20%20%20%20durationInMinutes%0A%20%20%20%20%20%20%20%20liveBroadcast%0A%20%20%20%20%20%20%20%20titleId%0A%20%20%20%20%20%20%20%20contentRating%0A%20%20%20%20%20%20%20%20title%7B%0A%20%20%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%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20cover%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20landscape%0A%20%20%20%20%20%20%20%20%20%20%20%20portrait%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20releaseYear%0A%20%20%20%20%20%20%20%20%20%20type%0A%20%20%20%20%20%20%20%20%20%20format%0A%20%20%20%20%20%20%20%20%20%20countries%0A%20%20%20%20%20%20%20%20%20%20directors%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20cast%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20genres%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20name%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%20%20media%20%7B%0A%20%20%20%20%20%20%20%20serviceId%0A%20%20%20%20%20%20%20%20headline%0A%20%20%20%20%20%20%20%20thumb%28size%3A%20720%29%0A%20%20%20%20%20%20%20%20availableFor%0A%20%20%20%20%20%20%20%20title%20%7B%0A%20%20%20%20%20%20%20%20%20%20slug%0A%20%20%20%20%20%20%20%20%20%20headline%0A%20%20%20%20%20%20%20%20%20%20titleId%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20subscriptionService%20%7B%0A%20%20%20%20%20%20%20%20%20%20faq%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20url%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20default%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%7D%0A%20%20%20%20%20%20%20%20%20%20salesPage%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20identifier%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20default%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%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'
    variables = '{}'

    response = request_query(query, variables, force_refresh=True) or {}

    for broadcast in response.get('data', {}).get('broadcasts', []) or []:
        channel = broadcast.get('channel', {}) or {}

        if channel.get('id') == '196':
            continue

        media_id = str(broadcast.get('mediaId', 0))

        epg = next((epg for epg in broadcast.get('epgCurrentSlots', [])), {})

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

        logo = channel.get('logo')
        channel_name = (broadcast.get('media', {})
                        or {}).get('headline',
                                   '').replace('Agora no ', '').replace(
                                       'Agora na ',
                                       '').strip()  #channel.get('name', '')
        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')
        thumb = THUMBS.get(str(broadcast.get('transmissionId')))
        thumb = (SNAPSHOT_URL.format(transmission=thumb) + '?=' +
                 str(int(time.time()))) if thumb else fanart

        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 [])

        yield {
            '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',
            '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': thumb,
                'fanart': fanart,
                'tvshow.poster': poster
            }
        }
Beispiel #10
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
Beispiel #11
0
def get_globoplay_broadcasts(media_id, latitude, longitude):

    variables = urllib.quote_plus(
        '{{"mediaId":"{media_id}","coordinates":{"lat":"{lat}", "long": "{long}"}}}'
        .format(media_id=media_id, lat=latitude, long=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...broadcastFragment%0A%20%20%7D%0A%7D%0Afragment%20broadcastFragment%20on%20Broadcast%20%7B%0A%20%20%20%20%20%20mediaId%0A%20%20%20%20%20%20transmissionId%0A%20%20%20%20%20%20logo%0A%20%20%20%20%20%20imageOnAir%28scale%3A%20X1080%29%0A%20%20%20%20%20%20withoutDVRMediaId%0A%20%20%20%20%20%20promotionalMediaId%0A%20%20%20%20%20%20salesPageCallToAction%0A%20%20%20%20%20%20promotionalText%0A%20%20%20%20%20%20geofencing%0A%20%20%20%20%20%20geoblocked%0A%20%20%20%20%20%20ignoreAdvertisements%0A%20%20%20%20%20%20channel%20%7B%0A%20%20%20%20%20%20%20%20id%0A%20%20%20%20%20%20%20%20color%0A%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20logo%28format%3A%20PNG%29%0A%20%20%20%20%20%20%20%20requireUserTeam%0A%20%20%20%20%20%20%20%20payTvServiceId%0A%20%20%20%20%20%20%20%20payTvUsersMessage%0A%20%20%20%20%20%20%20%20payTvExternalLink%0A%20%20%20%20%20%20%20%20payTvExternalLinkLabel%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%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%20%20%20%20%20epgCurrentSlots%20%7B%0A%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20metadata%0A%20%20%20%20%20%20%20%20description%0A%20%20%20%20%20%20%20%20tags%0A%20%20%20%20%20%20%20%20startTime%0A%20%20%20%20%20%20%20%20endTime%0A%20%20%20%20%20%20%20%20durationInMinutes%0A%20%20%20%20%20%20%20%20liveBroadcast%0A%20%20%20%20%20%20%20%20titleId%0A%20%20%20%20%20%20%20%20contentRating%0A%20%20%20%20%20%20%20%20title%7B%0A%20%20%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%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20cover%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20landscape%0A%20%20%20%20%20%20%20%20%20%20%20%20portrait%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20releaseYear%0A%20%20%20%20%20%20%20%20%20%20type%0A%20%20%20%20%20%20%20%20%20%20format%0A%20%20%20%20%20%20%20%20%20%20countries%0A%20%20%20%20%20%20%20%20%20%20directors%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20cast%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20genres%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20name%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%20%20media%20%7B%0A%20%20%20%20%20%20%20%20serviceId%0A%20%20%20%20%20%20%20%20headline%0A%20%20%20%20%20%20%20%20thumb%28size%3A%20720%29%0A%20%20%20%20%20%20%20%20availableFor%0A%20%20%20%20%20%20%20%20title%20%7B%0A%20%20%20%20%20%20%20%20%20%20slug%0A%20%20%20%20%20%20%20%20%20%20headline%0A%20%20%20%20%20%20%20%20%20%20titleId%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20subscriptionService%20%7B%0A%20%20%20%20%20%20%20%20%20%20faq%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20url%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20default%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%7D%0A%20%20%20%20%20%20%20%20%20%20salesPage%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20identifier%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20default%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%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'
    response = request_query(query, variables)
    broadcasts = (response.get('data', {}) or {}).get('broadcasts', []) or []

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

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

        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')  # broadcast.get('media', {}).get('headline', '')
        fanart = broadcast.get('imageOnAir')
        channel_id = channel.get('id', 0)
        service_id = broadcast.get('media', {}).get('serviceId', 0)

        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')

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

        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,
            'duration':
            duration,
            "dateadded":
            datetime.datetime.strftime(program_datetime, '%Y-%m-%d %H:%M:%S'),
            'sorttitle':
            title,
            'studio':
            'Globoplay',
            '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
Beispiel #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
Beispiel #13
0
def get_live_channels():
    headers = {
        'Authorization': get_authorization(),
        'Origin': 'https://www.sbt.com.br',
        'Accept-Encoding': 'gzip, deflate, br'
    }

    br_timezone = pytz.timezone('America/Sao_Paulo')
    now = datetime.datetime.now(tz=br_timezone)

    if control.setting('sbt_ignore_dst') == 'true':
        now = now - br_timezone.localize(datetime.datetime.utcnow()).dst()

    url = 'https://content.sbt.com.br/api/programschedule?livegrade={date}&operation=le&orderby=startdate&limit=1'.format(
        date=now.strftime('%Y-%m-%dT%H:%M:%S'))

    control.log('GET %s' % url)

    programs = (requests.get(url, headers=headers, verify=False).json()
                or {}).get('results', [])

    control.log(programs)

    program = next(iter(programs), {}) or {}

    try:
        start_time = util.strptime_workaround(program.get('startdate'),
                                              '%Y-%m-%dT%H:%M:%S')
        start_time = br_timezone.localize(start_time)
        start_time = start_time.astimezone(pytz.UTC)
        start_time = start_time + util.get_utc_delta()
    except:
        control.log(traceback.format_exc(), control.LOGERROR)
        start_time = datetime.datetime.now()

    plot = program.get('description')
    plot = '%s - | %s' % (datetime.datetime.strftime(start_time,
                                                     '%H:%M'), plot)
    program_name = program.get('title')
    channel_name = 'SBT'

    label = u"[B]%s[/B][I] - %s[/I]" % (channel_name, program_name)

    thumb = program.get('thumbnail')

    tags = []

    yield {
        'handler': PLAYER_HANDLER,
        'method': 'playlive',
        'IsPlayable': True,
        'livefeed': True,
        'studio': channel_name,
        'label': label,
        'title': label,
        'genre': program.get('gender'),
        # 'title': program.get('metadata', program.get('name', '')),
        'tvshowtitle': program_name,
        'sorttitle': program_name,
        'tag': tags,
        'plot': plot,
        'duration': int(0),
        'dateadded': datetime.datetime.strftime(start_time,
                                                '%Y-%m-%d %H:%M:%S'),
        'mediatype': 'episode',
        'art': {
            'icon': SBT_LOGO,
            'clearlogo': SBT_LOGO,
            'fanart': thumb,
            'thumb': thumb,
            'tvshow.poster': thumb,
        }
    }