private void btTest_Click(object sender, EventArgs e) { string connectionString = textBox1.Text.Trim(); if (connectionString.Length > 0) { if (ReverseImageSearch.Test(connectionString)) { MessageBox.Show(this, "Connection string is correct.", "Connection test", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { MessageBox.Show(this, "Connection string is incorrect.", "Connection test", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } }
private void reverseSearchToolStripMenuItem_Click(object sender, EventArgs e) { int index = dataGridView1.CurrentRow.Index; Image image = images[index]; string[] urls = ReverseImageSearch.GetSearchUrl(image); if (urls == null) { MessageBox.Show(this, "Reverse image search require image blob connection string set in options."); } else { foreach (string url in urls) { System.Diagnostics.Process.Start(url); } } }
static void Main(string[] args) { FileStream fileStream = File.Create(DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".log"); log = new StreamWriter(fileStream); log.WriteLine("Log Started"); #region Options //Should replace this with switches // Get Sort Type Console.WriteLine("Enter image directory (no trailing / ) or leave clear and just press enter to use current directory:"); string directory = Console.ReadLine(); if (directory != "" && !Directory.Exists(directory)) { Console.WriteLine(directory + " is not a valid directory, press any key to quit."); Console.ReadKey(); return; } if (directory != "") { baseDirectory = directory; } else { baseDirectory = Directory.GetCurrentDirectory(); } Console.WriteLine("\nAll operations will work on:\n" + baseDirectory + "\nnot on subdirectories."); Console.WriteLine("\nPress the matching letter key to select options:"); Console.WriteLine("Sort by:\n s(eries) / c(haracter) / q(uit)"); string key = Console.ReadKey().KeyChar.ToString().ToUpper(); if (key == "S") { CurrentSortBy = Sortby.Series; } if (key == "C") { CurrentSortBy = Sortby.Character; } if (key == "Q" || CurrentSortBy == Sortby.Unknown) { return; } // Get FileOperation Type Console.WriteLine("\n\nCopy or move file to new destination operation? Already existing files are overwritten:\n m(ove) / c(opy) / q(uit)"); string key2 = Console.ReadKey().KeyChar.ToString().ToUpper(); if (key2 == "M") { CurrentFileOperation = FileOperation.Move; } if (key2 == "C") { CurrentFileOperation = FileOperation.Copy; } if (key2 == "Q" || CurrentFileOperation == FileOperation.Unknown) { return; } // Get MD5Option Type Console.WriteLine("\n\nHash calculation:\nHard always uses file hashes, lower success rate and speed but no false positives." + "\nSoft first looks for hashes in filenames then in file hashes, faster and better success rate, but may have false positives and false negatives:" + "\n h(ard) / s(oft) / q(uit)"); string key3 = Console.ReadKey().KeyChar.ToString().ToUpper(); if (key3 == "H") { CurrentMD5Option = MD5Option.Hard; } if (key3 == "S") { CurrentMD5Option = MD5Option.Soft; } if (key3 == "Q" || CurrentMD5Option == MD5Option.Unknown) { return; } // Get MultipleOption Type Console.WriteLine("\n\nHow to handle multiple tags/characters/series in the same image:\n c(opies, copy file in multiple folders) / m(ixed, mixed foldernames) / f(irst, first tag) / s(kip) / q(uit)"); string key4 = Console.ReadKey().KeyChar.ToString().ToUpper(); if (key4 == "C") { CurrentMultipleOption = MultipleOption.Copies; } if (key4 == "M") { CurrentMultipleOption = MultipleOption.MixedFolder; } if (key4 == "F") { CurrentMultipleOption = MultipleOption.First; } if (key4 == "S") { CurrentMultipleOption = MultipleOption.Skip; } if (key4 == "Q" || CurrentMultipleOption == MultipleOption.Unknown) { return; } // Get ReverseImageSearch Type Console.WriteLine("\n\nReverse Image Search images not found through hashing (this is slow and needs extra steps, details in github):\n y(es) / n(o) / q(uit)"); string key5 = Console.ReadKey().KeyChar.ToString().ToUpper(); if (key5 == "Y") { CurrentReverseImageSearch = ReverseImageSearch.Yes; } if (key5 == "N") { CurrentReverseImageSearch = ReverseImageSearch.No; } if (key5 == "Q" || CurrentReverseImageSearch == ReverseImageSearch.Unknown) { return; } if (CurrentReverseImageSearch == ReverseImageSearch.Yes) { if (File.Exists("sauceNaoApiKey.txt")) { sauceNaoApiKey = File.ReadAllText("sauceNaoApiKey.txt"); } else { Console.WriteLine("\n sauceNaoApiKey.txt missing. To fix this problem look into github. Press any key to quit."); Console.ReadKey(); return; } } log.WriteLine("Selected Options:" + key + key2 + key3 + key4 + key5); /* * // Get Sort Type * Console.WriteLine("\n\nSauceNao, or rather its subset Pixiv API for automatic tag retrieval on images deemed NSFW, require age verification,\nplease enter your date of birth in japanese format (yyyy-mm-dd):"); * string birthday = Console.ReadLine(); * * try * { * DateTime birthdayDT = DateTime.ParseExact(birthday, "yyyy-MM-dd", DateTimeFormatInfo.InvariantInfo); * if (birthdayDT < new DateTime(1918, 1, 1) || birthdayDT > DateTime.Now) * { * Console.WriteLine(birthday + " is not a valid birthday for a living person (out of bounds), press any key to quit."); * Console.ReadKey(); * return; * } * } * catch(Exception e) * { * Console.WriteLine(birthday + " is not a valid birthday, press any key to quit."); * Console.ReadKey(); * return; * } * log.WriteLine(birthday); */ #endregion log.Flush(); // List all files in the current folder List <string> files = Directory.EnumerateFiles(baseDirectory, "*.*", SearchOption.TopDirectoryOnly) .Where(x => x.EndsWith(".jpg", StringComparison.OrdinalIgnoreCase) || x.EndsWith(".png", StringComparison.OrdinalIgnoreCase) || x.EndsWith(".gif", StringComparison.OrdinalIgnoreCase)).ToList(); Console.WriteLine("\n Found " + files.Count + " images."); //Work all files in the folder foreach (var file in files) { //Extract filename etc int filestart = file.LastIndexOf('\\') + 1; string filename = file.Substring(filestart, file.LastIndexOf('.') - filestart); string filenameLong = file.Substring(filestart); Console.WriteLine("\nWorking file: " + filename); //Calculate the MD5 Hash for each file string md5 = GetMD5(file, filename); try { //Log Console.WriteLine("Trying Danbooru for file: " + filename + " with hash: " + md5); //Try get JSON Data off file, from hash var danbooruResult = (new Booru()).GetFromMD5(md5); //If booru search didn't find anything, try reverse search if ((danbooruResult.jArray == null || danbooruResult.jArray.Count == 0)) { Console.WriteLine("Couldn't find Hash on Danbooru."); if (CurrentReverseImageSearch == ReverseImageSearch.Yes) { #region rateLimits //Adhere to all ratelimits if (remainingSauces < 2) { Console.WriteLine("\nToo many Reverse Lookups, approaching SauceNao 20 requests per 30s limit. Waiting 30s."); Thread.Sleep(30000); } if (remainingSaucesLong < 2) { Console.WriteLine("\nToo many Reverse Lookups, approaching SauceNao 300 requests per 24hrs limit. Press any key to quit, monitor your usage at https://saucenao.com/user.php?page=search-usage and start again."); Console.ReadKey(); return; } #endregion Console.WriteLine("Reverse Image Searching..."); //Search by file FileStream stream = new FileStream(file, FileMode.Open); SauceNaoResult response = new SauceNao(sauceNaoApiKey).Request(stream); //adjust limits remainingSauces = (int)response.header["short_remaining"]; remainingSaucesLong = (int)response.header["long_remaining"]; //Work results var results = response.results; //Remove all low similarity results foreach (var element in results.ToArray().Where(x => (float)x.Key["similarity"] < 90.0)) { results.Remove(element.Key); } //Get danbooru id, if any high similarity result has one, then get danbooru post from it if (results.Any(x => x.Value["danbooru_id"] != null)) { var result = results.First(x => x.Value["danbooru_id"] != null); Console.WriteLine("Danbooru Result found with similarity of " + result.Key["similarity"].ToString() + "%."); string danbooruId = result.Value["danbooru_id"].ToString(); //Get JSON Data on file danbooruResult = (new Booru()).GetFromID(danbooruId); } else { Console.WriteLine("No Danbooru result found with similarity >90%."); } } } //Work JSON Data if (danbooruResult.jArray != null && danbooruResult.jArray.Count > 0) { //Log Console.WriteLine("Found file on Danbooru: " + filename); //Create bImage object var bImage = new BImage(danbooruResult.jArray[0]); //CopyMove file if ((bImage.charCount >= 1 && CurrentSortBy == Sortby.Character) || (bImage.copyRightCount >= 1 && CurrentSortBy == Sortby.Series)) { CopyMoveFile(file, filenameLong, bImage); } } else { Console.WriteLine("File could not be identified."); } } catch (Exception e) { Console.WriteLine(e); Console.WriteLine(e.Message); } } log.WriteLine("\nAll Operations finished. Press any key to exit."); log.Flush(); Console.WriteLine("\nAll Operations finished. Press any key to exit."); Console.ReadKey(); }