예제 #1
0
    def _screen_object_to_item(self, context, screen_object, show_format_title=False):
        screen_object_type = screen_object.get('type', '')
        if screen_object_type == '':
            raise kodion.KodimonException('Missing type for screenObject')

        fanart = self.get_fanart(context)
        format_id = screen_object.get('format_id', screen_object.get('id', '')).split(':')
        if len(format_id) == 2:
            channel_id = format_id[0]
            format_id = format_id[1]
            if channel_id == 'tvog':
                channel_id = 'pro7'
                pass
            data = self._load_format_content(context, channel_id, format_id, return_cached_only=True)
            fanart = data.get('fanart', self.get_fanart(context))
            pass

        if screen_object_type == 'video_item_date_no_label' or screen_object_type == 'video_item_date' \
                or screen_object_type == 'video_item_format_no_label' or screen_object_type == 'video_item_format':
            name = screen_object.get('title', screen_object['video_title'])
            if screen_object_type == 'video_item_format_no_label' or show_format_title:
                name = '%s - %s' % (screen_object['format_title'], name)
                pass
            video_item = VideoItem(name,
                                   context.create_uri(['play'], {'id': screen_object['id']}),
                                   image=screen_object.get('image_url', ''))
            video_item.set_fanart(fanart)
            video_item.set_duration_from_seconds(int(screen_object.get('duration', '60')))

            date_time = datetime_parser.parse(screen_object.get('start', '0000-00-00'))
            video_item.set_aired_from_datetime(date_time)
            video_item.set_premiered_from_datetime(date_time)
            video_item.set_year_from_datetime(date_time)
            try_set_season_and_episode(video_item)

            context_menu = [(context.localize(kodion.constants.localize.WATCH_LATER),
                             'RunPlugin(%s)' % context.create_uri([kodion.constants.paths.WATCH_LATER, 'add'],
                                                                  {'item': kodion.items.to_jsons(video_item)}))]
            video_item.set_context_menu(context_menu)
            return video_item
        elif screen_object_type == 'format_item_home' or screen_object_type == 'format_item':
            format_item = DirectoryItem(screen_object['title'],
                                        context.create_uri([channel_id, 'library', format_id]),
                                        image=screen_object['image_url'])
            format_item.set_fanart(fanart)
            context_menu = [(context.localize(kodion.constants.localize.FAVORITES_ADD),
                             'RunPlugin(%s)' % context.create_uri([kodion.constants.paths.FAVORITES, 'add'],
                                                                  {'item': kodion.items.to_jsons(format_item)}))]
            format_item.set_context_menu(context_menu)
            return format_item

        raise kodion.KodimonException("Unknown type '%s' for screen_object" % screen_object_type)
예제 #2
0
def do_xml_video_response(context, provider, video_xml):
    if isinstance(video_xml, basestring):
        video_xml = ET.fromstring(video_xml)
        do_xml_error(context, provider, video_xml)
        video_xml = video_xml.find('video')
        pass

    video_id = video_xml.get('id')
    title = video_xml.find('title').text
    video_item = VideoItem(title, context.create_uri(['play'], {'video_id': video_id}))

    # channel name
    channel_name = ''
    owner = video_xml.find('owner')
    if owner is not None:
        channel_name = owner.get('username')
        pass
    video_item.set_studio(channel_name)
    video_item.add_artist(channel_name)

    # date
    upload_date = video_xml.find('upload_date')
    if upload_date is not None and upload_date.text is not None:
        upload_date = upload_date.text
        upload_date = upload_date.split(' ')
        if len(upload_date) == 2:
            date = upload_date[0].split('-')
            time = upload_date[1].split(':')
            if len(date) == 3 and len(time) == 3:
                video_item.set_date(int(date[0]), int(date[1]), int(date[2]), int(time[0]), int(time[1]),
                                    int(time[2]))
                video_item.set_year(int(date[0]))
                video_item.set_aired(int(date[0]), int(date[1]), int(date[2]))
                video_item.set_premiered(int(date[0]), int(date[1]), int(date[2]))
                pass
            pass
        pass

    # plot
    plot = video_xml.find('description').text
    if plot is None:
        plot = ''
        pass

    settings = context.get_settings()
    if channel_name and settings.get_bool('vimeo.view.description.show_channel_name', True):
        plot = '[UPPERCASE][B]%s[/B][/UPPERCASE][CR][CR]%s' % (channel_name, plot)
        pass
    video_item.set_plot(plot)

    # duration
    duration = int(video_xml.find('duration').text)
    if duration is not None:
        video_item.set_duration_from_seconds(duration)
        pass

    # thumbs
    thumbnails = video_xml.find('thumbnails')
    if thumbnails is not None:
        for thumbnail in thumbnails:
            height = int(thumbnail.get('height'))
            if height >= 360:
                video_item.set_image(thumbnail.text)
                break
            pass
        pass
    video_item.set_fanart(provider.get_fanart(context))

    # context menu
    context_menu = []
    if provider.is_logged_in():
        # like/unlike
        is_like = video_xml.get('is_like') == '1'
        if is_like:
            like_text = context.localize(provider._local_map['vimeo.unlike'])
            context_menu.append(
                (like_text, 'RunPlugin(%s)' % context.create_uri(['video', 'unlike'], {'video_id': video_id})))
        else:
            like_text = context.localize(provider._local_map['vimeo.like'])
            context_menu.append(
                (like_text, 'RunPlugin(%s)' % context.create_uri(['video', 'like'], {'video_id': video_id})))
            pass

        # watch later
        is_watch_later = video_xml.get('is_watchlater') == '1'
        if is_watch_later:
            watch_later_text = context.localize(provider._local_map['vimeo.watch-later.remove'])
            context_menu.append(
                (watch_later_text,
                 'RunPlugin(%s)' % context.create_uri(['video', 'watch-later', 'remove'], {'video_id': video_id})))
        else:
            watch_later_text = context.localize(provider._local_map['vimeo.watch-later.add'])
            context_menu.append(
                (watch_later_text,
                 'RunPlugin(%s)' % context.create_uri(['video', 'watch-later', 'add'], {'video_id': video_id})))
            pass

        # add to * (album, channel or group)
        context_menu.append((context.localize(provider._local_map['vimeo.video.add-to']),
                             'RunPlugin(%s)' % context.create_uri(['video', 'add-to'], {'video_id': video_id})))

        # remove from * (album, channel or group)
        context_menu.append((context.localize(provider._local_map['vimeo.video.remove-from']),
                             'RunPlugin(%s)' % context.create_uri(['video', 'remove-from'], {'video_id': video_id})))
        pass

    # Go to user
    owner = video_xml.find('owner')
    if owner is not None:
        owner_name = owner.get('display_name')
        owner_id = owner.get('id')
        context_menu.append((context.localize(provider._local_map['vimeo.user.go-to']) % '[B]' + owner_name + '[/B]',
                             'Container.Update(%s)' % context.create_uri(['user', owner_id])))
        pass

    video_item.set_context_menu(context_menu)
    return video_item
예제 #3
0
파일: provider.py 프로젝트: noba3/KoTos
    def _screen_object_to_item(self,
                               context,
                               screen_object,
                               show_format_title=False):
        screen_object_type = screen_object.get('type', '')
        if screen_object_type == '':
            raise kodion.KodimonException('Missing type for screenObject')

        fanart = self.get_fanart(context)
        format_id = screen_object.get('format_id',
                                      screen_object.get('id', '')).split(':')
        if len(format_id) == 2:
            channel_id = format_id[0]
            format_id = format_id[1]
            if channel_id == 'tvog':
                channel_id = 'pro7'
                pass
            data = self._load_format_content(context,
                                             channel_id,
                                             format_id,
                                             return_cached_only=True)
            fanart = data.get('fanart', self.get_fanart(context))
            pass

        if screen_object_type == 'video_item_date_no_label' or screen_object_type == 'video_item_date' \
                or screen_object_type == 'video_item_format_no_label' or screen_object_type == 'video_item_format':
            name = screen_object.get('title', screen_object['video_title'])
            if screen_object_type == 'video_item_format_no_label' or show_format_title:
                name = '%s - %s' % (screen_object['format_title'], name)
                pass
            video_item = VideoItem(name,
                                   context.create_uri(
                                       ['play'], {'id': screen_object['id']}),
                                   image=screen_object.get('image_url', ''))
            video_item.set_fanart(fanart)
            video_item.set_duration_from_seconds(
                int(screen_object.get('duration', '60')))

            date_time = datetime_parser.parse(
                screen_object.get('start', '0000-00-00'))
            video_item.set_aired_from_datetime(date_time)
            video_item.set_premiered_from_datetime(date_time)
            video_item.set_year_from_datetime(date_time)
            try_set_season_and_episode(video_item)

            context_menu = [
                (context.localize(kodion.constants.localize.WATCH_LATER),
                 'RunPlugin(%s)' % context.create_uri(
                     [kodion.constants.paths.WATCH_LATER, 'add'],
                     {'item': kodion.items.to_jsons(video_item)}))
            ]
            video_item.set_context_menu(context_menu)
            return video_item
        elif screen_object_type == 'format_item_home' or screen_object_type == 'format_item':
            format_item = DirectoryItem(
                screen_object['title'],
                context.create_uri([channel_id, 'library', format_id]),
                image=screen_object['image_url'])
            format_item.set_fanart(fanart)
            context_menu = [
                (context.localize(kodion.constants.localize.FAVORITES_ADD),
                 'RunPlugin(%s)' % context.create_uri(
                     [kodion.constants.paths.FAVORITES, 'add'],
                     {'item': kodion.items.to_jsons(format_item)}))
            ]
            format_item.set_context_menu(context_menu)
            return format_item

        raise kodion.KodimonException("Unknown type '%s' for screen_object" %
                                      screen_object_type)
예제 #4
0
    def _do_video_item(self, context, item):
        title = item['title']
        subtitle = item.get('subtitle', '')
        if subtitle:
            title = '%s - %s' % (title, subtitle)
            pass
        image = self._get_image(item, 'landscape', width=440)

        # we try to get a nice background based on the show
        show = item.get('show', {})
        if not show or show is None:
            show = {}
            pass
        fanart = self._get_image(show, 'background', width=1280, height=720,
                                 fallback=self.get_fanart(context))

        path = self._get_path_from_url(context, item, 'self')
        video_id = item['id']
        video_item = VideoItem(title, uri=context.create_uri(['play'], {'video_id': video_id}), image=image,
                               fanart=fanart)

        _plot = item.get('long_description', item.get('short_description', ''))
        video_item.set_plot(_plot)

        duration = item.get('duration', '')
        if duration:
            try:
                duration = kodion.utils.datetime_parser.parse(duration)
                seconds = duration.second
                seconds += duration.minute * 60
                seconds += duration.hour * 60 * 60
                video_item.set_duration_from_seconds(seconds)
            except:
                duration = ''
                pass
            pass

        # update events based on their status
        stream = item.get('stream', {})
        if stream is None:
            stream = {}
            pass
        status = stream.get('status', '')
        if status in ['replay', 'complete']:
            # video_item.set_title('[B][Replay][/B] %s' % video_item.get_title())
            # do nothing
            pass
        elif status in ['live']:
            video_item.set_title('[B][Live][/B] %s' % video_item.get_title())
            pass
        elif status in ['pre-event', 'soon']:
            try:
                starts_at = stream.get('starts_at', '')
                start_time = published = kodion.utils.datetime_parser.parse(starts_at)
                date_str = context.format_date_short(start_time)
                time_str = context.format_time(start_time)
                video_item.set_title('[B]%s %s (GMT)[/B] %s' % (date_str, time_str, video_item.get_title()))
            except:
                video_item.set_title('[B][Upcoming][/B] %s' % video_item.get_title())
                pass
            pass

        # Fallback: we try to calculate a duration based on the event
        if not duration:
            try:
                starts_at = stream.get('starts_at', '')
                ends_at = stream.get('ends_at', '')
                if starts_at and ends_at:
                    start_time = published = kodion.utils.datetime_parser.parse(starts_at)
                    end_time = published = kodion.utils.datetime_parser.parse(ends_at)
                    duration = end_time - start_time
                    video_item.set_duration_from_seconds(duration.seconds)
                    pass
            except:
                # do nothing
                pass
            pass

        published = item.get('published_on', '')
        if published:
            published = kodion.utils.datetime_parser.parse(published)
            if isinstance(published, datetime.date):
                published = datetime.datetime(published.year, published.month, published.day, 0, 0, 0, 0)
                pass
            video_item.set_aired_from_datetime(published)
            video_item.set_date_from_datetime(published)
            video_item.set_year(published.year)
            video_item.set_premiered_from_datetime(published)
            pass

        season = item.get('season_number', 1)
        if season and season is not None:
            video_item.set_season(int(season))
            pass

        episode = item.get('episode_number', 1)
        if episode and episode is not None:
            video_item.set_episode(int(episode))
            pass
        return video_item
예제 #5
0
def make_video_item_from_json_data(context, provider, json_data, playlist_item_id_dict={}):
    video_id = json_data['id']
    video_item = VideoItem(json_data['title'],
                           uri=context.create_uri(['play'], {'video_id': video_id}))

    video_item.set_image(json_data.get('image', ''))

    """
    This is experimental. We try to get the most information out of the title of a video.
    This is not based on any language. In some cases this won't work at all.
    TODO: via language and settings provide the regex for matching episode and season.
    """
    video_item.set_season(1)
    video_item.set_episode(1)
    for regex in __RE_SEASON_EPISODE_MATCHES__:
        re_match = regex.search(video_item.get_name())
        if re_match:
            if 'season' in re_match.groupdict():
                video_item.set_season(int(re_match.group('season')))
                pass

            if 'episode' in re_match.groupdict():
                video_item.set_episode(int(re_match.group('episode')))
                pass
            break
        pass

    settings = context.get_settings()

    # plot
    channel_name = json_data.get('channel-title', '')
    description = kodion.utils.strip_html_from_text(json_data.get('description', ''))
    if channel_name and settings.get_bool('youtube.view.description.show_channel_name', True):
        description = '[UPPERCASE][B]%s[/B][/UPPERCASE][CR][CR]%s' % (channel_name, description)
        pass
    video_item.set_studio(channel_name)
    # video_item.add_cast(channel_name)
    video_item.add_artist(channel_name)
    video_item.set_plot(description)

    # date time
    date_str = json_data.get('date', '')
    if date_str:
        datetime = utils.datetime_parser.parse()
        video_item.set_year_from_datetime(datetime)
        video_item.set_aired_from_datetime(datetime)
        video_item.set_premiered_from_datetime(datetime)
        pass

    # duration
    duration = json_data.get('duration', '')
    if duration:
        duration = utils.datetime_parser.parse(duration)
        # we subtract 1 seconds because YouTube returns +1 second to much
        video_item.set_duration_from_seconds(duration.seconds - 1)
        pass

    # set fanart
    video_item.set_fanart(provider.get_fanart(context))

    context_menu = []
    replace_context_menu = False

    # Refresh ('My Subscriptions', all my playlists)
    if context.get_path() == '/special/new_uploaded_videos/' or context.get_path().startswith(
            '/channel/mine/playlist/'):
        yt_context_menu.append_refresh(context_menu, provider, context)
        pass

    # Queue Video
    yt_context_menu.append_queue_video(context_menu, provider, context)

    # play all videos of the playlist
    some_playlist_match = re.match('^/channel/(.+)/playlist/(?P<playlist_id>.*)/$', context.get_path())
    if some_playlist_match:
        replace_context_menu = True
        playlist_id = some_playlist_match.group('playlist_id')

        yt_context_menu.append_play_all_from_playlist(context_menu, provider, context, playlist_id, video_id)
        yt_context_menu.append_play_all_from_playlist(context_menu, provider, context, playlist_id)
        pass

    # 'play with...' (external player)
    if context.get_settings().is_support_alternative_player_enabled():
        yt_context_menu.append_play_with(context_menu, provider, context)
        pass

    my_playlists = {}
    if provider.is_logged_in():
        resource_manager = provider.get_resource_manager(context)
        my_playlists = resource_manager.get_related_playlists(channel_id='mine')
        pass

    if provider.is_logged_in():
        # add 'Watch Later' only if we are not in my 'Watch Later' list
        watch_later_playlist_id = my_playlists.get('watchLater', '')
        yt_context_menu.append_watch_later(context_menu, provider, context, watch_later_playlist_id, video_id)
        pass

    channel_id = json_data.get('channel-id', '')

    # got to [CHANNEL]
    if channel_id and channel_name:
        # only if we are not directly in the channel provide a jump to the channel
        if kodion.utils.create_path('channel', channel_id) != context.get_path():
            yt_context_menu.append_go_to_channel(context_menu, provider, context, channel_id, channel_name)
            pass
        pass

    # description links
    yt_context_menu.append_content_from_description(context_menu, provider, context, video_id)

    # find related videos
    yt_context_menu.append_related_videos(context_menu, provider, context, video_id)

    if provider.is_logged_in():
        # add 'Like Video' only if we are not in my 'Liked Videos' list
        refresh_container = context.get_path().startswith(
            '/channel/mine/playlist/LL') or context.get_path() == '/special/disliked_videos/'
        yt_context_menu.append_rate_video(context_menu, provider, context, video_id, refresh_container)

        # add video to a selected playlist
        yt_context_menu.append_add_video_to_playlist(context_menu, provider, context, video_id)

        # provide 'remove' for videos in my playlists
        if video_id in playlist_item_id_dict:
            playlist_match = re.match('^/channel/mine/playlist/(?P<playlist_id>.*)/$', context.get_path())
            if playlist_match:
                playlist_id = playlist_match.group('playlist_id')
                # we support all playlist except 'Watch History'
                if not playlist_id.startswith('HL'):
                    playlist_item_id = playlist_item_id_dict[video_id]
                    context_menu.append((context.localize(provider.LOCAL_MAP['youtube.remove']),
                                         'RunPlugin(%s)' % context.create_uri(
                                             ['playlist', 'remove', 'video'],
                                             {'playlist_id': playlist_id, 'video_id': playlist_item_id,
                                              'video_name': video_item.get_name()})))
                    pass
                pass
            pass

        # subscribe to the channel of the video
        yt_context_menu.append_subscribe_to_channel(context_menu, provider, context, channel_id, channel_name)
        pass

    if len(context_menu) > 0:
        video_item.set_context_menu(context_menu, replace=replace_context_menu)
        pass

    return video_item