Esempio n. 1
0
def __get_affiliate_live_channels(affiliate):
    liveglobo = get_globo_live_id()

    code, latitude, longitude = control.get_coordinates(affiliate)

    if code is None and latitude is not None:
        result = get_affiliate_by_coordinates(latitude, longitude)
        code = result['code'] if result and 'code' in result else None

    if code is None:
        return None

    live_program = __get_live_program(code)

    if not live_program:
        return None

    geo_position = 'lat=%s&long=%s' % (latitude, longitude)

    program_description = get_program_description(live_program['program_id_epg'], live_program['program_id'], code)

    control.log("globo live (%s) program_description: %s" % (code, repr(program_description)))

    item = {
        'plot': None,
        'duration': None,
        'affiliate': geo_position,
        'brplayprovider': 'globoplay',
        'affiliate_code': code,
        'logo': None
    }

    item.update(program_description)

    item.pop('datetimeutc', None)

    title = program_description['title'] if 'title' in program_description else live_program['title']
    subtitle = program_description['subtitle'] if 'subtitle' in program_description else live_program['title']

    safe_tvshowtitle = program_description['tvshowtitle'] if 'tvshowtitle' in program_description and program_description['tvshowtitle'] else ''
    safe_subtitle = program_description['subtitle'] if 'subtitle' in program_description and program_description['subtitle'] and not safe_tvshowtitle.startswith(program_description['subtitle']) else ''
    subtitle_txt = (" / " if safe_tvshowtitle and safe_subtitle else '') + safe_subtitle
    tvshowtitle = " (" + safe_tvshowtitle + subtitle_txt + ")" if safe_tvshowtitle or subtitle_txt else ''

    item.update({
        'slug': 'globo',
        'name': ('[B]' if not control.isFTV else '') + 'Globo ' + re.sub(r'\d+','',code) + ('[/B]' if not control.isFTV else '') + '[I] - ' + title + (tvshowtitle if not control.isFTV else '') + '[/I]',
        'title': title, #subtitle,  # 'Globo ' + re.sub(r'\d+','',code) + '[I] - ' + program_description['title'] + '[/I]',
        'sorttitle': 'Globo ' + re.sub(r'\d+','',code),
        'clearlogo': GLOBO_LOGO,
        # 'tagline': program_description['title'],
        'studio': 'Rede Globo - ' + affiliate,
        # 'logo': GLOBO_LOGO,
        'playable': 'true',
        'id': liveglobo,
        'channel_id': 196,
        'live': True,
        'livefeed': 'true'
    })

    if control.isFTV:
        item.update({'tvshowtitle': title})

    if 'fanart' not in item or not item['fanart']:
        item.update({'fanart': GLOBO_FANART})

    # if 'poster' not in item or not item['poster']:
    #     item.update({'poster': live_program['poster']})

    if 'thumb' not in item or not item['thumb']:
        item.update({'thumb': live_program['poster']})

    return item
Esempio n. 2
0
def __get_globosat_simulcast(simulcast_results):

    geolocation = control.setting('globosat_geofence')

    if geolocation == '0':
        affiliate = None
    elif geolocation == '1':
        affiliate = 'Sao Paulo'
    elif geolocation == '2':
        affiliate = 'Brasilia'
    elif geolocation == '3':
        affiliate = 'Belo Horizonte'
    elif geolocation == '4':
        affiliate = 'Recife'
    elif geolocation == '5':
        affiliate = 'Salvador'
    elif geolocation == '6':
        affiliate = 'Fortaleza'
    elif geolocation == '7':
        affiliate = 'Aracaju'
    elif geolocation == '8':
        affiliate = 'Maceio'
    elif geolocation == '9':
        affiliate = 'Cuiaba'
    elif geolocation == '10':
        affiliate = 'Porto Alegre'
    elif geolocation == '11':
        affiliate = 'Florianopolis'
    elif geolocation == '12':
        affiliate = 'Curitiba'
    elif geolocation == '13':
        affiliate = 'Vitoria'
    elif geolocation == '14':
        affiliate = 'Goiania'
    elif geolocation == '15':
        affiliate = 'Campo Grande'
    elif geolocation == '16':
        affiliate = 'Manaus'
    elif geolocation == '17':
        affiliate = 'Belem'
    elif geolocation == '18':
        affiliate = 'Macapa'
    elif geolocation == '19':
        affiliate = 'Palmas'
    elif geolocation == '20':
        affiliate = 'Rio Branco'
    elif geolocation == '21':
        affiliate = 'Teresina'
    elif geolocation == '22':
        affiliate = 'Sao Luis'
    elif geolocation == '23':
        affiliate = 'Joao Pessoa'
    elif geolocation == '24':
        affiliate = 'Natal'
    else:
        affiliate = 'Rio de Janeiro'

    if affiliate:
        code, latitude, longitude = control.get_coordinates(affiliate)
        url = GLOBOSAT_SIMULCAST_URL + '?latitude=%s&longitude=%s' % (latitude, longitude)
    else:
        url = GLOBOSAT_SIMULCAST_URL

    headers = {'Authorization': GLOBOSAT_API_AUTHORIZATION, 'Accept-Encoding': 'gzip'}
    channel_info = client.request(url, headers=headers)
    simulcast_results += channel_info['results']
Esempio n. 3
0
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),
            }
        }
Esempio n. 4
0
def __get_affiliate_live_channels(affiliate):
    control.log('__get_affiliate_live_channels: %s' % affiliate)
    live_globo_id = get_globo_live_id()

    code, latitude, longitude = control.get_coordinates(affiliate)

    if code is None and latitude is not None:
        result = get_affiliate_by_coordinates(latitude, longitude)
        code = result['code'] if result and 'code' in result else None

    if code is None:
        control.log('No affiliate code for: %s' % affiliate)
        return []

    live_program = __get_live_program(code)

    program_description = get_program_description(
        live_program.get('program_id_epg'), live_program.get('program_id'),
        code)

    control.log("globo live (%s) program_description: %s" %
                (code, repr(program_description)))

    item = {}

    item.update(program_description)

    item.pop('datetimeutc', None)

    title = program_description[
        'title'] if 'title' in program_description else live_program.get(
            'title')
    safe_tvshowtitle = program_description[
        'tvshowtitle'] if 'tvshowtitle' in program_description and program_description[
            'tvshowtitle'] else ''
    safe_subtitle = program_description[
        'subtitle'] if 'subtitle' in program_description and program_description[
            'subtitle'] and not safe_tvshowtitle.startswith(
                program_description['subtitle']) else ''
    subtitle_txt = (" / " if safe_tvshowtitle and safe_subtitle else
                    '') + safe_subtitle
    tvshowtitle = " - " + safe_tvshowtitle + subtitle_txt if safe_tvshowtitle or subtitle_txt else ''

    program_name = '%s%s' % (title, tvshowtitle)
    item.update({
        'handler':
        PLAYER_HANDLER,
        'method':
        'play_stream',
        'lat':
        latitude,
        'long':
        longitude,
        'affiliate_code':
        code,
        'IsPlayable':
        True,
        'id':
        live_globo_id,
        'program_id':
        live_program.get('program_id'),
        'service_id':
        4654,
        'channel_id':
        196,
        'live':
        True,
        'livefeed':
        True,
        'label':
        '[B]Globo %s[/B][I] - %s[/I]' %
        (re.sub(r'\d+', '', code), program_name),
        'title':
        '[B]Globo %s[/B][I] - %s[/I]' %
        (re.sub(r'\d+', '', code), program_name),
        'tvshowtitle':
        safe_tvshowtitle + subtitle_txt,
        'sorttitle':
        program_name,
        'studio':
        'Globoplay',
    })

    art = item.get('art', {}) or {}
    if not art:
        item['art'] = art

    if not art.get('thumb'):
        # thumb = 'https://live-thumbs.video.globo.com/globo-rj/snapshot/' + str(int(time.time()))
        art['thumb'] = live_program.get('thumb')

    if not art.get('fanart'):
        art['fanart'] = live_program.get('fanart')

    if not art.get('poster'):
        art['tvshow.poster'] = live_program.get('poster')

    art['clearlogo'] = GLOBO_LOGO
    art['icon'] = GLOBO_LOGO

    return [item]
Esempio n. 5
0
    def play_stream(self, id, meta, children_id=None):

        control.log(
            "GloboPlay - play_stream: id=%s | children_id=%s | meta=%s" %
            (id, children_id, meta))

        if id is None:
            return

        try:
            meta = json.loads(meta)
        except:
            meta = {
                "playcount": 0,
                "overlay": 6,
                "mediatype": "video",
                "aired": None
            }

        self.isLive = 'live' in meta and meta['live']

        if 'livefeed' in meta and meta['livefeed'] == 'true':
            control.log("PLAY LIVE!")
            self.isLive = True

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

            if affiliate is None:
                code, latitude, longitude = control.get_coordinates(
                    control.get_affiliates_by_id(-1))
                affiliate = 'lat=%s&long=%s' % (latitude, longitude)

            info = self.__getLiveVideoInfo(id, affiliate)
            if info is None:
                return

            item, self.url, stopEvent = self.__get_list_item(meta, info)
        else:
            info = resourceshelper.get_video_info(id, children_id)
            if info is None:
                return

            if 'resource_id' not in info:
                control.log("PLAY CHILDREN!")
                items = []
                xbmc.PlayList(1).clear()
                first = True
                for i in info:
                    hash, user, self.credentials = self.sign_resource(
                        i['resource_id'], i['id'], i['player'], i['version'])
                    i['hash'] = hash
                    i['user'] = user
                    item, url, stopEvent = self.__get_list_item(meta, i, False)
                    if first:
                        self.url = url
                        first = False
                    items.append(item)
                    control.log("PLAYLIST ITEM URL: %s" % url)
                    xbmc.PlayList(1).add(url, item)
                item = items[0]
            else:
                control.log("PLAY SINGLE RESOURCE!")
                hash, user, self.credentials = self.sign_resource(
                    info['resource_id'], info["id"], info['player'],
                    info['version'],
                    meta['anonymous'] if 'anonymous' in meta else False)
                info['hash'] = hash
                info['user'] = user
                item, self.url, stopEvent = self.__get_list_item(meta, info)

        self.offset = float(meta['milliseconds_watched']
                            ) / 1000.0 if 'milliseconds_watched' in meta else 0

        syshandle = int(sys.argv[1])
        control.resolve(syshandle, True, item)

        self.stopPlayingEvent = threading.Event()
        self.stopPlayingEvent.clear()

        self.program_id = info['program_id'] if 'program_id' in info else None
        self.video_id = id

        first_run = True
        last_time = 0.0
        while not self.stopPlayingEvent.isSet():
            if control.monitor.abortRequested():
                control.log("Abort requested")
                break
            if self.isPlaying():
                if first_run:
                    self.showSubtitles(False)
                    first_run = False

                if not self.isLive:
                    total_time = self.getTotalTime()
                    current_time = self.getTime()
                    if current_time - last_time > 5 or (last_time == 0
                                                        and current_time > 1):
                        last_time = current_time
                        percentage_watched = current_time / total_time if total_time > 0 else 1.0 / 1000000.0
                        self.save_video_progress(
                            self.credentials,
                            self.program_id,
                            self.video_id,
                            current_time * 1000,
                            fully_watched=0.9 < percentage_watched <= 1)
            control.sleep(500)

        if stopEvent:
            control.log("Setting stop event for proxy player")
            stopEvent.set()

        control.log("Done playing. Quitting...")
Esempio n. 6
0
    def play_stream(self, id, meta, children_id=None):

        meta = meta or {}

        control.log(
            "GloboPlay - play_stream: id=%s | children_id=%s | meta=%s" %
            (id, children_id, meta))

        if id is None:
            return

        self.isLive = meta.get('livefeed', False)
        stop_event = None

        cdn = control.setting('globo_cdn')
        if cdn:
            cdn = cdn.lower() if cdn.lower() != 'auto' else None

        if self.isLive and meta.get('lat') and meta.get('long'):
            control.log("PLAY LIVE!")

            latitude = meta.get('lat')
            longitude = meta.get('long')

            if not latitude or not longitude:
                code, latitude, longitude = control.get_coordinates(
                    control.get_affiliates_by_id(-1))

            info = self.__getLiveVideoInfo(id, latitude, longitude, cdn)

            if info is None:
                return

            item, self.url, stop_event = self.__get_list_item(meta, info)

        else:
            if not meta.get('router', True) or cdn:
                info = resourceshelper.get_video_info(id, children_id, cdn)
            else:
                info = resourceshelper.get_video_router(id, self.isLive, cdn)
                if not info:
                    info = resourceshelper.get_video_info(id, children_id, cdn)

            if info is None:
                return

            if 'resource_id' not in info:
                control.log("PLAY CHILDREN!")
                items = []
                xbmc.PlayList(1).clear()
                first = True
                for i in info:
                    hash_token, user, self.credentials = self.sign_resource(
                        i['resource_id'],
                        i['id'],
                        i['player'],
                        i['version'],
                        cdn=i['cdn'])
                    i['hash'] = hash_token
                    i['user'] = user
                    item, url, stop_event = self.__get_list_item(
                        meta, i, False)
                    if first:
                        self.url = url
                        first = False
                    items.append(item)
                    control.log("PLAYLIST ITEM URL: %s" % url)
                    xbmc.PlayList(1).add(url, item)
                item = items[0]
            else:
                control.log("PLAY SINGLE RESOURCE!")
                hash_token, user, self.credentials = self.sign_resource(
                    info['resource_id'],
                    info["id"],
                    info['player'],
                    info['version'],
                    meta['anonymous'] if 'anonymous' in meta else False,
                    cdn=info['cdn'])
                info['hash'] = hash_token
                info['user'] = user
                item, self.url, stop_event = self.__get_list_item(meta, info)

        self.offset = float(meta['milliseconds_watched']
                            ) / 1000.0 if 'milliseconds_watched' in meta else 0

        self.stop_playing_event = threading.Event()
        self.stop_playing_event.clear()

        self.program_id = info[
            'program_id'] if 'program_id' in info else meta.get('program_id')
        self.video_id = id

        syshandle = int(sys.argv[1])
        control.resolve(syshandle, True, item)

        first_run = True
        last_time = 0.0
        while not self.stop_playing_event.isSet():
            if control.monitor.abortRequested():
                control.log("Abort requested")
                break
            if self.isPlaying():
                if first_run:
                    self.showSubtitles(False)
                    first_run = False

                if not self.isLive:
                    total_time = self.getTotalTime()
                    current_time = self.getTime()
                    if current_time - last_time > 5 or (last_time == 0
                                                        and current_time > 1):
                        last_time = current_time
                        percentage_watched = current_time / total_time if total_time > 0 else 1.0 / 1000000.0
                        self.save_video_progress(
                            self.credentials,
                            self.program_id,
                            self.video_id,
                            current_time * 1000,
                            fully_watched=0.9 < percentage_watched <= 1)
            control.sleep(500)

        if stop_event:
            control.log("Setting stop event for proxy player")
            stop_event.set()

        control.log("Done playing. Quitting...")