Beispiel #1
0
        /// <summary>Extracts all .hg3 files that meet the pattern into .png's.</summary>
        public static ImageIdentifier ExtractHg3s(string inputDir, string outputDir,
                                                  Hg3Sorting sorting, string pattern,
                                                  Hgx2pngCallback progressCallback, Hgx2pngErrorCallback errorCallback,
                                                  string continueFile = null, string[] remainingFiles = null)
        {
            ImageIdentifier identifier  = new ImageIdentifier();
            DateTime        startTime   = DateTime.UtcNow;
            string          unsortedDir = outputDir;

            if (sorting.HasFlag(Hg3Sorting.Both))
            {
                unsortedDir = Path.Combine(unsortedDir, "Unsorted");
            }
            Directory.CreateDirectory(unsortedDir);

            if (string.IsNullOrWhiteSpace(pattern))
            {
                pattern = "*.hg3";
            }
            else if (!pattern.EndsWith(".hg3", StringComparison.OrdinalIgnoreCase) &&
                     !pattern.EndsWith(".hg3*", StringComparison.OrdinalIgnoreCase))
            {
                pattern += ".hg3";
            }
            string[]    files     = Directory.GetFiles(inputDir, pattern);
            int         fileCount = files.Length;
            Hgx2pngArgs args      = new Hgx2pngArgs()
            {
                FileCount = fileCount,
            };

            // Skip files if we're continuing from a later point
            int start = 0;

            if (continueFile != null)
            {
                for (start = 0; start < fileCount; start++)
                {
                    if (string.Compare(files[start], continueFile, true) >= 0)
                    {
                        break;
                    }
                }
            }

            // Remove non-remaining files.
            // This will be used for retrying files that had errors.
            if (remainingFiles != null)
            {
                List <string> fileList    = new List <string>(files);
                int           remainIndex = 0;
                int           remainCount = remainingFiles.Length;
                for (int i = 0; i < fileList.Count && remainIndex < remainCount &&
                     (continueFile == null || i < start); i++)
                {
                    if (PathHelper.IsPathTheSame(
                            remainingFiles[remainIndex], fileList[i]))
                    {
                        fileList.RemoveAt(i);
                        if (continueFile != null)
                        {
                            start--;
                        }
                        i--;
                        remainIndex++;
                    }
                }
                files = fileList.ToArray();
            }

            DateTime  lastRefresh = DateTime.MinValue;
            Stopwatch writeTime   = new Stopwatch();
            TimeSpan  refreshTime = TimeSpan.FromMilliseconds(20);

            //Stopwatch processTime = new Stopwatch();
            for (int i = start; i < fileCount; i++)
            {
                string file = files[i];
                string name = Path.GetFileNameWithoutExtension(file);

                args.FileIndex = i;
                args.FileName  = name;
                args.FilePath  = file;
                args.Ellapsed  = DateTime.UtcNow - startTime;
                // Round to nearest hundredth
                args.Percent = Math.Round((double)i / fileCount * 10000) / 100;
                // If true, cancel operation
                TimeSpan sinceRefresh = DateTime.UtcNow - lastRefresh;
                if (sinceRefresh >= refreshTime)
                {
                    lastRefresh = DateTime.UtcNow;
                    writeTime.Start();
                    if (progressCallback?.Invoke(args) ?? false)
                    {
                        return(identifier);
                    }
                    writeTime.Stop();
                }

                //processTime.Restart();
                List <Exception> exceptions = new List <Exception>();
                string[]         bmps;
                try {
                    //bmps = Hg3Convert.UnpackHg3(file, null, true);
                    ImageIdentification image = identifier.PreIdentifyImage(file);
                    bmps  = Extracting.Hg3ToBmp(file, image.ExpandImage);
                    image = identifier.IdentifyImage(bmps);
                    string sortedDir = Path.Combine(outputDir, image.OutputDirectory);
                    if (sorting.HasFlag(Hg3Sorting.Sorted))
                    {
                        Directory.CreateDirectory(sortedDir);
                    }
                    for (int j = 0; j < bmps.Length; j++)
                    {
                        try {
                            BmpToPng(bmps[j], sorting, unsortedDir, sortedDir);
                        }
                        catch (ExtractHg3Exception ex) {
                            exceptions.Add(ex);
                        }
                    }
                    //processTime.Stop();
                    //if (processTime.ElapsedMilliseconds >= 500)
                    //	Trace.WriteLine($"Large File: {new FileInfo(file).Length / 1024:###,###,###,###}KB [{processTime.ElapsedMilliseconds}ms]");
                }
                catch (ExtractHg3Exception ex) {
                    exceptions.Add(ex);
                }

                foreach (Exception ex in exceptions)
                {
                    args.TotalErrors++;
                    // If true, cancel operation
                    if (errorCallback?.Invoke(ex, args) ?? false)
                    {
                        return(identifier);
                    }
                }
            }
            args.Ellapsed = DateTime.UtcNow - startTime;
            args.Percent  = 100.0;
            progressCallback?.Invoke(args);
            Trace.WriteLine($"Console Write Time: {writeTime.Elapsed:mm\\:ss\\.fff}");
            return(identifier);
        }
Beispiel #2
0
        public static void ResortPngs(string resortDir,
                                      Hgx2pngCallback progressCallback, Hgx2pngErrorCallback errorCallback)
        {
            DateTime startTime = DateTime.UtcNow;

            ImageIdentifier identifier = new ImageIdentifier();
            Hgx2pngArgs     args       = new Hgx2pngArgs();

            string message = "Locating Pngs...";

            Console.WriteLine(message);
            args.FileCount = PathHelper.EnumerateAllFiles(resortDir, "*.png").Count();
            Console.WriteLine($"\r{new string(' ', message.Length)}");

            DateTime  lastRefresh = DateTime.MinValue;
            Stopwatch writeTime   = new Stopwatch();
            TimeSpan  refreshTime = TimeSpan.FromMilliseconds(20);
            int       i           = 0;

            foreach (string file in PathHelper.EnumerateAllFiles(resortDir, "*.png"))
            {
                //string file = files[i];
                ImageIdentification image = identifier.PreIdentifyImage(file);
                string path = Path.Combine(resortDir, image.OutputDirectory, Path.GetFileName(file));
                string name = Path.GetFileName(file);

                args.FileIndex = i++;
                args.FileName  = name;
                args.FilePath  = file;
                args.Ellapsed  = DateTime.UtcNow - startTime;
                // Round to nearest hundredth
                args.Percent = Math.Round((double)i / args.FileCount * 10000) / 100;
                // If true, cancel operation
                TimeSpan sinceRefresh = DateTime.UtcNow - lastRefresh;
                if (sinceRefresh >= refreshTime)
                {
                    lastRefresh = DateTime.UtcNow;
                    writeTime.Start();
                    if (progressCallback?.Invoke(args) ?? false)
                    {
                        return;
                    }
                    writeTime.Stop();
                }

                if (PathHelper.IsPathTheSame(path, file))
                {
                    continue;
                }

                string sortedDir = Path.Combine(resortDir, image.OutputDirectory);
                Directory.CreateDirectory(sortedDir);
                try {
                    BmpToPng(file, Hg3Sorting.Sorted, "", sortedDir);
                }
                catch (ExtractHg3Exception ex) {
                    args.TotalErrors++;
                    // If true, cancel operation
                    if (errorCallback?.Invoke(ex, args) ?? false)
                    {
                        return;
                    }
                }
            }
            args.Ellapsed = DateTime.UtcNow - startTime;
            args.Percent  = 100.0;
            progressCallback?.Invoke(args);
            Trace.WriteLine($"Console Write Time: {writeTime.Elapsed:mm\\:ss\\.fff}");
            PathHelper.DeleteAllEmptyDirectories(resortDir);
        }
        private static void ReadLibraryFolders(List <string> steamPaths, string text)
        {
            int    level     = 0;
            string path      = "";
            string lastToken = "";
            bool   isName    = false;
            bool   isValue   = false;
            bool   building  = false;
            string token     = "";
            bool   escape    = false;

            for (int i = 0; i < text.Length; i++)
            {
                char c = text[i];
                if (!building)
                {
                    if (char.IsWhiteSpace(c))
                    {
                        continue;
                    }
                    else if (c == '{')
                    {
                        if (isName)                           // Was the last token a name?
                        {
                            level++;
                            path   += $"/{lastToken}";
                            isName  = false;
                            isValue = false;
                        }
                        else
                        {
                            // Error
                            return;
                        }
                    }
                    else if (c == '}')
                    {
                        if (level > 0 && !isName)                           // Are we high enough and not defining something?
                        {
                            level--;
                            path    = path.Substring(0, path.LastIndexOf('/'));
                            isName  = false;
                            isValue = false;
                        }
                        else
                        {
                            // Error
                            return;
                        }
                    }
                    else if (c == '"')
                    {
                        if (isName)
                        {
                            isName  = false;
                            isValue = true;
                        }
                        else
                        {
                            isValue = false;
                            isName  = true;
                        }
                        building = true;
                    }
                    else
                    {
                        // Error: Unknown character
                        return;
                    }
                }
                else if (escape)
                {
                    token += c;
                    escape = false;
                }
                else if (c == '\\')
                {
                    escape = true;
                }
                else if (c == '"')
                {
                    if (isValue && path == "/LibraryFolders" &&
                        int.TryParse(lastToken, out _) &&
                        PathHelper.IsValidDirectory(token))
                    {
                        steamPaths.Add(Path.Combine(token, SteamApps));
                    }
                    lastToken = token;
                    token     = "";
                    building  = false;
                }
                else
                {
                    token += c;
                }
            }
            if (building || isName || level != 0)
            {
                // Error: Nothing we can do now
            }
        }