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


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

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", "avif", "bmp", "tiff", "gif", "ico" },
            ["Audio"] = new List<string> { "mp3", "wav", "flac", "aac", "ogg" },
            ["Video"] = new List<string> { "mp4", "mkv", "mov", "avi", "webm" }
        };

        public Form1()
        {
            InitializeComponent();
            // Заполняем список форматов при старте (по умолчанию картинки)
            cmbTargetFormat.Items.AddRange(_categories["Image"].ToArray());
            cmbTargetFormat.SelectedIndex = 0;
        }

        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());
                    
                    // Умное определение формата: смотрим на первый файл и подгружаем нужные форматы
                    UpdateFormatList(Path.GetExtension(_selectedFiles[0]).ToLower().Replace(".", ""));
                }
            }
        }

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

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

            // ШАГ 1: Как в браузере — сначала спрашиваем, куда сохранить результат
            string savePath = "";
            using (FolderBrowserDialog fbd = new FolderBrowserDialog { Description = "Выберите папку для сохранения готовых файлов" })
            {
                if (fbd.ShowDialog() == DialogResult.OK)
                {
                    savePath = fbd.SelectedPath;
                }
                else return; // Пользователь передумал
            }

            // ШАГ 2: Процесс конвертации
            btnStart.Enabled = false;
            string targetExt = "." + cmbTargetFormat.SelectedItem.ToString();
            progressBar.Maximum = _selectedFiles.Length;
            progressBar.Value = 0;

            foreach (var file in _selectedFiles)
            {
                try
                {
                    string outName = Path.GetFileNameWithoutExtension(file) + "_converted" + targetExt;
                    string finalPath = Path.Combine(savePath, outName);
                    string ext = Path.GetExtension(file).ToLower().Replace(".", "");

                    lblStatus.Text = $"Обработка: {Path.GetFileName(file)}...";

                    if (_categories["Image"].Contains(ext))
                    {
                        await Task.Run(() => {
                            using (var img = new MagickImage(file)) img.Write(finalPath);
                        });
                    }
                    else
                    {
                        await FFMpegArguments.FromFileInput(file).OutputToFile(finalPath).ProcessAsynchronously();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"Ошибка в файле {Path.GetFileName(file)}: {ex.Message}");
                }
                progressBar.Value++;
            }

            lblStatus.Text = "Готово! Все файлы в выбранной папке.";
            btnStart.Enabled = true;
            MessageBox.Show("Конвертация завершена!");
        }
    }
}