/** * コンテナからターゲットを抽出する */ public async Task <IList <DxxTargetInfo> > ExtractTargets(DxxUriEx urx) { if (!IsContainer(urx)) { return(null); } return(await DxxActivityWatcher.Instance.Execute(async (cancellationToken) => { DxxLogger.Instance.Comment(LOG_CAT, $"Analyzing: {DxxUrl.GetFileName(urx.Uri)}"); var web = new HtmlWeb(); var html = await web.LoadFromWebAsync(urx.Url, cancellationToken); var mp4s = html.DocumentNode.SelectNodes("//a[contains(@href, '.mp') or contains(@href, '.wmv') or contains(@href,'.mov') or contains(@href,'.qt')]")? .Distinct(mAnchorNodeComparator)? .Select((v) => CreateTargetInfo(urx.Uri, v.Attributes["href"].Value, v))? .Where((v) => v != null); if (!Utils.IsNullOrEmpty(mp4s)) { return mp4s.ToList(); } // js でロードされる、sample_low.mp4 を列挙する // ... sample_low は低解像度の動画で、同じ内容で高解像度のものが存在するようなので、こいつらは列挙しないことにする。 var scripts = html.DocumentNode.SelectNodes(".//script[contains(text(),'emvideo')]"); IEnumerable <DxxTargetInfo> embedded = null; if (null != scripts) { embedded = scripts.Select((v) => { var regex = new Regex("(?<=var\\s+emvideo\\s*=\\s*[\"\'])(?<path>.*\\.mp4)"); var m = regex.Match(v.InnerText); if (m.Success) { var emvideo = m.Groups["path"].Value; if (Uri.TryCreate(urx.Uri, emvideo, out var uri)) { var desc = SafeDescription(html.DocumentNode.SelectSingleNode(".//title").InnerText); var name = DxxUrl.TrimName(DxxUrl.GetFileName(uri)); return new DxxTargetInfo(uri, name, desc); } } return null; }).Where((v) => v != null); if (null != embedded) { if (mp4s == null) { mp4s = embedded; } else { mp4s = mp4s.Concat(embedded); } } } if (Utils.IsNullOrEmpty(mp4s)) { DxxLogger.Instance.Comment(LOG_CAT, $"No Data: {DxxUrl.GetFileName(urx.Uri)}"); } return mp4s?.ToList(); })); }
/** * ダウンロードターゲットの TargetInfoを作成する */ private DxxTargetInfo CreateTargetInfo(Uri baseUri, string url, HtmlNode node) { if (Uri.TryCreate(baseUri, url, out var uri)) { var desc = SafeDescription(node.Attributes["name"].Value); if (string.IsNullOrWhiteSpace(desc)) { GetIndexStringFromUrl(url); } var name = DxxUrl.TrimName(DxxUrl.GetFileName(uri)); return(new DxxTargetInfo(uri, name, desc)); } return(null); }
private DxxTargetInfo CreateTargetInfo(Uri baseUri, string url, HtmlNode node) { if (string.IsNullOrEmpty(url)) { return(null); } Uri uri; if (!Uri.TryCreate(baseUri, url, out uri)) { return(null); } var name = DxxUrl.TrimName(DxxUrl.GetFileName(uri)); var desc = TryGetDescription(node, uri) ?? name; return(new DxxTargetInfo(uri, name, desc)); }
/** * コンテナ用のTargetInfoを作成する */ private DxxTargetInfo CreateContainerInfo(Uri baseUri, string url, HtmlNode node) { if (Uri.TryCreate(baseUri, url, out var uri)) { if (!IsContainer(new DxxUriEx(uri))) { return(null); } var desc = SafeDescription(node.InnerText); if (string.IsNullOrWhiteSpace(desc)) { desc = TryGetDescFromInnerHtml(node.InnerHtml); if (string.IsNullOrWhiteSpace(desc)) { desc = GetIndexStringFromUrl(url); } } var name = DxxUrl.TrimName(DxxUrl.GetFileName(uri)); return(new DxxTargetInfo(uri, name, desc)); } return(null); }
public override string GetNameFromUri(Uri uri, string defName = "") { return(DxxUrl.TrimName(DxxUrl.GetFileName(uri))); }