/// <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");
        }
예제 #2
0
 public DanbooruTagCollection LoadProviderTagCollection()
 {
     try
     {
         DanbooruTagsDao dao = new DanbooruTagsDao("tags-" + Name + ".xml");
         _hasPrivateTags = true;
         return dao.Tags;
     }
     catch (FileNotFoundException)
     {
         _hasPrivateTags = false;
         return DanbooruTagsDao.Instance.Tags;
     }
 }
예제 #3
0
        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";
        }
예제 #5
0
        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);
        }
예제 #6
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);
        }
예제 #7
0
        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;
            }
        }