示例#1
0
def video_new(channel, playlist):
    """
    Add a new video
    """
    form = VideoAddForm()
    if form.validate_on_submit():
        video = Video(playlist=playlist)
        form.populate_obj(video)
        try:
            process_video(video, new=True)
            process_slides(video)
        except (DataProcessingError, ValueError) as e:
            flash(e.message, category="error")
            return render_form(form=form,
                               title=u"New Video",
                               submit=u"Add",
                               cancel_url=playlist.url_for(),
                               ajax=False)
        video.make_name()
        playlist.videos.append(video)
        db.session.commit()
        flash(u"Added video '%s'." % video.title, 'success')
        return render_redirect(video.url_for('edit'))
    return render_form(form=form,
                       title=u"New Video",
                       submit=u"Add",
                       cancel_url=playlist.url_for(),
                       ajax=False)
示例#2
0
def add_new_video(channel, playlist):
    form = VideoAddForm()
    if form.validate_on_submit():
        stream_playlist = channel.playlist_for_stream(create=True)
        video = Video(
            playlist=playlist if playlist is not None else stream_playlist)
        form.populate_obj(video)
        try:
            process_video(video, new=True)
            process_slides(video)
        except (DataProcessingError, ValueError) as e:
            flash(e.message, category="error")
            return render_form(form=form,
                               title=u"New Video",
                               submit=u"Add",
                               cancel_url=channel.url_for(),
                               ajax=False)
        video.make_name()
        if playlist is not None and video not in playlist.videos:
            playlist.videos.append(video)
        if video not in stream_playlist.videos:
            stream_playlist.videos.append(video)
        db.session.commit()
        flash(u"Added video '%s'." % video.title, 'success')
        return render_redirect(video.url_for('edit'))
    if playlist is None:
        cancel_url = channel.url_for()
    else:
        cancel_url = playlist.url_for()
    return render_form(form=form,
                       title=u"New Video",
                       submit=u"Add",
                       cancel_url=cancel_url,
                       ajax=False)
示例#3
0
def process_playlist(playlist, playlist_url):
    """
    Get metadata for the playlist from the corresponding site
    """
    # Parse the playlist url
    if playlist_url:
        parsed = urlparse(escape(playlist_url))
        # Check video source and get corresponding data
        if parsed.netloc in ['youtube.com', 'www.youtube.com']:
            try:
                stream_playlist = playlist.channel.playlist_for_stream(
                    create=True)
                # first two character of playlist id says what type of playlist, ignore them
                playlist_id = parse_qs(parsed.query)['list'][0][2:]
                youtube = build('youtube',
                                'v3',
                                developerKey=app.config['YOUTUBE_API_KEY'])
                playlistitems_list_request = youtube.playlistItems().list(
                    playlistId=playlist_id, part='snippet', maxResults=50)
                playlist_info_request = youtube.playlists().list(
                    id=playlist_id, part='snippet')
                if playlist_info_request:
                    playlist_infos = playlist_info_request.execute()
                    for playlist_info in playlist_infos['items']:
                        playlist.title = playlist.title or playlist_info[
                            'snippet']['title']
                        if playlist_info['snippet']['description']:
                            playlist.description = playlist_info['snippet'][
                                'description']
                while playlistitems_list_request:
                    playlistitems_list_response = playlistitems_list_request.execute(
                    )
                    for playlist_item in playlistitems_list_response['items']:
                        with db.session.no_autoflush:
                            video = Video.query.filter_by(
                                video_source=u'youtube',
                                channel=playlist.channel,
                                video_sourceid=playlist_item['snippet']
                                ['resourceId']['videoId']).first()
                        if video:
                            if video not in stream_playlist.videos:
                                stream_playlist.videos.append(video)
                            if video not in playlist.videos:
                                playlist.videos.append(video)
                        else:
                            video = Video(playlist=playlist if playlist
                                          is not None else stream_playlist)
                            video.title = playlist_item['snippet']['title']
                            video.video_url = 'https://www.youtube.com/watch?v=' + playlist_item[
                                'snippet']['resourceId']['videoId']
                            if playlist_item['snippet']['description']:
                                video.description = markdown(
                                    playlist_item['snippet']['description'])
                            for thumbnail in playlist_item['snippet'][
                                    'thumbnails']['medium']:
                                thumbnail_url_request = requests.get(
                                    playlist_item['snippet']['thumbnails']
                                    ['medium']['url'])
                                filestorage = return_werkzeug_filestorage(
                                    thumbnail_url_request,
                                    filename=secure_filename(
                                        playlist_item['snippet']['title'])
                                    or 'name-missing')
                                video.thumbnail_path = thumbnails.save(
                                    filestorage)
                            video.video_sourceid = playlist_item['snippet'][
                                'resourceId']['videoId']
                            video.video_source = u'youtube'
                            video.make_name()
                            playlist.videos.append(video)
                            with db.session.no_autoflush:
                                if video not in stream_playlist.videos:
                                    stream_playlist.videos.append(video)
                    playlistitems_list_request = youtube.playlistItems(
                    ).list_next(playlistitems_list_request,
                                playlistitems_list_response)
            except requests.ConnectionError:
                raise DataProcessingError("Unable to establish connection")
            except gaierror:
                raise DataProcessingError("Unable to resolve the hostname")
            except KeyError:
                raise DataProcessingError(
                    "Supplied youtube URL doesn't contain video information")
            except HttpError:
                raise DataProcessingError(
                    "HTTPError while parsing YouTube playlist")
        else:
            raise ValueError("Unsupported video site")
    else:
        raise ValueError("Video URL is missing")
示例#4
0
                def inner(start_index=1, max_result=50, total=0):
                    """Retireves youtube playlist videos recursively

                    :param start_index: Index to start for fetching videos in playlist
                    :param max_result: Maximum results to return
                    :param total: variable to keep track of total videos fetched
                    """
                    r = requests.get(
                        'http://gdata.youtube.com/feeds/api/playlists/%s?v=2&alt=json&max-result=50&start-index=%d'
                        % (playlist_id, start_index))
                    if r.json is None:
                        raise DataProcessingError(
                            "Unable to fetch data, please check the youtube url"
                        )
                    else:
                        # fetch playlist info
                        playlist.title = r.json['feed']['title']['$t']
                        if 'media$description' in r.json['feed'][
                                'media$group']:
                            playlist.description = escape(
                                r.json['feed']['media$group']
                                ['media$description']['$t'])
                        for item in r.json['feed'].get('entry', []):
                            # If the video is private still youtube provides the title but doesn't
                            # provide thumbnail & urls, check for private video
                            is_private = item.get('app$control')
                            if is_private is not None and is_private[
                                    'yt$state']['reasonCode']:
                                continue
                            video = Video(playlist=playlist)
                            video.title = item['title']['$t']
                            video.video_url = item['media$group'][
                                'media$player']['url']
                            if 'media$description' in item['media$group']:
                                video.description = escape(
                                    item['media$group']['media$description']
                                    ['$t'])
                            for video_content in item['media$group'][
                                    'media$thumbnail']:
                                if video_content['yt$name'] == 'mqdefault':
                                    thumbnail_url_request = requests.get(
                                        video_content['url'])
                                    filestorage = return_werkzeug_filestorage(
                                        thumbnail_url_request,
                                        filename=secure_filename(
                                            item['title']['$t']))
                                    video.thumbnail_path = thumbnails.save(
                                        filestorage)
                            video.video_sourceid = item['media$group'][
                                'yt$videoid']['$t']
                            video.video_source = u"youtube"
                            video.make_name()
                            playlist.videos.append(video)
                        #When no more data is present to retrieve in playlist 'feed' is absent in json
                        if 'entry' in r.json['feed']:
                            total += len(r.json['feed']['entry'])
                            if total <= r.json['feed'][
                                    'openSearch$totalResults']:
                                # check for empty playlist
                                if not r.json['feed'].get('entry', []):
                                    raise DataProcessingError("Empty Playlist")
                                inner(start_index=total + 1, total=total)