def youtube_new(request):
    # set scope
    scope = u'{0} {1} {2}'.format(
        'https://www.googleapis.com/auth/youtube',
        'https://www.googleapis.com/auth/userinfo.profile',
        'https://www.googleapis.com/auth/userinfo.email'
    )

    # create session
    youtube = get_youtube_service()

    # redirect to dialog
    params = {
        'scope': scope,
        'access_type':'offline',
        'approval_prompt':'force',
        'response_type': 'code',
        'redirect_uri': YOUTUBE_CALLBACK_URL
    }
    authorization_url = youtube.get_authorize_url(**params)
    return redirect(authorization_url)
def youtube_callback(request):
    # get/check params
    redirect_uri = YOUTUBE_CALLBACK_URL
    code = request.GET.get('code', None)
    if not code:
        messages.error(request, u'Ocorreu um erro ao adicionar a conta do youtube.')
        return redirect('accounts_account_list')

    # create session
    youtube = get_youtube_service()

    # fetch tokens
    data = {'code':code, 'redirect_uri':redirect_uri, 'grant_type': 'authorization_code'}
    r = youtube.get_raw_access_token(data=data).json()
    access_token = r['access_token']
    expires = r['expires_in']
    refresh_token = r['refresh_token']

    # get information about user
    client = youtube.get_session(token=access_token)
    me = client.get('https://www.googleapis.com/oauth2/v1/userinfo').json()

    # create new social account
    account, created = Account.objects.get_or_create(
        user=request.user,
        provider='youtube',
        provider_id=me['id'],
        provider_username=me['email']
    )
    account.refresh_token = refresh_token
    account.oauth_token = access_token
    account.expires_in = datetime.now() + timedelta(seconds=int(expires))
    account.save()

    # redirect
    messages.success(request, u'Conta do youtube adicionada com sucesso.')
    return redirect('accounts_account_list')