public PhotoSearchOptions CreatePhotoSearchOption(
            string i_name          = "",
            List <string> i_tags   = null,
            int i_max_result_count = 500)
        {
            SearchTerm options = new SearchTerm();

            options.SearchName = i_name;
            options.Tags       = i_tags;

            return(CreatePhotoSearchOption(options, i_max_result_count));
        }
        /// <summary>
        /// Create search option for Flickr database
        /// </summary>
        /// <param name="i_name">Photo name</param>
        /// <param name="i_tags">Photo Tags</param>
        /// <param name="i_max_result_count">Number of top results returned</param>
        /// <returns>Search results</returns>
        public PhotoSearchOptions CreatePhotoSearchOption(
            SearchTerm i_search_term,
            int i_max_result_count = 500)
        {
            PhotoSearchOptions options = new PhotoSearchOptions();

            options.Extras    = PhotoSearchExtras.All;
            options.SortOrder = PhotoSearchSortOrder.Relevance;
            options.Tags      = string.Join(",", i_search_term.Tags);
            options.Text      = i_search_term.SearchName;
            options.TagMode   = TagMode.AllTags;
            options.PerPage   = i_max_result_count;

            return(options);
        }
        /// <summary>
        /// Load search tags and ids from the database CSV file with whitespace delimeter
        /// </summary>
        /// <param name="i_xml_path"></param>
        /// <returns></returns>
        public static Dictionary <string, List <SearchTerm> > LoadDatabaseSearchTagsFromXML(
            string i_xml_filepath = DatabaseDefines.DefaultTagXMLFilePath)
        {
            var ret = new Dictionary <string, List <SearchTerm> >();

            XmlTextReader reader = new XmlTextReader(i_xml_filepath);

            // optimise parsing
            string     current = String.Empty;
            SearchTerm item    = new SearchTerm();

            while (reader.Read())
            {
                if (AcceptedTagGroupNames.Contains(reader.Name))
                {
                    current = Convert.ToString(reader.GetAttribute("Value"));

                    if (!ret.ContainsKey(current))
                    {
                        throw new XmlException(
                                  "XML file " + i_xml_filepath + " is in an invalid format");
                    }
                }
                else if (reader.Name == "Item")
                {
                    if (current == String.Empty)
                    {
                        throw new XmlException(
                                  "XML file " + i_xml_filepath + " is in an invalid format");
                    }

                    item.Tags = new List <string> {
                        reader.GetAttribute("Tag")
                    };
                    item.SearchName = reader.GetAttribute("Name");
                    ret[current].Add(item);
                }
            }

            return(ret);
        }
        /// <summary>
        /// Save the photos returned from a result to disk
        /// </summary>
        /// <param name="i_collection">Results of a Flickr API Photo Search</param>
        /// /// <param name="i_rootpath">Output root path on disk</param>
        /// <param name="i_min_size">Minimum size of the expected file</param>
        /// <returns>Number of successfully retrieved photos</returns>
        override public int SearchAndDownloadImages(
            SearchTerm i_search_term,
            string i_rootpath  = DatabaseDefines.DefaultDatabaseFlickrPath,
            int i_min_filesize = DatabaseDefines.PhotoNotAvailableSize)
        {
            SearchOptions = CreatePhotoSearchOption(i_search_term);

            if (SearchOptions == null)
            {
                return(0);
            }

            var results = ApplyPhotoSearch(SearchOptions).Where(o => o.DoesLargeExist);

            // Create database directory
            string database_path = Path.Combine(i_rootpath, i_search_term.SearchName);

            FileSystemHelpers.MakeDirectory(database_path);

            // Download image
            int invalid_count = 0;
            var client        = new MyWebClient();

            foreach (var result in results)
            {
                string filename = Path.Combine(
                    database_path,
                    i_search_term.SearchName + "_" + result.PhotoId + TargetFileExtension);

                if (!client.DownloadFile(result.LargeUrl, filename))
                {
                    ++invalid_count;
                }
            }

            return(results.Count() - invalid_count);
        }
        /// <summary>
        /// Save the photos returned from a result to disk
        /// </summary>
        /// <param name="i_collection">Results of a Flickr API Photo Search</param>
        /// /// <param name="i_rootpath">Output root path on disk</param>
        /// <param name="i_min_size">Minimum size of the expected file</param>
        /// <returns>Number of successfully retrieved photos</returns>
        override public int SearchAndDownloadImages(
            SearchTerm i_search_term,
            string i_rootpath  = DatabaseDefines.DefaultDatabaseImageNetPath,
            int i_min_filesize = DatabaseDefines.PhotoNotAvailableSize)
        {
            var synetID      = FindSynetIDFromSearchTerm(i_search_term.SearchName);
            var tagImageURLs = ExtractSynetURLs(synetID);

            if (tagImageURLs == null)
            {
                return(0);
            }

            // Create database directory
            string database_path = Path.Combine(i_rootpath, i_search_term.SearchName);

            FileSystemHelpers.MakeDirectory(database_path);

            // Download image
            int invalid_count = 0;
            var client        = new MyWebClient();

            foreach (var url in tagImageURLs)
            {
                string filename = Path.Combine(
                    database_path,
                    Path.GetFileName(url));

                if (!client.DownloadFile(url, filename))
                {
                    ++invalid_count;
                }
            }

            return(tagImageURLs.Count() - invalid_count);
        }
 /// <summary>
 /// Save the photos returned from a result to disk
 /// </summary>
 /// <param name="i_results">Results of a Flickr API Photo Search</param>
 /// /// <param name="i_rootpath">Output root path on disk</param>
 /// <param name="i_min_size">Minimum size of the expected file</param>
 /// <returns>Number of successfully retrieved photos</returns>
 abstract public int SearchAndDownloadImages(
     SearchTerm i_search_term,
     string i_rootpath,
     int i_min_filesize = DatabaseDefines.PhotoNotAvailableSize);