예제 #1
0
            /**
             * コンテナからターゲットを抽出する
             */
            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();
                }));
            }
예제 #2
0
 /**
  * ダウンロードターゲットの 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);
 }
예제 #3
0
            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));
            }
예제 #4
0
 /**
  * コンテナ用の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);
 }
예제 #5
0
 public override string GetNameFromUri(Uri uri, string defName = "")
 {
     return(DxxUrl.TrimName(DxxUrl.GetFileName(uri)));
 }