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)); }
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()); }
private void PrepareOkCancel(GfycatPreset preset) { TitleTextBox.Text = preset.DefaultTitle; DescriptionTextBox.Text = preset.DefaultDescription; TagsTextBox.Text = preset.DefaultTags; IsPrivateCheckBox.IsChecked = preset.DefaultIsPrivate; CancelButton.Focus(); }
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(); }
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)); }
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; }
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; } }
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)); }
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)); }
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); }
/// <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 }); }
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); } }
public static bool IsAuthorizationExpired(GfycatPreset preset) { return(DateTime.UtcNow > preset.AccessTokenExpiryDate); }