Опять какая-то странная ситуация. Не могу понять, в чём проблема.
Есть массив UserControl
ов, в каждом из которых есть экземпляр класса TwitchStreamInfo
и кнопка. При нажатии на кнопку, в классе главной формы выполняется обработчик, который создаёт поток. В поток надо передать экземпляр TwitchStreamInfo
, чтобы потом использовать его в обработчике события завершения потока.
public static int GetStreamPlaylistUrl(TwitchStreamInfo aStream, out string playlistUrl)
{
playlistUrl = string.Empty;
int res = 404;
if (!string.IsNullOrEmpty(aStream.imageAnimatedPreviewUrl))
{
int n = aStream.imageAnimatedPreviewUrl.IndexOf(".net/");
if (n > 0)
{
string server = aStream.imageAnimatedPreviewUrl.Substring(0, n + 4);
playlistUrl = $"{server}/{aStream.streamId}/chunked/index-dvr.m3u8";
res = FileDownloader.GetContentLength(playlistUrl, out _);
}
}
return res;
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using static TwitchPrimeDownloader.Utils;
namespace TwitchPrimeDownloader
{
public class ThreadGetVodPlaylist
{
public string playlistUrl;
public string playlistString;
public int errorCode;
public TwitchStreamInfo _streamInfo;
public List<string> resPlaylist;
public List<object> controls = new List<object>();
public event Action<object, int> Completed;
public void Work(object aContext)
{
errorCode = GetStreamPlaylistUrl(_streamInfo, out playlistUrl);
if (errorCode == 200)
{
errorCode = DownloadString(playlistUrl, out playlistString);
if (errorCode == 200)
{
resPlaylist = playlistString.Split(new string[] { "\n" },
StringSplitOptions.RemoveEmptyEntries).Where(s => s.EndsWith(".ts")).ToList();
}
}
(aContext as SynchronizationContext).Send(OnComplete_Context, this);
}
private void OnComplete_Context(object obj)
{
Completed?.Invoke(obj, errorCode);
}
}
}
private void ThreadGetVodPlaylist_Complete(object sender, int errorCode)
{
if (errorCode == 200)
{
ThreadGetVodPlaylist thrObj = sender as ThreadGetVodPlaylist;
FrameDownload frd = new FrameDownload(null);
frd.Parent = panelDownloads;
frd.Location = new Point(0, 0);
framesDownload.Add(frd);
tabPageDownload.Text = "Скачивание (" + framesDownload.Count.ToString() + ")";
StackFramesDownload();
foreach (object ctl in thrObj.controls)
{
if (ctl is ToolStripMenuItem)
(ctl as ToolStripMenuItem).Enabled = true;
else
(ctl as Control).Enabled = true;
}
}
else
MessageBox.Show($"Error {errorCode}");
}
private void Event_DownloadButtonClick(object sender)
{
FrameStream frameStream = sender as FrameStream;
frameStream.btnDownload.Enabled = false;
ThreadGetVodPlaylist threadGetVodPlaylist = new ThreadGetVodPlaylist();
threadGetVodPlaylist._streamInfo = frameStream.streamInfo;
threadGetVodPlaylist.controls.Add(frameStream.btnDownload);
threadGetVodPlaylist.Completed += ThreadGetVodPlaylist_Complete;
Thread thr = new Thread(threadGetVodPlaylist.Work);
thr.Start(fContext);
}
}
Это срабатывает один-два раза, а потом начинает задумываться на проверке url
а и выдаёт ошибку 403
.
ничё не пойму, почему так
Раньше работало нормально, а после допиливания стало так. Старая версия кода не сохранилась.
вспомнилась картинка