Files
Beam/Beam.Playwright/PlaywrightUnitDownloader.cs
qwsdcvghyu89 f52aa6123b Refactor downloaders to use ByteDocument and add options builders
Replaces generic RawType with ByteDocument in downloaders and context classes, simplifying type usage. Adds builder classes for FailurePredicateOptions, FragmentOptions, SkipPredicateOptions, and UnitDownloaderOptions to improve configuration flexibility. Introduces DownloadTarget enum and SkipPredicate delegate for more granular download control. Refactors Fluent API interfaces and implementations to remove RawType generics and streamline usage. Adds Playwright and Stealth download strategies for extensibility.
2025-11-15 22:51:46 +11:00

37 lines
1.5 KiB
C#

using Beam.Abstractions;
using Beam.Downloaders;
using Beam.Models;
using Beam.Playwright.Strategies;
using Microsoft.Playwright;
namespace Beam.Playwright {
public class PlaywrightUnitDownloader<OutType> : UnitDownloader<OutType> {
public PlaywrightUnitDownloader(UnitDownloaderOptions<OutType> options,
PlaywrightAsyncManipulator puppetManipulator) : base(options) {
PuppetManipulator = puppetManipulator;
_downloadStrategy = options.Target switch {
DownloadTarget.URL or DownloadTarget.InURL => new PageDownloadStrategy(),
DownloadTarget.Complex => new WaitingDownloadStrategy(),
_ => throw new NotSupportedException() // TODO add an exception message
};
}
public PlaywrightAsyncManipulator PuppetManipulator { get; }
private IDownloadStrategy _downloadStrategy { get; }
protected override async Task DownloadToStream(string url, int bufferSize, Stream destinationStream, IProgress<IDownloadReport> progress, CancellationToken ct) {
var page = await PlaywrightContext.Browser.Value.NewPageAsync();
try {
await page.GotoAsync(url);
await PuppetManipulator(page);
await _downloadStrategy.DownloadToStream(url, bufferSize, destinationStream, progress, page, ct);
} finally {
if (!page.IsClosed)
await page.CloseAsync();
}
}
}
}