Ejemplo n.º 1
0
        public static async Task <bool> IsAuthorized(GfycatPreset preset)
        {
            //When in anonymous mode, only the access token is used.
            if (preset.IsAnonymous)
            {
                //If the access token is still valid, no need to refresh it.
                if (!string.IsNullOrWhiteSpace(preset.AccessToken) && IsAuthorizationExpired(preset))
                {
                    return(true);
                }

                if (!await GetTokens(preset))
                {
                    return(false);
                }
            }

            //When in authenticated mode, if there's no refresh token, it means that the app if not authorized.
            if (string.IsNullOrWhiteSpace(preset.RefreshToken))
            {
                return(false);
            }

            if (!IsAuthorizationExpired(preset))
            {
                return(true);
            }

            return(await RefreshToken(preset));
        }
Ejemplo n.º 2
0
    public static async Task <ValidatedEventArgs> IsValid(GfycatPreset preset)
    {
        if (!preset.IsAnonymous && !await Gfycat.IsAuthorized(preset))
        {
            return(new ValidatedEventArgs("S.SaveAs.Warning.Upload.NotAuthorized", StatusReasons.UploadServiceUnauthorized, () => App.MainViewModel.OpenOptions.Execute(Options.UploadIndex)));
        }

        return(await preset.IsValid());
    }
Ejemplo n.º 3
0
        private void PrepareOkCancel(GfycatPreset preset)
        {
            TitleTextBox.Text           = preset.DefaultTitle;
            DescriptionTextBox.Text     = preset.DefaultDescription;
            TagsTextBox.Text            = preset.DefaultTags;
            IsPrivateCheckBox.IsChecked = preset.DefaultIsPrivate;

            CancelButton.Focus();
        }
Ejemplo n.º 4
0
        private void PrepareOk(GfycatPreset preset)
        {
            TitleTextBox.Text           = preset.DefaultTitle;
            DescriptionTextBox.Text     = preset.DefaultDescription;
            TagsTextBox.Text            = preset.DefaultTags;
            IsPrivateCheckBox.IsChecked = preset.DefaultIsPrivate;

            CancelButton.Visibility = Visibility.Collapsed;
            AcceptButton.Focus();
        }
Ejemplo n.º 5
0
    public static async Task <bool> GetTokens(GfycatPreset preset)
    {
        var auth = new GfycatAuthRequest
        {
            GrantType    = "client_credentials",
            ClientId     = Secret.GfycatId,
            ClientSecret = Secret.GfycatSecret
        };

        return(await GetTokens(preset, auth));
    }
Ejemplo n.º 6
0
        public GfycatCreateRequest(GfycatPreset preset)
        {
            var tags = preset.DefaultTags?.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries) ?? new string[] {};

            tags = tags.Length > 0 ? tags.Select(s => s.Trim()).ToArray() : null;

            Tile        = preset.DefaultTitle;
            Description = preset.DefaultDescription;
            Tags        = tags;
            IsPrivate   = preset.DefaultIsPrivate;
        }
Ejemplo n.º 7
0
    private void TypeComboBox_Selected(object sender, RoutedEventArgs e)
    {
        if (!IsLoaded)
        {
            return;
        }

        if (TypeComboBox.SelectedIndex < 1)
        {
            MainPresenter.Content = null;
            return;
        }

        if (!IsEditing)
        {
            //Create a new model.
            switch ((UploadDestinations)TypeComboBox.SelectedIndex)
            {
            case UploadDestinations.Imgur:
                CurrentPreset = new ImgurPreset();
                break;

            case UploadDestinations.Gfycat:
                CurrentPreset = new GfycatPreset();
                break;

            case UploadDestinations.Yandex:
                CurrentPreset = new YandexPreset();
                break;
            }
        }

        switch ((UploadDestinations)TypeComboBox.SelectedIndex)
        {
        case UploadDestinations.Imgur:
            MainPresenter.Content = new ImgurPanel {
                DataContext = CurrentPreset
            };
            break;

        case UploadDestinations.Gfycat:
            MainPresenter.Content = new GfycatPanel {
                DataContext = CurrentPreset
            };
            break;

        case UploadDestinations.Yandex:
            MainPresenter.Content = new YandexPanel {
                DataContext = CurrentPreset
            };
            break;
        }
    }
Ejemplo n.º 8
0
    public static async Task <bool> RefreshToken(GfycatPreset preset)
    {
        var auth = new GfycatAuthRequest
        {
            GrantType    = "refresh",
            ClientId     = Secret.GfycatId,
            ClientSecret = Secret.GfycatSecret,
            RefreshToken = preset.RefreshToken
        };

        return(await GetTokens(preset, auth));
    }
Ejemplo n.º 9
0
    public static async Task <bool> GetTokens(GfycatPreset preset, string username, string password)
    {
        var auth = new GfycatAuthRequest
        {
            GrantType    = "password",
            ClientId     = Secret.GfycatId,
            ClientSecret = Secret.GfycatSecret,
            Username     = username,
            Password     = password
        };

        return(await GetTokens(preset, auth));
    }
Ejemplo n.º 10
0
    private static async Task <bool> GetTokens(GfycatPreset preset, GfycatAuthRequest auth)
    {
        var response = await WebHelper.Post("https://api.gfycat.com/v1/oauth/token", Serializer.Serialize(auth));

        if (string.IsNullOrEmpty(response))
        {
            return(false);
        }

        var token = Serializer.Deserialize <OAuth2Token>(response);

        if (string.IsNullOrEmpty(token?.AccessToken))
        {
            return(false);
        }

        preset.AccessToken            = token.AccessToken;
        preset.RefreshToken           = token.RefreshToken;
        preset.AccessTokenExpiryDate  = DateTime.UtcNow + TimeSpan.FromSeconds(token.ExpiresIn - 10);
        preset.RefreshTokenExpiryDate = DateTime.UtcNow + TimeSpan.FromSeconds(token.RefreshTokenExpiresIn - 10);
        return(true);
    }
Ejemplo n.º 11
0
        /// <summary>
        /// Shows a Ok/Cancel dialog.
        /// </summary>
        /// <returns>True if Ok</returns>
        public static GfycatCreateRequest OkCancel(GfycatPreset preset)
        {
            var dialog = new UploadDetailsDialog();

            dialog.PrepareOkCancel(preset);
            var result = dialog.ShowDialog();

            if (!result.HasValue || !result.Value)
            {
                return(null);
            }

            var tags = dialog.TagsTextBox.Text.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);

            tags = tags.Length > 0 ? tags.Select(s => s.Trim()).ToArray() : null;

            return(new GfycatCreateRequest
            {
                Tile = dialog.TitleTextBox.Text,
                Description = dialog.DescriptionTextBox.Text,
                Tags = tags,
                IsPrivate = dialog.IsPrivateCheckBox.IsChecked == true
            });
        }
Ejemplo n.º 12
0
    private async Task <History> Upload(GfycatPreset preset, string path, NameValueCollection headers)
    {
        var create = preset.AskForDetails ? Application.Current.Dispatcher.Invoke <GfycatCreateRequest>(() => UploadDetailsDialog.OkCancel(preset)) : preset.ToCreateRequest();

        var result = await WebHelper.Post("https://api.gfycat.com/v1/gfycats", Serializer.Serialize(create), headers);

        var createResponse = Serializer.Deserialize <GfycatCreateResponse>(result);

        if (createResponse.Error != null)
        {
            return new GfycatHistory
                   {
                       PresetName = preset.Title,
                       DateInUtc  = DateTime.UtcNow,
                       Result     = 400,
                       GfyName    = createResponse.Name,
                       Message    = createResponse.Error.Code + " - " + createResponse.Error.Description
                   }
        }
        ;

        await using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
        {
            var args = new Dictionary <string, string>
            {
                { "key", createResponse.Name }
            };

            //I can't send the authorization header along the file upload.
            result = await WebHelper.SendFile("https://filedrop.gfycat.com", stream, createResponse.Name, args);

            //If response is empty/null, it means that the file was already processed.
            var uploadResponse = string.IsNullOrWhiteSpace(result) ? null : Serializer.Deserialize <GfycatUploadResponse>(result);

            while (uploadResponse?.Task != "complete")
            {
                result = await WebHelper.Get("https://api.gfycat.com/v1/gfycats/fetch/status/" + createResponse.Name, headers);

                uploadResponse = Serializer.Deserialize <GfycatUploadResponse>(result);

                if (uploadResponse.Task != "complete")
                {
                    Thread.Sleep(1000);
                }
                else if (uploadResponse.Task == "error")
                {
                    return new GfycatHistory
                           {
                               PresetName = preset.Title,
                               DateInUtc  = DateTime.UtcNow,
                               Result     = 400,
                               GfyName    = createResponse.Name,
                               Message    = uploadResponse.Error?.Code + " - " + uploadResponse.Error?.Description
                           }
                }
                ;
            }

            var history = new GfycatHistory
            {
                PresetName   = preset.Title,
                DateInUtc    = DateTime.UtcNow,
                Result       = 200,
                Link         = "https://gfycat.com/" + uploadResponse.GfyName,
                Size         = uploadResponse.Mp4Size,
                DeletionLink = "https://gfycat.com/delete/" + createResponse.Secret,
                Mp4Url       = uploadResponse.Mp4Url,
                WebmUrl      = uploadResponse.WebmUrl,
                GifUrl       = uploadResponse.GifUrl,
                MobileUrl    = uploadResponse.MobileUrl,
                WebmSize     = uploadResponse.WebmSize,
                GifSize      = uploadResponse.GifSize,
                GfyId        = uploadResponse.GfyId,
                GfyName      = uploadResponse.GfyName
            };

            return(history);
        }
    }
Ejemplo n.º 13
0
 public static bool IsAuthorizationExpired(GfycatPreset preset)
 {
     return(DateTime.UtcNow > preset.AccessTokenExpiryDate);
 }