示例#1
0
        public void CancelDownload(FeedEnclosure enc)
        {
            lock (sync) {
                HttpFileDownloadTask task = FindDownloadTask (enc);

                if (task != null) {
                    // Look into multi-cancel later
                    task.CancelAsync ();
                }
            }
        }
示例#2
0
        // Parse one Media RSS media:content node
        // http://search.yahoo.com/mrss/
        private FeedEnclosure ParseMediaContent (XmlNode item_node)
        {
            try {
                XmlNode node = null;

                // Get the highest bitrate "full" content item
                // TODO allow a user-preference for a feed to decide what quality to get, if there
                // are options?
                int max_bitrate = 0;
                foreach (XmlNode test_node in item_node.SelectNodes ("media:content", mgr)) {
                    string expr = GetXmlNodeText (test_node, "@expression");
                    if (!(String.IsNullOrEmpty (expr) || expr == "full"))
                        continue;

                    int bitrate = GetInt32 (test_node, "@bitrate");
                    if (node == null || bitrate > max_bitrate) {
                        node = test_node;
                        max_bitrate = bitrate;
                    }
                }

                if (node == null)
                    return null;

                FeedEnclosure enclosure = new FeedEnclosure ();
                enclosure.Url = GetXmlNodeText (node, "@url");
                if (String.IsNullOrEmpty (enclosure.Url)) {
                    return null;
                }

                enclosure.FileSize = Math.Max (0, GetInt64 (node, "@fileSize"));
                enclosure.MimeType = GetXmlNodeText (node, "@type");
                enclosure.Duration = TimeSpan.FromSeconds (GetInt64 (node, "@duration"));
                enclosure.Keywords = GetXmlNodeText (item_node, "itunes:keywords");

                // TODO get the thumbnail URL

                return enclosure;
             } catch (Exception e) {
                 Hyena.Log.Exception ("Caught error parsing RSS media:content", e);
             }

             return null;
        }
示例#3
0
        private FeedEnclosure ParseEnclosure (XmlNode node)
        {
            try {
                FeedEnclosure enclosure = new FeedEnclosure ();

                enclosure.Url = GetXmlNodeText (node, "enclosure/@url");
                if (String.IsNullOrEmpty (enclosure.Url)) {
                    return null;
                }

                enclosure.FileSize = Math.Max (0, GetInt64 (node, "enclosure/@length"));
                enclosure.MimeType = GetXmlNodeText (node, "enclosure/@type");
                enclosure.Duration = GetITunesDuration (node);
                enclosure.Keywords = GetXmlNodeText (node, "itunes:keywords");
                return enclosure;
             } catch (Exception e) {
                 Hyena.Log.Exception (String.Format ("Caught error parsing RSS enclosure in {0}", url), e);
             }

             return null;
        }
示例#4
0
        private HttpFileDownloadTask FindDownloadTaskImpl(FeedEnclosure enc)
        {
            HttpFileDownloadTask task = null;
            Feed parentFeed = enc.Item.Feed as Feed;

            if (parentFeed != null && queued_downloads.ContainsKey (enc)) {
                task = queued_downloads[enc];
            }

            return task;
        }
示例#5
0
        /*private void OnFeedItemRemoved (Feed feed, FeedItem item)
        {
            if (feed == null) {
                throw new ArgumentNullException ("feed");
            } else if (item == null) {
                throw new ArgumentNullException ("item");
            }

            EventHandler<FeedItemEventArgs> handler = FeedItemRemoved;

            if (item.Enclosure != null) {
                lock (sync) {
                    HttpFileDownloadTask task;

                    if (queued_downloads.TryGetValue ((FeedEnclosure)item.Enclosure, out task)) {
                        task.CancelAsync ();
                    }
                }
            }

            if (handler != null) {
                OnFeedItemEvent (handler, new FeedItemEventArgs (feed, item));
            }
        }

        private void OnFeedItemsRemoved (Feed feed, IEnumerable<FeedItem> items)
        {
            if (feed == null) {
                throw new ArgumentNullException ("feed");
            } else if (items == null) {
                throw new ArgumentNullException ("items");
            }

            EventHandler<FeedItemEventArgs> handler = FeedItemRemoved;

            lock (sync) {
                HttpFileDownloadTask task;

                foreach (FeedItem item in items) {
                    if (item.Enclosure != null) {
                        if (queued_downloads.TryGetValue ((FeedEnclosure)item.Enclosure, out task)) {
                            task.CancelAsync ();
                        }
                    }
                }
            }

            if (handler != null) {
                OnFeedItemEvent (handler, new FeedItemEventArgs (feed, items));
            }
        } */
        private HttpFileDownloadTask FindDownloadTask(FeedEnclosure enc)
        {
            if (enc == null) {
                throw new ArgumentNullException ("enc");
            }

            return FindDownloadTaskImpl ((FeedEnclosure)enc);
        }
示例#6
0
        private void DownloadTaskRemoved(FeedEnclosure enc, HttpFileDownloadTask task, bool decQueuedCount)
        {
            if (queued_downloads.ContainsKey (enc)) {
                queued_downloads.Remove (enc);
                task.Completed -= OnDownloadTaskCompletedHandler;

                if (decQueuedCount) {
                    //enc.Item.Feed.DecrementQueuedDownloadCount ();
                }

                if (queued_downloads.Count == 0) {
                    if (download_handle != null) {
                        download_handle.Set ();
                    }
                }
            }
        }
示例#7
0
        public void StopDownload(FeedEnclosure enc)
        {
            lock (sync) {
                HttpFileDownloadTask task = FindDownloadTask (enc);

                if (task != null) {
                    task.Stop ();
                }
            }
        }
示例#8
0
        public HttpFileDownloadTask QueueDownload(FeedEnclosure enclosure, bool queue)
        {
            if (enclosure == null) {
                throw new ArgumentNullException ("enc");
            }

            HttpFileDownloadTask task = null;

            lock (sync) {
                if (disposed) {
                    return null;
                }

                if (!queued_downloads.ContainsKey (enclosure)) {
                    Feed parentFeed = enclosure.Item.Feed;

                    if (parentFeed != null) {
                        try {
                            task = download_manager.CreateDownloadTask (enclosure.Url, enclosure);
                            //Console.WriteLine ("Task DL path:  {0}", task.LocalPath);
                            task.Name = String.Format ("{0} - {1}", parentFeed.Title, enclosure.Item.Title);

                            //task.StatusChanged
                            task.Completed += OnDownloadTaskCompletedHandler;

                            // Race condition...
                            // Should only be added when the task is associated or
                            // it can be canceled before it is added to the progress manager.

                            // Add a pre-association dict and move tasks to the
                            // queued dict once they've been offically added.

                            queued_downloads.Add (enclosure, task);
                        } catch (Exception e) {
                            Log.Error ("Could not download podcast enclosure", e);
                        }
                    }
                }

                if (task != null && queue) {
                    download_manager.QueueDownload (task);
                }
            }

            return task;
        }
示例#9
0
 public HttpFileDownloadTask QueueDownload(FeedEnclosure enclosure)
 {
     return QueueDownload (enclosure, true);
 }