/// <summary>
        /// Create Filename based on format on job and image information.
        /// </summary>
        /// <param name="job"></param>
        /// <param name="image"></param>
        /// <param name="currPage"></param>
        /// <returns></returns>
        public static string makeFilename(JobDownloadViewModel job, NijieImage image, int currPage = 0, FilenameFormatType type = FilenameFormatType.Image)
        {
            try
            {
                string filenameFormat = null;
                switch (type)
                {
                case FilenameFormatType.Image:
                    filenameFormat = job.SaveFilenameFormat;
                    break;

                case FilenameFormatType.Manga:
                    filenameFormat = job.SaveMangaFilenameFormat;
                    break;

                case FilenameFormatType.Avatar:
                    filenameFormat = job.SaveAvatarFilenameFormat;
                    break;
                }
                if (string.IsNullOrWhiteSpace(filenameFormat))
                {
                    throw new NijieException("Empty filename format!", NijieException.INVALID_SAVE_FILENAME_FORMAT);
                }

                if (image.Member != null)
                {
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_MEMBER_ID, image.Member.MemberId.ToString());
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_MEMBER_NAME, image.Member.UserName);
                }
                else
                {
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_MEMBER_ID, "");
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_MEMBER_NAME, "");
                    Log.Warn("No Member Information");
                }

                if (job.JobType == JobType.Tags)
                {
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_SEARCH_TAGS, job.SearchTag);
                }
                else
                {
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_SEARCH_TAGS, "");
                }

                if (type != FilenameFormatType.Avatar)
                {
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_IMAGE_ID, image.ImageId.ToString());
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_IMAGE_TITLE, image.Title);

                    if (image.IsManga)
                    {
                        filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_PAGE, "_p" + (currPage + 1).ToString());
                        filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_PAGE_ZERO, "_p" + currPage.ToString());
                        filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_MAX_PAGE, image.ImageUrls.Count.ToString());
                        filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_SERVER_FILENAME, Util.ExtractFilenameFromUrl(image.ImageUrls[currPage]));
                    }
                    else
                    {
                        filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_PAGE, "");
                        filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_PAGE_ZERO, "");
                        filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_MAX_PAGE, "");
                        filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_SERVER_FILENAME, Util.ExtractFilenameFromUrl(image.BigImageUrl));
                    }

                    if (image.Tags != null || image.Tags.Count > 0)
                    {
                        filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_TAGS, String.Join(" ", image.Tags));
                    }
                    else
                    {
                        filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_TAGS, "");
                    }
                }
                else
                {
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_IMAGE_ID, "");
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_IMAGE_TITLE, "");
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_PAGE, "");
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_PAGE_ZERO, "");
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_MAX_PAGE, "");
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_SERVER_FILENAME, Util.ExtractFilenameFromUrl(image.Member.AvatarUrl));
                }

                if (image.BookmarkedBy != null)
                {
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_BOOKMARKED_MEMBER_ID, image.BookmarkedBy.MemberId.ToString());
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_BOOKMARKED_MEMBER_NAME, image.BookmarkedBy.UserName);
                }
                else
                {
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_BOOKMARKED_MEMBER_ID, "");
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_BOOKMARKED_MEMBER_NAME, "");
                }

                // workdate
                if (FILENAME_FORMAT_WORKDATE.IsMatch(filenameFormat))
                {
                    var match   = FILENAME_FORMAT_WORKDATE.Match(filenameFormat);
                    var fmtDate = "yyyyMMdd";
                    if (!String.IsNullOrEmpty(match.Groups[1].Value))
                    {
                        fmtDate = match.Groups[1].Value;
                    }
                    var strDate = image.WorkDate.ToString(fmtDate);
                    filenameFormat = filenameFormat.Replace(match.Value, strDate);
                }

                return(filenameFormat);
            }
            catch (Exception ex)
            {
                Log.Error("filenameFormat=" + job.SaveFilenameFormat, ex);
                throw new NijieException("Failed when renaming", ex, NijieException.RENAME_ERROR);
            }
        }
        /// <summary>
        /// Create Filename based on format on job and image information.
        /// </summary>
        /// <param name="job"></param>
        /// <param name="image"></param>
        /// <param name="currPage"></param>
        /// <returns></returns>
        public static string makeFilename(JobDownloadViewModel job, NijieImage image, int currPage = 0, FilenameFormatType type = FilenameFormatType.Image)
        {
            try
            {
                string filenameFormat = null;
                switch (type)
                {
                    case FilenameFormatType.Image: filenameFormat = job.SaveFilenameFormat;
                        break;

                    case FilenameFormatType.Manga: filenameFormat = job.SaveMangaFilenameFormat;
                        break;

                    case FilenameFormatType.Avatar: filenameFormat = job.SaveAvatarFilenameFormat;
                        break;
                }
                if (string.IsNullOrWhiteSpace(filenameFormat))
                    throw new NijieException("Empty filename format!", NijieException.INVALID_SAVE_FILENAME_FORMAT);

                if (image.Member != null)
                {
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_MEMBER_ID, image.Member.MemberId.ToString());
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_MEMBER_NAME, image.Member.UserName);
                }
                else
                {
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_MEMBER_ID, "");
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_MEMBER_NAME, "");
                    Log.Warn("No Member Information");
                }

                if (job.JobType == JobType.Tags)
                {
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_SEARCH_TAGS, job.SearchTag);
                }
                else
                {
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_SEARCH_TAGS, "");
                }

                if (type != FilenameFormatType.Avatar)
                {
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_IMAGE_ID, image.ImageId.ToString());
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_IMAGE_TITLE, image.Title);

                    if (image.IsManga)
                    {
                        filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_PAGE, "_p" + (currPage + 1).ToString());
                        filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_PAGE_ZERO, "_p" + currPage.ToString());
                        filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_MAX_PAGE, " of " + image.ImageUrls.Count);
                        filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_SERVER_FILENAME, Util.ExtractFilenameFromUrl(image.ImageUrls[currPage]));
                    }
                    else
                    {
                        filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_PAGE, "");
                        filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_PAGE_ZERO, "");
                        filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_MAX_PAGE, "");
                        filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_SERVER_FILENAME, Util.ExtractFilenameFromUrl(image.BigImageUrl));
                    }

                    if (image.Tags != null || image.Tags.Count > 0)
                        filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_TAGS, String.Join(" ", image.Tags));
                    else
                        filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_TAGS, "");
                }
                else
                {
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_IMAGE_ID, "");
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_IMAGE_TITLE, "");
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_PAGE, "");
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_PAGE_ZERO, "");
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_MAX_PAGE, "");
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_SERVER_FILENAME, Util.ExtractFilenameFromUrl(image.Member.AvatarUrl));
                }

                if (image.BookmarkedBy != null)
                {
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_BOOKMARKED_MEMBER_ID, image.BookmarkedBy.MemberId.ToString());
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_BOOKMARKED_MEMBER_NAME, image.BookmarkedBy.UserName);
                }
                else
                {
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_BOOKMARKED_MEMBER_ID, "");
                    filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_BOOKMARKED_MEMBER_NAME, "");
                }
                return filenameFormat;
            }
            catch (Exception ex)
            {
                Log.Error("filenameFormat=" + job.SaveFilenameFormat, ex);
                throw new NijieException("Failed when renaming", ex, NijieException.RENAME_ERROR);
            }
        }