Загрузка данных


using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using ImageMagick;
using FFMpegCore;
using Spire.Presentation;

namespace UniversalConverter
{
    public partial class Form1 : Form
    {
        private string[] _selectedFiles;
        
        // Категории из твоего идеального кода + добавлены Презентации
        private readonly Dictionary<string, List<string>> _categories = new Dictionary<string, List<string>>
        {
            ["Image"] = new List<string> { "jpg", "png", "webp", "bmp", "tiff" },
            ["Audio"] = new List<string> { "mp3", "wav", "aac", "ogg" },
            ["Video"] = new List<string> { "mp4", "mkv", "mov", "avi" },
            ["Pres"] = new List<string> { "Извлечь фото (PPTX)" }
        };

        public Form1()
        {
            InitializeComponent();
            SetupTools();
            // Стартовый набор форматов
            cmbTargetFormat.Items.AddRange(_categories["Image"].ToArray());
            cmbTargetFormat.SelectedIndex = 0;
        }

        private void SetupTools()
        {
            string baseDir = AppDomain.CurrentDomain.BaseDirectory;
            MagickNET.SetGhostscriptDirectory(baseDir);
            GlobalFFOptions.Configure(options => options.BinaryFolder = baseDir);
        }

        private void btnSelect_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog ofd = new OpenFileDialog { Multiselect = true })
            {
                if (ofd.ShowDialog() == DialogResult.OK)
                {
                    _selectedFiles = ofd.FileNames;
                    lstFiles.Items.Clear();
                    lstFiles.Items.AddRange(_selectedFiles.Select(Path.GetFileName).ToArray()!);
                    
                    // Умное определение: смотрим на первый файл
                    string firstExt = Path.GetExtension(_selectedFiles[0]).ToLower().Replace(".", "");
                    UpdateFormatList(firstExt);
                }
            }
        }

        private void UpdateFormatList(string ext)
        {
            cmbTargetFormat.Items.Clear();
            if (_categories["Image"].Contains(ext)) 
                cmbTargetFormat.Items.AddRange(_categories["Image"].ToArray());
            else if (ext == "pptx")
                cmbTargetFormat.Items.AddRange(_categories["Pres"].ToArray());
            else {
                cmbTargetFormat.Items.AddRange(_categories["Video"].ToArray());
                cmbTargetFormat.Items.AddRange(_categories["Audio"].ToArray());
            }
            if (cmbTargetFormat.Items.Count > 0) cmbTargetFormat.SelectedIndex = 0;
        }

        private void btnClear_Click(object sender, EventArgs e)
        {
            lstFiles.Items.Clear();
            _selectedFiles = null;
            lblStatus.Text = "Статус: Ожидание";
            progressBar.Value = 0;
        }

        private async void btnStart_Click(object sender, EventArgs e)
        {
            if (_selectedFiles == null || _selectedFiles.Length == 0) return;

            string savePath = "";
            using (FolderBrowserDialog fbd = new FolderBrowserDialog { Description = "Куда сохранить результат?" })
            {
                if (fbd.ShowDialog() == DialogResult.OK) savePath = fbd.SelectedPath;
                else return;
            }

            btnStart.Enabled = false;
            string selectedMode = cmbTargetFormat.SelectedItem.ToString()!;
            progressBar.Maximum = _selectedFiles.Length;
            progressBar.Value = 0;

            foreach (var file in _selectedFiles)
            {
                try
                {
                    string ext = Path.GetExtension(file).ToLower().Replace(".", "");
                    lblStatus.Text = $"Обработка: {Path.GetFileName(file)}...";

                    if (ext == "pptx" && selectedMode == "Извлечь фото (PPTX)")
                    {
                        await Task.Run(() => ExtractPhotosFromPptx(file, savePath));
                    }
                    else if (_categories["Image"].Contains(ext))
                    {
                        string outPath = Path.Combine(savePath, Path.GetFileNameWithoutExtension(file) + "_conv." + selectedMode.ToLower());
                        await Task.Run(() => {
                            using (var img = new MagickImage(file)) img.Write(outPath);
                        });
                    }
                    else
                    {
                        string outPath = Path.Combine(savePath, Path.GetFileNameWithoutExtension(file) + "_conv." + selectedMode.ToLower());
                        await FFMpegArguments.FromFileInput(file)
                            .OutputToFile(outPath, true, opt => opt.WithSpeedPreset(Speed.Fast))
                            .ProcessAsynchronously();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"Ошибка в {Path.GetFileName(file)}: {ex.Message}");
                }
                progressBar.Value++;
            }

            lblStatus.Text = "Готово!";
            btnStart.Enabled = true;
            MessageBox.Show("Конвертация завершена!");
        }

        private void ExtractPhotosFromPptx(string input, string outputDir)
        {
            Presentation ppt = new Presentation();
            ppt.LoadFromFile(input);
            string name = Path.GetFileNameWithoutExtension(input);
            for (int i = 0; i < ppt.Images.Count; i++)
            {
                File.WriteAllBytes(Path.Combine(outputDir, $"{name}_img_{i}.png"), ppt.Images[i].Data);
            }
        }
    }
}