Files
ytdlp-gui/Download.cs
2025-05-23 01:34:48 +02:00

154 lines
5.2 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Runtime.Remoting.Contexts;
using System.Security.AccessControl;
using System.Security.Policy;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ytdlp_gui
{
public partial class Download : Form
{
public Download(YTdlpProcess process, string workdir, string convert_to)
{
this.process = process;
this.workdir = workdir;
this.convert_to = convert_to;
InitializeComponent();
}
private async void Download_Load(object sender, EventArgs e)
{
process.Start += (_sender, start_event) =>
{
lblDownload.Text = String.Format(
"Connecting to %s...",
start_event.provider
);
};
process.Error += (_sender, error_event) =>
{
MessageBox.Show(this, error_event.error, "yt-dlp error", MessageBoxButtons.OK, MessageBoxIcon.Error );
this.Close();
};
process.Progress += (_sender, prog_event) =>
{
int progress = (int)(prog_event.progress * 100 + 0.5);
this.Text = String.Format(
"Downloading {0}/{1} {2}% - {3}",
prog_event.playlist_current,
prog_event.playlist_total,
progress,
prog_event.file
);
lblDownload.Text = this.Text;
pbDownload.Value = progress;
};
process.Finished += (_sender, finish_event) =>
{
Regex regex = new Regex(@"^(.+)\s\[[\w-]+\](\.[\w.]+)$");
Match match = regex.Match(finish_event.file);
if (!match.Success)
{
MessageBox.Show(this, "Could not find the file we just downloaded...", "Uhhh...");
this.Close();
}
string newFile = match.Groups[1].Value + match.Groups[2].Value;
string filePath = Path.Combine(workdir, finish_event.file);
string newFilePath = Path.Combine(workdir, newFile);
if (File.Exists(newFilePath))
System.IO.File.Delete(newFilePath);
if (convert_to == null || Path.GetExtension(filePath) == convert_to)
{
System.IO.File.Move(filePath, newFilePath);
System.IO.File.SetLastWriteTime(newFilePath, DateTime.Now);
}
else
{
newFile = Path.ChangeExtension(newFile, convert_to);
newFilePath = Path.ChangeExtension(newFilePath, convert_to);
FFmpegProcess convertion = (new FFmpeg()).Convert(filePath, newFilePath);
convertion.Progress += (_ffmpeg, prog_event) =>
{
int progress = (int)(prog_event.progress * 100 + 0.5);
// this.Text = "Converting - " + progress.ToString() + "%";
lblConvertion.Text = String.Format(
"Converting {0}/{1} {2}% - {3}",
convertion_current,
convertion_total,
progress,
newFile
);
pbConvertion.Value = progress;
};
convertion.Finished += (_ffmpeg, _ffmpeg_e) =>
{
System.IO.File.Delete(filePath);
triggerConvertionQueue();
};
convertion_queue.Enqueue(convertion);
convertion_total += 1;
triggerConvertionQueue();
}
};
// Can run in background :)
_ = await process.Run();
}
private void btnCancel_Click(object sender, EventArgs e)
{
this.Close();
}
private void Download_FormClosing(object sender, FormClosingEventArgs e)
{
process.Cancel();
foreach (FFmpegProcess conversion in convertion_queue)
conversion.Cancel();
}
protected async void triggerConvertionQueue()
{
if (converting)
return;
if (convertion_queue.Count() == 0)
return;
converting = true;
convertion_current += 1;
await convertion_queue.Dequeue().Run();
converting = false;
}
protected readonly YTdlpProcess process;
protected int convertion_current = 0;
protected int convertion_total = 0;
protected Queue<FFmpegProcess> convertion_queue = new Queue<FFmpegProcess>();
private bool converting = false;
protected readonly string workdir;
protected readonly string convert_to;
}
}