056e426572
Updated project files for `Beam.Dynamic`, `Beam.Exports`, `Beam.Puppeteer`, `Beam.Temporary.Cli`, and `Beam` to include new XML headers, reorganize property groups, and add project references. Modified `PuppetedUnitDownloader` to support additional parameters for async transformers. Changed return types in `CommonTransformers` to `AsyncTransformer` for asynchronous processing. Significant refactoring in `DownloadBuilder`, `DownloadContext`, and `DownloadContextBuilder` to introduce generic parameters and improve context management. Updated `SequentialDownloader`, `SequentialFragmentDownloader`, and `UnitDownloader` to accommodate new async transformer types. Introduced `TypeExtensions` for unique type name generation and added `UnitFragmentDownloaderBinary` for handling binary downloads. Updated solution file to include the new `aeqw89.Beam` project, ensuring proper references across the solution. These changes enhance the asynchronous capabilities of the Beam library, improve type safety, and streamline the downloading process.
40 lines
1.5 KiB
C#
40 lines
1.5 KiB
C#
|
|
using HtmlAgilityPack;
|
|
using Microsoft.Playwright;
|
|
|
|
namespace Beam.Puppeteer {
|
|
public class PuppetContext(IPlaywright playwright, IBrowser browser) {
|
|
public IPlaywright Playwright { get; set; } = playwright;
|
|
public IBrowser Browser { get; set; } = browser;
|
|
}
|
|
|
|
public class PuppetUnitDownloader<T> : UnitDownloader<T> {
|
|
public PuppetContext Context { get; }
|
|
|
|
public PuppetUnitDownloader(PuppetContext pc, DownloadContext<T> context, AsyncTransformer<HtmlDocument, T> asyncHtmlTransformer, AsyncDownloadFailurePredicate<HtmlDocument>[] asyncDownloadFailurePredicates)
|
|
: base(context.Web, asyncHtmlTransformer, asyncDownloadFailurePredicates) {
|
|
Context = pc;
|
|
}
|
|
|
|
protected override async Task<(bool, T?)> TryDownloadWithNoRetries(string link, CancellationToken ct) {
|
|
var page = await Context.Browser.NewPageAsync();
|
|
try {
|
|
var content = await page.ContentAsync();
|
|
await page.CloseAsync();
|
|
|
|
HtmlDocument doc = new();
|
|
doc.LoadHtml(content);
|
|
var transformed = await Transformer(doc);
|
|
if (FailurePredicates is null || !(await IsFailure(doc)))
|
|
return (true, transformed);
|
|
return (false, default);
|
|
} catch (Exception) {
|
|
return (false, default);
|
|
} finally {
|
|
if (!page.IsClosed)
|
|
await page.CloseAsync();
|
|
}
|
|
}
|
|
}
|
|
}
|