public GoogleDriveFile GetDriveFolder(string folderName) { DriveService service = GetService(); List <GoogleDriveFile> FolderList = new List <GoogleDriveFile>(); FilesResource.ListRequest request = service.Files.List(); request.Q = "mimeType='application/vnd.google-apps.folder'"; request.Fields = "files(id, name)"; Google.Apis.Drive.v3.Data.FileList result = request.Execute(); foreach (var file in result.Files) { if (file.Name == folderName) { GoogleDriveFile File = new GoogleDriveFile { Id = file.Id, Name = file.Name, Size = file.Size, Version = file.Version, CreatedTime = file.CreatedTime }; FolderList.Add(File); } } return(FolderList.FirstOrDefault()); }
public static async Task <WebDirectory> IndexAsync(WebDirectory webDirectory) { webDirectory.StartTime = DateTimeOffset.UtcNow; string nextPageToken = string.Empty; string folderId = webDirectory.Uri.Segments.Last(); do { await RateLimiter.RateLimit(); Logger.Debug($"Started Google Drive Request for Folder {folderId}"); FilesResource.ListRequest listRequest = DriveService.Files.List(); listRequest.PageSize = 1000; listRequest.Q = $"'{folderId}' in parents"; listRequest.PageToken = nextPageToken; listRequest.Fields = "nextPageToken, files(id, name, mimeType, size)"; Google.Apis.Drive.v3.Data.FileList fileList = await listRequest.ExecuteAsync(); foreach (Google.Apis.Drive.v3.Data.File file in fileList.Files.OrderByDescending(f => f.MimeType == FolderMimeType).ThenBy(f => f.Name)) { bool isFile = file.MimeType != FolderMimeType; if (!isFile) { webDirectory.Subdirectories.Add(new WebDirectory(webDirectory) { Url = $"https://drive.google.com/drive/folders/{file.Id}", Name = file.Name }); } else { webDirectory.Files.Add(new WebFile { Url = $"https://drive.google.com/uc?export=download&id={file.Id}", FileName = file.Name, FileSize = file.Size ?? 0 }); } } nextPageToken = fileList.NextPageToken; } while (!string.IsNullOrWhiteSpace(nextPageToken)); webDirectory.Finished = true; Logger.Debug($"Finished Google Drive Request for Folder {folderId}"); return(webDirectory); }
public static Google.Apis.Drive.v3.Data.FileList DeleteAfter30(DriveService service, FilesListOptionalParms optional = null) { DateTime ThirtyDayBeforeToday = DateTime.Now.AddDays(-30); try { // Initial validation. if (service == null) { throw new ArgumentNullException("service"); } // Building the initial request. var request = service.Files.List(); // Applying optional parameters to the request. request.Fields = "nextPageToken, files(createdTime ,id, name, mimeType)"; var pageStreamer = new Google.Apis.Requests.PageStreamer <Google.Apis.Drive.v3.Data.File, FilesResource.ListRequest, Google.Apis.Drive.v3.Data.FileList, string>( (req, token) => request.PageToken = token, response => response.NextPageToken, response => response.Files); var allFiles = new Google.Apis.Drive.v3.Data.FileList(); allFiles.Files = new List <Google.Apis.Drive.v3.Data.File>(); foreach (var result in pageStreamer.Fetch(request)) { if (result.MimeType != "application/vnd.google-apps.folder") { if (result.CreatedTime < ThirtyDayBeforeToday) { service.Files.Delete(result.Id).Execute(); } else { Console.WriteLine("Data sie zgdza"); } } else { Console.WriteLine("Nie usunięto"); } } return(allFiles); } catch (Exception Ex) { throw new Exception("Request Files.List failed.", Ex); } }
public static void PrettyPrint(DriveService service, Google.Apis.Drive.v3.Data.FileList list, string indent) { foreach (var item in list.Files.OrderBy(a => a.Name)) { Console.WriteLine(string.Format("{0}|-{1}", indent, item.Name)); if (item.MimeType == "application/vnd.google-apps.folder") { var ChildrenFiles = ListAll(service, new FilesListOptionalParms { Q = string.Format("('{0}' in parents)", item.Id), PageSize = 1000 }); PrettyPrint(service, ChildrenFiles, indent + " "); } } }
//get link folder //create folder on drive public static string GetLinkFolder(string folderName) { string linkdrive = ""; Google.Apis.Drive.v3.DriveService service = GetService(); // Define parameters of request. FilesResource.ListRequest request = service.Files.List(); request.Q = "mimeType='application/vnd.google-apps.folder' and name='" + folderName + "'"; //request.Fields = "files(id, name)"; Google.Apis.Drive.v3.Data.FileList result = request.Execute(); foreach (var item in result.Files) { linkdrive = item.Id; break; } return(linkdrive); }
//Drive'daki klasörlerin listesini almak için public static List <GoogleDriveModel> GetDriveFolders() { DriveService service = GetService(); List <GoogleDriveModel> FolderList = new List <GoogleDriveModel>(); FilesResource.ListRequest request = service.Files.List(); request.Q = "mimeType='application/vnd.google-apps.folder'"; request.Fields = "files(id, name)"; Google.Apis.Drive.v3.Data.FileList result = request.Execute(); foreach (var file in result.Files) { GoogleDriveModel File = new GoogleDriveModel { Id = file.Id, Name = file.Name, Size = file.Size, Version = file.Version, CreatedTime = file.CreatedTime }; FolderList.Add(File); } return(FolderList); }
/// <summary> /// Get files method. /// </summary> /// <param name="parent">The parent folder.</param> /// <returns>A list of files.</returns> public IList <Google.Apis.Drive.v3.Data.File> GetFiles(string parent) { IList <Google.Apis.Drive.v3.Data.File> files; FilesResource.ListRequest listRequest = driveService.Files.List(); listRequest.Fields = "files(id, name, mimeType, modifiedTime)"; listRequest.Q = $"'{parent}' in parents"; listRequest.PageSize = 1000; Google.Apis.Drive.v3.Data.FileList filesList = listRequest.Execute(); files = filesList.Files; string message = string.Format( CultureInfo.InvariantCulture, "Retrieved files from: {0} count: {1}", parent, files.Count); Log.Info(CultureInfo.InvariantCulture, m => m( message)); return(files); }
/// <summary> /// List files in the appDataFolder matching the given query string. /// </summary> /// <param name="query">The query string to use when searching. Set to null to list all /// files.</param> /// <returns>A list of File objects matching the given query string.</returns> /// <remarks> /// See https://developers.google.com/drive/v3/web/search-parameters for documentation of /// the query string. /// /// TODO: Figure out how to tell if the initial request or subsequent pagination failed, /// and handle those cases appropriately. /// </remarks> private async Task <List <Google.Apis.Drive.v3.Data.File> > ListFilesHelperAsync(string query) { List <Google.Apis.Drive.v3.Data.File> result = new List <Google.Apis.Drive.v3.Data.File>(); FilesResource.ListRequest listRequest = service.Files.List(); listRequest.Spaces = "appDataFolder"; if (query != null) { listRequest.Q = query; } bool done = false; Google.Apis.Drive.v3.Data.FileList fileList = await listRequest.ExecuteAsync(); while (!done) { IList <Google.Apis.Drive.v3.Data.File> files = fileList.Files; result.AddRange(files); if (fileList.NextPageToken == null) { Debug.WriteLine("Processed last page"); done = true; } else { Debug.WriteLine("Retrieving another page"); FilesResource.ListRequest newListRequest = service.Files.List(); newListRequest.Spaces = "appDataFolder"; newListRequest.PageSize = 10; newListRequest.PageToken = fileList.NextPageToken; fileList = await newListRequest.ExecuteAsync(); } } return(result); }
/// <summary> /// Lists or searches files. /// Documentation https://developers.google.com/drive/v3/reference/files/list /// Generation Note: This does not always build correctly. Google needs to standardize things I need to figure out which ones are wrong. /// </summary> /// <param name="service">Authenticated Drive service. </param> /// <param name="optional">The optional parameters. </param> /// <returns>FileListResponse</returns> public static Google.Apis.Drive.v3.Data.FileList ListAll(DriveService service, FilesListOptionalParms optional = null) { try { // Initial validation. if (service == null) { throw new ArgumentNullException("service"); } // Building the initial request. var request = service.Files.List(); // Applying optional parameters to the request. request = (FilesResource.ListRequest)SampleHelpers.ApplyOptionalParms(request, optional); var pageStreamer = new Google.Apis.Requests.PageStreamer <Google.Apis.Drive.v3.Data.File, FilesResource.ListRequest, Google.Apis.Drive.v3.Data.FileList, string>( (req, token) => request.PageToken = token, response => response.NextPageToken, response => response.Files); var allFiles = new Google.Apis.Drive.v3.Data.FileList(); allFiles.Files = new List <Google.Apis.Drive.v3.Data.File>(); foreach (var result in pageStreamer.Fetch(request)) { allFiles.Files.Add(result); } return(allFiles); } catch (Exception Ex) { throw new Exception("Request Files.List failed.", Ex); } }
public static async Task CheckFilesAsync(CancellationToken cancellationToken) { _mvm.IsLvEnabled = false; var listRequest = Helper.Service.Files.List(); listRequest.OrderBy = "name"; listRequest.Fields = "files(id, name, modifiedTime)"; listRequest.Q = $"'{Properties.FolderId}' in parents"; Google.Apis.Drive.v3.Data.FileList files = null; try { files = await listRequest.ExecuteAsync(); } catch (Exception e) { if (_mvm.IsHideExceptionMissionChecked == false) { MessageBox.Show($"An Exception was thrown: {e.Message}\nIt was thrown while trying to connect to the Google servers!", "Error", MessageBoxButton.OK, MessageBoxImage.Error); } return; } files.Files.Remove(files.Files.SingleOrDefault(r => r.Name == "readme.txt")); if (_mvm.IsRemoveMfsChecked) { var deadMissionFiles = _mvm.IgnoredItems.Where(i => files.Files.All(b => b.Id != i.FileId)).ToList(); foreach (var item in deadMissionFiles) { _mvm.IgnoredItems.Remove(item); if (File.Exists(Properties.GetArma3MissionFolderPath + item.Item)) { File.Delete(Properties.GetArma3MissionFolderPath + item.Item); } } } foreach (var item in _mvm.IgnoredItems) { files.Files.Remove(files.Files.SingleOrDefault(r => r.Id == item.FileId)); } if (_mvm.IsOrdered) { files.Files = files.Files.Reverse().ToList(); } if (_mvm.MissionItems.Count > 0) { //Mission file added to the Google drive if (_mvm.MissionItems.Count < files.Files.Count) { foreach (var item in files.Files.ToList()) { if (_mvm.MissionItems.Any(a => a.Mission == item.Name)) { continue; } int itemPosition = files.Files.IndexOf(item); _mvm.MissionItems.Insert(itemPosition, new MissionModel() { Mission = item.Name, IsMissionUpdated = "Missing", ModifiedTime = item.ModifiedTime.Value.ToString("dd.MM.yyyy HH:mm:ss"), IsModifiedTimeUpdated = "Missing", FileId = item.Id, IsChecked = false }); } } //Mission file removed from the Google drive if (_mvm.MissionItems.Count > files.Files.Count) { foreach (var item in _mvm.MissionItems.ToList().Where(item => files.Files.All(a => a.Name != item.Mission))) { _mvm.MissionItems.Remove(item); if (File.Exists(Properties.GetArma3MissionFolderPath + item.Mission)) { File.Delete(Properties.GetArma3MissionFolderPath + item.Mission); } } } //The same amount in both places if (_mvm.MissionItems.Count == files.Files.Count) { foreach (var(item1, item2) in _mvm.MissionItems.Zip(files.Files, Tuple.Create).ToList().Where(item => item.Item1.ModifiedTime != item.Item2.ModifiedTime.Value.ToString("dd.MM.yyyy HH:mm:ss"))) { string status = await CheckItemAsync(item2.Name, item2.Id); item1.Mission = item2.Name; item1.IsMissionUpdated = status; item1.ModifiedTime = item2.ModifiedTime.Value.ToString("dd.MM.yyyy HH:mm:ss"); item1.IsModifiedTimeUpdated = status; item1.FileId = item2.Id; item1.IsChecked = item1.IsChecked; } } foreach (var item in _mvm.MissionItems.ToList()) { string status = await CheckItemAsync(item.Mission, item.FileId); item.IsMissionUpdated = status; item.IsModifiedTimeUpdated = status; } } else { foreach (var file in files.Files) { string status = await CheckItemAsync(file.Name, file.Id); _mvm.MissionItems.Add(new MissionModel() { Mission = file.Name, IsMissionUpdated = status, ModifiedTime = file.ModifiedTime.Value.ToString("dd.MM.yyyy HH:mm:ss"), IsModifiedTimeUpdated = status, FileId = file.Id, IsChecked = false }); } } _mvm.IsLvEnabled = true; var requestedProgram = await Helper.GetFileRequest(Properties.ProgramId, "md5Checksum").ExecuteAsync(); string programMd5Checksum = CalculateMd5(Process.GetCurrentProcess().MainModule.FileName); if (cancellationToken.IsCancellationRequested) { return; } if (Equals(requestedProgram.Md5Checksum, programMd5Checksum)) { _mvm.ProgramStatus = "Updated"; } else { _mvm.ProgramStatus = "Outdated"; _mvm.IsUpdateVisible = Visibility.Visible; if (_mvm.IsUpdateNotifyChecked) { var result = System.Windows.Forms.MessageBox.Show("A new update for GTA program has been detected. Download it?", "Update", System.Windows.Forms.MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Information); if (result == System.Windows.Forms.DialogResult.Yes) { await Download.FileAsync(Properties.ProgramId, null, Helper.CtsStopDownloading.Token, Download.Option.ProgramUpdate); } } } }
public static async Task <WebDirectory> IndexAsync(WebDirectory webDirectory) { webDirectory.StartTime = DateTimeOffset.UtcNow; string nextPageToken = string.Empty; string folderId = webDirectory.Uri.Segments.Last(); do { bool rateLimitException = false; do { try { await RateLimiter.RateLimit(); Logger.Debug($"Started Google Drive Request for Folder {folderId}"); FilesResource.ListRequest listRequest = DriveService.Files.List(); listRequest.PageSize = 1000; listRequest.Q = $"'{folderId}' in parents"; listRequest.PageToken = nextPageToken; listRequest.Fields = "nextPageToken, files(id, name, mimeType, size)"; listRequest.IncludeItemsFromAllDrives = true; listRequest.SupportsAllDrives = true; Google.Apis.Drive.v3.Data.FileList fileList = await listRequest.ExecuteAsync(); foreach (Google.Apis.Drive.v3.Data.File file in fileList.Files.OrderByDescending(f => f.MimeType == FolderMimeType).ThenBy(f => f.Name)) { bool isFile = file.MimeType != FolderMimeType; if (!isFile) { webDirectory.Subdirectories.Add(new WebDirectory(webDirectory) { Url = $"https://drive.google.com/drive/folders/{file.Id}", Name = file.Name }); } else { webDirectory.Files.Add(new WebFile { Url = $"https://drive.google.com/uc?export=download&id={file.Id}", FileName = file.Name, FileSize = file.Size ?? 0 }); } } nextPageToken = fileList.NextPageToken; rateLimitException = false; } catch (GoogleApiException ex) { rateLimitException = ex.Error.Message == "User rate limit exceeded."; if (rateLimitException) { Logger.Debug($"Google Drive rate limit, try again"); } else { Logger.Error($"Google Drive error: {ex}"); } } } while (rateLimitException); } while (!string.IsNullOrWhiteSpace(nextPageToken)); Logger.Debug($"Finished Google Drive Request for Folder {folderId}"); return(webDirectory); }
// Gets path from cache or downloads image to cache from drive public static int saveAll(int highest) { Commands.Gec.RefreshGec(); FileUtils.checkForCacheExistance(); DriveService driveService = AuthenticateServiceAccount( "*****@*****.**", "../../../GeckoBot-af43fa71833e.json"); var listRequest = driveService.Files.List(); listRequest.PageSize = 1000; // Only fetch one thousand listRequest.Q = "mimeType contains 'image'"; // Filter out folders or other non image types Google.Apis.Drive.v3.Data.FileList files2 = listRequest.Execute(); IList <Google.Apis.Drive.v3.Data.File> files = files2.Files; int totalAmount = 0; int amount = 0; while (totalAmount < highest) { foreach (Google.Apis.Drive.v3.Data.File file in files) { string name = file.Name.Remove(3); if (name.Contains("b")) { name = file.Name.Remove(4); } if (CheckCache(name) == null) { string type = file.MimeType.Replace("image/", ""); // sorta hacky solution to get file type using var fileStream = new FileStream( $"../../Cache/{name}_icon.{type}", FileMode.Create, FileAccess.Write); driveService.Files.Get(file.Id).Download(fileStream); amount++; } if (!Commands.Gec.geckos.ContainsKey(EmoteUtils.escapeforbidden(name))) { Commands.Gec.geckos.Add(EmoteUtils.escapeforbidden(name), EmoteUtils.escapeforbidden(file.Name)); if (CheckCache(name) != null) { continue; } } else if (!Commands.Gec.geckos.ContainsValue(EmoteUtils.escapeforbidden(file.Name))) { Commands.Gec.geckos.Remove(EmoteUtils.escapeforbidden(name)); Commands.Gec.geckos.Add(EmoteUtils.escapeforbidden(name), EmoteUtils.escapeforbidden(file.Name)); } totalAmount++; } listRequest.PageToken = files2.NextPageToken; } FileUtils.Save(Globals.DictToString(Commands.Gec.geckos, "{0} ⁊ {1} ҩ "), @"..\..\Cache\gecko7.gek"); return(amount); }
public static async Task <WebDirectory> IndexAsync(WebDirectory webDirectory, string resourceKey) { webDirectory.StartTime = DateTimeOffset.UtcNow; string nextPageToken = string.Empty; string folderId = webDirectory.Uri.Segments.Last(); bool rateLimitException = false; int retries = 0; int maxRetries = 5; while (retries < maxRetries || rateLimitException || !string.IsNullOrWhiteSpace(nextPageToken)) { try { await RateLimiter.RateLimit(); Logger.Debug($"Started Google Drive Request for Folder {folderId}"); if (!string.IsNullOrWhiteSpace(resourceKey)) { DriveService.HttpClient.DefaultRequestHeaders.Add("X-Goog-Drive-Resource-Keys", $"{folderId}/{resourceKey}"); } else { if (DriveService.HttpClient.DefaultRequestHeaders.Contains("X-Goog-Drive-Resource-Keys")) { DriveService.HttpClient.DefaultRequestHeaders.Remove("X-Goog-Drive-Resource-Keys"); } } FilesResource.ListRequest listRequest = DriveService.Files.List(); listRequest.PageSize = 1000; listRequest.Q = $"'{folderId}' in parents"; listRequest.PageToken = nextPageToken; listRequest.Fields = "nextPageToken, files(id, name, mimeType, size, shortcutDetails, resourceKey)"; listRequest.IncludeItemsFromAllDrives = true; listRequest.SupportsAllDrives = true; Google.Apis.Drive.v3.Data.FileList fileList = await listRequest.ExecuteAsync(); foreach (Google.Apis.Drive.v3.Data.File file in fileList.Files.OrderByDescending(f => f.MimeType == FolderMimeType || f.MimeType == ShortcutMimeType).ThenBy(f => f.Name)) { string mimeType = file.ShortcutDetails?.TargetMimeType ?? file.MimeType; string id = file.ShortcutDetails?.TargetId ?? file.Id; bool isFile = mimeType != FolderMimeType; if (!isFile) { string url = $"https://drive.google.com/drive/folders/{id}"; if (!string.IsNullOrEmpty(file.ResourceKey)) { url += $"?resourcekey={file.ResourceKey}"; } webDirectory.Subdirectories.Add(new WebDirectory(webDirectory) { Url = url, Name = file.Name }); } else { string url = $"https://drive.google.com/uc?export=download&id={id}"; if (!string.IsNullOrEmpty(file.ResourceKey)) { url += $"&resourcekey={file.ResourceKey}"; } webDirectory.Files.Add(new WebFile { Url = url, FileName = file.Name, FileSize = file.Size ?? 0 }); } } nextPageToken = fileList.NextPageToken; rateLimitException = false; if (retries > 0) { Logger.Warn($"Retrieval succesful after try {retries + 1} for {webDirectory.Url}"); } if (string.IsNullOrWhiteSpace(nextPageToken)) { break; } retries = 0; } catch (GoogleApiException ex) { RateLimiter.AddDelay(TimeSpan.FromSeconds(5)); rateLimitException = ex.Error?.Message == "User rate limit exceeded."; if (rateLimitException) { Logger.Debug($"Google Drive rate limit, try again"); } else { retries++; Logger.Warn($"Google Drive error for {webDirectory.Url} on try {retries + 1}: {ex.Message}"); } if (retries == maxRetries) { Logger.Error($"Skip {webDirectory.Url} because of {maxRetries} consecutive errors on : {ex.Message}"); webDirectory.Error = true; return(webDirectory); } } } Logger.Debug($"Finished Google Drive Request for Folder {folderId}"); return(webDirectory); }