Коротко — это не «особый формат», а обычная подписанная (time‑limited) ссылка на CDN‑ресурс. Параметры в query (expires, sig, id, appId и т.п.) — это подпись/временная метка и параметры доступа. Файл по такому URL может быть:
- прямым прогрессивным файлом (mp4, mkv и т.д.) — тогда сервер вернёт Content‑Type: video/… и сам бинарник;
- HLS-плейлист (m3u8) — тогда Content‑Type будет application/vnd.apple.mpegurl или в теле будет #EXTM3U; в этом случае нужно скачивать сегменты (.ts) или использовать ffmpeg для сборки.
Что гуглить (ключевые термины):
- signed URL, presigned URL, expiring URL, CDN signed URL;
- progressive download vs HLS (m3u8) vs DASH;
- HTTP GET download C# HttpClient, HttpClient ResponseHeadersRead, Range header (resume);
- Content‑Type, Content‑Disposition, redirects, Referer/Cookies.
Примеры проверок и скачивания в C# (потоково, без загрузки в память):
1) Быстрая проверка заголовков / формат (HEAD или GET с чтением заголовков):
```csharp
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Head, url);
var resp = await client.SendAsync(request);
Console.WriteLine(resp.StatusCode);
if (resp.Content.Headers.ContentType != null)
Console.WriteLine("Content-Type: " + resp.Content.Headers.ContentType.MediaType);
if (resp.Content.Headers.ContentDisposition != null)
Console.WriteLine("Content-Disposition: " + resp.Content.Headers.ContentDisposition);
```
Если сервер не поддерживает HEAD, используйте GET с HttpCompletionOption.ResponseHeadersRead и читайте только заголовки.
2) Скачивание в файл потоково:
```csharp
using var client = new HttpClient();
// при необходимости добавить заголовки
client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
client.DefaultRequestHeaders.Referrer = new Uri("https://max.example"); // если нужен Referer
// client.DefaultRequestHeaders.Add("Cookie", "sid=..."); // если нужны куки
using var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);
response.EnsureSuccessStatusCode();
using var httpStream = await response.Content.ReadAsStreamAsync();
using var fileStream = new FileStream("output.bin", FileMode.Create, FileAccess.Write, FileShare.None, 8192, useAsync: true);
await httpStream.CopyToAsync(fileStream);
```
После получения проверьте Content‑Type или расширение файла и переименуйте в .mp4 при необходимости.
3) Если это HLS (m3u8) — проще всего использовать ffmpeg:
ffmpeg -i "https://vd431.okcdn.ru/...?expires=..." -c copy output.mp4
Или в C# вызвать процесс ffmpeg и подставить URL.
Доп. примечания:
- Ссылка может быть временной — сохраняйте и скачивайте до истечения expires.
- Сервер может требовать Referer/куки/специфичный User‑Agent — смотрите реальные HTTP‑заголовки в запросе, который вам присылает приложение MAX.
- Если получаете 302/301 — HttpClient по умолчанию следует редиректам; при необходимости контролируйте HttpClientHandler.AllowAutoRedirect.
- Для дозагрузки/резюма используйте заголовок Range.
- Убедитесь, что скачивание не нарушает лицензионные/правовые ограничения.
Если хотите, пришлите точный URL (или response headers) — помогу определить, это mp4 или m3u8 и дам конкретный рабочий пример C#.