/// <summary> /// Update the source xml with the tags from target xml /// The updated tags is saved to target xml /// </summary> /// <param name="source"></param> /// <param name="target"></param> /// <returns></returns> public static string Merge(string source, string target) { if (!File.Exists(source)) { return("Cannot find source"); } if (!File.Exists(target)) { return("Cannot find target"); } int added = 0; int updated = 0; var sourceInstance = new DanbooruTagsDao(source).Tags.Tag.ToList(); var targetInstance = new DanbooruTagsDao(target).Tags.Tag.ToList(); foreach (var targetItem in targetInstance) { var sourceIndex = sourceInstance.FindIndex(x => x.Name == targetItem.Name); if (sourceIndex > 0) { if (sourceInstance[sourceIndex].Type < targetItem.Type) { sourceInstance[sourceIndex].Type = targetItem.Type; ++updated; } } else { sourceInstance.Add(targetItem); ++added; } } Save(target, sourceInstance); return("Added: " + added + " tags, Updated: " + updated + " tags"); }
public DanbooruTagCollection LoadProviderTagCollection() { try { DanbooruTagsDao dao = new DanbooruTagsDao("tags-" + Name + ".xml"); _hasPrivateTags = true; return dao.Tags; } catch (FileNotFoundException) { _hasPrivateTags = false; return DanbooruTagsDao.Instance.Tags; } }
public void TestSankakuTagParser() { string target = @"../../../DanbooruDownloader3.test/TestXml/sankakutagspage.htm"; var data = File.ReadAllText(target); var parser = new SankakuComplexParser(); var result = parser.parseTagsPage(data, 1); Assert.IsNotNull(result); Assert.IsTrue(result.Tag.Length == 50, "Count: " + result.Tag.Length); List<DanbooruTag> newTagList = new List<DanbooruTag>(); target = @"../../../DanbooruDownloader3.test/TestXml/sankakutagspage-invalid.htm"; data = File.ReadAllText(target); parser = new SankakuComplexParser(); result = parser.parseTagsPage(data, 1); Assert.IsNotNull(result); Assert.IsTrue(result.Tag.Length == 50, "Count: " + result.Tag.Length); var filename = "dummy.xml"; DanbooruTagsDao.Save(filename, result.Tag.ToList()); DanbooruTagsDao dao = new DanbooruTagsDao(filename); }
/// <summary> /// Update the source xml with the tags from target xml /// The updated tags is saved to target xml /// </summary> /// <param name="source"></param> /// <param name="target"></param> /// <returns></returns> public static string Merge(string source, string target) { if (!File.Exists(source)) return "Cannot find source"; if (!File.Exists(target)) return "Cannot find target"; int added = 0; int updated = 0; var sourceInstance = new DanbooruTagsDao(source).Tags.Tag.ToList(); var targetInstance = new DanbooruTagsDao(target).Tags.Tag.ToList(); foreach (var targetItem in targetInstance) { var sourceIndex = sourceInstance.FindIndex(x => x.Name == targetItem.Name); if (sourceIndex > 0) { if (sourceInstance[sourceIndex].Type < targetItem.Type) { sourceInstance[sourceIndex].Type = targetItem.Type; ++updated; } } else { sourceInstance.Add(targetItem); ++added; } } Save(target, sourceInstance); return "Added: " + added + " tags, Updated: " + updated + " tags"; }
public void TestMergeTagsXml() { string source = @"../../../DanbooruDownloader3.test/TestXml/tags-source.xml"; string actualTarget = @"../../../DanbooruDownloader3.test/TestXml/tags-target.xml"; string target = "tags-target.xml"; File.Copy(actualTarget, target); var message = DanbooruTagsDao.Merge(source, target); var targetInstance = new DanbooruTagsDao(target); Assert.IsTrue(targetInstance.Tags.Tag.Length > 0); }
public void TestImportTagList() { string tempName = @"../../../DanbooruDownloader3.test/TestXml/tags.xml.197.!tmp"; var tempList = new DanbooruTagsDao(tempName).Tags; Assert.IsTrue(tempList.Tag == null); tempName = @"../../../DanbooruDownloader3.test/TestXml/tags.xml.1.!tmp"; tempList = new DanbooruTagsDao(tempName).Tags; Assert.IsTrue(tempList.Tag != null); Assert.IsTrue(tempList.Tag.Length == 1000); }
public void TestDanbooruTagsDao() { { var dao = new DanbooruTagsDao(sourceDanbooruTagsXml); Assert.IsTrue(dao.IsArtistTag("raistlinkid")); Assert.IsTrue(dao.IsCopyrightTag("i_feel_fine")); Assert.IsTrue(dao.IsCharacterTag("geordi_la_forge")); //Assert.IsTrue(dao.IsCircleTag("")); //Assert.IsTrue(dao.IsFaultsTag("")); Assert.IsTrue(dao.GetTagType("cracking_knuckles") == DanbooruTagType.General); Assert.IsTrue(dao.GetTagType("unknown_tags!!!@!@#!") == DanbooruTagType.General); } }
private List<DanbooruTag> CombineLoopTag(int lastPage) { // construct the tag list from each xml List<DanbooruTag> newTagList = new List<DanbooruTag>(); for (int i = 1; i < lastPage; ++i) { Program.Logger.Debug("[Download Tags] Merging Page: " + i); lblStatus.Text = "Status: Merging Page: " + i + ", this might take some times."; lblStatus.Invalidate(); lblStatus.Update(); lblStatus.Refresh(); Application.DoEvents(); string tempName = TAGS_FILENAME + "." + i + ".!tmp"; DanbooruTagCollection tempTag; if (isSankaku) { SankakuComplexParser parser = new SankakuComplexParser(); tempTag = parser.parseTagsPage(File.ReadAllText(tempName), i); } else { tempTag = new DanbooruTagsDao(tempName).Tags; } if (tempTag != null && tempTag.Tag != null) { newTagList.AddRange(tempTag.Tag); } } for (int i = 1; i < lastPage; ++i) { string tempName = TAGS_FILENAME + "." + i + ".!tmp"; File.Delete(tempName); } return newTagList; }
private void HandleLoop(string tempName) { DanbooruTagCollection tempTags = null; if (isSankaku) { string data = File.ReadAllText(tempName); if (!string.IsNullOrWhiteSpace(data)) { tempTags = new SankakuComplexParser().parseTagsPage(data, Page); } else { string message = "Got empty response!"; Program.Logger.Error(message); ++retry; if (retry > Int32.Parse(DanbooruDownloader3.Properties.Settings.Default.retry)) { WaitForDelay(message); ProcessLoop(--Page); } else { MessageBox.Show(message); } } } else { tempTags = new DanbooruTagsDao(tempName).Tags; } if (tempTags == null || tempTags.Tag == null || tempTags.Tag.Length == 0 || (prevTag != null && prevTag.Tag.Last().Name == tempTags.Tag.Last().Name)) { // no more tags chkUseLoop.Enabled = true; var newTagList = CombineLoopTag(Page); if (SelectedProvider != null) { string targetXml = "tags-" + SelectedProvider.Name + ".xml"; if (File.Exists(targetXml)) { if (chkBackup.Checked) { string backupName = targetXml + ".bak"; if (File.Exists(backupName)) File.Delete(backupName); File.Move(targetXml, backupName); } else { File.Delete(targetXml); } } DanbooruTagsDao.Save(targetXml, newTagList); SelectedProvider.LoadProviderTagCollection(); Program.Logger.Info(String.Format("[Download Tags] Private Tags.xml saved to {0}.", targetXml)); } if (chkMerge.Checked) { Program.Logger.Debug("[Download Tags] Merging Old Tags."); lblStatus.Text = "Status: Merging Old Tags, this might take some times."; lblStatus.Invalidate(); lblStatus.Update(); lblStatus.Refresh(); Application.DoEvents(); DanbooruTagsDao.Save(TAGS_FILENAME + ".merge", newTagList); var message = DanbooruTagsDao.Merge(TAGS_FILENAME + ".merge", TAGS_FILENAME); Program.Logger.Info("[Download Tags] " + message); MessageBox.Show(message, "Tags.xml merged."); File.Delete(TAGS_FILENAME + ".merge"); } else { // write back to TAGS_FILENAME DanbooruTagsDao.Save(TAGS_FILENAME, newTagList); } DanbooruTagsDao.Instance = new DanbooruTagsDao(TAGS_FILENAME); Program.Logger.Info("[Download Tags] Complete."); lblStatus.Text = "Status: Download complete."; if (chkAutoClose.Checked) { this.Close(); } } else { // continue next page ProcessLoop(Page); prevTag = tempTags; } }